#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)
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() );
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;
// 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) {
this->sd= nullptr;
this->extmounter= nullptr;
this->external_sd_enable= false;
+ this->halted= false;
strcpy(this->playing_file, "Playing file");
}
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 );
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;
}
}
}
// 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;
+}
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);
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; }
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;
{
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;
{
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;
return THEPANEL->getMessage().c_str();
}
+ if (THEPANEL->is_halted()) {
+ return "HALTED Reset or M999";
+ }
+
if (THEKERNEL->pauser->paused())
return "Paused";
#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();
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);
//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;
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();
}
}
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();
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++;
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);