Add kill_button_toggle_enable to config settings
authorJim Morris <morris@wolfman.com>
Thu, 30 Mar 2017 03:27:15 +0000 (20:27 -0700)
committerJim Morris <morris@wolfman.com>
Thu, 30 Mar 2017 03:27:15 +0000 (20:27 -0700)
  - enable for an estop lock style button, halt will be cleared when unlocked and released

src/modules/utils/killbutton/KillButton.cpp
src/modules/utils/killbutton/KillButton.h

index cdceb1e..55b28ff 100644 (file)
@@ -14,6 +14,7 @@ using namespace std;
 
 #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")
@@ -32,6 +33,7 @@ void KillButton::on_module_loaded()
         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
@@ -69,6 +71,8 @@ void KillButton::on_idle(void *argument)
 
 // 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();
@@ -76,7 +80,7 @@ uint32_t KillButton::button_tick(uint32_t dummy)
     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;
@@ -86,7 +90,10 @@ uint32_t KillButton::button_tick(uint32_t dummy)
                 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;
index 2bc2dfe..707bce2 100644 (file)
@@ -27,5 +27,6 @@ class KillButton : public Module {
             uint8_t unkill_timer:6;
             volatile STATE state:4;
             bool unkill_enable:1;
+            bool toggle_enable:1;
         };
 };