component GB_3speed; pin in bit spindle-enable-in; pin out bit spindle-enable-out; pin in float spindle-speed-in; pin out float motor-speed-out; pin in bit gear-high; pin in bit gear-A; pin in bit gear-B; pin in bit gear-C; pin in bit gear-D; pin in bit gear-E; pin out unsigned gear-required; pin out bit message-##[14]; license "gpl"; function _; ;; FUNCTION(_){ int actual, message, motor_max_speed; int i; // These need to be edited to suit the gearbox int speeds[10] = {0, 100, 200, 350, 500, 700, 900, 1190, 1500, 2000, 2500}; int reqd_gear[10] = {0x0, 0x01, 0x21, 0x02, 0x04, 0x36, 0x08, 0x40, 0x16, 0x10, 0x48}; if (spindle_speed_in == 0) return; actual = (gear_high * 0x20 + gear_A * 0x10 + gear_B * 0x48 + gear_C * 0x04 + gear_D * 0x02 + gear_E * 0x01); for (i = 0; spindle_speed_in > speeds[i] && i < 9; i++); gear_required = reqd_gear[i]; if (gear_required == actual && gear_required != 0x0){ // We are in the right gear spindle_enable_out = spindle_enable_in; motor_speed_out = speeds[10] * (spindle_speed_in / speeds[i]); message = 0; } else { int j; motor_speed_out = 0; spindle_enable_out = 0; for (j = 0; j < 13; j++) { message(j) = 0; } message(i) = 1; } }