diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index f5f8c5700..36ecee5c0 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -51,6 +51,10 @@ #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 +#define EEPROM_UVLO_CURRENT_POSITION_Z (EEPROM_FILE_POSITION - 4) //float for current position in Z +#define EEPROM_UVLO_TARGET_HOTEND (EEPROM_UVLO_CURRENT_POSITION_Z - 1) +#define EEPROM_UVLO_TARGET_BED (EEPROM_UVLO_TARGET_HOTEND - 1) + // 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 202d23b94..77ab5b88a 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -209,7 +209,7 @@ void ClearToSend(); void get_coordinates(); void prepare_move(); -void kill(const char *full_screen_message = NULL); +void kill(const char *full_screen_message = NULL, unsigned char id = 0); void Stop(); bool IsStopped(); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 61a79db15..9be8df78b 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1227,18 +1227,21 @@ void setup() // Show the message. lcd_show_fullscreen_message_and_wait_P(MSG_FOLLOW_CALIBRATION_FLOW); } - if (eeprom_read_byte((uint8_t*)EEPROM_UVLO) == 1) { //previous print was terminated by UVLO - if (lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_RECOVER_PRINT)) recover_print(); - else eeprom_update_byte((uint8_t*)EEPROM_UVLO, 0); - } - for (int i = 0; i<4; i++) EEPROM_read_B(EEPROM_BOWDEN_LENGTH + i * 2, &bowden_length[i]); lcd_update_enable(true); // 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(); - + if (eeprom_read_byte((uint8_t*)EEPROM_UVLO) == 1) { //previous print was terminated by UVLO + if (lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_RECOVER_PRINT)) recover_print(); + else { + eeprom_update_byte((uint8_t*)EEPROM_UVLO, 0); + lcd_update_enable(true); + lcd_update(2); + lcd_setstatuspgm(WELCOME_MSG); + } + } } @@ -1494,7 +1497,7 @@ void get_command() //If command was e-stop process now if(strcmp(cmdbuffer+bufindw+1, "M112") == 0) - kill(); + kill("", 2); // Store the current line into buffer, move to the next line. cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_USB; @@ -4149,7 +4152,7 @@ Sigma_Exit: setWatch(); break; case 112: // M112 -Emergency Stop - kill(); + kill("", 3); break; case 140: // M140 set bed temp if (code_seen('S')) setTargetBed(code_value()); @@ -6028,7 +6031,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument s if( (millis() - previous_millis_cmd) > max_inactive_time ) if(max_inactive_time) - kill(); + kill("", 4); if(stepper_inactive_time) { if( (millis() - previous_millis_cmd) > stepper_inactive_time ) { @@ -6070,7 +6073,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument s // ---------------------------------------------------------------- if ( killCount >= KILL_DELAY) { - kill(); + kill("", 5); } #endif @@ -6102,8 +6105,11 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument s check_axes_activity(); } -void kill(const char *full_screen_message) +void kill(const char *full_screen_message, unsigned char id) { + SERIAL_ECHOPGM("KILL: "); + MYSERIAL.println(int(id)); + //return; cli(); // Stop interrupts disable_heater(); @@ -6790,37 +6796,70 @@ void serialecho_temperatures() { void uvlo_() { - //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(); + //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]); + eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION_Z), current_position[Z_AXIS]); + eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_HOTEND, target_temperature[active_extruder]); + eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_BED, target_temperature_bed); + 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], 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); + 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], 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 cmd[30]; + lcd_update_enable(true); + lcd_update(2); + lcd_setstatuspgm(WELCOME_MSG); //char cmd1[30]; + target_temperature[active_extruder] = eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_HOTEND); + target_temperature_bed = eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED); setTargetHotend0(210); //need to change to stored temperature setTargetBed(55); - homeaxis(X_AXIS); - homeaxis(Y_AXIS); + //SERIAL_ECHOPGM("Target temperature:"); + //MYSERIAL.println(target_temperature[0]); + //SERIAL_ECHOPGM("Target temp bed:"); + //MYSERIAL.println(target_temperature_bed); + //homeaxis(X_AXIS); + //homeaxis(Y_AXIS); + //home_xy(); + float z_pos = UVLO_Z_AXIS_SHIFT + eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_Z)); + //plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); + + SERIAL_ECHOPGM("current_position[Z_AXIS]:"); + MYSERIAL.println(current_position[Z_AXIS]); + SERIAL_ECHOPGM("z_pos"); + MYSERIAL.println(z_pos); + enquecommand_P(PSTR("G28 X")); + enquecommand_P(PSTR("G28 Y")); + strcpy(cmd, "G92 Z"); + strcat(cmd, ftostr43(z_pos)); + //fprintf(cmd, PSTR("G92 Z3.3%f"), z_pos); + enquecommand(cmd); + //enquecommand_P(PSTR("G92 Z2.2")); + eeprom_update_byte((uint8_t*)EEPROM_UVLO, 0); + while ((abs(degHotend(0)- target_temperature[0])>5) || (abs(degBed() -target_temperature_bed)>3)) { //wait for heater and bed to reach target temp + delay_keep_alive(1000); + } + //enquecommand_P("G28 W"); /*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)); @@ -6833,24 +6872,27 @@ void recover_print() { 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)); + //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]:"); MYSERIAL.println(current_position[X_AXIS]); SERIAL_ECHOPGM("Current position [Y_AXIS]:"); MYSERIAL.println(current_position[Y_AXIS]);*/ - 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[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(); + /*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(); 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], 400, active_extruder); - st_synchronize(); + st_synchronize();*/ + //enquecommand_P(PSTR("G1 Z" STRINGIFY(-UVLO_Z_AXIS_SHIFT))); + //enquecommand_P(PSTR("G1 E" STRINGIFY(DEFAULT_RETRACTION))); restore_print_from_eeprom(); - eeprom_update_byte((uint8_t*)EEPROM_UVLO, 0); - + SERIAL_ECHOPGM("current_position[Z_AXIS]:"); + MYSERIAL.print(current_position[Z_AXIS]); } void restore_print_from_eeprom() { @@ -6877,6 +6919,10 @@ void restore_print_from_eeprom() { enquecommand_P(PSTR("M24")); sprintf_P(cmd, PSTR("M26 S%d"), position); enquecommand(cmd); + enquecommand_P(PSTR("M83")); + //SERIAL_ECHO(cmdbuffer + bufindr + 1); + enquecommand_P(PSTR("G1 Z" STRINGIFY(-UVLO_Z_AXIS_SHIFT))); + enquecommand_P(PSTR("G1 E" STRINGIFY(DEFAULT_RETRACTION)" F2000")); } @@ -6895,10 +6941,30 @@ void setup_uvlo_interrupt() { ISR(INT4_vect) { EIMSK &= ~(1 << 4); //disable INT4 interrupt to make sure that this code will be executed just once SERIAL_ECHOLNPGM("INT4"); - uvlo_(); + if(IS_SD_PRINTING) uvlo_(); } void save_print_to_eeprom() { - eeprom_update_dword((uint32_t*)(EEPROM_FILE_POSITION), card.get_sdpos()); + //eeprom_update_word((uint16_t*)(EPROM_UVLO_CMD_QUEUE), bufindw - bufindr ); + //BLOCK_BUFFER_SIZE: max. 16 linear moves in planner buffer +#define TYP_GCODE_LENGTH 29 //G1 X117.489 Y22.814 E1.46695 + null + //card.get_sdpos() -> byte currently read from SD card + //bufindw -> position in circular buffer where to write + //bufindr -> position in circular buffer where to read + //bufflen -> number of lines in buffer -> for each line one special character?? + //TYP_GCODE_LENGTH* BLOCK_BUFFER_SIZE -> worst case from planner + long sd_position = card.get_sdpos() - ((bufindw > bufindr) ? (bufindw - bufindr) : sizeof(cmdbuffer) - bufindr + bufindw) - buflen - TYP_GCODE_LENGTH* BLOCK_BUFFER_SIZE; + if (sd_position < 0) sd_position = 0; + /*SERIAL_ECHOPGM("sd position before correction:"); + MYSERIAL.println(card.get_sdpos()); + SERIAL_ECHOPGM("bufindw:"); + MYSERIAL.println(bufindw); + SERIAL_ECHOPGM("bufindr:"); + MYSERIAL.println(bufindr); + SERIAL_ECHOPGM("sizeof(cmd_buffer):"); + MYSERIAL.println(sizeof(cmdbuffer)); + SERIAL_ECHOPGM("sd position after correction:"); + MYSERIAL.println(sd_position);*/ + eeprom_update_dword((uint32_t*)(EEPROM_FILE_POSITION), sd_position); } diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index f41f20ac7..28102aa1c 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -262,7 +262,7 @@ void CardReader::openFile(char* name,bool read, bool replace_current/*=true*/) SERIAL_ERROR_START; SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:"); SERIAL_ERRORLN(SD_PROCEDURE_DEPTH); - kill(); + kill("", 1); return; } diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index 5f7d9cdec..f5ea17496 100644 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -406,10 +406,7 @@ void setExtruderAutoFanState(int pin, bool state) } void countFanSpeed() -{ - SERIAL_ECHOPGM("UVLO:"); - MYSERIAL.println(UVLO); - +{ fan_speed[0] = (fan_edge_counter[0] * (float(250) / (millis() - extruder_autofan_last_check))); fan_speed[1] = (fan_edge_counter[1] * (float(250) / (millis() - extruder_autofan_last_check))); @@ -757,7 +754,7 @@ static float analog2temp(int raw, uint8_t e) { SERIAL_ERROR_START; SERIAL_ERROR((int)e); SERIAL_ERRORLNPGM(" - Invalid extruder number !"); - kill(); + kill("", 6); return 0.0; } #ifdef HEATER_0_USES_MAX6675 diff --git a/Firmware/tmc2130.cpp b/Firmware/tmc2130.cpp index 8fc05817f..5009fda05 100644 --- a/Firmware/tmc2130.cpp +++ b/Firmware/tmc2130.cpp @@ -162,10 +162,13 @@ void tmc2130_check_overtemp() //drivers_disabled[0] = 1; //TEST if( millis() - checktime > 1000 ) { + //SERIAL_ECHOLNPGM("drv_status:"); for(int i=0;i<4;i++) { uint32_t drv_status = 0; tmc2130_rd(cs[i], TMC2130_REG_DRV_STATUS, &drv_status); + //MYSERIAL.print(drv_status); + //SERIAL_ECHOPGM(" "); if (drv_status & ((uint32_t)1<<26)) { // BIT 26 - over temp prewarning ~120C (+-20C) SERIAL_ERRORRPGM(TMC_OVERTEMP_MSG); @@ -175,6 +178,7 @@ void tmc2130_check_overtemp() kill(TMC_OVERTEMP_MSG); } } + //SERIAL_ECHOLNPGM(""); checktime = millis(); } } diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 4533c6b2d..4ca6b9326 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3698,7 +3698,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 ) + MENU_ITEM(function, PSTR("recover print"), recover_print); + /* if (farm_mode && !IS_SD_PRINTING ) { int tempScrool = 0;