diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 7b44fef87..c1a7b5627 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -376,6 +376,10 @@ extern char dir_names[3][9]; extern int8_t lcd_change_fil_state; // save/restore printing extern bool saved_printing; +extern uint8_t saved_printing_type; +#define PRINTING_TYPE_SD 0 +#define PRINTING_TYPE_USB 1 +#define PRINTING_TYPE_NONE 2 //save/restore printing in case that mmu is not responding extern bool mmu_print_saved; diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index bc9f35bf4..6d48686c7 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -142,10 +142,6 @@ //Macro for print fan speed #define FAN_PULSE_WIDTH_LIMIT ((fanSpeed > 100) ? 3 : 4) //time in ms -#define PRINTING_TYPE_SD 0 -#define PRINTING_TYPE_USB 1 -#define PRINTING_TYPE_NONE 2 - //filament types #define FILAMENT_DEFAULT 0 #define FILAMENT_FLEX 1 @@ -375,7 +371,7 @@ boolean chdkActive = false; //! @{ bool saved_printing = false; //!< Print is paused and saved in RAM static uint32_t saved_sdpos = 0; //!< SD card position, or line number in case of USB printing -static uint8_t saved_printing_type = PRINTING_TYPE_SD; +uint8_t saved_printing_type = PRINTING_TYPE_SD; static float saved_pos[4] = { 0, 0, 0, 0 }; //! Feedrate hopefully derived from an active block of the planner at the time the print has been canceled, in mm/min. static float saved_feedrate2 = 0; @@ -623,7 +619,7 @@ void crashdet_cancel() if (saved_printing_type == PRINTING_TYPE_SD) { lcd_print_stop(); }else if(saved_printing_type == PRINTING_TYPE_USB){ - SERIAL_ECHOLNPGM("// action:cancel"); //for Octoprint: works the same as clicking "Abort" button in Octoprint GUI + SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_CANCEL); //for Octoprint: works the same as clicking "Abort" button in Octoprint GUI SERIAL_PROTOCOLLNRPGM(MSG_OK); } } @@ -1527,7 +1523,7 @@ void setup() calibration_status() == CALIBRATION_STATUS_UNKNOWN || calibration_status() == CALIBRATION_STATUS_XYZ_CALIBRATION) { // Reset the babystepping values, so the printer will not move the Z axis up when the babystepping is enabled. - eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); // Show the message. lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_CALIBRATION_FLOW)); } @@ -1751,12 +1747,25 @@ void loop() { is_usb_printing = false; } + if (isPrintPaused && saved_printing_type == PRINTING_TYPE_USB) //keep believing that usb is being printed. Prevents accessing dangerous menus while pausing. + { + is_usb_printing = true; + } + +#ifdef FANCHECK + if (fan_check_error && isPrintPaused) + { + KEEPALIVE_STATE(PAUSED_FOR_USER); + host_keepalive(); //prevent timeouts since usb processing is disabled until print is resumed. This is for a crude way of pausing a print on all hosts. + } +#endif if (prusa_sd_card_upload) { //we read byte-by byte serial_read_stream(); - } else + } + else { get_command(); @@ -2694,6 +2703,7 @@ static void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, lon previous_millis_cmd = _millis(); endstops_hit_on_purpose(); #ifndef MESH_BED_LEVELING +//-// Oct 2019 :: this part of code is (from) now probably un-compilable // If MESH_BED_LEVELING is not active, then it is the original Prusa i3. // Offer the user to load the baby step value, which has been adjusted at the previous print session. if(card.sdprinting && eeprom_read_word((uint16_t *)EEPROM_BABYSTEP_Z)) @@ -2886,7 +2896,7 @@ bool gcode_M45(bool onlyZ, int8_t verbosity_level) { // Reset the baby step value and the baby step applied flag. calibration_status_store(CALIBRATION_STATUS_XYZ_CALIBRATION); - eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); // Complete XYZ calibration. uint8_t point_too_far_mask = 0; BedSkewOffsetDetectionResultType result = find_bed_offset_and_skew(verbosity_level, point_too_far_mask); @@ -3450,22 +3460,16 @@ extern uint8_t st_backlash_y; void process_commands() { - #ifdef FANCHECK - if (fan_check_error){ - if( fan_check_error == EFCE_DETECTED ){ - fan_check_error = EFCE_REPORTED; - - if(is_usb_printing){ - SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE); - } - else{ - lcd_pause_print(); - } - - } // otherwise it has already been reported, so just ignore further processing - return; - } - #endif +#ifdef FANCHECK + if(fan_check_error){ + if(fan_check_error == EFCE_DETECTED){ + fan_check_error = EFCE_REPORTED; + // SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); + lcd_pause_print(); + } // otherwise it has already been reported, so just ignore further processing + return; //ignore usb stream. It is reenabled by selecting resume from the lcd. + } +#endif if (!buflen) return; //empty command #ifdef FILAMENT_RUNOUT_SUPPORT @@ -3736,7 +3740,7 @@ void process_commands() lang_reset(); } else if(code_seen("Lz")) { // PRUSA Lz - EEPROM_save_B(EEPROM_BABYSTEP_Z,0); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); } else if(code_seen("Beat")) { // PRUSA Beat // Kick farm link timer @@ -5503,7 +5507,7 @@ if(eSoundMode!=e_SOUND_MODE_SILENT) // Reset the baby step value and the baby step applied flag. calibration_status_store(CALIBRATION_STATUS_ASSEMBLED); - eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); // Reset the skew and offset in both RAM and EEPROM. reset_bed_offset_and_skew(); @@ -10165,7 +10169,8 @@ void restore_print_from_ram_and_continue(float e_move) #ifdef FANCHECK // Do not allow resume printing if fans are still not ok - if( fan_check_error != EFCE_OK )return; + if ((fan_check_error != EFCE_OK) && (fan_check_error != EFCE_FIXED)) return; + if (fan_check_error == EFCE_FIXED) fan_check_error = EFCE_OK; //reenable serial stream processing if printing from usb #endif // for (int axis = X_AXIS; axis <= E_AXIS; axis++) @@ -10219,6 +10224,7 @@ void restore_print_from_ram_and_continue(float e_move) } SERIAL_PROTOCOLLNRPGM(MSG_OK); //dummy response because of octoprint is waiting for this lcd_setstatuspgm(_T(WELCOME_MSG)); + saved_printing_type = PRINTING_TYPE_NONE; saved_printing = false; } diff --git a/Firmware/eeprom.cpp b/Firmware/eeprom.cpp index b33b2c3ca..93098e93b 100644 --- a/Firmware/eeprom.cpp +++ b/Firmware/eeprom.cpp @@ -62,7 +62,7 @@ void eeprom_init() if (eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) == 0xffff) eeprom_update_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT, 0); if (eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) == 0xff) eeprom_update_byte((uint8_t *)EEPROM_MMU_FAIL, 0); if (eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) == 0xff) eeprom_update_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL, 0); - if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == 0xff) + if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == EEPROM_EMPTY_VALUE) { eeprom_update_byte(&(EEPROM_Sheets_base->active_sheet), 0); // When upgrading from version older version (before multiple sheets were implemented in v3.8.0) diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index 482ddf932..197c18c25 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -3,9 +3,12 @@ #include +#define MAX_SHEETS 8 +#define MAX_SHEET_NAME_LENGTH 7 + typedef struct { - char name[7]; //!< Can be null terminated, doesn't need to be null terminated + char name[MAX_SHEET_NAME_LENGTH]; //!< Can be null terminated, doesn't need to be null terminated int16_t z_offset; //!< Z_BABYSTEP_MIN .. Z_BABYSTEP_MAX = Z_BABYSTEP_MIN*2/1000 [mm] .. Z_BABYSTEP_MAX*2/1000 [mm] uint8_t bed_temp; //!< 0 .. 254 [°C] uint8_t pinda_temp; //!< 0 .. 254 [°C] @@ -13,7 +16,7 @@ typedef struct typedef struct { - Sheet s[8]; + Sheet s[MAX_SHEETS]; uint8_t active_sheet; } Sheets; // sizeof(Sheets). Do not change it unless EEPROM_Sheets_base is last item in EEPROM. @@ -25,6 +28,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP #endif #define EEPROM_EMPTY_VALUE 0xFF +#define EEPROM_EMPTY_VALUE16 0xFFFF // The total size of the EEPROM is // 4096 for the Atmega2560 #define EEPROM_TOP 4096 diff --git a/Firmware/messages.c b/Firmware/messages.c index 1c36e43c5..c0c3cfc3f 100644 --- a/Firmware/messages.c +++ b/Firmware/messages.c @@ -129,4 +129,8 @@ const char MSG_ENDSTOP_OPEN[] PROGMEM_N1 = "open"; //// const char MSG_POWERUP[] PROGMEM_N1 = "PowerUp"; //// const char MSG_ERR_STOPPED[] PROGMEM_N1 = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; //// const char MSG_ENDSTOP_HIT[] PROGMEM_N1 = "TRIGGERED"; //// -const char MSG_OCTOPRINT_PAUSE[] PROGMEM_N1 = "// action:pause"; //// +const char MSG_OCTOPRINT_PAUSED[] PROGMEM_N1 = "// action:paused"; //// +const char MSG_OCTOPRINT_RESUMED[] PROGMEM_N1 = "// action:resumed"; //// +const char MSG_OCTOPRINT_CANCEL[] PROGMEM_N1 = "// action:cancel"; //// +const char MSG_FANCHECK_EXTRUDER[] PROGMEM_N1 = "Err: EXTR. FAN ERROR"; ////c=20 +const char MSG_FANCHECK_PRINT[] PROGMEM_N1 = "Err: PRINT FAN ERROR"; ////c=20 diff --git a/Firmware/messages.h b/Firmware/messages.h index b48337efd..525b7c5b4 100644 --- a/Firmware/messages.h +++ b/Firmware/messages.h @@ -130,7 +130,11 @@ extern const char MSG_ERR_STOPPED[]; extern const char MSG_ENDSTOP_HIT[]; extern const char MSG_EJECT_FILAMENT[]; extern const char MSG_CUT_FILAMENT[]; -extern const char MSG_OCTOPRINT_PAUSE[]; +extern const char MSG_OCTOPRINT_PAUSED[]; +extern const char MSG_OCTOPRINT_RESUMED[]; +extern const char MSG_OCTOPRINT_CANCEL[]; +extern const char MSG_FANCHECK_EXTRUDER[]; +extern const char MSG_FANCHECK_PRINT[]; #if defined(__cplusplus) } diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index 39fd95fca..df8a39e09 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -503,14 +503,14 @@ void checkFanSpeed() // drop the fan_check_error flag when both fans are ok if( fan_speed_errors[0] == 0 && fan_speed_errors[1] == 0 && fan_check_error == EFCE_REPORTED){ // we may even send some info to the LCD from here - fan_check_error = EFCE_OK; + fan_check_error = EFCE_FIXED; } - if ((fan_speed_errors[0] > max_extruder_fan_errors) && fans_check_enabled) { + if ((fan_speed_errors[0] > max_extruder_fan_errors) && fans_check_enabled && (fan_check_error == EFCE_OK)) { fan_speed_errors[0] = 0; fanSpeedError(0); //extruder fan } - if ((fan_speed_errors[1] > max_print_fan_errors) && fans_check_enabled) { + if ((fan_speed_errors[1] > max_print_fan_errors) && fans_check_enabled && (fan_check_error == EFCE_OK)) { fan_speed_errors[1] = 0; fanSpeedError(1); //print fan } @@ -529,31 +529,31 @@ static void fanSpeedErrorBeep(const char *serialMsg, const char *lcdMsg){ } void fanSpeedError(unsigned char _fan) { - if (get_message_level() != 0 && isPrintPaused) return; - //to ensure that target temp. is not set to zero in case taht we are resuming print + if (get_message_level() != 0 && isPrintPaused) return; + //to ensure that target temp. is not set to zero in case that we are resuming print if (card.sdprinting || is_usb_printing) { if (heating_status != 0) { lcd_print_stop(); } else { - fan_check_error = EFCE_DETECTED; + fan_check_error = EFCE_DETECTED; //plans error for next processed command } } else { - SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE); //for octoprint - setTargetHotend0(0); - heating_status = 0; - fan_check_error = EFCE_REPORTED; + // SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //Why pause octoprint? is_usb_printing would be true in that case, so there is no need for this. + setTargetHotend0(0); + heating_status = 0; + fan_check_error = EFCE_REPORTED; } switch (_fan) { case 0: // extracting the same code from case 0 and case 1 into a function saves 72B - fanSpeedErrorBeep(PSTR("Extruder fan speed is lower than expected"), PSTR("Err: EXTR. FAN ERROR") ); + fanSpeedErrorBeep(PSTR("Extruder fan speed is lower than expected"), MSG_FANCHECK_EXTRUDER); break; case 1: - fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), PSTR("Err: PRINT FAN ERROR") ); + fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), MSG_FANCHECK_PRINT); break; } - SERIAL_PROTOCOLLNRPGM(MSG_OK); + // SERIAL_PROTOCOLLNRPGM(MSG_OK); //This ok messes things up with octoprint. } #endif //(defined(TACH_0) && TACH_0 >-1) || (defined(TACH_1) && TACH_1 > -1) diff --git a/Firmware/temperature.h b/Firmware/temperature.h index 7f4daa2e4..7c40eae65 100755 --- a/Firmware/temperature.h +++ b/Firmware/temperature.h @@ -241,6 +241,7 @@ void checkExtruderAutoFans(); enum { EFCE_OK = 0, //!< normal operation, both fans are ok + EFCE_FIXED, //!< previous fan error was fixed EFCE_DETECTED, //!< fan error detected, but not reported yet EFCE_REPORTED //!< fan error detected and reported to LCD and serial }; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 3c83ab5af..20965a535 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1639,7 +1639,7 @@ void lcd_pause_print() { lcd_commands_type = LcdCommands::LongPause; } - SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE); //pause for octoprint + SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //pause for octoprint } @@ -3201,16 +3201,11 @@ static void lcd_babystep_z() if (LCD_CLICKED || menu_leaving) { // Only update the EEPROM when leaving the menu. - eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base-> - s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)), - _md->babystepMemZ); - eeprom_update_byte(&(EEPROM_Sheets_base->s[(eeprom_read_byte( - &(EEPROM_Sheets_base->active_sheet)))].bed_temp), - target_temperature_bed); -#ifdef PINDA_THERMISTOR - eeprom_update_byte(&(EEPROM_Sheets_base->s[(eeprom_read_byte( - &(EEPROM_Sheets_base->active_sheet)))].pinda_temp), - current_temperature_pinda); + uint8_t active_sheet=eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[active_sheet].z_offset)),_md->babystepMemZ); + eeprom_update_byte(&(EEPROM_Sheets_base->s[active_sheet].bed_temp),target_temperature_bed); +#ifdef PINDA_THERMISTOR + eeprom_update_byte(&(EEPROM_Sheets_base->s[active_sheet].pinda_temp),current_temperature_pinda); #endif //PINDA_THERMISTOR calibration_status_store(CALIBRATION_STATUS_CALIBRATED); } @@ -6588,19 +6583,61 @@ static void lcd_test_menu() } #endif //LCD_TEST +static bool fan_error_selftest() +{ +#ifdef FANCHECK + + fanSpeed = 255; +#ifdef FAN_SOFT_PWM + fanSpeedSoftPwm = 255; +#endif //FAN_SOFT_PWM + manage_heater(); //enables print fan + setExtruderAutoFanState(EXTRUDER_0_AUTO_FAN_PIN, 1); //force enables the extruder fan untill the first manage_heater() call. +#ifdef FAN_SOFT_PWM + extruder_autofan_last_check = _millis(); + fan_measuring = true; +#endif //FAN_SOFT_PWM + _delay(1000); //delay_keep_alive would turn off extruder fan, because temerature is too low (maybe) + manage_heater(); + fanSpeed = 0; +#ifdef FAN_SOFT_PWM + fanSpeedSoftPwm = 0; +#endif //FAN_SOFT_PWM + manage_heater(); +#ifdef TACH_0 + if (fan_speed[0] <= 20) { //extruder fan error + LCD_ALERTMESSAGERPGM(MSG_FANCHECK_EXTRUDER); + return 1; + } +#endif +#ifdef TACH_1 + if (fan_speed[1] <= 20) { //print fan error + LCD_ALERTMESSAGERPGM(MSG_FANCHECK_PRINT); + return 1; + } +#endif + return 0; + +#endif //FANCHECK +} + //! @brief Resume paused print //! @todo It is not good to call restore_print_from_ram_and_continue() from function called by lcd_update(), //! as restore_print_from_ram_and_continue() calls lcd_update() internally. void lcd_resume_print() { lcd_return_to_status(); - lcd_reset_alert_level(); + lcd_reset_alert_level(); lcd_setstatuspgm(_T(MSG_RESUMING_PRINT)); lcd_reset_alert_level(); //for fan speed error + + if (fan_error_selftest()) return; //abort if error persists + restore_print_from_ram_and_continue(0.0); pause_time += (_millis() - start_pause_print); //accumulate time when print is paused for correct statistics calculation refresh_cmd_timeout(); isPrintPaused = false; + SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUMED); //resume octoprint } static void change_sheet() @@ -6659,7 +6696,7 @@ static void lcd_reset_sheet() { SheetName sheetName; eeprom_default_sheet_name(selected_sheet, sheetName); - eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[selected_sheet].z_offset)),0xffff); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[selected_sheet].z_offset)),EEPROM_EMPTY_VALUE16); eeprom_update_block(sheetName.c,EEPROM_Sheets_base->s[selected_sheet].name,sizeof(Sheet::name)); if (selected_sheet == eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) { @@ -6736,6 +6773,10 @@ static void lcd_main_menu() } +#ifdef FANCHECK + if((fan_check_error == EFCE_FIXED) && (saved_printing_type == PRINTING_TYPE_USB)) + MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT +#endif #ifdef SDSUPPORT if (card.cardOK || lcd_commands_type == LcdCommands::Layer1Cal) @@ -6750,9 +6791,8 @@ static void lcd_main_menu() else { #ifdef FANCHECK - checkFanSpeed(); //Check manually to get most recent fan speed status - if(fan_check_error == EFCE_OK) - MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT + if((fan_check_error == EFCE_FIXED) || (fan_check_error == EFCE_OK)) + MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT #else MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT #endif @@ -7114,9 +7154,10 @@ void lcd_print_stop() //-// if(!card.sdprinting) { - SERIAL_ECHOLNPGM("// action:cancel"); // for Octoprint + SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_CANCEL); // for Octoprint } saved_printing = false; + saved_printing_type = PRINTING_TYPE_NONE; cancel_heatup = true; #ifdef MESH_BED_LEVELING mbl.active = false; diff --git a/Firmware/util.cpp b/Firmware/util.cpp index aa1a624da..aac72ee0c 100644 --- a/Firmware/util.cpp +++ b/Firmware/util.cpp @@ -341,13 +341,17 @@ if(oCheckMode==ClCheckMode::_Undef) eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)oCheckMode); } if(farm_mode) + { oCheckMode=ClCheckMode::_Strict; + if(eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)==EEPROM_EMPTY_VALUE16) + eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,EEPROM_NOZZLE_DIAMETER_uM_DEFAULT); + } oNozzleDiameter=(ClNozzleDiameter)eeprom_read_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER); if((oNozzleDiameter==ClNozzleDiameter::_Diameter_Undef)&& !farm_mode) { oNozzleDiameter=ClNozzleDiameter::_Diameter_400; eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)oNozzleDiameter); - eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,400); + eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,EEPROM_NOZZLE_DIAMETER_uM_DEFAULT); } oCheckModel=(ClCheckModel)eeprom_read_byte((uint8_t*)EEPROM_CHECK_MODEL); if(oCheckModel==ClCheckModel::_Undef) diff --git a/Firmware/util.h b/Firmware/util.h index a9bbcb1d6..8f23cd5c3 100644 --- a/Firmware/util.h +++ b/Firmware/util.h @@ -35,6 +35,8 @@ inline void eeprom_update_int8(unsigned char* addr, int8_t v) { //-// +#define EEPROM_NOZZLE_DIAMETER_uM_DEFAULT 400 + enum class ClPrintChecking:uint_least8_t { _Nozzle=1,