diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 2b730581c8..28697affab 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -140,6 +140,28 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load + void MarlinUI::reset_material_presets() { + #define _PITEM(N,T) PREHEAT_##N##_##T, + #if HAS_HOTEND + constexpr uint16_t hpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_HOTEND) }; + #endif + #if HAS_HEATED_BED + constexpr uint16_t bpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_BED) }; + #endif + #if HAS_HEATED_CHAMBER + constexpr uint16_t cpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_CHAMBER) }; + #endif + #if HAS_FAN + constexpr uint8_t fpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, FAN_SPEED) }; + #endif + for (uint8_t i = 0; i < PREHEAT_COUNT; ++i) { + TERN_(HAS_HOTEND, material_preset[i].hotend_temp = hpre[i]); + TERN_(HAS_HEATED_BED, material_preset[i].bed_temp = bpre[i]); + TERN_(HAS_HEATED_CHAMBER, material_preset[i].chamber_temp = cpre[i]); + TERN_(HAS_FAN, material_preset[i].fan_speed = fpre[i]); + } + } + FSTR_P MarlinUI::get_preheat_label(const uint8_t m) { #define _PDEF(N) static PGMSTR(preheat_##N##_label, PREHEAT_##N##_LABEL); #define _PLBL(N) preheat_##N##_label, diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index a610796ebc..578d143d96 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -648,6 +648,7 @@ public: #if HAS_PREHEAT enum PreheatTarget : uint8_t { PT_HOTEND, PT_BED, PT_FAN, PT_CHAMBER, PT_ALL = 0xFF }; static preheat_t material_preset[PREHEAT_COUNT]; + static void reset_material_presets(); static FSTR_P get_preheat_label(const uint8_t m); static void apply_preheat(const uint8_t m, const uint8_t pmask, const uint8_t e=active_extruder); static void preheat_set_fan(const uint8_t m) { TERN_(HAS_FAN, apply_preheat(m, _BV(PT_FAN))); } diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 7b8cb41505..b0ad431476 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -251,6 +251,41 @@ void Endstops::init() { } // Endstops::init +void Endstops::factory_reset() { + #if ENABLED(X_DUAL_ENDSTOPS) + #ifndef X2_ENDSTOP_ADJUSTMENT + #define X2_ENDSTOP_ADJUSTMENT 0 + #endif + endstops.x2_endstop_adj = X2_ENDSTOP_ADJUSTMENT; + #endif + + #if ENABLED(Y_DUAL_ENDSTOPS) + #ifndef Y2_ENDSTOP_ADJUSTMENT + #define Y2_ENDSTOP_ADJUSTMENT 0 + #endif + endstops.y2_endstop_adj = Y2_ENDSTOP_ADJUSTMENT; + #endif + + #if ENABLED(Z_MULTI_ENDSTOPS) + #ifndef Z2_ENDSTOP_ADJUSTMENT + #define Z2_ENDSTOP_ADJUSTMENT 0 + #endif + endstops.z2_endstop_adj = Z2_ENDSTOP_ADJUSTMENT; + #if NUM_Z_STEPPERS >= 3 + #ifndef Z3_ENDSTOP_ADJUSTMENT + #define Z3_ENDSTOP_ADJUSTMENT 0 + #endif + endstops.z3_endstop_adj = Z3_ENDSTOP_ADJUSTMENT; + #endif + #if NUM_Z_STEPPERS >= 4 + #ifndef Z4_ENDSTOP_ADJUSTMENT + #define Z4_ENDSTOP_ADJUSTMENT 0 + #endif + endstops.z4_endstop_adj = Z4_ENDSTOP_ADJUSTMENT; + #endif + #endif +} + // Called at ~1kHz from Temperature ISR: Poll endstop state if required void Endstops::poll() { diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index 1ef217b64a..40975632ff 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -172,6 +172,11 @@ class Endstops { */ static void init(); + /** + * Saved settings initialization + */ + static void factory_reset(); + /** * Are endstops or the Z min probe or the CALIBRATION probe set to abort the move? */ diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 8c99c54323..d325ef95d9 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3510,151 +3510,17 @@ void MarlinSettings::reset() { // // Endstop Adjustments // - - #if ENABLED(X_DUAL_ENDSTOPS) - #ifndef X2_ENDSTOP_ADJUSTMENT - #define X2_ENDSTOP_ADJUSTMENT 0 - #endif - endstops.x2_endstop_adj = X2_ENDSTOP_ADJUSTMENT; - #endif - - #if ENABLED(Y_DUAL_ENDSTOPS) - #ifndef Y2_ENDSTOP_ADJUSTMENT - #define Y2_ENDSTOP_ADJUSTMENT 0 - #endif - endstops.y2_endstop_adj = Y2_ENDSTOP_ADJUSTMENT; - #endif - - #if ENABLED(Z_MULTI_ENDSTOPS) - #ifndef Z2_ENDSTOP_ADJUSTMENT - #define Z2_ENDSTOP_ADJUSTMENT 0 - #endif - endstops.z2_endstop_adj = Z2_ENDSTOP_ADJUSTMENT; - #if NUM_Z_STEPPERS >= 3 - #ifndef Z3_ENDSTOP_ADJUSTMENT - #define Z3_ENDSTOP_ADJUSTMENT 0 - #endif - endstops.z3_endstop_adj = Z3_ENDSTOP_ADJUSTMENT; - #endif - #if NUM_Z_STEPPERS >= 4 - #ifndef Z4_ENDSTOP_ADJUSTMENT - #define Z4_ENDSTOP_ADJUSTMENT 0 - #endif - endstops.z4_endstop_adj = Z4_ENDSTOP_ADJUSTMENT; - #endif - #endif + endstops.factory_reset(); // - // Preheat parameters + // Material Presets // - #if HAS_PREHEAT - #define _PITEM(N,T) PREHEAT_##N##_##T, - #if HAS_HOTEND - constexpr uint16_t hpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_HOTEND) }; - #endif - #if HAS_HEATED_BED - constexpr uint16_t bpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_BED) }; - #endif - #if HAS_HEATED_CHAMBER - constexpr uint16_t cpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_CHAMBER) }; - #endif - #if HAS_FAN - constexpr uint8_t fpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, FAN_SPEED) }; - #endif - for (uint8_t i = 0; i < PREHEAT_COUNT; ++i) { - TERN_(HAS_HOTEND, ui.material_preset[i].hotend_temp = hpre[i]); - TERN_(HAS_HEATED_BED, ui.material_preset[i].bed_temp = bpre[i]); - TERN_(HAS_HEATED_CHAMBER, ui.material_preset[i].chamber_temp = cpre[i]); - TERN_(HAS_FAN, ui.material_preset[i].fan_speed = fpre[i]); - } - #endif + TERN_(HAS_PREHEAT, ui.reset_material_presets()); // - // Hotend PID + // Temperature Manager // - - #if ENABLED(PIDTEMP) - #if ENABLED(PID_PARAMS_PER_HOTEND) - constexpr float defKp[] = - #ifdef DEFAULT_Kp_LIST - DEFAULT_Kp_LIST - #else - ARRAY_BY_HOTENDS1(DEFAULT_Kp) - #endif - , defKi[] = - #ifdef DEFAULT_Ki_LIST - DEFAULT_Ki_LIST - #else - ARRAY_BY_HOTENDS1(DEFAULT_Ki) - #endif - , defKd[] = - #ifdef DEFAULT_Kd_LIST - DEFAULT_Kd_LIST - #else - ARRAY_BY_HOTENDS1(DEFAULT_Kd) - #endif - ; - static_assert(WITHIN(COUNT(defKp), 1, HOTENDS), "DEFAULT_Kp_LIST must have between 1 and HOTENDS items."); - static_assert(WITHIN(COUNT(defKi), 1, HOTENDS), "DEFAULT_Ki_LIST must have between 1 and HOTENDS items."); - static_assert(WITHIN(COUNT(defKd), 1, HOTENDS), "DEFAULT_Kd_LIST must have between 1 and HOTENDS items."); - #if ENABLED(PID_EXTRUSION_SCALING) - constexpr float defKc[] = - #ifdef DEFAULT_Kc_LIST - DEFAULT_Kc_LIST - #else - ARRAY_BY_HOTENDS1(DEFAULT_Kc) - #endif - ; - static_assert(WITHIN(COUNT(defKc), 1, HOTENDS), "DEFAULT_Kc_LIST must have between 1 and HOTENDS items."); - #endif - #if ENABLED(PID_FAN_SCALING) - constexpr float defKf[] = - #ifdef DEFAULT_Kf_LIST - DEFAULT_Kf_LIST - #else - ARRAY_BY_HOTENDS1(DEFAULT_Kf) - #endif - ; - static_assert(WITHIN(COUNT(defKf), 1, HOTENDS), "DEFAULT_Kf_LIST must have between 1 and HOTENDS items."); - #endif - #define PID_DEFAULT(N,E) def##N[E] - #else - #define PID_DEFAULT(N,E) DEFAULT_##N - #endif - HOTEND_LOOP() { - thermalManager.temp_hotend[e].pid.set( - PID_DEFAULT(Kp, ALIM(e, defKp)), - PID_DEFAULT(Ki, ALIM(e, defKi)), - PID_DEFAULT(Kd, ALIM(e, defKd)) - OPTARG(PID_EXTRUSION_SCALING, PID_DEFAULT(Kc, ALIM(e, defKc))) - OPTARG(PID_FAN_SCALING, PID_DEFAULT(Kf, ALIM(e, defKf))) - ); - } - #endif - - // - // PID Extrusion Scaling - // - TERN_(PID_EXTRUSION_SCALING, thermalManager.lpq_len = 20); // Default last-position-queue size - - // - // Heated Bed PID - // - #if ENABLED(PIDTEMPBED) - thermalManager.temp_bed.pid.set(DEFAULT_bedKp, DEFAULT_bedKi, DEFAULT_bedKd); - #endif - - // - // Heated Chamber PID - // - #if ENABLED(PIDTEMPCHAMBER) - thermalManager.temp_chamber.pid.set(DEFAULT_chamberKp, DEFAULT_chamberKi, DEFAULT_chamberKd); - #endif - - // - // User-Defined Thermistors - // - TERN_(HAS_USER_THERMISTORS, thermalManager.reset_user_thermistors()); + thermalManager.factory_reset(); // // Power Monitor @@ -3750,6 +3616,7 @@ void MarlinSettings::reset() { // #if ENABLED(LIN_ADVANCE) #if ENABLED(DISTINCT_E_FACTORS) + constexpr float linAdvanceK[] = ADVANCE_K; EXTRUDER_LOOP() { const float a = linAdvanceK[_MAX(uint8_t(e), COUNT(linAdvanceK) - 1)]; @@ -3767,8 +3634,9 @@ void MarlinSettings::reset() { #else stepper.set_advance_tau(ADVANCE_TAU); #endif + #endif - #endif + #endif // LIN_ADVANCE // // Motor Current PWM diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 0ef0a2f961..30690345a5 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -711,6 +711,93 @@ volatile bool Temperature::raw_temps_ready = false; #endif +void Temperature::factory_reset() { + // + // Hotend PID + // + #if ENABLED(PIDTEMP) + #if ENABLED(PID_PARAMS_PER_HOTEND) + constexpr float defKp[] = + #ifdef DEFAULT_Kp_LIST + DEFAULT_Kp_LIST + #else + ARRAY_BY_HOTENDS1(DEFAULT_Kp) + #endif + , defKi[] = + #ifdef DEFAULT_Ki_LIST + DEFAULT_Ki_LIST + #else + ARRAY_BY_HOTENDS1(DEFAULT_Ki) + #endif + , defKd[] = + #ifdef DEFAULT_Kd_LIST + DEFAULT_Kd_LIST + #else + ARRAY_BY_HOTENDS1(DEFAULT_Kd) + #endif + ; + static_assert(WITHIN(COUNT(defKp), 1, HOTENDS), "DEFAULT_Kp_LIST must have between 1 and HOTENDS items."); + static_assert(WITHIN(COUNT(defKi), 1, HOTENDS), "DEFAULT_Ki_LIST must have between 1 and HOTENDS items."); + static_assert(WITHIN(COUNT(defKd), 1, HOTENDS), "DEFAULT_Kd_LIST must have between 1 and HOTENDS items."); + #if ENABLED(PID_EXTRUSION_SCALING) + constexpr float defKc[] = + #ifdef DEFAULT_Kc_LIST + DEFAULT_Kc_LIST + #else + ARRAY_BY_HOTENDS1(DEFAULT_Kc) + #endif + ; + static_assert(WITHIN(COUNT(defKc), 1, HOTENDS), "DEFAULT_Kc_LIST must have between 1 and HOTENDS items."); + #endif + #if ENABLED(PID_FAN_SCALING) + constexpr float defKf[] = + #ifdef DEFAULT_Kf_LIST + DEFAULT_Kf_LIST + #else + ARRAY_BY_HOTENDS1(DEFAULT_Kf) + #endif + ; + static_assert(WITHIN(COUNT(defKf), 1, HOTENDS), "DEFAULT_Kf_LIST must have between 1 and HOTENDS items."); + #endif + #define PID_DEFAULT(N,E) def##N[E] + #else + #define PID_DEFAULT(N,E) DEFAULT_##N + #endif + HOTEND_LOOP() { + temp_hotend[e].pid.set( + PID_DEFAULT(Kp, ALIM(e, defKp)), + PID_DEFAULT(Ki, ALIM(e, defKi)), + PID_DEFAULT(Kd, ALIM(e, defKd)) + OPTARG(PID_EXTRUSION_SCALING, PID_DEFAULT(Kc, ALIM(e, defKc))) + OPTARG(PID_FAN_SCALING, PID_DEFAULT(Kf, ALIM(e, defKf))) + ); + } + #endif // PIDTEMP + + // + // PID Extrusion Scaling + // + TERN_(PID_EXTRUSION_SCALING, lpq_len = 20); // Default last-position-queue size + + // + // Heated Bed PID + // + #if ENABLED(PIDTEMPBED) + temp_bed.pid.set(DEFAULT_bedKp, DEFAULT_bedKi, DEFAULT_bedKd); + #endif + + // + // Heated Chamber PID + // + #if ENABLED(PIDTEMPCHAMBER) + temp_chamber.pid.set(DEFAULT_chamberKp, DEFAULT_chamberKi, DEFAULT_chamberKd); + #endif + + // User-Defined Thermistors + TERN_(HAS_USER_THERMISTORS, reset_user_thermistors()); + +} // factory_reset + #if HAS_PID_HEATING inline void say_default_() { SERIAL_ECHOPGM("#define DEFAULT_"); } @@ -939,9 +1026,9 @@ volatile bool Temperature::raw_temps_ready = false; auto _set_hotend_pid = [](const uint8_t tool, const raw_pid_t &in_pid) { #if ENABLED(PIDTEMP) #if ENABLED(PID_PARAMS_PER_HOTEND) - thermalManager.temp_hotend[tool].pid.set(in_pid); + temp_hotend[tool].pid.set(in_pid); #else - HOTEND_LOOP() thermalManager.temp_hotend[e].pid.set(in_pid); + HOTEND_LOOP() temp_hotend[e].pid.set(in_pid); #endif updatePID(); #endif diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 77c16bba0a..c96d9aba74 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -809,16 +809,14 @@ class Temperature { #endif public: - /** - * Instance Methods - */ - - void init(); - /** * Static (class) methods */ + static void init(); + + static void factory_reset(); + #if HAS_USER_THERMISTORS static user_thermistor_t user_thermistor[USER_THERMISTORS]; static void M305_report(const uint8_t t_index, const bool forReplay=true);