From 29e045f50203183888a9ff95fe25017ca4ce8eef Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 15 Jun 2018 20:24:05 +0200 Subject: [PATCH 01/13] Use Timer class for button blanking. Save 74B FLASH and 1B RAM. --- Firmware/ultralcd.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index b4fbe6f74..184b6572b 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -190,7 +190,7 @@ float pid_temp = DEFAULT_PID_TEMP; bool long_press_active = false; static ShortTimer longPressTimer; -unsigned long button_blanking_time = millis(); +static ShortTimer buttonBlanking; bool button_pressed = false; bool menuExiting = false; @@ -7548,8 +7548,8 @@ void lcd_buttons_update() if (lcd_update_enabled == true) { //if we are in non-modal mode, long press can be used and short press triggers with button release if (READ(BTN_ENC) == 0) { //button is pressed lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; - if (millis() > button_blanking_time) { - button_blanking_time = millis() + BUTTON_BLANKING_TIME; + if (!buttonBlanking.running() || buttonBlanking.expired(BUTTON_BLANKING_TIME)) { + buttonBlanking.start(); if (button_pressed == false && long_press_active == false) { longPressTimer.start(); button_pressed = true; @@ -7565,7 +7565,7 @@ void lcd_buttons_update() } else { //button not pressed if (button_pressed) { //button was released - button_blanking_time = millis() + BUTTON_BLANKING_TIME; + buttonBlanking.start(); if (long_press_active == false) { //button released before long press gets activated newbutton |= EN_C; From 21f9f46698be40c742709d60eda84095487080d3 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Sat, 16 Jun 2018 02:39:47 +0200 Subject: [PATCH 02/13] Use Timer class for lcd_timeoutToStatus. Save 188B FLASH and costs 2B RAM. --- Firmware/cardreader.cpp | 2 +- Firmware/ultralcd.cpp | 76 +++++++++++++++++++++++++---------------- Firmware/ultralcd.h | 6 ++-- 3 files changed, 52 insertions(+), 32 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 23d84dabb..85daef4a1 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -972,7 +972,7 @@ void CardReader::presort() { #endif lcd_update(2); KEEPALIVE_STATE(NOT_BUSY); - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); } void CardReader::flush_presort() { diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 184b6572b..6c1918ce0 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -9,7 +9,6 @@ #include "stepper.h" #include "ConfigurationStore.h" #include -#include "Timer.h" #include "util.h" #include "mesh_bed_leveling.h" @@ -193,6 +192,7 @@ static ShortTimer longPressTimer; static ShortTimer buttonBlanking; bool button_pressed = false; +static bool forceMenuExpire = false; bool menuExiting = false; #ifdef FILAMENT_LCD_DISPLAY @@ -696,7 +696,7 @@ void lcd_commands() float extr = count_e(0.2, width, length); float extr_short_segment = count_e(0.2, width, width); - if (lcd_commands_step>1) lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen + if (lcd_commands_step>1) lcd_timeoutToStatus.start(); //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen if (lcd_commands_step == 0) { lcd_commands_step = 10; @@ -722,7 +722,7 @@ void lcd_commands() } if (lcd_commands_step == 9 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); enquecommand_P(PSTR("G1 Z0.250 F7200.000")); enquecommand_P(PSTR("G1 X50.0 E80.0 F1000.0")); enquecommand_P(PSTR("G1 X160.0 E20.0 F1000.0")); @@ -746,7 +746,7 @@ void lcd_commands() } if (lcd_commands_step == 8 && !blocks_queued() && cmd_buffer_empty()) //draw meander { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); enquecommand_P(PSTR("G1 X50 Y155")); @@ -771,7 +771,7 @@ void lcd_commands() if (lcd_commands_step == 7 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); strcpy(cmd1, "G1 X50 Y35 E"); strcat(cmd1, ftostr43(extr)); enquecommand(cmd1); @@ -804,7 +804,7 @@ void lcd_commands() if (lcd_commands_step == 6 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 4; i < 8; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -833,7 +833,7 @@ void lcd_commands() if (lcd_commands_step == 5 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 8; i < 12; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -862,7 +862,7 @@ void lcd_commands() if (lcd_commands_step == 4 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 12; i < 16; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -891,7 +891,7 @@ void lcd_commands() if (lcd_commands_step == 3 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); enquecommand_P(PSTR("G1 E-0.07500 F2100.00000")); enquecommand_P(PSTR("G4 S0")); enquecommand_P(PSTR("G1 E-4 F2100.00000")); @@ -960,7 +960,7 @@ void lcd_commands() float length = 20 - width; float extr = count_e(0.2, width, length); float extr_short_segment = count_e(0.2, width, width); - if(lcd_commands_step>1) lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen + if(lcd_commands_step>1) lcd_timeoutToStatus.start(); //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen if (lcd_commands_step == 0) { lcd_commands_step = 9; @@ -997,7 +997,7 @@ void lcd_commands() } if (lcd_commands_step == 7 && !blocks_queued() && cmd_buffer_empty()) //draw meander { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); //just opposite direction @@ -1045,7 +1045,7 @@ void lcd_commands() if (lcd_commands_step == 6 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 0; i < 4; i++) { strcpy(cmd1, "G1 X70 Y"); @@ -1075,7 +1075,7 @@ void lcd_commands() if (lcd_commands_step == 5 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 4; i < 8; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -1104,7 +1104,7 @@ void lcd_commands() if (lcd_commands_step == 4 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 8; i < 12; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -1133,7 +1133,7 @@ void lcd_commands() if (lcd_commands_step == 3 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 12; i < 16; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -1162,7 +1162,7 @@ void lcd_commands() if (lcd_commands_step == 2 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); enquecommand_P(PSTR("G1 E-0.07500 F2100.00000")); enquecommand_P(PSTR("M107")); //turn off printer fan enquecommand_P(PSTR("M104 S0")); // turn off temperature @@ -1170,7 +1170,7 @@ void lcd_commands() enquecommand_P(PSTR("G1 Z10 F1300.000")); enquecommand_P(PSTR("G1 X10 Y180 F4000")); //home X axis enquecommand_P(PSTR("M84"));// disable motors - lcd_timeoutToStatus = millis() - 1; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen + forceMenuExpire = true; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen lcd_commands_step = 1; } if (lcd_commands_step == 1 && !blocks_queued() && cmd_buffer_empty()) @@ -2378,7 +2378,7 @@ static void _lcd_babystep(int axis, const char *msg) //SERIAL_ECHO("Z baby step: "); //SERIAL_ECHO(menuData.babyStep.babystepMem[2]); // Wait 90 seconds before closing the live adjust dialog. - lcd_timeoutToStatus = millis() + 90000; + lcd_timeoutToStatus.start(); } if (encoderPosition != 0) @@ -3886,7 +3886,7 @@ void lcd_language() lcd_update_enable(true); lcd_implementation_clear(); lcd_goto_menu(lcd_language_menu); - lcd_timeoutToStatus = -1; //infinite timeout + lcd_timeoutToStatus.stop(); //infinite timeout lcdDrawUpdate = 2; while ((currentMenu != lcd_status_screen) && (!lang_is_selected())) { @@ -4278,7 +4278,7 @@ static void lcd_homing_accuracy_menu_advanced_back() static void lcd_homing_accuracy_menu_advanced() { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); START_MENU(); MENU_ITEM(back, PSTR("Homing accuracy"), lcd_homing_accuracy_menu_advanced_back); MENU_ITEM(function, PSTR("Reset def. steps"), lcd_homing_accuracy_menu_advanced_reset); @@ -4359,7 +4359,7 @@ static void lcd_ustep_resolution_reset_def_xyze() static void lcd_ustep_resolution_menu() { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); START_MENU(); MENU_ITEM(back, PSTR("Experimental"), lcd_ustep_resolution_menu_back); MENU_ITEM(function, PSTR("Reset defaults"), lcd_ustep_resolution_reset_def_xyze); @@ -4407,7 +4407,7 @@ static void lcd_ustep_linearity_menu_reset() static void lcd_ustep_linearity_menu() { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); START_MENU(); MENU_ITEM(back, PSTR("Experimental"), lcd_ustep_linearity_menu_back); MENU_ITEM(function, PSTR("Reset correction"), lcd_ustep_linearity_menu_reset); @@ -7095,7 +7095,7 @@ static void menu_action_setlang(unsigned char lang) lcd_update_enable(true); lcd_implementation_clear(); lcd_goto_menu(lcd_language_menu); - lcd_timeoutToStatus = -1; //infinite timeout + lcd_timeoutToStatus.stop(); //infinite timeout lcdDrawUpdate = 2; } } @@ -7255,7 +7255,7 @@ void lcd_init() //#include static volatile bool lcd_update_enabled = true; -unsigned long lcd_timeoutToStatus = 0; +LongTimer lcd_timeoutToStatus; void lcd_update_enable(bool enabled) { @@ -7267,7 +7267,7 @@ void lcd_update_enable(bool enabled) encoderDiff = 0; // Enabling the normal LCD update procedure. // Reset the timeout interval. - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); // Force the keypad update now. lcd_next_update_millis = millis() - 1; // Full update. @@ -7286,6 +7286,24 @@ void lcd_update_enable(bool enabled) } } } +static inline bool z_menu_expired() +{ + return (currentMenu == lcd_babystep_z + && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z)); +} +static inline bool other_menu_expired() +{ + return (currentMenu != lcd_status_screen + && currentMenu != lcd_babystep_z + && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS)); +} +static inline bool forced_menu_expire() +{ + bool retval = (currentMenu != lcd_status_screen + && forceMenuExpire); + forceMenuExpire = false; + return retval; +} void lcd_update(uint8_t lcdDrawUpdateOverride) { @@ -7366,10 +7384,10 @@ void lcd_update(uint8_t lcdDrawUpdateOverride) lcdDrawUpdate = 1; encoderPosition += encoderDiff / ENCODER_PULSES_PER_STEP; encoderDiff = 0; - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); } - if (LCD_CLICKED) lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + if (LCD_CLICKED) lcd_timeoutToStatus.start(); #endif//ULTIPANEL (*currentMenu)(); @@ -7379,7 +7397,7 @@ void lcd_update(uint8_t lcdDrawUpdateOverride) #endif #ifdef ULTIPANEL - if (lcd_timeoutToStatus < millis() && currentMenu != lcd_status_screen) + if (z_menu_expired() || other_menu_expired() || forced_menu_expire()) { // Exiting a menu. Let's call the menu function the last time with menuExiting flag set to true // to give it a chance to save its state. @@ -7547,7 +7565,7 @@ void lcd_buttons_update() #if BTN_ENC > 0 if (lcd_update_enabled == true) { //if we are in non-modal mode, long press can be used and short press triggers with button release if (READ(BTN_ENC) == 0) { //button is pressed - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); if (!buttonBlanking.running() || buttonBlanking.expired(BUTTON_BLANKING_TIME)) { buttonBlanking.start(); if (button_pressed == false && long_press_active == false) { diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index a03c5f1dc..254a94ae4 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -3,6 +3,7 @@ #include "Marlin.h" #include "mesh_bed_calibration.h" +#include "Timer.h" extern int lcd_puts_P(const char* str); extern int lcd_printf_P(const char* format, ...); @@ -94,7 +95,8 @@ extern int lcd_printf_P(const char* format, ...); #define LCD_ALERTMESSAGERPGM(x) lcd_setalertstatuspgm((x)) #define LCD_UPDATE_INTERVAL 100 - #define LCD_TIMEOUT_TO_STATUS 30000 + #define LCD_TIMEOUT_TO_STATUS 30000ul //!< Generic timeout to status screen in ms, when no user action. + #define LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z 90000ul //!< Specific timeout for lcd_babystep_z screen in ms. #ifdef ULTIPANEL void lcd_buttons_update(); @@ -117,7 +119,7 @@ extern int lcd_printf_P(const char* format, ...); #define LCD_COMMAND_PID_EXTRUDER 7 #define LCD_COMMAND_V2_CAL 8 - extern unsigned long lcd_timeoutToStatus; + extern LongTimer lcd_timeoutToStatus; extern int lcd_commands_type; extern uint8_t farm_mode; From 3248edc1ca610627c2e88366bd76f792d9765958 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Tue, 26 Jun 2018 20:12:09 +0200 Subject: [PATCH 03/13] Do not skip bootloader when initiating reset by farm PRUSA RESET command. Set bootloader magic and run flag before watchdog reset in PRUSA RESET command. --- Firmware/Marlin_main.cpp | 2 ++ Firmware/bootapp.h | 1 + 2 files changed, 3 insertions(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 225883bfd..9e210ebe4 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3283,6 +3283,8 @@ void process_commands() // careful! if (farm_mode) { #ifdef WATCHDOG + boot_app_magic = BOOT_APP_MAGIC; + boot_app_flags = BOOT_APP_FLG_RUN; wdt_enable(WDTO_15MS); cli(); while(1); diff --git a/Firmware/bootapp.h b/Firmware/bootapp.h index db5bcc778..cbae89a7c 100644 --- a/Firmware/bootapp.h +++ b/Firmware/bootapp.h @@ -17,6 +17,7 @@ #define BOOT_APP_FLG_ERASE 0x01 #define BOOT_APP_FLG_COPY 0x02 #define BOOT_APP_FLG_FLASH 0x04 +#define BOOT_APP_FLG_RUN 0x08 #define BOOT_APP_FLG_USER0 0x80 From d658bf56cf795c4b16b9bbae89135b37cc7069a4 Mon Sep 17 00:00:00 2001 From: MRprusa3d Date: Wed, 11 Jul 2018 18:52:58 +0200 Subject: [PATCH 04/13] ShippingPrep Reset statistics reset by shipping preparation & filament sensor force --- Firmware/Marlin_main.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 225883bfd..d0375db2b 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -848,6 +848,15 @@ void factory_reset(char level, bool quiet) farm_mode = false; eeprom_update_byte((uint8_t*)EEPROM_FARM_MODE, farm_mode); EEPROM_save_B(EEPROM_FARM_NUMBER, &farm_no); + + eeprom_update_dword((uint32_t *)EEPROM_TOTALTIME, 0); + eeprom_update_dword((uint32_t *)EEPROM_FILAMENTUSED, 0); + eeprom_update_word((uint16_t *)EEPROM_CRASH_COUNT_X_TOT, 0); + eeprom_update_word((uint16_t *)EEPROM_CRASH_COUNT_Y_TOT, 0); + eeprom_update_word((uint16_t *)EEPROM_FERROR_COUNT_TOT, 0); + eeprom_update_word((uint16_t *)EEPROM_POWER_COUNT_TOT, 0); + + fsensor_enable(); WRITE(BEEPER, HIGH); _delay_ms(100); From 1357e27b55cc1068651a4bfbd92522916ecc6d51 Mon Sep 17 00:00:00 2001 From: MRprusa3d Date: Wed, 11 Jul 2018 20:45:56 +0200 Subject: [PATCH 05/13] FilamentAutoload setting by shipping preparation --- Firmware/Marlin_main.cpp | 1 + Firmware/fsensor.cpp | 6 ++++++ Firmware/fsensor.h | 3 +++ Firmware/ultralcd.cpp | 4 ++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index d0375db2b..d45c8e5a1 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -857,6 +857,7 @@ void factory_reset(char level, bool quiet) eeprom_update_word((uint16_t *)EEPROM_POWER_COUNT_TOT, 0); fsensor_enable(); + fautoload_set(true); WRITE(BEEPER, HIGH); _delay_ms(100); diff --git a/Firmware/fsensor.cpp b/Firmware/fsensor.cpp index bebcf8109..1e4f17d3a 100644 --- a/Firmware/fsensor.cpp +++ b/Firmware/fsensor.cpp @@ -86,6 +86,12 @@ void fsensor_disable() FSensorStateMenu = 0; } +void fautoload_set(bool State) +{ + filament_autoload_enabled = State; + eeprom_update_byte((unsigned char *)EEPROM_FSENS_AUTOLOAD_ENABLED, filament_autoload_enabled); +} + void pciSetup(byte pin) { *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin)); // enable pin diff --git a/Firmware/fsensor.h b/Firmware/fsensor.h index 0c5543bc3..486331a0e 100644 --- a/Firmware/fsensor.h +++ b/Firmware/fsensor.h @@ -15,6 +15,9 @@ extern void fsensor_unblock(); extern bool fsensor_enable(); extern void fsensor_disable(); +extern bool filament_autoload_enabled; +extern void fautoload_set(bool State); + //update (perform M600 on filament runout) extern void fsensor_update(); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 0d3801d87..30335261e 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1,5 +1,6 @@ #include "temperature.h" #include "ultralcd.h" +#include "fsensor.h" #ifdef ULTRA_LCD #include "MenuStack.h" #include "Marlin.h" @@ -1845,8 +1846,7 @@ void lcd_set_fan_check() { } void lcd_set_filament_autoload() { - filament_autoload_enabled = !filament_autoload_enabled; - eeprom_update_byte((unsigned char *)EEPROM_FSENS_AUTOLOAD_ENABLED, filament_autoload_enabled); + fautoload_set(!filament_autoload_enabled); } void lcd_unLoadFilament() From d18160cab5783b86882593d6a6eacd34d5a968f5 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 11 Jul 2018 21:58:06 +0200 Subject: [PATCH 06/13] splash screen --- Firmware/Marlin_main.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index d45c8e5a1..3bcc82568 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1152,10 +1152,6 @@ void list_sec_lang_from_external_flash() // are initialized by the main() routine provided by the Arduino framework. void setup() { -#ifdef W25X20CL - // Enter an STK500 compatible Optiboot boot loader waiting for flashing the languages to an external flash memory. - optiboot_w25x20cl_enter(); -#endif lcd_init(); fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream @@ -1163,6 +1159,11 @@ void setup() lcd_splash(); + #ifdef W25X20CL + // Enter an STK500 compatible Optiboot boot loader waiting for flashing the languages to an external flash memory. + optiboot_w25x20cl_enter(); + #endif + #if (LANG_MODE != 0) //secondary language support #ifdef W25X20CL if (w25x20cl_init()) From 11aa775322758c63b92710bdd5324ada2ded7f67 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 11 Jul 2018 18:21:05 +0200 Subject: [PATCH 07/13] move in Z before filament loading: intial version --- Firmware/Marlin_main.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 3bcc82568..e0d9b4fb5 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3114,6 +3114,14 @@ void gcode_M701() custom_message = true; custom_message_type = 2; + if (current_position[Z_AXIS] < 20) { + lcd_setstatuspgm(_T(MSG_PLEASE_WAIT)); + current_position[Z_AXIS] += 30; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence + st_synchronize(); + lcd_show_fullscreen_message_and_wait_P(_i("Please insert filament and press the knob.")); + } + lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT)); current_position[E_AXIS] += 70; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence From 9b7cc60b4204837bad258f8c28a229c48a089754 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 11 Jul 2018 19:35:22 +0200 Subject: [PATCH 08/13] filament statistics hotfix, load filament move Z simplified --- Firmware/Marlin_main.cpp | 8 +------- Firmware/ultralcd.cpp | 6 +++--- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index e0d9b4fb5..995264777 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3114,13 +3114,7 @@ void gcode_M701() custom_message = true; custom_message_type = 2; - if (current_position[Z_AXIS] < 20) { - lcd_setstatuspgm(_T(MSG_PLEASE_WAIT)); - current_position[Z_AXIS] += 30; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence - st_synchronize(); - lcd_show_fullscreen_message_and_wait_P(_i("Please insert filament and press the knob.")); - } + if (current_position[Z_AXIS] < 20) current_position[Z_AXIS] += 30; lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT)); current_position[E_AXIS] += 70; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 30335261e..64412bc97 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2110,7 +2110,7 @@ void lcd_menu_statistics() { if (IS_SD_PRINTING) { - int _met = total_filament_used / 100000; + float _met = ((float)total_filament_used) / (100000.f); int _cm = (total_filament_used - (_met * 100000)) / 10; int _t = (millis() - starttime) / 1000; int _h = _t / 3600; @@ -2125,12 +2125,12 @@ void lcd_menu_statistics() lcd_printf_P(_N( ESC_2J "%S:" - ESC_H(6,1) "%8.2f m\n" + ESC_H(6,1) "%8.2fm \n" "%S :" ESC_H(8,3) "%2dh %02dm %02d" ), _i("Filament used"), - _met, _cm, + _met, _i("Print time"), _h, _m, _s ); From 07f6ddfb698c56da094fd4a538ab9a566a9b9ea5 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 11 Jul 2018 22:34:32 +0200 Subject: [PATCH 09/13] filament loading corrected --- Firmware/Marlin_main.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 995264777..97fa26f36 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3114,12 +3114,17 @@ void gcode_M701() custom_message = true; custom_message_type = 2; - if (current_position[Z_AXIS] < 20) current_position[Z_AXIS] += 30; + lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT)); - current_position[E_AXIS] += 70; + current_position[E_AXIS] += 40; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence + st_synchronize(); + if (current_position[Z_AXIS] < 20) current_position[Z_AXIS] += 30; + current_position[E_AXIS] += 30; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence + st_synchronize(); current_position[E_AXIS] += 25; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 100 / 60, active_extruder); //slow sequence st_synchronize(); From 6824ab65dd41f974edeae3a7bd2f626d2c730862 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 15 Jul 2018 20:00:29 +0200 Subject: [PATCH 10/13] G28 fix --- Firmware/Marlin.h | 4 +++- Firmware/Marlin_main.cpp | 52 ++++++++++++++++++++++++++-------------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index a839ef9a6..4b14d251d 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -451,7 +451,9 @@ void force_high_power_mode(bool start_high_power_section); #endif //TMC2130 // G-codes -void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib); +void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool calib, bool without_mbl); +void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis); + bool gcode_M45(bool onlyZ, int8_t verbosity_level); void gcode_M114(); void gcode_M701(); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 97fa26f36..de269fcb9 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -734,7 +734,7 @@ void crashdet_detected(uint8_t mask) lcd_update_enable(true); lcd_update(2); lcd_setstatuspgm(_T(MSG_CRASH_DETECTED)); - gcode_G28(true, true, false, false); //home X and Y + gcode_G28(true, true, false); //home X and Y st_synchronize(); if (automatic_recovery_after_crash) { @@ -2614,7 +2614,11 @@ void force_high_power_mode(bool start_high_power_section) { } #endif //TMC2130 -void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { +void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis) { + gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, false, true); +} + +void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool calib, bool without_mbl) { st_synchronize(); #if 0 @@ -2625,6 +2629,11 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { // Flag for the display update routine and to disable the print cancelation during homing. homing_flag = true; + // Which axes should be homed? + bool home_x = home_x_axis; + bool home_y = home_y_axis; + bool home_z = home_z_axis; + // Either all X,Y,Z codes are present, or none of them. bool home_all_axes = home_x == home_y && home_x == home_z; if (home_all_axes) @@ -2733,11 +2742,11 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { #endif //TMC2130 - if(code_seen(axis_codes[X_AXIS]) && code_value_long() != 0) - current_position[X_AXIS]=code_value()+add_homing[X_AXIS]; + if(home_x_axis && home_x_value != 0) + current_position[X_AXIS]=home_x_value+add_homing[X_AXIS]; - if(code_seen(axis_codes[Y_AXIS]) && code_value_long() != 0) - current_position[Y_AXIS]=code_value()+add_homing[Y_AXIS]; + if(home_y_axis && home_y_value != 0) + current_position[Y_AXIS]=home_y_value+add_homing[Y_AXIS]; #if Z_HOME_DIR < 0 // If homing towards BED do Z last #ifndef Z_SAFE_HOMING @@ -2832,8 +2841,8 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { #endif // Z_SAFE_HOMING #endif // Z_HOME_DIR < 0 - if(code_seen(axis_codes[Z_AXIS]) && code_value_long() != 0) - current_position[Z_AXIS]=code_value()+add_homing[Z_AXIS]; + if(home_z_axis && home_z_value != 0) + current_position[Z_AXIS]=home_z_value+add_homing[Z_AXIS]; #ifdef ENABLE_AUTO_BED_LEVELING if(home_z) current_position[Z_AXIS] += zprobe_zoffset; //Add Z_Probe offset (the distance is negative) @@ -2865,7 +2874,7 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { world2machine_update_current(); #if (defined(MESH_BED_LEVELING) && !defined(MK1BP)) - if (code_seen(axis_codes[X_AXIS]) || code_seen(axis_codes[Y_AXIS]) || code_seen('W') || code_seen(axis_codes[Z_AXIS])) + if (home_x_axis || home_y_axis || without_mbl || home_z_axis) { if (! home_z && mbl_was_active) { // Re-enable the mesh bed leveling if only the X and Y axes were re-homed. @@ -2878,10 +2887,6 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { { st_synchronize(); homing_flag = false; - // Push the commands to the front of the message queue in the reverse order! - // There shall be always enough space reserved for these commands. - enquecommand_front_P((PSTR("G80"))); - //goto case_G80; } #endif @@ -3613,15 +3618,26 @@ void process_commands() #endif //FWRETRACT case 28: //G28 Home all Axis one at a time { - // Which axes should be homed? + long home_x_value = 0; + long home_y_value = 0; + long home_z_value = 0; + // Which axes should be homed? bool home_x = code_seen(axis_codes[X_AXIS]); + home_x_value = code_value_long(); bool home_y = code_seen(axis_codes[Y_AXIS]); - bool home_z = code_seen(axis_codes[Z_AXIS]); + home_y_value = code_value_long(); + bool home_z = code_seen(axis_codes[Z_AXIS]); + home_z_value = code_value_long(); + bool without_mbl = code_seen('W'); // calibrate? bool calib = code_seen('C'); - gcode_G28(home_x, home_y, home_z, calib); - + gcode_G28(home_x, home_x_value, home_y, home_y_value, home_z, home_z_value, calib, without_mbl); + if ((home_x || home_y || without_mbl || home_z) == false) { + // Push the commands to the front of the message queue in the reverse order! + // There shall be always enough space reserved for these commands. + goto case_G80; + } break; } #ifdef ENABLE_AUTO_BED_LEVELING @@ -3862,7 +3878,7 @@ void process_commands() current_position[X_AXIS] = pgm_read_float(bed_ref_points_4); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 3000 / 60, active_extruder); st_synchronize(); - gcode_G28(false, false, true, false); + gcode_G28(false, false, true); } if ((current_temperature_pinda > 35) && (farm_mode == false)) { From 0e15a4025b6281a8d15ae3f91684c85162df79b9 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 15 Jul 2018 20:24:24 +0200 Subject: [PATCH 11/13] whitespace --- Firmware/Marlin_main.cpp | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index de269fcb9..e78c8241f 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -2630,9 +2630,9 @@ void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_ homing_flag = true; // Which axes should be homed? - bool home_x = home_x_axis; - bool home_y = home_y_axis; - bool home_z = home_z_axis; + bool home_x = home_x_axis; + bool home_y = home_y_axis; + bool home_z = home_z_axis; // Either all X,Y,Z codes are present, or none of them. bool home_all_axes = home_x == home_y && home_x == home_z; @@ -2746,7 +2746,7 @@ void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_ current_position[X_AXIS]=home_x_value+add_homing[X_AXIS]; if(home_y_axis && home_y_value != 0) - current_position[Y_AXIS]=home_y_value+add_homing[Y_AXIS]; + current_position[Y_AXIS]=home_y_value+add_homing[Y_AXIS]; #if Z_HOME_DIR < 0 // If homing towards BED do Z last #ifndef Z_SAFE_HOMING @@ -3618,27 +3618,26 @@ void process_commands() #endif //FWRETRACT case 28: //G28 Home all Axis one at a time { - long home_x_value = 0; + long home_x_value = 0; long home_y_value = 0; - long home_z_value = 0; - // Which axes should be homed? + long home_z_value = 0; + // Which axes should be homed? bool home_x = code_seen(axis_codes[X_AXIS]); - home_x_value = code_value_long(); + home_x_value = code_value_long(); bool home_y = code_seen(axis_codes[Y_AXIS]); home_y_value = code_value_long(); - bool home_z = code_seen(axis_codes[Z_AXIS]); - home_z_value = code_value_long(); - bool without_mbl = code_seen('W'); + bool home_z = code_seen(axis_codes[Z_AXIS]); + home_z_value = code_value_long(); + bool without_mbl = code_seen('W'); // calibrate? bool calib = code_seen('C'); - - gcode_G28(home_x, home_x_value, home_y, home_y_value, home_z, home_z_value, calib, without_mbl); - if ((home_x || home_y || without_mbl || home_z) == false) { - // Push the commands to the front of the message queue in the reverse order! - // There shall be always enough space reserved for these commands. - goto case_G80; - } - break; + gcode_G28(home_x, home_x_value, home_y, home_y_value, home_z, home_z_value, calib, without_mbl); + if ((home_x || home_y || without_mbl || home_z) == false) { + // Push the commands to the front of the message queue in the reverse order! + // There shall be always enough space reserved for these commands. + goto case_G80; + } + break; } #ifdef ENABLE_AUTO_BED_LEVELING case 29: // G29 Detailed Z-Probe, probes the bed at 3 or more points. From a575c028bf0fcd37c23b982b18690b13bf0e23a5 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 16 Jul 2018 19:20:39 +0200 Subject: [PATCH 12/13] resend request sends OK --- Firmware/cmdqueue.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/cmdqueue.cpp b/Firmware/cmdqueue.cpp index 9ad24333f..1b18acfef 100644 --- a/Firmware/cmdqueue.cpp +++ b/Firmware/cmdqueue.cpp @@ -476,6 +476,7 @@ void get_command() SERIAL_ERROR_START; SERIAL_ERRORRPGM(_n("No Line Number with checksum, Last Line: "));////MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM c=0 r=0 SERIAL_ERRORLN(gcode_LastN); + FlushSerialRequestResend(); serial_count = 0; return; } From fddc02adfae6aec37da317331f9cca10a587b66a Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 16 Jul 2018 21:01:40 +0200 Subject: [PATCH 13/13] version changed --- Firmware/Configuration.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 9a9304a25..d95a4e0db 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -7,8 +7,8 @@ #define STR(x) STR_HELPER(x) // Firmware version -#define FW_VERSION "3.3.0" -#define FW_COMMIT_NR 830 +#define FW_VERSION "3.3.1" +#define FW_COMMIT_NR 845 // FW_VERSION_UNKNOWN means this is an unofficial build. // The firmware should only be checked into github with this symbol. #define FW_DEV_VERSION FW_VERSION_UNKNOWN