From 9e73c96223342ab235d77b73c3038cabd3ae0a34 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 17 Aug 2017 19:07:38 +0200 Subject: [PATCH] Host keep alive messages --- Firmware/Configuration_adv.h | 2 +- Firmware/Marlin.h | 23 ++++++++++++++-- Firmware/Marlin_main.cpp | 52 ++++++++++++++++-------------------- Firmware/cardreader.cpp | 2 +- Firmware/temperature.cpp | 15 ++++++----- Firmware/ultralcd.cpp | 15 ++++++++--- 6 files changed, 66 insertions(+), 43 deletions(-) diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 9112c2a50..455eb5c18 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -261,7 +261,7 @@ #define SD_SORT_ALPHA 1 #define SD_SORT_NONE 2 - #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). + #define SDSORT_LIMIT 20 // Maximum number of sorted items (10-256). #define FOLDER_SORTING -1 // -1=above 0=none 1=below #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. #define SDSORT_USES_RAM true // Pre-allocate a static array for faster pre-sorting. diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 20b9aac65..856e9a914 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -318,8 +318,6 @@ extern void digipot_i2c_set_current( int channel, float current ); extern void digipot_i2c_init(); #endif -#endif - //Long pause extern int saved_feedmultiply; extern float HotendTempBckp; @@ -352,8 +350,29 @@ float d_ReadData(); void bed_analysis(float x_dimension, float y_dimension, int x_points_num, int y_points_num, float shift_x, float shift_y); #endif + float temp_comp_interpolation(float temperature); void temp_compensation_apply(); void temp_compensation_start(); void wait_for_heater(long codenum); void serialecho_temperatures(); + +#ifdef HOST_KEEPALIVE_FEATURE + +// States for managing Marlin and host communication +// Marlin sends messages if blocked or busy +enum MarlinBusyState { + NOT_BUSY, // Not in a handler + IN_HANDLER, // Processing a GCode + IN_PROCESS, // Known to be blocking command input (as in G29) + PAUSED_FOR_USER, // Blocking pending any input + PAUSED_FOR_INPUT // Blocking pending text input (concept) +}; + +#define KEEPALIVE_STATE(n) do { busy_state = n;} while (0) +extern void host_keepalive(); +extern MarlinBusyState busy_state; + +#endif //HOST_KEEPALIVE_FEATURE + +#endif //ifndef marlin.h diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index c045eb9f5..405ff3b6d 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -372,20 +372,10 @@ int fanSpeed=0; bool cancel_heatup = false ; #ifdef HOST_KEEPALIVE_FEATURE - // States for managing Marlin and host communication - // Marlin sends messages if blocked or busy - enum MarlinBusyState { - NOT_BUSY, // Not in a handler - IN_HANDLER, // Processing a GCode - IN_PROCESS, // Known to be blocking command input (as in G29) - PAUSED_FOR_USER, // Blocking pending any input - PAUSED_FOR_INPUT // Blocking pending text input (concept) - }; - - static MarlinBusyState busy_state = NOT_BUSY; + + MarlinBusyState busy_state = NOT_BUSY; static long prev_busy_signal_ms = -1; uint8_t host_keepalive_interval = HOST_KEEPALIVE_INTERVAL; - #define KEEPALIVE_STATE(n) do { busy_state = n; } while (0) #else #define host_keepalive(); #define KEEPALIVE_STATE(n); @@ -1099,6 +1089,7 @@ void setup() world2machine_reset(); lcd_init(); + KEEPALIVE_STATE(PAUSED_FOR_USER); if (!READ(BTN_ENC)) { _delay_ms(1000); @@ -1120,7 +1111,7 @@ void setup() _delay_ms(2000); - + char level = reset_menu(); factory_reset(level, false); @@ -1266,6 +1257,7 @@ void setup() // Store the currently running firmware into an eeprom, // so the next time the firmware gets updated, it will know from which version it has been updated. update_current_firmware_version_to_eeprom(); + KEEPALIVE_STATE(NOT_BUSY); } void trace(); @@ -1351,7 +1343,7 @@ void host_keepalive() { long ms = millis(); if (host_keepalive_interval && busy_state != NOT_BUSY) { if (ms - prev_busy_signal_ms < 1000UL * host_keepalive_interval) return; - switch (busy_state) { + switch (busy_state) { case IN_HANDLER: case IN_PROCESS: SERIAL_ECHO_START; @@ -1432,7 +1424,6 @@ void loop() manage_heater(); isPrintPaused ? manage_inactivity(true) : manage_inactivity(false); checkHitEndstops(); - host_keepalive(); lcd_update(); } @@ -2460,7 +2451,7 @@ void process_commands() prepare_arc_move(false); } break; - case 4: // G4 dwell + case 4: // G4 dwell codenum = 0; if(code_seen('P')) codenum = code_value(); // milliseconds to wait if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait @@ -2493,10 +2484,7 @@ void process_commands() #endif //FWRETRACT case 28: //G28 Home all Axis one at a time homing_flag = true; - - KEEPALIVE_STATE(IN_HANDLER); - -#ifdef ENABLE_AUTO_BED_LEVELING + #ifdef ENABLE_AUTO_BED_LEVELING plan_bed_level_matrix.set_to_identity(); //Reset the plane ("erase" all leveling data) #endif //ENABLE_AUTO_BED_LEVELING @@ -2943,6 +2931,7 @@ void process_commands() enquecommand_front_P((PSTR("G28 W0"))); break; } + KEEPALIVE_STATE(NOT_BUSY); //no need to print busy messages as we print current temperatures periodicaly SERIAL_ECHOLNPGM("PINDA probe calibration start"); custom_message = true; custom_message_type = 4; @@ -3540,9 +3529,9 @@ void process_commands() while (*src == ' ') ++src; if (!hasP && !hasS && *src != '\0') { lcd_setstatus(src); - } else { - LCD_MESSAGERPGM(MSG_USERWAIT); - } + } else { + LCD_MESSAGERPGM(MSG_USERWAIT); + } lcd_ignore_click(); //call lcd_ignore_click aslo for else ??? st_synchronize(); @@ -3754,7 +3743,6 @@ void process_commands() { // Only Z calibration? bool onlyZ = code_seen('Z'); - if (!onlyZ) { setTargetBed(0); setTargetHotend(0, 0); @@ -3777,7 +3765,9 @@ void process_commands() memset(axis_known_position, 0, sizeof(axis_known_position)); // Let the user move the Z axes up to the end stoppers. + KEEPALIVE_STATE(PAUSED_FOR_USER); if (lcd_calibrate_z_end_stop_manual( onlyZ )) { + KEEPALIVE_STATE(IN_HANDLER); refresh_cmd_timeout(); if (((degHotend(0) > MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) && (!onlyZ)) { lcd_wait_for_cool_down(); @@ -3857,6 +3847,7 @@ void process_commands() } } else { // Timeouted. + KEEPALIVE_STATE(IN_HANDLER); } lcd_update_enable(true); break; @@ -3887,8 +3878,10 @@ void process_commands() case 47: // M47: Prusa3D: Show end stops dialog on the display. + KEEPALIVE_STATE(PAUSED_FOR_USER); lcd_diag_show_end_stops(); - break; + KEEPALIVE_STATE(IN_HANDLER); + break; #if 0 case 48: // M48: scan the bed induction sensor points, print the sensor trigger coordinates to the serial line for visualization on the PC. @@ -5070,8 +5063,7 @@ Sigma_Exit: if (code_seen('S')) temp=code_value(); if (code_seen('C')) c=code_value(); - KEEPALIVE_STATE(NOT_BUSY); - PID_autotune(temp, e, c); + PID_autotune(temp, e, c); } break; case 400: // M400 finish all moves @@ -5433,7 +5425,9 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp lcd_loading_filament(); while ((lcd_change_fil_state == 0)||(lcd_change_fil_state != 1)){ lcd_change_fil_state = 0; + KEEPALIVE_STATE(PAUSED_FOR_USER); lcd_alright(); + KEEPALIVE_STATE(IN_HANDLER); switch(lcd_change_fil_state){ // Filament failed to load so load it again @@ -6095,7 +6089,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument s static int killCount = 0; // make the inactivity button a bit less responsive const int KILL_DELAY = 10000; #endif - + if(buflen < (BUFSIZE-1)){ get_command(); } @@ -6371,7 +6365,7 @@ void calculate_volumetric_multipliers() { void delay_keep_alive(unsigned int ms) { - for (;;) { + for (;;) { manage_heater(); // Manage inactivity, but don't disable steppers on timeout. manage_inactivity(true); diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 51c02d7d9..aa1b489fb 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -705,7 +705,7 @@ void CardReader::getfilename_sorted(const uint16_t nr) { * - Most RAM: Buffer the directory and return filenames from RAM */ void CardReader::presort() { - + uint8_t sdSort = eeprom_read_byte((uint8_t*)EEPROM_SD_SORT); if (sdSort == SD_SORT_NONE) return; //sd sort is turned off diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index 36ee56001..2d9c815e7 100644 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -220,7 +220,7 @@ unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0); pid_cycle = 0; return; } - + SERIAL_ECHOLN("PID Autotune start"); disable_heater(); // switch off all heaters. @@ -336,13 +336,13 @@ unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0); p=soft_pwm_bed; SERIAL_PROTOCOLPGM("ok B:"); }else{ - p=soft_pwm[extruder]; - SERIAL_PROTOCOLPGM("ok T:"); + p=soft_pwm[extruder]; + SERIAL_PROTOCOLPGM("ok T:"); } - - SERIAL_PROTOCOL(input); - SERIAL_PROTOCOLPGM(" @:"); - SERIAL_PROTOCOLLN(p); + + SERIAL_PROTOCOL(input); + SERIAL_PROTOCOLPGM(" @:"); + SERIAL_PROTOCOLLN(p); temp_millis = millis(); } @@ -686,6 +686,7 @@ void manage_heater() volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM]=0.01; } #endif + host_keepalive(); } #define PGM_RD_W(x) (short)pgm_read_word(&x) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 40e036741..5e1ffa589 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1283,13 +1283,14 @@ void lcd_menu_statistics() lcd.print(itostr3(_days)); - + KEEPALIVE_STATE(PAUSED_FOR_USER); while (!lcd_clicked()) { manage_heater(); manage_inactivity(true); delay(100); } + KEEPALIVE_STATE(NOT_BUSY); lcd_quick_feedback(); lcd_return_to_status(); @@ -1367,6 +1368,7 @@ void lcd_service_mode_show_result() { } else lcd_print_at_PGM(11, i + 1, PSTR("N/A")); } delay_keep_alive(500); + KEEPALIVE_STATE(PAUSED_FOR_USER); while (!lcd_clicked()) { delay_keep_alive(100); } @@ -1393,6 +1395,7 @@ void lcd_service_mode_show_result() { while (!lcd_clicked()) { delay_keep_alive(100); } + KEEPALIVE_STATE(NOT_BUSY); delay_keep_alive(500); lcd_set_custom_characters_arrows(); lcd_return_to_status(); @@ -1865,6 +1868,7 @@ void lcd_show_fullscreen_message_and_wait_P(const char *msg) const char *msg_next = lcd_display_message_fullscreen_P(msg); bool multi_screen = msg_next != NULL; + KEEPALIVE_STATE(PAUSED_FOR_USER); // Until confirmed by a button click. for (;;) { // Wait for 5 seconds before displaying the next text. @@ -1874,6 +1878,7 @@ void lcd_show_fullscreen_message_and_wait_P(const char *msg) while (lcd_clicked()) ; delay(10); while (lcd_clicked()) ; + KEEPALIVE_STATE(IN_HANDLER); return; } } @@ -1887,6 +1892,7 @@ void lcd_show_fullscreen_message_and_wait_P(const char *msg) void lcd_wait_for_click() { + KEEPALIVE_STATE(PAUSED_FOR_USER); for (;;) { manage_heater(); manage_inactivity(true); @@ -1894,6 +1900,7 @@ void lcd_wait_for_click() while (lcd_clicked()) ; delay(10); while (lcd_clicked()) ; + KEEPALIVE_STATE(IN_HANDLER); return; } } @@ -1901,7 +1908,6 @@ void lcd_wait_for_click() int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, bool default_yes) { - lcd_display_message_fullscreen_P(msg); if (default_yes) { @@ -1923,6 +1929,7 @@ int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow // Wait for user confirmation or a timeout. unsigned long previous_millis_cmd = millis(); int8_t enc_dif = encoderDiff; + KEEPALIVE_STATE(PAUSED_FOR_USER); for (;;) { if (allow_timeouting && millis() - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS) return -1; @@ -1948,6 +1955,7 @@ int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow while (lcd_clicked()); delay(10); while (lcd_clicked()); + KEEPALIVE_STATE(IN_HANDLER); return yes; } } @@ -4800,6 +4808,7 @@ static bool lcd_selftest_fan_dialog(int _fan) lcd.setCursor(1, 3); lcd_printPGM(MSG_SELFTEST_FAN_NO); int8_t enc_dif = 0; + KEEPALIVE_STATE(PAUSED_FOR_USER); do { switch (_fan) @@ -4840,7 +4849,7 @@ static bool lcd_selftest_fan_dialog(int _fan) delay(100); } while (!lcd_clicked()); - + KEEPALIVE_STATE(IN_HANDLER); SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN); WRITE(EXTRUDER_0_AUTO_FAN_PIN, 0); SET_OUTPUT(FAN_PIN);