/************************************************************************************************************************************* EMC2 HAL component to implement Multistate toggle switch max 4 positions (c) ArcEye 15122011 schooner30@tiscali.co.uk example Hal linkages required:- ################################ loadrt multiswitch addf multiswitch.0 servo-thread setp multiswitch.0.positions = 3 # 3 output positions net toggle-switch multiswitch.0.toggle <= parport.N.pin-nn-out net state1 multiswitch.0.state1 => parport.N.pin-nn-in net state1 multiswitch.0.state2 => parport.N.pin-nn-in net state1 multiswitch.0.state3 => parport.N.pin-nn-in state0 can be used to trigger an overall OFF state state1-4 are used to trigger events ***************************************************************************************************************************************/ component multiswitch "This component toggles between max of 4 positions"; pin in bit toggle = false "Receives signal to toggle"; param rw s32 positions = 4 "Number of positions(outputs) to switch - defaults to 4"; pin out bit state0 = true "bit to activate state0"; pin out bit state1 = false "bit to activate state1"; pin out bit state2 = false "bit to activate state2"; pin out bit state3 = false "bit to activate state3"; pin out bit state4 = false "bit to activate state4"; // internals but set as pins for ease of debugging pin out s32 statenum = 0; // tracks the progress of the switch pin out bit switchdown = false; // flag to ensure switch goes off before next cycle function _; author "ArcEye schooner30@tiscali.co.uk"; license "GPL"; ;; FUNCTION(_) { if(!toggle && switchdown) // reset if switch now released switchdown = false; if(toggle && !switchdown) // if not still depressed from last cycle { switchdown = true; // reset to prevent cycling statenum += 1; if(statenum > positions) statenum = 0; switch (statenum) { case 0: state0 = true; state1 = false; state2 = false; state3 = false; state4 = false; break; case 1: state0 = false; state1 = true; state2 = false; state3 = false; state4 = false; break; case 2: state0 = false; state1 = false; state2 = true; state3 = false; state4 = false; break; case 3: state0 = false; state1 = false; state2 = false; state3 = true; state4 = false; break; comp --install multiswitch.comp case 4: state0 = false; state1 = false; state2 = false; state3 = false; state4 = true; break; default: rtapi_print_msg(RTAPI_MSG_ERR, "Unsupported state in multiswitch "); break; } } }