Add halt status to panel and a way to clear it
authorJim Morris <morris@wolfman.com>
Mon, 3 Nov 2014 07:38:31 +0000 (23:38 -0800)
committerJim Morris <morris@wolfman.com>
Mon, 3 Nov 2014 07:38:31 +0000 (23:38 -0800)
ON_HALT aborts sd play file

ConfigSamples/Smoothieboard/config
src/libs/Kernel.cpp
src/libs/Kernel.h
src/modules/communication/GcodeDispatch.cpp
src/modules/utils/panel/Panel.cpp
src/modules/utils/panel/Panel.h
src/modules/utils/panel/screens/MainMenuScreen.cpp
src/modules/utils/panel/screens/WatchScreen.cpp
src/modules/utils/pausebutton/PauseButton.cpp
src/modules/utils/player/Player.cpp
src/modules/utils/player/Player.h

index 638d6fe..4a00383 100644 (file)
@@ -61,6 +61,7 @@ second_usb_serial_enable                     false            # This enables a s
 #leds_disable                                true             # disable using leds after config loaded
 #play_led_disable                            true             # disable the play led
 pause_button_enable                          true             # Pause button enable
+#pause_button_pin                            2.12             # pause button pin. default is P2.12
 #kill_button_enable                           false            # enable the kill button
 #kill_button_pin                              2.12             # kill button pin. default is same as pause button 2.12 (2.11 is another good choice)
 #msd_disable                                 false            # disable the MSD (USB SDCARD) when set to true (needs special binary)
index d254a1d..f3a7383 100644 (file)
@@ -125,7 +125,7 @@ Kernel::Kernel(){
     this->step_ticker->set_frequency( this->base_stepping_frequency );
 
     // Core modules
-    this->add_module( this->gcode_dispatch = new GcodeDispatch() );
+    this->add_module( new GcodeDispatch() );
     this->add_module( this->robot          = new Robot()         );
     this->add_module( this->stepper        = new Stepper()       );
     this->add_module( this->conveyor       = new Conveyor()      );
index 04855a7..790b384 100644 (file)
@@ -42,11 +42,10 @@ class Kernel {
         void call_event(_EVENT_ENUM id_event);
         void call_event(_EVENT_ENUM id_event, void * argument);
 
-        // These modules are aviable to all other modules
+        // These modules are available to all other modules
         SerialConsole*    serial;
         StreamOutputPool* streams;
 
-        GcodeDispatch*    gcode_dispatch;
         Robot*            robot;
         Stepper*          stepper;
         Planner*          planner;
index 7aa1dfd..e137739 100644 (file)
@@ -129,12 +129,13 @@ try_again:
                         // we ignore all commands until M999
                         if(gcode->has_m && gcode->m == 999) {
                             halted= false;
-                            new_message.stream->printf("ok\r\n");
+                            // fall through and pass onto other modules
                         }else{
+                            // ignore everything, return error string to host
                             new_message.stream->printf("!!\r\n");
+                            delete gcode;
+                            continue;
                         }
-                        delete gcode;
-                        continue;
                     }
 
                     if(gcode->has_g) {
index 12aa7fb..ca113ab 100644 (file)
@@ -82,6 +82,7 @@ Panel::Panel()
     this->sd= nullptr;
     this->extmounter= nullptr;
     this->external_sd_enable= false;
+    this->halted= false;
     strcpy(this->playing_file, "Playing file");
 }
 
@@ -189,6 +190,7 @@ void Panel::on_module_loaded()
     this->register_for_event(ON_IDLE);
     this->register_for_event(ON_MAIN_LOOP);
     this->register_for_event(ON_GCODE_RECEIVED);
+    this->register_for_event(ON_HALT);
 
     // Refresh timer
     THEKERNEL->slow_ticker->attach( 20, this, &Panel::refresh_tick );
@@ -267,6 +269,8 @@ void Panel::on_gcode_received(void *argument)
             this->message = get_arguments(gcode->get_command());
             if (this->message.size() > 20) this->message = this->message.substr(0, 20);
             gcode->mark_as_taken();
+        }else if(gcode->m == 999 && halted) {
+            halted= false;
         }
     }
 }
@@ -713,3 +717,8 @@ void Panel::on_second_tick(void *arg)
         // TODO for panels with no sd card detect we need to poll to see if card is inserted - or not
     }
 }
+
+void Panel::on_halt(void *arg)
+{
+    halted= true;
+}
index b46ffc2..8960599 100644 (file)
@@ -35,6 +35,7 @@ class Panel : public Module {
         uint32_t button_tick(uint32_t dummy);
         uint32_t encoder_tick(uint32_t dummy);
         void on_idle(void* argument);
+        void on_halt(void* argument);
         void on_main_loop(void* argument);
         void on_gcode_received(void* argument);
         void on_second_tick(void* argument);
@@ -79,6 +80,7 @@ class Panel : public Module {
 
         string getMessage() { return message; }
         bool hasMessage() { return message.size() > 0; }
+        bool is_halted() const { return halted; }
 
         uint16_t get_screen_lines() const { return screen_lines; }
 
@@ -129,6 +131,7 @@ class Panel : public Module {
             bool menu_changed:1;
             bool control_value_changed:1;
             bool external_sd_enable:1;
+            bool halted:1;
             volatile bool counter_changed:1;
             volatile bool click_changed:1;
             volatile bool refresh_flag:1;
index 70d9906..5e5c453 100644 (file)
@@ -118,7 +118,7 @@ void MainMenuScreen::display_menu_line(uint16_t line)
 {
     switch ( line ) {
         case 0: THEPANEL->lcd->printf("Watch"); break;
-        case 1: THEPANEL->lcd->printf(THEPANEL->is_playing() ? "Abort" : "Play"); break;
+        case 1: if(THEPANEL->is_halted()) THEPANEL->lcd->printf("Clear HALT"); else THEPANEL->lcd->printf(THEPANEL->is_playing() ? "Abort" : "Play"); break;
         case 2: THEPANEL->lcd->printf("Jog"); break;
         case 3: THEPANEL->lcd->printf("Prepare"); break;
         case 4: THEPANEL->lcd->printf("Custom"); break;
@@ -131,7 +131,7 @@ void MainMenuScreen::clicked_menu_entry(uint16_t line)
 {
     switch ( line ) {
         case 0: THEPANEL->enter_screen(this->watch_screen   ); break;
-        case 1: THEPANEL->is_playing() ? abort_playing() : THEPANEL->enter_screen(this->file_screen); break;
+        case 1: if(THEPANEL->is_halted()) send_command("M999"); else if(THEPANEL->is_playing()) abort_playing(); else THEPANEL->enter_screen(this->file_screen); break;
         case 2: THEPANEL->enter_screen(this->jog_screen     ); break;
         case 3: THEPANEL->enter_screen(this->prepare_screen ); break;
         case 4: THEPANEL->enter_screen(THEPANEL->custom_screen ); break;
index cbb8202..cdab040 100644 (file)
@@ -285,6 +285,10 @@ const char *WatchScreen::get_status()
         return THEPANEL->getMessage().c_str();
     }
 
+    if (THEPANEL->is_halted()) {
+        return "HALTED Reset or M999";
+    }
+
     if (THEKERNEL->pauser->paused())
         return "Paused";
 
index dd0357e..43bacd4 100644 (file)
@@ -18,12 +18,14 @@ using namespace std;
 #define pause_button_pin_checksum    CHECKSUM("pause_button_pin")
 #define kill_button_pin_checksum     CHECKSUM("kill_button_pin")
 
-PauseButton::PauseButton(){
+PauseButton::PauseButton()
+{
     this->button_state = true;
-    this->killed= false;
+    this->killed = false;
 }
 
-void PauseButton::on_module_loaded(){
+void PauseButton::on_module_loaded()
+{
     this->pause_enable = THEKERNEL->config->value( pause_button_enable_checksum )->by_default(false)->as_bool();
     this->kill_enable  = THEKERNEL->config->value( kill_button_enable_checksum )->by_default(false)->as_bool();
     this->pause_button.from_string( THEKERNEL->config->value( pause_button_pin_checksum )->by_default("2.12")->as_string())->as_input();
@@ -31,8 +33,11 @@ void PauseButton::on_module_loaded(){
 
     if(this->kill_enable && this->kill_button.connected() && pause_button.equals(kill_button)) {
         // kill button takes priority
-        this->pause_enable= false;
-        this->pause_button.from_string("nc");
+        this->pause_enable = false;
+
+    } else if(this->kill_enable && !this->kill_button.connected() && !this->pause_enable && pause_button.connected()) {
+        // use pause button for kill button
+        this->kill_button = this->pause_button;
     }
 
     this->register_for_event(ON_CONSOLE_LINE_RECEIVED);
@@ -44,28 +49,28 @@ void PauseButton::on_module_loaded(){
 
 //TODO: Make this use InterruptIn
 //Check the state of the button and act accordingly based on current pause state
-uint32_t PauseButton::button_tick(uint32_t dummy){
+uint32_t PauseButton::button_tick(uint32_t dummy)
+{
     // If pause button changed
     if(this->pause_enable && this->pause_button.connected()) {
         bool newstate = this->pause_button.get();
-        if(this->button_state != newstate){
+        if(this->button_state != newstate) {
             this->button_state = newstate;
             // If button pressed
-            if( this->button_state ){
-                if( THEKERNEL->pauser->paused() ){
+            if( this->button_state ) {
+                if( THEKERNEL->pauser->paused() ) {
                     THEKERNEL->pauser->release();
-                }else{
+                } else {
                     THEKERNEL->pauser->take();
                 }
             }
         }
     }
 
-    if(!this->killed && this->kill_enable && this->kill_button.connected() && this->kill_button.get()) {
-            this->killed= true;
-            THEKERNEL->pauser->take();
-            THEKERNEL->call_event(ON_HALT);
-            //THEKERNEL->streams->printf("Kill button pressed - reset required to continue\r\n"); // not in an interrupt
+    if(!this->killed && this->kill_enable && this->kill_button.connected() && !this->kill_button.get()) {
+        this->killed = true;
+        THEKERNEL->call_event(ON_HALT);
+        //THEKERNEL->streams->printf("Kill button pressed - reset required to continue\r\n"); // not in an interrupt
     }
 
     return 0;
@@ -80,15 +85,15 @@ void PauseButton::on_console_line_received( void *argument )
     char first_char = new_message.message[0];
     if(strchr(";( \n\rGMTN", first_char) != NULL) return;
 
-    string cmd= shift_parameter(new_message.message);
+    string cmd = shift_parameter(new_message.message);
 
     if (cmd == "freeze") {
-        if( !THEKERNEL->pauser->paused() ){
+        if( !THEKERNEL->pauser->paused() ) {
             THEKERNEL->pauser->take();
         }
 
-    }else if (cmd == "unfreeze") {
-        if( THEKERNEL->pauser->paused() ){
+    } else if (cmd == "unfreeze") {
+        if( THEKERNEL->pauser->paused() ) {
             THEKERNEL->pauser->release();
         }
     }
index 6a1d38a..441fc73 100644 (file)
@@ -42,6 +42,7 @@ void Player::on_module_loaded()
     this->register_for_event(ON_GET_PUBLIC_DATA);
     this->register_for_event(ON_SET_PUBLIC_DATA);
     this->register_for_event(ON_GCODE_RECEIVED);
+    this->register_for_event(ON_HALT);
 
     this->on_boot_gcode = THEKERNEL->config->value(on_boot_gcode_checksum)->by_default("/sd/on_boot.gcode")->as_string();
     this->on_boot_gcode_enable = THEKERNEL->config->value(on_boot_gcode_enable_checksum)->by_default(true)->as_bool();
@@ -49,6 +50,11 @@ void Player::on_module_loaded()
     this->reply_stream = NULL;
 }
 
+void Player::on_halt(void *)
+{
+    abort_command("", &(StreamOutput::NullStream));
+}
+
 void Player::on_second_tick(void *)
 {
     if (!THEKERNEL->pauser->paused()) this->elapsed_secs++;
index 6bd0d56..40af04d 100644 (file)
@@ -25,6 +25,7 @@ class Player : public Module {
         void on_console_line_received( void* argument );
         void on_main_loop( void* argument );
         void on_second_tick(void* argument);
+        void on_halt(void* argument);
         void on_get_public_data(void* argument);
         void on_set_public_data(void* argument);
         void on_gcode_received(void *argument);