component variator "LinuxCNC HAL component to scale variator"; pin out bit up_relay = 0 "Turn Up relay on"; pin out bit down_relay = 0 "Turn Down relay on"; pin in bit home "Home the Variator"; pin in unsigned vgear = 0 "Virtual gear to select - homed to gear 0'; param float traversetime = 5.0 "time to traverse the full scale"; param float numgears = 6 "number of gears to traverse full scale"; function _; license "GPL"; ;; enum states{HOMING, RUNNING, CHANGING, UP, DOWN}; enum states state = HOMING; FUNCTION(_) { static int last_vgear; static float timecount = 0.0; // this is the time we have been running float timeslice = traversetime / (numgears -1) ; // time it takes to traverse a single gear switch(state){ case HOMING: down_relay = 1; if(home){ down_relay = 0; state = RUNNING; } break; case RUNNING: if(vgear != last_vgear){ // the gear has changed gearchangetime = abs((vgear - last_vgear)) * traversetime; timecount = 0.0; if(vgear > last_vgear){ state = UP; } else{ state = DOWN; } } // fall through on this cycle so no break; case UP: down_relay = 0; up_relay = 1; state = CHANGING; break; case DOWN: down_relay = 1; up_relay = 0; state = CHANGING; break; case CHANGING: timecount += fperiod; if(timecount > gearchangetime){ timecount = 0.0; down_relay = 0 up_relay = 0; state = RUNNING; } break; } last_vgear = vgear; }