From c24f3369d77553113bd6aaaf9aa8c94574a67c67 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 23 Jun 2016 11:15:47 +0200 Subject: [PATCH] Fixed a bug in babystepping: The babystep value will be written to EEPROM at the end of the menu only. Provided a general method for a menu function to detect exiting by a timeout. When exiting, the menu function is called with a global variable menuExiting set. Some errorneously removed functions were reverted. --- Firmware/Configuration.h | 2 +- Firmware/Marlin_main.cpp | 9 ++++++++ Firmware/planner.cpp | 2 +- Firmware/planner.h | 2 +- Firmware/ultralcd.cpp | 49 +++++++++++++++++++++++++++++++--------- 5 files changed, 50 insertions(+), 14 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index e8c5d22c5..014ec952d 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -5,7 +5,7 @@ #include "Configuration_prusa.h" // Firmware version -#define FW_version "3.0.2-bedcalib" +#define FW_version "3.0.5" diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index d5a9a40cb..2c712fb15 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -730,6 +730,15 @@ void setup_killpin() #endif } +// Set home pin +void setup_homepin(void) +{ +#if defined(HOME_PIN) && HOME_PIN > -1 + SET_INPUT(HOME_PIN); + WRITE(HOME_PIN,HIGH); +#endif +} + void setup_photpin() { #if defined(PHOTOGRAPH_PIN) && PHOTOGRAPH_PIN > -1 diff --git a/Firmware/planner.cpp b/Firmware/planner.cpp index 623959c43..2c08b6687 100644 --- a/Firmware/planner.cpp +++ b/Firmware/planner.cpp @@ -1118,7 +1118,7 @@ void plan_set_position(float x, float y, float z, const float &e) } // Only useful in the bed leveling routine, when the mesh bed leveling is off. -void plan_set_z_position(float z) +void plan_set_z_position(const float &z) { position[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]); st_set_position(position[X_AXIS], position[Y_AXIS], position[Z_AXIS], position[E_AXIS]); diff --git a/Firmware/planner.h b/Firmware/planner.h index ea1dc0825..6cf075514 100644 --- a/Firmware/planner.h +++ b/Firmware/planner.h @@ -95,7 +95,7 @@ void plan_set_position(float x, float y, float z, const float &e); //void plan_set_position(const float &x, const float &y, const float &z, const float &e); //#endif // ENABLE_AUTO_BED_LEVELING -void plan_set_z_position(const float z); +void plan_set_z_position(const float &z); void plan_set_e_position(const float &e); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index ae6319689..ef3e6d993 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -38,6 +38,8 @@ int lcd_commands_type=0; int lcd_commands_step=0; bool isPrintPaused = false; +bool menuExiting = false; + /* Configuration settings */ int plaPreheatHotendTemp; int plaPreheatHPBTemp; @@ -125,8 +127,10 @@ static void lcd_quick_feedback();//Cause an LCD refresh, and give the user visua /* Different types of actions that can be used in menu items. */ static void menu_action_back(menuFunc_t data); static void menu_action_submenu(menuFunc_t data); +static void menu_action_gcode(const char* pgcode); static void menu_action_function(menuFunc_t data); static void menu_action_setlang(unsigned char lang); +static void menu_action_sdfile(const char* filename, char* longFilename); static void menu_action_sddirectory(const char* filename, char* longFilename); static void menu_action_setting_edit_bool(const char* pstr, bool* ptr); static void menu_action_setting_edit_int3(const char* pstr, int* ptr, int minValue, int maxValue); @@ -1044,28 +1048,26 @@ static void lcd_move_e() } +// Save a single axis babystep value. void EEPROM_save_B(int pos, int* value) { union Data data; data.value = *value; - eeprom_write_byte((unsigned char*)pos, data.b[0]); - eeprom_write_byte((unsigned char*)pos + 1, data.b[1]); - - + eeprom_update_byte((unsigned char*)pos, data.b[0]); + eeprom_update_byte((unsigned char*)pos + 1, data.b[1]); } +// Read a single axis babystep value. void EEPROM_read_B(int pos, int* value) { union Data data; data.b[0] = eeprom_read_byte((unsigned char*)pos); data.b[1] = eeprom_read_byte((unsigned char*)pos + 1); *value = data.value; - } - static void lcd_move_x() { _lcd_move(PSTR("X"), X_AXIS, X_MIN_POS, X_MAX_POS); } @@ -1084,15 +1086,18 @@ static void _lcd_babystep(int axis, const char *msg) { babystepsTodo[axis] += (int)encoderPosition; babystepMem[axis] += (int)encoderPosition; babystepMemMM[axis] = babystepMem[axis]/axis_steps_per_unit[Z_AXIS]; - delay(50); - encoderPosition = 0; + delay(50); + encoderPosition = 0; lcdDrawUpdate = 1; } if (lcdDrawUpdate) lcd_implementation_drawedit_2(msg, ftostr13ns(babystepMemMM[axis])); + if (LCD_CLICKED || menuExiting) { + // Only update the EEPROM when leaving the menu. + EEPROM_save_B( + (axis == 0) ? EEPROM_BABYSTEP_X : ((axis == 1) ? EEPROM_BABYSTEP_Y : EEPROM_BABYSTEP_Z), + &babystepMem[axis]); + } if (LCD_CLICKED) lcd_goto_menu(lcd_main_menu); - EEPROM_save_B(EEPROM_BABYSTEP_X, &babystepMem[0]); - EEPROM_save_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); - EEPROM_save_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); } static void lcd_babystep_x() { @@ -2508,12 +2513,26 @@ static void menu_action_back(menuFunc_t data) { static void menu_action_submenu(menuFunc_t data) { lcd_goto_menu(data); } +static void menu_action_gcode(const char* pgcode) { + enquecommand_P(pgcode); +} static void menu_action_setlang(unsigned char lang) { lcd_set_lang(lang); } static void menu_action_function(menuFunc_t data) { (*data)(); } +static void menu_action_sdfile(const char* filename, char* longFilename) +{ + char cmd[30]; + char* c; + sprintf_P(cmd, PSTR("M23 %s"), filename); + for (c = &cmd[4]; *c; c++) + *c = tolower(*c); + enquecommand(cmd); + enquecommand_P(PSTR("M24")); + lcd_return_to_status(); +} static void menu_action_sddirectory(const char* filename, char* longFilename) { card.chdir(filename); @@ -2694,6 +2713,14 @@ void lcd_update() #ifdef ULTIPANEL if (timeoutToStatus < millis() && currentMenu != lcd_status_screen) { + // 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. + // This is useful for example, when the babystep value has to be written into EEPROM. + if (currentMenu != NULL) { + menuExiting = true; + (*currentMenu)(); + menuExiting = false; + } lcd_return_to_status(); lcdDrawUpdate = 2; }