Hello Bengt,
I can show may thoughts here for anyone to see.
When the gearblocker finds the wrong gear is engaged: How to pop-up a warning? Or any other notification to tecno? It can of course be a silent, passive warning by just not starting the spindle. But a clear notification is better. Can that be made from hal? Or from the component?
I have made some tentative changes that could improve the component.
I don't use the code tag instead the red color to hilite.
component gearblocker;
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 out int wanted-gear;
pin in float gear.#.min-speed[10];
pin in float gear.#.max-speed[10];
pin in float gear.#.ratio[10];
pin in bit high-gear;
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;
license "gpl";
function _;
;;
FUNCTION(_){
int i;
int gear;
if (spindle_speed_in == 0) return;
switch (gear_A + gear_B * 2 + gear_C * 4 + gear_D * 8 + gear_E * 16 ) {
case 1: // Gear A
gear = (high_gear != 0) ? 1 : 6;
break;
case 2: // Gear B
gear = (high_gear != 0) ? 2 : 7;
break;
case 4: // Gear C
gear = (high_gear != 0) ? 3 : 8;
break;
case 1: // Gear D
gear = (high_gear != 0) ? 4 : 9;
break;
case 1: // Gear E
gear = (high_gear != 0) ? 5 : 10;
break;
case else: // gear selection is bitmasked to be able to spot double-engagement
gear = 0;
}
if (spindle_speed_in >= min_speed(gear) && spindle_speed_in <= max_speed(gear)) {
//RIGHT GEAR ENGAGED
motor_speed_out = spindle_speed_ * gear_ratio(gear);
spindle_enable_out = spindle_enable_in;
} else {
// WRONG GEAR ENGAGED, find a suitable gear
// Brute force search
wanted_gear = -1; // No suitable gear found
for (int i=0; i< 10; i++) {
if ( speed > min_speed(i) && speed <= max_speed(i) {
// First found suitable gear
wanted_gear = i;
break;
}
}
motor_speed_out = 0;
spindle_enable_out = 0;
}
}
If you integrate this into what you already have, you should be rather close.
Had to use () instead of brackets. Code tags with colors would be great