From 17074e1d25b7c0949d735131a4d5316e170cd5d1 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 2 Jul 2017 21:01:23 +0200 Subject: [PATCH] saving/restoring filename and current position in bytes to eeprom, UVLO changed --- Firmware/Configuration.h | 2 ++ Firmware/Marlin.h | 6 ++++ Firmware/Marlin_main.cpp | 68 +++++++++++++++++++++++++++++++++++++--- Firmware/cardreader.h | 1 + Firmware/pins.h | 12 +++---- Firmware/ultralcd.cpp | 5 +++ 6 files changed, 84 insertions(+), 10 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 8705a4ab..8dbe63bf 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -49,6 +49,8 @@ #define EEPROM_CALIBRATION_STATUS_PINDA (EEPROM_BOWDEN_LENGTH - 1) //0 - not calibrated; 1 - calibrated #define EEPROM_UVLO (EEPROM_CALIBRATION_STATUS_PINDA - 1) //1 - uvlo during print #define EEPROM_UVLO_CURRENT_POSITION (EEPROM_UVLO-2*4) // 2 x float for current_position in X and Y axes +#define EEPROM_FILENAME (EEPROM_UVLO_CURRENT_POSITION - 8) //8chars to store filename without extension +#define EEPROM_FILE_POSITION (EEPROM_FILENAME - 4) //32 bit for uint32_t file position // Currently running firmware, each digit stored as uint16_t. // The flavor differentiates a dev, alpha, beta, release candidate or a release version. diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 914c484f..202d23b9 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -356,4 +356,10 @@ void serialecho_temperatures(); void uvlo_(); void recover_print(); void setup_uvlo_interrupt(); + +extern void save_print_to_eeprom(); +extern void restore_print_from_eeprom(); +extern void position_menu(); + + #define UVLO !(PINE & (1<<4)) \ No newline at end of file diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 28839274..7ba62572 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -6748,22 +6748,49 @@ void serialecho_temperatures() { void uvlo_() { - SERIAL_ECHOLNPGM("UVLO"); - eeprom_update_byte((uint8_t*)EEPROM_UVLO, 1); + //SERIAL_ECHOLNPGM("UVLO"); + save_print_to_eeprom(); eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 0), current_position[X_AXIS]); eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4), current_position[Y_AXIS]); + disable_x(); + disable_y(); + planner_abort_hard(); + // Because the planner_abort_hard() initialized current_position[Z] from the stepper, + // Z baystep is no more applied. Reset it. + babystep_reset(); + // Clean the input command queue. + cmdqueue_reset(); + card.sdprinting = false; + card.closefile(); + current_position[E_AXIS] -= DEFAULT_RETRACTION; sei(); //enable stepper driver interrupt to move Z axis - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 40, active_extruder); + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400, active_extruder); st_synchronize(); current_position[Z_AXIS] += UVLO_Z_AXIS_SHIFT; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 40, active_extruder); st_synchronize(); + eeprom_update_byte((uint8_t*)EEPROM_UVLO, 1); } void recover_print() { + //char cmd1[30]; + setTargetHotend0(210); //need to change to stored temperature + setTargetBed(55); homeaxis(X_AXIS); homeaxis(Y_AXIS); + /*float x_rec, y_rec; + x_rec = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 0)); + y_rec = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4)); + strcpy(cmd1, "G1 X"); + strcat(cmd1, ftostr32(x_rec)); + strcat(cmd1, " Y"); + strcat(cmd1, ftostr32(y_rec)); + enquecommand(cmd1); + enquecommand_P(PSTR("G1 Z" STRINGIFY(-UVLO_Z_AXIS_SHIFT))); + enquecommand_P(PSTR("G1 E" STRINGIFY(DEFAULT_RETRACTION)));*/ + + current_position[X_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 0)); current_position[Y_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4)); /*SERIAL_ECHOPGM("Current position [X_AXIS]:"); @@ -6776,12 +6803,41 @@ void recover_print() { plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 40, active_extruder); st_synchronize(); current_position[E_AXIS] += DEFAULT_RETRACTION; //unretract - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 40, active_extruder); + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400, active_extruder); st_synchronize(); + + restore_print_from_eeprom(); eeprom_update_byte((uint8_t*)EEPROM_UVLO, 0); } +void restore_print_from_eeprom() { + char cmd[30]; + char* c; + char filename[13]; + char str[5] = ".gco"; + for (int i = 0; i < 8; i++) { + filename[i] = eeprom_read_byte((uint8_t*)EEPROM_FILENAME + i); + + } + filename[8] = '\0'; + MYSERIAL.print(filename); + strcat(filename, str); + sprintf_P(cmd, PSTR("M23 %s"), filename); + for (c = &cmd[4]; *c; c++) + *c = tolower(*c); + enquecommand(cmd); + uint32_t position = eeprom_read_dword((uint32_t*)(EEPROM_FILE_POSITION)); + SERIAL_ECHOPGM("Position read from eeprom:"); + MYSERIAL.println(position); + + card.setIndex(position); + enquecommand_P(PSTR("M24")); + sprintf_P(cmd, PSTR("M26 S%d"), position); + enquecommand(cmd); +} + + void setup_uvlo_interrupt() { DDRE &= ~(1 << 4); //input pin PORTE &= ~(1 << 4); //no internal pull-up @@ -6800,3 +6856,7 @@ ISR(INT4_vect) { uvlo_(); } + +void save_print_to_eeprom() { + eeprom_update_dword((uint32_t*)(EEPROM_FILE_POSITION), card.get_sdpos()); +} diff --git a/Firmware/cardreader.h b/Firmware/cardreader.h index 3e87b331..ec7f3e7c 100644 --- a/Firmware/cardreader.h +++ b/Firmware/cardreader.h @@ -47,6 +47,7 @@ public: FORCE_INLINE void setIndex(long index) {sdpos = index;file.seekSet(index);}; FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;}; FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;}; + FORCE_INLINE uint32_t get_sdpos() { if (!isFileOpen()) return 0; else return(sdpos); }; bool ToshibaFlashAir_isEnabled() const { return card.getFlashAirCompatible(); } void ToshibaFlashAir_enable(bool enable) { card.setFlashAirCompatible(enable); } diff --git a/Firmware/pins.h b/Firmware/pins.h index 046cc03b..b49651cb 100644 --- a/Firmware/pins.h +++ b/Firmware/pins.h @@ -399,9 +399,8 @@ #define BEEPER 84 // Beeper on AUX-4 #define LCD_PINS_RS 82 - -#define LCD_PINS_ENABLE 61 -#define LCD_PINS_D4 59 +#define LCD_PINS_ENABLE 18 +#define LCD_PINS_D4 19 #define LCD_PINS_D5 70 #define LCD_PINS_D6 85 #define LCD_PINS_D7 71 @@ -413,7 +412,7 @@ #define SDCARDDETECT 15 -#define TACH_0 79 +#define TACH_0 81 #define TACH_1 80 #endif //NEWPANEL @@ -504,12 +503,13 @@ #ifdef NEWPANEL + #define BEEPER 84 // Beeper on AUX-4 #define LCD_PINS_RS 82 //#define LCD_PINS_ENABLE 18 //#define LCD_PINS_D4 19 #define LCD_PINS_ENABLE 61 -#define LCD_PINS_D4 59 +#define LCD_PINS_D4 59 #define LCD_PINS_D5 70 #define LCD_PINS_D6 85 #define LCD_PINS_D7 71 @@ -522,7 +522,7 @@ #define SDCARDDETECT 15 #define TACH_0 79 -#define TACH_1 80 +#define TACH_1 80 #endif //NEWPANEL #endif //ULTRA_LCD diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 6adddd50..4bb4d12e 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3688,6 +3688,8 @@ static void lcd_main_menu() MENU_ITEM(back, MSG_WATCH, lcd_status_screen); + + MENU_ITEM(function, PSTR("restore_print"), restore_print_from_eeprom); /* if (farm_mode && !IS_SD_PRINTING ) { @@ -4818,6 +4820,9 @@ static void menu_action_sdfile(const char* filename, char* longFilename) for (c = &cmd[4]; *c; c++) *c = tolower(*c); enquecommand(cmd); + for (int i = 0; i < 8; i++) { + eeprom_write_byte((uint8_t*)EEPROM_FILENAME + i, filename[i]); + } enquecommand_P(PSTR("M24")); lcd_return_to_status(); }