#define pause_button_enable_checksum CHECKSUM("pause_button_enable")
#define kill_button_enable_checksum CHECKSUM("kill_button_enable")
+#define toggle_checksum CHECKSUM("kill_button_toggle_enable")
#define unkill_checksum CHECKSUM("unkill_enable")
#define pause_button_pin_checksum CHECKSUM("pause_button_pin")
#define kill_button_pin_checksum CHECKSUM("kill_button_pin")
return;
}
this->unkill_enable = THEKERNEL->config->value( unkill_checksum )->by_default(true)->as_bool();
+ this->toggle_enable = THEKERNEL->config->value( toggle_checksum )->by_default(false)->as_bool();
Pin pause_button;
pause_button.from_string( THEKERNEL->config->value( pause_button_pin_checksum )->by_default("2.12")->as_string())->as_input(); // @DEPRECATED
// Check the state of the button and act accordingly using the following FSM
// Note this is ISR so don't do anything nasty in here
+// If in toggle mode (locking estop) then button down will kill, and button up will unkill if unkill is enabled
+// otherwise it will look for a 2 second press on the kill button to unkill if unkill is set
uint32_t KillButton::button_tick(uint32_t dummy)
{
bool killed= THEKERNEL->is_halted();
switch(state) {
case IDLE:
if(!this->kill_button.get()) state= KILL_BUTTON_DOWN;
- else if(unkill_enable && killed) state= KILLED_BUTTON_UP; // allow kill button to unkill if kill was created fromsome other source
+ else if(unkill_enable && !toggle_enable && killed) state= KILLED_BUTTON_UP; // allow kill button to unkill if kill was created from some other source
break;
case KILL_BUTTON_DOWN:
if(killed) state= KILLED_BUTTON_DOWN;
break;
case KILLED_BUTTON_UP:
if(!killed) state= IDLE;
- else if(unkill_enable && !this->kill_button.get()) state= UNKILL_BUTTON_DOWN;
+ if(unkill_enable) {
+ if(toggle_enable) state= UNKILL_FIRE; // if toggle is enabled and button is released then we unkill
+ else if(!this->kill_button.get()) state= UNKILL_BUTTON_DOWN; // wait for button to be pressed to go into next state for timing start
+ }
break;
case UNKILL_BUTTON_DOWN:
unkill_timer= 0;