From 0a07bba213424fc8841bb803e697b830c861df4e Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 18 Mar 2025 00:28:49 +0000 Subject: [PATCH 001/101] [cron] Bump distribution date (2025-03-18) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index a8be38fe31..6f5abc50e1 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-17" +//#define STRING_DISTRIBUTION_DATE "2025-03-18" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index c9db7e51b9..a36c00865f 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-17" + #define STRING_DISTRIBUTION_DATE "2025-03-18" #endif /** From 367cea0d0dfdf71464faf1422f46417388139306 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Mon, 17 Mar 2025 22:35:20 -0400 Subject: [PATCH 002/101] =?UTF-8?q?=F0=9F=9A=B8=20Chamber=20Preheat=20comp?= =?UTF-8?q?letion=20(#26864)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #21156 Co-authored-by: Scott Lahteine --- Marlin/src/gcode/lcd/M145.cpp | 5 +++ Marlin/src/gcode/temp/M141_M191.cpp | 9 ++++- Marlin/src/lcd/extui/ui_api.cpp | 3 ++ Marlin/src/lcd/extui/ui_api.h | 3 ++ Marlin/src/lcd/language/language_en.h | 3 ++ Marlin/src/lcd/marlinui.cpp | 8 ++--- Marlin/src/lcd/marlinui.h | 3 ++ Marlin/src/lcd/menu/menu_configuration.cpp | 3 ++ Marlin/src/lcd/menu/menu_temperature.cpp | 39 +++++++++++++--------- Marlin/src/module/settings.cpp | 10 ++++-- Marlin/src/module/temperature.h | 2 +- 11 files changed, 64 insertions(+), 24 deletions(-) diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index 3cc6130dfd..a0aa340d0d 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -37,6 +37,7 @@ * S * H * B + * C * F */ void GcodeSuite::M145() { @@ -53,6 +54,10 @@ void GcodeSuite::M145() { if (parser.seenval('B')) mat.bed_temp = constrain(parser.value_int(), BED_MINTEMP, BED_MAX_TARGET); #endif + #if HAS_HEATED_CHAMBER + if (parser.seenval('C')) + mat.chamber_temp = constrain(parser.value_int(), CHAMBER_MINTEMP, CHAMBER_MAX_TARGET); + #endif #if HAS_FAN if (parser.seenval('F')) mat.fan_speed = constrain(parser.value_int(), 0, 255); diff --git a/Marlin/src/gcode/temp/M141_M191.cpp b/Marlin/src/gcode/temp/M141_M191.cpp index 81a078318a..3364fbc22e 100644 --- a/Marlin/src/gcode/temp/M141_M191.cpp +++ b/Marlin/src/gcode/temp/M141_M191.cpp @@ -39,9 +39,16 @@ */ void GcodeSuite::M141() { if (DEBUGGING(DRYRUN)) return; + // Accept 'I' if temperature presets are defined + #if HAS_PREHEAT + if (parser.seenval('I')) { + const uint8_t index = parser.value_byte(); + thermalManager.setTargetChamber(ui.material_preset[_MIN(index, PREHEAT_COUNT - 1)].chamber_temp); + return; + } + #endif if (parser.seenval('S')) { thermalManager.setTargetChamber(parser.value_celsius()); - #if ENABLED(PRINTJOB_TIMER_AUTOSTART) /** * Stop the timer at the end of print. Hotend, bed target, and chamber diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index a53b5f5dba..5b6caf378a 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -811,6 +811,9 @@ namespace ExtUI { #if HAS_HEATED_BED uint16_t getMaterial_preset_B(const uint16_t index) { return ui.material_preset[index].bed_temp; } #endif + #if HAS_HEATED_CHAMBER + uint16_t getMaterial_preset_C(const uint16_t index) { return ui.material_preset[index].chamber_temp; } + #endif #endif feedRate_t getFeedrate_mm_s() { return feedrate_mm_s; } diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 2676d72aea..dfe393e39a 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -214,6 +214,9 @@ namespace ExtUI { #if HAS_HEATED_BED uint16_t getMaterial_preset_B(const uint16_t); #endif + #if HAS_HEATED_CHAMBER + uint16_t getMaterial_preset_C(const uint16_t); + #endif #endif // IDEX Machine Mode diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index b033dc3c74..6076c6fb30 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -155,6 +155,7 @@ namespace LanguageNarrow_en { LSTR MSG_PREHEAT_M_END_E = _UxGT("Preheat $ End ~"); LSTR MSG_PREHEAT_M_ALL = _UxGT("Preheat $ All"); LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preheat $ Bed"); + LSTR MSG_PREHEAT_M_CHAMBER = _UxGT("Preheat $ Chmb"); LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preheat $ Conf"); LSTR MSG_PREHEAT_HOTEND = _UxGT("Preheat Hotend"); @@ -1109,6 +1110,8 @@ namespace LanguageWide_en { LSTR MSG_HOMING_FEEDRATE_Y = _UxGT("Y Homing Feedrate"); LSTR MSG_HOMING_FEEDRATE_Z = _UxGT("Z Homing Feedrate"); LSTR MSG_EEPROM_INITIALIZED = _UxGT("Default Settings Restored"); + LSTR MSG_PREHEAT_M_CHAMBER = _UxGT("Preheat $ Chamber"); + LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preheat $ Config"); #endif } diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index e8946edb28..bd974d8d0a 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -150,10 +150,10 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; void MarlinUI::apply_preheat(const uint8_t m, const uint8_t pmask, const uint8_t e/*=active_extruder*/) { const preheat_t &pre = material_preset[m]; - TERN_(HAS_HOTEND, if (TEST(pmask, PT_HOTEND)) thermalManager.setTargetHotend(pre.hotend_temp, e)); - TERN_(HAS_HEATED_BED, if (TEST(pmask, PT_BED)) thermalManager.setTargetBed(pre.bed_temp)); - //TERN_(HAS_HEATED_CHAMBER, if (TEST(pmask, PT_CHAMBER)) thermalManager.setTargetChamber(pre.chamber_temp)); - TERN_(HAS_FAN, if (TEST(pmask, PT_FAN)) thermalManager.set_fan_speed(0, pre.fan_speed)); + TERN_(HAS_HOTEND, if (TEST(pmask, PT_HOTEND)) thermalManager.setTargetHotend(pre.hotend_temp, e)); + TERN_(HAS_HEATED_BED, if (TEST(pmask, PT_BED)) thermalManager.setTargetBed(pre.bed_temp)); + TERN_(HAS_HEATED_CHAMBER, if (TEST(pmask, PT_CHAMBER)) thermalManager.setTargetChamber(pre.chamber_temp)); + TERN_(HAS_FAN, if (TEST(pmask, PT_FAN)) thermalManager.set_fan_speed(0, pre.fan_speed)); } #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index a47096a3bf..26b559e6bc 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -118,6 +118,9 @@ typedef bool (*statusResetFunc_t)(); #if HAS_HEATED_BED celsius_t bed_temp; #endif + #if HAS_HEATED_CHAMBER + celsius_t chamber_temp; + #endif #if HAS_FAN uint16_t fan_speed; #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 65a2f222ce..c581bab4e3 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -451,6 +451,9 @@ void menu_advanced_settings(); #if HAS_HEATED_BED EDIT_ITEM(int3, MSG_BED, &ui.material_preset[m].bed_temp, BED_MINTEMP, BED_MAX_TARGET); #endif + #if HAS_HEATED_CHAMBER + EDIT_ITEM(int3, MSG_CHAMBER, &ui.material_preset[m].chamber_temp, CHAMBER_MINTEMP, CHAMBER_MAX_TARGET); + #endif #if ENABLED(EEPROM_SETTINGS) ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); #endif diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index e8a7b25dcb..1a43b121ce 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -45,15 +45,17 @@ #if HAS_PREHEAT - void Temperature::lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb) { - UNUSED(e); UNUSED(indh); UNUSED(indb); + void Temperature::lcd_preheat(const uint8_t e, const int8_t indh/*=-1*/, const int8_t indb/*=-1*/, const int8_t indc/*=-1*/) { + UNUSED(e); UNUSED(indh); UNUSED(indb); UNUSED(indc); #if HAS_HOTEND - if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) - setTargetHotend(_MIN(thermalManager.hotend_max_target(e), ui.material_preset[indh].hotend_temp), e); + if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) setTargetHotend(ui.material_preset[indh].hotend_temp, e); #endif #if HAS_HEATED_BED if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp); #endif + #if HAS_HEATED_CHAMBER + if (indc >= 0 && ui.material_preset[indc].chamber_temp > 0) setTargetChamber(ui.material_preset[indc].chamber_temp); + #endif #if HAS_FAN if (indh >= 0) { const uint8_t fan_index = active_extruder < (FAN_COUNT) ? active_extruder : 0; @@ -68,30 +70,33 @@ } #if HAS_TEMP_HOTEND - inline void _preheat_end(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } - void do_preheat_end_m() { _preheat_end(editable.int8, 0); } + inline void _preheat_end(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m); } + void do_preheat_end_m() { _preheat_end(0, editable.int8); } #endif #if HAS_HEATED_BED inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(0, -1, m); } #endif + #if HAS_HEATED_CHAMBER + inline void _preheat_chamber(const uint8_t m) { thermalManager.lcd_preheat(0, -1, -1, m); } + #endif #if HAS_COOLER - inline void _precool_laser(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } - void do_precool_laser_m() { _precool_laser(editable.int8, thermalManager.temp_cooler.target); } + inline void _precool_laser(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m); } + void do_precool_laser_m() { _precool_laser(thermalManager.temp_cooler.target, editable.int8); } #endif - #if HAS_TEMP_HOTEND && HAS_HEATED_BED - inline void _preheat_both(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, m); } + #if HAS_TEMP_HOTEND && (HAS_HEATED_BED || HAS_HEATED_CHAMBER) + inline void _preheat_all(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m, m, m); } // Indexed "Preheat ABC" and "Heat Bed" items #define PREHEAT_ITEMS(M,E) do{ \ - ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_both(M, MenuItemBase::itemIndex); }); \ - ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(M, MenuItemBase::itemIndex); }); \ + ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_all(MenuItemBase::itemIndex, M); }); \ + ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(MenuItemBase::itemIndex, M); }); \ }while(0) #elif HAS_MULTI_HOTEND // No heated bed, so just indexed "Preheat ABC" items - #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(M, MenuItemBase::itemIndex); }) + #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(MenuItemBase::itemIndex, M); }) #endif @@ -107,8 +112,8 @@ #if HOTENDS == 1 - #if HAS_HEATED_BED - ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_both(editable.int8, 0); }); + #if HAS_HEATED_BED || HAS_HEATED_CHAMBER + ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_all(0, editable.int8); }); ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_END, do_preheat_end_m); #else ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); @@ -129,6 +134,10 @@ ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_BEDONLY, []{ _preheat_bed(editable.int8); }); #endif + #if HAS_HEATED_CHAMBER + ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_CHAMBER, []{ _preheat_chamber(editable.int8); }); + #endif + END_MENU(); } diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 485d01066a..8c33e73f00 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3564,13 +3564,17 @@ void MarlinSettings::reset() { #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_FAN, ui.material_preset[i].fan_speed = fpre[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 diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 27e28f07a8..cc25cfad14 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -1335,7 +1335,7 @@ class Temperature { #endif #if HAS_MARLINUI_MENU && HAS_TEMPERATURE && HAS_PREHEAT - static void lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb); + static void lcd_preheat(const uint8_t e, const int8_t indh=-1, const int8_t indb=-1, const int8_t indc=-1); #endif private: From 4ad6fa59df95d175c0acb49c33c2cf83fee5d449 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 18 Mar 2025 18:22:22 -0500 Subject: [PATCH 003/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Mor?= =?UTF-8?q?e=20extensible=20Temperature::lcd=5Fpreheat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/menu/menu_temperature.cpp | 32 +++++++++++++++--------- Marlin/src/module/temperature.h | 12 ++++++++- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 1a43b121ce..0a376494e5 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -45,47 +45,55 @@ #if HAS_PREHEAT - void Temperature::lcd_preheat(const uint8_t e, const int8_t indh/*=-1*/, const int8_t indb/*=-1*/, const int8_t indc/*=-1*/) { - UNUSED(e); UNUSED(indh); UNUSED(indb); UNUSED(indc); + /** + * @fn Temperature::lcd_preheat + * @brief Apply the "preheat" parameters for a material preset to the + * hotend (or laser), bed, chamber, or all of the above. + * @param m Material index + * @param targets Bit mask of targets to "preheat" (or turn off) + * @param e Extruder index (if needed) + */ + void Temperature::lcd_preheat(const uint8_t m, const uint8_t targets, const uint8_t e/*=0*/) { + UNUSED(e); #if HAS_HOTEND - if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) setTargetHotend(ui.material_preset[indh].hotend_temp, e); + if (targets & PreheatTarget::HOTEND) setTargetHotend(ui.material_preset[m].hotend_temp, e); #endif #if HAS_HEATED_BED - if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp); + if (targets & PreheatTarget::BED) setTargetBed(ui.material_preset[m].bed_temp); #endif #if HAS_HEATED_CHAMBER - if (indc >= 0 && ui.material_preset[indc].chamber_temp > 0) setTargetChamber(ui.material_preset[indc].chamber_temp); + if (targets & PreheatTarget::CHAMBER) setTargetChamber(ui.material_preset[m].chamber_temp); #endif #if HAS_FAN - if (indh >= 0) { + if (targets & PreheatTarget::HOTEND) { const uint8_t fan_index = active_extruder < (FAN_COUNT) ? active_extruder : 0; if (true #if REDUNDANT_PART_COOLING_FAN && fan_index != REDUNDANT_PART_COOLING_FAN #endif - ) set_fan_speed(fan_index, ui.material_preset[indh].fan_speed); + ) set_fan_speed(fan_index, ui.material_preset[m].fan_speed); } #endif ui.return_to_status(); } #if HAS_TEMP_HOTEND - inline void _preheat_end(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m); } + inline void _preheat_end(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::HOTEND, e); } void do_preheat_end_m() { _preheat_end(0, editable.int8); } #endif #if HAS_HEATED_BED - inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(0, -1, m); } + inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::BED); } #endif #if HAS_HEATED_CHAMBER - inline void _preheat_chamber(const uint8_t m) { thermalManager.lcd_preheat(0, -1, -1, m); } + inline void _preheat_chamber(const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::CHAMBER); } #endif #if HAS_COOLER - inline void _precool_laser(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m); } + inline void _precool_laser(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::HOTEND, e); } void do_precool_laser_m() { _precool_laser(thermalManager.temp_cooler.target, editable.int8); } #endif #if HAS_TEMP_HOTEND && (HAS_HEATED_BED || HAS_HEATED_CHAMBER) - inline void _preheat_all(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m, m, m); } + inline void _preheat_all(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::ALL, e); } // Indexed "Preheat ABC" and "Heat Bed" items #define PREHEAT_ITEMS(M,E) do{ \ diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index cc25cfad14..5f7ea8daf4 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -599,6 +599,15 @@ typedef struct { raw_adc_t raw_min, raw_max; celsius_t mintemp, maxtemp; } temp_ #define HAS_FAN_LOGIC 1 #endif +#if HAS_MARLINUI_MENU && HAS_TEMPERATURE && HAS_PREHEAT + enum PreheatTarget : uint8_t { + HOTEND = (1 << 0), + BED = (1 << 1), + CHAMBER = (1 << 2), + ALL = 0xFF + }; +#endif + class Temperature { public: @@ -1335,7 +1344,8 @@ class Temperature { #endif #if HAS_MARLINUI_MENU && HAS_TEMPERATURE && HAS_PREHEAT - static void lcd_preheat(const uint8_t e, const int8_t indh=-1, const int8_t indb=-1, const int8_t indc=-1); + // Apply the "preheat" parameters for a material preset to the hotend (or laser), bed, chamber, or all of the above + static void lcd_preheat(const uint8_t m, const uint8_t targets, const uint8_t e=0); #endif private: From 23fa94178e1b1d00869058575eee0e7f06602839 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 19 Mar 2025 00:31:12 +0000 Subject: [PATCH 004/101] [cron] Bump distribution date (2025-03-19) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 6f5abc50e1..d2f7ac3ffd 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-18" +//#define STRING_DISTRIBUTION_DATE "2025-03-19" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index a36c00865f..fbdc9cdd04 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-18" + #define STRING_DISTRIBUTION_DATE "2025-03-19" #endif /** From 15ee0d0e081fd42cf00a5b26b289a2ea14ddd9f5 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Wed, 19 Mar 2025 14:39:24 +1300 Subject: [PATCH 005/101] =?UTF-8?q?=E2=9C=A8=20MAG=5FMOUNTED=5FPROBE=5FSER?= =?UTF-8?q?VO=5FNR=20(#27551)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: gjdodd --- Marlin/Configuration.h | 14 ++++++++++++++ Marlin/src/inc/Conditionals-3-etc.h | 5 ++++- Marlin/src/inc/Conditionals-4-adv.h | 4 ++++ Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/module/probe.cpp | 24 ++++++++++++++++++++++-- Marlin/src/module/servo.h | 7 +++++++ buildroot/tests/LPC1769 | 2 +- 7 files changed, 53 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 6e16dc5caf..1202bc1e53 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1540,6 +1540,20 @@ #define PROBE_DEPLOY_FEEDRATE (133*60) // (mm/min) Probe deploy speed #define PROBE_STOW_FEEDRATE (133*60) // (mm/min) Probe stow speed + /** + * Magnetically Mounted Probe with a Servo mechanism + * Probe Deploy and Stow both follow the same basic sequence: + * - Rotate the SERVO to its Deployed angle + * - Perform XYZ moves to deploy or stow the PROBE + * - Rotate the SERVO to its Stowed angle + */ + //#define MAG_MOUNTED_PROBE_SERVO_NR 0 // Servo Number for this probe + #ifdef MAG_MOUNTED_PROBE_SERVO_NR + #define MAG_MOUNTED_PROBE_SERVO_ANGLES { 90, 0 } // Servo Angles for Deployed, Stowed + #define MAG_MOUNTED_PRE_DEPLOY { PROBE_DEPLOY_FEEDRATE, { 15, 160, 30 } } // Safe position for servo activation + #define MAG_MOUNTED_PRE_STOW { PROBE_DEPLOY_FEEDRATE, { 15, 160, 30 } } // Safe position for servo deactivation + #endif + #define MAG_MOUNTED_DEPLOY_1 { PROBE_DEPLOY_FEEDRATE, { 245, 114, 30 } } // Move to side Dock & Attach probe #define MAG_MOUNTED_DEPLOY_2 { PROBE_DEPLOY_FEEDRATE, { 210, 114, 30 } } // Move probe off dock #define MAG_MOUNTED_DEPLOY_3 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed diff --git a/Marlin/src/inc/Conditionals-3-etc.h b/Marlin/src/inc/Conditionals-3-etc.h index 7f005c3539..e4dcdda58f 100644 --- a/Marlin/src/inc/Conditionals-3-etc.h +++ b/Marlin/src/inc/Conditionals-3-etc.h @@ -135,7 +135,10 @@ #ifdef Z_PROBE_SERVO_NR #define HAS_Z_SERVO_PROBE 1 #endif -#if ANY(HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) +#ifdef MAG_MOUNTED_PROBE_SERVO_NR + #define HAS_MAG_MOUNTED_SERVO_PROBE 1 +#endif +#if ANY(HAS_Z_SERVO_PROBE, HAS_MAG_MOUNTED_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) #define HAS_SERVO_ANGLES 1 #endif #if !HAS_SERVO_ANGLES diff --git a/Marlin/src/inc/Conditionals-4-adv.h b/Marlin/src/inc/Conditionals-4-adv.h index 103de78865..b697f22a20 100644 --- a/Marlin/src/inc/Conditionals-4-adv.h +++ b/Marlin/src/inc/Conditionals-4-adv.h @@ -53,6 +53,10 @@ #undef NUM_SERVOS #define NUM_SERVOS INCREMENT(Z_PROBE_SERVO_NR) #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE && NUM_SERVOS <= MAG_MOUNTED_PROBE_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS INCREMENT(MAG_MOUNTED_PROBE_SERVO_NR) + #endif #if ENABLED(CHAMBER_VENT) && NUM_SERVOS <= CHAMBER_VENT_SERVO_NR #undef NUM_SERVOS #define NUM_SERVOS INCREMENT(CHAMBER_VENT_SERVO_NR) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index e07fa78173..0029980ada 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -982,7 +982,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i /** * Servo deactivation depends on servo endstops, switching nozzle, or switching extruder */ -#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) && NONE(HAS_Z_SERVO_PROBE, POLARGRAPH) && !defined(SWITCHING_NOZZLE_SERVO_NR) && !defined(SWITCHING_EXTRUDER_SERVO_NR) && !defined(SWITCHING_TOOLHEAD_SERVO_NR) +#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) && NONE(HAS_Z_SERVO_PROBE, POLARGRAPH) && !defined(SWITCHING_NOZZLE_SERVO_NR) && !defined(SWITCHING_EXTRUDER_SERVO_NR) && !defined(SWITCHING_TOOLHEAD_SERVO_NR) && !defined(MAG_MOUNTED_PROBE_SERVO_NR) #error "Z_PROBE_SERVO_NR, switching nozzle, switching toolhead, switching extruder, or POLARGRAPH is required for DEACTIVATE_SERVOS_AFTER_MOVE." #endif diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index a66c11a782..e121bca812 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -82,7 +82,7 @@ #include "../feature/host_actions.h" // for PROMPT_USER_CONTINUE #endif -#if HAS_Z_SERVO_PROBE +#if HAS_Z_SERVO_PROBE || HAS_MAG_MOUNTED_SERVO_PROBE #include "servo.h" #endif @@ -272,6 +272,13 @@ xyz_pos_t Probe::offset; // Initialized by settings.load typedef struct { float fr_mm_min; xyz_pos_t where; } mag_probe_move_t; inline void run_deploy_moves() { + #ifdef MAG_MOUNTED_PRE_DEPLOY + constexpr mag_probe_move_t pre_deploy = MAG_MOUNTED_PRE_DEPLOY; + do_blocking_move_to(pre_deploy.where, MMM_TO_MMS(pre_deploy.fr_mm_min)); + #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][0]); + #endif #ifdef MAG_MOUNTED_DEPLOY_1 constexpr mag_probe_move_t deploy_1 = MAG_MOUNTED_DEPLOY_1; do_blocking_move_to(deploy_1.where, MMM_TO_MMS(deploy_1.fr_mm_min)); @@ -292,9 +299,19 @@ xyz_pos_t Probe::offset; // Initialized by settings.load constexpr mag_probe_move_t deploy_5 = MAG_MOUNTED_DEPLOY_5; do_blocking_move_to(deploy_5.where, MMM_TO_MMS(deploy_5.fr_mm_min)); #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][1]); + #endif } inline void run_stow_moves() { + #ifdef MAG_MOUNTED_PRE_STOW + constexpr mag_probe_move_t pre_stow = MAG_MOUNTED_PRE_STOW; + do_blocking_move_to(pre_stow.where, MMM_TO_MMS(pre_stow.fr_mm_min)); + #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][0]); + #endif #ifdef MAG_MOUNTED_STOW_1 constexpr mag_probe_move_t stow_1 = MAG_MOUNTED_STOW_1; do_blocking_move_to(stow_1.where, MMM_TO_MMS(stow_1.fr_mm_min)); @@ -315,6 +332,9 @@ xyz_pos_t Probe::offset; // Initialized by settings.load constexpr mag_probe_move_t stow_5 = MAG_MOUNTED_STOW_5; do_blocking_move_to(stow_5.where, MMM_TO_MMS(stow_5.fr_mm_min)); #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][1]); + #endif } #endif // MAG_MOUNTED_PROBE @@ -541,7 +561,7 @@ bool Probe::set_deployed(const bool deploy, const bool no_return/*=false*/) { #if ENABLED(PROBE_TRIGGERED_WHEN_STOWED_TEST) // Only deploy/stow if needed - if (PROBE_TRIGGERED() == deploy) { + if (PROBE_TRIGGERED() == deploy || !deploy) { if (!deploy) endstops.enable_z_probe(false); // Switch off triggered when stowed probes early // otherwise an Allen-Key probe can't be stowed. probe_specific_action(deploy); diff --git a/Marlin/src/module/servo.h b/Marlin/src/module/servo.h index 3b6c33a8f7..f35a8c3930 100644 --- a/Marlin/src/module/servo.h +++ b/Marlin/src/module/servo.h @@ -63,6 +63,9 @@ #endif constexpr uint16_t sazp[] = Z_SERVO_ANGLES; static_assert(COUNT(sazp) == 2, "Z_SERVO_ANGLES needs 2 angles."); + #elif defined(MAG_MOUNTED_PROBE_SERVO_ANGLES) + constexpr uint16_t sazp[] = MAG_MOUNTED_PROBE_SERVO_ANGLES; + static_assert(COUNT(sazp) == 2, "MAG_MOUNTED_PROBE_SERVO_ANGLES needs 2 angles."); #else constexpr uint16_t sazp[2] = { 0 }; #endif @@ -82,6 +85,9 @@ #ifndef Z_PROBE_SERVO_NR #define Z_PROBE_SERVO_NR -1 #endif + #ifndef MAG_MOUNTED_PROBE_SERVO_NR + #define MAG_MOUNTED_PROBE_SERVO_NR -1 + #endif #define SASN(J,I) TERN(SWITCHING_NOZZLE_TWO_SERVOS, sasn[J][I], sasn[I]) @@ -91,6 +97,7 @@ : N == SWITCHING_NOZZLE_SERVO_NR ? SASN(0,I) \ : N == SWITCHING_NOZZLE_E1_SERVO_NR ? SASN(1,I) \ : N == Z_PROBE_SERVO_NR ? sazp[I] \ + : N == MAG_MOUNTED_PROBE_SERVO_NR ? sazp[I] \ : 0 ) #if ENABLED(EDITABLE_SERVO_ANGLES) diff --git a/buildroot/tests/LPC1769 b/buildroot/tests/LPC1769 index ad14e3353d..a97790e988 100755 --- a/buildroot/tests/LPC1769 +++ b/buildroot/tests/LPC1769 @@ -15,7 +15,7 @@ exec_test $1 $2 "Azteeg X5GT Example Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD \ EXTRUDERS 2 TEMP_SENSOR_0 -5 TEMP_SENSOR_1 -4 TEMP_SENSOR_BED 5 TEMP_0_CS_PIN P1_29 \ - GRID_MAX_POINTS_X 16 \ + MAG_MOUNTED_PROBE_SERVO_NR 0 GRID_MAX_POINTS_X 16 \ NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING REPORT_ADAPTIVE_FAN_SLOWING TEMP_TUNING_MAINTAIN_FAN \ From 719bb9c03bb0bc53d324f14bb6eef982e8cea4b1 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:14:58 +1300 Subject: [PATCH 006/101] =?UTF-8?q?=F0=9F=94=A7=20LCD=5FPINS=5FENABLE=20?= =?UTF-8?q?=3D>=20LCD=5FPINS=5FEN=20(#27700)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/rp2040/pins_RP2040.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/pins/rp2040/pins_RP2040.h b/Marlin/src/pins/rp2040/pins_RP2040.h index 1b88ce347b..48e37e4e1f 100644 --- a/Marlin/src/pins/rp2040/pins_RP2040.h +++ b/Marlin/src/pins/rp2040/pins_RP2040.h @@ -320,13 +320,13 @@ #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_EN 51 // SID (MOSI) #define LCD_PINS_D4 52 // SCK (CLK) clock #elif ALL(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS 40 - #define LCD_PINS_ENABLE 42 + #define LCD_PINS_EN 42 #define LCD_PINS_D4 65 #define LCD_PINS_D5 66 #define LCD_PINS_D6 44 @@ -337,7 +337,7 @@ #if ENABLED(CR10_STOCKDISPLAY) #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 29 + #define LCD_PINS_EN 29 #define LCD_PINS_D4 25 #if !IS_NEWPANEL @@ -347,7 +347,7 @@ #elif ENABLED(ZONESTAR_LCD) #define LCD_PINS_RS 64 - #define LCD_PINS_ENABLE 44 + #define LCD_PINS_EN 44 #define LCD_PINS_D4 63 #define LCD_PINS_D5 40 #define LCD_PINS_D6 42 @@ -365,7 +365,7 @@ #define DOGLCD_A0 LCD_PINS_DC #else #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 + #define LCD_PINS_EN 17 #define LCD_PINS_D4 23 #define LCD_PINS_D5 25 #define LCD_PINS_D6 27 From 4f3279fa315b4664349eeae96af62b505e8227ea Mon Sep 17 00:00:00 2001 From: Sophist <3001893+Sophist-UK@users.noreply.github.com> Date: Wed, 19 Mar 2025 03:21:30 +0000 Subject: [PATCH 007/101] =?UTF-8?q?=F0=9F=9A=B8=20Move=20About=20/=20Games?= =?UTF-8?q?=20to=20menu=20bottom=20(#26820)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/menu/menu_main.cpp | 56 ++++++++++++++----------------- 1 file changed, 25 insertions(+), 31 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 6142e0e153..60f5c271c6 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -234,16 +234,6 @@ void menu_configuration(); #endif // CUSTOM_MENU_MAIN -#if ENABLED(ADVANCED_PAUSE_FEATURE) - // This menu item is last with an encoder. Otherwise, somewhere in the middle. - #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES) - #define FILAMENT_CHANGE_ITEM() YESNO_ITEM(MSG_FILAMENTCHANGE, menu_change_filament, nullptr, \ - GET_TEXT_F(MSG_FILAMENTCHANGE), (const char *)nullptr, F("?")) - #else - #define FILAMENT_CHANGE_ITEM() SUBMENU(MSG_FILAMENTCHANGE, menu_change_filament) - #endif -#endif - void menu_main() { const bool busy = printingIsActive(); #if HAS_MEDIA @@ -348,7 +338,11 @@ void menu_main() { #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) - FILAMENT_CHANGE_ITEM(); + #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES) + YESNO_ITEM(MSG_FILAMENTCHANGE, menu_change_filament, nullptr, GET_TEXT_F(MSG_FILAMENTCHANGE), (const char *)nullptr, F("?")); + #else + SUBMENU(MSG_FILAMENTCHANGE, menu_change_filament); + #endif #endif #if HAS_TEMPERATURE @@ -381,10 +375,6 @@ void menu_main() { } #endif - #if ENABLED(LCD_INFO_MENU) - SUBMENU(MSG_INFO_MENU, menu_info); - #endif - #if ENABLED(LED_CONTROL_MENU) SUBMENU(MSG_LIGHTS, menu_led); #elif ALL(CASE_LIGHT_MENU, CASELIGHT_USES_BRIGHTNESS) @@ -412,7 +402,6 @@ void menu_main() { #endif #if HAS_MEDIA && DISABLED(MEDIA_MENU_AT_TOP) - // BEGIN MEDIA MENU if (card_detected) { if (!card_open) { #if ENABLED(MENU_ADDAUTOSTART) @@ -449,7 +438,6 @@ void menu_main() { #endif #endif } - // END MEDIA MENU #endif #if HAS_SERVICE_INTERVALS @@ -482,7 +470,26 @@ void menu_main() { #endif #endif - #if HAS_GAMES && DISABLED(LCD_INFO_MENU) + #if HAS_MULTI_LANGUAGE + SUBMENU(LANGUAGE, menu_language); + #endif + + #if ENABLED(HOST_SHUTDOWN_MENU_ITEM) && defined(SHUTDOWN_ACTION) + SUBMENU(MSG_HOST_SHUTDOWN, []{ + MenuItem_confirm::select_screen( + GET_TEXT_F(MSG_BUTTON_PROCEED), GET_TEXT_F(MSG_BUTTON_CANCEL), + []{ ui.return_to_status(); hostui.shutdown(); }, nullptr, + GET_TEXT_F(MSG_HOST_SHUTDOWN), (const char *)nullptr, F("?") + ); + }); + #endif + + #if ENABLED(LCD_INFO_MENU) + + SUBMENU(MSG_INFO_MENU, menu_info); + + #elif HAS_GAMES + #if ENABLED(GAMES_EASTER_EGG) SKIP_ITEM(); SKIP_ITEM(); @@ -504,20 +511,7 @@ void menu_main() { #endif ); } - #endif - #if HAS_MULTI_LANGUAGE - SUBMENU(LANGUAGE, menu_language); - #endif - - #if ENABLED(HOST_SHUTDOWN_MENU_ITEM) && defined(SHUTDOWN_ACTION) - SUBMENU(MSG_HOST_SHUTDOWN, []{ - MenuItem_confirm::select_screen( - GET_TEXT_F(MSG_BUTTON_PROCEED), GET_TEXT_F(MSG_BUTTON_CANCEL), - []{ ui.return_to_status(); hostui.shutdown(); }, nullptr, - GET_TEXT_F(MSG_HOST_SHUTDOWN), (const char *)nullptr, F("?") - ); - }); #endif END_MENU(); From fc49efcaef97ab657b28ce1077c7bc07d538bacc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Mar 2025 14:34:24 -0500 Subject: [PATCH 008/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Lam?= =?UTF-8?q?bda=20for=20MarlinUI=20media=20items?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/menu/menu_main.cpp | 102 +++++++++++------------------- 1 file changed, 36 insertions(+), 66 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 60f5c271c6..9509c72cc5 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -248,34 +248,8 @@ void menu_main() { #define MEDIA_MENU_AT_TOP #endif - if (busy) { - #if MACHINE_CAN_PAUSE - ACTION_ITEM(MSG_PAUSE_PRINT, ui.pause_print); - #endif - #if MACHINE_CAN_STOP - SUBMENU(MSG_STOP_PRINT, []{ - MenuItem_confirm::select_screen( - GET_TEXT_F(MSG_BUTTON_STOP), GET_TEXT_F(MSG_BACK), - ui.abort_print, nullptr, - GET_TEXT_F(MSG_STOP_PRINT), (const char *)nullptr, F("?") - ); - }); - #endif - - #if ENABLED(GCODE_REPEAT_MARKERS) - if (repeat.is_active()) - ACTION_ITEM(MSG_END_LOOPS, repeat.cancel); - #endif - - SUBMENU(MSG_TUNE, menu_tune); - - #if ENABLED(CANCEL_OBJECTS) && DISABLED(SLIM_LCD_MENUS) - SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); }); - #endif - } - else { - #if ALL(HAS_MEDIA, MEDIA_MENU_AT_TOP) - // BEGIN MEDIA MENU + auto media_menus = [&]{ + #if HAS_MEDIA if (card_detected) { if (!card_open) { #if ENABLED(MENU_ADDAUTOSTART) @@ -312,8 +286,38 @@ void menu_main() { #endif #endif } - // END MEDIA MENU #endif + }; + + if (busy) { + #if MACHINE_CAN_PAUSE + ACTION_ITEM(MSG_PAUSE_PRINT, ui.pause_print); + #endif + #if MACHINE_CAN_STOP + SUBMENU(MSG_STOP_PRINT, []{ + MenuItem_confirm::select_screen( + GET_TEXT_F(MSG_BUTTON_STOP), GET_TEXT_F(MSG_BACK), + ui.abort_print, nullptr, + GET_TEXT_F(MSG_STOP_PRINT), (const char *)nullptr, F("?") + ); + }); + #endif + + #if ENABLED(GCODE_REPEAT_MARKERS) + if (repeat.is_active()) + ACTION_ITEM(MSG_END_LOOPS, repeat.cancel); + #endif + + SUBMENU(MSG_TUNE, menu_tune); + + #if ENABLED(CANCEL_OBJECTS) && DISABLED(SLIM_LCD_MENUS) + SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); }); + #endif + } + else { + + // SD Card / Flash Drive + TERN_(MEDIA_MENU_AT_TOP, media_menus()); if (TERN0(MACHINE_CAN_PAUSE, printingIsPaused())) ACTION_ITEM(MSG_RESUME_PRINT, ui.resume_print); @@ -401,43 +405,9 @@ void menu_main() { GCODES_ITEM(MSG_SWITCH_PS_ON, F("M80")); #endif - #if HAS_MEDIA && DISABLED(MEDIA_MENU_AT_TOP) - if (card_detected) { - if (!card_open) { - #if ENABLED(MENU_ADDAUTOSTART) - ACTION_ITEM(MSG_RUN_AUTO_FILES, card.autofile_begin); // Run Auto Files - #endif - - #if HAS_SD_DETECT - GCODES_ITEM(MSG_CHANGE_MEDIA, F("M21" TERN_(HAS_MULTI_VOLUME, "S"))); // M21 Change Media - #if HAS_MULTI_VOLUME - GCODES_ITEM(MSG_ATTACH_USB_MEDIA, F("M21U")); // M21 Attach USB Media - #endif - #else // - or - - ACTION_ITEM(MSG_RELEASE_MEDIA, []{ // M22 Release Media - queue.inject(F("M22")); - #if ENABLED(TFT_COLOR_UI) - // Menu display issue on item removal with multi language selection menu - if (encoderTopLine > 0) encoderTopLine--; - ui.refresh(); - #endif - }); - #endif - SUBMENU(MSG_MEDIA_MENU, MEDIA_MENU_GATEWAY); // Media Menu (or Password First) - } - } - else { - #if HAS_SD_DETECT - ACTION_ITEM(MSG_NO_MEDIA, nullptr); // "No Media" - #else - #if HAS_MULTI_VOLUME - GCODES_ITEM(MSG_ATTACH_SD_MEDIA, F("M21S")); // M21S Attach SD Card - GCODES_ITEM(MSG_ATTACH_USB_MEDIA, F("M21U")); // M21U Attach USB Media - #else - GCODES_ITEM(MSG_ATTACH_MEDIA, F("M21")); // M21 Attach Media - #endif - #endif - } + // SD Card / Flash Drive + #if DISABLED(MEDIA_MENU_AT_TOP) + if (!busy) media_menus(); #endif #if HAS_SERVICE_INTERVALS From a7684ecd6710ede96b8f18f9debe2b69fc7e9f12 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Mar 2025 15:13:45 -0500 Subject: [PATCH 009/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Reu?= =?UTF-8?q?se=20MarlinUI::apply=5Fpreheat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/marlinui.cpp | 14 +++++- Marlin/src/lcd/marlinui.h | 3 +- Marlin/src/lcd/menu/menu_temperature.cpp | 54 +++++------------------- Marlin/src/module/temperature.h | 14 ------ 4 files changed, 25 insertions(+), 60 deletions(-) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index bd974d8d0a..679c43b402 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -153,7 +153,17 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; TERN_(HAS_HOTEND, if (TEST(pmask, PT_HOTEND)) thermalManager.setTargetHotend(pre.hotend_temp, e)); TERN_(HAS_HEATED_BED, if (TEST(pmask, PT_BED)) thermalManager.setTargetBed(pre.bed_temp)); TERN_(HAS_HEATED_CHAMBER, if (TEST(pmask, PT_CHAMBER)) thermalManager.setTargetChamber(pre.chamber_temp)); - TERN_(HAS_FAN, if (TEST(pmask, PT_FAN)) thermalManager.set_fan_speed(0, pre.fan_speed)); + TERN_(HAS_FAN, if (TEST(pmask, PT_FAN)) thermalManager.set_fan_speed(e, pre.fan_speed)); + #if HAS_FAN + if (TEST(pmask, PT_FAN)) { + const uint8_t fan_index = e < (FAN_COUNT) ? e : 0; + if (true + #if REDUNDANT_PART_COOLING_FAN + && fan_index != REDUNDANT_PART_COOLING_FAN + #endif + ) thermalManager.set_fan_speed(fan_index, pre.fan_speed); + } + #endif } #endif @@ -1935,7 +1945,7 @@ uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind, settings.reset(); completion_feedback(); #if ENABLED(TOUCH_SCREEN_CALIBRATION) - if (touch_calibration.need_calibration()) ui.goto_screen(touch_screen_calibration); + if (touch_calibration.need_calibration()) goto_screen(touch_screen_calibration); #endif } diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 26b559e6bc..9f2ac5a69a 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -652,7 +652,8 @@ public: static void preheat_hotend(const uint8_t m, const uint8_t e=active_extruder) { TERN_(HAS_HOTEND, apply_preheat(m, _BV(PT_HOTEND))); } static void preheat_hotend_and_fan(const uint8_t m, const uint8_t e=active_extruder) { preheat_hotend(m, e); preheat_set_fan(m); } static void preheat_bed(const uint8_t m) { TERN_(HAS_HEATED_BED, apply_preheat(m, _BV(PT_BED))); } - static void preheat_all(const uint8_t m) { apply_preheat(m, PT_ALL); } + static void preheat_chamber(const uint8_t m) { TERN_(HAS_HEATED_CHAMBER, apply_preheat(m, _BV(PT_CHAMBER))); } + static void preheat_all(const uint8_t m, const uint8_t e=active_extruder) { apply_preheat(m, PT_ALL, e); } #endif static void reset_status_timeout(const millis_t ms) { diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 0a376494e5..b43f906cc7 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -45,66 +45,34 @@ #if HAS_PREHEAT - /** - * @fn Temperature::lcd_preheat - * @brief Apply the "preheat" parameters for a material preset to the - * hotend (or laser), bed, chamber, or all of the above. - * @param m Material index - * @param targets Bit mask of targets to "preheat" (or turn off) - * @param e Extruder index (if needed) - */ - void Temperature::lcd_preheat(const uint8_t m, const uint8_t targets, const uint8_t e/*=0*/) { - UNUSED(e); - #if HAS_HOTEND - if (targets & PreheatTarget::HOTEND) setTargetHotend(ui.material_preset[m].hotend_temp, e); - #endif - #if HAS_HEATED_BED - if (targets & PreheatTarget::BED) setTargetBed(ui.material_preset[m].bed_temp); - #endif - #if HAS_HEATED_CHAMBER - if (targets & PreheatTarget::CHAMBER) setTargetChamber(ui.material_preset[m].chamber_temp); - #endif - #if HAS_FAN - if (targets & PreheatTarget::HOTEND) { - const uint8_t fan_index = active_extruder < (FAN_COUNT) ? active_extruder : 0; - if (true - #if REDUNDANT_PART_COOLING_FAN - && fan_index != REDUNDANT_PART_COOLING_FAN - #endif - ) set_fan_speed(fan_index, ui.material_preset[m].fan_speed); - } - #endif - ui.return_to_status(); - } - #if HAS_TEMP_HOTEND - inline void _preheat_end(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::HOTEND, e); } - void do_preheat_end_m() { _preheat_end(0, editable.int8); } + inline void _preheat_end(const uint8_t m, const uint8_t e) { ui.preheat_hotend(m, e); ui.return_to_status(); } + void do_preheat_end_m() { _preheat_end(editable.int8, 0); } #endif #if HAS_HEATED_BED - inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::BED); } + inline void _preheat_bed(const uint8_t m) { ui.preheat_bed(m); ui.return_to_status(); } #endif #if HAS_HEATED_CHAMBER - inline void _preheat_chamber(const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::CHAMBER); } + inline void _preheat_chamber(const uint8_t m) { ui.preheat_chamber(m); ui.return_to_status(); } #endif #if HAS_COOLER - inline void _precool_laser(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::HOTEND, e); } - void do_precool_laser_m() { _precool_laser(thermalManager.temp_cooler.target, editable.int8); } + inline void _precool_laser(const uint8_t m, const uint8_t e) { ui.preheat_hotend(m, e); ui.return_to_status(); } + void do_precool_laser_m() { _precool_laser(editable.int8, thermalManager.temp_cooler.target); } #endif #if HAS_TEMP_HOTEND && (HAS_HEATED_BED || HAS_HEATED_CHAMBER) - inline void _preheat_all(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::ALL, e); } + inline void _preheat_all(const uint8_t m, const uint8_t e) { ui.preheat_all(m, e); ui.return_to_status(); } // Indexed "Preheat ABC" and "Heat Bed" items #define PREHEAT_ITEMS(M,E) do{ \ - ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_all(MenuItemBase::itemIndex, M); }); \ - ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(MenuItemBase::itemIndex, M); }); \ + ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_all(M, MenuItemBase::itemIndex); }); \ + ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(M, MenuItemBase::itemIndex); }); \ }while(0) #elif HAS_MULTI_HOTEND // No heated bed, so just indexed "Preheat ABC" items - #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(MenuItemBase::itemIndex, M); }) + #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(M, MenuItemBase::itemIndex); }) #endif @@ -121,7 +89,7 @@ #if HOTENDS == 1 #if HAS_HEATED_BED || HAS_HEATED_CHAMBER - ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_all(0, editable.int8); }); + ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_all(editable.int8, 0); }); ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_END, do_preheat_end_m); #else ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 5f7ea8daf4..934b1b1246 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -599,15 +599,6 @@ typedef struct { raw_adc_t raw_min, raw_max; celsius_t mintemp, maxtemp; } temp_ #define HAS_FAN_LOGIC 1 #endif -#if HAS_MARLINUI_MENU && HAS_TEMPERATURE && HAS_PREHEAT - enum PreheatTarget : uint8_t { - HOTEND = (1 << 0), - BED = (1 << 1), - CHAMBER = (1 << 2), - ALL = 0xFF - }; -#endif - class Temperature { public: @@ -1343,11 +1334,6 @@ class Temperature { static void set_heating_message(const uint8_t, const bool=false) {} #endif - #if HAS_MARLINUI_MENU && HAS_TEMPERATURE && HAS_PREHEAT - // Apply the "preheat" parameters for a material preset to the hotend (or laser), bed, chamber, or all of the above - static void lcd_preheat(const uint8_t m, const uint8_t targets, const uint8_t e=0); - #endif - private: // Reading raw temperatures and converting to Celsius when ready From 26aac7aaab2d2cd4a09f2f17b5b6a852e7cdeb99 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Thu, 20 Mar 2025 09:45:30 +1300 Subject: [PATCH 010/101] =?UTF-8?q?=F0=9F=90=9B=20Fix=20RAMPS=20AUX1=20RX/?= =?UTF-8?q?TX=20pins=20(#27745)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/ramps/pins_RAMPS.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index e033cfd060..8237c7e227 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -486,15 +486,15 @@ #endif // -// AUX1 5V GND D2 D1 +// AUX1 5V GND D1 D0 // 2 4 6 8 // 1 3 5 7 // 5V GND A3 A4 // #define AUX1_05 57 // (A3) -#define AUX1_06 2 +#define AUX1_06 1 // TX0 #define AUX1_07 58 // (A4) -#define AUX1_08 1 +#define AUX1_08 0 // RX0 // // AUX2 GND A9 D40 D42 A11 From 58749a9a0ed93f10295695d7acbe607a6e871d30 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Thu, 20 Mar 2025 10:02:01 +1300 Subject: [PATCH 011/101] =?UTF-8?q?=F0=9F=A9=B9=20BTT=20Manta=20M8P=20V2.0?= =?UTF-8?q?=20fixes=20(#27748)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The notorious curse of incorrect BTT pins rears its head once again! --- Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h b/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h index d274c99e19..941d6ab068 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h @@ -307,7 +307,6 @@ //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 //#define E0_HARDWARE_SERIAL Serial1 //#define E1_HARDWARE_SERIAL Serial1 //#define E2_HARDWARE_SERIAL Serial1 @@ -317,11 +316,11 @@ #define X_SERIAL_TX_PIN PC13 #define Y_SERIAL_TX_PIN PE3 #define Z_SERIAL_TX_PIN PB9 - #define Z2_SERIAL_TX_PIN PB5 - #define E0_SERIAL_TX_PIN PG14 - #define E1_SERIAL_TX_PIN PG10 - #define E2_SERIAL_TX_PIN PD5 - #define E3_SERIAL_TX_PIN PC6 + #define E0_SERIAL_TX_PIN PB5 + #define E1_SERIAL_TX_PIN PG14 + #define E2_SERIAL_TX_PIN PG10 + #define E3_SERIAL_TX_PIN PD5 + #define E4_SERIAL_TX_PIN PC6 // Reduce baud rate to improve software serial reliability #ifndef TMC_BAUD_RATE From c7e64371c989925c74a5c2a13683f71bbbd6bdc7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Mar 2025 17:35:23 -0500 Subject: [PATCH 012/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Pro?= =?UTF-8?q?UI:=20pre-calculate=20menu=20sizes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/e3v2/proui/dwin.cpp | 176 ++++++++++++++++++++++++----- 1 file changed, 149 insertions(+), 27 deletions(-) diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index cbf806a7c9..03f25b5010 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -3101,8 +3101,18 @@ frame_rect_t selrect(frame_rect_t) { } void drawPrepareMenu() { + constexpr uint8_t items = (3 + + COUNT_ENABLED(LCD_BED_TRAMMING) + + 2 + + TERN(MESH_BED_LEVELING, 1, ENABLED(HAS_BED_PROBE)) + + TERN(HAS_ZOFFSET_ITEM, ENABLED(HAS_BED_PROBE), ENABLED(BABYSTEPPING)) + + PREHEAT_COUNT + + 1 + + 2 * ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) + + 1 + ); checkkey = ID_Menu; - if (SET_MENU_R(prepareMenu, selrect({133, 1, 28, 13}), MSG_PREPARE, 12 + PREHEAT_COUNT)) { + if (SET_MENU_R(prepareMenu, selrect({133, 1, 28, 13}), MSG_PREPARE, items)) { BACK_ITEM(gotoMainMenu); MENU_ITEM(ICON_FilMan, MSG_FILAMENT_MAN, onDrawSubMenu, drawFilamentManMenu); MENU_ITEM(ICON_Axis, MSG_MOVE_AXIS, onDrawMoveSubMenu, drawMoveMenu); @@ -3145,8 +3155,14 @@ void drawPrepareMenu() { #if ENABLED(LCD_BED_TRAMMING) void drawTrammingMenu() { + constexpr uint8_t items = (1 + + 2 * ALL(HAS_BED_PROBE, HAS_MESH) + + (DISABLED(HAS_BED_PROBE) && ENABLED(HAS_ZOFFSET_ITEM)) + + 4 + + ENABLED(BED_TRAMMING_INCLUDE_CENTER) + ); checkkey = ID_Menu; - if (SET_MENU(trammingMenu, MSG_BED_TRAMMING, 8)) { + if (SET_MENU(trammingMenu, MSG_BED_TRAMMING, items)) { BACK_ITEM(drawPrepareMenu); #if HAS_BED_PROBE && HAS_MESH MENU_ITEM(ICON_Tram, MSG_TRAMMING_WIZARD, onDrawMenuItem, trammingwizard); @@ -3168,8 +3184,13 @@ void drawPrepareMenu() { #endif // LCD_BED_TRAMMING void drawControlMenu() { + constexpr uint8_t items = (3 + + COUNT_ENABLED(CASE_LIGHT_MENU, LED_CONTROL_MENU) + + TERN0(EEPROM_SETTINGS, 3) + + 2 + ); checkkey = ID_Menu; - if (SET_MENU_R(controlMenu, selrect({103, 1, 28, 14}), MSG_CONTROL, 11)) { + if (SET_MENU_R(controlMenu, selrect({103, 1, 28, 14}), MSG_CONTROL, items)) { BACK_ITEM(gotoMainMenu); MENU_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawTempSubMenu, drawTemperatureMenu); MENU_ITEM(ICON_Motion, MSG_MOTION, onDrawMotionSubMenu, drawMotionMenu); @@ -3198,8 +3219,20 @@ void drawControlMenu() { } void drawAdvancedSettingsMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(EEPROM_SETTINGS, HAS_MESH, HAS_BED_PROBE, HAS_HOME_OFFSET, HAS_TRINAMIC_CONFIG, HAS_ESDIAG, \ + HAS_LOCKSCREEN, EDITABLE_DISPLAY_TIMEOUT, SOUND_MENU_ITEM, POWER_LOSS_RECOVERY, HAS_GCODE_PREVIEW, \ + PROUI_MEDIASORT, BAUD_RATE_GCODE, HAS_CUSTOM_COLORS) + + 1 + + (ENABLED(PIDTEMP) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU)) + + ANY(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) + + (ENABLED(PIDTEMPBED) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU)) + + TERN0(PRINTCOUNTER, 2) + + 1 + + TERN0(HAS_LCD_BRIGHTNESS, 2) + ); checkkey = ID_Menu; - if (SET_MENU(advancedSettingsMenu, MSG_ADVANCED_SETTINGS, 24)) { + if (SET_MENU(advancedSettingsMenu, MSG_ADVANCED_SETTINGS, items)) { BACK_ITEM(gotoMainMenu); #if ENABLED(EEPROM_SETTINGS) MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); @@ -3268,8 +3301,9 @@ void drawAdvancedSettingsMenu() { } void drawMoveMenu() { + constexpr uint8_t items = 2 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(moveMenu, selrect({192, 1, 42, 14}), MSG_MOVE_AXIS, 6)) { + if (SET_MENU_R(moveMenu, selrect({192, 1, 42, 14}), MSG_MOVE_AXIS, items)) { BACK_ITEM(drawPrepareMenu); EDIT_ITEM(ICON_Axis, MSG_LIVE_MOVE, onDrawChkbMenu, setLiveMove, &enableLiveMove); #if HAS_X_AXIS @@ -3293,8 +3327,9 @@ void drawMoveMenu() { #if HAS_HOME_OFFSET void drawHomeOffsetMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS); checkkey = ID_Menu; - if (SET_MENU(homeOffsetMenu, MSG_SET_HOME_OFFSETS, 4)) { + if (SET_MENU(homeOffsetMenu, MSG_SET_HOME_OFFSETS, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_HomeOffsetX, MSG_HOME_OFFSET_X, onDrawPFloatMenu, setHomeOffsetX, &home_offset.x); @@ -3314,8 +3349,12 @@ void drawMoveMenu() { #if HAS_BED_PROBE void drawProbeSetMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, Z_MIN_PROBE_REPEATABILITY_TEST) + + TERN0(BLTOUCH, 3 + ENABLED(HAS_BLTOUCH_HS_MODE)) + ); checkkey = ID_Menu; - if (SET_MENU(probeSettingsMenu, MSG_ZPROBE_SETTINGS, 9)) { + if (SET_MENU(probeSettingsMenu, MSG_ZPROBE_SETTINGS, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_ProbeOffsetX, MSG_ZPROBE_XOFFSET, onDrawPFloatMenu, setProbeOffsetX, &probe.offset.x); @@ -3344,8 +3383,12 @@ void drawMoveMenu() { #endif // HAS_BED_PROBE void drawFilSetMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(HAS_FILAMENT_SENSOR, HAS_FILAMENT_RUNOUT_DISTANCE, PREVENT_COLD_EXTRUSION, FWRETRACT) + + TERN0(CONFIGURE_FILAMENT_CHANGE, 2) + ); checkkey = ID_Menu; - if (SET_MENU(filSetMenu, MSG_FILAMENT_SET, 9)) { + if (SET_MENU(filSetMenu, MSG_FILAMENT_SET, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if HAS_FILAMENT_SENSOR EDIT_ITEM(ICON_Runout, MSG_RUNOUT_SENSOR, onDrawChkbMenu, setRunoutEnable, &runout.enabled); @@ -3384,8 +3427,12 @@ void drawFilSetMenu() { #if ENABLED(LED_CONTROL_MENU) void drawLedControlMenu() { + constexpr uint8_t items = (1 + + !ALL(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) + + ENABLED(HAS_COLOR_LEDS) * TERN(LED_COLOR_PRESETS, 8, 3 + ENABLED(HAS_WHITE_LED)), + ); checkkey = ID_Menu; - if (SET_MENU(ledControlMenu, MSG_LED_CONTROL, 10)) { + if (SET_MENU(ledControlMenu, MSG_LED_CONTROL, items)) { BACK_ITEM((currentMenu == tuneMenu) ? drawTuneMenu : drawControlMenu); #if !ALL(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) EDIT_ITEM(ICON_LedControl, MSG_LIGHTS, onDrawChkbMenu, setLedStatus, &leds.lights_on); @@ -3416,8 +3463,21 @@ void drawFilSetMenu() { #endif // LED_CONTROL_MENU void drawTuneMenu() { + constexpr uint8_t items = (2 + + COUNT_ENABLED(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) + + ALL(HAS_ZOFFSET_ITEM, BABYSTEPPING) + + 1 + + COUNT_ENABLED(ADVANCED_PAUSE_FEATURE, HAS_FILAMENT_SENSOR, PROUI_ITEM_PLR, FWRETRACT, PROUI_ITEM_JD, PROUI_ITEM_ADVK, HAS_LOCKSCREEN) + + TERN0(HAS_LCD_BRIGHTNESS, 2) + + ENABLED(EDITABLE_DISPLAY_TIMEOUT) + + 2 * ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) + + TERN(CASE_LIGHT_MENU, + 1 + COUNT_ENABLED(CASELIGHT_USES_BRIGHTNESS, LED_CONTROL_MENU), + ENABLED(LED_CONTROL_MENU) && DISABLED(CASE_LIGHT_USE_NEOPIXEL) + ) + ); checkkey = ID_Menu; - if (SET_MENU_R(tuneMenu, selrect({73, 2, 28, 12}), MSG_TUNE, 20)) { + if (SET_MENU_R(tuneMenu, selrect({73, 2, 28, 12}), MSG_TUNE, items)) { BACK_ITEM(gotoPrintProcess); EDIT_ITEM(ICON_Speed, MSG_SPEED, onDrawSpeedItem, setSpeed, &feedrate_percentage); #if HAS_HOTEND @@ -3518,8 +3578,9 @@ void drawTuneMenu() { #endif void drawInputShaping_menu() { + constexpr uint8_t items = 1 + 2 * COUNT_ENABLED(INPUT_SHAPING_X, INPUT_SHAPING_Y, INPUT_SHAPING_Z); checkkey = ID_Menu; - if (SET_MENU(inputShapingMenu, MSG_INPUT_SHAPING, 1 PLUS_TERN0(INPUT_SHAPING_X, 2) PLUS_TERN0(INPUT_SHAPING_Y, 2) PLUS_TERN0(INPUT_SHAPING_Z, 2))) { + if (SET_MENU(inputShapingMenu, MSG_INPUT_SHAPING, items)) { BACK_ITEM(drawMotionMenu); #if ENABLED(INPUT_SHAPING_X) MENU_ITEM(ICON_ShapingX, MSG_SHAPING_A_FREQ, onDrawShapingXFreq, setShapingXFreq); @@ -3553,8 +3614,22 @@ void drawTuneMenu() { #endif void drawTrinamicConfigMenu() { + constexpr uint8_t items = (1 + #if AXIS_IS_TMC(X) + + 1 + #endif + #if AXIS_IS_TMC(Y) + + 1 + #endif + #if AXIS_IS_TMC(Z) + + 1 + #endif + #if AXIS_IS_TMC(E0) + + 1 + #endif + ); checkkey = ID_Menu; - if (SET_MENU(trinamicConfigMenu, MSG_TMC_DRIVERS, 5)) { + if (SET_MENU(trinamicConfigMenu, MSG_TMC_DRIVERS, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if AXIS_IS_TMC(X) EDIT_ITEM(ICON_TMCXSet, MSG_TMC_ACURRENT, onDrawPIntMenu, setXTMCCurrent, &stepperX.val_mA); @@ -3574,8 +3649,12 @@ void drawTuneMenu() { #endif void drawMotionMenu() { + constexpr uint8_t items = (4 + + COUNT_ENABLED(EDITABLE_STEPS_PER_UNIT, EDITABLE_HOMING_FEEDRATE, LIN_ADVANCE, SHAPING_MENU, ADAPTIVE_STEP_SMOOTHING_TOGGLE) + + 2 + ); checkkey = ID_Menu; - if (SET_MENU_R(motionMenu, selrect({1, 16, 28, 13}), MSG_MOTION, 11)) { + if (SET_MENU_R(motionMenu, selrect({1, 16, 28, 13}), MSG_MOTION, items)) { BACK_ITEM(drawControlMenu); MENU_ITEM(ICON_MaxSpeed, MSG_SPEED, onDrawSpeed, drawMaxSpeedMenu); MENU_ITEM(ICON_MaxAccelerated, MSG_ACCELERATION, onDrawAcc, drawMaxAccelMenu); @@ -3620,8 +3699,13 @@ void drawMotionMenu() { #endif void drawFilamentManMenu() { + constexpr uint8_t items = (1 + + ENABLED(NOZZLE_PARK_FEATURE) + + TERN0(ADVANCED_PAUSE_FEATURE, 1 + ENABLED(HAS_PREHEAT)) + + TERN0(FILAMENT_LOAD_UNLOAD_GCODES, 2) + ); checkkey = ID_Menu; - if (SET_MENU(filamentMenu, MSG_FILAMENT_MAN, 6)) { + if (SET_MENU(filamentMenu, MSG_FILAMENT_MAN, items)) { BACK_ITEM(drawPrepareMenu); #if ENABLED(NOZZLE_PARK_FEATURE) MENU_ITEM(ICON_Park, MSG_FILAMENT_PARK_ENABLED, onDrawMenuItem, parkHead); @@ -3681,16 +3765,21 @@ void drawFilamentManMenu() { #define _preheatMenu(N) \ void drawPreheat## N ##Menu() { \ + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN, EEPROM_SETTINGS); \ hmiValue.select = (N) - 1; \ - drawPreheatMenu(SET_MENU(preheatMenu, MSG_PREHEAT_## N ##_SETTINGS, 5)); \ + drawPreheatMenu(SET_MENU(preheatMenu, MSG_PREHEAT_## N ##_SETTINGS, items)); \ } REPEAT_1(PREHEAT_COUNT, _preheatMenu) #endif // HAS_PREHEAT void drawTemperatureMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) + + PREHEAT_COUNT + ); checkkey = ID_Menu; - if (SET_MENU_R(temperatureMenu, selrect({236, 2, 28, 12}), MSG_TEMPERATURE, 4 + PREHEAT_COUNT)) { + if (SET_MENU_R(temperatureMenu, selrect({236, 2, 28, 12}), MSG_TEMPERATURE, items)) { BACK_ITEM(drawControlMenu); #if HAS_HOTEND hotendTargetItem = EDIT_ITEM(ICON_HotendTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawHotendTemp, setHotendTemp, &thermalManager.temp_hotend[0].target); @@ -3710,8 +3799,9 @@ void drawTemperatureMenu() { } void drawMaxSpeedMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(maxSpeedMenu, selrect({1, 16, 28, 13}), MSG_MAX_SPEED, 5)) { + if (SET_MENU_R(maxSpeedMenu, selrect({1, 16, 28, 13}), MSG_MAX_SPEED, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_MaxSpeedX, MSG_VMAX_A, onDrawMaxSpeedX, setMaxSpeedX, &planner.settings.max_feedrate_mm_s[X_AXIS]); @@ -3730,8 +3820,9 @@ void drawMaxSpeedMenu() { } void drawMaxAccelMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(maxAccelMenu, selrect({1, 16, 28, 13}), MSG_AMAX_EN, 5)) { + if (SET_MENU_R(maxAccelMenu, selrect({1, 16, 28, 13}), MSG_AMAX_EN, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_MaxAccX, MSG_AMAX_A, onDrawMaxAccelX, setMaxAccelX, &planner.settings.max_acceleration_mm_per_s2[X_AXIS]); @@ -3752,8 +3843,9 @@ void drawMaxAccelMenu() { #if ENABLED(CLASSIC_JERK) void drawMaxJerkMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(maxJerkMenu, selrect({1, 16, 28, 13}), MSG_JERK, 5)) { + if (SET_MENU_R(maxJerkMenu, selrect({1, 16, 28, 13}), MSG_JERK, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_MaxSpeedJerkX, MSG_VA_JERK, onDrawMaxJerkX, setMaxJerkX, &planner.max_jerk.x); @@ -3776,8 +3868,9 @@ void drawMaxAccelMenu() { #if ENABLED(EDITABLE_STEPS_PER_UNIT) void drawStepsMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(stepsMenu, selrect({1, 16, 28, 13}), MSG_STEPS_PER_MM, 5)) { + if (SET_MENU_R(stepsMenu, selrect({1, 16, 28, 13}), MSG_STEPS_PER_MM, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_StepX, MSG_A_STEPS, onDrawStepsX, setStepsX, &planner.settings.axis_steps_per_mm[X_AXIS]); @@ -3800,8 +3893,9 @@ void drawMaxAccelMenu() { #if ENABLED(EDITABLE_HOMING_FEEDRATE) void drawHomingFRMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS); checkkey = ID_Menu; - if (SET_MENU(homingFRMenu, MSG_HOMING_FEEDRATE, 4)) { + if (SET_MENU(homingFRMenu, MSG_HOMING_FEEDRATE, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS uint16_t xhome = static_cast(homing_feedrate_mm_m.x); @@ -3921,8 +4015,12 @@ void drawMaxAccelMenu() { #endif void drawHotendMPCMenu() { + constexpr uint8_t items = (1 + + ENABLED(MPC_AUTOTUNE_MENU) + + TERN0(MPC_EDIT_MENU, 4 + ENABLED(MPC_INCLUDE_FAN)) + ); checkkey = ID_Menu; - if (SET_MENU_F(hotendMPCMenu, "MPC Settings", 7)) { + if (SET_MENU_F(hotendMPCMenu, "MPC Settings", items)) { MPC_t &mpc = thermalManager.temp_hotend[0].mpc; BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(MPC_AUTOTUNE_MENU) @@ -3991,8 +4089,13 @@ void drawMaxAccelMenu() { #endif void drawHotendPIDMenu() { + constexpr uint8_t items = (1 + + TERN0(PID_AUTOTUNE_MENU, 3) + + TERN0(PID_EDIT_MENU, 3) + + ENABLED(EEPROM_SETTINGS) + ); checkkey = ID_Menu; - if (SET_MENU_F(hotendPIDMenu, STR_HOTEND_PID " Settings", 8)) { + if (SET_MENU_F(hotendPIDMenu, STR_HOTEND_PID " Settings", items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PID_AUTOTUNE_MENU) MENU_ITEM_F(ICON_PIDNozzle, STR_HOTEND_PID, onDrawMenuItem, hotendPID); @@ -4021,8 +4124,13 @@ void drawMaxAccelMenu() { #endif void drawBedPIDMenu() { + constexpr uint8_t items = (1 + + TERN0(PID_AUTOTUNE_MENU, 3) + + TERN0(PID_EDIT_MENU, 3) + + ENABLED(EEPROM_SETTINGS) + ); checkkey = ID_Menu; - if (SET_MENU_F(bedPIDMenu, STR_BED_PID " Settings", 8)) { + if (SET_MENU_F(bedPIDMenu, STR_BED_PID " Settings", items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PID_AUTOTUNE_MENU) MENU_ITEM_F(ICON_PIDBed, STR_BED_PID, onDrawMenuItem,bedPID); @@ -4051,8 +4159,13 @@ void drawMaxAccelMenu() { #endif void drawChamberPIDMenu() { + constexpr uint8_t items = (1 + + TERN0(PID_AUTOTUNE_MENU, 3) + + TERN0(PID_EDIT_MENU, 3) + + ENABLED(EEPROM_SETTINGS) + ); checkkey = ID_Menu; - if (SET_MENU_F(chamberPIDMenu, STR_CHAMBER_PID " Settings", 8)) { + if (SET_MENU_F(chamberPIDMenu, STR_CHAMBER_PID " Settings", items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PID_AUTOTUNE_MENU) MENU_ITEM_F(ICON_PIDChamber, STR_CHAMBER_PID, onDrawMenuItem,chamberPID); @@ -4096,8 +4209,9 @@ void drawMaxAccelMenu() { #if ENABLED(INDIVIDUAL_AXIS_HOMING_SUBMENU) void drawHomingMenu() { + constexpr uint8_t items = 2 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, Z_STEPPER_AUTO_ALIGN, MESH_BED_LEVELING); checkkey = ID_Menu; - if (SET_MENU(homingMenu, MSG_HOMING, 6)) { + if (SET_MENU(homingMenu, MSG_HOMING, items)) { BACK_ITEM(drawPrepareMenu); MENU_ITEM(ICON_Homing, MSG_AUTO_HOME, onDrawMenuItem, autoHome); #if HAS_X_AXIS @@ -4212,8 +4326,16 @@ void drawMaxAccelMenu() { #if HAS_MESH void drawMeshSetMenu() { + constexpr uint8_t items = (1 + + ENABLED(PREHEAT_BEFORE_LEVELING) + + 2 + + ENABLED(HAS_BED_PROBE) + + TERN0(AUTO_BED_LEVELING_UBL, 6) + + TERN0(PROUI_MESH_EDIT, 2) + + 1 + ); checkkey = ID_Menu; - if (SET_MENU(meshMenu, MSG_MESH_LEVELING, 14)) { + if (SET_MENU(meshMenu, MSG_MESH_LEVELING, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PREHEAT_BEFORE_LEVELING) EDIT_ITEM(ICON_Temperature, MSG_UBL_SET_TEMP_BED, onDrawPIntMenu, setBedLevT, &hmiData.bedLevT); From 4895388909096c1df822af3ea01d1bc39568642d Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 20 Mar 2025 00:28:49 +0000 Subject: [PATCH 013/101] [cron] Bump distribution date (2025-03-20) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index d2f7ac3ffd..1d434d8ba3 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-19" +//#define STRING_DISTRIBUTION_DATE "2025-03-20" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index fbdc9cdd04..6bf03f900f 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-19" + #define STRING_DISTRIBUTION_DATE "2025-03-20" #endif /** From d9f2c6444fb04bc78a146a1cd795d66a64d65a84 Mon Sep 17 00:00:00 2001 From: Andrew <18502096+classicrocker883@users.noreply.github.com> Date: Wed, 19 Mar 2025 21:01:47 -0400 Subject: [PATCH 014/101] =?UTF-8?q?=F0=9F=9A=B8=20ProUI=20"View=20Mesh=20(?= =?UTF-8?q?grid)"=20item=20(#26181)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp | 1 + Marlin/src/lcd/e3v2/proui/bedlevel_tools.h | 6 ++-- Marlin/src/lcd/e3v2/proui/dwin.cpp | 19 ++++++++++-- Marlin/src/lcd/e3v2/proui/dwin_defines.h | 4 +++ Marlin/src/lcd/e3v2/proui/meshviewer.cpp | 31 ++++++++++++-------- Marlin/src/lcd/language/language_en.h | 1 + 6 files changed, 44 insertions(+), 18 deletions(-) diff --git a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp index e4b6fb72a0..b85caaf6cc 100644 --- a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp +++ b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp @@ -63,6 +63,7 @@ BedLevelTools bedLevelTools; #if ENABLED(USE_GRID_MESHVIEWER) + bool BedLevelTools::grid_meshview = false; bool BedLevelTools::viewer_print_value = false; #endif bool BedLevelTools::goto_mesh_value = false; diff --git a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h index a0da0ceeb3..5716316ee4 100644 --- a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h +++ b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h @@ -46,8 +46,8 @@ class BedLevelTools { public: - #if ENABLED(USE_GRID_MESHVIEWER) - static bool viewer_asymmetric_range; + #if USE_GRID_MESHVIEWER + static bool grid_meshview; static bool viewer_print_value; #endif static bool goto_mesh_value; @@ -69,7 +69,7 @@ public: static float getMaxValue(); static float getMinValue(); static bool meshValidate(); - #if ENABLED(USE_GRID_MESHVIEWER) + #if USE_GRID_MESHVIEWER static void drawBedMesh(int16_t selected=-1, uint8_t gridline_width=1, uint16_t padding_x=8, uint16_t padding_y_top=(40 + 53 - 7)); static void setMeshViewerStatus(); #endif diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index 03f25b5010..a775d2ae27 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -2000,7 +2000,7 @@ void dwinRedrawScreen() { #endif // ADVANCED_PAUSE_FEATURE #if HAS_MESH - void dwinMeshViewer() { + void _dwinMeshViewer() { if (!leveling_is_valid()) dwinPopupContinue(ICON_Leveling_1, GET_TEXT_F(MSG_MESH_VIEWER), GET_TEXT_F(MSG_NO_VALID_MESH)); else { @@ -2008,6 +2008,13 @@ void dwinRedrawScreen() { meshViewer.draw(); } } + void dwinMeshViewer() { + TERN_(USE_GRID_MESHVIEWER, bedLevelTools.grid_meshview = false); + _dwinMeshViewer(); + } + #if ENABLED(USE_GRID_MESHVIEWER) + void dwinMeshViewerGrid() { bedLevelTools.grid_meshview = true; _dwinMeshViewer(); } + #endif #endif #if HAS_LOCKSCREEN @@ -3727,13 +3734,17 @@ void drawFilamentManMenu() { #if ENABLED(MESH_BED_LEVELING) void drawManualMeshMenu() { + constexpr uint8_t items = 6 + ENABLED(USE_GRID_MESHVIEWER); checkkey = ID_Menu; - if (SET_MENU(manualMeshMenu, MSG_UBL_MANUAL_MESH, 6)) { + if (SET_MENU(manualMeshMenu, MSG_UBL_MANUAL_MESH, items)) { BACK_ITEM(drawPrepareMenu); MENU_ITEM(ICON_ManualMesh, MSG_LEVEL_BED, onDrawMenuItem, manualMeshStart); mMeshMoveZItem = EDIT_ITEM(ICON_Zoffset, MSG_MOVE_Z, onDrawMMeshMoveZ, setMMeshMoveZ, ¤t_position.z); MENU_ITEM(ICON_Axis, MSG_UBL_CONTINUE_MESH, onDrawMenuItem, manualMeshContinue); MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW, onDrawSubMenu, dwinMeshViewer); + #if USE_GRID_MESHVIEWER + MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW_GRID, onDrawSubMenu, dwinMeshViewerGrid); + #endif MENU_ITEM(ICON_MeshSave, MSG_UBL_SAVE_MESH, onDrawMenuItem, manualMeshSave); } updateMenu(manualMeshMenu); @@ -4333,6 +4344,7 @@ void drawMaxAccelMenu() { + TERN0(AUTO_BED_LEVELING_UBL, 6) + TERN0(PROUI_MESH_EDIT, 2) + 1 + + ENABLED(USE_GRID_MESHVIEWER) ); checkkey = ID_Menu; if (SET_MENU(meshMenu, MSG_MESH_LEVELING, items)) { @@ -4358,6 +4370,9 @@ void drawMaxAccelMenu() { MENU_ITEM(ICON_MeshEdit, MSG_EDIT_MESH, onDrawSubMenu, drawEditMeshMenu); #endif MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW, onDrawSubMenu, dwinMeshViewer); + #if USE_GRID_MESHVIEWER + MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW_GRID, onDrawSubMenu, dwinMeshViewerGrid); + #endif } updateMenu(meshMenu); } diff --git a/Marlin/src/lcd/e3v2/proui/dwin_defines.h b/Marlin/src/lcd/e3v2/proui/dwin_defines.h index b72bdf1d23..832702db8f 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_defines.h +++ b/Marlin/src/lcd/e3v2/proui/dwin_defines.h @@ -35,6 +35,10 @@ //#define DACAI_DISPLAY // Enable for DACAI display //#define TITLE_CENTERED // Center Menu Title Text +#if HAS_MESH + #define USE_GRID_MESHVIEWER 1 +#endif + #if HAS_MESH #define PROUI_MESH_EDIT // Add a menu to edit mesh points #if ENABLED(PROUI_MESH_EDIT) diff --git a/Marlin/src/lcd/e3v2/proui/meshviewer.cpp b/Marlin/src/lcd/e3v2/proui/meshviewer.cpp index 38d0af4f82..e167af5665 100644 --- a/Marlin/src/lcd/e3v2/proui/meshviewer.cpp +++ b/Marlin/src/lcd/e3v2/proui/meshviewer.cpp @@ -39,7 +39,7 @@ #include "../../../feature/bedlevel/bedlevel.h" #include "meshviewer.h" -#if ENABLED(USE_GRID_MESHVIEWER) +#if USE_GRID_MESHVIEWER #include "bedlevel_tools.h" #endif @@ -112,14 +112,20 @@ void MeshViewer::drawMesh(const bed_mesh_t zval, const uint8_t csizex, const uin void MeshViewer::draw(const bool withsave/*=false*/, const bool redraw/*=true*/) { title.showCaption(GET_TEXT_F(MSG_MESH_VIEWER)); - #if ENABLED(USE_GRID_MESHVIEWER) - DWINUI::clearMainArea(); - bedLevelTools.viewer_print_value = true; - bedLevelTools.drawBedMesh(-1, 1, 8, 10 + TITLE_HEIGHT); - #else + + const bool see_mesh = TERN0(USE_GRID_MESHVIEWER, bedLevelTools.grid_meshview); + if (see_mesh) { + #if USE_GRID_MESHVIEWER + DWINUI::clearMainArea(); + bedLevelTools.viewer_print_value = true; + bedLevelTools.drawBedMesh(-1, 1, 8, 10 + TITLE_HEIGHT); + #endif + } + else { if (redraw) drawMesh(bedlevel.z_values, GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y); else DWINUI::drawBox(1, hmiData.colorBackground, { 89, 305, 99, 38 }); - #endif + } + if (withsave) { DWINUI::drawButton(BTN_Save, 26, 305); DWINUI::drawButton(BTN_Continue, 146, 305); @@ -128,12 +134,11 @@ void MeshViewer::draw(const bool withsave/*=false*/, const bool redraw/*=true*/) else DWINUI::drawButton(BTN_Continue, 86, 305); - #if ENABLED(USE_GRID_MESHVIEWER) - bedLevelTools.setMeshViewerStatus(); - #else - char str_1[6], str_2[6] = ""; - ui.status_printf(0, F("Mesh minZ: %s, maxZ: %s"), dtostrf(min, 1, 2, str_1), dtostrf(max, 1, 2, str_2)); - #endif + if (see_mesh) { + TERN_(USE_GRID_MESHVIEWER, bedLevelTools.setMeshViewerStatus()); + } + else // TODO: in marlinui.h set_status_and_level was defined to (..., const int8_t level=0); remove ", 0" when pulling other PR + ui.set_status_and_level(MString<30>(F("Mesh Z min: "), p_float_t(min, 2), F(", max: "), p_float_t(max, 2)), 0); } void drawMeshViewer() { meshViewer.draw(true, meshredraw); } diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 6076c6fb30..5762fa150e 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -198,6 +198,7 @@ namespace LanguageNarrow_en { LSTR MSG_MESH_VIEWER = _UxGT("Mesh Viewer"); LSTR MSG_EDIT_MESH = _UxGT("Edit Mesh"); LSTR MSG_MESH_VIEW = _UxGT("View Mesh"); + LSTR MSG_MESH_VIEW_GRID = _UxGT("View Mesh (grid)"); LSTR MSG_EDITING_STOPPED = _UxGT("Mesh Editing Stopped"); LSTR MSG_NO_VALID_MESH = _UxGT("No valid mesh"); LSTR MSG_ACTIVATE_MESH = _UxGT("Activate Leveling"); From 5d755676a9deee640593c85d735719cc332a124d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Mar 2025 20:40:54 -0500 Subject: [PATCH 015/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Sil?= =?UTF-8?q?ence=20findMissingTranslations=20grep=20output?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildroot/share/scripts/findMissingTranslations.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildroot/share/scripts/findMissingTranslations.sh b/buildroot/share/scripts/findMissingTranslations.sh index 366075d5b9..115c2b67df 100755 --- a/buildroot/share/scripts/findMissingTranslations.sh +++ b/buildroot/share/scripts/findMissingTranslations.sh @@ -71,11 +71,11 @@ for WORD in $(awk '/LSTR/{print $2}' language_en.h); do # Find all selected languages that lack the string LANG_MISSING=" " for LANG in $TEST_LANGS; do - if [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${LANG}.h) -eq 0 ]]; then + if [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${LANG}.h 2>/dev/null) -eq 0 ]]; then INHERIT=$(awk '/using namespace/{print $3}' language_${LANG}.h | sed -E 's/Language_([a-zA-Z_]+)\s*;/\1/') if [[ -z $INHERIT || $INHERIT == "en" ]]; then LANG_MISSING+="$LANG " - elif [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${INHERIT}.h) -eq 0 ]]; then + elif [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${INHERIT}.h 2>/dev/null) -eq 0 ]]; then LANG_MISSING+="$LANG " fi fi From 57fe45a2a6f4f27019d771359896712cc04c44e2 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 21 Mar 2025 00:29:17 +0000 Subject: [PATCH 016/101] [cron] Bump distribution date (2025-03-21) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 1d434d8ba3..a1aa9e6164 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-20" +//#define STRING_DISTRIBUTION_DATE "2025-03-21" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 6bf03f900f..ce3bc61e5c 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-20" + #define STRING_DISTRIBUTION_DATE "2025-03-21" #endif /** From 9a8b1eab93a67c536821844de4a0b70f31479d0b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 20 Mar 2025 20:28:30 -0500 Subject: [PATCH 017/101] =?UTF-8?q?=F0=9F=A9=B9=20Cleanup=20(for=20STM32?= =?UTF-8?q?=20I2C=20LCD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In advance of #26433 --- .../AVR/{ => u8g}/u8g_com_HAL_AVR_sw_spi.cpp | 6 +- .../u8g_com_stm32duino_swspi.cpp | 0 Marlin/src/inc/Conditionals-2-LCD.h | 2 +- Marlin/src/lcd/dogm/lcdprint_u8g.cpp | 22 +++ Marlin/src/lcd/dogm/marlinui_DOGM.h | 8 +- .../u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp | 163 +++++++++--------- .../u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp | 2 +- .../lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp | 2 +- .../dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp | 94 +++++----- .../dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp | 56 +++--- .../dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp | 98 +++++------ .../u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp | 4 +- Marlin/src/lcd/dogm/u8g_fontutf8.cpp | 22 +++ Marlin/src/lcd/dogm/u8g_fontutf8.h | 22 +++ .../pins/esp32/pins_GODI_CONTROLLER_V1_0.h | 1 - Marlin/src/pins/ramps/pins_DAGOMA_D6.h | 12 +- Marlin/src/pins/ramps/pins_ZRIB_V53.h | 4 - Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 2 - Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 8 +- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 2 +- Marlin/src/pins/stm32f1/pins_MD_D301.h | 22 +-- Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h | 2 - Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h | 5 - Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h | 3 - .../pins/stm32f4/pins_FYSETC_CHEETAH_V30.h | 2 +- Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h | 12 +- .../src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h | 12 +- .../src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h | 14 +- .../pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h | 12 +- .../pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h | 12 +- Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h | 12 +- 31 files changed, 326 insertions(+), 312 deletions(-) rename Marlin/src/HAL/AVR/{ => u8g}/u8g_com_HAL_AVR_sw_spi.cpp (98%) rename Marlin/src/HAL/STM32F1/{dogm => u8g}/u8g_com_stm32duino_swspi.cpp (100%) diff --git a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp b/Marlin/src/HAL/AVR/u8g/u8g_com_HAL_AVR_sw_spi.cpp similarity index 98% rename from Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp rename to Marlin/src/HAL/AVR/u8g/u8g_com_HAL_AVR_sw_spi.cpp index 9617c9544d..f4fa1eb428 100644 --- a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp +++ b/Marlin/src/HAL/AVR/u8g/u8g_com_HAL_AVR_sw_spi.cpp @@ -55,12 +55,12 @@ #if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM) -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if HAS_MARLINUI_U8GLIB -#include "../shared/Marduino.h" -#include "../shared/Delay.h" +#include "../../shared/Marduino.h" +#include "../../shared/Delay.h" #include diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/u8g/u8g_com_stm32duino_swspi.cpp similarity index 100% rename from Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp rename to Marlin/src/HAL/STM32F1/u8g/u8g_com_stm32duino_swspi.cpp diff --git a/Marlin/src/inc/Conditionals-2-LCD.h b/Marlin/src/inc/Conditionals-2-LCD.h index 8c818864a0..2462231593 100644 --- a/Marlin/src/inc/Conditionals-2-LCD.h +++ b/Marlin/src/inc/Conditionals-2-LCD.h @@ -201,7 +201,7 @@ #define DOGLCD #define IS_U8GLIB_ST7920 1 #define IS_ULTIPANEL 1 - #define ENCODER_PULSES_PER_STEP 2 + #define STD_ENCODER_PULSES_PER_STEP 2 #elif ENABLED(MKS_12864OLED) diff --git a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp index 30d687ddef..e9132c94b9 100644 --- a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp +++ b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2018 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + /** * @file lcdprint_u8g.cpp * @brief LCD print api for u8glib diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index ac65eab7de..c0cc7c4438 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -38,19 +38,19 @@ #if HAS_MEDIA #ifdef __SAMD21__ - #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL + #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.) #else // Hardware SPI on DUE - #define U8G_CLASS U8GLIB_ST7920_128X64_4X + #define U8G_CLASS U8GLIB_ST7920_128X64_4X // 2 stripes, SW SPI (Original u8glib device) #endif #define U8G_PARAM LCD_PINS_RS #elif (LCD_PINS_D4 == SD_SCK_PIN) && (LCD_PINS_EN == SD_MOSI_PIN) // Hardware SPI shared with SD Card - #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL + #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.) #define U8G_PARAM LCD_PINS_RS #else // Software SPI - #define U8G_CLASS U8GLIB_ST7920_128X64_4X + #define U8G_CLASS U8GLIB_ST7920_128X64_4X // 2 stripes, SW SPI (Original u8glib device) #define U8G_PARAM LCD_PINS_D4, LCD_PINS_EN, LCD_PINS_RS #endif diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp index 4d4756c298..f44b4f8ac5 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp @@ -75,58 +75,58 @@ #define HEIGHT 64 #define PAGE_HEIGHT 8 +#define CMD_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xF) +#define CMD_PAGE_ADR(N) (0x20), (N) +#define CMD_COLUMN_RANGE(N,O) (0x21), (N), (O) +#define CMD_PAGE_RANGE(N,O) (0x22), (N), (O) +#define CMD_SCROLL(N) ((N) ? 0x2F : 0x2E) +#define CMD_START_LINE(N) (0x40 | (N)) +#define CMD_CONTRAST(N) (0x81), (N) +#define CMD_CHARGE_PUMP(N) (0x8D), ((N) ? 0x14 : 0x10) +#define CMD_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) +#define CMD_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) +#define CMD_INVERTED(N) ((N) ? 0xA7 : 0xA6) +#define CMD_MUX_RATIO(N) (0xA8), (N) +#define CMD_ON(N) ((N) ? 0xAF : 0xAE) +#define CMD_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) +#define CMD_DISP_OFFS(N) (0xD3), (N) +#define CMD_OSC_FREQ(R,F) (0xD5), ((F) << 4 | (R)) +#define CMD_CHARGE_PER(P,D) (0xD9), ((D) << 4 | (P)) +#define CMD_COM_CONFIG(N) (0xDA), ((N) ? 0x12 : 0x02) +#define CMD_VCOM_DESEL(N) (0xDB), (N) +#define CMD_NOOP() (0xE3) + uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq); -// SH1106 (132x64) is compatible with SSD1306 (128x64) by adding a small margin to the larger display - -#define SH1106_PAGE_ADR(N) (0x20), (N) -#define SH1106_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xFF) -#define SH1106_COLUMN_RANGE(N,O) (0x21), (N), (O) -#define SH1106_PAGE_RANGE(N,O) (0x22), (N), (O) -#define SH1106_SCROLL(N) ((N) ? 0x2F : 0x2E) -#define SH1106_START_LINE(N) (0x40 | (N)) -#define SH1106_CONTRAST(N) (0x81), (N) -#define SH1106_CHARGE_PUMP(N) (0x8D), ((N) ? 0x14 : 0x10) -#define SH1106_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) -#define SH1106_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) -#define SH1106_INVERTED(N) ((N) ? 0xA7 : 0xA6) -#define SH1106_MUX_RATIO(N) (0xA8), (N) -#define SH1106_ON(N) ((N) ? 0xAF : 0xAE) -#define SH1106_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) -#define SH1106_DISP_OFFS(N) (0xD3), (N) -#define SH1106_OSC_FREQ(R,F) (0xD5), ((F) << 4 | (R)) -#define SH1106_CHARGE_PER(P,D) (0xD9), ((D) << 4 | (P)) -#define SH1106_COM_CONFIG(N) (0xDA), ((N) ? 0x12 : 0x02) -#define SH1106_VCOM_DESEL(N) (0xDB), (N) -#define SH1106_NOOP() (0xE3) +// SH1106 is compatible with SSD1306, but is 132x64. Display 128x64 centered within the 132x64. static const uint8_t u8g_dev_sh1106_128x64_data_start_2_wire[] PROGMEM = { - SH1106_COL_ADR(2), // Column 2 to center 128 pixels in 132 pixels - U8G_ESC_END // End of sequence + CMD_COL_ADR(2), // Column 2 to center 128 pixels in 132 pixels + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_sh1106_128x64_init_seq_2_wire[] PROGMEM = { - U8G_ESC_ADR(0), // Initiate command mode - SH1106_ON(0), // Display off, sleep mode - SH1106_MUX_RATIO(0x3F), // Mux ratio - SH1106_DISP_OFFS(0), // Display offset - SH1106_START_LINE(0), // Start line - SH1106_ADC_REVERSE(1), // Segment remap A0/A1 - SH1106_OUT_MODE(1), // 0: scan dir normal, 1: reverse - SH1106_COM_CONFIG(1), // COM pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) - SH1106_CONTRAST(0xCF), // Set contrast control - SH1106_PAGE_ADR(0x02), // page addressing mode - SH1106_COLUMN_RANGE(2, 129), // Set column range 2 .. 129 - SH1106_PAGE_RANGE(0, 7), // Set page range 0 .. 7 - SH1106_CHARGE_PER(0x1, 0xF), // Pre-charge period - SH1106_VCOM_DESEL(0x40), // Vcomh deselect level - SH1106_ALL_PIX(0), // Output RAM to display - SH1106_INVERTED(0), // Normal display mode - SH1106_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) - SH1106_CHARGE_PUMP(1), // Charge pump setting - SH1106_SCROLL(0), // Deactivate scroll - SH1106_ON(1), // Display on - U8G_ESC_END // End of sequence + U8G_ESC_ADR(0), // Initiate command mode + CMD_ON(0), // Display off, sleep mode + CMD_MUX_RATIO(0x3F), // Mux ratio + CMD_DISP_OFFS(0), // Display offset + CMD_START_LINE(0), // Start line + CMD_ADC_REVERSE(1), // Segment remap A0/A1 + CMD_OUT_MODE(1), // 0: scan dir normal, 1: reverse + CMD_COM_CONFIG(1), // COM pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) + CMD_CONTRAST(0xCF), // Set contrast control + CMD_PAGE_ADR(0x02), // page addressing mode + CMD_COLUMN_RANGE(2, 129), // Set column range 2 .. 129 + CMD_PAGE_RANGE(0, 7), // Set page range 0 .. 7 + CMD_CHARGE_PER(0x1, 0xF), // Pre-charge period + CMD_VCOM_DESEL(0x40), // Vcomh deselect level + CMD_ALL_PIX(0), // Output RAM to display + CMD_INVERTED(0), // Normal display mode + CMD_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) + CMD_CHARGE_PUMP(1), // Charge pump setting + CMD_SCROLL(0), // Deactivate scroll + CMD_ON(1), // Display ON + U8G_ESC_END // End of sequence }; uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { @@ -142,7 +142,7 @@ uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_data_start_2_wire); u8g_WriteByte(u8g, dev, 0xB0 | (pb->p.page*2)); // Select current page u8g_SetAddress(u8g, dev, 1); // Data mode - u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *) pb->buf); + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_data_start_2_wire); @@ -157,39 +157,39 @@ uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); } -uint8_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf[WIDTH*2] U8G_NOCOMMON ; -u8g_pb_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf}; +uint8_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf[WIDTH * 2] U8G_NOCOMMON; +u8g_pb_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb = { { 16, HEIGHT, 0, 0, 0 }, WIDTH, u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf }; u8g_dev_t u8g_dev_sh1106_128x64_2x_i2c_2_wire = { u8g_dev_sh1106_128x64_2x_2_wire_fn, &u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb, U8G_COM_SSD_I2C_HAL }; ///////////////////////////////////////////////////////////////////////////////////////////// static const uint8_t u8g_dev_ssd1306_128x64_data_start_2_wire[] PROGMEM = { - SH1106_COL_ADR(0), // Column 0 - U8G_ESC_END // End of sequence + CMD_COL_ADR(0), // Column 0 + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_ssd1306_128x64_init_seq_2_wire[] PROGMEM = { - U8G_ESC_CS(0), // Disable chip - SH1106_ON(0), // Display off, sleep mode - SH1106_MUX_RATIO(0x3F), // Mux ratio - SH1106_DISP_OFFS(0), // Display offset - SH1106_START_LINE(0), // Start line - SH1106_ADC_REVERSE(1), // Segment remap A0/A1 - SH1106_OUT_MODE(1), // 0: scan dir normal, 1: reverse - SH1106_COM_CONFIG(1), // COM pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) - SH1106_CONTRAST(0xCF), // Set contrast control - SH1106_PAGE_ADR(0x02), // page addressing mode - SH1106_COLUMN_RANGE(0, 127), // Set column range 0 .. 127 - SH1106_PAGE_RANGE(0, 7), // Set page range from 0 .. 7 - SH1106_CHARGE_PER(0x1, 0xF), // Pre-charge period - SH1106_VCOM_DESEL(0x40), // Vcomh deselect level - SH1106_ALL_PIX(0), // Send RAM to display - SH1106_INVERTED(0), // Normal display mode - SH1106_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) - SH1106_CHARGE_PUMP(1), // Charge pump setting - SH1106_SCROLL(0), // Deactivate scroll - SH1106_ON(1), // Display on - U8G_ESC_END // End of sequence + U8G_ESC_CS(0), // Disable chip + CMD_ON(0), // Display OFF, sleep mode + CMD_MUX_RATIO(0x3F), // Mux ratio + CMD_DISP_OFFS(0), // Display offset + CMD_START_LINE(0), // Start line + CMD_ADC_REVERSE(1), // Segment remap A0/A1 + CMD_OUT_MODE(1), // 0: scan dir normal, 1: reverse + CMD_COM_CONFIG(1), // COM pin HW config, sequential COM pin config (bit 4), disable left/right remap (bit 5) + CMD_CONTRAST(0xCF), // Set contrast control + CMD_PAGE_ADR(2), // Page addressing mode + CMD_COLUMN_RANGE(0, 127), // Set column range 0 .. 127 + CMD_PAGE_RANGE(0, 7), // Set page range from 0 .. 7 + CMD_CHARGE_PER(0x1, 0xF), // Pre-charge period + CMD_VCOM_DESEL(0x40), // Vcomh deselect level + CMD_ALL_PIX(0), // Send RAM to display + CMD_INVERTED(0), // Normal display mode + CMD_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) + CMD_CHARGE_PUMP(1), // Charge pump setting + CMD_SCROLL(0), // Deactivate scroll + CMD_ON(1), // Display ON + U8G_ESC_END // End of sequence }; uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { @@ -205,7 +205,7 @@ uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_data_start_2_wire); u8g_WriteByte(u8g, dev, 0xB0 | (pb->p.page*2)); // Select current page u8g_SetAddress(u8g, dev, 1); // Data mode - u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *) pb->buf); + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_data_start_2_wire); @@ -220,8 +220,8 @@ uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); } -uint8_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf[WIDTH*2] U8G_NOCOMMON ; -u8g_pb_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf}; +uint8_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf[WIDTH * 2] U8G_NOCOMMON; +u8g_pb_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf }; u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire = { u8g_dev_ssd1306_128x64_2x_2_wire_fn, &u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb, U8G_COM_SSD_I2C_HAL }; ///////////////////////////////////////////////////////////////////////////////////////////// @@ -236,7 +236,7 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s for (;;) { uint8_t value = u8g_pgm_read(esc_seq); if (is_escape == 0) { - if (value != 255) { + if (value != 0xFF) { if (u8g_WriteByte(u8g, dev, value) == 0) return 0; if (u8g_WriteByte(u8g, dev, I2C_CMD_MODE) == 0) return 0; } @@ -245,17 +245,17 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s } } else { - if (value == 255) { + if (value == 0xFF) { if (u8g_WriteByte(u8g, dev, value) == 0) return 0; if (u8g_WriteByte(u8g, dev, I2C_CMD_MODE) == 0) return 0; } - else if (value == 254) { + else if (value == 0xFE) { break; } else if (value >= 0xF0) { - // not yet used, do nothing + // Not yet used, do nothing } - else if (value >= 0xE0 ) { + else if (value >= 0xE0) { u8g_SetAddress(u8g, dev, value & 0x0F); } else if (value >= 0xD0) { @@ -270,11 +270,10 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s u8g_SetResetHigh(u8g, dev); u8g_Delay(value); } - else if (value >= 0xBE) { - // not yet implemented + else if (value >= 0xBE) { // Not yet implemented //u8g_SetVCC(u8g, dev, value & 0x01); } - else if (value <= 127) { + else if (value <= 0x7F) { u8g_Delay(value); } is_escape = 0; diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp index afb3c28a8c..fae4b78aec 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp @@ -64,7 +64,7 @@ #define PAGE_HEIGHT 8 #define SH1106_PAGE_ADR(N) (0x20), (N) -#define SH1106_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xFF) +#define SH1106_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xF) #define SH1106_COLUMN_RANGE(N,O) (0x21), (N), (O) #define SH1106_PAGE_RANGE(N,O) (0x22), (N), (O) #define SH1106_SCROLL(N) ((N) ? 0x2F : 0x2E) diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp index 010231d056..db9437d034 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp @@ -32,7 +32,7 @@ #define PAGE_HEIGHT 8 #define SSD1309_PAGE_ADR(N) (0x20), (N) -#define SSD1309_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xFF) +#define SSD1309_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xF) #define SSD1309_COLUMN_RANGE(N,O) (0x21), (N), (O) #define SSD1309_PAGE_RANGE(N,O) (0x22), (N), (O) #define SSD1309_SCROLL(N) ((N) ? 0x2F : 0x2E) diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp index 61a1e214bd..5f69680d01 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp @@ -85,72 +85,72 @@ /* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ static const uint8_t u8g_dev_st7565_64128n_HAL_init_seq[] PROGMEM = { - U8G_ESC_CS(0), // disable chip - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - U8G_ESC_RST(15), // do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/ + U8G_ESC_CS(0), // Disable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + U8G_ESC_RST(15), // Do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/ ST7565_BIAS_MODE(0), // 0xA2: LCD bias 1/9 (according to Displaytech 64128N datasheet) ST7565_ADC_REVERSE(0), // Normal ADC Select (according to Displaytech 64128N datasheet) - ST7565_OUT_MODE(1), // common output mode: set scan direction + ST7565_OUT_MODE(1), // Common output mode: set scan direction ST7565_START_LINE(0), // Display start line for Displaytech 64128N - ST7565_POWER_CONTROL(0x4), // power control: turn on voltage converter - U8G_ESC_DLY(50), // delay 50 ms + ST7565_POWER_CONTROL(0x4), // Power control: turn on voltage converter + U8G_ESC_DLY(50), // Delay 50 ms - ST7565_POWER_CONTROL(0x6), // power control: turn on voltage regulator - U8G_ESC_DLY(50), // delay 50 ms + ST7565_POWER_CONTROL(0x6), // Power control: turn on voltage regulator + U8G_ESC_DLY(50), // Delay 50 ms - ST7565_POWER_CONTROL(0x7), // power control: turn on voltage follower - U8G_ESC_DLY(50), // delay 50 ms + ST7565_POWER_CONTROL(0x7), // Power control: turn on voltage follower + U8G_ESC_DLY(50), // Delay 50 ms #ifdef ST7565_VOLTAGE_DIVIDER_VALUE // Set V5 voltage resistor ratio. Affects brightness of Displaytech 64128N ST7565_V5_RATIO(ST7565_VOLTAGE_DIVIDER_VALUE), #endif - ST7565_INVERTED(0), // display normal, bit val 0: LCD pixel off. + ST7565_INVERTED(0), // Display normal, bit val 0: LCD pixel off. ST7565_CONTRAST(0x1E), // Contrast value for Displaytech 64128N - ST7565_ON(1), // display on + ST7565_ON(1), // Display on - U8G_ESC_DLY(100), // delay 100 ms - ST7565_ALL_PIX(1), // display all points, ST7565 - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_DLY(100), // delay 100 ms - ST7565_ALL_PIX(0), // normal display - U8G_ESC_CS(0), // disable chip - U8G_ESC_END // end of sequence + U8G_ESC_DLY(100), // Delay 100 ms + ST7565_ALL_PIX(1), // Display all points, ST7565 + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_DLY(100), // Delay 100 ms + ST7565_ALL_PIX(0), // Normal display + U8G_ESC_CS(0), // Disable chip + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_st7565_64128n_HAL_data_start[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - ST7565_COLUMN_ADR(ST7565_XOFFSET), // high 4 bits to 0, low 4 bits to 0. Changed for DisplayTech 64128N - U8G_ESC_END // end of sequence + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + ST7565_COLUMN_ADR(ST7565_XOFFSET), // High 4 bits to 0, low 4 bits to 0. Changed for DisplayTech 64128N + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_st7565_64128n_HAL_sleep_on[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - ST7565_SLEEP_MODE(), // static indicator off - //0x00, // indicator register set (not sure if this is required) - ST7565_ON(0), // display off - ST7565_ALL_PIX(1), // all points on - U8G_ESC_CS(0), // disable chip, bugfix 12 nov 2014 - U8G_ESC_END // end of sequence + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + ST7565_SLEEP_MODE(), // Static indicator off + //0x00, // Indicator register set (not sure if this is required) + ST7565_ON(0), // Display off + ST7565_ALL_PIX(1), // All points on + U8G_ESC_CS(0), // Disable chip, bugfix 12 nov 2014 + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_st7565_64128n_HAL_sleep_off[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - ST7565_ALL_PIX(0), // all points off - ST7565_ON(1), // display on - U8G_ESC_DLY(50), // delay 50 ms - U8G_ESC_CS(0), // disable chip, bugfix 12 nov 2014 - U8G_ESC_END // end of sequence + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + ST7565_ALL_PIX(0), // All points off + ST7565_ON(1), // Display on + U8G_ESC_DLY(50), // Delay 50 ms + U8G_ESC_CS(0), // Disable chip, bugfix 12 nov 2014 + U8G_ESC_END // End of sequence }; uint8_t u8g_dev_st7565_64128n_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t msg, void *arg) { @@ -164,15 +164,15 @@ uint8_t u8g_dev_st7565_64128n_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t m case U8G_DEV_MSG_PAGE_NEXT: { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); - u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(pb->p.page)); /* select current page (ST7565R) */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(pb->p.page)); // select current page (ST7565R) + u8g_SetAddress(u8g, dev, 1); // data mode if (!u8g_pb_WriteBuffer(pb, u8g, dev)) return 0; u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // instruction mode u8g_WriteByte(u8g, dev, 0x81); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); @@ -199,21 +199,21 @@ uint8_t u8g_dev_st7565_64128n_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_ u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); - u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page)); /* select current page (ST7565R) */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page)); // select current page (ST7565R) + u8g_SetAddress(u8g, dev, 1); // data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); - u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page + 1)); /* select current page (ST7565R) */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page + 1)); // select current page (ST7565R) + u8g_SetAddress(u8g, dev, 1); // data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // instruction mode u8g_WriteByte(u8g, dev, 0x81); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp index fb9d4b7ad6..6c330db204 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp @@ -63,22 +63,22 @@ /* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ static const uint8_t u8g_dev_st7920_128x64_HAL_init_seq[] PROGMEM = { - U8G_ESC_CS(0), // disable chip - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_RST(15), // do reset low pulse with (15*16)+2 milliseconds (=maximum delay) + U8G_ESC_CS(0), // Disable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_RST(15), // Do reset low pulse with (15*16)+2 milliseconds (=maximum delay) U8G_ESC_DLY(100), // 8 Dez 2012: additional delay 100 ms because of reset - U8G_ESC_CS(1), // enable chip - U8G_ESC_DLY(50), // delay 50 ms + U8G_ESC_CS(1), // Enable chip + U8G_ESC_DLY(50), // Delay 50 ms 0x038, // 8 Bit interface (DL=1), basic instruction set (RE=0) - 0x00C, // display on, cursor & blink off; 0x08: all off + 0x00C, // Display on, cursor & blink off; 0x08: all off 0x006, // Entry mode: Cursor move to right, DDRAM address counter (AC) plus 1, no shift - 0x002, // disable scroll, enable CGRAM address - 0x001, // clear RAM, needs 1.6 ms - U8G_ESC_DLY(100), // delay 100 ms + 0x002, // Disable scroll, enable CGRAM address + 0x001, // Clear RAM, needs 1.6 ms + U8G_ESC_DLY(100), // Delay 100 ms - U8G_ESC_CS(0), // disable chip - U8G_ESC_END // end of sequence + U8G_ESC_CS(0), // Disable chip + U8G_ESC_END // End of sequence }; void clear_graphics_DRAM(u8g_t *u8g, u8g_dev_t *dev) { @@ -115,24 +115,24 @@ uint8_t u8g_dev_st7920_128x64_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo uint8_t *ptr; u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode u8g_SetChipSelect(u8g, dev, 1); y = pb->p.page_y0; ptr = (uint8_t *)pb->buf; for (i = 0; i < 8; i ++) { - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ - u8g_WriteByte(u8g, dev, 0x03E ); /* enable extended mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode + u8g_WriteByte(u8g, dev, 0x03E ); // Enable extended mode if (y < 32) { - u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/ + u8g_WriteByte(u8g, dev, 0x080 | y ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 ); // Set x pos to 0 } else { - u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/ + u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 | 8); // Set x pos to 64 } - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, (LCD_PIXEL_WIDTH) / 8, ptr); ptr += (LCD_PIXEL_WIDTH) / 8; y++; @@ -160,24 +160,24 @@ uint8_t u8g_dev_st7920_128x64_HAL_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, uint8_t *ptr; u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode u8g_SetChipSelect(u8g, dev, 1); y = pb->p.page_y0; ptr = (uint8_t *)pb->buf; for (i = 0; i < 32; i ++) { - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ - u8g_WriteByte(u8g, dev, 0x03E ); /* enable extended mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode + u8g_WriteByte(u8g, dev, 0x03E ); // Enable extended mode if (y < 32) { - u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/ + u8g_WriteByte(u8g, dev, 0x080 | y ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 ); // Set x pos to 0 } else { - u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/ + u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 | 8); // Set x pos to 64 } - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, (LCD_PIXEL_WIDTH) / 8, ptr); ptr += (LCD_PIXEL_WIDTH) / 8; y++; @@ -200,7 +200,7 @@ U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_hw_spi, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_HW_SPI }; #if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) || defined(U8G_HAL_LINKS) - // Also use this device for HAL version of rrd class. This results in the same device being used + // Also use this device for HAL version of RRD class. This results in the same device being used // for the ST7920 for HAL systems no matter what is selected in marlinui_DOGM.h. u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; #endif diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp index f9c68c15fc..1d1291ff9a 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp @@ -83,59 +83,59 @@ #define UC1701_BOOST_RATIO(N) (0xF8), (N) static const uint8_t u8g_dev_uc1701_mini12864_HAL_init_seq[] PROGMEM = { - U8G_ESC_CS(0), // disable chip - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_RST(1), // do reset low pulse with (1*16)+2 milliseconds - U8G_ESC_CS(1), // enable chip + U8G_ESC_CS(0), // Disable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_RST(1), // Do reset low pulse with (1*16)+2 milliseconds + U8G_ESC_CS(1), // Enable chip - UC1701_RESET(), // soft reset - UC1701_START_LINE(0), // set display start line to 0 + UC1701_RESET(), // Soft reset + UC1701_START_LINE(0), // Set display start line to 0 UC1701_ADC_REVERSE(0), // ADC set to reverse - UC1701_OUT_MODE(1), // common output mode - UC1701_INVERTED(0), // display normal, bit val 0: LCD pixel off + UC1701_OUT_MODE(1), // Common output mode + UC1701_INVERTED(0), // Display normal, bit val 0: LCD pixel off UC1701_BIAS_MODE(0), // LCD bias 1/9 - UC1701_POWER_CONTROL(0x7), // all power control circuits on - UC1701_BOOST_RATIO(0x0), // set booster ratio to 4x - UC1701_V5_RATIO(3), // set V0 voltage resistor ratio to large - UC1701_CONTRAST(0x27), // set contrast - UC1701_INDICATOR(0), // indicator disable - UC1701_ON(1), // display on + UC1701_POWER_CONTROL(0x7), // All power control circuits on + UC1701_BOOST_RATIO(0x0), // Set booster ratio to 4x + UC1701_V5_RATIO(3), // Set V0 voltage resistor ratio to large + UC1701_CONTRAST(0x27), // Set contrast + UC1701_INDICATOR(0), // Indicator disable + UC1701_ON(1), // Display on - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_CS(1), // enable chip + U8G_ESC_CS(0), // Disable chip + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_CS(1), // Enable chip - UC1701_ALL_PIX(1), // display all points, ST7565 - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_CS(1), // enable chip - UC1701_ALL_PIX(0), // normal display - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(150), // delay 150 ms before sending any data - U8G_ESC_END // end of sequence + UC1701_ALL_PIX(1), // Display all points, ST7565 + U8G_ESC_CS(0), // Disable chip + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_CS(1), // Enable chip + UC1701_ALL_PIX(0), // Normal display + U8G_ESC_CS(0), // Disable chip + U8G_ESC_DLY(150), // Delay 150 ms before sending any data + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_uc1701_mini12864_HAL_data_start[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip #if ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY, FYSETC_MINI_12864) - UC1701_START_LINE(0), // set display start line to 0 + UC1701_START_LINE(0), // Set display start line to 0 UC1701_ADC_REVERSE(0), // ADC set to reverse - UC1701_OUT_MODE(1), // common output mode - UC1701_INVERTED(0), // display normal, bit val 0: LCD pixel off + UC1701_OUT_MODE(1), // Common output mode + UC1701_INVERTED(0), // Display normal, bit val 0: LCD pixel off UC1701_BIAS_MODE(0), // LCD bias 1/9 - UC1701_POWER_CONTROL(0x7),// all power control circuits on - UC1701_BOOST_RATIO(0x0), // set booster ratio to 4x - UC1701_V5_RATIO(3), // set V0 voltage resistor ratio to large - UC1701_INDICATOR(0), // indicator disable - UC1701_ON(1), // display on - UC1701_COLUMN_HI(0), // set upper 4 bits of the col adr to 0 - U8G_ESC_END, // end of sequence - U8G_ESC_DLY(5) // delay 5 ms + UC1701_POWER_CONTROL(0x7),// All power control circuits on + UC1701_BOOST_RATIO(0x0), // Set booster ratio to 4x + UC1701_V5_RATIO(3), // Set V0 voltage resistor ratio to large + UC1701_INDICATOR(0), // Indicator disable + UC1701_ON(1), // Display on + UC1701_COLUMN_HI(0), // Set upper 4 bits of the col adr to 0 + U8G_ESC_END, // End of sequence + U8G_ESC_DLY(5) // Delay 5 ms #else - UC1701_COLUMN_ADR(0), // address 0 - U8G_ESC_END // end of sequence + UC1701_COLUMN_ADR(0), // Address 0 + U8G_ESC_END // End of sequence #endif }; @@ -151,15 +151,15 @@ uint8_t u8g_dev_uc1701_mini12864_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, case U8G_DEV_MSG_PAGE_NEXT: { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); // Select current page + u8g_SetAddress(u8g, dev, 1); // Data mode if (!u8g_pb_WriteBuffer(pb, u8g, dev)) return 0; u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteByte(u8g, dev, 0x081); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); @@ -180,20 +180,20 @@ uint8_t u8g_dev_uc1701_mini12864_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m case U8G_DEV_MSG_PAGE_NEXT: { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page)); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page)); // Select current page + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page + 1)); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page + 1)); // Select current page + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteByte(u8g, dev, 0x081); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); diff --git a/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp index cd7445e019..6f8990bf20 100644 --- a/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -20,8 +20,8 @@ * */ -// NOTE - the HAL version of the rrd device uses a generic ST7920 device. -// See u8g_dev_st7920_128x64_HAL.cpp for the HAL version. +// NOTE - The HAL version of the RRD device uses a generic ST7920 device. +// See u8g_dev_st7920_128x64_HAL.cpp #include "../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp index 5d9ef627c9..1ee71f7c59 100644 --- a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp +++ b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2018 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + /** * @file u8g_fontutf8.cpp * @brief font api for u8g lib diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.h b/Marlin/src/lcd/dogm/u8g_fontutf8.h index 281894509d..00df000d9c 100644 --- a/Marlin/src/lcd/dogm/u8g_fontutf8.h +++ b/Marlin/src/lcd/dogm/u8g_fontutf8.h @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2018 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + /** * @file fontutf8.h * @brief font api for u8g lib diff --git a/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h b/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h index 7cbaa96088..cffb7f3cb4 100644 --- a/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h +++ b/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h @@ -130,7 +130,6 @@ // #if ANY(EDUTRONICS_12864OLED_SH1106, EDUTRONICS_12864OLED_SSD1306) - #define LCDSCREEN_NAME "EDUTRONICS 12864 OLED" #define BTN_EN2 1 #define BTN_EN1 3 #define BTN_ENC 0 diff --git a/Marlin/src/pins/ramps/pins_DAGOMA_D6.h b/Marlin/src/pins/ramps/pins_DAGOMA_D6.h index f44657d2b5..99b04070d8 100644 --- a/Marlin/src/pins/ramps/pins_DAGOMA_D6.h +++ b/Marlin/src/pins/ramps/pins_DAGOMA_D6.h @@ -55,15 +55,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 0 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 250 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 250 - #endif + #define BOARD_ST7920_DELAY_1 0 + #define BOARD_ST7920_DELAY_2 250 + #define BOARD_ST7920_DELAY_3 250 #endif #define KILL_PIN -1 // NC diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V53.h b/Marlin/src/pins/ramps/pins_ZRIB_V53.h index 22b806a2b6..2b99921909 100644 --- a/Marlin/src/pins/ramps/pins_ZRIB_V53.h +++ b/Marlin/src/pins/ramps/pins_ZRIB_V53.h @@ -334,7 +334,6 @@ // #if ENABLED(ZONESTAR_12864LCD) - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_SDSS_PIN 16 #define LCD_PINS_RS 16 // ST7920 CS (LCD-4) #define LCD_PINS_EN 23 // ST7920 DAT LCD-R/W (LCD-5) @@ -345,7 +344,6 @@ #define BEEPER_PIN 37 #define KILL_PIN 35 #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCDSCREEN_NAME "Reprap LCD12864" // Use EXP1 & EXP2 connector #define LCD_PINS_RS 16 // ST7920 CS #define LCD_PINS_EN 17 // ST7920 DAT @@ -362,7 +360,6 @@ //================================================================================ #if ANY(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) - #define LCDSCREEN_NAME "ZONESTAR 12864OLED" #define LCD_SDSS_PIN 16 #define LCD_PINS_RS 23 // RESET Pull low for 1s to init #define LCD_PINS_DC 17 @@ -386,7 +383,6 @@ //================================================================================ #if ENABLED(ZONESTAR_LCD) - #define LCDSCREEN_NAME "LCD2004 ADCKEY" #define LCD_PINS_RS EXP1_04_PIN #define LCD_PINS_EN EXP1_03_PIN #define LCD_PINS_D4 EXP1_05_PIN diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index b583c17b31..0446f99dd3 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -189,7 +189,6 @@ // // LCD 128x64 // - #define LCDSCREEN_NAME "ZONESTAR_12864LCD" #define FORCE_SOFT_SPI //#define LCD_SDSS_PIN EXP1_03_PIN #define LCD_PINS_RS EXP1_03_PIN // ST7920 CS (LCD-4) @@ -204,7 +203,6 @@ // // OLED 128x64 // - #define LCDSCREEN_NAME "ZONESTAR 12864OLED" #define FORCE_SOFT_SPI #define LCD_PINS_RS EXP1_06_PIN #define LCD_PINS_DC EXP1_04_PIN diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index 54a8ae104b..06c7cacc5b 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -300,8 +300,14 @@ #define LCD_BACKLIGHT_PIN -1 #define FORCE_SOFT_SPI + #elif ENABLED(ULTI_CONTROLLER) + + #define LCD_PINS_D6 EXP1_03_PIN + #define DOGLCD_SCL_PIN EXP1_07_PIN // I2C1 + #define DOGLCD_SDA_PIN EXP1_08_PIN // I2C1 + #else - #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, FYSETC_MINI_12864_2_1 and MKS_LCD12864A/B are currently supported on the SKR E3 DIP." + #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, ULTI_CONTROLLER, MKS_MINI_12864, FYSETC_MINI_12864_2_1 and MKS_LCD12864A/B are currently supported on the SKR E3 DIP." #endif #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index 0364517e24..a2b0f2a99d 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -166,7 +166,7 @@ #define DOGLCD_SCK EXP1_06_PIN #define DOGLCD_MOSI EXP1_08_PIN - #if ANY(FYSETC_MINI_12864, U8GLIB_ST7920) + #if ANY(FYSETC_MINI_12864, IS_U8GLIB_ST7920) #define FORCE_SOFT_SPI #endif //#define LCD_SCREEN_ROTATE 180 // 0, 90, 180, 270 diff --git a/Marlin/src/pins/stm32f1/pins_MD_D301.h b/Marlin/src/pins/stm32f1/pins_MD_D301.h index 3cd7dffed3..629d22c83f 100644 --- a/Marlin/src/pins/stm32f1/pins_MD_D301.h +++ b/Marlin/src/pins/stm32f1/pins_MD_D301.h @@ -49,11 +49,6 @@ // #define SERVO0_PIN PB0 -// -// Z Probe must be this pin -// -#define Z_MIN_PROBE_PIN PB1 - // // Limit Switches // @@ -61,13 +56,20 @@ #define X_MAX_PIN PF11 #define Y_MIN_PIN PF14 #define Y_MAX_PIN PF13 -#ifdef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN - #define Z_MIN_PIN PB1 -#else - #define Z_MIN_PIN PG0 -#endif +#define Z_MIN_PIN PG0 #define Z_MAX_PIN PF15 +// +// Z Probe must be this pin +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PB1 +#endif + +#if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #error "It's physically impossible to connect the Z Probe to the Z Min Endstop pin on this board." +#endif + // // Filament Sensor // diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h index ecea985494..86cbf5c677 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h @@ -192,7 +192,6 @@ // 2 +5V // 1 GND - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_PINS_RS EXP1_03_PIN #define LCD_PINS_EN EXP1_06_PIN #define LCD_PINS_D4 EXP1_04_PIN @@ -220,7 +219,6 @@ // 3 RX3 PB11 KNOB_ENB #define FORCE_SOFT_SPI - #define LCDSCREEN_NAME "ZONESTAR 12864OLED" #define LCD_PINS_RS EXP1_06_PIN // = LCD_RESET_PIN #define LCD_PINS_DC EXP1_04_PIN // DC #define DOGLCD_CS EXP1_03_PIN // CS diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h index 069086a43b..009d1f897c 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h @@ -280,7 +280,6 @@ // #if ENABLED(ZONESTAR_12864LCD) - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_PINS_RS EXP1_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP1_06_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP1_04_PIN // 8 SCK make sure for zonestar zm3e4! @@ -290,7 +289,6 @@ #define BTN_EN2 EXP1_08_PIN #define BTN_ENC EXP1_07_PIN #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCDSCREEN_NAME "REPRAPDISCOUNT LCD12864" #define LCD_PINS_RS EXP1_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP1_04_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP1_06_PIN // 8 SCK make sure for zonestar zm3e4! @@ -301,7 +299,6 @@ #define BTN_ENC EXP1_01_PIN #elif ENABLED(ZONESTAR_DWIN_LCD) // Connect to EXP2 connector - #define LCDSCREEN_NAME "ZONESTAR DWIN LCD" #define BEEPER_PIN EXP2_05_PIN #define KILL_PIN PC0 #define BTN_EN1 EXP2_08_PIN @@ -310,7 +307,6 @@ #endif #if ENABLED(ZONESTAR_LCD2004_KNOB) - #define LCDSCREEN_NAME "LCD2004 KNOB" #define LCD_PINS_RS EXP1_03_PIN #define LCD_PINS_EN EXP1_04_PIN #define LCD_PINS_D4 EXP1_06_PIN @@ -323,7 +319,6 @@ #define BEEPER_PIN EXP1_02_PIN #define KILL_PIN EXP2_07_PIN #elif ENABLED(ZONESTAR_LCD2004_ADCKEY) - #define LCDSCREEN_NAME "LCD2004 5KEY" #define LCD_PINS_RS EXP1_03_PIN #define LCD_PINS_EN EXP1_04_PIN #define LCD_PINS_D4 EXP1_06_PIN diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h index 66e538cb48..833c3427c1 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h @@ -276,7 +276,6 @@ #define WIFI_EN PC14 #if ENABLED(ZONESTAR_12864LCD) - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_PINS_RS EXP1_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP1_06_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP1_04_PIN // 8 SCK make sure for zonestar zm3e4! @@ -286,7 +285,6 @@ #define BTN_EN2 EXP1_08_PIN #define BTN_ENC EXP1_07_PIN #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCDSCREEN_NAME "REPRAPDISCOUNT LCD12864" #define LCD_PINS_RS EXP2_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP2_06_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP2_04_PIN // 8 SCK make sure for zonestar zm3e4! @@ -297,7 +295,6 @@ #define BTN_ENC EXP2_07_PIN #elif ENABLED(ZONESTAR_DWIN_LCD) // Connect to EXP2 connector - #define LCDSCREEN_NAME "ZONESTAR DWIN LCD" #define BEEPER_PIN EXP2_05_PIN // PE11 #define KILL_PIN -1 // EXP1_01_PIN #define BTN_EN2 EXP2_07_PIN // PE8 diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h index 54e1acc936..d0427b2c31 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h @@ -280,7 +280,7 @@ #endif // HAS_WIRED_LCD // Alter timing for graphical display -#if ENABLED(U8GLIB_ST7920) +#if IS_U8GLIB_ST7920 #define BOARD_ST7920_DELAY_1 96 #define BOARD_ST7920_DELAY_2 48 #define BOARD_ST7920_DELAY_3 600 diff --git a/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h b/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h index e36bdae3a8..1620c86bed 100644 --- a/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h +++ b/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h @@ -571,15 +571,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 125 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 90 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 600 - #endif + #define BOARD_ST7920_DELAY_1 125 + #define BOARD_ST7920_DELAY_2 90 + #define BOARD_ST7920_DELAY_3 600 #endif #if ENABLED(WIFISUPPORT) diff --git a/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h b/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h index 3fff8515b9..3ae1432a14 100644 --- a/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h @@ -480,15 +480,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif //#define POWER_MONITOR_VOLTAGE_PIN PC3 diff --git a/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h b/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h index 3ed778c16f..053fb19525 100644 --- a/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h +++ b/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h @@ -275,14 +275,8 @@ #endif // HAS_WIRED_LCD // Alter timing for graphical display -#if ENABLED(U8GLIB_ST7920) - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif +#if IS_U8GLIB_ST7920 + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h index 9c50f4b7d8..ec6784b3b5 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h @@ -282,15 +282,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif // diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h index dce4f87cdf..4ff278acc5 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h @@ -308,15 +308,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif // diff --git a/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h b/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h index 5b3ff90f9e..2a112f34b1 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h @@ -518,15 +518,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif #if HAS_SPI_TFT From 2cf4d02a32e717ef6b1d348fe0504aba15cafb23 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:03:14 +1300 Subject: [PATCH 018/101] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20TOUCH=5FUI=5FFTDI?= =?UTF-8?q?=5FEVE=20build=20(#27667)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #27275 --- .../lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp index ce281c685b..44e5341f64 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp @@ -70,6 +70,10 @@ using namespace Theme; #define BACK_POS BTN_POS(1,6), BTN_SIZE(3,1) #endif +#ifndef Z_ALIGN_COMMANDS + #define Z_ALIGN_COMMANDS "G34" +#endif + void LevelingMenu::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { CommandProcessor cmd; @@ -116,7 +120,7 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); break; #if ANY(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION, X_LEVEL_SEQUENCE) - case 2: SpinnerDialogBox::enqueueAndWait(F(LEVELING_COMMANDS)); break; + case 2: SpinnerDialogBox::enqueueAndWait(F(Z_ALIGN_COMMANDS)); break; #endif #if HAS_BED_PROBE case 3: From c29b44fcca8562b20342ad81ba117c78ef39cf40 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:44:43 +1300 Subject: [PATCH 019/101] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20Simulator=20KILL?= =?UTF-8?q?=20pin=20overlap=20(#27668)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/native/pins_RAMPS_NATIVE.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/native/pins_RAMPS_NATIVE.h b/Marlin/src/pins/native/pins_RAMPS_NATIVE.h index ffc716a502..b27b9c7b49 100644 --- a/Marlin/src/pins/native/pins_RAMPS_NATIVE.h +++ b/Marlin/src/pins/native/pins_RAMPS_NATIVE.h @@ -730,5 +730,5 @@ #endif // HAS_WIRED_LCD #ifndef KILL_PIN - #define KILL_PIN EXP2_08_PIN + #define KILL_PIN 11 #endif From a68b70de15282b2f15cb2e96e44ea31fd4b4eedd Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:48:18 +1300 Subject: [PATCH 020/101] =?UTF-8?q?=F0=9F=93=8C=20Clean=20up=20ESP32=20bui?= =?UTF-8?q?ld=20(#27672)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/libs/numtostr.cpp | 4 +++- ini/esp32.ini | 2 +- ini/features.ini | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index b9503cb242..aa00b5d6e2 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -25,7 +25,9 @@ #include "../inc/MarlinConfigPre.h" #include "../core/utility.h" -#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#if !ARDUINO_ARCH_ESP32 + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#endif constexpr char DIGIT(const uint8_t n) { return '0' + n; } diff --git a/ini/esp32.ini b/ini/esp32.ini index 4afaeaa030..f40b37ef14 100644 --- a/ini/esp32.ini +++ b/ini/esp32.ini @@ -45,7 +45,7 @@ extends = env:esp32 board = marlin_MKS_TinyBee platform = espressif32@~3.5.0 board_build.partitions = default_8MB.csv -build_src_flags = -O3 -Wno-volatile +build_src_flags = -O3 monitor_filters = esp32_exception_decoder [env:godi_esp32] diff --git a/ini/features.ini b/ini/features.ini index 49e0c5054e..f56175a3d6 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -375,7 +375,7 @@ IS_SCARA = build_src_filter=+ + MORGAN_SCARA = build_src_filter=+ HAS_MICROSTEPS = build_src_filter=+ -(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer +(ESP3D_)?WIFISUPPORT = esp32async/AsyncTCP@3.3.3, mathieucarbou/ESP Async WebServer@3.0.6 ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/dc0f3d96c6.zip arduinoWebSockets=links2004/WebSockets@2.3.4 luc-github/ESP32SSDP@1.1.1 From 363f324179b608d3be5eabcb0e964ee8a9d0b2ab Mon Sep 17 00:00:00 2001 From: Teemo Vaas Date: Fri, 22 Dec 2023 06:47:36 +0200 Subject: [PATCH 021/101] =?UTF-8?q?=F0=9F=9A=B8=20Fix=20G4=20Dwell=20overf?= =?UTF-8?q?low?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/core/millis_t.h | 5 ++++- Marlin/src/gcode/gcode.cpp | 8 ++++---- Marlin/src/gcode/gcode.h | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Marlin/src/core/millis_t.h b/Marlin/src/core/millis_t.h index e7032a2e55..7c00b91a5b 100644 --- a/Marlin/src/core/millis_t.h +++ b/Marlin/src/core/millis_t.h @@ -30,5 +30,8 @@ typedef uint32_t millis_t; #define MS_TO_SEC(N) millis_t((N)/1000UL) #define MS_TO_SEC_PRECISE(N) (float(N)/1000.0f) -#define PENDING(NOW,SOON) ((int32_t)(NOW-(SOON))<0) +#define FUTURE(START,DURA) (millis_t(millis()-(START))<(DURA)) +#define PAST(START,DURA) (!FUTURE(START,DURA)) + +#define PENDING(NOW,SOON) (int32_t((NOW)-(SOON))<0) #define ELAPSED(NOW,SOON) (!PENDING(NOW,SOON)) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 881149fb52..69d77e875e 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -242,11 +242,11 @@ void GcodeSuite::get_destination_from_command() { } /** - * Dwell waits immediately. It does not synchronize. Use M400 instead of G4 + * Dwell waits immediately. It does not synchronize. */ -void GcodeSuite::dwell(millis_t time) { - time += millis(); - while (PENDING(millis(), time)) idle(); +void GcodeSuite::dwell(const millis_t time) { + const millis_t startMillis = millis(); + while (FUTURE(startMillis, time)) idle(); } /** diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index e86a58d85d..1f3ccba37c 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -503,7 +503,7 @@ public: #define KEEPALIVE_STATE(N) NOOP #endif - static void dwell(millis_t time); + static void dwell(const millis_t time); private: From 91a87f45d9d491a259446f439fe9a3ceadecbf87 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Mar 2025 13:51:08 -0500 Subject: [PATCH 022/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Som?= =?UTF-8?q?e=20millis()=20'unsigned=20long'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/LINUX/arduino.cpp | 4 ++-- Marlin/src/HAL/LINUX/include/Arduino.h | 4 ++-- Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp | 2 +- Marlin/src/HAL/STM32F1/sdio.cpp | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/HAL/LINUX/arduino.cpp b/Marlin/src/HAL/LINUX/arduino.cpp index 0a48697a9c..a387a9623e 100644 --- a/Marlin/src/HAL/LINUX/arduino.cpp +++ b/Marlin/src/HAL/LINUX/arduino.cpp @@ -33,8 +33,8 @@ void sei() { } // Enable // Time functions void _delay_ms(const int ms) { delay(ms); } -uint32_t millis() { - return (uint32_t)Clock::millis(); +unsigned long millis() { + return (unsigned long)Clock::millis(); } // This is required for some Arduino libraries we are using diff --git a/Marlin/src/HAL/LINUX/include/Arduino.h b/Marlin/src/HAL/LINUX/include/Arduino.h index f05aaed880..b11e75ccbc 100644 --- a/Marlin/src/HAL/LINUX/include/Arduino.h +++ b/Marlin/src/HAL/LINUX/include/Arduino.h @@ -76,9 +76,9 @@ extern "C" { extern "C" void delay(const int ms); void _delay_ms(const int ms); void delayMicroseconds(unsigned long); -uint32_t millis(); +unsigned long millis(); -//IO functions +// IO functions void pinMode(const pin_t, const uint8_t); void digitalWrite(pin_t, uint8_t); bool digitalRead(pin_t); diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp index e714c3c16d..09603de972 100644 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp @@ -28,7 +28,7 @@ #include "../include/i2c_util.h" #include "../../../core/millis_t.h" -extern int millis(); +uint32_t millis(); #ifdef __cplusplus extern "C" { diff --git a/Marlin/src/HAL/STM32F1/sdio.cpp b/Marlin/src/HAL/STM32F1/sdio.cpp index 23f984eff3..5bb1ddb6c5 100644 --- a/Marlin/src/HAL/STM32F1/sdio.cpp +++ b/Marlin/src/HAL/STM32F1/sdio.cpp @@ -145,7 +145,7 @@ bool SDIO_ReadBlock(uint32_t blockAddress, uint8_t *data) { return false; } -uint32_t millis(); +unsigned long millis(); bool SDIO_WriteBlock(uint32_t blockAddress, const uint8_t *data) { if (SDIO_GetCardState() != SDIO_CARD_TRANSFER) return false; From 14fa7057718acbed8d0e4238f2eba9b9f645db64 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 22 Mar 2025 00:28:38 +0000 Subject: [PATCH 023/101] [cron] Bump distribution date (2025-03-22) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index a1aa9e6164..f31c7298a1 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-21" +//#define STRING_DISTRIBUTION_DATE "2025-03-22" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index ce3bc61e5c..a24628c209 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-21" + #define STRING_DISTRIBUTION_DATE "2025-03-22" #endif /** From 1701fd8f641757fa752acf40a6a1a7bdc4d572d4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 25 Mar 2025 16:39:09 -0500 Subject: [PATCH 024/101] =?UTF-8?q?=F0=9F=94=A5=20DELTA=5FMAX=5FRADIUS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 1202bc1e53..9a96169646 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1025,9 +1025,6 @@ // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). #define PRINTABLE_RADIUS 140.0 // (mm) - // Maximum reachable area - #define DELTA_MAX_RADIUS 140.0 // (mm) - // Center-to-center distance of the holes in the diagonal push rods. #define DELTA_DIAGONAL_ROD 250.0 // (mm) From a8fea3d67451ef9b0593b2d790ad92cad0a5f9a8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 25 Mar 2025 16:41:40 -0500 Subject: [PATCH 025/101] =?UTF-8?q?=F0=9F=A9=B9=20Cleanup=20(for=20STM32?= =?UTF-8?q?=20I2C=20LCD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to 9a8b1eab --- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index 06c7cacc5b..9c7c8148cb 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -302,9 +302,9 @@ #elif ENABLED(ULTI_CONTROLLER) - #define LCD_PINS_D6 EXP1_03_PIN - #define DOGLCD_SCL_PIN EXP1_07_PIN // I2C1 - #define DOGLCD_SDA_PIN EXP1_08_PIN // I2C1 + #define LCD_PINS_D6 EXP1_03_PIN + #define DOGLCD_SCL_PIN EXP1_07_PIN // I2C1 + #define DOGLCD_SDA_PIN EXP1_08_PIN // I2C1 #else #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, ULTI_CONTROLLER, MKS_MINI_12864, FYSETC_MINI_12864_2_1 and MKS_LCD12864A/B are currently supported on the SKR E3 DIP." From dda42fb599d17fd049ee38a95b4e80dc95c9cbd2 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 26 Mar 2025 00:29:30 +0000 Subject: [PATCH 026/101] [cron] Bump distribution date (2025-03-26) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index f31c7298a1..18f9ce19e8 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-22" +//#define STRING_DISTRIBUTION_DATE "2025-03-26" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index a24628c209..0d24f4c508 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-22" + #define STRING_DISTRIBUTION_DATE "2025-03-26" #endif /** From ac5fa61de5775b54e1a9f4dc9ad8a7583ef93996 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 02:25:43 -0500 Subject: [PATCH 027/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Mor?= =?UTF-8?q?e=20robust=20TERN=5F=20macro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/core/macros.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 21d9929bc5..344ab04e74 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -206,19 +206,23 @@ #define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION ? 'A' : 'B' #define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION ? 'A' : '0' #define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION ? 'A' : '1' -#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION ? 'A' : '' #define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1' #define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' #define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. #define IF_DISABLED(O,A) TERN(O,,A) +// "Ternary" that emits or omits the given content +#define EMIT(V...) V +#define OMIT(...) +#define TERN_(O,A) _TERN(_ENA_1(O),OMIT,EMIT)(A) // OPTION ? 'A' : '' + // Macros to conditionally emit array items and function arguments #define _OPTITEM(A...) A, -#define OPTITEM(O,A...) TERN_(O,DEFER4(_OPTITEM)(A)) +#define OPTITEM(O,A...) TERN_(O,DEFER(_OPTITEM)(A)) #define _OPTARG(A...) , A -#define OPTARG(O,A...) TERN_(O,DEFER4(_OPTARG)(A)) +#define OPTARG(O,A...) TERN_(O,DEFER(_OPTARG)(A)) #define _OPTCODE(A) A; -#define OPTCODE(O,A) TERN_(O,DEFER4(_OPTCODE)(A)) +#define OPTCODE(O,A) TERN_(O,DEFER(_OPTCODE)(A)) // Macros to avoid operations that aren't always optimized away (e.g., 'f + 0.0' and 'f * 1.0'). // Compiler flags -fno-signed-zeros -ffinite-math-only also cover 'f * 1.0', 'f - f', etc. From add72fd0452addb13ac7c1fea7d7476dd991cd93 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 02:29:11 -0500 Subject: [PATCH 028/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Ind?= =?UTF-8?q?ividual=20TMC=20flags?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/feature/digipot/digipot_mcp4451.cpp | 8 +- Marlin/src/feature/tmc_util.cpp | 481 +++++------------- Marlin/src/gcode/calibrate/G28.cpp | 12 +- Marlin/src/gcode/calibrate/G34.cpp | 49 +- Marlin/src/gcode/feature/trinamic/M906.cpp | 251 +++------ .../src/gcode/feature/trinamic/M911-M914.cpp | 176 +++---- Marlin/src/gcode/feature/trinamic/M919.cpp | 157 ++---- Marlin/src/gcode/gcode.cpp | 1 + Marlin/src/gcode/gcode.h | 15 +- Marlin/src/inc/Conditionals-4-adv.h | 69 ++- Marlin/src/inc/Conditionals-5-post.h | 88 ++-- Marlin/src/inc/Conditionals-6-type.h | 47 +- Marlin/src/inc/SanityCheck.h | 22 +- Marlin/src/inc/Warnings.cpp | 32 +- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 8 +- Marlin/src/lcd/e3v2/proui/dwin.cpp | 39 +- .../src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp | 16 +- .../lcd/extui/dgus/mks/DGUSScreenHandler.cpp | 16 +- .../generic/stepper_current_screen.cpp | 68 +-- .../src/lcd/extui/mks_ui/draw_number_key.cpp | 52 +- .../mks_ui/draw_tmc_current_settings.cpp | 71 +-- Marlin/src/lcd/extui/ui_api.cpp | 232 +++------ Marlin/src/lcd/menu/menu_tmc.cpp | 80 +-- Marlin/src/lcd/sovol_rts/sovol_rts.cpp | 57 +-- Marlin/src/module/motion.cpp | 344 +++---------- Marlin/src/module/motion.h | 3 + Marlin/src/module/settings.cpp | 176 ++----- Marlin/src/module/stepper.cpp | 124 ++--- Marlin/src/module/stepper/indirection.h | 204 ++------ Marlin/src/module/stepper/trinamic.cpp | 194 ++----- Marlin/src/module/stepper/trinamic.h | 44 +- 31 files changed, 958 insertions(+), 2178 deletions(-) diff --git a/Marlin/src/feature/digipot/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp index e35b42a28b..156755856c 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4451.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -87,13 +87,7 @@ void DigipotI2C::init() { Wire.begin(); #endif // Set up initial currents as defined in Configuration_adv.h - static const float digipot_motor_current[] PROGMEM = - #if ENABLED(DIGIPOT_USE_RAW_VALUES) - DIGIPOT_MOTOR_CURRENT - #else - DIGIPOT_I2C_MOTOR_CURRENTS - #endif - ; + static const float digipot_motor_current[] PROGMEM = TERN(DIGIPOT_USE_RAW_VALUES, DIGIPOT_MOTOR_CURRENT, DIGIPOT_I2C_MOTOR_CURRENTS); for (uint8_t i = 0; i < COUNT(digipot_motor_current); ++i) set_current(i, pgm_read_float(&digipot_motor_current[i])); } diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 6afbf4a0ce..62972eb7f5 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -344,127 +344,70 @@ if (need_update_error_counters || need_debug_reporting) { - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) - { - bool result = false; - #if AXIS_IS_TMC(X) - if (monitor_tmc_driver(stepperX, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(X2) - if (monitor_tmc_driver(stepperX2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(X) - step_current_down(stepperX); - #endif - #if AXIS_IS_TMC(X2) - step_current_down(stepperX2); - #endif + #if X_IS_TRINAMIC || X2_IS_TRINAMIC + if ( TERN0(X_IS_TRINAMIC, monitor_tmc_driver(stepperX, need_update_error_counters, need_debug_reporting)) + || TERN0(X2_IS_TRINAMIC, monitor_tmc_driver(stepperX2, need_update_error_counters, need_debug_reporting)) + ) { + TERN_(X_IS_TRINAMIC, step_current_down(stepperX)); + TERN_(X2_IS_TRINAMIC, step_current_down(stepperX2)); } - } #endif - #if AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) - { - bool result = false; - #if AXIS_IS_TMC(Y) - if (monitor_tmc_driver(stepperY, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Y2) - if (monitor_tmc_driver(stepperY2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(Y) - step_current_down(stepperY); - #endif - #if AXIS_IS_TMC(Y2) - step_current_down(stepperY2); - #endif + #if Y_IS_TRINAMIC || Y2_IS_TRINAMIC + if ( TERN0(Y_IS_TRINAMIC, monitor_tmc_driver(stepperY, need_update_error_counters, need_debug_reporting)) + || TERN0(Y2_IS_TRINAMIC, monitor_tmc_driver(stepperY2, need_update_error_counters, need_debug_reporting)) + ) { + TERN_(Y_IS_TRINAMIC, step_current_down(stepperY)); + TERN_(Y2_IS_TRINAMIC, step_current_down(stepperY2)); } - } #endif - #if AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) - { - bool result = false; - #if AXIS_IS_TMC(Z) - if (monitor_tmc_driver(stepperZ, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z2) - if (monitor_tmc_driver(stepperZ2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z3) - if (monitor_tmc_driver(stepperZ3, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z4) - if (monitor_tmc_driver(stepperZ4, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(Z) - step_current_down(stepperZ); - #endif - #if AXIS_IS_TMC(Z2) - step_current_down(stepperZ2); - #endif - #if AXIS_IS_TMC(Z3) - step_current_down(stepperZ3); - #endif - #if AXIS_IS_TMC(Z4) - step_current_down(stepperZ4); - #endif + #if ANY(Z_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) + if ( TERN0(Z_IS_TRINAMIC, monitor_tmc_driver(stepperZ, need_update_error_counters, need_debug_reporting)) + || TERN0(Z2_IS_TRINAMIC, monitor_tmc_driver(stepperZ2, need_update_error_counters, need_debug_reporting)) + || TERN0(Z3_IS_TRINAMIC, monitor_tmc_driver(stepperZ3, need_update_error_counters, need_debug_reporting)) + || TERN0(Z4_IS_TRINAMIC, monitor_tmc_driver(stepperZ4, need_update_error_counters, need_debug_reporting)) + ) { + TERN_(Z_IS_TRINAMIC, step_current_down(stepperZ)); + TERN_(Z2_IS_TRINAMIC, step_current_down(stepperZ2)); + TERN_(Z3_IS_TRINAMIC, step_current_down(stepperZ3)); + TERN_(Z4_IS_TRINAMIC, step_current_down(stepperZ4)); } - } #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC if (monitor_tmc_driver(stepperI, need_update_error_counters, need_debug_reporting)) step_current_down(stepperI); #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC if (monitor_tmc_driver(stepperJ, need_update_error_counters, need_debug_reporting)) step_current_down(stepperJ); #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC if (monitor_tmc_driver(stepperK, need_update_error_counters, need_debug_reporting)) step_current_down(stepperK); #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC if (monitor_tmc_driver(stepperU, need_update_error_counters, need_debug_reporting)) step_current_down(stepperU); #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC if (monitor_tmc_driver(stepperV, need_update_error_counters, need_debug_reporting)) step_current_down(stepperV); #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC if (monitor_tmc_driver(stepperW, need_update_error_counters, need_debug_reporting)) step_current_down(stepperW); #endif - #if AXIS_IS_TMC(E0) - (void)monitor_tmc_driver(stepperE0, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E1) - (void)monitor_tmc_driver(stepperE1, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E2) - (void)monitor_tmc_driver(stepperE2, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E3) - (void)monitor_tmc_driver(stepperE3, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E4) - (void)monitor_tmc_driver(stepperE4, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E5) - (void)monitor_tmc_driver(stepperE5, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E6) - (void)monitor_tmc_driver(stepperE6, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E7) - (void)monitor_tmc_driver(stepperE7, need_update_error_counters, need_debug_reporting); - #endif + TERN_(E0_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE0, need_update_error_counters, need_debug_reporting)); + TERN_(E1_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE1, need_update_error_counters, need_debug_reporting)); + TERN_(E2_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE2, need_update_error_counters, need_debug_reporting)); + TERN_(E3_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE3, need_update_error_counters, need_debug_reporting)); + TERN_(E4_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE4, need_update_error_counters, need_debug_reporting)); + TERN_(E5_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE5, need_update_error_counters, need_debug_reporting)); + TERN_(E6_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE6, need_update_error_counters, need_debug_reporting)); + TERN_(E7_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE7, need_update_error_counters, need_debug_reporting)); if (TERN0(TMC_DEBUG, need_debug_reporting)) SERIAL_EOL(); } @@ -781,82 +724,38 @@ static void tmc_debug_loop(const TMC_debug_enum n OPTARGS_LOGICAL(const bool)) { if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - tmc_status(stepperX, n); - #endif - #if AXIS_IS_TMC(X2) - tmc_status(stepperX2, n); - #endif + TERN_(X_IS_TRINAMIC, tmc_status(stepperX, n)); + TERN_(X2_IS_TRINAMIC, tmc_status(stepperX2, n)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - tmc_status(stepperY, n); - #endif - #if AXIS_IS_TMC(Y2) - tmc_status(stepperY2, n); - #endif + TERN_(Y_IS_TRINAMIC, tmc_status(stepperY, n)); + TERN_(Y2_IS_TRINAMIC, tmc_status(stepperY2, n)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - tmc_status(stepperZ, n); - #endif - #if AXIS_IS_TMC(Z2) - tmc_status(stepperZ2, n); - #endif - #if AXIS_IS_TMC(Z3) - tmc_status(stepperZ3, n); - #endif - #if AXIS_IS_TMC(Z4) - tmc_status(stepperZ4, n); - #endif + TERN_(Z_IS_TRINAMIC, tmc_status(stepperZ, n)); + TERN_(Z2_IS_TRINAMIC, tmc_status(stepperZ2, n)); + TERN_(Z3_IS_TRINAMIC, tmc_status(stepperZ3, n)); + TERN_(Z4_IS_TRINAMIC, tmc_status(stepperZ4, n)); } - #if AXIS_IS_TMC(I) - if (i) tmc_status(stepperI, n); - #endif - #if AXIS_IS_TMC(J) - if (j) tmc_status(stepperJ, n); - #endif - #if AXIS_IS_TMC(K) - if (k) tmc_status(stepperK, n); - #endif - #if AXIS_IS_TMC(U) - if (u) tmc_status(stepperU, n); - #endif - #if AXIS_IS_TMC(V) - if (v) tmc_status(stepperV, n); - #endif - #if AXIS_IS_TMC(W) - if (w) tmc_status(stepperW, n); - #endif + TERN_(I_IS_TRINAMIC, if (i) tmc_status(stepperI, n)); + TERN_(J_IS_TRINAMIC, if (j) tmc_status(stepperJ, n)); + TERN_(K_IS_TRINAMIC, if (k) tmc_status(stepperK, n)); + TERN_(U_IS_TRINAMIC, if (u) tmc_status(stepperU, n)); + TERN_(V_IS_TRINAMIC, if (v) tmc_status(stepperV, n)); + TERN_(W_IS_TRINAMIC, if (w) tmc_status(stepperW, n)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - tmc_status(stepperE0, n); - #endif - #if AXIS_IS_TMC(E1) - tmc_status(stepperE1, n); - #endif - #if AXIS_IS_TMC(E2) - tmc_status(stepperE2, n); - #endif - #if AXIS_IS_TMC(E3) - tmc_status(stepperE3, n); - #endif - #if AXIS_IS_TMC(E4) - tmc_status(stepperE4, n); - #endif - #if AXIS_IS_TMC(E5) - tmc_status(stepperE5, n); - #endif - #if AXIS_IS_TMC(E6) - tmc_status(stepperE6, n); - #endif - #if AXIS_IS_TMC(E7) - tmc_status(stepperE7, n); - #endif + TERN_(E0_IS_TRINAMIC, tmc_status(stepperE0, n)); + TERN_(E1_IS_TRINAMIC, tmc_status(stepperE1, n)); + TERN_(E2_IS_TRINAMIC, tmc_status(stepperE2, n)); + TERN_(E3_IS_TRINAMIC, tmc_status(stepperE3, n)); + TERN_(E4_IS_TRINAMIC, tmc_status(stepperE4, n)); + TERN_(E5_IS_TRINAMIC, tmc_status(stepperE5, n)); + TERN_(E6_IS_TRINAMIC, tmc_status(stepperE6, n)); + TERN_(E7_IS_TRINAMIC, tmc_status(stepperE7, n)); } SERIAL_EOL(); @@ -864,82 +763,38 @@ static void drv_status_loop(const TMC_drv_status_enum n OPTARGS_LOGICAL(const bool)) { if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - tmc_parse_drv_status(stepperX, n); - #endif - #if AXIS_IS_TMC(X2) - tmc_parse_drv_status(stepperX2, n); - #endif + TERN_(X_IS_TRINAMIC, tmc_parse_drv_status(stepperX, n)); + TERN_(X2_IS_TRINAMIC, tmc_parse_drv_status(stepperX2, n)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - tmc_parse_drv_status(stepperY, n); - #endif - #if AXIS_IS_TMC(Y2) - tmc_parse_drv_status(stepperY2, n); - #endif + TERN_(Y_IS_TRINAMIC, tmc_parse_drv_status(stepperY, n)); + TERN_(Y2_IS_TRINAMIC, tmc_parse_drv_status(stepperY2, n)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - tmc_parse_drv_status(stepperZ, n); - #endif - #if AXIS_IS_TMC(Z2) - tmc_parse_drv_status(stepperZ2, n); - #endif - #if AXIS_IS_TMC(Z3) - tmc_parse_drv_status(stepperZ3, n); - #endif - #if AXIS_IS_TMC(Z4) - tmc_parse_drv_status(stepperZ4, n); - #endif + TERN_(Z_IS_TRINAMIC, tmc_parse_drv_status(stepperZ, n)); + TERN_(Z2_IS_TRINAMIC, tmc_parse_drv_status(stepperZ2, n)); + TERN_(Z3_IS_TRINAMIC, tmc_parse_drv_status(stepperZ3, n)); + TERN_(Z4_IS_TRINAMIC, tmc_parse_drv_status(stepperZ4, n)); } - #if AXIS_IS_TMC(I) - if (i) tmc_parse_drv_status(stepperI, n); - #endif - #if AXIS_IS_TMC(J) - if (j) tmc_parse_drv_status(stepperJ, n); - #endif - #if AXIS_IS_TMC(K) - if (k) tmc_parse_drv_status(stepperK, n); - #endif - #if AXIS_IS_TMC(U) - if (u) tmc_parse_drv_status(stepperU, n); - #endif - #if AXIS_IS_TMC(V) - if (v) tmc_parse_drv_status(stepperV, n); - #endif - #if AXIS_IS_TMC(W) - if (w) tmc_parse_drv_status(stepperW, n); - #endif + TERN_(I_IS_TRINAMIC, if (i) tmc_parse_drv_status(stepperI, n)); + TERN_(J_IS_TRINAMIC, if (j) tmc_parse_drv_status(stepperJ, n)); + TERN_(K_IS_TRINAMIC, if (k) tmc_parse_drv_status(stepperK, n)); + TERN_(U_IS_TRINAMIC, if (u) tmc_parse_drv_status(stepperU, n)); + TERN_(V_IS_TRINAMIC, if (v) tmc_parse_drv_status(stepperV, n)); + TERN_(W_IS_TRINAMIC, if (w) tmc_parse_drv_status(stepperW, n)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - tmc_parse_drv_status(stepperE0, n); - #endif - #if AXIS_IS_TMC(E1) - tmc_parse_drv_status(stepperE1, n); - #endif - #if AXIS_IS_TMC(E2) - tmc_parse_drv_status(stepperE2, n); - #endif - #if AXIS_IS_TMC(E3) - tmc_parse_drv_status(stepperE3, n); - #endif - #if AXIS_IS_TMC(E4) - tmc_parse_drv_status(stepperE4, n); - #endif - #if AXIS_IS_TMC(E5) - tmc_parse_drv_status(stepperE5, n); - #endif - #if AXIS_IS_TMC(E6) - tmc_parse_drv_status(stepperE6, n); - #endif - #if AXIS_IS_TMC(E7) - tmc_parse_drv_status(stepperE7, n); - #endif + TERN_(E0_IS_TRINAMIC, tmc_parse_drv_status(stepperE0, n)); + TERN_(E1_IS_TRINAMIC, tmc_parse_drv_status(stepperE1, n)); + TERN_(E2_IS_TRINAMIC, tmc_parse_drv_status(stepperE2, n)); + TERN_(E3_IS_TRINAMIC, tmc_parse_drv_status(stepperE3, n)); + TERN_(E4_IS_TRINAMIC, tmc_parse_drv_status(stepperE4, n)); + TERN_(E5_IS_TRINAMIC, tmc_parse_drv_status(stepperE5, n)); + TERN_(E6_IS_TRINAMIC, tmc_parse_drv_status(stepperE6, n)); + TERN_(E7_IS_TRINAMIC, tmc_parse_drv_status(stepperE7, n)); } SERIAL_EOL(); @@ -1078,82 +933,38 @@ static void tmc_get_registers(TMC_get_registers_enum n OPTARGS_LOGICAL(const bool)) { if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - tmc_get_registers(stepperX, n); - #endif - #if AXIS_IS_TMC(X2) - tmc_get_registers(stepperX2, n); - #endif + TERN_(X_IS_TRINAMIC, tmc_get_registers(stepperX, n)); + TERN_(X2_IS_TRINAMIC, tmc_get_registers(stepperX2, n)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - tmc_get_registers(stepperY, n); - #endif - #if AXIS_IS_TMC(Y2) - tmc_get_registers(stepperY2, n); - #endif + TERN_(Y_IS_TRINAMIC, tmc_get_registers(stepperY, n)); + TERN_(Y2_IS_TRINAMIC, tmc_get_registers(stepperY2, n)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - tmc_get_registers(stepperZ, n); - #endif - #if AXIS_IS_TMC(Z2) - tmc_get_registers(stepperZ2, n); - #endif - #if AXIS_IS_TMC(Z3) - tmc_get_registers(stepperZ3, n); - #endif - #if AXIS_IS_TMC(Z4) - tmc_get_registers(stepperZ4, n); - #endif + TERN_(Z_IS_TRINAMIC, tmc_get_registers(stepperZ, n)); + TERN_(Z2_IS_TRINAMIC, tmc_get_registers(stepperZ2, n)); + TERN_(Z3_IS_TRINAMIC, tmc_get_registers(stepperZ3, n)); + TERN_(Z4_IS_TRINAMIC, tmc_get_registers(stepperZ4, n)); } - #if AXIS_IS_TMC(I) - if (i) tmc_get_registers(stepperI, n); - #endif - #if AXIS_IS_TMC(J) - if (j) tmc_get_registers(stepperJ, n); - #endif - #if AXIS_IS_TMC(K) - if (k) tmc_get_registers(stepperK, n); - #endif - #if AXIS_IS_TMC(U) - if (u) tmc_get_registers(stepperU, n); - #endif - #if AXIS_IS_TMC(V) - if (v) tmc_get_registers(stepperV, n); - #endif - #if AXIS_IS_TMC(W) - if (w) tmc_get_registers(stepperW, n); - #endif + TERN_(I_IS_TRINAMIC, if (i) tmc_get_registers(stepperI, n)); + TERN_(J_IS_TRINAMIC, if (j) tmc_get_registers(stepperJ, n)); + TERN_(K_IS_TRINAMIC, if (k) tmc_get_registers(stepperK, n)); + TERN_(U_IS_TRINAMIC, if (u) tmc_get_registers(stepperU, n)); + TERN_(V_IS_TRINAMIC, if (v) tmc_get_registers(stepperV, n)); + TERN_(W_IS_TRINAMIC, if (w) tmc_get_registers(stepperW, n)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - tmc_get_registers(stepperE0, n); - #endif - #if AXIS_IS_TMC(E1) - tmc_get_registers(stepperE1, n); - #endif - #if AXIS_IS_TMC(E2) - tmc_get_registers(stepperE2, n); - #endif - #if AXIS_IS_TMC(E3) - tmc_get_registers(stepperE3, n); - #endif - #if AXIS_IS_TMC(E4) - tmc_get_registers(stepperE4, n); - #endif - #if AXIS_IS_TMC(E5) - tmc_get_registers(stepperE5, n); - #endif - #if AXIS_IS_TMC(E6) - tmc_get_registers(stepperE6, n); - #endif - #if AXIS_IS_TMC(E7) - tmc_get_registers(stepperE7, n); - #endif + TERN_(E0_IS_TRINAMIC, tmc_get_registers(stepperE0, n)); + TERN_(E1_IS_TRINAMIC, tmc_get_registers(stepperE1, n)); + TERN_(E2_IS_TRINAMIC, tmc_get_registers(stepperE2, n)); + TERN_(E3_IS_TRINAMIC, tmc_get_registers(stepperE3, n)); + TERN_(E4_IS_TRINAMIC, tmc_get_registers(stepperE4, n)); + TERN_(E5_IS_TRINAMIC, tmc_get_registers(stepperE5, n)); + TERN_(E6_IS_TRINAMIC, tmc_get_registers(stepperE6, n)); + TERN_(E7_IS_TRINAMIC, tmc_get_registers(stepperE7, n)); } SERIAL_EOL(); @@ -1243,82 +1054,38 @@ void test_tmc_connection(LOGICAL_AXIS_ARGS_LC(const bool)) { uint8_t axis_connection = 0; if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - axis_connection += test_connection(stepperX); - #endif - #if AXIS_IS_TMC(X2) - axis_connection += test_connection(stepperX2); - #endif + TERN_(X_IS_TRINAMIC, axis_connection += test_connection(stepperX)); + TERN_(X2_IS_TRINAMIC, axis_connection += test_connection(stepperX2)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - axis_connection += test_connection(stepperY); - #endif - #if AXIS_IS_TMC(Y2) - axis_connection += test_connection(stepperY2); - #endif + TERN_(Y_IS_TRINAMIC, axis_connection += test_connection(stepperY)); + TERN_(Y2_IS_TRINAMIC, axis_connection += test_connection(stepperY2)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - axis_connection += test_connection(stepperZ); - #endif - #if AXIS_IS_TMC(Z2) - axis_connection += test_connection(stepperZ2); - #endif - #if AXIS_IS_TMC(Z3) - axis_connection += test_connection(stepperZ3); - #endif - #if AXIS_IS_TMC(Z4) - axis_connection += test_connection(stepperZ4); - #endif + TERN_(Z_IS_TRINAMIC, axis_connection += test_connection(stepperZ)); + TERN_(Z2_IS_TRINAMIC, axis_connection += test_connection(stepperZ2)); + TERN_(Z3_IS_TRINAMIC, axis_connection += test_connection(stepperZ3)); + TERN_(Z4_IS_TRINAMIC, axis_connection += test_connection(stepperZ4)); } - #if AXIS_IS_TMC(I) - if (i) axis_connection += test_connection(stepperI); - #endif - #if AXIS_IS_TMC(J) - if (j) axis_connection += test_connection(stepperJ); - #endif - #if AXIS_IS_TMC(K) - if (k) axis_connection += test_connection(stepperK); - #endif - #if AXIS_IS_TMC(U) - if (u) axis_connection += test_connection(stepperU); - #endif - #if AXIS_IS_TMC(V) - if (v) axis_connection += test_connection(stepperV); - #endif - #if AXIS_IS_TMC(W) - if (w) axis_connection += test_connection(stepperW); - #endif + TERN_(I_IS_TRINAMIC, if (i) axis_connection += test_connection(stepperI)); + TERN_(J_IS_TRINAMIC, if (j) axis_connection += test_connection(stepperJ)); + TERN_(K_IS_TRINAMIC, if (k) axis_connection += test_connection(stepperK)); + TERN_(U_IS_TRINAMIC, if (u) axis_connection += test_connection(stepperU)); + TERN_(V_IS_TRINAMIC, if (v) axis_connection += test_connection(stepperV)); + TERN_(W_IS_TRINAMIC, if (w) axis_connection += test_connection(stepperW)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - axis_connection += test_connection(stepperE0); - #endif - #if AXIS_IS_TMC(E1) - axis_connection += test_connection(stepperE1); - #endif - #if AXIS_IS_TMC(E2) - axis_connection += test_connection(stepperE2); - #endif - #if AXIS_IS_TMC(E3) - axis_connection += test_connection(stepperE3); - #endif - #if AXIS_IS_TMC(E4) - axis_connection += test_connection(stepperE4); - #endif - #if AXIS_IS_TMC(E5) - axis_connection += test_connection(stepperE5); - #endif - #if AXIS_IS_TMC(E6) - axis_connection += test_connection(stepperE6); - #endif - #if AXIS_IS_TMC(E7) - axis_connection += test_connection(stepperE7); - #endif + TERN_(E0_IS_TRINAMIC, axis_connection += test_connection(stepperE0)); + TERN_(E1_IS_TRINAMIC, axis_connection += test_connection(stepperE1)); + TERN_(E2_IS_TRINAMIC, axis_connection += test_connection(stepperE2)); + TERN_(E3_IS_TRINAMIC, axis_connection += test_connection(stepperE3)); + TERN_(E4_IS_TRINAMIC, axis_connection += test_connection(stepperE4)); + TERN_(E5_IS_TRINAMIC, axis_connection += test_connection(stepperE5)); + TERN_(E6_IS_TRINAMIC, axis_connection += test_connection(stepperE6)); + TERN_(E7_IS_TRINAMIC, axis_connection += test_connection(stepperE7)); } if (axis_connection) LCD_MESSAGE(MSG_ERROR_TMC); diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 85d27e14e8..6c8af9ddb0 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -88,10 +88,8 @@ fr_mm_s = HYPOT(minfr, minfr); // Set homing current to X and Y axis if defined - #if HAS_CURRENT_HOME(X) - set_homing_current(X_AXIS); - #endif - #if HAS_CURRENT_HOME(Y) && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) + TERN_(X_HAS_HOME_CURRENT, set_homing_current(X_AXIS)); + #if Y_HAS_HOME_CURRENT && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) set_homing_current(Y_AXIS); #endif @@ -113,10 +111,8 @@ current_position.set(0.0, 0.0); - #if HAS_CURRENT_HOME(X) - restore_homing_current(X_AXIS); - #endif - #if HAS_CURRENT_HOME(Y) && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) + TERN_(X_HAS_HOME_CURRENT, restore_homing_current(X_AXIS)); + #if Y_HAS_HOME_CURRENT && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) restore_homing_current(Y_AXIS); #endif diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp index 9a0cb0054b..0654eb0ec9 100644 --- a/Marlin/src/gcode/calibrate/G34.cpp +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -95,37 +95,36 @@ void GcodeSuite::G34() { #if HAS_MOTOR_CURRENT_SPI const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS]; + const uint32_t previous_current_Z = stepper.motor_current_setting[Z_AXIS]; stepper.set_digipot_current(Z_AXIS, target_current); #elif HAS_MOTOR_CURRENT_PWM const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - const uint32_t previous_current = stepper.motor_current_setting[1]; // Z + const uint32_t previous_current_Z = stepper.motor_current_setting[1]; // Z stepper.set_digipot_current(1, target_current); #elif HAS_MOTOR_CURRENT_DAC const float target_current = parser.floatval('S', GANTRY_CALIBRATION_CURRENT); - const float previous_current = dac_amps(Z_AXIS, target_current); + const float previous_current_Z = dac_amps(Z_AXIS, target_current); stepper_dac.set_current_value(Z_AXIS, target_current); #elif HAS_MOTOR_CURRENT_I2C const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - previous_current = dac_amps(Z_AXIS); + const float previous_current_Z = dac_amps(Z_AXIS); digipot_i2c.set_current(Z_AXIS, target_current) #elif HAS_TRINAMIC_CONFIG const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - static uint16_t previous_current_arr[NUM_Z_STEPPERS]; - #if AXIS_IS_TMC(Z) - previous_current_arr[0] = stepperZ.getMilliamps(); + #if Z_IS_TRINAMIC + static uint16_t previous_current_Z = stepperZ.getMilliamps(); stepperZ.rms_current(target_current); #endif - #if AXIS_IS_TMC(Z2) - previous_current_arr[1] = stepperZ2.getMilliamps(); + #if Z2_IS_TRINAMIC + static uint16_t previous_current_Z2 = stepperZ2.getMilliamps(); stepperZ2.rms_current(target_current); #endif - #if AXIS_IS_TMC(Z3) - previous_current_arr[2] = stepperZ3.getMilliamps(); + #if Z3_IS_TRINAMIC + static uint16_t previous_current_Z3 = stepperZ3.getMilliamps(); stepperZ3.rms_current(target_current); #endif - #if AXIS_IS_TMC(Z4) - previous_current_arr[3] = stepperZ4.getMilliamps(); + #if Z4_IS_TRINAMIC + static uint16_t previous_current_Z4 = stepperZ4.getMilliamps(); stepperZ4.rms_current(target_current); #endif #endif @@ -140,26 +139,18 @@ void GcodeSuite::G34() { #endif #if HAS_MOTOR_CURRENT_SPI - stepper.set_digipot_current(Z_AXIS, previous_current); + stepper.set_digipot_current(Z_AXIS, previous_current_Z); #elif HAS_MOTOR_CURRENT_PWM - stepper.set_digipot_current(1, previous_current); + stepper.set_digipot_current(1, previous_current_Z); #elif HAS_MOTOR_CURRENT_DAC - stepper_dac.set_current_value(Z_AXIS, previous_current); + stepper_dac.set_current_value(Z_AXIS, previous_current_Z); #elif HAS_MOTOR_CURRENT_I2C - digipot_i2c.set_current(Z_AXIS, previous_current) + digipot_i2c.set_current(Z_AXIS, previous_current_Z) #elif HAS_TRINAMIC_CONFIG - #if AXIS_IS_TMC(Z) - stepperZ.rms_current(previous_current_arr[0]); - #endif - #if AXIS_IS_TMC(Z2) - stepperZ2.rms_current(previous_current_arr[1]); - #endif - #if AXIS_IS_TMC(Z3) - stepperZ3.rms_current(previous_current_arr[2]); - #endif - #if AXIS_IS_TMC(Z4) - stepperZ4.rms_current(previous_current_arr[3]); - #endif + TERN_(Z_IS_TRINAMIC, stepperZ.rms_current(previous_current_Z)); + TERN_(Z2_IS_TRINAMIC, stepperZ2.rms_current(previous_current_Z2)); + TERN_(Z3_IS_TRINAMIC, stepperZ3.rms_current(previous_current_Z3)); + TERN_(Z4_IS_TRINAMIC, stepperZ4.rms_current(previous_current_Z4)); #endif // Back off end plate, back to normal motion range diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp index c0dc456a8a..43d980098e 100644 --- a/Marlin/src/gcode/feature/trinamic/M906.cpp +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -60,173 +60,96 @@ void GcodeSuite::M906() { bool report = true; - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(X2_IS_TRINAMIC, Y2_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) const int8_t index = parser.byteval('I', -1); - #elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + #elif ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC) constexpr int8_t index = -1; #endif LOOP_LOGICAL_AXES(i) if (uint16_t value = parser.intval(AXIS_CHAR(i))) { report = false; switch (i) { - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) + #if X_IS_TRINAMIC || X2_IS_TRINAMIC case X_AXIS: - #if AXIS_IS_TMC(X) - if (index < 0 || index == 0) TMC_SET_CURRENT(X); - #endif - #if AXIS_IS_TMC(X2) - if (index < 0 || index == 1) TMC_SET_CURRENT(X2); - #endif + TERN_(X_IS_TRINAMIC, if (index < 0 || index == 0) TMC_SET_CURRENT(X)); + TERN_(X2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CURRENT(X2)); break; #endif - #if AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) + #if Y_IS_TRINAMIC || Y2_IS_TRINAMIC case Y_AXIS: - #if AXIS_IS_TMC(Y) - if (index < 0 || index == 0) TMC_SET_CURRENT(Y); - #endif - #if AXIS_IS_TMC(Y2) - if (index < 0 || index == 1) TMC_SET_CURRENT(Y2); - #endif + TERN_(Y_IS_TRINAMIC, if (index < 0 || index == 0) TMC_SET_CURRENT(Y)); + TERN_(Y2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CURRENT(Y2)); break; #endif - #if AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(Z_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) case Z_AXIS: - #if AXIS_IS_TMC(Z) - if (index < 0 || index == 0) TMC_SET_CURRENT(Z); - #endif - #if AXIS_IS_TMC(Z2) - if (index < 0 || index == 1) TMC_SET_CURRENT(Z2); - #endif - #if AXIS_IS_TMC(Z3) - if (index < 0 || index == 2) TMC_SET_CURRENT(Z3); - #endif - #if AXIS_IS_TMC(Z4) - if (index < 0 || index == 3) TMC_SET_CURRENT(Z4); - #endif + TERN_(Z_IS_TRINAMIC, if (index < 0 || index == 0) TMC_SET_CURRENT(Z)); + TERN_(Z2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CURRENT(Z2)); + TERN_(Z3_IS_TRINAMIC, if (index < 0 || index == 2) TMC_SET_CURRENT(Z3)); + TERN_(Z4_IS_TRINAMIC, if (index < 0 || index == 3) TMC_SET_CURRENT(Z4)); break; #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC case I_AXIS: TMC_SET_CURRENT(I); break; #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC case J_AXIS: TMC_SET_CURRENT(J); break; #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC case K_AXIS: TMC_SET_CURRENT(K); break; #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC case U_AXIS: TMC_SET_CURRENT(U); break; #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC case V_AXIS: TMC_SET_CURRENT(V); break; #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC case W_AXIS: TMC_SET_CURRENT(W); break; #endif - #if AXIS_IS_TMC(E0) || AXIS_IS_TMC(E1) || AXIS_IS_TMC(E2) || AXIS_IS_TMC(E3) || AXIS_IS_TMC(E4) || AXIS_IS_TMC(E5) || AXIS_IS_TMC(E6) || AXIS_IS_TMC(E7) + #if ANY(E0_IS_TRINAMIC, E1_IS_TRINAMIC, E2_IS_TRINAMIC, E3_IS_TRINAMIC, E4_IS_TRINAMIC, E5_IS_TRINAMIC, E6_IS_TRINAMIC, E7_IS_TRINAMIC) case E_AXIS: { const int8_t eindex = get_target_e_stepper_from_command(-2); - #if AXIS_IS_TMC(E0) - if (eindex < 0 || eindex == 0) TMC_SET_CURRENT(E0); - #endif - #if AXIS_IS_TMC(E1) - if (eindex < 0 || eindex == 1) TMC_SET_CURRENT(E1); - #endif - #if AXIS_IS_TMC(E2) - if (eindex < 0 || eindex == 2) TMC_SET_CURRENT(E2); - #endif - #if AXIS_IS_TMC(E3) - if (eindex < 0 || eindex == 3) TMC_SET_CURRENT(E3); - #endif - #if AXIS_IS_TMC(E4) - if (eindex < 0 || eindex == 4) TMC_SET_CURRENT(E4); - #endif - #if AXIS_IS_TMC(E5) - if (eindex < 0 || eindex == 5) TMC_SET_CURRENT(E5); - #endif - #if AXIS_IS_TMC(E6) - if (eindex < 0 || eindex == 6) TMC_SET_CURRENT(E6); - #endif - #if AXIS_IS_TMC(E7) - if (eindex < 0 || eindex == 7) TMC_SET_CURRENT(E7); - #endif + TERN_(E0_IS_TRINAMIC, if (eindex < 0 || eindex == 0) TMC_SET_CURRENT(E0)); + TERN_(E1_IS_TRINAMIC, if (eindex < 0 || eindex == 1) TMC_SET_CURRENT(E1)); + TERN_(E2_IS_TRINAMIC, if (eindex < 0 || eindex == 2) TMC_SET_CURRENT(E2)); + TERN_(E3_IS_TRINAMIC, if (eindex < 0 || eindex == 3) TMC_SET_CURRENT(E3)); + TERN_(E4_IS_TRINAMIC, if (eindex < 0 || eindex == 4) TMC_SET_CURRENT(E4)); + TERN_(E5_IS_TRINAMIC, if (eindex < 0 || eindex == 5) TMC_SET_CURRENT(E5)); + TERN_(E6_IS_TRINAMIC, if (eindex < 0 || eindex == 6) TMC_SET_CURRENT(E6)); + TERN_(E7_IS_TRINAMIC, if (eindex < 0 || eindex == 7) TMC_SET_CURRENT(E7)); } break; #endif } } if (report) { - #if AXIS_IS_TMC(X) - TMC_SAY_CURRENT(X); - #endif - #if AXIS_IS_TMC(X2) - TMC_SAY_CURRENT(X2); - #endif - #if AXIS_IS_TMC(Y) - TMC_SAY_CURRENT(Y); - #endif - #if AXIS_IS_TMC(Y2) - TMC_SAY_CURRENT(Y2); - #endif - #if AXIS_IS_TMC(Z) - TMC_SAY_CURRENT(Z); - #endif - #if AXIS_IS_TMC(Z2) - TMC_SAY_CURRENT(Z2); - #endif - #if AXIS_IS_TMC(Z3) - TMC_SAY_CURRENT(Z3); - #endif - #if AXIS_IS_TMC(Z4) - TMC_SAY_CURRENT(Z4); - #endif - #if AXIS_IS_TMC(I) - TMC_SAY_CURRENT(I); - #endif - #if AXIS_IS_TMC(J) - TMC_SAY_CURRENT(J); - #endif - #if AXIS_IS_TMC(K) - TMC_SAY_CURRENT(K); - #endif - #if AXIS_IS_TMC(U) - TMC_SAY_CURRENT(U); - #endif - #if AXIS_IS_TMC(V) - TMC_SAY_CURRENT(V); - #endif - #if AXIS_IS_TMC(W) - TMC_SAY_CURRENT(W); - #endif - - #if AXIS_IS_TMC(E0) - TMC_SAY_CURRENT(E0); - #endif - #if AXIS_IS_TMC(E1) - TMC_SAY_CURRENT(E1); - #endif - #if AXIS_IS_TMC(E2) - TMC_SAY_CURRENT(E2); - #endif - #if AXIS_IS_TMC(E3) - TMC_SAY_CURRENT(E3); - #endif - #if AXIS_IS_TMC(E4) - TMC_SAY_CURRENT(E4); - #endif - #if AXIS_IS_TMC(E5) - TMC_SAY_CURRENT(E5); - #endif - #if AXIS_IS_TMC(E6) - TMC_SAY_CURRENT(E6); - #endif - #if AXIS_IS_TMC(E7) - TMC_SAY_CURRENT(E7); - #endif + TERN_(X_IS_TRINAMIC, TMC_SAY_CURRENT(X)); + TERN_(X2_IS_TRINAMIC, TMC_SAY_CURRENT(X2)); + TERN_(Y_IS_TRINAMIC, TMC_SAY_CURRENT(Y)); + TERN_(Y2_IS_TRINAMIC, TMC_SAY_CURRENT(Y2)); + TERN_(Z_IS_TRINAMIC, TMC_SAY_CURRENT(Z)); + TERN_(Z2_IS_TRINAMIC, TMC_SAY_CURRENT(Z2)); + TERN_(Z3_IS_TRINAMIC, TMC_SAY_CURRENT(Z3)); + TERN_(Z4_IS_TRINAMIC, TMC_SAY_CURRENT(Z4)); + TERN_(I_IS_TRINAMIC, TMC_SAY_CURRENT(I)); + TERN_(J_IS_TRINAMIC, TMC_SAY_CURRENT(J)); + TERN_(K_IS_TRINAMIC, TMC_SAY_CURRENT(K)); + TERN_(U_IS_TRINAMIC, TMC_SAY_CURRENT(U)); + TERN_(V_IS_TRINAMIC, TMC_SAY_CURRENT(V)); + TERN_(W_IS_TRINAMIC, TMC_SAY_CURRENT(W)); + TERN_(E0_IS_TRINAMIC, TMC_SAY_CURRENT(E0)); + TERN_(E1_IS_TRINAMIC, TMC_SAY_CURRENT(E1)); + TERN_(E2_IS_TRINAMIC, TMC_SAY_CURRENT(E2)); + TERN_(E3_IS_TRINAMIC, TMC_SAY_CURRENT(E3)); + TERN_(E4_IS_TRINAMIC, TMC_SAY_CURRENT(E4)); + TERN_(E5_IS_TRINAMIC, TMC_SAY_CURRENT(E5)); + TERN_(E6_IS_TRINAMIC, TMC_SAY_CURRENT(E6)); + TERN_(E7_IS_TRINAMIC, TMC_SAY_CURRENT(E7)); } } @@ -240,93 +163,67 @@ void GcodeSuite::M906_report(const bool forReplay/*=true*/) { SERIAL_ECHOPGM(" M906"); }; - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) \ - || AXIS_IS_TMC(I) || AXIS_IS_TMC(J) || AXIS_IS_TMC(K) \ - || AXIS_IS_TMC(U) || AXIS_IS_TMC(V) || AXIS_IS_TMC(W) + #if ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC, I_IS_TRINAMIC, J_IS_TRINAMIC, K_IS_TRINAMIC, U_IS_TRINAMIC, V_IS_TRINAMIC, W_IS_TRINAMIC) say_M906(forReplay); - #if AXIS_IS_TMC(X) - SERIAL_ECHOPGM_P(SP_X_STR, stepperX.getMilliamps()); - #endif - #if AXIS_IS_TMC(Y) - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.getMilliamps()); - #endif - #if AXIS_IS_TMC(Z) - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.getMilliamps()); - #endif - #if AXIS_IS_TMC(I) - SERIAL_ECHOPGM_P(SP_I_STR, stepperI.getMilliamps()); - #endif - #if AXIS_IS_TMC(J) - SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.getMilliamps()); - #endif - #if AXIS_IS_TMC(K) - SERIAL_ECHOPGM_P(SP_K_STR, stepperK.getMilliamps()); - #endif - #if AXIS_IS_TMC(U) - SERIAL_ECHOPGM_P(SP_U_STR, stepperU.getMilliamps()); - #endif - #if AXIS_IS_TMC(V) - SERIAL_ECHOPGM_P(SP_V_STR, stepperV.getMilliamps()); - #endif - #if AXIS_IS_TMC(W) - SERIAL_ECHOPGM_P(SP_W_STR, stepperW.getMilliamps()); - #endif + TERN_(X_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_X_STR, stepperX.getMilliamps())); + TERN_(Y_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.getMilliamps())); + TERN_(Z_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.getMilliamps())); + TERN_(I_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_I_STR, stepperI.getMilliamps())); + TERN_(J_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.getMilliamps())); + TERN_(K_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_K_STR, stepperK.getMilliamps())); + TERN_(U_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_U_STR, stepperU.getMilliamps())); + TERN_(V_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_V_STR, stepperV.getMilliamps())); + TERN_(W_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_W_STR, stepperW.getMilliamps())); SERIAL_EOL(); #endif - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) + #if X2_IS_TRINAMIC || Y2_IS_TRINAMIC || Z2_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOPGM(" I1"); - #if AXIS_IS_TMC(X2) - SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.getMilliamps()); - #endif - #if AXIS_IS_TMC(Y2) - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.getMilliamps()); - #endif - #if AXIS_IS_TMC(Z2) - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.getMilliamps()); - #endif + TERN_(X2_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.getMilliamps())); + TERN_(Y2_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.getMilliamps())); + TERN_(Z2_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.getMilliamps())); SERIAL_EOL(); #endif - #if AXIS_IS_TMC(Z3) + #if Z3_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" I2 Z", stepperZ3.getMilliamps()); #endif - #if AXIS_IS_TMC(Z4) + #if Z4_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" I3 Z", stepperZ4.getMilliamps()); #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T0 E", stepperE0.getMilliamps()); #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T1 E", stepperE1.getMilliamps()); #endif - #if AXIS_IS_TMC(E2) + #if E2_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T2 E", stepperE2.getMilliamps()); #endif - #if AXIS_IS_TMC(E3) + #if E3_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T3 E", stepperE3.getMilliamps()); #endif - #if AXIS_IS_TMC(E4) + #if E4_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T4 E", stepperE4.getMilliamps()); #endif - #if AXIS_IS_TMC(E5) + #if E5_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T5 E", stepperE5.getMilliamps()); #endif - #if AXIS_IS_TMC(E6) + #if E6_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T6 E", stepperE6.getMilliamps()); #endif - #if AXIS_IS_TMC(E7) + #if E7_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T7 E", stepperE7.getMilliamps()); #endif diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp index ba6d9538a4..f4b0ac3670 100644 --- a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp +++ b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp @@ -274,7 +274,23 @@ } /** - * M913: Set HYBRID_THRESHOLD speed. + * M913: Set HYBRID_THRESHOLD speed, aka PWM Threshold. + * + * Parameters: + * I - For multi-stepper axes, the one-based index of the stepper to modify in each set + * + * E - Set threshold for one or more Extruders + * T - The zero-based index of the Extruder to modify + * + * X - Set threshold for one or more X axis steppers + * Y - Set threshold for one or more Y axis steppers + * Z - Set threshold for one or more Z axis steppers + * A - Set threshold for one or more A axis steppers + * B - Set threshold for one or more B axis steppers + * C - Set threshold for one or more C axis steppers + * U - Set threshold for one or more U axis steppers + * V - Set threshold for one or more V axis steppers + * W - Set threshold for one or more W axis steppers */ void GcodeSuite::M913() { #define TMC_SAY_PWMTHRS(A,Q) tmc_print_pwmthrs(stepper##Q) @@ -283,9 +299,9 @@ #define TMC_SET_PWMTHRS_E(E) stepperE##E.set_pwm_thrs(value) bool report = true; - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(X2_IS_TRINAMIC, Y2_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) const uint8_t index = parser.byteval('I'); - #elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + #elif ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC) constexpr uint8_t index = 0; #endif LOOP_LOGICAL_AXES(i) if (int32_t value = parser.longval(AXIS_CHAR(i))) { @@ -387,70 +403,37 @@ SERIAL_ECHOPGM(" M913"); }; - #if X_HAS_STEALTHCHOP || Y_HAS_STEALTHCHOP || Z_HAS_STEALTHCHOP + #if ANY(X_HAS_STEALTHCHOP, Y_HAS_STEALTHCHOP, Z_HAS_STEALTHCHOP, I_HAS_STEALTHCHOP, J_HAS_STEALTHCHOP, K_HAS_STEALTHCHOP, U_HAS_STEALTHCHOP, V_HAS_STEALTHCHOP, W_HAS_STEALTHCHOP) say_M913(forReplay); - #if X_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_X_STR, stepperX.get_pwm_thrs()); - #endif - #if Y_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.get_pwm_thrs()); - #endif - #if Z_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.get_pwm_thrs()); - #endif + TERN_(X_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_X_STR, stepperX.get_pwm_thrs())); + TERN_(Y_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.get_pwm_thrs())); + TERN_(Z_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.get_pwm_thrs())); + TERN_(I_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_I_STR, stepperI.get_pwm_thrs())); + TERN_(J_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.get_pwm_thrs())); + TERN_(K_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_K_STR, stepperK.get_pwm_thrs())); + TERN_(U_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_U_STR, stepperU.get_pwm_thrs())); + TERN_(V_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_V_STR, stepperV.get_pwm_thrs())); + TERN_(W_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_W_STR, stepperW.get_pwm_thrs())); SERIAL_EOL(); #endif #if X2_HAS_STEALTHCHOP || Y2_HAS_STEALTHCHOP || Z2_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOPGM(" I2"); - #if X2_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.get_pwm_thrs()); - #endif - #if Y2_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.get_pwm_thrs()); - #endif - #if Z2_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.get_pwm_thrs()); - #endif + TERN_(X2_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.get_pwm_thrs())); + TERN_(Y2_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.get_pwm_thrs())); + TERN_(Z2_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.get_pwm_thrs())); SERIAL_EOL(); #endif - #if Z3_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOLNPGM(" I3 Z", stepperZ3.get_pwm_thrs()); #endif - #if Z4_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOLNPGM(" I4 Z", stepperZ4.get_pwm_thrs()); #endif - #if I_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_I_STR, stepperI.get_pwm_thrs()); - #endif - #if J_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_J_STR, stepperJ.get_pwm_thrs()); - #endif - #if K_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_K_STR, stepperK.get_pwm_thrs()); - #endif - #if U_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_U_STR, stepperU.get_pwm_thrs()); - #endif - #if V_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_V_STR, stepperV.get_pwm_thrs()); - #endif - #if W_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_W_STR, stepperW.get_pwm_thrs()); - #endif - #if E0_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOLNPGM(" T0 E", stepperE0.get_pwm_thrs()); @@ -498,7 +481,19 @@ } /** - * M914: Set StallGuard sensitivity. + * M914: Set StallGuard sensitivity in terms of "homing threshold" (not for stall detection during printing). + * + * Parameters: + * I - For multi-stepper axes, the one-based index of the stepper to modify in each set + * X - Set threshold for one or more X axis steppers + * Y - Set threshold for one or more Y axis steppers + * Z - Set threshold for one or more Z axis steppers + * A - Set threshold for one or more A axis steppers + * B - Set threshold for one or more B axis steppers + * C - Set threshold for one or more C axis steppers + * U - Set threshold for one or more U axis steppers + * V - Set threshold for one or more V axis steppers + * W - Set threshold for one or more W axis steppers */ void GcodeSuite::M914() { bool report = true; @@ -536,33 +531,33 @@ #if K_SENSORLESS case K_AXIS: stepperK.homing_threshold(value); break; #endif - #if U_SENSORLESS && AXIS_HAS_STALLGUARD(U) + #if U_SENSORLESS case U_AXIS: stepperU.homing_threshold(value); break; #endif - #if V_SENSORLESS && AXIS_HAS_STALLGUARD(V) + #if V_SENSORLESS case V_AXIS: stepperV.homing_threshold(value); break; #endif - #if W_SENSORLESS && AXIS_HAS_STALLGUARD(W) + #if W_SENSORLESS case W_AXIS: stepperW.homing_threshold(value); break; #endif } } if (report) { - TERN_(X_SENSORLESS, tmc_print_sgt(stepperX)); + TERN_( X_SENSORLESS, tmc_print_sgt(stepperX)); TERN_(X2_SENSORLESS, tmc_print_sgt(stepperX2)); - TERN_(Y_SENSORLESS, tmc_print_sgt(stepperY)); + TERN_( Y_SENSORLESS, tmc_print_sgt(stepperY)); TERN_(Y2_SENSORLESS, tmc_print_sgt(stepperY2)); - TERN_(Z_SENSORLESS, tmc_print_sgt(stepperZ)); + TERN_( Z_SENSORLESS, tmc_print_sgt(stepperZ)); TERN_(Z2_SENSORLESS, tmc_print_sgt(stepperZ2)); TERN_(Z3_SENSORLESS, tmc_print_sgt(stepperZ3)); TERN_(Z4_SENSORLESS, tmc_print_sgt(stepperZ4)); - TERN_(I_SENSORLESS, tmc_print_sgt(stepperI)); - TERN_(J_SENSORLESS, tmc_print_sgt(stepperJ)); - TERN_(K_SENSORLESS, tmc_print_sgt(stepperK)); - TERN_(U_SENSORLESS, tmc_print_sgt(stepperU)); - TERN_(V_SENSORLESS, tmc_print_sgt(stepperV)); - TERN_(W_SENSORLESS, tmc_print_sgt(stepperW)); + TERN_( I_SENSORLESS, tmc_print_sgt(stepperI)); + TERN_( J_SENSORLESS, tmc_print_sgt(stepperJ)); + TERN_( K_SENSORLESS, tmc_print_sgt(stepperK)); + TERN_( U_SENSORLESS, tmc_print_sgt(stepperU)); + TERN_( V_SENSORLESS, tmc_print_sgt(stepperV)); + TERN_( W_SENSORLESS, tmc_print_sgt(stepperW)); } } @@ -578,67 +573,34 @@ #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS say_M914(forReplay); - #if X_SENSORLESS - SERIAL_ECHOPGM_P(SP_X_STR, stepperX.homing_threshold()); - #endif - #if Y_SENSORLESS - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.homing_threshold()); - #endif - #if Z_SENSORLESS - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.homing_threshold()); - #endif + TERN_(X_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, stepperX.homing_threshold())); + TERN_(Y_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.homing_threshold())); + TERN_(Z_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.homing_threshold())); + TERN_(I_SENSORLESS, SERIAL_ECHOPGM_P(SP_I_STR, stepperI.homing_threshold())); + TERN_(J_SENSORLESS, SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.homing_threshold())); + TERN_(K_SENSORLESS, SERIAL_ECHOPGM_P(SP_K_STR, stepperK.homing_threshold())); + TERN_(U_SENSORLESS, SERIAL_ECHOPGM_P(SP_U_STR, stepperU.homing_threshold())); + TERN_(V_SENSORLESS, SERIAL_ECHOPGM_P(SP_V_STR, stepperV.homing_threshold())); + TERN_(W_SENSORLESS, SERIAL_ECHOPGM_P(SP_W_STR, stepperW.homing_threshold())); SERIAL_EOL(); #endif #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS say_M914(forReplay); SERIAL_ECHOPGM(" I2"); - #if X2_SENSORLESS - SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.homing_threshold()); - #endif - #if Y2_SENSORLESS - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.homing_threshold()); - #endif - #if Z2_SENSORLESS - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.homing_threshold()); - #endif + TERN_(X2_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.homing_threshold())); + TERN_(Y2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.homing_threshold())); + TERN_(Z2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.homing_threshold())); SERIAL_EOL(); #endif - #if Z3_SENSORLESS say_M914(forReplay); SERIAL_ECHOLNPGM(" I3 Z", stepperZ3.homing_threshold()); #endif - #if Z4_SENSORLESS say_M914(forReplay); SERIAL_ECHOLNPGM(" I4 Z", stepperZ4.homing_threshold()); #endif - - #if I_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_I_STR, stepperI.homing_threshold()); - #endif - #if J_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_J_STR, stepperJ.homing_threshold()); - #endif - #if K_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_K_STR, stepperK.homing_threshold()); - #endif - #if U_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_U_STR, stepperU.homing_threshold()); - #endif - #if V_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_V_STR, stepperV.homing_threshold()); - #endif - #if W_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_W_STR, stepperW.homing_threshold()); - #endif } #endif // USE_SENSORLESS diff --git a/Marlin/src/gcode/feature/trinamic/M919.cpp b/Marlin/src/gcode/feature/trinamic/M919.cpp index 98227c7125..cabb30d7ff 100644 --- a/Marlin/src/gcode/feature/trinamic/M919.cpp +++ b/Marlin/src/gcode/feature/trinamic/M919.cpp @@ -91,9 +91,9 @@ void GcodeSuite::M919() { if (err) return; - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(X2_IS_TRINAMIC, Y2_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) const int8_t index = parser.byteval('I'); - #elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + #elif ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC) constexpr int8_t index = -1; #endif @@ -107,7 +107,7 @@ void GcodeSuite::M919() { #define TMC_SET_CHOPPER_TIME(Q) stepper##Q.set_chopper_times(make_chopper_timing(CHOPPER_TIMING_##Q, toff, hend, hstrt)) - #if AXIS_IS_TMC(E0) || AXIS_IS_TMC(E1) || AXIS_IS_TMC(E2) || AXIS_IS_TMC(E3) || AXIS_IS_TMC(E4) || AXIS_IS_TMC(E5) || AXIS_IS_TMC(E6) || AXIS_IS_TMC(E7) + #if ANY(E0_IS_TRINAMIC, E1_IS_TRINAMIC, E2_IS_TRINAMIC, E3_IS_TRINAMIC, E4_IS_TRINAMIC, E5_IS_TRINAMIC, E6_IS_TRINAMIC, E7_IS_TRINAMIC) #define HAS_E_CHOPPER 1 int8_t eindex = -1; #endif @@ -121,163 +121,66 @@ void GcodeSuite::M919() { SERIAL_ECHOLNPGM(GCODE_ERR_MSG("Axis ", C(AXIS_CHAR(i)), " has no TMC drivers.")); break; - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) + #if X_IS_TRINAMIC || X2_IS_TRINAMIC case X_AXIS: - #if AXIS_IS_TMC(X) - if (index <= 0) TMC_SET_CHOPPER_TIME(X); - #endif - #if AXIS_IS_TMC(X2) - if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(X2); - #endif + TERN_(X_IS_TRINAMIC, if (index <= 0) TMC_SET_CHOPPER_TIME(X)); + TERN_(X2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(X2)); break; #endif - #if AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) + #if Y_IS_TRINAMIC || Y2_IS_TRINAMIC case Y_AXIS: - #if AXIS_IS_TMC(Y) - if (index <= 0) TMC_SET_CHOPPER_TIME(Y); - #endif - #if AXIS_IS_TMC(Y2) - if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Y2); - #endif + TERN_(Y_IS_TRINAMIC, if (index <= 0) TMC_SET_CHOPPER_TIME(Y)); + TERN_(Y2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Y2)); break; #endif - #if AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(Z_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) case Z_AXIS: - #if AXIS_IS_TMC(Z) - if (index <= 0) TMC_SET_CHOPPER_TIME(Z); - #endif - #if AXIS_IS_TMC(Z2) - if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Z2); - #endif - #if AXIS_IS_TMC(Z3) - if (index < 0 || index == 2) TMC_SET_CHOPPER_TIME(Z3); - #endif - #if AXIS_IS_TMC(Z4) - if (index < 0 || index == 3) TMC_SET_CHOPPER_TIME(Z4); - #endif + TERN_(Z_IS_TRINAMIC, if (index <= 0) TMC_SET_CHOPPER_TIME(Z)); + TERN_(Z2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Z2)); + TERN_(Z3_IS_TRINAMIC, if (index < 0 || index == 2) TMC_SET_CHOPPER_TIME(Z3)); + TERN_(Z4_IS_TRINAMIC, if (index < 0 || index == 3) TMC_SET_CHOPPER_TIME(Z4)); break; #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC case I_AXIS: TMC_SET_CHOPPER_TIME(I); break; #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC case J_AXIS: TMC_SET_CHOPPER_TIME(J); break; #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC case K_AXIS: TMC_SET_CHOPPER_TIME(K); break; #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC case U_AXIS: TMC_SET_CHOPPER_TIME(U); break; #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC case V_AXIS: TMC_SET_CHOPPER_TIME(V); break; #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC case W_AXIS: TMC_SET_CHOPPER_TIME(W); break; #endif #if HAS_E_CHOPPER case E_AXIS: { - #if AXIS_IS_TMC(E0) - if (eindex <= 0) TMC_SET_CHOPPER_TIME(E0); - #endif - #if AXIS_IS_TMC(E1) - if (eindex < 0 || eindex == 1) TMC_SET_CHOPPER_TIME(E1); - #endif - #if AXIS_IS_TMC(E2) - if (eindex < 0 || eindex == 2) TMC_SET_CHOPPER_TIME(E2); - #endif - #if AXIS_IS_TMC(E3) - if (eindex < 0 || eindex == 3) TMC_SET_CHOPPER_TIME(E3); - #endif - #if AXIS_IS_TMC(E4) - if (eindex < 0 || eindex == 4) TMC_SET_CHOPPER_TIME(E4); - #endif - #if AXIS_IS_TMC(E5) - if (eindex < 0 || eindex == 5) TMC_SET_CHOPPER_TIME(E5); - #endif - #if AXIS_IS_TMC(E6) - if (eindex < 0 || eindex == 6) TMC_SET_CHOPPER_TIME(E6); - #endif - #if AXIS_IS_TMC(E7) - if (eindex < 0 || eindex == 7) TMC_SET_CHOPPER_TIME(E7); - #endif + TERN_(E0_IS_TRINAMIC, if (eindex <= 0) TMC_SET_CHOPPER_TIME(E0)); + TERN_(E1_IS_TRINAMIC, if (eindex < 0 || eindex == 1) TMC_SET_CHOPPER_TIME(E1)); + TERN_(E2_IS_TRINAMIC, if (eindex < 0 || eindex == 2) TMC_SET_CHOPPER_TIME(E2)); + TERN_(E3_IS_TRINAMIC, if (eindex < 0 || eindex == 3) TMC_SET_CHOPPER_TIME(E3)); + TERN_(E4_IS_TRINAMIC, if (eindex < 0 || eindex == 4) TMC_SET_CHOPPER_TIME(E4)); + TERN_(E5_IS_TRINAMIC, if (eindex < 0 || eindex == 5) TMC_SET_CHOPPER_TIME(E5)); + TERN_(E6_IS_TRINAMIC, if (eindex < 0 || eindex == 6) TMC_SET_CHOPPER_TIME(E6)); + TERN_(E7_IS_TRINAMIC, if (eindex < 0 || eindex == 7) TMC_SET_CHOPPER_TIME(E7)); } break; #endif } } if (report) { - #define TMC_SAY_CHOPPER_TIME(Q) tmc_print_chopper_time(stepper##Q) - #if AXIS_IS_TMC(X) - TMC_SAY_CHOPPER_TIME(X); - #endif - #if AXIS_IS_TMC(X2) - TMC_SAY_CHOPPER_TIME(X2); - #endif - #if AXIS_IS_TMC(Y) - TMC_SAY_CHOPPER_TIME(Y); - #endif - #if AXIS_IS_TMC(Y2) - TMC_SAY_CHOPPER_TIME(Y2); - #endif - #if AXIS_IS_TMC(Z) - TMC_SAY_CHOPPER_TIME(Z); - #endif - #if AXIS_IS_TMC(Z2) - TMC_SAY_CHOPPER_TIME(Z2); - #endif - #if AXIS_IS_TMC(Z3) - TMC_SAY_CHOPPER_TIME(Z3); - #endif - #if AXIS_IS_TMC(Z4) - TMC_SAY_CHOPPER_TIME(Z4); - #endif - #if AXIS_IS_TMC(I) - TMC_SAY_CHOPPER_TIME(I); - #endif - #if AXIS_IS_TMC(J) - TMC_SAY_CHOPPER_TIME(J); - #endif - #if AXIS_IS_TMC(K) - TMC_SAY_CHOPPER_TIME(K); - #endif - #if AXIS_IS_TMC(U) - TMC_SAY_CHOPPER_TIME(U); - #endif - #if AXIS_IS_TMC(V) - TMC_SAY_CHOPPER_TIME(V); - #endif - #if AXIS_IS_TMC(W) - TMC_SAY_CHOPPER_TIME(W); - #endif - #if AXIS_IS_TMC(E0) - TMC_SAY_CHOPPER_TIME(E0); - #endif - #if AXIS_IS_TMC(E1) - TMC_SAY_CHOPPER_TIME(E1); - #endif - #if AXIS_IS_TMC(E2) - TMC_SAY_CHOPPER_TIME(E2); - #endif - #if AXIS_IS_TMC(E3) - TMC_SAY_CHOPPER_TIME(E3); - #endif - #if AXIS_IS_TMC(E4) - TMC_SAY_CHOPPER_TIME(E4); - #endif - #if AXIS_IS_TMC(E5) - TMC_SAY_CHOPPER_TIME(E5); - #endif - #if AXIS_IS_TMC(E6) - TMC_SAY_CHOPPER_TIME(E6); - #endif - #if AXIS_IS_TMC(E7) - TMC_SAY_CHOPPER_TIME(E7); - #endif + #define TMC_SAY_CHOPPER_TIME(Q) OPTCODE(Q##_IS_TRINAMIC, tmc_print_chopper_time(stepper##Q)) + MAP(TMC_SAY_CHOPPER_TIME, ALL_AXIS_NAMES) } } diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 69d77e875e..64326b32af 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -139,6 +139,7 @@ int8_t GcodeSuite::get_target_extruder_from_command() { * Get the target E stepper from the 'T' parameter. * If there is no 'T' parameter then dval will be substituted. * Returns -1 if the resulting E stepper index is out of range. + * Use a default of -2 for silent failure. */ int8_t GcodeSuite::get_target_e_stepper_from_command(const int8_t dval/*=-1*/) { const int8_t e = parser.intval('T', dval); diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 1f3ccba37c..7ba1c58d2a 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -159,7 +159,7 @@ * M120 - Enable endstops detection. * M121 - Disable endstops detection. * - * M122 - Debug stepper (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M122 - Debug stepper (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660)) * M123 - Report fan tachometers. (Requires En_FAN_TACHO_PIN) Optionally set auto-report interval. (Requires AUTO_REPORT_FANS) * M125 - Save current position and move to filament change position. (Requires PARK_HEAD_ON_PAUSE) * @@ -265,7 +265,7 @@ * M552 - Get or set IP address. Enable/disable network interface. (Requires enabled Ethernet port) * M553 - Get or set IP netmask. (Requires enabled Ethernet port) * M554 - Get or set IP gateway. (Requires enabled Ethernet port) - * M569 - Enable stealthChop on an axis. (Requires at least one _DRIVER_TYPE to be TMC2130/2160/2208/2209/5130/5160) + * M569 - Enable stealthChop on an axis. (Requires *_DRIVER_TYPE TMC(2130|2160|2208|2209|5130|5160)) * M575 - Change the serial baud rate. (Requires BAUD_RATE_GCODE) * M592 - Get or set Nonlinear Extrusion parameters. (Requires NONLINEAR_EXTRUSION) * M593 - Get or set input shaping parameters. (Requires INPUT_SHAPING_[XY]) @@ -308,17 +308,18 @@ * * M871 - Print/reset/clear first layer temperature offset values. (Requires PTC_PROBE, PTC_BED, or PTC_HOTEND) * M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT and not EMERGENCY_PARSER) - * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) - * M906 - Set or get motor current in milliamps using axis codes XYZE, etc. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M900 - Set or Report Linear Advance K-factor. (Requires LIN_ADVANCE) + * M906 - Set or Report motor current in milliamps using axis codes XYZE, etc. Report values if no axis codes given. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660)) * M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots) * M908 - Control digital trimpot directly. (Requires HAS_MOTOR_CURRENT_DAC or DIGIPOTSS_PIN) * M909 - Print digipot/DAC current value. (Requires HAS_MOTOR_CURRENT_DAC) * M910 - Commit digipot/DAC value to external EEPROM via I2C. (Requires HAS_MOTOR_CURRENT_DAC) - * M911 - Report stepper driver overtemperature pre-warn condition. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) - * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M911 - Report stepper driver overtemperature pre-warn condition. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660)) + * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660)) * M913 - Set HYBRID_THRESHOLD speed. (Requires HYBRID_THRESHOLD) * M914 - Set StallGuard sensitivity. (Requires SENSORLESS_HOMING or SENSORLESS_PROBING) - * M919 - Get or Set motor Chopper Times (time_off, hysteresis_end, hysteresis_start) using axis codes XYZE, etc. If no parameters are given, report. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M919 - Set or Report motor Chopper Times (time_off, hysteresis_end, hysteresis_start) using axis codes XYZE, etc. + * If no parameters are given, report. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660)) * M936 - OTA update firmware. (Requires OTA_FIRMWARE_UPDATE) * M951 - Set Magnetic Parking Extruder parameters. (Requires MAGNETIC_PARKING_EXTRUDER) * M3426 - Read MCP3426 ADC over I2C. (Requires HAS_MCP3426_ADC) diff --git a/Marlin/src/inc/Conditionals-4-adv.h b/Marlin/src/inc/Conditionals-4-adv.h index b697f22a20..eaa8aca5b0 100644 --- a/Marlin/src/inc/Conditionals-4-adv.h +++ b/Marlin/src/inc/Conditionals-4-adv.h @@ -1307,8 +1307,75 @@ #endif #endif +#if AXIS_IS_TMC(X) + #define X_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Y) + #define Y_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z) + #define Z_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(I) + #define I_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(J) + #define J_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(K) + #define K_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(U) + #define U_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(V) + #define V_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(W) + #define W_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(X2) + #define X2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Y2) + #define Y2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z2) + #define Z2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z3) + #define Z3_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z4) + #define Z4_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E0) + #define E0_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E1) + #define E1_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E2) + #define E2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E3) + #define E3_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E4) + #define E4_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E5) + #define E5_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E6) + #define E6_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E7) + #define E7_IS_TRINAMIC 1 +#endif + // Test for edge stepping on any axis -#define AXIS_HAS_DEDGE(A) (ENABLED(EDGE_STEPPING) && AXIS_IS_TMC(A)) +#define AXIS_HAS_DEDGE(A) ALL(EDGE_STEPPING, A##_IS_TRINAMIC) #if ENABLED(DIRECT_STEPPING) #ifndef STEPPER_PAGES diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index d07a5914cd..93be95c95d 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -1052,7 +1052,7 @@ // Steppers #if HAS_X_AXIS - #if PIN_EXISTS(X_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X)) + #if PIN_EXISTS(X_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, X_IS_TRINAMIC) #define HAS_X_ENABLE 1 #endif #if PIN_EXISTS(X_DIR) @@ -1065,7 +1065,7 @@ #define HAS_X_MS_PINS 1 #endif - #if PIN_EXISTS(X2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X2)) + #if PIN_EXISTS(X2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, X2_IS_TRINAMIC) #define HAS_X2_ENABLE 1 #endif #if PIN_EXISTS(X2_DIR) @@ -1084,7 +1084,7 @@ */ #if HAS_Y_AXIS - #if PIN_EXISTS(Y_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y)) + #if PIN_EXISTS(Y_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Y_IS_TRINAMIC) #define HAS_Y_ENABLE 1 #endif #if PIN_EXISTS(Y_DIR) @@ -1098,7 +1098,7 @@ #endif #if HAS_Y2_STEPPER - #if PIN_EXISTS(Y2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y2)) + #if PIN_EXISTS(Y2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Y2_IS_TRINAMIC) #define HAS_Y2_ENABLE 1 #endif #if PIN_EXISTS(Y2_DIR) @@ -1114,7 +1114,7 @@ #endif #if HAS_Z_AXIS - #if PIN_EXISTS(Z_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z)) + #if PIN_EXISTS(Z_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z_IS_TRINAMIC) #define HAS_Z_ENABLE 1 #endif #if PIN_EXISTS(Z_DIR) @@ -1129,7 +1129,7 @@ #endif #if NUM_Z_STEPPERS >= 2 - #if PIN_EXISTS(Z2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z2)) + #if PIN_EXISTS(Z2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z2_IS_TRINAMIC) #define HAS_Z2_ENABLE 1 #endif #if PIN_EXISTS(Z2_DIR) @@ -1144,7 +1144,7 @@ #endif #if NUM_Z_STEPPERS >= 3 - #if PIN_EXISTS(Z3_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z3)) + #if PIN_EXISTS(Z3_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z3_IS_TRINAMIC) #define HAS_Z3_ENABLE 1 #endif #if PIN_EXISTS(Z3_DIR) @@ -1159,7 +1159,7 @@ #endif #if NUM_Z_STEPPERS >= 4 - #if PIN_EXISTS(Z4_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z4)) + #if PIN_EXISTS(Z4_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z4_IS_TRINAMIC) #define HAS_Z4_ENABLE 1 #endif #if PIN_EXISTS(Z4_DIR) @@ -1174,7 +1174,7 @@ #endif #if HAS_I_AXIS - #if PIN_EXISTS(I_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(I)) + #if PIN_EXISTS(I_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, I_IS_TRINAMIC) #define HAS_I_ENABLE 1 #endif #if PIN_EXISTS(I_DIR) @@ -1189,7 +1189,7 @@ #endif #if HAS_J_AXIS - #if PIN_EXISTS(J_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(J)) + #if PIN_EXISTS(J_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, J_IS_TRINAMIC) #define HAS_J_ENABLE 1 #endif #if PIN_EXISTS(J_DIR) @@ -1204,7 +1204,7 @@ #endif #if HAS_K_AXIS - #if PIN_EXISTS(K_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(K)) + #if PIN_EXISTS(K_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, K_IS_TRINAMIC) #define HAS_K_ENABLE 1 #endif #if PIN_EXISTS(K_DIR) @@ -1219,7 +1219,7 @@ #endif #if HAS_U_AXIS - #if PIN_EXISTS(U_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(U)) + #if PIN_EXISTS(U_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, U_IS_TRINAMIC) #define HAS_U_ENABLE 1 #endif #if PIN_EXISTS(U_DIR) @@ -1234,7 +1234,7 @@ #endif #if HAS_V_AXIS - #if PIN_EXISTS(V_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(V)) + #if PIN_EXISTS(V_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, V_IS_TRINAMIC) #define HAS_V_ENABLE 1 #endif #if PIN_EXISTS(V_DIR) @@ -1249,7 +1249,7 @@ #endif #if HAS_W_AXIS - #if PIN_EXISTS(W_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(W)) + #if PIN_EXISTS(W_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, W_IS_TRINAMIC) #define HAS_W_ENABLE 1 #endif #if PIN_EXISTS(W_DIR) @@ -1266,7 +1266,7 @@ // Extruder steppers and solenoids #if HAS_EXTRUDERS - #if PIN_EXISTS(E0_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E0)) + #if PIN_EXISTS(E0_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E0_IS_TRINAMIC) #define HAS_E0_ENABLE 1 #endif #if PIN_EXISTS(E0_DIR) @@ -1280,7 +1280,7 @@ #endif #if E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS) - #if PIN_EXISTS(E1_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1)) + #if PIN_EXISTS(E1_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E1_IS_TRINAMIC) #define HAS_E1_ENABLE 1 #endif #if PIN_EXISTS(E1_DIR) @@ -1295,7 +1295,7 @@ #endif #if E_STEPPERS > 2 - #if PIN_EXISTS(E2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E2)) + #if PIN_EXISTS(E2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E2_IS_TRINAMIC) #define HAS_E2_ENABLE 1 #endif #if PIN_EXISTS(E2_DIR) @@ -1310,7 +1310,7 @@ #endif #if E_STEPPERS > 3 - #if PIN_EXISTS(E3_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E3)) + #if PIN_EXISTS(E3_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E3_IS_TRINAMIC) #define HAS_E3_ENABLE 1 #endif #if PIN_EXISTS(E3_DIR) @@ -1325,7 +1325,7 @@ #endif #if E_STEPPERS > 4 - #if PIN_EXISTS(E4_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E4)) + #if PIN_EXISTS(E4_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E4_IS_TRINAMIC) #define HAS_E4_ENABLE 1 #endif #if PIN_EXISTS(E4_DIR) @@ -1340,7 +1340,7 @@ #endif #if E_STEPPERS > 5 - #if PIN_EXISTS(E5_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E5)) + #if PIN_EXISTS(E5_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E5_IS_TRINAMIC) #define HAS_E5_ENABLE 1 #endif #if PIN_EXISTS(E5_DIR) @@ -1355,7 +1355,7 @@ #endif #if E_STEPPERS > 6 - #if PIN_EXISTS(E6_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E6)) + #if PIN_EXISTS(E6_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E6_IS_TRINAMIC) #define HAS_E6_ENABLE 1 #endif #if PIN_EXISTS(E6_DIR) @@ -1370,7 +1370,7 @@ #endif #if E_STEPPERS > 7 - #if PIN_EXISTS(E7_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E7)) + #if PIN_EXISTS(E7_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E7_IS_TRINAMIC) #define HAS_E7_ENABLE 1 #endif #if PIN_EXISTS(E7_DIR) @@ -1441,7 +1441,7 @@ #undef Z4_STALL_SENSITIVITY #endif - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC #if defined(X_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X) #define X_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(X) @@ -1461,7 +1461,7 @@ #define X_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC #if defined(X2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X2) #define X2_SENSORLESS 1 #endif @@ -1479,7 +1479,7 @@ #endif #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC #if defined(Y_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y) #define Y_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(Y) @@ -1499,7 +1499,7 @@ #define Y_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(Y2) + #if Y2_IS_TRINAMIC #if defined(Y2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y2) #define Y2_SENSORLESS 1 #endif @@ -1517,7 +1517,7 @@ #endif #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC #if defined(Z_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z) #define Z_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(Z) @@ -1537,7 +1537,7 @@ #define Z_SLAVE_ADDRESS 0 #endif #endif - #if NUM_Z_STEPPERS >= 2 && AXIS_IS_TMC(Z2) + #if NUM_Z_STEPPERS >= 2 && Z2_IS_TRINAMIC #if defined(Z2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z2) #define Z2_SENSORLESS 1 #endif @@ -1554,7 +1554,7 @@ #define Z2_SLAVE_ADDRESS 0 #endif #endif - #if NUM_Z_STEPPERS >= 3 && AXIS_IS_TMC(Z3) + #if NUM_Z_STEPPERS >= 3 && Z3_IS_TRINAMIC #if defined(Z3_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z3) #define Z3_SENSORLESS 1 #endif @@ -1571,7 +1571,7 @@ #define Z3_SLAVE_ADDRESS 0 #endif #endif - #if NUM_Z_STEPPERS >= 4 && AXIS_IS_TMC(Z4) + #if NUM_Z_STEPPERS >= 4 && Z4_IS_TRINAMIC #if defined(Z4_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z4) #define Z4_SENSORLESS 1 #endif @@ -1589,7 +1589,7 @@ #endif #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC #if defined(I_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(I) #define I_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(I) @@ -1610,7 +1610,7 @@ #endif #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC #if defined(J_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(J) #define J_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(J) @@ -1631,7 +1631,7 @@ #endif #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC #if defined(K_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(K) #define K_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(K) @@ -1652,7 +1652,7 @@ #endif #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC #if defined(U_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(U) #define U_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(U) @@ -1673,7 +1673,7 @@ #endif #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC #if defined(V_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(V) #define V_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(V) @@ -1694,7 +1694,7 @@ #endif #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC #if defined(W_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(W) #define W_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(W) @@ -1715,7 +1715,7 @@ #endif #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E0) #define E0_HAS_STEALTHCHOP 1 #endif @@ -1729,7 +1729,7 @@ #define E0_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E1) #define E1_HAS_STEALTHCHOP 1 #endif @@ -1743,7 +1743,7 @@ #define E1_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E2) + #if E2_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E2) #define E2_HAS_STEALTHCHOP 1 #endif @@ -1757,7 +1757,7 @@ #define E2_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E3) + #if E3_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E3) #define E3_HAS_STEALTHCHOP 1 #endif @@ -1771,7 +1771,7 @@ #define E3_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E4) + #if E4_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E4) #define E4_HAS_STEALTHCHOP 1 #endif @@ -1785,7 +1785,7 @@ #define E4_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E5) + #if E5_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E5) #define E5_HAS_STEALTHCHOP 1 #endif @@ -1799,7 +1799,7 @@ #define E5_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E6) + #if E6_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E6) #define E6_HAS_STEALTHCHOP 1 #endif @@ -1813,7 +1813,7 @@ #define E6_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E7) + #if E7_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E7) #define E7_HAS_STEALTHCHOP 1 #endif diff --git a/Marlin/src/inc/Conditionals-6-type.h b/Marlin/src/inc/Conditionals-6-type.h index e14c6d7ce5..bd8e3b78b4 100644 --- a/Marlin/src/inc/Conditionals-6-type.h +++ b/Marlin/src/inc/Conditionals-6-type.h @@ -38,10 +38,53 @@ #endif // If an axis's Homing Current differs from standard current... -#define HAS_CURRENT_HOME(N) (N##_CURRENT_HOME > 0 && N##_CURRENT_HOME != N##_CURRENT) +#define HAS_HOME_CURRENT(N) (N##_CURRENT_HOME > 0 && N##_CURRENT_HOME != N##_CURRENT) +#if HAS_HOME_CURRENT(X) + #define X_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Y) + #define Y_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z) + #define Z_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(I) + #define I_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(J) + #define J_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(K) + #define K_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(U) + #define U_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(V) + #define V_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(W) + #define W_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(X2) + #define X2_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Y2) + #define Y2_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z2) + #define Z2_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z3) + #define Z3_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z4) + #define Z4_HAS_HOME_CURRENT 1 +#endif +#undef HAS_HOME_CURRENT // Does any axis have homing current? -#define _OR_HAS_CURR_HOME(N) HAS_CURRENT_HOME(N) || +#define _OR_HAS_CURR_HOME(N) N##_HAS_HOME_CURRENT || #if MAIN_AXIS_MAP(_OR_HAS_CURR_HOME) MAP(_OR_HAS_CURR_HOME, X2, Y2, Z2, Z3, Z4) 0 #define HAS_HOMING_CURRENT 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 0029980ada..3c4cd44561 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1805,8 +1805,8 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #undef _BAD_HOME_CURRENT #if ENABLED(PROBING_USE_CURRENT_HOME) - #if (defined(Z_CURRENT_HOME) && !HAS_CURRENT_HOME(Z)) || (defined(Z2_CURRENT_HOME) && !HAS_CURRENT_HOME(Z2)) \ - || (defined(Z3_CURRENT_HOME) && !HAS_CURRENT_HOME(Z3)) || (defined(Z4_CURRENT_HOME) && !HAS_CURRENT_HOME(Z4)) + #if (defined(Z_CURRENT_HOME) && !Z_HAS_HOME_CURRENT) || (defined(Z2_CURRENT_HOME) && !Z2_HAS_HOME_CURRENT) \ + || (defined(Z3_CURRENT_HOME) && !Z3_HAS_HOME_CURRENT) || (defined(Z4_CURRENT_HOME) && !Z4_HAS_HOME_CURRENT) #error "PROBING_USE_CURRENT_HOME requires a Z_CURRENT_HOME value that differs from Z_CURRENT." #endif #endif @@ -2452,28 +2452,28 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #endif #endif -#if E_STEPPERS > 0 && !(PINS_EXIST(E0_STEP, E0_DIR) && HAS_E0_ENABLE) +#if E_STEPPERS > 0 && !ALL(HAS_E0_DIR, HAS_E0_STEP, HAS_E0_ENABLE) #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 1 && !(PINS_EXIST(E1_STEP, E1_DIR) && HAS_E1_ENABLE) +#if E_STEPPERS > 1 && !ALL(HAS_E1_DIR, HAS_E1_STEP, HAS_E1_ENABLE) #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 2 && !(PINS_EXIST(E2_STEP, E2_DIR) && HAS_E2_ENABLE) +#if E_STEPPERS > 2 && !ALL(HAS_E2_DIR, HAS_E2_STEP, HAS_E2_ENABLE) #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 3 && !(PINS_EXIST(E3_STEP, E3_DIR) && HAS_E3_ENABLE) +#if E_STEPPERS > 3 && !ALL(HAS_E3_DIR, HAS_E3_STEP, HAS_E3_ENABLE) #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 4 && !(PINS_EXIST(E4_STEP, E4_DIR) && HAS_E4_ENABLE) +#if E_STEPPERS > 4 && !ALL(HAS_E4_DIR, HAS_E4_STEP, HAS_E4_ENABLE) #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 5 && !(PINS_EXIST(E5_STEP, E5_DIR) && HAS_E5_ENABLE) +#if E_STEPPERS > 5 && !ALL(HAS_E5_DIR, HAS_E5_STEP, HAS_E5_ENABLE) #error "E5_STEP_PIN, E5_DIR_PIN, or E5_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 6 && !(PINS_EXIST(E6_STEP, E6_DIR) && HAS_E6_ENABLE) +#if E_STEPPERS > 6 && !ALL(HAS_E6_DIR, HAS_E6_STEP, HAS_E6_ENABLE) #error "E6_STEP_PIN, E6_DIR_PIN, or E6_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 7 && !(PINS_EXIST(E7_STEP, E7_DIR) && HAS_E7_ENABLE) +#if E_STEPPERS > 7 && !ALL(HAS_E7_DIR, HAS_E7_STEP, HAS_E7_ENABLE) #error "E7_STEP_PIN, E7_DIR_PIN, or E7_ENABLE_PIN not defined for this board." #endif @@ -3230,7 +3230,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #undef INVALID_TMC_ADDRESS #define _TMC_MICROSTEP_IS_VALID(MS) (MS == 0 || MS == 2 || MS == 4 || MS == 8 || MS == 16 || MS == 32 || MS == 64 || MS == 128 || MS == 256) -#define TMC_MICROSTEP_IS_VALID(M) (!AXIS_IS_TMC(M) || _TMC_MICROSTEP_IS_VALID(M##_MICROSTEPS)) +#define TMC_MICROSTEP_IS_VALID(M) (!M##_IS_TRINAMIC || _TMC_MICROSTEP_IS_VALID(M##_MICROSTEPS)) #define INVALID_TMC_MS(ST) static_assert(0, "Invalid " STRINGIFY(ST) "_MICROSTEPS. Valid values are 0, 2, 4, 8, 16, 32, 64, 128, and 256.") #if !TMC_MICROSTEP_IS_VALID(X) diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index df2279a08b..7c107220af 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -742,24 +742,24 @@ #endif #if USE_SENSORLESS && DISABLED(NO_HOMING_CURRENT_WARNING) - #if ENABLED(X_SENSORLESS) && defined(X_CURRENT_HOME) && !HAS_CURRENT_HOME(X) - #warning "It's recommended to set X_CURRENT_HOME lower than X_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(X2_SENSORLESS) && defined(X2_CURRENT_HOME) && !HAS_CURRENT_HOME(X2) - #warning "It's recommended to set X2_CURRENT_HOME lower than X2_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #if ENABLED(X_SENSORLESS) && defined(X_CURRENT_HOME) && !X_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set X_CURRENT_HOME less than X_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(X2_SENSORLESS) && defined(X2_CURRENT_HOME) && !X2_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set X2_CURRENT_HOME less than X2_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" #endif - #if ENABLED(Y_SENSORLESS) && defined(Y_CURRENT_HOME) && !HAS_CURRENT_HOME(Y) - #warning "It's recommended to set Y_CURRENT_HOME lower than Y_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Y2_SENSORLESS) && defined(Y2_CURRENT_HOME) && !HAS_CURRENT_HOME(Y2) - #warning "It's recommended to set Y2_CURRENT_HOME lower than Y2_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #if ENABLED(Y_SENSORLESS) && defined(Y_CURRENT_HOME) && !Y_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Y_CURRENT_HOME less than Y_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Y2_SENSORLESS) && defined(Y2_CURRENT_HOME) && !Y2_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Y2_CURRENT_HOME less than Y2_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" #endif - #if ENABLED(Z_SENSORLESS) && defined(Z_CURRENT_HOME) && !HAS_CURRENT_HOME(Z) - #warning "It's recommended to set Z_CURRENT_HOME lower than Z_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Z2_SENSORLESS) && defined(Z2_CURRENT_HOME) && !HAS_CURRENT_HOME(Z2) - #warning "It's recommended to set Z2_CURRENT_HOME lower than Z2_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Z3_SENSORLESS) && defined(Z3_CURRENT_HOME) && !HAS_CURRENT_HOME(Z3) - #warning "It's recommended to set Z3_CURRENT_HOME lower than Z3_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Z4_SENSORLESS) && defined(Z4_CURRENT_HOME) && !HAS_CURRENT_HOME(Z4) - #warning "It's recommended to set Z4_CURRENT_HOME lower than Z4_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #if ENABLED(Z_SENSORLESS) && defined(Z_CURRENT_HOME) && !Z_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z_CURRENT_HOME less than Z_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Z2_SENSORLESS) && defined(Z2_CURRENT_HOME) && !Z2_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z2_CURRENT_HOME less than Z2_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Z3_SENSORLESS) && defined(Z3_CURRENT_HOME) && !Z3_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z3_CURRENT_HOME less than Z3_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Z4_SENSORLESS) && defined(Z4_CURRENT_HOME) && !Z4_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z4_CURRENT_HOME less than Z4_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" #endif #endif diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 09100e5029..b9c637d722 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -3068,7 +3068,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenu(ID_Advanced, ADVANCED_TMC); break; - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC case TMC_STEPPER_CURRENT_X: static float stepper_current_x; @@ -3084,7 +3084,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra break; #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC case TMC_STEPPER_CURRENT_Y: static float stepper_current_y; if (draw) { @@ -3098,7 +3098,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra break; #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC case TMC_STEPPER_CURRENT_Z: static float stepper_current_z; if (draw) { @@ -3112,7 +3112,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra break; #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC case TMC_STEPPER_CURRENT_E: static float stepper_current_e; if (draw) { diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index a775d2ae27..7428a4b254 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -3607,49 +3607,28 @@ void drawTuneMenu() { #endif #if HAS_TRINAMIC_CONFIG - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC void setXTMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperX.refresh_stepper_current(); }); } #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC void setYTMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperY.refresh_stepper_current(); }); } #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC void setZTMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperZ.refresh_stepper_current(); }); } #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC void setETMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperE0.refresh_stepper_current(); }); } #endif void drawTrinamicConfigMenu() { - constexpr uint8_t items = (1 - #if AXIS_IS_TMC(X) - + 1 - #endif - #if AXIS_IS_TMC(Y) - + 1 - #endif - #if AXIS_IS_TMC(Z) - + 1 - #endif - #if AXIS_IS_TMC(E0) - + 1 - #endif - ); + constexpr uint8_t items = 1 + COUNT_ENABLED(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC, E0_IS_TRINAMIC); checkkey = ID_Menu; if (SET_MENU(trinamicConfigMenu, MSG_TMC_DRIVERS, items)) { BACK_ITEM(drawAdvancedSettingsMenu); - #if AXIS_IS_TMC(X) - EDIT_ITEM(ICON_TMCXSet, MSG_TMC_ACURRENT, onDrawPIntMenu, setXTMCCurrent, &stepperX.val_mA); - #endif - #if AXIS_IS_TMC(Y) - EDIT_ITEM(ICON_TMCYSet, MSG_TMC_BCURRENT, onDrawPIntMenu, setYTMCCurrent, &stepperY.val_mA); - #endif - #if AXIS_IS_TMC(Z) - EDIT_ITEM(ICON_TMCZSet, MSG_TMC_CCURRENT, onDrawPIntMenu, setZTMCCurrent, &stepperZ.val_mA); - #endif - #if AXIS_IS_TMC(E0) - EDIT_ITEM(ICON_TMCESet, MSG_TMC_ECURRENT, onDrawPIntMenu, setETMCCurrent, &stepperE0.val_mA); - #endif + TERN_(X_IS_TRINAMIC, EDIT_ITEM(ICON_TMCXSet, MSG_TMC_ACURRENT, onDrawPIntMenu, setXTMCCurrent, &stepperX.val_mA)); + TERN_(Y_IS_TRINAMIC, EDIT_ITEM(ICON_TMCYSet, MSG_TMC_BCURRENT, onDrawPIntMenu, setYTMCCurrent, &stepperY.val_mA)); + TERN_(Z_IS_TRINAMIC, EDIT_ITEM(ICON_TMCZSet, MSG_TMC_CCURRENT, onDrawPIntMenu, setZTMCCurrent, &stepperZ.val_mA)); + TERN_(E0_IS_TRINAMIC, EDIT_ITEM(ICON_TMCESet, MSG_TMC_ECURRENT, onDrawPIntMenu, setETMCCurrent, &stepperE0.val_mA)); } updateMenu(trinamicConfigMenu); } diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp index 4182c3f2ca..08eff9d41e 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp @@ -707,28 +707,28 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #if HAS_TRINAMIC_CONFIG // TMC Current Setting - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC VPHELPER(VP_TMC_X_Current, &stepperX.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC VPHELPER(VP_TMC_Y_Current, &stepperY.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC VPHELPER(VP_TMC_Z_Current, &stepperZ.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC VPHELPER(VP_TMC_E0_Current, &stepperE0.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC VPHELPER(VP_TMC_E1_Current, &stepperE1.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC VPHELPER(VP_TMC_X1_Current, &stepperX2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Y2) + #if Y2_IS_TRINAMIC VPHELPER(VP_TMC_Y1_Current, &stepperY2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Z2) + #if Z2_IS_TRINAMIC VPHELPER(VP_TMC_Z1_Current, &stepperZ2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif #endif diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp index 1999518607..1761451da1 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp @@ -673,49 +673,49 @@ void DGUSScreenHandlerMKS::tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr) #endif break; case VP_TMC_X_Current: - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC stepperX.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_X1_Current: - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC stepperX2.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_Y_Current: - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC stepperY.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_Y1_Current: - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC stepperY2.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_Z_Current: - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC stepperZ.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_Z1_Current: - #if AXIS_IS_TMC(Z2) + #if Z2_IS_TRINAMIC stepperZ2.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_E0_Current: - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC stepperE0.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_E1_Current: - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC stepperE1.rms_current(tmc_val); settings.save(); #endif diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp index ddd273aa47..3511ce3719 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp @@ -33,86 +33,60 @@ void StepperCurrentScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(0); w.units(GET_TEXT_F(MSG_UNITS_MILLIAMP)); - w.heading( GET_TEXT_F(MSG_TMC_CURRENT)); - #if AXIS_IS_TMC(X) - w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) ); - #endif - #if AXIS_IS_TMC(X2) - w.color(x_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_X2), getAxisCurrent_mA(X2) ); - #endif - #if AXIS_IS_TMC(Y) - w.color(y_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) ); - #endif - #if AXIS_IS_TMC(Y2) - w.color(x_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_Y2), getAxisCurrent_mA(Y2) ); - #endif - #if AXIS_IS_TMC(Z) - w.color(z_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) ); - #endif - #if AXIS_IS_TMC(Z2) - w.color(z_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_Z2), getAxisCurrent_mA(Z2) ); - #endif - #if AXIS_IS_TMC(E0) - w.color(e_axis) .adjuster(14, GET_TEXT_F( - #if EXTRUDERS == 1 - MSG_AXIS_E - #else - MSG_AXIS_E1 - #endif - ), getAxisCurrent_mA(E0) ); - #endif - #if AXIS_IS_TMC(E1) - w.color(e_axis).adjuster(16, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1) ); - #endif - #if AXIS_IS_TMC(E2) - w.color(e_axis).adjuster(18, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2) ); - #endif - #if AXIS_IS_TMC(E3) - w.color(e_axis).adjuster(20, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3) ); - #endif + w.heading(GET_TEXT_F(MSG_TMC_CURRENT)); + TERN_(X_IS_TRINAMIC, w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) ) ); + TERN_(X2_IS_TRINAMIC, w.color(x_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_X2), getAxisCurrent_mA(X2)) ); + TERN_(Y_IS_TRINAMIC, w.color(y_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) ) ); + TERN_(Y2_IS_TRINAMIC, w.color(x_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_Y2), getAxisCurrent_mA(Y2)) ); + TERN_(Z_IS_TRINAMIC, w.color(z_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) ) ); + TERN_(Z2_IS_TRINAMIC, w.color(z_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_Z2), getAxisCurrent_mA(Z2)) ); + TERN_(E0_IS_TRINAMIC, w.color(e_axis) .adjuster(14, GET_TEXT_F(TERN(HAS_MULTI_EXTRUDER, MSG_AXIS_E1, MSG_AXIS_E)), getAxisCurrent_mA(E0)) ); + TERN_(E1_IS_TRINAMIC, w.color(e_axis) .adjuster(16, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1)) ); + TERN_(E2_IS_TRINAMIC, w.color(e_axis) .adjuster(18, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2)) ); + TERN_(E3_IS_TRINAMIC, w.color(e_axis) .adjuster(20, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3)) ); w.increments(); } bool StepperCurrentScreen::onTouchHeld(uint8_t tag) { const float increment = getIncrement(); switch (tag) { - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC case 2: UI_DECREMENT(AxisCurrent_mA, X ); break; case 3: UI_INCREMENT(AxisCurrent_mA, X ); break; #endif - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC case 4: UI_DECREMENT(AxisCurrent_mA, X2 ); break; case 5: UI_INCREMENT(AxisCurrent_mA, X2 ); break; #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC case 6: UI_DECREMENT(AxisCurrent_mA, Y ); break; case 7: UI_INCREMENT(AxisCurrent_mA, Y ); break; #endif - #if AXIS_IS_TMC(Y2) + #if Y2_IS_TRINAMIC case 8: UI_DECREMENT(AxisCurrent_mA, Y2 ); break; case 9: UI_INCREMENT(AxisCurrent_mA, Y2 ); break; #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC case 10: UI_DECREMENT(AxisCurrent_mA, Z ); break; case 11: UI_INCREMENT(AxisCurrent_mA, Z ); break; #endif - #if AXIS_IS_TMC(Z2) + #if Z2_IS_TRINAMIC case 12: UI_DECREMENT(AxisCurrent_mA, Z2 ); break; case 13: UI_INCREMENT(AxisCurrent_mA, Z2 ); break; #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC case 14: UI_DECREMENT(AxisCurrent_mA, E0); break; case 15: UI_INCREMENT(AxisCurrent_mA, E0); break; #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC case 16: UI_DECREMENT(AxisCurrent_mA, E1); break; case 17: UI_INCREMENT(AxisCurrent_mA, E1); break; #endif - #if AXIS_IS_TMC(E2) + #if E2_IS_TRINAMIC case 18: UI_DECREMENT(AxisCurrent_mA, E2); break; case 19: UI_INCREMENT(AxisCurrent_mA, E2); break; #endif - #if AXIS_IS_TMC(E3) + #if E3_IS_TRINAMIC case 20: UI_DECREMENT(AxisCurrent_mA, E3); break; case 21: UI_INCREMENT(AxisCurrent_mA, E3); break; #endif diff --git a/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp index 400b294701..c44cabd10a 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp @@ -102,13 +102,13 @@ static void disp_key_value() { #endif #if HAS_X_AXIS - case XMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, public_buf_m); break; + case XMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Y_AXIS - case YMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, public_buf_m); break; + case YMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Z_AXIS - case ZMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, public_buf_m); break; + case ZMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_EXTRUDERS case E0MaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, public_buf_m); break; @@ -134,13 +134,13 @@ static void disp_key_value() { #if ENABLED(EDITABLE_STEPS_PER_UNIT) #if HAS_X_AXIS - case Xstep: dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, public_buf_m); break; + case Xstep: dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Y_AXIS - case Ystep: dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, public_buf_m); break; + case Ystep: dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Z_AXIS - case Zstep: dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, public_buf_m); break; + case Zstep: dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_EXTRUDERS case E0step: dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, public_buf_m); break; @@ -150,21 +150,11 @@ static void disp_key_value() { #endif #endif - #if AXIS_IS_TMC(X) - case Xcurrent: dtostrf(stepperX.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(Y) - case Ycurrent: dtostrf(stepperY.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(Z) - case Zcurrent: dtostrf(stepperZ.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(E0) - case E0current: dtostrf(stepperE0.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(E1) - case E1current: dtostrf(stepperE1.getMilliamps(), 1, 1, public_buf_m); break; - #endif + case Xcurrent: TERN_(X_IS_TRINAMIC, dtostrf(stepperX.getMilliamps(), 1, 1, public_buf_m)); break; + case Ycurrent: TERN_(Y_IS_TRINAMIC, dtostrf(stepperY.getMilliamps(), 1, 1, public_buf_m)); break; + case Zcurrent: TERN_(Z_IS_TRINAMIC, dtostrf(stepperZ.getMilliamps(), 1, 1, public_buf_m)); break; + case E0current: TERN_(E0_IS_TRINAMIC, dtostrf(stepperE0.getMilliamps(), 1, 1, public_buf_m)); break; + case E1current: TERN_(E1_IS_TRINAMIC, dtostrf(stepperE1.getMilliamps(), 1, 1, public_buf_m)); break; case pause_pos_x: dtostrf(gCfgItems.pausePosX, 1, 1, public_buf_m); break; case pause_pos_y: dtostrf(gCfgItems.pausePosY, 1, 1, public_buf_m); break; @@ -275,21 +265,11 @@ static void set_value_confirm() { case E1step: planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); planner.refresh_positioning(); break; #endif - #if AXIS_IS_TMC(X) - case Xcurrent: stepperX.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(Y) - case Ycurrent: stepperY.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(Z) - case Zcurrent: stepperZ.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(E0) - case E0current: stepperE0.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(E1) - case E1current: stepperE1.rms_current(atoi(key_value)); break; - #endif + case Xcurrent: TERN_(X_IS_TRINAMIC, stepperX.rms_current(atoi(key_value))); break; + case Ycurrent: TERN_(Y_IS_TRINAMIC, stepperY.rms_current(atoi(key_value))); break; + case Zcurrent: TERN_(Z_IS_TRINAMIC, stepperZ.rms_current(atoi(key_value))); break; + case E0current: TERN_(E0_IS_TRINAMIC, stepperE0.rms_current(atoi(key_value))); break; + case E1current: TERN_(E1_IS_TRINAMIC, stepperE1.rms_current(atoi(key_value))); break; case pause_pos_x: gCfgItems.pausePosX = atof(key_value); update_spi_flash(); break; case pause_pos_y: gCfgItems.pausePosY = atof(key_value); update_spi_flash(); break; diff --git a/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp index b243c88705..cbb2bc059f 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp @@ -49,34 +49,16 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; lv_clear_tmc_current_settings(); switch (obj->mks_obj_id) { - case ID_TMC_CURRENT_RETURN: - uiCfg.para_ui_page = false; - draw_return_ui(); - return; - #if AXIS_IS_TMC(X) - case ID_TMC_CURRENT_X: value = Xcurrent; break; - #endif - #if AXIS_IS_TMC(Y) - case ID_TMC_CURRENT_Y: value = Ycurrent; break; - #endif - #if AXIS_IS_TMC(Z) - case ID_TMC_CURRENT_Z: value = Zcurrent; break; - #endif - #if AXIS_IS_TMC(E0) - case ID_TMC_CURRENT_E0: value = E0current; break; - #endif - #if AXIS_IS_TMC(E1) - case ID_TMC_CURRENT_E1: value = E1current; break; - #endif + case ID_TMC_CURRENT_RETURN: uiCfg.para_ui_page = false; draw_return_ui(); return; - case ID_TMC_CURRENT_UP: - uiCfg.para_ui_page = false; - lv_draw_tmc_current_settings(); - return; - case ID_TMC_CURRENT_DOWN: - uiCfg.para_ui_page = true; - lv_draw_tmc_current_settings(); - return; + case ID_TMC_CURRENT_X: TERN_(X_IS_TRINAMIC, value = Xcurrent); break; + case ID_TMC_CURRENT_Y: TERN_(Y_IS_TRINAMIC, value = Ycurrent); break; + case ID_TMC_CURRENT_Z: TERN_(Z_IS_TRINAMIC, value = Zcurrent); break; + case ID_TMC_CURRENT_E0: TERN_(E0_IS_TRINAMIC, value = E0current); break; + case ID_TMC_CURRENT_E1: TERN_(E1_IS_TRINAMIC, value = E1current); break; + + case ID_TMC_CURRENT_UP: uiCfg.para_ui_page = false; lv_draw_tmc_current_settings(); return; + case ID_TMC_CURRENT_DOWN: uiCfg.para_ui_page = true; lv_draw_tmc_current_settings(); return; } lv_draw_number_key(); @@ -87,46 +69,26 @@ void lv_draw_tmc_current_settings() { float milliamps; if (!uiCfg.para_ui_page) { - #if AXIS_IS_TMC(X) - milliamps = stepperX.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(X_IS_TRINAMIC, stepperX.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.X_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_X, 0, public_buf_l); - #if AXIS_IS_TMC(Y) - milliamps = stepperY.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(Y_IS_TRINAMIC, stepperY.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Y_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_TMC_CURRENT_Y, 1, public_buf_l); - #if AXIS_IS_TMC(Z) - milliamps = stepperZ.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(Z_IS_TRINAMIC, stepperZ.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Z_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_TMC_CURRENT_Z, 2, public_buf_l); - #if AXIS_IS_TMC(E0) - milliamps = stepperE0.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(E0_IS_TRINAMIC, stepperE0.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E0_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_TMC_CURRENT_E0, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_CURRENT_DOWN, true); } else { - #if AXIS_IS_TMC(E1) - milliamps = stepperE1.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(E1_IS_TRINAMIC, stepperE1.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E1_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_E1, 0, public_buf_l); @@ -137,9 +99,8 @@ void lv_draw_tmc_current_settings() { } void lv_clear_tmc_current_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif + if (TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable)) + lv_group_remove_all_objs(g); lv_obj_del(scr); } diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 5b6caf378a..b88df6ee9d 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -438,156 +438,68 @@ namespace ExtUI { #if HAS_TRINAMIC_CONFIG float getAxisCurrent_mA(const axis_t axis) { switch (axis) { - #if AXIS_IS_TMC(X) - case X: return stepperX.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y) - case Y: return stepperY.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z) - case Z: return stepperZ.getMilliamps(); - #endif - #if AXIS_IS_TMC(I) - case I: return stepperI.getMilliamps(); - #endif - #if AXIS_IS_TMC(J) - case J: return stepperJ.getMilliamps(); - #endif - #if AXIS_IS_TMC(K) - case K: return stepperK.getMilliamps(); - #endif - #if AXIS_IS_TMC(U) - case U: return stepperU.getMilliamps(); - #endif - #if AXIS_IS_TMC(V) - case V: return stepperV.getMilliamps(); - #endif - #if AXIS_IS_TMC(W) - case W: return stepperW.getMilliamps(); - #endif - #if AXIS_IS_TMC(X2) - case X2: return stepperX2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y2) - case Y2: return stepperY2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z2) - case Z2: return stepperZ2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z3) - case Z3: return stepperZ3.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z4) - case Z4: return stepperZ4.getMilliamps(); - #endif + OPTCODE(X_IS_TRINAMIC, case X: return stepperX.getMilliamps()) + OPTCODE(Y_IS_TRINAMIC, case Y: return stepperY.getMilliamps()) + OPTCODE(Z_IS_TRINAMIC, case Z: return stepperZ.getMilliamps()) + OPTCODE(I_IS_TRINAMIC, case I: return stepperI.getMilliamps()) + OPTCODE(J_IS_TRINAMIC, case J: return stepperJ.getMilliamps()) + OPTCODE(K_IS_TRINAMIC, case K: return stepperK.getMilliamps()) + OPTCODE(U_IS_TRINAMIC, case U: return stepperU.getMilliamps()) + OPTCODE(V_IS_TRINAMIC, case V: return stepperV.getMilliamps()) + OPTCODE(W_IS_TRINAMIC, case W: return stepperW.getMilliamps()) + OPTCODE(X2_IS_TRINAMIC, case X2: return stepperX2.getMilliamps()) + OPTCODE(Y2_IS_TRINAMIC, case Y2: return stepperY2.getMilliamps()) + OPTCODE(Z2_IS_TRINAMIC, case Z2: return stepperZ2.getMilliamps()) + OPTCODE(Z3_IS_TRINAMIC, case Z3: return stepperZ3.getMilliamps()) + OPTCODE(Z4_IS_TRINAMIC, case Z4: return stepperZ4.getMilliamps()) default: return NAN; }; } float getAxisCurrent_mA(const extruder_t extruder) { switch (extruder) { - #if AXIS_IS_TMC(E0) - case E0: return stepperE0.getMilliamps(); - #endif - #if AXIS_IS_TMC(E1) - case E1: return stepperE1.getMilliamps(); - #endif - #if AXIS_IS_TMC(E2) - case E2: return stepperE2.getMilliamps(); - #endif - #if AXIS_IS_TMC(E3) - case E3: return stepperE3.getMilliamps(); - #endif - #if AXIS_IS_TMC(E4) - case E4: return stepperE4.getMilliamps(); - #endif - #if AXIS_IS_TMC(E5) - case E5: return stepperE5.getMilliamps(); - #endif - #if AXIS_IS_TMC(E6) - case E6: return stepperE6.getMilliamps(); - #endif - #if AXIS_IS_TMC(E7) - case E7: return stepperE7.getMilliamps(); - #endif + OPTCODE(E0_IS_TRINAMIC, case E0: return stepperE0.getMilliamps()) + OPTCODE(E1_IS_TRINAMIC, case E1: return stepperE1.getMilliamps()) + OPTCODE(E2_IS_TRINAMIC, case E2: return stepperE2.getMilliamps()) + OPTCODE(E3_IS_TRINAMIC, case E3: return stepperE3.getMilliamps()) + OPTCODE(E4_IS_TRINAMIC, case E4: return stepperE4.getMilliamps()) + OPTCODE(E5_IS_TRINAMIC, case E5: return stepperE5.getMilliamps()) + OPTCODE(E6_IS_TRINAMIC, case E6: return stepperE6.getMilliamps()) + OPTCODE(E7_IS_TRINAMIC, case E7: return stepperE7.getMilliamps()) default: return NAN; }; } void setAxisCurrent_mA(const_float_t mA, const axis_t axis) { switch (axis) { - #if AXIS_IS_TMC(X) - case X: stepperX.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Y) - case Y: stepperY.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z) - case Z: stepperZ.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(I) - case I: stepperI.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(J) - case J: stepperJ.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(K) - case K: stepperK.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(U) - case U: stepperU.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(V) - case V: stepperV.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(W) - case W: stepperW.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(X2) - case X2: stepperX2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Y2) - case Y2: stepperY2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z2) - case Z2: stepperZ2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z3) - case Z3: stepperZ3.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z4) - case Z4: stepperZ4.rms_current(constrain(mA, 400, 1500)); break; - #endif + case X: TERN_(X_IS_TRINAMIC, stepperX.rms_current(constrain(mA, 400, 1500))); break; + case Y: TERN_(Y_IS_TRINAMIC, stepperY.rms_current(constrain(mA, 400, 1500))); break; + case Z: TERN_(Z_IS_TRINAMIC, stepperZ.rms_current(constrain(mA, 400, 1500))); break; + case I: TERN_(I_IS_TRINAMIC, stepperI.rms_current(constrain(mA, 400, 1500))); break; + case J: TERN_(J_IS_TRINAMIC, stepperJ.rms_current(constrain(mA, 400, 1500))); break; + case K: TERN_(K_IS_TRINAMIC, stepperK.rms_current(constrain(mA, 400, 1500))); break; + case U: TERN_(U_IS_TRINAMIC, stepperU.rms_current(constrain(mA, 400, 1500))); break; + case V: TERN_(V_IS_TRINAMIC, stepperV.rms_current(constrain(mA, 400, 1500))); break; + case W: TERN_(W_IS_TRINAMIC, stepperW.rms_current(constrain(mA, 400, 1500))); break; + case X2: TERN_(X2_IS_TRINAMIC, stepperX2.rms_current(constrain(mA, 400, 1500))); break; + case Y2: TERN_(Y2_IS_TRINAMIC, stepperY2.rms_current(constrain(mA, 400, 1500))); break; + case Z2: TERN_(Z2_IS_TRINAMIC, stepperZ2.rms_current(constrain(mA, 400, 1500))); break; + case Z3: TERN_(Z3_IS_TRINAMIC, stepperZ3.rms_current(constrain(mA, 400, 1500))); break; + case Z4: TERN_(Z4_IS_TRINAMIC, stepperZ4.rms_current(constrain(mA, 400, 1500))); break; default: break; }; } void setAxisCurrent_mA(const_float_t mA, const extruder_t extruder) { switch (extruder) { - #if AXIS_IS_TMC(E0) - case E0: stepperE0.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E1) - case E1: stepperE1.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E2) - case E2: stepperE2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E3) - case E3: stepperE3.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E4) - case E4: stepperE4.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E5) - case E5: stepperE5.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E6) - case E6: stepperE6.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E7) - case E7: stepperE7.rms_current(constrain(mA, 400, 1500)); break; - #endif + case E0: TERN_(E0_IS_TRINAMIC, stepperE0.rms_current(constrain(mA, 400, 1500))); break; + case E1: TERN_(E1_IS_TRINAMIC, stepperE1.rms_current(constrain(mA, 400, 1500))); break; + case E2: TERN_(E2_IS_TRINAMIC, stepperE2.rms_current(constrain(mA, 400, 1500))); break; + case E3: TERN_(E3_IS_TRINAMIC, stepperE3.rms_current(constrain(mA, 400, 1500))); break; + case E4: TERN_(E4_IS_TRINAMIC, stepperE4.rms_current(constrain(mA, 400, 1500))); break; + case E5: TERN_(E5_IS_TRINAMIC, stepperE5.rms_current(constrain(mA, 400, 1500))); break; + case E6: TERN_(E6_IS_TRINAMIC, stepperE6.rms_current(constrain(mA, 400, 1500))); break; + case E7: TERN_(E7_IS_TRINAMIC, stepperE7.rms_current(constrain(mA, 400, 1500))); break; default: break; }; } @@ -614,48 +526,20 @@ namespace ExtUI { void setTMCBumpSensitivity(const_float_t value, const axis_t axis) { switch (axis) { - #if X_SENSORLESS - case X: stepperX.homing_threshold(value); break; - #endif - #if Y_SENSORLESS - case Y: stepperY.homing_threshold(value); break; - #endif - #if Z_SENSORLESS - case Z: stepperZ.homing_threshold(value); break; - #endif - #if I_SENSORLESS - case I: stepperI.homing_threshold(value); break; - #endif - #if J_SENSORLESS - case J: stepperJ.homing_threshold(value); break; - #endif - #if K_SENSORLESS - case K: stepperK.homing_threshold(value); break; - #endif - #if U_SENSORLESS - case U: stepperU.homing_threshold(value); break; - #endif - #if V_SENSORLESS - case V: stepperV.homing_threshold(value); break; - #endif - #if W_SENSORLESS - case W: stepperW.homing_threshold(value); break; - #endif - #if X2_SENSORLESS - case X2: stepperX2.homing_threshold(value); break; - #endif - #if Y2_SENSORLESS - case Y2: stepperY2.homing_threshold(value); break; - #endif - #if Z2_SENSORLESS - case Z2: stepperZ2.homing_threshold(value); break; - #endif - #if Z3_SENSORLESS - case Z3: stepperZ3.homing_threshold(value); break; - #endif - #if Z4_SENSORLESS - case Z4: stepperZ4.homing_threshold(value); break; - #endif + case X: TERN_(X_SENSORLESS, stepperX.homing_threshold(value)); break; + case Y: TERN_(Y_SENSORLESS, stepperY.homing_threshold(value)); break; + case Z: TERN_(Z_SENSORLESS, stepperZ.homing_threshold(value)); break; + case I: TERN_(I_SENSORLESS, stepperI.homing_threshold(value)); break; + case J: TERN_(J_SENSORLESS, stepperJ.homing_threshold(value)); break; + case K: TERN_(K_SENSORLESS, stepperK.homing_threshold(value)); break; + case U: TERN_(U_SENSORLESS, stepperU.homing_threshold(value)); break; + case V: TERN_(V_SENSORLESS, stepperV.homing_threshold(value)); break; + case W: TERN_(W_SENSORLESS, stepperW.homing_threshold(value)); break; + case X2: TERN_(X2_SENSORLESS, stepperX2.homing_threshold(value)); break; + case Y2: TERN_(Y2_SENSORLESS, stepperY2.homing_threshold(value)); break; + case Z2: TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(value)); break; + case Z3: TERN_(Z3_SENSORLESS, stepperZ3.homing_threshold(value)); break; + case Z4: TERN_(Z4_SENSORLESS, stepperZ4.homing_threshold(value)); break; default: break; } UNUSED(value); diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index c708bb5fa2..f73dd971df 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -32,74 +32,42 @@ #include "../../module/stepper/indirection.h" #include "../../feature/tmc_util.h" -#define TMC_EDIT_STORED_I_RMS(ST,STR) EDIT_ITEM_F(uint16_4, F(STR), &stepper##ST.val_mA, 100, 3000, []{ stepper##ST.refresh_stepper_current(); }) +#define TMC_EDIT_STORED_I_RMS(ST,STR) EDIT_ITEM_FAST_F(uint16_4, F(STR), &stepper##ST.val_mA, 100, 3000, []{ stepper##ST.refresh_stepper_current(); }) void menu_tmc_current() { START_MENU(); BACK_ITEM(MSG_TMC_DRIVERS); - #if AXIS_IS_TMC(X) - TMC_EDIT_STORED_I_RMS(X, STR_A); - #endif - #if AXIS_IS_TMC(Y) - TMC_EDIT_STORED_I_RMS(Y, STR_B); - #endif - #if AXIS_IS_TMC(Z) - TMC_EDIT_STORED_I_RMS(Z, STR_C); - #endif - #if AXIS_IS_TMC(X2) - TMC_EDIT_STORED_I_RMS(X2, STR_X2); - #endif - #if AXIS_IS_TMC(Y2) - TMC_EDIT_STORED_I_RMS(Y2, STR_Y2); - #endif - #if AXIS_IS_TMC(Z2) - TMC_EDIT_STORED_I_RMS(Z2, STR_Z2); - #endif - #if AXIS_IS_TMC(Z3) - TMC_EDIT_STORED_I_RMS(Z3, STR_Z3); - #endif - #if AXIS_IS_TMC(Z4) - TMC_EDIT_STORED_I_RMS(Z4, STR_Z4); - #endif - #if AXIS_IS_TMC(E0) - TMC_EDIT_STORED_I_RMS(E0, STR_E0); - #endif - #if AXIS_IS_TMC(E1) - TMC_EDIT_STORED_I_RMS(E1, STR_E1); - #endif - #if AXIS_IS_TMC(E2) - TMC_EDIT_STORED_I_RMS(E2, STR_E2); - #endif - #if AXIS_IS_TMC(E3) - TMC_EDIT_STORED_I_RMS(E3, STR_E3); - #endif - #if AXIS_IS_TMC(E4) - TMC_EDIT_STORED_I_RMS(E4, STR_E4); - #endif - #if AXIS_IS_TMC(E5) - TMC_EDIT_STORED_I_RMS(E5, STR_E5); - #endif - #if AXIS_IS_TMC(E6) - TMC_EDIT_STORED_I_RMS(E6, STR_E6); - #endif - #if AXIS_IS_TMC(E7) - TMC_EDIT_STORED_I_RMS(E7, STR_E7); - #endif + TERN_(X_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(X, STR_A)); + TERN_(X2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(X2, STR_X2)); + TERN_(Y_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Y, STR_B)); + TERN_(Y2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Y2, STR_Y2)); + TERN_(Z_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z, STR_C)); + TERN_(Z2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z2, STR_Z2)); + TERN_(Z3_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z3, STR_Z3)); + TERN_(Z4_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z4, STR_Z4)); + TERN_(E0_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E0, STR_E0)); + TERN_(E1_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E1, STR_E1)); + TERN_(E2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E2, STR_E2)); + TERN_(E3_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E3, STR_E3)); + TERN_(E4_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E4, STR_E4)); + TERN_(E5_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E5, STR_E5)); + TERN_(E6_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E6, STR_E6)); + TERN_(E7_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E7, STR_E7)); END_MENU(); } #if ENABLED(HYBRID_THRESHOLD) - #define TMC_EDIT_STORED_HYBRID_THRS(ST, STR) EDIT_ITEM_F(uint16_3, F(STR), &stepper##ST.stored.hybrid_thrs, 0, STEPPER_MAX_THRS(ST), []{ stepper##ST.refresh_hybrid_thrs(); }); + #define TMC_EDIT_STORED_HYBRID_THRS(ST, STR) EDIT_ITEM_FAST_F(uint16_3, F(STR), &stepper##ST.stored.hybrid_thrs, 0, STEPPER_MAX_THRS(ST), []{ stepper##ST.refresh_hybrid_thrs(); }); void menu_tmc_hybrid_thrs() { START_MENU(); BACK_ITEM(MSG_TMC_DRIVERS); - TERN_(X_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(X, STR_X)); - TERN_(Y_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Y, STR_Y)); - TERN_(Z_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z, STR_Z)); + TERN_( X_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(X, STR_X)); TERN_(X2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(X2, STR_X2)); + TERN_( Y_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Y, STR_Y)); TERN_(Y2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Y2, STR_Y2)); + TERN_( Z_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z, STR_Z)); TERN_(Z2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z2, STR_Z2)); TERN_(Z3_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z3, STR_Z3)); TERN_(Z4_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z4, STR_Z4)); @@ -114,7 +82,7 @@ void menu_tmc_current() { END_MENU(); } -#endif +#endif // HYBRID_THRESHOLD #if ENABLED(SENSORLESS_HOMING) @@ -140,7 +108,7 @@ void menu_tmc_current() { END_MENU(); } -#endif +#endif // SENSORLESS_HOMING #if HAS_STEALTHCHOP @@ -169,7 +137,7 @@ void menu_tmc_current() { END_MENU(); } -#endif +#endif // HAS_STEALTHCHOP void menu_tmc() { START_MENU(); diff --git a/Marlin/src/lcd/sovol_rts/sovol_rts.cpp b/Marlin/src/lcd/sovol_rts/sovol_rts.cpp index 1f3322ded7..c92850494b 100644 --- a/Marlin/src/lcd/sovol_rts/sovol_rts.cpp +++ b/Marlin/src/lcd/sovol_rts/sovol_rts.cpp @@ -122,7 +122,6 @@ bool card_insert_st; bool sd_printing; int16_t fan_speed; -char cmd[MAX_CMD_SIZE + 16]; inline void RTS_line_to_current(const AxisEnum axis) { if (!planner.is_full()) @@ -1398,18 +1397,10 @@ void RTS::handleData() { case TMCDriver: switch (recdat.data[0]) { case 1: // Current - #if AXIS_IS_TMC(X) - sendData(stepperX.getMilliamps(), Current_X_VP); - #endif - #if AXIS_IS_TMC(Y) - sendData(stepperY.getMilliamps(), Current_Y_VP); - #endif - #if AXIS_IS_TMC(Z) - sendData(stepperZ.getMilliamps(), Current_Z_VP); - #endif - #if AXIS_IS_TMC(E0) - sendData(stepperE0.getMilliamps(), Current_E_VP); - #endif + TERN_(X_IS_TRINAMIC, sendData(stepperX.getMilliamps(), Current_X_VP)); + TERN_(Y_IS_TRINAMIC, sendData(stepperY.getMilliamps(), Current_Y_VP)); + TERN_(Z_IS_TRINAMIC, sendData(stepperZ.getMilliamps(), Current_Z_VP)); + TERN_(E0_IS_TRINAMIC, sendData(stepperE0.getMilliamps(), Current_E_VP)); gotoPage(ID_DriverA_L, ID_DriverA_D); break; @@ -1434,39 +1425,19 @@ void RTS::handleData() { } break; - #if AXIS_IS_TMC(X) - case Current_X: sprintf_P(cmd, PSTR("M906 X%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if X_HAS_STEALTHCHOP - case Threshold_X: sprintf_P(cmd, PSTR("M913 X%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if X_SENSORLESS - case Sensorless_X: sprintf_P(cmd, PSTR("M914 X%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_X: TERN_(X_IS_TRINAMIC, queue.inject(TS(F("M906X"), int(recdat.data[0])))); break; + case Threshold_X: TERN_(X_HAS_STEALTHCHOP, queue.inject(TS(F("M913X"), int(recdat.data[0])))); break; + case Sensorless_X: TERN_(X_SENSORLESS, queue.inject(TS(F("M914X"), int(recdat.data[0])))); break; - #if AXIS_IS_TMC(Y) - case Current_Y: sprintf_P(cmd, PSTR("M906 Y%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if Y_HAS_STEALTHCHOP - case Threshold_Y: sprintf_P(cmd, PSTR("M913 Y%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if Y_SENSORLESS - case Sensorless_Y: sprintf_P(cmd, PSTR("M914 Y%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_Y: TERN_(X_IS_TRINAMIC, queue.inject(TS(F("M906Y"), int(recdat.data[0])))); break; + case Threshold_Y: TERN_(Y_HAS_STEALTHCHOP, queue.inject(TS(F("M913Y"), int(recdat.data[0])))); break; + case Sensorless_Y: TERN_(Y_SENSORLESS, queue.inject(TS(F("M914Y"), int(recdat.data[0])))); break; - #if AXIS_IS_TMC(Z) - case Current_Z: sprintf_P(cmd, PSTR("M906 Z%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if Z_HAS_STEALTHCHOP - case Threshold_Z: sprintf_P(cmd, PSTR("M913 Z%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_Z: TERN_(Z_IS_TRINAMIC, queue.inject(TS(F("M906Z"), int(recdat.data[0])))); break; + case Threshold_Z: TERN_(Z_HAS_STEALTHCHOP, queue.inject(TS(F("M913Z"), int(recdat.data[0])))); break; - #if AXIS_IS_TMC(E0) - case Current_E: sprintf_P(cmd, PSTR("M906 E%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if E0_HAS_STEALTHCHOP - case Threshold_E: sprintf_P(cmd, PSTR("M913 E%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_E: TERN_(AXIS_IS_TMC_E, queue.inject(TS(F("M906E"), int(recdat.data[0])))); break; + case Threshold_E: TERN_(E_HAS_STEALTHCHOP, queue.inject(TS(F("M913E"), int(recdat.data[0])))); break; #endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 6a039c8ab9..386d46665d 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -271,46 +271,46 @@ void report_current_position_projected() { #define debug_current(...) #endif - #if HAS_CURRENT_HOME(X) + #if HAS_CURRENT_HOME_X int16_t saved_current_X; #endif - #if HAS_CURRENT_HOME(Y) + #if HAS_CURRENT_HOME_Y int16_t saved_current_Y; #endif - #if HAS_CURRENT_HOME(Z) + #if HAS_CURRENT_HOME_Z int16_t saved_current_Z; #endif - #if HAS_CURRENT_HOME(X2) + #if HAS_CURRENT_HOME_X2 int16_t saved_current_X2; #endif - #if HAS_CURRENT_HOME(Y2) + #if HAS_CURRENT_HOME_Y2 int16_t saved_current_Y2; #endif - #if HAS_CURRENT_HOME(Z2) + #if HAS_CURRENT_HOME_Z2 int16_t saved_current_Z2; #endif - #if HAS_CURRENT_HOME(Z3) + #if HAS_CURRENT_HOME_Z3 int16_t saved_current_Z3; #endif - #if HAS_CURRENT_HOME(Z4) + #if HAS_CURRENT_HOME_Z4 int16_t saved_current_Z4; #endif - #if HAS_CURRENT_HOME(I) + #if HAS_CURRENT_HOME_I int16_t saved_current_I; #endif - #if HAS_CURRENT_HOME(J) + #if HAS_CURRENT_HOME_J int16_t saved_current_J; #endif - #if HAS_CURRENT_HOME(K) + #if HAS_CURRENT_HOME_K int16_t saved_current_K; #endif - #if HAS_CURRENT_HOME(U) + #if HAS_CURRENT_HOME_U int16_t saved_current_U; #endif - #if HAS_CURRENT_HOME(V) + #if HAS_CURRENT_HOME_V int16_t saved_current_V; #endif - #if HAS_CURRENT_HOME(W) + #if HAS_CURRENT_HOME_W int16_t saved_current_W; #endif @@ -326,6 +326,8 @@ void report_current_position_projected() { stepper##A.rms_current(A##_CURRENT_HOME); \ debug_current(F(STR_##A), saved_current_##A, A##_CURRENT_HOME) + #define _MAP_SAVE_SET(A) OPTCODE(A##_HAS_HOME_CURRENT, _SAVE_SET_CURRENT(A)) + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Setting homing driver current"); #if ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) @@ -333,34 +335,8 @@ void report_current_position_projected() { // CORE and Markforged kinematics switch (axis) { default: break; - case X_AXIS: case Y_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _SAVE_SET_CURRENT(X2); - #endif - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _SAVE_SET_CURRENT(Y2); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _SAVE_SET_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _SAVE_SET_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _SAVE_SET_CURRENT(Z4); - #endif - break; + case X_AXIS: case Y_AXIS: MAP(_MAP_SAVE_SET, X, X2, Y, Y2); break; + case Z_AXIS: MAP(_MAP_SAVE_SET, Z, Z2, Z3, Z4); break; } #elif CORE_IS_XZ @@ -368,22 +344,8 @@ void report_current_position_projected() { // CORE XZ / ZX switch (axis) { default: break; - case X_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _SAVE_SET_CURRENT(Y2); - #endif - break; + case X_AXIS: case Z_AXIS: MAP(_MAP_SAVE_SET, X, Z); break; + case Y_AXIS: MAP(_MAP_SAVE_SET, Y, Y2); break; } #elif CORE_IS_YZ @@ -391,22 +353,8 @@ void report_current_position_projected() { // CORE YZ / ZY switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _SAVE_SET_CURRENT(X2); - #endif - break; - case Y_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - break; + case X_AXIS: MAP(_MAP_SAVE_SET, X, X2); break; + case Y_AXIS: case Z_AXIS: MAP(_MAP_SAVE_SET, Y, Z); break; } #elif IS_SCARA @@ -414,13 +362,13 @@ void report_current_position_projected() { // SCARA kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _SAVE_SET_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _SAVE_SET_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _SAVE_SET_CURRENT(Z); break; #endif } @@ -429,13 +377,13 @@ void report_current_position_projected() { // TPARA or DELTA kinematics. // Z_AXIS is a special mode to apply homing current to all axes. - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT if (axis == A_AXIS || axis == Z_AXIS) _SAVE_SET_CURRENT(X); #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT if (axis == B_AXIS || axis == Z_AXIS) _SAVE_SET_CURRENT(Y); #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT if (axis == C_AXIS) _SAVE_SET_CURRENT(Z); #endif @@ -444,13 +392,13 @@ void report_current_position_projected() { // POLAR kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _SAVE_SET_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _SAVE_SET_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _SAVE_SET_CURRENT(Z); break; #endif } @@ -461,13 +409,13 @@ void report_current_position_projected() { // Useful? switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _SAVE_SET_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _SAVE_SET_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _SAVE_SET_CURRENT(Z); break; #endif } @@ -477,27 +425,9 @@ void report_current_position_projected() { // Foam cutter switch (axis) { default: break; - case X_AXIS: case I_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(I) - _SAVE_SET_CURRENT(I); - #endif - break; - case Y_AXIS: case J_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(J) - _SAVE_SET_CURRENT(J); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - break; + case X_AXIS: case I_AXIS: MAP(_MAP_SAVE_SET, X, I); break; + case Y_AXIS: case J_AXIS: MAP(_MAP_SAVE_SET, Y, J); break; + case Z_AXIS: MAP(_MAP_SAVE_SET, Z); break; } #else @@ -505,58 +435,31 @@ void report_current_position_projected() { // Cartesian kinematics switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _SAVE_SET_CURRENT(X2); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _SAVE_SET_CURRENT(Y2); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _SAVE_SET_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _SAVE_SET_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _SAVE_SET_CURRENT(Z4); - #endif - break; + case X_AXIS: MAP(_MAP_SAVE_SET, X, X2); break; + case Y_AXIS: MAP(_MAP_SAVE_SET, Y, Y2); break; + case Z_AXIS: MAP(_MAP_SAVE_SET, Z, Z2, Z3, Z4); break; } #endif // kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(I) && DISABLED(FOAMCUTTER_XYUV) + #if I_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case I_AXIS: _SAVE_SET_CURRENT(I); break; #endif - #if HAS_CURRENT_HOME(J) && DISABLED(FOAMCUTTER_XYUV) + #if J_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case J_AXIS: _SAVE_SET_CURRENT(J); break; #endif - #if HAS_CURRENT_HOME(K) + #if K_HAS_HOME_CURRENT case K_AXIS: _SAVE_SET_CURRENT(K); break; #endif - #if HAS_CURRENT_HOME(U) + #if U_HAS_HOME_CURRENT case U_AXIS: _SAVE_SET_CURRENT(U); break; #endif - #if HAS_CURRENT_HOME(V) + #if V_HAS_HOME_CURRENT case V_AXIS: _SAVE_SET_CURRENT(V); break; #endif - #if HAS_CURRENT_HOME(W) + #if W_HAS_HOME_CURRENT case W_AXIS: _SAVE_SET_CURRENT(W); break; #endif } @@ -578,6 +481,8 @@ void report_current_position_projected() { stepper##A.rms_current(saved_current_##A); \ debug_current(F(STR_##A), A##_CURRENT_HOME, saved_current_##A) + #define _MAP_RESTORE(A) OPTCODE(A##_HAS_HOME_CURRENT, _RESTORE_CURRENT(A)) + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Restore driver current"); #if ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) @@ -585,28 +490,8 @@ void report_current_position_projected() { // CORE and Markforged kinematics switch (axis) { default: break; - case X_AXIS: case Y_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _RESTORE_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _RESTORE_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _RESTORE_CURRENT(Z4); - #endif - break; + case X_AXIS: case Y_AXIS: MAP(_MAP_RESTORE, X, Y); break; + case Z_AXIS: MAP(_MAP_RESTORE, Z, Z2, Z3, Z4); break; } #elif CORE_IS_XZ @@ -614,22 +499,8 @@ void report_current_position_projected() { // CORE XZ / ZX switch (axis) { default: break; - case X_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _RESTORE_CURRENT(Y2); - #endif - break; + case X_AXIS: case Z_AXIS: MAP(_MAP_RESTORE, X, Z); break; + case Y_AXIS: MAP(_MAP_RESTORE, Y, Y2); break; } #elif CORE_IS_YZ @@ -637,22 +508,8 @@ void report_current_position_projected() { // CORE YZ / ZY switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _RESTORE_CURRENT(X2); - #endif - break; - case Y_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - break; + case X_AXIS: MAP(_MAP_RESTORE, X, X2); break; + case Y_AXIS: case Z_AXIS: MAP(_MAP_RESTORE, Y, Z); break; } #elif IS_SCARA // Unsupported for now? @@ -660,13 +517,13 @@ void report_current_position_projected() { // SCARA kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _RESTORE_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _RESTORE_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _RESTORE_CURRENT(Z); break; #endif } @@ -675,13 +532,13 @@ void report_current_position_projected() { // TPARA or DELTA kinematics // Z_AXIS is a special mode to set homing current to all axes - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT if (axis == A_AXIS || axis == Z_AXIS) _RESTORE_CURRENT(X); #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT if (axis == B_AXIS || axis == Z_AXIS) _RESTORE_CURRENT(Y); #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT if (axis == C_AXIS) _RESTORE_CURRENT(Z); #endif @@ -690,13 +547,13 @@ void report_current_position_projected() { // POLAR kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _RESTORE_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _RESTORE_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _RESTORE_CURRENT(Z); break; #endif } @@ -707,13 +564,13 @@ void report_current_position_projected() { // Useful? switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _RESTORE_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _RESTORE_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _RESTORE_CURRENT(Z); break; #endif } @@ -723,27 +580,9 @@ void report_current_position_projected() { // Foam cutter switch (axis) { default: break; - case X_AXIS: case I_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(I) - _RESTORE_CURRENT(I); - #endif - break; - case Y_AXIS: case J_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(J) - _RESTORE_CURRENT(J); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - break; + case X_AXIS: case I_AXIS: MAP(_MAP_RESTORE, X, I); break; + case Y_AXIS: case J_AXIS: MAP(_MAP_RESTORE, Y, J); break; + case Z_AXIS: MAP(_MAP_RESTORE, Z); break; } #else @@ -751,58 +590,31 @@ void report_current_position_projected() { // Cartesian kinematics switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _RESTORE_CURRENT(X2); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _RESTORE_CURRENT(Y2); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _RESTORE_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _RESTORE_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _RESTORE_CURRENT(Z4); - #endif - break; + case X_AXIS: MAP(_MAP_RESTORE, X, X2); break; + case Y_AXIS: MAP(_MAP_RESTORE, Y, Y2); break; + case Z_AXIS: MAP(_MAP_RESTORE, Z, Z2, Z3, Z4); break; } #endif // kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(I) && DISABLED(FOAMCUTTER_XYUV) + #if I_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case I_AXIS: _RESTORE_CURRENT(I); break; #endif - #if HAS_CURRENT_HOME(J) && DISABLED(FOAMCUTTER_XYUV) + #if J_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case J_AXIS: _RESTORE_CURRENT(J); break; #endif - #if HAS_CURRENT_HOME(K) + #if K_HAS_HOME_CURRENT case K_AXIS: _RESTORE_CURRENT(K); break; #endif - #if HAS_CURRENT_HOME(U) + #if U_HAS_HOME_CURRENT case U_AXIS: _RESTORE_CURRENT(U); break; #endif - #if HAS_CURRENT_HOME(V) + #if V_HAS_HOME_CURRENT case V_AXIS: _RESTORE_CURRENT(V); break; #endif - #if HAS_CURRENT_HOME(W) + #if W_HAS_HOME_CURRENT case W_AXIS: _RESTORE_CURRENT(W); break; #endif } diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 6d3bfaed0d..18376cf773 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -636,6 +636,9 @@ void home_if_needed(const bool keeplev=false); void set_home_offset(const AxisEnum axis, const_float_t v); #endif +// +// Trinamic Stepper Drivers +// #if USE_SENSORLESS struct sensorless_t; sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 8c33e73f00..a7e791951b 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -1393,72 +1393,28 @@ void MarlinSettings::postprocess() { per_stepper_uint16_t tmc_stepper_current{0}; #if HAS_TRINAMIC_CONFIG - #if AXIS_IS_TMC(X) - tmc_stepper_current.X = stepperX.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y) - tmc_stepper_current.Y = stepperY.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z) - tmc_stepper_current.Z = stepperZ.getMilliamps(); - #endif - #if AXIS_IS_TMC(I) - tmc_stepper_current.I = stepperI.getMilliamps(); - #endif - #if AXIS_IS_TMC(J) - tmc_stepper_current.J = stepperJ.getMilliamps(); - #endif - #if AXIS_IS_TMC(K) - tmc_stepper_current.K = stepperK.getMilliamps(); - #endif - #if AXIS_IS_TMC(U) - tmc_stepper_current.U = stepperU.getMilliamps(); - #endif - #if AXIS_IS_TMC(V) - tmc_stepper_current.V = stepperV.getMilliamps(); - #endif - #if AXIS_IS_TMC(W) - tmc_stepper_current.W = stepperW.getMilliamps(); - #endif - #if AXIS_IS_TMC(X2) - tmc_stepper_current.X2 = stepperX2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y2) - tmc_stepper_current.Y2 = stepperY2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z2) - tmc_stepper_current.Z2 = stepperZ2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z3) - tmc_stepper_current.Z3 = stepperZ3.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z4) - tmc_stepper_current.Z4 = stepperZ4.getMilliamps(); - #endif - #if AXIS_IS_TMC(E0) - tmc_stepper_current.E0 = stepperE0.getMilliamps(); - #endif - #if AXIS_IS_TMC(E1) - tmc_stepper_current.E1 = stepperE1.getMilliamps(); - #endif - #if AXIS_IS_TMC(E2) - tmc_stepper_current.E2 = stepperE2.getMilliamps(); - #endif - #if AXIS_IS_TMC(E3) - tmc_stepper_current.E3 = stepperE3.getMilliamps(); - #endif - #if AXIS_IS_TMC(E4) - tmc_stepper_current.E4 = stepperE4.getMilliamps(); - #endif - #if AXIS_IS_TMC(E5) - tmc_stepper_current.E5 = stepperE5.getMilliamps(); - #endif - #if AXIS_IS_TMC(E6) - tmc_stepper_current.E6 = stepperE6.getMilliamps(); - #endif - #if AXIS_IS_TMC(E7) - tmc_stepper_current.E7 = stepperE7.getMilliamps(); - #endif + TERN_(X_IS_TRINAMIC, tmc_stepper_current.X = stepperX.getMilliamps()); + TERN_(Y_IS_TRINAMIC, tmc_stepper_current.Y = stepperY.getMilliamps()); + TERN_(Z_IS_TRINAMIC, tmc_stepper_current.Z = stepperZ.getMilliamps()); + TERN_(I_IS_TRINAMIC, tmc_stepper_current.I = stepperI.getMilliamps()); + TERN_(J_IS_TRINAMIC, tmc_stepper_current.J = stepperJ.getMilliamps()); + TERN_(K_IS_TRINAMIC, tmc_stepper_current.K = stepperK.getMilliamps()); + TERN_(U_IS_TRINAMIC, tmc_stepper_current.U = stepperU.getMilliamps()); + TERN_(V_IS_TRINAMIC, tmc_stepper_current.V = stepperV.getMilliamps()); + TERN_(W_IS_TRINAMIC, tmc_stepper_current.W = stepperW.getMilliamps()); + TERN_(X2_IS_TRINAMIC, tmc_stepper_current.X2 = stepperX2.getMilliamps()); + TERN_(Y2_IS_TRINAMIC, tmc_stepper_current.Y2 = stepperY2.getMilliamps()); + TERN_(Z2_IS_TRINAMIC, tmc_stepper_current.Z2 = stepperZ2.getMilliamps()); + TERN_(Z3_IS_TRINAMIC, tmc_stepper_current.Z3 = stepperZ3.getMilliamps()); + TERN_(Z4_IS_TRINAMIC, tmc_stepper_current.Z4 = stepperZ4.getMilliamps()); + TERN_(E0_IS_TRINAMIC, tmc_stepper_current.E0 = stepperE0.getMilliamps()); + TERN_(E1_IS_TRINAMIC, tmc_stepper_current.E1 = stepperE1.getMilliamps()); + TERN_(E2_IS_TRINAMIC, tmc_stepper_current.E2 = stepperE2.getMilliamps()); + TERN_(E3_IS_TRINAMIC, tmc_stepper_current.E3 = stepperE3.getMilliamps()); + TERN_(E4_IS_TRINAMIC, tmc_stepper_current.E4 = stepperE4.getMilliamps()); + TERN_(E5_IS_TRINAMIC, tmc_stepper_current.E5 = stepperE5.getMilliamps()); + TERN_(E6_IS_TRINAMIC, tmc_stepper_current.E6 = stepperE6.getMilliamps()); + TERN_(E7_IS_TRINAMIC, tmc_stepper_current.E7 = stepperE7.getMilliamps()); #endif EEPROM_WRITE(tmc_stepper_current); } @@ -2499,72 +2455,28 @@ void MarlinSettings::postprocess() { #define SET_CURR(Q) stepper##Q.rms_current(currents.Q ? currents.Q : Q##_CURRENT) if (!validating) { - #if AXIS_IS_TMC(X) - SET_CURR(X); - #endif - #if AXIS_IS_TMC(Y) - SET_CURR(Y); - #endif - #if AXIS_IS_TMC(Z) - SET_CURR(Z); - #endif - #if AXIS_IS_TMC(X2) - SET_CURR(X2); - #endif - #if AXIS_IS_TMC(Y2) - SET_CURR(Y2); - #endif - #if AXIS_IS_TMC(Z2) - SET_CURR(Z2); - #endif - #if AXIS_IS_TMC(Z3) - SET_CURR(Z3); - #endif - #if AXIS_IS_TMC(Z4) - SET_CURR(Z4); - #endif - #if AXIS_IS_TMC(I) - SET_CURR(I); - #endif - #if AXIS_IS_TMC(J) - SET_CURR(J); - #endif - #if AXIS_IS_TMC(K) - SET_CURR(K); - #endif - #if AXIS_IS_TMC(U) - SET_CURR(U); - #endif - #if AXIS_IS_TMC(V) - SET_CURR(V); - #endif - #if AXIS_IS_TMC(W) - SET_CURR(W); - #endif - #if AXIS_IS_TMC(E0) - SET_CURR(E0); - #endif - #if AXIS_IS_TMC(E1) - SET_CURR(E1); - #endif - #if AXIS_IS_TMC(E2) - SET_CURR(E2); - #endif - #if AXIS_IS_TMC(E3) - SET_CURR(E3); - #endif - #if AXIS_IS_TMC(E4) - SET_CURR(E4); - #endif - #if AXIS_IS_TMC(E5) - SET_CURR(E5); - #endif - #if AXIS_IS_TMC(E6) - SET_CURR(E6); - #endif - #if AXIS_IS_TMC(E7) - SET_CURR(E7); - #endif + TERN_(X_IS_TRINAMIC, SET_CURR(X)); + TERN_(Y_IS_TRINAMIC, SET_CURR(Y)); + TERN_(Z_IS_TRINAMIC, SET_CURR(Z)); + TERN_(I_IS_TRINAMIC, SET_CURR(I)); + TERN_(J_IS_TRINAMIC, SET_CURR(J)); + TERN_(K_IS_TRINAMIC, SET_CURR(K)); + TERN_(U_IS_TRINAMIC, SET_CURR(U)); + TERN_(V_IS_TRINAMIC, SET_CURR(V)); + TERN_(W_IS_TRINAMIC, SET_CURR(W)); + TERN_(X2_IS_TRINAMIC, SET_CURR(X2)); + TERN_(Y2_IS_TRINAMIC, SET_CURR(Y2)); + TERN_(Z2_IS_TRINAMIC, SET_CURR(Z2)); + TERN_(Z3_IS_TRINAMIC, SET_CURR(Z3)); + TERN_(Z4_IS_TRINAMIC, SET_CURR(Z4)); + TERN_(E0_IS_TRINAMIC, SET_CURR(E0)); + TERN_(E1_IS_TRINAMIC, SET_CURR(E1)); + TERN_(E2_IS_TRINAMIC, SET_CURR(E2)); + TERN_(E3_IS_TRINAMIC, SET_CURR(E3)); + TERN_(E4_IS_TRINAMIC, SET_CURR(E4)); + TERN_(E5_IS_TRINAMIC, SET_CURR(E5)); + TERN_(E6_IS_TRINAMIC, SET_CURR(E6)); + TERN_(E7_IS_TRINAMIC, SET_CURR(E7)); } #endif } diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 69c6f66fbc..1ec82ba340 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2949,54 +2949,20 @@ void Stepper::init() { TERN_(HAS_MICROSTEPS, microstep_init()); // Init Dir Pins - TERN_(HAS_X_DIR, X_DIR_INIT()); + TERN_(HAS_X_DIR, X_DIR_INIT()); TERN_(HAS_X2_DIR, X2_DIR_INIT()); - #if HAS_Y_DIR - Y_DIR_INIT(); - #if ALL(HAS_Y2_STEPPER, HAS_Y2_DIR) - Y2_DIR_INIT(); - #endif - #endif - #if HAS_Z_DIR - Z_DIR_INIT(); - #if NUM_Z_STEPPERS >= 2 && HAS_Z2_DIR - Z2_DIR_INIT(); - #endif - #if NUM_Z_STEPPERS >= 3 && HAS_Z3_DIR - Z3_DIR_INIT(); - #endif - #if NUM_Z_STEPPERS >= 4 && HAS_Z4_DIR - Z4_DIR_INIT(); - #endif - #endif - SECONDARY_AXIS_CODE( - I_DIR_INIT(), J_DIR_INIT(), K_DIR_INIT(), - U_DIR_INIT(), V_DIR_INIT(), W_DIR_INIT() - ); - #if HAS_E0_DIR - E0_DIR_INIT(); - #endif - #if HAS_E1_DIR - E1_DIR_INIT(); - #endif - #if HAS_E2_DIR - E2_DIR_INIT(); - #endif - #if HAS_E3_DIR - E3_DIR_INIT(); - #endif - #if HAS_E4_DIR - E4_DIR_INIT(); - #endif - #if HAS_E5_DIR - E5_DIR_INIT(); - #endif - #if HAS_E6_DIR - E6_DIR_INIT(); - #endif - #if HAS_E7_DIR - E7_DIR_INIT(); - #endif + TERN_(HAS_Y_DIR, Y_DIR_INIT()); + TERN_(HAS_Y2_DIR, Y2_DIR_INIT()); + TERN_(HAS_Z_DIR, Z_DIR_INIT()); + TERN_(HAS_Z2_DIR, Z2_DIR_INIT()); + TERN_(HAS_Z3_DIR, Z3_DIR_INIT()); + TERN_(HAS_Z4_DIR, Z4_DIR_INIT()); + TERN_(HAS_I_DIR, I_DIR_INIT()); + TERN_(HAS_K_DIR, K_DIR_INIT()); + TERN_(HAS_K_DIR, K_DIR_INIT()); + TERN_(HAS_U_DIR, U_DIR_INIT()); + TERN_(HAS_V_DIR, V_DIR_INIT()); + TERN_(HAS_W_DIR, W_DIR_INIT()); // Init Enable Pins - steppers default to disabled. #if HAS_X_ENABLE @@ -3027,15 +2993,15 @@ void Stepper::init() { #endif Z_ENABLE_INIT(); if (Z_ENABLE_INIT_STATE) Z_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #if NUM_Z_STEPPERS >= 2 && HAS_Z2_ENABLE + #if HAS_Z2_ENABLE Z2_ENABLE_INIT(); if (Z_ENABLE_INIT_STATE) Z2_ENABLE_WRITE(Z_ENABLE_INIT_STATE); #endif - #if NUM_Z_STEPPERS >= 3 && HAS_Z3_ENABLE + #if HAS_Z3_ENABLE Z3_ENABLE_INIT(); if (Z_ENABLE_INIT_STATE) Z3_ENABLE_WRITE(Z_ENABLE_INIT_STATE); #endif - #if NUM_Z_STEPPERS >= 4 && HAS_Z4_ENABLE + #if HAS_Z4_ENABLE Z4_ENABLE_INIT(); if (Z_ENABLE_INIT_STATE) Z4_ENABLE_WRITE(Z_ENABLE_INIT_STATE); #endif @@ -3133,7 +3099,7 @@ void Stepper::init() { _WRITE_STEP(AXIS, !_STEP_STATE(PIN)); \ _DISABLE_AXIS(AXIS) - #define E_AXIS_INIT(NUM) AXIS_INIT(E## NUM, E) + #define E_AXIS_INIT(NUM) DEFER(AXIS_INIT)(E##NUM, E) // Init Step Pins #if HAS_X_STEP @@ -3167,49 +3133,21 @@ void Stepper::init() { #endif AXIS_INIT(Z, Z); #endif - #if HAS_I_STEP - AXIS_INIT(I, I); - #endif - #if HAS_J_STEP - AXIS_INIT(J, J); - #endif - #if HAS_K_STEP - AXIS_INIT(K, K); - #endif - #if HAS_U_STEP - AXIS_INIT(U, U); - #endif - #if HAS_V_STEP - AXIS_INIT(V, V); - #endif - #if HAS_W_STEP - AXIS_INIT(W, W); - #endif + TERN_(HAS_I_STEP, AXIS_INIT(I, I)); + TERN_(HAS_J_STEP, AXIS_INIT(J, J)); + TERN_(HAS_K_STEP, AXIS_INIT(K, K)); + TERN_(HAS_U_STEP, AXIS_INIT(U, U)); + TERN_(HAS_V_STEP, AXIS_INIT(V, V)); + TERN_(HAS_W_STEP, AXIS_INIT(W, W)); - #if E_STEPPERS && HAS_E0_STEP - E_AXIS_INIT(0); - #endif - #if (E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS)) && HAS_E1_STEP - E_AXIS_INIT(1); - #endif - #if E_STEPPERS > 2 && HAS_E2_STEP - E_AXIS_INIT(2); - #endif - #if E_STEPPERS > 3 && HAS_E3_STEP - E_AXIS_INIT(3); - #endif - #if E_STEPPERS > 4 && HAS_E4_STEP - E_AXIS_INIT(4); - #endif - #if E_STEPPERS > 5 && HAS_E5_STEP - E_AXIS_INIT(5); - #endif - #if E_STEPPERS > 6 && HAS_E6_STEP - E_AXIS_INIT(6); - #endif - #if E_STEPPERS > 7 && HAS_E7_STEP - E_AXIS_INIT(7); - #endif + TERN_(HAS_E0_STEP, E_AXIS_INIT(0)); + TERN_(HAS_E1_STEP, E_AXIS_INIT(1)); + TERN_(HAS_E2_STEP, E_AXIS_INIT(2)); + TERN_(HAS_E3_STEP, E_AXIS_INIT(3)); + TERN_(HAS_E4_STEP, E_AXIS_INIT(4)); + TERN_(HAS_E5_STEP, E_AXIS_INIT(5)); + TERN_(HAS_E6_STEP, E_AXIS_INIT(6)); + TERN_(HAS_E7_STEP, E_AXIS_INIT(7)); #if DISABLED(I2S_STEPPER_STREAM) HAL_timer_start(MF_TIMER_STEP, 122); // Init Stepper ISR to 122 Hz for quick starting diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 4c83cbd6a6..d18fe830cc 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -810,48 +810,24 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef ENABLE_STEPPER_U - #if HAS_U_ENABLE - #define ENABLE_STEPPER_U() U_ENABLE_WRITE( U_ENABLE_ON) - #else - #define ENABLE_STEPPER_U() NOOP - #endif + #define ENABLE_STEPPER_U() TERN(HAS_U_ENABLE, U_ENABLE_WRITE( U_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_U - #if HAS_U_ENABLE - #define DISABLE_STEPPER_U() U_ENABLE_WRITE(!U_ENABLE_ON) - #else - #define DISABLE_STEPPER_U() NOOP - #endif + #define DISABLE_STEPPER_U() TERN(HAS_U_ENABLE, U_ENABLE_WRITE(!U_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_V - #if HAS_V_ENABLE - #define ENABLE_STEPPER_V() V_ENABLE_WRITE( V_ENABLE_ON) - #else - #define ENABLE_STEPPER_V() NOOP - #endif + #define ENABLE_STEPPER_V() TERN(HAS_V_ENABLE, V_ENABLE_WRITE( V_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_V - #if HAS_V_ENABLE - #define DISABLE_STEPPER_V() V_ENABLE_WRITE(!V_ENABLE_ON) - #else - #define DISABLE_STEPPER_V() NOOP - #endif + #define DISABLE_STEPPER_V() TERN(HAS_V_ENABLE, V_ENABLE_WRITE(!V_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_W - #if HAS_W_ENABLE - #define ENABLE_STEPPER_W() W_ENABLE_WRITE( W_ENABLE_ON) - #else - #define ENABLE_STEPPER_W() NOOP - #endif + #define ENABLE_STEPPER_W() TERN(HAS_W_ENABLE, W_ENABLE_WRITE( W_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_W - #if HAS_W_ENABLE - #define DISABLE_STEPPER_W() W_ENABLE_WRITE(!W_ENABLE_ON) - #else - #define DISABLE_STEPPER_W() NOOP - #endif + #define DISABLE_STEPPER_W() TERN(HAS_W_ENABLE, W_ENABLE_WRITE(!W_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E0 @@ -877,93 +853,45 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef ENABLE_STEPPER_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define ENABLE_STEPPER_E2() E2_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E2() NOOP - #endif + #define ENABLE_STEPPER_E2() TERN(HAS_E2_ENABLE, E2_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define DISABLE_STEPPER_E2() E2_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E2() NOOP - #endif + #define DISABLE_STEPPER_E2() TERN(HAS_E2_ENABLE, E2_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define ENABLE_STEPPER_E3() E3_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E3() NOOP - #endif + #define ENABLE_STEPPER_E3() TERN(HAS_E3_ENABLE, E3_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define DISABLE_STEPPER_E3() E3_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E3() NOOP - #endif + #define DISABLE_STEPPER_E3() TERN(HAS_E3_ENABLE, E3_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define ENABLE_STEPPER_E4() E4_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E4() NOOP - #endif + #define ENABLE_STEPPER_E4() TERN(HAS_E4_ENABLE, E4_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define DISABLE_STEPPER_E4() E4_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E4() NOOP - #endif + #define DISABLE_STEPPER_E4() TERN(HAS_E4_ENABLE, E4_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define ENABLE_STEPPER_E5() E5_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E5() NOOP - #endif + #define ENABLE_STEPPER_E5() TERN(HAS_E5_ENABLE, E5_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define DISABLE_STEPPER_E5() E5_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E5() NOOP - #endif + #define DISABLE_STEPPER_E5() TERN(HAS_E5_ENABLE, E5_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define ENABLE_STEPPER_E6() E6_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E6() NOOP - #endif + #define ENABLE_STEPPER_E6() TERN(HAS_E6_ENABLE, E6_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define DISABLE_STEPPER_E6() E6_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E6() NOOP - #endif + #define DISABLE_STEPPER_E6() TERN(HAS_E6_ENABLE, E6_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define ENABLE_STEPPER_E7() E7_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E7() NOOP - #endif + #define ENABLE_STEPPER_E7() TERN(HAS_E7_ENABLE, E7_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define DISABLE_STEPPER_E7() E7_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E7() NOOP - #endif + #define DISABLE_STEPPER_E7() TERN(HAS_E7_ENABLE, E7_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif // @@ -1077,121 +1005,57 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef ENABLE_AXIS_E0 - #if E_STEPPERS && HAS_E0_ENABLE - #define ENABLE_AXIS_E0() ENABLE_STEPPER_E0() - #else - #define ENABLE_AXIS_E0() NOOP - #endif + #define ENABLE_AXIS_E0() TERN(HAS_E0_ENABLE, ENABLE_STEPPER_E0(), NOOP) #endif #ifndef DISABLE_AXIS_E0 - #if E_STEPPERS && HAS_E0_ENABLE - #define DISABLE_AXIS_E0() DISABLE_STEPPER_E0() - #else - #define DISABLE_AXIS_E0() NOOP - #endif + #define DISABLE_AXIS_E0() TERN(HAS_E0_ENABLE, DISABLE_STEPPER_E0(), NOOP) #endif #ifndef ENABLE_AXIS_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define ENABLE_AXIS_E1() ENABLE_STEPPER_E1() - #else - #define ENABLE_AXIS_E1() NOOP - #endif + #define ENABLE_AXIS_E1() TERN(HAS_E1_ENABLE, ENABLE_STEPPER_E1(), NOOP) #endif #ifndef DISABLE_AXIS_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define DISABLE_AXIS_E1() DISABLE_STEPPER_E1() - #else - #define DISABLE_AXIS_E1() NOOP - #endif + #define DISABLE_AXIS_E1() TERN(HAS_E1_ENABLE, DISABLE_STEPPER_E1(), NOOP) #endif #ifndef ENABLE_AXIS_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define ENABLE_AXIS_E2() ENABLE_STEPPER_E2() - #else - #define ENABLE_AXIS_E2() NOOP - #endif + #define ENABLE_AXIS_E2() TERN(HAS_E2_ENABLE, ENABLE_STEPPER_E2(), NOOP) #endif #ifndef DISABLE_AXIS_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define DISABLE_AXIS_E2() DISABLE_STEPPER_E2() - #else - #define DISABLE_AXIS_E2() NOOP - #endif + #define DISABLE_AXIS_E2() TERN(HAS_E2_ENABLE, DISABLE_STEPPER_E2(), NOOP) #endif #ifndef ENABLE_AXIS_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define ENABLE_AXIS_E3() ENABLE_STEPPER_E3() - #else - #define ENABLE_AXIS_E3() NOOP - #endif + #define ENABLE_AXIS_E3() TERN(HAS_E3_ENABLE, ENABLE_STEPPER_E3(), NOOP) #endif #ifndef DISABLE_AXIS_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define DISABLE_AXIS_E3() DISABLE_STEPPER_E3() - #else - #define DISABLE_AXIS_E3() NOOP - #endif + #define DISABLE_AXIS_E3() TERN(HAS_E3_ENABLE, DISABLE_STEPPER_E3(), NOOP) #endif #ifndef ENABLE_AXIS_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define ENABLE_AXIS_E4() ENABLE_STEPPER_E4() - #else - #define ENABLE_AXIS_E4() NOOP - #endif + #define ENABLE_AXIS_E4() TERN(HAS_E4_ENABLE, ENABLE_STEPPER_E4(), NOOP) #endif #ifndef DISABLE_AXIS_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define DISABLE_AXIS_E4() DISABLE_STEPPER_E4() - #else - #define DISABLE_AXIS_E4() NOOP - #endif + #define DISABLE_AXIS_E4() TERN(HAS_E4_ENABLE, DISABLE_STEPPER_E4(), NOOP) #endif #ifndef ENABLE_AXIS_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define ENABLE_AXIS_E5() ENABLE_STEPPER_E5() - #else - #define ENABLE_AXIS_E5() NOOP - #endif + #define ENABLE_AXIS_E5() TERN(HAS_E5_ENABLE, ENABLE_STEPPER_E5(), NOOP) #endif #ifndef DISABLE_AXIS_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define DISABLE_AXIS_E5() DISABLE_STEPPER_E5() - #else - #define DISABLE_AXIS_E5() NOOP - #endif + #define DISABLE_AXIS_E5() TERN(HAS_E5_ENABLE, DISABLE_STEPPER_E5(), NOOP) #endif #ifndef ENABLE_AXIS_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define ENABLE_AXIS_E6() ENABLE_STEPPER_E6() - #else - #define ENABLE_AXIS_E6() NOOP - #endif + #define ENABLE_AXIS_E6() TERN(HAS_E6_ENABLE, ENABLE_STEPPER_E6(), NOOP) #endif #ifndef DISABLE_AXIS_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define DISABLE_AXIS_E6() DISABLE_STEPPER_E6() - #else - #define DISABLE_AXIS_E6() NOOP - #endif + #define DISABLE_AXIS_E6() TERN(HAS_E6_ENABLE, DISABLE_STEPPER_E6(), NOOP) #endif #ifndef ENABLE_AXIS_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define ENABLE_AXIS_E7() ENABLE_STEPPER_E7() - #else - #define ENABLE_AXIS_E7() NOOP - #endif + #define ENABLE_AXIS_E7() TERN(HAS_E7_ENABLE, ENABLE_STEPPER_E7(), NOOP) #endif #ifndef DISABLE_AXIS_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define DISABLE_AXIS_E7() DISABLE_STEPPER_E7() - #else - #define DISABLE_AXIS_E7() NOOP - #endif + #define DISABLE_AXIS_E7() TERN(HAS_E7_ENABLE, DISABLE_STEPPER_E7(), NOOP) #endif diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index c0fb083d61..3ec8ff4325 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -847,72 +847,28 @@ enum StealthIndex : uint8_t { #endif // TMC5160 void restore_trinamic_drivers() { - #if AXIS_IS_TMC(X) - stepperX.push(); - #endif - #if AXIS_IS_TMC(X2) - stepperX2.push(); - #endif - #if AXIS_IS_TMC(Y) - stepperY.push(); - #endif - #if AXIS_IS_TMC(Y2) - stepperY2.push(); - #endif - #if AXIS_IS_TMC(Z) - stepperZ.push(); - #endif - #if AXIS_IS_TMC(Z2) - stepperZ2.push(); - #endif - #if AXIS_IS_TMC(Z3) - stepperZ3.push(); - #endif - #if AXIS_IS_TMC(Z4) - stepperZ4.push(); - #endif - #if AXIS_IS_TMC(I) - stepperI.push(); - #endif - #if AXIS_IS_TMC(J) - stepperJ.push(); - #endif - #if AXIS_IS_TMC(K) - stepperK.push(); - #endif - #if AXIS_IS_TMC(U) - stepperU.push(); - #endif - #if AXIS_IS_TMC(V) - stepperV.push(); - #endif - #if AXIS_IS_TMC(W) - stepperW.push(); - #endif - #if AXIS_IS_TMC(E0) - stepperE0.push(); - #endif - #if AXIS_IS_TMC(E1) - stepperE1.push(); - #endif - #if AXIS_IS_TMC(E2) - stepperE2.push(); - #endif - #if AXIS_IS_TMC(E3) - stepperE3.push(); - #endif - #if AXIS_IS_TMC(E4) - stepperE4.push(); - #endif - #if AXIS_IS_TMC(E5) - stepperE5.push(); - #endif - #if AXIS_IS_TMC(E6) - stepperE6.push(); - #endif - #if AXIS_IS_TMC(E7) - stepperE7.push(); - #endif + TERN_(X_IS_TRINAMIC, stepperX.push()); + TERN_(X2_IS_TRINAMIC, stepperX2.push()); + TERN_(Y_IS_TRINAMIC, stepperY.push()); + TERN_(Y2_IS_TRINAMIC, stepperY2.push()); + TERN_(Z_IS_TRINAMIC, stepperZ.push()); + TERN_(Z2_IS_TRINAMIC, stepperZ2.push()); + TERN_(Z3_IS_TRINAMIC, stepperZ3.push()); + TERN_(Z4_IS_TRINAMIC, stepperZ4.push()); + TERN_(I_IS_TRINAMIC, stepperI.push()); + TERN_(J_IS_TRINAMIC, stepperJ.push()); + TERN_(K_IS_TRINAMIC, stepperK.push()); + TERN_(U_IS_TRINAMIC, stepperU.push()); + TERN_(V_IS_TRINAMIC, stepperV.push()); + TERN_(W_IS_TRINAMIC, stepperW.push()); + TERN_(E0_IS_TRINAMIC, stepperE0.push()); + TERN_(E1_IS_TRINAMIC, stepperE1.push()); + TERN_(E2_IS_TRINAMIC, stepperE2.push()); + TERN_(E3_IS_TRINAMIC, stepperE3.push()); + TERN_(E4_IS_TRINAMIC, stepperE4.push()); + TERN_(E5_IS_TRINAMIC, stepperE5.push()); + TERN_(E6_IS_TRINAMIC, stepperE6.push()); + TERN_(E7_IS_TRINAMIC, stepperE7.push()); } void reset_trinamic_drivers() { @@ -923,88 +879,44 @@ void reset_trinamic_drivers() { ENABLED(STEALTHCHOP_U), ENABLED(STEALTHCHOP_V), ENABLED(STEALTHCHOP_W) ); - #if AXIS_IS_TMC(X) - TMC_INIT(X, STEALTH_AXIS_X); - #endif - #if AXIS_IS_TMC(X2) - TMC_INIT(X2, STEALTH_AXIS_X); - #endif - #if AXIS_IS_TMC(Y) - TMC_INIT(Y, STEALTH_AXIS_Y); - #endif - #if AXIS_IS_TMC(Y2) - TMC_INIT(Y2, STEALTH_AXIS_Y); - #endif - #if AXIS_IS_TMC(Z) - TMC_INIT(Z, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z2) - TMC_INIT(Z2, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z3) - TMC_INIT(Z3, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z4) - TMC_INIT(Z4, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(I) - TMC_INIT(I, STEALTH_AXIS_I); - #endif - #if AXIS_IS_TMC(J) - TMC_INIT(J, STEALTH_AXIS_J); - #endif - #if AXIS_IS_TMC(K) - TMC_INIT(K, STEALTH_AXIS_K); - #endif - #if AXIS_IS_TMC(U) - TMC_INIT(U, STEALTH_AXIS_U); - #endif - #if AXIS_IS_TMC(V) - TMC_INIT(V, STEALTH_AXIS_V); - #endif - #if AXIS_IS_TMC(W) - TMC_INIT(W, STEALTH_AXIS_W); - #endif - #if AXIS_IS_TMC(E0) - TMC_INIT(E0, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E1) - TMC_INIT(E1, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E2) - TMC_INIT(E2, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E3) - TMC_INIT(E3, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E4) - TMC_INIT(E4, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E5) - TMC_INIT(E5, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E6) - TMC_INIT(E6, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E7) - TMC_INIT(E7, STEALTH_AXIS_E); - #endif + TERN_(X_IS_TRINAMIC, TMC_INIT(X, STEALTH_AXIS_X)); + TERN_(X2_IS_TRINAMIC, TMC_INIT(X2, STEALTH_AXIS_X)); + TERN_(Y_IS_TRINAMIC, TMC_INIT(Y, STEALTH_AXIS_Y)); + TERN_(Y2_IS_TRINAMIC, TMC_INIT(Y2, STEALTH_AXIS_Y)); + TERN_(Z_IS_TRINAMIC, TMC_INIT(Z, STEALTH_AXIS_Z)); + TERN_(Z2_IS_TRINAMIC, TMC_INIT(Z2, STEALTH_AXIS_Z)); + TERN_(Z3_IS_TRINAMIC, TMC_INIT(Z3, STEALTH_AXIS_Z)); + TERN_(Z4_IS_TRINAMIC, TMC_INIT(Z4, STEALTH_AXIS_Z)); + TERN_(I_IS_TRINAMIC, TMC_INIT(I, STEALTH_AXIS_I)); + TERN_(J_IS_TRINAMIC, TMC_INIT(J, STEALTH_AXIS_J)); + TERN_(K_IS_TRINAMIC, TMC_INIT(K, STEALTH_AXIS_K)); + TERN_(U_IS_TRINAMIC, TMC_INIT(U, STEALTH_AXIS_U)); + TERN_(V_IS_TRINAMIC, TMC_INIT(V, STEALTH_AXIS_V)); + TERN_(W_IS_TRINAMIC, TMC_INIT(W, STEALTH_AXIS_W)); + TERN_(E0_IS_TRINAMIC, TMC_INIT(E0, STEALTH_AXIS_E)); + TERN_(E1_IS_TRINAMIC, TMC_INIT(E1, STEALTH_AXIS_E)); + TERN_(E2_IS_TRINAMIC, TMC_INIT(E2, STEALTH_AXIS_E)); + TERN_(E3_IS_TRINAMIC, TMC_INIT(E3, STEALTH_AXIS_E)); + TERN_(E4_IS_TRINAMIC, TMC_INIT(E4, STEALTH_AXIS_E)); + TERN_(E5_IS_TRINAMIC, TMC_INIT(E5, STEALTH_AXIS_E)); + TERN_(E6_IS_TRINAMIC, TMC_INIT(E6, STEALTH_AXIS_E)); + TERN_(E7_IS_TRINAMIC, TMC_INIT(E7, STEALTH_AXIS_E)); #if USE_SENSORLESS - TERN_(X_SENSORLESS, stepperX.homing_threshold(X_STALL_SENSITIVITY)); + TERN_(X_SENSORLESS, stepperX.homing_threshold(X_STALL_SENSITIVITY)); TERN_(X2_SENSORLESS, stepperX2.homing_threshold(X2_STALL_SENSITIVITY)); - TERN_(Y_SENSORLESS, stepperY.homing_threshold(Y_STALL_SENSITIVITY)); + TERN_(Y_SENSORLESS, stepperY.homing_threshold(Y_STALL_SENSITIVITY)); TERN_(Y2_SENSORLESS, stepperY2.homing_threshold(Y2_STALL_SENSITIVITY)); - TERN_(Z_SENSORLESS, stepperZ.homing_threshold(Z_STALL_SENSITIVITY)); + TERN_(Z_SENSORLESS, stepperZ.homing_threshold(Z_STALL_SENSITIVITY)); TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(Z2_STALL_SENSITIVITY)); TERN_(Z3_SENSORLESS, stepperZ3.homing_threshold(Z3_STALL_SENSITIVITY)); TERN_(Z4_SENSORLESS, stepperZ4.homing_threshold(Z4_STALL_SENSITIVITY)); - TERN_(I_SENSORLESS, stepperI.homing_threshold(I_STALL_SENSITIVITY)); - TERN_(J_SENSORLESS, stepperJ.homing_threshold(J_STALL_SENSITIVITY)); - TERN_(K_SENSORLESS, stepperK.homing_threshold(K_STALL_SENSITIVITY)); - TERN_(U_SENSORLESS, stepperU.homing_threshold(U_STALL_SENSITIVITY)); - TERN_(V_SENSORLESS, stepperV.homing_threshold(V_STALL_SENSITIVITY)); - TERN_(W_SENSORLESS, stepperW.homing_threshold(W_STALL_SENSITIVITY)); + TERN_(I_SENSORLESS, stepperI.homing_threshold(I_STALL_SENSITIVITY)); + TERN_(J_SENSORLESS, stepperJ.homing_threshold(J_STALL_SENSITIVITY)); + TERN_(K_SENSORLESS, stepperK.homing_threshold(K_STALL_SENSITIVITY)); + TERN_(U_SENSORLESS, stepperU.homing_threshold(U_STALL_SENSITIVITY)); + TERN_(V_SENSORLESS, stepperV.homing_threshold(V_STALL_SENSITIVITY)); + TERN_(W_SENSORLESS, stepperW.homing_threshold(W_STALL_SENSITIVITY)); #endif #ifdef TMC_ADV diff --git a/Marlin/src/module/stepper/trinamic.h b/Marlin/src/module/stepper/trinamic.h index bf7eaf7f95..0fd48f18cb 100644 --- a/Marlin/src/module/stepper/trinamic.h +++ b/Marlin/src/module/stepper/trinamic.h @@ -116,7 +116,7 @@ void restore_trinamic_drivers(); void reset_trinamic_drivers(); // X Stepper -#if AXIS_IS_TMC(X) +#if X_IS_TRINAMIC extern TMC_CLASS(X, X) stepperX; static constexpr chopper_timing_t chopper_timing_X = CHOPPER_TIMING_X; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -130,7 +130,7 @@ void reset_trinamic_drivers(); #endif // Y Stepper -#if AXIS_IS_TMC(Y) +#if Y_IS_TRINAMIC extern TMC_CLASS(Y, Y) stepperY; static constexpr chopper_timing_t chopper_timing_Y = CHOPPER_TIMING_Y; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -144,7 +144,7 @@ void reset_trinamic_drivers(); #endif // Z Stepper -#if AXIS_IS_TMC(Z) +#if Z_IS_TRINAMIC extern TMC_CLASS(Z, Z) stepperZ; static constexpr chopper_timing_t chopper_timing_Z = CHOPPER_TIMING_Z; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -158,7 +158,7 @@ void reset_trinamic_drivers(); #endif // X2 Stepper -#if HAS_X2_ENABLE && AXIS_IS_TMC(X2) +#if X2_IS_TRINAMIC extern TMC_CLASS(X2, X) stepperX2; #ifndef CHOPPER_TIMING_X2 #define CHOPPER_TIMING_X2 CHOPPER_TIMING_X @@ -175,7 +175,7 @@ void reset_trinamic_drivers(); #endif // Y2 Stepper -#if HAS_Y2_ENABLE && AXIS_IS_TMC(Y2) +#if Y2_IS_TRINAMIC extern TMC_CLASS(Y2, Y) stepperY2; #ifndef CHOPPER_TIMING_Y2 #define CHOPPER_TIMING_Y2 CHOPPER_TIMING_Y @@ -192,7 +192,7 @@ void reset_trinamic_drivers(); #endif // Z2 Stepper -#if HAS_Z2_ENABLE && AXIS_IS_TMC(Z2) +#if Z2_IS_TRINAMIC extern TMC_CLASS(Z2, Z) stepperZ2; #ifndef CHOPPER_TIMING_Z2 #define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z @@ -209,7 +209,7 @@ void reset_trinamic_drivers(); #endif // Z3 Stepper -#if HAS_Z3_ENABLE && AXIS_IS_TMC(Z3) +#if Z3_IS_TRINAMIC extern TMC_CLASS(Z3, Z) stepperZ3; #ifndef CHOPPER_TIMING_Z3 #define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z @@ -226,7 +226,7 @@ void reset_trinamic_drivers(); #endif // Z4 Stepper -#if HAS_Z4_ENABLE && AXIS_IS_TMC(Z4) +#if Z4_IS_TRINAMIC extern TMC_CLASS(Z4, Z) stepperZ4; #ifndef CHOPPER_TIMING_Z4 #define CHOPPER_TIMING_Z4 CHOPPER_TIMING_Z @@ -243,7 +243,7 @@ void reset_trinamic_drivers(); #endif // I Stepper -#if AXIS_IS_TMC(I) +#if I_IS_TRINAMIC extern TMC_CLASS(I, I) stepperI; static constexpr chopper_timing_t chopper_timing_I = CHOPPER_TIMING_I; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -257,7 +257,7 @@ void reset_trinamic_drivers(); #endif // J Stepper -#if AXIS_IS_TMC(J) +#if J_IS_TRINAMIC extern TMC_CLASS(J, J) stepperJ; static constexpr chopper_timing_t chopper_timing_J = CHOPPER_TIMING_J; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -271,7 +271,7 @@ void reset_trinamic_drivers(); #endif // K Stepper -#if AXIS_IS_TMC(K) +#if K_IS_TRINAMIC extern TMC_CLASS(K, K) stepperK; static constexpr chopper_timing_t chopper_timing_K = CHOPPER_TIMING_K; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -285,7 +285,7 @@ void reset_trinamic_drivers(); #endif // U Stepper -#if AXIS_IS_TMC(U) +#if U_IS_TRINAMIC extern TMC_CLASS(U, U) stepperU; static constexpr chopper_timing_t chopper_timing_U = CHOPPER_TIMING_U; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -299,7 +299,7 @@ void reset_trinamic_drivers(); #endif // V Stepper -#if AXIS_IS_TMC(V) +#if V_IS_TRINAMIC extern TMC_CLASS(V, V) stepperV; static constexpr chopper_timing_t chopper_timing_V = CHOPPER_TIMING_V; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -313,7 +313,7 @@ void reset_trinamic_drivers(); #endif // W Stepper -#if AXIS_IS_TMC(W) +#if W_IS_TRINAMIC extern TMC_CLASS(W, W) stepperW; static constexpr chopper_timing_t chopper_timing_W = CHOPPER_TIMING_W; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -327,7 +327,7 @@ void reset_trinamic_drivers(); #endif // E0 Stepper -#if AXIS_IS_TMC(E0) +#if E0_IS_TRINAMIC extern TMC_CLASS_E(0) stepperE0; #ifndef CHOPPER_TIMING_E0 #define CHOPPER_TIMING_E0 CHOPPER_TIMING_E @@ -344,7 +344,7 @@ void reset_trinamic_drivers(); #endif // E1 Stepper -#if AXIS_IS_TMC(E1) +#if E1_IS_TRINAMIC extern TMC_CLASS_E(1) stepperE1; #ifndef CHOPPER_TIMING_E1 #define CHOPPER_TIMING_E1 CHOPPER_TIMING_E @@ -361,7 +361,7 @@ void reset_trinamic_drivers(); #endif // E2 Stepper -#if AXIS_IS_TMC(E2) +#if E2_IS_TRINAMIC extern TMC_CLASS_E(2) stepperE2; #ifndef CHOPPER_TIMING_E2 #define CHOPPER_TIMING_E2 CHOPPER_TIMING_E @@ -378,7 +378,7 @@ void reset_trinamic_drivers(); #endif // E3 Stepper -#if AXIS_IS_TMC(E3) +#if E3_IS_TRINAMIC extern TMC_CLASS_E(3) stepperE3; #ifndef CHOPPER_TIMING_E3 #define CHOPPER_TIMING_E3 CHOPPER_TIMING_E @@ -395,7 +395,7 @@ void reset_trinamic_drivers(); #endif // E4 Stepper -#if AXIS_IS_TMC(E4) +#if E4_IS_TRINAMIC extern TMC_CLASS_E(4) stepperE4; #ifndef CHOPPER_TIMING_E4 #define CHOPPER_TIMING_E4 CHOPPER_TIMING_E @@ -412,7 +412,7 @@ void reset_trinamic_drivers(); #endif // E5 Stepper -#if AXIS_IS_TMC(E5) +#if E5_IS_TRINAMIC extern TMC_CLASS_E(5) stepperE5; #ifndef CHOPPER_TIMING_E5 #define CHOPPER_TIMING_E5 CHOPPER_TIMING_E @@ -429,7 +429,7 @@ void reset_trinamic_drivers(); #endif // E6 Stepper -#if AXIS_IS_TMC(E6) +#if E6_IS_TRINAMIC extern TMC_CLASS_E(6) stepperE6; #ifndef CHOPPER_TIMING_E6 #define CHOPPER_TIMING_E6 CHOPPER_TIMING_E @@ -446,7 +446,7 @@ void reset_trinamic_drivers(); #endif // E7 Stepper -#if AXIS_IS_TMC(E7) +#if E7_IS_TRINAMIC extern TMC_CLASS_E(7) stepperE7; #ifndef CHOPPER_TIMING_E7 #define CHOPPER_TIMING_E7 CHOPPER_TIMING_E From 7bd74fecbbdf5013d9be612af6c48f1030348bbb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 02:29:58 -0500 Subject: [PATCH 029/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Lan?= =?UTF-8?q?guage=20tweaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lang --- Marlin/src/lcd/language/language_cz.h | 3 ++- Marlin/src/lcd/language/language_de.h | 3 ++- Marlin/src/lcd/language/language_en.h | 4 +++- Marlin/src/lcd/language/language_es.h | 3 ++- Marlin/src/lcd/language/language_fr.h | 3 ++- Marlin/src/lcd/language/language_fr_na.h | 3 ++- Marlin/src/lcd/language/language_gl.h | 3 ++- Marlin/src/lcd/language/language_hu.h | 3 ++- Marlin/src/lcd/language/language_it.h | 3 ++- Marlin/src/lcd/language/language_ro.h | 3 ++- Marlin/src/lcd/language/language_ru.h | 2 +- Marlin/src/lcd/language/language_sk.h | 3 ++- Marlin/src/lcd/language/language_sv.h | 3 ++- Marlin/src/lcd/language/language_tr.h | 3 ++- Marlin/src/lcd/language/language_uk.h | 3 ++- Marlin/src/lcd/language/language_vi.h | 2 +- Marlin/src/lcd/language/language_zh_CN.h | 3 ++- Marlin/src/lcd/menu/menu_tmc.cpp | 2 +- 18 files changed, 34 insertions(+), 18 deletions(-) diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 814c9ffde8..9a01466227 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -534,7 +534,8 @@ namespace LanguageNarrow_cz { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybridní práh"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Domů bez senzorů"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Režim kroků"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop povolen"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" za:"); LSTR MSG_BACKLASH = _UxGT("Vůle"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index edc3d4361d..23730d321a 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -719,7 +719,8 @@ namespace LanguageNarrow_de { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid threshold"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorloses Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Schrittmodus"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop einsch."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" im:"); LSTR MSG_BACKLASH = _UxGT("Spiel"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 5762fa150e..ca2e50d063 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -872,6 +872,7 @@ namespace LanguageNarrow_en { LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purging...")); LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Click to finish")); LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Resuming...")); + LSTR MSG_TMC_DRIVERS = _UxGT("TMC Drivers"); LSTR MSG_TMC_CURRENT = _UxGT("Driver Current"); LSTR MSG_TMC_ACURRENT = STR_A _UxGT("Driver Current"); @@ -881,7 +882,8 @@ namespace LanguageNarrow_en { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" in:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 1c7d5199d3..058b550f67 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -543,7 +543,8 @@ namespace LanguageNarrow_es { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Límite Hibrido"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Origen sin sensores"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reiniciar"); LSTR MSG_SERVICE_IN = _UxGT(" dentro:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index b499b32f7b..13bee9fbb8 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -573,7 +573,8 @@ namespace LanguageNarrow_fr { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Seuil hybride"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Home sans capteur"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Mode pas à pas"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop activé"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Réinit."); LSTR MSG_SERVICE_IN = _UxGT(" dans:"); LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correction"); diff --git a/Marlin/src/lcd/language/language_fr_na.h b/Marlin/src/lcd/language/language_fr_na.h index 995a5ecd27..a3da3082de 100644 --- a/Marlin/src/lcd/language/language_fr_na.h +++ b/Marlin/src/lcd/language/language_fr_na.h @@ -576,7 +576,8 @@ namespace LanguageNarrow_fr_na { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Seuil hybride"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Home sans capteur"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Mode pas a pas"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop active"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reinit."); LSTR MSG_SERVICE_IN = _UxGT(" dans:"); LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correction"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 37c1aa292a..3287ae2676 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -558,7 +558,8 @@ namespace LanguageNarrow_gl { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Limiar Hibrido"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Orixe sen Sensores"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reiniciar"); LSTR MSG_SERVICE_IN = _UxGT(" dentro:"); LSTR MSG_BACKLASH = _UxGT("Reacción"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index d987416269..a626aa2209 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -630,7 +630,8 @@ namespace LanguageNarrow_hu { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hibrid küszöbérték"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Motoros kezdöpont"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Léptetö mód"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop mód"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Újraindítás"); LSTR MSG_SERVICE_IN = _UxGT(" be:"); LSTR MSG_BACKLASH = _UxGT("Holtjáték"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 0a7302b0f8..1e81514440 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -852,7 +852,8 @@ namespace LanguageNarrow_it { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Soglia modo ibrido"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo Stepping"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop abil."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Resetta"); LSTR MSG_SERVICE_IN = _UxGT(" tra:"); LSTR MSG_BACKLASH = _UxGT("Gioco"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index ff82bb39ba..0b263a4ea6 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -570,7 +570,8 @@ namespace LanguageNarrow_ro { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" in:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 6b3fbebd08..92011f66a6 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -636,7 +636,7 @@ namespace LanguageNarrow_ru { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Гибридный режим"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Чувствительность"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Режим драйвера"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим вкл"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("Тихий режим вкл"); LSTR MSG_SERVICE_RESET = _UxGT("Сброс"); LSTR MSG_SERVICE_IN = _UxGT(" в:"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 32683cf2ed..782f42f118 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -761,7 +761,8 @@ namespace LanguageNarrow_sk { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybridný prah"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Bezsenzor. domov"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Režim krokovania"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop zapnutý"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Vynulovať"); LSTR MSG_SERVICE_IN = _UxGT("za:"); LSTR MSG_BACKLASH = _UxGT("Kompenz. vôle"); diff --git a/Marlin/src/lcd/language/language_sv.h b/Marlin/src/lcd/language/language_sv.h index 8827252132..356a253b6e 100644 --- a/Marlin/src/lcd/language/language_sv.h +++ b/Marlin/src/lcd/language/language_sv.h @@ -614,7 +614,8 @@ namespace LanguageNarrow_sv { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Tröskelvärde"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorlös Hemning"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stegningsläge"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Smyghack Aktiverad"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("Smyghack"); + LSTR MSG_SERVICE_RESET = _UxGT("Återställ"); LSTR MSG_SERVICE_IN = _UxGT(" in:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index baebbe9d1e..b52ded8db8 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -787,7 +787,8 @@ namespace LanguageNarrow_tr { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hibrit Eşiği"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensörsüz Sıfırlama"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Adım Modu"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Aktif"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Resetle"); LSTR MSG_SERVICE_IN = _UxGT(" içinde:"); LSTR MSG_BACKLASH = _UxGT("Ters Tepki"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 104d7f1ecf..c061b9ad02 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -663,7 +663,8 @@ namespace LanguageNarrow_uk { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Гібридний поріг"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Дім без кінцевиків"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Режим мікрокроку"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим увімк."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("Тихий режим увімк."); + LSTR MSG_SERVICE_RESET = _UxGT("Зкидання"); LSTR MSG_SERVICE_IN = _UxGT(" в:"); LSTR MSG_BACKLASH = _UxGT("Люфт"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index d1e98637b9..fb158e306b 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -436,7 +436,7 @@ namespace LanguageNarrow_vi { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Ngưỡng Hỗn Hợp"); // Hybrid threshold LSTR MSG_TMC_HOMING_THRS = _UxGT("Vô cảm biến"); // Sensorless homing LSTR MSG_TMC_STEPPING_MODE = _UxGT("Chế độ từng bước"); // Stepping mode - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("CắtTàngHình được kích hoạt"); // StealthChop enabled + LSTR MSG_TMC_STEALTHCHOP = _UxGT("CắtTàngHình"); // StealthChop LSTR MSG_SHORT_DAY = _UxGT("n"); // d - ngày - One character only LSTR MSG_SHORT_HOUR = _UxGT("g"); // h - giờ - One character only diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index eb6a973205..680ff8c9b0 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -580,7 +580,8 @@ namespace LanguageNarrow_zh_CN { LSTR MSG_TMC_HYBRID_THRS = _UxGT("混合阈值"); LSTR MSG_TMC_HOMING_THRS = _UxGT("无感回零"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("步进模式"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop已使能"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop已使能"); + LSTR MSG_SERVICE_RESET = _UxGT("复位"); LSTR MSG_SERVICE_IN = _UxGT(" 在:"); LSTR MSG_BACKLASH = _UxGT("回差"); diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index f73dd971df..2cf180ac97 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -116,7 +116,7 @@ void menu_tmc_current() { void menu_tmc_step_mode() { START_MENU(); - STATIC_ITEM(MSG_TMC_STEALTH_ENABLED); + STATIC_ITEM(MSG_TMC_STEALTHCHOP); BACK_ITEM(MSG_TMC_DRIVERS); TERN_( X_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(X, STR_X)); TERN_(X2_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(X2, STR_X2)); From 460bf112d8a52c67055c253569023178af8dd218 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 03:33:27 -0500 Subject: [PATCH 030/101] =?UTF-8?q?=E2=9C=A8=20EDITABLE=5FHOMING=5FCURRENT?= =?UTF-8?q?=20(#27760)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 2 + Marlin/src/core/language.h | 3 +- Marlin/src/feature/tmc_util.cpp | 4 + Marlin/src/feature/tmc_util.h | 26 ++++ Marlin/src/gcode/feature/trinamic/M906.cpp | 9 +- Marlin/src/gcode/feature/trinamic/M920.cpp | 144 +++++++++++++++++++++ Marlin/src/gcode/gcode.cpp | 7 +- Marlin/src/gcode/gcode.h | 5 + Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/menu/menu_tmc.cpp | 34 ++++- Marlin/src/module/motion.cpp | 55 ++------ Marlin/src/module/settings.cpp | 51 ++++++++ buildroot/tests/STM32F103RC_btt | 5 +- ini/features.ini | 1 + 14 files changed, 291 insertions(+), 56 deletions(-) create mode 100644 Marlin/src/gcode/feature/trinamic/M920.cpp diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7cc54b2a96..f24ece5986 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2995,6 +2995,8 @@ #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + //#define EDITABLE_HOMING_CURRENT // Add a G-code and menu to modify the Homing Current + /** * Interpolate microsteps to 256 * Override for each driver with _INTERPOLATE settings below diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index dddc00dba8..3a50fcdc6b 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -312,8 +312,9 @@ #define STR_FILAMENT_RUNOUT_SENSOR "Filament runout sensor" #define STR_DRIVER_STEPPING_MODE "Driver stepping mode" #define STR_STEPPER_DRIVER_CURRENT "Stepper driver current" +#define STR_HOMING_CURRENT "Homing Current (mA)" #define STR_HYBRID_THRESHOLD "Hybrid Threshold" -#define STR_STALLGUARD_THRESHOLD "StallGuard threshold" +#define STR_STALLGUARD_THRESHOLD "StallGuard Threshold" #define STR_HOME_OFFSET "Home offset" #define STR_SOFT_ENDSTOPS "Soft endstops" #define STR_MATERIAL_HEATUP "Material heatup parameters" diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 62972eb7f5..753cb003ff 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -43,6 +43,10 @@ #endif #endif +#if ENABLED(EDITABLE_HOMING_CURRENT) + homing_current_t homing_current_mA; +#endif + /** * Check for over temperature or short to ground error flags. * Report and log warning of overtemperature condition. diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index 27aae23f89..4cac2969a7 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -375,6 +375,32 @@ void test_tmc_connection(LOGICAL_AXIS_DECL_LC(const bool, true)); #endif // USE_SENSORLESS +#if HAS_HOMING_CURRENT + + // Axes that have a distinct homing current + struct homing_current_t { + OPTCODE(X_HAS_HOME_CURRENT, uint16_t X) + OPTCODE(Y_HAS_HOME_CURRENT, uint16_t Y) + OPTCODE(Z_HAS_HOME_CURRENT, uint16_t Z) + OPTCODE(X2_HAS_HOME_CURRENT, uint16_t X2) + OPTCODE(Y2_HAS_HOME_CURRENT, uint16_t Y2) + OPTCODE(Z2_HAS_HOME_CURRENT, uint16_t Z2) + OPTCODE(Z3_HAS_HOME_CURRENT, uint16_t Z3) + OPTCODE(Z4_HAS_HOME_CURRENT, uint16_t Z4) + OPTCODE(I_HAS_HOME_CURRENT, uint16_t I) + OPTCODE(J_HAS_HOME_CURRENT, uint16_t J) + OPTCODE(K_HAS_HOME_CURRENT, uint16_t K) + OPTCODE(U_HAS_HOME_CURRENT, uint16_t U) + OPTCODE(V_HAS_HOME_CURRENT, uint16_t V) + OPTCODE(W_HAS_HOME_CURRENT, uint16_t W) + }; + + #if ENABLED(EDITABLE_HOMING_CURRENT) + extern homing_current_t homing_current_mA; + #endif + +#endif // HAS_HOMING_CURRENT + #endif // HAS_TRINAMIC_CONFIG #if HAS_TMC_SPI diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp index 43d980098e..74bbf9cae0 100644 --- a/Marlin/src/gcode/feature/trinamic/M906.cpp +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -37,6 +37,8 @@ static void tmc_print_current(TMC &st) { /** * M906: Set motor current in milliamps. * + * With no parameters report driver currents. + * * Parameters: * X[current] - Set mA current for X driver(s) * Y[current] - Set mA current for Y driver(s) @@ -52,9 +54,14 @@ static void tmc_print_current(TMC &st) { * I[index] - Axis sub-index (Omit or 0 for X, Y, Z; 1 for X2, Y2, Z2; 2 for Z3; 3 for Z4.) * T[index] - Extruder index (Zero-based. Omit for E0 only.) * - * With no parameters report driver currents. + * With EDITABLE_HOMING_CURRENT: + * H - Set / Report Homing Current. Alias for M920. */ void GcodeSuite::M906() { + #if ENABLED(EDITABLE_HOMING_CURRENT) + if (parser.seen_test('H')) return M920(); + #endif + #define TMC_SAY_CURRENT(Q) tmc_print_current(stepper##Q) #define TMC_SET_CURRENT(Q) stepper##Q.rms_current(value) diff --git a/Marlin/src/gcode/feature/trinamic/M920.cpp b/Marlin/src/gcode/feature/trinamic/M920.cpp new file mode 100644 index 0000000000..2852f8bf44 --- /dev/null +++ b/Marlin/src/gcode/feature/trinamic/M920.cpp @@ -0,0 +1,144 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(EDITABLE_HOMING_CURRENT) + +#include "../../gcode.h" +#include "../../../feature/tmc_util.h" + +#if AXIS_COLLISION('I') + #define I_PARAM 'S' + #define I_PARAM_STR "S" + #warning "Use 'M920 S' instead of 'M920 I' for the stepper number." +#else + #define I_PARAM 'I' + #define I_PARAM_STR "I" +#endif + +/** + * M920: Set Homing Current for one or more axes + * + * Parameters: + * X[current] - Homing Current to use for X axis stepper(s) + * Y[current] - Homing Current to use for Y axis stepper(s) + * Z[current] - Homing Current to use for Z axis stepper(s) + * A[current] - Homing Current to use for A axis stepper(s) + * B[current] - Homing Current to use for B axis stepper(s) + * C[current] - Homing Current to use for C axis stepper(s) + * U[current] - Homing Current to use for U axis stepper(s) + * V[current] - Homing Current to use for V axis stepper(s) + * W[current] - Homing Current to use for W axis stepper(s) + * + * I - For multi-stepper axes, the zero-based index of the stepper to modify in each axis. + * If omitted all steppers of each axis will be set to the given axis current. + */ +void GcodeSuite::M920() { + bool report = true; + const uint8_t index = parser.byteval(I_PARAM); + LOOP_NUM_AXES(i) if (parser.seen(AXIS_CHAR(i))) { + const int16_t value = parser.value_int(); + report = false; + switch (i) { + #if X_HAS_HOME_CURRENT + case X_AXIS: + if (index < 1) homing_current_mA.X = value; + TERN_(X2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.X2 = value); + break; + #endif + #if Y_HAS_HOME_CURRENT + case Y_AXIS: + if (index < 1) homing_current_mA.Y = value; + TERN_(Y2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.Y2 = value); + break; + #endif + #if Z_HAS_HOME_CURRENT + case Z_AXIS: + if (index < 1) homing_current_mA.Z = value; + TERN_(Z2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.Z2 = value); + TERN_(Z3_HAS_HOME_CURRENT, if (!index || index == 2) homing_current_mA.Z3 = value); + TERN_(Z4_HAS_HOME_CURRENT, if (!index || index == 3) homing_current_mA.Z4 = value); + break; + #endif + OPTCODE(I_HAS_HOME_CURRENT, case I_AXIS: homing_current_mA.I = value; break) + OPTCODE(J_HAS_HOME_CURRENT, case J_AXIS: homing_current_mA.J = value; break) + OPTCODE(K_HAS_HOME_CURRENT, case K_AXIS: homing_current_mA.K = value; break) + OPTCODE(U_HAS_HOME_CURRENT, case U_AXIS: homing_current_mA.U = value; break) + OPTCODE(V_HAS_HOME_CURRENT, case V_AXIS: homing_current_mA.V = value; break) + OPTCODE(W_HAS_HOME_CURRENT, case W_AXIS: homing_current_mA.W = value; break) + } + } + + if (report) M920_report(); +} + +void GcodeSuite::M920_report(const bool forReplay/*=true*/) { + TERN_(MARLIN_SMALL_BUILD, return); + + report_heading(forReplay, F(STR_HOMING_CURRENT)); + + auto say_M920 = [](const bool forReplay, int16_t index=-1) { + report_echo_start(forReplay); + SERIAL_ECHOPGM(" M920"); + if (index >= 0) SERIAL_ECHOPGM(" " I_PARAM_STR, index); + }; + + #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS + #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS || Z3_SENSORLESS || Z4_SENSORLESS + say_M920(forReplay, 0); + #else + say_M920(forReplay); + #endif + TERN_(X_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, homing_current_mA.X)); + TERN_(Y_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, homing_current_mA.Y)); + TERN_(Z_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, homing_current_mA.Z)); + #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS || Z3_SENSORLESS || Z4_SENSORLESS + say_M920(forReplay); + #endif + TERN_(I_SENSORLESS, SERIAL_ECHOPGM_P(SP_I_STR, homing_current_mA.I)); + TERN_(J_SENSORLESS, SERIAL_ECHOPGM_P(SP_J_STR, homing_current_mA.J)); + TERN_(K_SENSORLESS, SERIAL_ECHOPGM_P(SP_K_STR, homing_current_mA.K)); + TERN_(U_SENSORLESS, SERIAL_ECHOPGM_P(SP_U_STR, homing_current_mA.U)); + TERN_(V_SENSORLESS, SERIAL_ECHOPGM_P(SP_V_STR, homing_current_mA.V)); + TERN_(W_SENSORLESS, SERIAL_ECHOPGM_P(SP_W_STR, homing_current_mA.W)); + SERIAL_EOL(); + #endif + + #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS + say_M920(forReplay, 1); + TERN_(X2_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, homing_current_mA.X2)); + TERN_(Y2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, homing_current_mA.Y2)); + TERN_(Z2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, homing_current_mA.Z2)); + SERIAL_EOL(); + #endif + #if Z3_SENSORLESS + say_M920(forReplay, 2); + SERIAL_ECHOLNPGM(" Z", homing_current_mA.Z3); + #endif + #if Z4_SENSORLESS + say_M920(forReplay, 3); + SERIAL_ECHOLNPGM(" Z", homing_current_mA.Z4); + #endif +} + +#endif // EDITABLE_HOMING_CURRENT diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 64326b32af..8a444053e6 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1056,12 +1056,15 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 912: M912(); break; // M912: Clear TMC2130 prewarn triggered flags #endif #if ENABLED(HYBRID_THRESHOLD) - case 913: M913(); break; // M913: Set HYBRID_THRESHOLD speed. + case 913: M913(); break; // M913: Set HYBRID_THRESHOLD speed #endif #if USE_SENSORLESS - case 914: M914(); break; // M914: Set StallGuard sensitivity. + case 914: M914(); break; // M914: Set StallGuard sensitivity #endif case 919: M919(); break; // M919: Set stepper Chopper Times + #if ENABLED(EDITABLE_HOMING_CURRENT) + case 920: M920(); break; // M920: Set Homing Current + #endif #endif #if HAS_MICROSTEPS diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 7ba1c58d2a..1d39dc3a6b 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -320,6 +320,7 @@ * M914 - Set StallGuard sensitivity. (Requires SENSORLESS_HOMING or SENSORLESS_PROBING) * M919 - Set or Report motor Chopper Times (time_off, hysteresis_end, hysteresis_start) using axis codes XYZE, etc. * If no parameters are given, report. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660)) + * M920 - Set Homing Current. (Requires distinct *_CURRENT_HOME settings) * M936 - OTA update firmware. (Requires OTA_FIRMWARE_UPDATE) * M951 - Set Magnetic Parking Extruder parameters. (Requires MAGNETIC_PARKING_EXTRUDER) * M3426 - Read MCP3426 ADC over I2C. (Requires HAS_MCP3426_ADC) @@ -1259,6 +1260,10 @@ private: static void M914_report(const bool forReplay=true); #endif static void M919(); + #if ENABLED(EDITABLE_HOMING_CURRENT) + static void M920(); + static void M920_report(const bool forReplay=true); + #endif #endif #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM || HAS_MOTOR_CURRENT_I2C || HAS_MOTOR_CURRENT_DAC diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index ca2e50d063..571f85e8ce 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -883,6 +883,7 @@ namespace LanguageNarrow_en { LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_TMC_HOMING_CURRENT = _UxGT("Homing Current"); LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" in:"); diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index 2cf180ac97..2ddb38f3a4 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -110,6 +110,33 @@ void menu_tmc_current() { #endif // SENSORLESS_HOMING +#if ENABLED(EDITABLE_HOMING_CURRENT) + + #define TMC_EDIT_HOMING_CURRENT(ST, STR) EDIT_ITEM_FAST_F(uint16_4, F(STR), &homing_current_mA.ST, ST##_CURRENT / 3, ST##_CURRENT) + + void menu_tmc_homing_current() { + START_MENU(); + STATIC_ITEM(MSG_TMC_HOMING_CURRENT); + BACK_ITEM(MSG_TMC_DRIVERS); + TERN_( X_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(X, STR_X)); + TERN_(X2_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(X2, STR_X2)); + TERN_( Y_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Y, STR_Y)); + TERN_(Y2_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Y2, STR_Y2)); + TERN_( Z_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z, STR_Z)); + TERN_(Z2_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z2, STR_Z2)); + TERN_(Z3_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z3, STR_Z3)); + TERN_(Z4_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z4, STR_Z4)); + TERN_( I_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(I, STR_I)); + TERN_( J_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(J, STR_J)); + TERN_( K_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(K, STR_K)); + TERN_( U_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(U, STR_U)); + TERN_( V_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(V, STR_V)); + TERN_( W_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(W, STR_W)); + END_MENU(); + } + +#endif // EDITABLE_HOMING_CURRENT + #if HAS_STEALTHCHOP #define TMC_EDIT_STEP_MODE(ST, STR) EDIT_ITEM_F(bool, F(STR), &stepper##ST.stored.stealthChop_enabled, []{ stepper##ST.refresh_stepping_mode(); }) @@ -143,9 +170,10 @@ void menu_tmc() { START_MENU(); BACK_ITEM(MSG_ADVANCED_SETTINGS); SUBMENU(MSG_TMC_CURRENT, menu_tmc_current); - TERN_(HYBRID_THRESHOLD, SUBMENU(MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs)); - TERN_(SENSORLESS_HOMING, SUBMENU(MSG_TMC_HOMING_THRS, menu_tmc_homing_thrs)); - TERN_(HAS_STEALTHCHOP, SUBMENU(MSG_TMC_STEPPING_MODE, menu_tmc_step_mode)); + TERN_(HYBRID_THRESHOLD, SUBMENU(MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs)); + TERN_(SENSORLESS_HOMING, SUBMENU(MSG_TMC_HOMING_THRS, menu_tmc_homing_thrs)); + TERN_(EDITABLE_HOMING_CURRENT, SUBMENU(MSG_TMC_HOMING_CURRENT, menu_tmc_homing_current)); + TERN_(HAS_STEALTHCHOP, SUBMENU(MSG_TMC_STEALTHCHOP, menu_tmc_step_mode)); END_MENU(); } diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 386d46665d..fcaaf613e4 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -271,48 +271,7 @@ void report_current_position_projected() { #define debug_current(...) #endif - #if HAS_CURRENT_HOME_X - int16_t saved_current_X; - #endif - #if HAS_CURRENT_HOME_Y - int16_t saved_current_Y; - #endif - #if HAS_CURRENT_HOME_Z - int16_t saved_current_Z; - #endif - #if HAS_CURRENT_HOME_X2 - int16_t saved_current_X2; - #endif - #if HAS_CURRENT_HOME_Y2 - int16_t saved_current_Y2; - #endif - #if HAS_CURRENT_HOME_Z2 - int16_t saved_current_Z2; - #endif - #if HAS_CURRENT_HOME_Z3 - int16_t saved_current_Z3; - #endif - #if HAS_CURRENT_HOME_Z4 - int16_t saved_current_Z4; - #endif - #if HAS_CURRENT_HOME_I - int16_t saved_current_I; - #endif - #if HAS_CURRENT_HOME_J - int16_t saved_current_J; - #endif - #if HAS_CURRENT_HOME_K - int16_t saved_current_K; - #endif - #if HAS_CURRENT_HOME_U - int16_t saved_current_U; - #endif - #if HAS_CURRENT_HOME_V - int16_t saved_current_V; - #endif - #if HAS_CURRENT_HOME_W - int16_t saved_current_W; - #endif + homing_current_t saved_current_mA; /** * Set motors to their homing / probing currents. @@ -320,11 +279,13 @@ void report_current_position_projected() { */ void set_homing_current(const AxisEnum axis) { + #define HOMING_CURRENT(A) TERN(EDITABLE_HOMING_CURRENT, homing_current_mA.A, A##_CURRENT_HOME) + // Saves the running current of the motor at the moment the function is called and sets current to CURRENT_HOME #define _SAVE_SET_CURRENT(A) \ - saved_current_##A = stepper##A.getMilliamps(); \ - stepper##A.rms_current(A##_CURRENT_HOME); \ - debug_current(F(STR_##A), saved_current_##A, A##_CURRENT_HOME) + saved_current_mA.A = stepper##A.getMilliamps(); \ + stepper##A.rms_current(HOMING_CURRENT(A)); \ + debug_current(F(STR_##A), saved_current_mA.A, HOMING_CURRENT(A)) #define _MAP_SAVE_SET(A) OPTCODE(A##_HAS_HOME_CURRENT, _SAVE_SET_CURRENT(A)) @@ -478,8 +439,8 @@ void report_current_position_projected() { // Restore the saved current #define _RESTORE_CURRENT(A) \ - stepper##A.rms_current(saved_current_##A); \ - debug_current(F(STR_##A), A##_CURRENT_HOME, saved_current_##A) + stepper##A.rms_current(saved_current_mA.A); \ + debug_current(F(STR_##A), HOMING_CURRENT(A), saved_current_mA.A) #define _MAP_RESTORE(A) OPTCODE(A##_HAS_HOME_CURRENT, _RESTORE_CURRENT(A)) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index a7e791951b..c2b4e3da38 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -469,6 +469,13 @@ typedef struct SettingsDataStruct { xyz_feedrate_t homing_feedrate_mm_m; // M210 X Y Z I J K U V W #endif + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + homing_current_t homing_current_mA; // M920 X Y Z... + #endif + // // !NO_VOLUMETRIC // @@ -1355,6 +1362,14 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(homing_feedrate_mm_m); #endif + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + _FIELD_TEST(homing_current_mA); + EEPROM_WRITE(homing_current_mA); + #endif + // // Volumetric & Filament Size // @@ -2414,6 +2429,14 @@ void MarlinSettings::postprocess() { EEPROM_READ(homing_feedrate_mm_m); #endif + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + _FIELD_TEST(homing_current_mA); + EEPROM_READ(homing_current_mA); + #endif + // // Volumetric & Filament Size // @@ -3626,6 +3649,29 @@ void MarlinSettings::reset() { // TERN_(EDITABLE_HOMING_FEEDRATE, homing_feedrate_mm_m = xyz_feedrate_t(HOMING_FEEDRATE_MM_M)); + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + homing_current_t base_homing_current_mA = { + OPTITEM(X_HAS_HOME_CURRENT, X_CURRENT_HOME) + OPTITEM(Y_HAS_HOME_CURRENT, Y_CURRENT_HOME) + OPTITEM(Z_HAS_HOME_CURRENT, Z_CURRENT_HOME) + OPTITEM(X2_HAS_HOME_CURRENT, X2_CURRENT_HOME) + OPTITEM(Y2_HAS_HOME_CURRENT, Y2_CURRENT_HOME) + OPTITEM(Z2_HAS_HOME_CURRENT, Z2_CURRENT_HOME) + OPTITEM(Z3_HAS_HOME_CURRENT, Z3_CURRENT_HOME) + OPTITEM(Z4_HAS_HOME_CURRENT, Z4_CURRENT_HOME) + OPTITEM(I_HAS_HOME_CURRENT, I_CURRENT_HOME) + OPTITEM(J_HAS_HOME_CURRENT, J_CURRENT_HOME) + OPTITEM(K_HAS_HOME_CURRENT, K_CURRENT_HOME) + OPTITEM(U_HAS_HOME_CURRENT, U_CURRENT_HOME) + OPTITEM(V_HAS_HOME_CURRENT, V_CURRENT_HOME) + OPTITEM(W_HAS_HOME_CURRENT, W_CURRENT_HOME) + }; + homing_current_mA = base_homing_current_mA; + #endif + // // Volumetric & Filament Size // @@ -4058,6 +4104,11 @@ void MarlinSettings::reset() { TERN_(USE_SENSORLESS, gcode.M914_report(forReplay)); #endif + // + // TMC Homing Current + // + TERN_(EDITABLE_HOMING_CURRENT, gcode.M920_report(forReplay)); + // // TMC stepping mode // diff --git a/buildroot/tests/STM32F103RC_btt b/buildroot/tests/STM32F103RC_btt index 178170455f..2b05d42922 100755 --- a/buildroot/tests/STM32F103RC_btt +++ b/buildroot/tests/STM32F103RC_btt @@ -11,8 +11,9 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 SERIAL_PORT 1 SERIAL_PORT_2 -1 \ - X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 -opt_enable CR10_STOCKDISPLAY PINS_DEBUGGING Z_IDLE_HEIGHT \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 \ + X_CURRENT_HOME X_CURRENT/2 Y_CURRENT_HOME Y_CURRENT/2 Z_CURRENT_HOME Y_CURRENT/2 +opt_enable CR10_STOCKDISPLAY PINS_DEBUGGING Z_IDLE_HEIGHT EDITABLE_HOMING_CURRENT \ FT_MOTION FT_MOTION_MENU BIQU_MICROPROBE_V1 PROBE_ENABLE_DISABLE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR \ ADAPTIVE_STEP_SMOOTHING NONLINEAR_EXTRUSION exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - TMC2209 HW Serial, FT_MOTION" "$3" diff --git a/ini/features.ini b/ini/features.ini index f56175a3d6..1cff1a61f4 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -23,6 +23,7 @@ MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/marlin-2.1.3.x.zip build_src_filter=+ + + + + HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+ +EDITABLE_HOMING_CURRENT = build_src_filter=+ SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/6f53c19a8a.zip HAS_MOTOR_CURRENT_(I2C|DAC|SPI|PWM) = build_src_filter=+ HAS_MOTOR_CURRENT_I2C = SlowSoftI2CMaster From 5c59abaf6f273be325d92d79ae63e393e8c6038a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 27 Mar 2025 12:11:04 +0000 Subject: [PATCH 031/101] [cron] Bump distribution date (2025-03-27) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 18f9ce19e8..c24e090c3d 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-26" +//#define STRING_DISTRIBUTION_DATE "2025-03-27" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 0d24f4c508..690de1c353 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-26" + #define STRING_DISTRIBUTION_DATE "2025-03-27" #endif /** From 9a8ad9d1013e7273ee7ef679ddf212f537c4708e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 17:34:33 -0500 Subject: [PATCH 032/101] =?UTF-8?q?=F0=9F=8E=A8=20Comment=20long=20functio?= =?UTF-8?q?ns=20end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/RP2040/pinsDebug.h | 2 +- Marlin/src/MarlinCore.cpp | 10 +++++----- Marlin/src/module/probe.cpp | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/HAL/RP2040/pinsDebug.h b/Marlin/src/HAL/RP2040/pinsDebug.h index 964fb71086..f3842c4aff 100644 --- a/Marlin/src/HAL/RP2040/pinsDebug.h +++ b/Marlin/src/HAL/RP2040/pinsDebug.h @@ -107,7 +107,7 @@ uint8_t get_pin_mode(const pin_t Ard_num) { uint dir = gpio_get_dir( Ard_num); - if(dir) return MODE_PIN_OUTPUT; + if (dir) return MODE_PIN_OUTPUT; else return MODE_PIN_INPUT; } diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 689f71f8e5..3c44a9b71f 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -736,7 +736,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { WRITE(FET_SAFETY_PIN, FET_SAFETY_INVERTED); } #endif -} +} // manage_inactivity() #if ALL(EP_BABYSTEPPING, EMERGENCY_PARSER) #include "feature/babystep.h" @@ -890,7 +890,7 @@ void idle(const bool no_stepper_sleep/*=false*/) { TERN_(MARLIN_DEV_MODE, idle_depth--); return; -} +} // idle() /** * Kill all activity and lock the machine. @@ -983,7 +983,7 @@ void stop() { safe_delay(350); // allow enough time for messages to get out before stopping marlin_state = MarlinState::MF_STOPPED; } -} +} // stop() inline void tmc_standby_setup() { #if PIN_EXISTS(X_STDBY) @@ -1052,7 +1052,7 @@ inline void tmc_standby_setup() { #if PIN_EXISTS(E7_STDBY) SET_INPUT_PULLDOWN(E7_STDBY_PIN); #endif -} +} // tmc_standby_setup() /** * Marlin Firmware entry-point. Abandon Hope All Ye Who Enter Here. @@ -1702,7 +1702,7 @@ void setup() { SETUP_LOG("setup() completed."); TERN_(MARLIN_TEST_BUILD, runStartupTests()); -} +} // setup() /** * The main Marlin program loop diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index e121bca812..4f7d7c7690 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -275,7 +275,7 @@ xyz_pos_t Probe::offset; // Initialized by settings.load #ifdef MAG_MOUNTED_PRE_DEPLOY constexpr mag_probe_move_t pre_deploy = MAG_MOUNTED_PRE_DEPLOY; do_blocking_move_to(pre_deploy.where, MMM_TO_MMS(pre_deploy.fr_mm_min)); - #endif + #endif #if HAS_MAG_MOUNTED_SERVO_PROBE servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][0]); #endif From b5068bbc17ed395103564f302aa0cbdde8c004c1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 17:36:16 -0500 Subject: [PATCH 033/101] =?UTF-8?q?=F0=9F=94=A8=20Reduce=20warnings=20on?= =?UTF-8?q?=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/core/types.h | 77 ++++++++++++++++++++++----------------- Marlin/src/core/utility.h | 11 ------ 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index 68adadc95d..395dc430f5 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -566,11 +566,11 @@ struct XYval { FI XYval& operator= (const XYZEval &rs) { set(XY_LIST(rs.x, rs.y)); return *this; } // Override other operators to get intuitive behaviors - #define XY_OP(OP) { x TERN_(HAS_X_AXIS, OP rs.x), y TERN_(HAS_Y_AXIS, OP rs.y) } - FI constexpr XYval operator+ (const XYval &rs) const { return { x + rs.x, y + rs.y }; } - FI constexpr XYval operator- (const XYval &rs) const { return { x - rs.x, y - rs.y }; } - FI constexpr XYval operator* (const XYval &rs) const { return { x * rs.x, y * rs.y }; } - FI constexpr XYval operator/ (const XYval &rs) const { return { x / rs.x, y / rs.y }; } + #define XY_OP(OP) { T(x TERN_(HAS_X_AXIS, OP rs.x)), T(y TERN_(HAS_Y_AXIS, OP rs.y)) } + FI constexpr XYval operator+ (const XYval &rs) const { return { T(x + rs.x), T(y + rs.y) }; } + FI constexpr XYval operator- (const XYval &rs) const { return { T(x - rs.x), T(y - rs.y) }; } + FI constexpr XYval operator* (const XYval &rs) const { return { T(x * rs.x), T(y * rs.y) }; } + FI constexpr XYval operator/ (const XYval &rs) const { return { T(x / rs.x), T(y / rs.y) }; } FI constexpr XYval operator+ (const XYZval &rs) const { return { XY_OP(+) }; } FI constexpr XYval operator- (const XYZval &rs) const { return { XY_OP(-) }; } FI constexpr XYval operator* (const XYZval &rs) const { return { XY_OP(*) }; } @@ -721,21 +721,21 @@ struct XYZval { FI XYZval& operator= (const XYZEval &rs) { set(NUM_AXIS_ELEM_LC(rs)); return *this; } // Override other operators to get intuitive behaviors - FI constexpr XYZval operator+ (const XYval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator- (const XYval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator* (const XYval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator/ (const XYval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator+ (const XYZval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w ); } - FI constexpr XYZval operator- (const XYZval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w ); } - FI constexpr XYZval operator* (const XYZval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w ); } - FI constexpr XYZval operator/ (const XYZval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w ); } - FI constexpr XYZval operator+ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w ); } - FI constexpr XYZval operator- (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w ); } - FI constexpr XYZval operator* (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w ); } - FI constexpr XYZval operator/ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w ); } - FI constexpr XYZval operator* (const float &p) const { return NUM_AXIS_ARRAY((T)(x * p), (T)(y * p), (T)(z * p), (T)(i * p), (T)(j * p), (T)(k * p), (T)(u * p), (T)(v * p), (T)(w * p)); } + FI constexpr XYZval operator+ (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x + rs.x), T(y + rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator- (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x - rs.x), T(y - rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator* (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x * rs.x), T(y * rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator/ (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x / rs.x), T(y / rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator+ (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w) ); } + FI constexpr XYZval operator- (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w) ); } + FI constexpr XYZval operator* (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w) ); } + FI constexpr XYZval operator/ (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w) ); } + FI constexpr XYZval operator+ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w) ); } + FI constexpr XYZval operator- (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w) ); } + FI constexpr XYZval operator* (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w) ); } + FI constexpr XYZval operator/ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w) ); } + FI constexpr XYZval operator* (const float &p) const { return NUM_AXIS_ARRAY(T(x * p), T(y * p), T(z * p), T(i * p), T(j * p), T(k * p), T(u * p), T(v * p), T(w * p)); } FI constexpr XYZval operator* (const int &p) const { return NUM_AXIS_ARRAY(x * p, y * p, z * p, i * p, j * p, k * p, u * p, v * p, w * p); } - FI constexpr XYZval operator/ (const float &p) const { return NUM_AXIS_ARRAY((T)(x / p), (T)(y / p), (T)(z / p), (T)(i / p), (T)(j / p), (T)(k / p), (T)(u / p), (T)(v / p), (T)(w / p)); } + FI constexpr XYZval operator/ (const float &p) const { return NUM_AXIS_ARRAY(T(x / p), T(y / p), T(z / p), T(i / p), T(j / p), T(k / p), T(u / p), T(v / p), T(w / p)); } FI constexpr XYZval operator/ (const int &p) const { return NUM_AXIS_ARRAY(x / p, y / p, z / p, i / p, j / p, k / p, u / p, v / p, w / p); } FI constexpr XYZval operator>>(const int &p) const { return NUM_AXIS_ARRAY(_RS(x), _RS(y), _RS(z), _RS(i), _RS(j), _RS(k), _RS(u), _RS(v), _RS(w)); } FI constexpr XYZval operator<<(const int &p) const { return NUM_AXIS_ARRAY(_LS(x), _LS(y), _LS(z), _LS(i), _LS(j), _LS(k), _LS(u), _LS(v), _LS(w)); } @@ -870,21 +870,21 @@ struct XYZEval { FI XYZEval& operator= (const XYZval &rs) { set(NUM_AXIS_ELEM_LC(rs)); return *this; } // Override other operators to get intuitive behaviors - FI constexpr XYZEval operator+ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x + rs.x, y + rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator- (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x - rs.x, y - rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator* (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x * rs.x, y * rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator/ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x / rs.x, y / rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator+ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w); } - FI constexpr XYZEval operator- (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w); } - FI constexpr XYZEval operator* (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w); } - FI constexpr XYZEval operator/ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w); } - FI constexpr XYZEval operator+ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e + rs.e, x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w); } - FI constexpr XYZEval operator- (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e - rs.e, x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w); } - FI constexpr XYZEval operator* (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e * rs.e, x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w); } - FI constexpr XYZEval operator/ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e / rs.e, x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w); } - FI constexpr XYZEval operator* (const float &p) const { return LOGICAL_AXIS_ARRAY((T)(e * p), (T)(x * p), (T)(y * p), (T)(z * p), (T)(i * p), (T)(j * p), (T)(k * p), (T)(u * p), (T)(v * p), (T)(w * p)); } + FI constexpr XYZEval operator+ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x + rs.x), T(y + rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator- (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x - rs.x), T(y - rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator* (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x * rs.x), T(y * rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator/ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x / rs.x), T(y / rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator+ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w)); } + FI constexpr XYZEval operator- (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w)); } + FI constexpr XYZEval operator* (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w)); } + FI constexpr XYZEval operator/ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w)); } + FI constexpr XYZEval operator+ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e + rs.e), T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w)); } + FI constexpr XYZEval operator- (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e - rs.e), T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w)); } + FI constexpr XYZEval operator* (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e * rs.e), T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w)); } + FI constexpr XYZEval operator/ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e / rs.e), T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w)); } + FI constexpr XYZEval operator* (const float &p) const { return LOGICAL_AXIS_ARRAY(T(e * p), T(x * p), T(y * p), T(z * p), T(i * p), T(j * p), T(k * p), T(u * p), T(v * p), T(w * p)); } FI constexpr XYZEval operator* (const int &p) const { return LOGICAL_AXIS_ARRAY(e * p, x * p, y * p, z * p, i * p, j * p, k * p, u * p, v * p, w * p); } - FI constexpr XYZEval operator/ (const float &p) const { return LOGICAL_AXIS_ARRAY((T)(e / p), (T)(x / p), (T)(y / p), (T)(z / p), (T)(i / p), (T)(j / p), (T)(k / p), (T)(u / p), (T)(v / p), (T)(w / p)); } + FI constexpr XYZEval operator/ (const float &p) const { return LOGICAL_AXIS_ARRAY(T(e / p), T(x / p), T(y / p), T(z / p), T(i / p), T(j / p), T(k / p), T(u / p), T(v / p), T(w / p)); } FI constexpr XYZEval operator/ (const int &p) const { return LOGICAL_AXIS_ARRAY(e / p, x / p, y / p, z / p, i / p, j / p, k / p, u / p, v / p, w / p); } FI constexpr XYZEval operator>>(const int &p) const { return LOGICAL_AXIS_ARRAY(_RS(e), _RS(x), _RS(y), _RS(z), _RS(i), _RS(j), _RS(k), _RS(u), _RS(v), _RS(w)); } FI constexpr XYZEval operator<<(const int &p) const { return LOGICAL_AXIS_ARRAY(_LS(e), _LS(x), _LS(y), _LS(z), _LS(i), _LS(j), _LS(k), _LS(u), _LS(v), _LS(w)); } @@ -1231,3 +1231,14 @@ public: #undef _LSE #undef _RSE #undef FI + +// Axis names for G-code parsing, reports, etc. +constexpr xyze_char_t axis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', AXIS4_NAME, AXIS5_NAME, AXIS6_NAME, AXIS7_NAME, AXIS8_NAME, AXIS9_NAME); +#if NUM_AXES <= XYZ && !HAS_EXTRUDERS + #define AXIS_CHAR(A) ((char)('X' + A)) + #define IAXIS_CHAR AXIS_CHAR +#else + constexpr xyze_char_t iaxis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', 'I', 'J', 'K', 'U', 'V', 'W'); + #define AXIS_CHAR(A) axis_codes[A] + #define IAXIS_CHAR(A) iaxis_codes[A] +#endif diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index c3324443ba..77e8bac016 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -82,17 +82,6 @@ public: // in the range 0-100 while avoiding rounding artifacts constexpr uint8_t ui8_to_percent(const uint8_t i) { return (int(i) * 100 + 127) / 255; } -// Axis names for G-code parsing, reports, etc. -const xyze_char_t axis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', AXIS4_NAME, AXIS5_NAME, AXIS6_NAME, AXIS7_NAME, AXIS8_NAME, AXIS9_NAME); -#if NUM_AXES <= XYZ && !HAS_EXTRUDERS - #define AXIS_CHAR(A) ((char)('X' + A)) - #define IAXIS_CHAR AXIS_CHAR -#else - const xyze_char_t iaxis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', 'I', 'J', 'K', 'U', 'V', 'W'); - #define AXIS_CHAR(A) axis_codes[A] - #define IAXIS_CHAR(A) iaxis_codes[A] -#endif - #if ENABLED(MARLIN_DEV_MODE) enum MarlinError : uint8_t { ERR_NONE, From c1e8d46d219493b2072e3df24c4dca0ac9b39998 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 18:36:04 -0500 Subject: [PATCH 034/101] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20ELAPSED=20/=20PEND?= =?UTF-8?q?ING=20(ms,=20start,=20duration)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/MarlinCore.cpp | 4 ++-- Marlin/src/core/millis_t.h | 9 ++++----- Marlin/src/feature/controllerfan.cpp | 2 +- Marlin/src/feature/easythreed_ui.cpp | 10 +++++----- Marlin/src/feature/max7219.h | 2 +- Marlin/src/feature/mmu/mmu2.cpp | 8 ++++---- Marlin/src/feature/power.cpp | 2 +- Marlin/src/gcode/gcode.cpp | 4 ++-- Marlin/src/gcode/gcode.h | 4 ++-- Marlin/src/gcode/queue.cpp | 2 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 2 +- Marlin/src/lcd/marlinui.cpp | 2 +- Marlin/src/lcd/tft/touch.cpp | 2 +- Marlin/src/libs/MAX31865.cpp | 2 +- Marlin/src/module/temperature.cpp | 12 ++++++------ Marlin/tests/core/test_types.cpp | 9 +++++++++ 16 files changed, 42 insertions(+), 34 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 3c44a9b71f..bfe69ba94e 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -678,14 +678,14 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { TERN_(HOTEND_IDLE_TIMEOUT, hotend_idle.check()); #if ANY(PSU_CONTROL, AUTO_POWER_CONTROL) && PIN_EXISTS(PS_ON_EDM) - if ( ELAPSED(ms, powerManager.last_state_change_ms + PS_EDM_RESPONSE) + if ( ELAPSED(ms, powerManager.last_state_change_ms, PS_EDM_RESPONSE) && (READ(PS_ON_PIN) != READ(PS_ON_EDM_PIN) || TERN0(PSU_OFF_REDUNDANT, extDigitalRead(PS_ON1_PIN) != extDigitalRead(PS_ON1_EDM_PIN))) ) kill(GET_TEXT_F(MSG_POWER_EDM_FAULT)); #endif #if ENABLED(EXTRUDER_RUNOUT_PREVENT) if (thermalManager.degHotend(active_extruder) > (EXTRUDER_RUNOUT_MINTEMP) - && ELAPSED(ms, gcode.previous_move_ms + SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS)) + && ELAPSED(ms, gcode.previous_move_ms, SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS)) && !planner.has_blocks_queued() ) { const int8_t e_stepper = TERN(HAS_SWITCHING_EXTRUDER, active_extruder >> 1, active_extruder); diff --git a/Marlin/src/core/millis_t.h b/Marlin/src/core/millis_t.h index 7c00b91a5b..1d3cc853b3 100644 --- a/Marlin/src/core/millis_t.h +++ b/Marlin/src/core/millis_t.h @@ -30,8 +30,7 @@ typedef uint32_t millis_t; #define MS_TO_SEC(N) millis_t((N)/1000UL) #define MS_TO_SEC_PRECISE(N) (float(N)/1000.0f) -#define FUTURE(START,DURA) (millis_t(millis()-(START))<(DURA)) -#define PAST(START,DURA) (!FUTURE(START,DURA)) - -#define PENDING(NOW,SOON) (int32_t((NOW)-(SOON))<0) -#define ELAPSED(NOW,SOON) (!PENDING(NOW,SOON)) +constexpr bool _PENDING(const millis_t now, const millis_t when) { return int32_t(when - now) > 0; } +constexpr bool _PENDING(const millis_t now, const millis_t start, const millis_t interval) { return (now - start) < interval; } +#define PENDING(V...) _PENDING(V) +#define ELAPSED(V...) !_PENDING(V) diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp index 323d988a2d..585568b250 100644 --- a/Marlin/src/feature/controllerfan.cpp +++ b/Marlin/src/feature/controllerfan.cpp @@ -87,7 +87,7 @@ void ControllerFan::update() { * - If System is on idle and idle fan speed settings is activated. */ set_fan_speed( - settings.auto_mode && lastComponentOn && PENDING(ms, lastComponentOn + SEC_TO_MS(settings.duration)) + settings.auto_mode && lastComponentOn && PENDING(ms, lastComponentOn, SEC_TO_MS(settings.duration)) ? settings.active_speed : settings.idle_speed ); diff --git a/Marlin/src/feature/easythreed_ui.cpp b/Marlin/src/feature/easythreed_ui.cpp index 9617c62eb9..8974c5befd 100644 --- a/Marlin/src/feature/easythreed_ui.cpp +++ b/Marlin/src/feature/easythreed_ui.cpp @@ -78,9 +78,9 @@ void EasythreedUI::blinkLED() { prev_blink_interval_ms = blink_interval_ms; blink_start_ms = ms; } - if (PENDING(ms, blink_start_ms + blink_interval_ms)) + if (PENDING(ms, blink_start_ms, blink_interval_ms)) WRITE(EASYTHREED_LED_PIN, LOW); - else if (PENDING(ms, blink_start_ms + 2 * blink_interval_ms)) + else if (PENDING(ms, blink_start_ms, 2 * blink_interval_ms)) WRITE(EASYTHREED_LED_PIN, HIGH); else blink_start_ms = ms; @@ -107,7 +107,7 @@ void EasythreedUI::loadButton() { break; case FS_PRESS: - if (ELAPSED(millis(), filament_time + BTN_DEBOUNCE_MS)) { // After a short debounce delay... + if (ELAPSED(millis(), filament_time, BTN_DEBOUNCE_MS)) { // After a short debounce delay... if (!READ(BTN_RETRACT) || !READ(BTN_FEED)) { // ...if switch still toggled... thermalManager.setTargetHotend(EXTRUDE_MINTEMP + 10, 0); // Start heating up blink_interval_ms = LED_BLINK_7; // Set the LED to blink fast @@ -175,14 +175,14 @@ void EasythreedUI::printButton() { break; case KS_PRESS: - if (ELAPSED(ms, key_time + BTN_DEBOUNCE_MS)) // Wait for debounce interval to expire + if (ELAPSED(ms, key_time, BTN_DEBOUNCE_MS)) // Wait for debounce interval to expire key_status = READ(BTN_PRINT) ? KS_IDLE : KS_PROCEED; // Proceed if still pressed break; case KS_PROCEED: if (!READ(BTN_PRINT)) break; // Wait for the button to be released key_status = KS_IDLE; // Ready for the next press - if (PENDING(ms, key_time + 1200 - BTN_DEBOUNCE_MS)) { // Register a press < 1.2 seconds + if (PENDING(ms, key_time, 1200 - BTN_DEBOUNCE_MS)) { // Register a press < 1.2 seconds switch (print_key_flag) { case PF_START: { // The "Print" button starts an SD card print if (printingIsActive()) break; // Already printing? (find another line that checks for 'is planner doing anything else right now?') diff --git a/Marlin/src/feature/max7219.h b/Marlin/src/feature/max7219.h index a6b110fdf4..f476f7cde4 100644 --- a/Marlin/src/feature/max7219.h +++ b/Marlin/src/feature/max7219.h @@ -110,7 +110,7 @@ if (mode == ACCUMULATE_TOTAL) return; // update time_fraction every hundred milliseconds - if (instance_count == 0 && ELAPSED(now, last_calc_time + 100000)) { + if (instance_count == 0 && now - last_calc_time > 100000) { time_fraction = total_time * 128 / (now - last_calc_time); last_calc_time = now; total_time = 0; diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index d5f115e74c..96724d0d70 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -164,7 +164,7 @@ void MMU2::mmu_loop() { MMU2_SEND("S1"); // Read Version state = -2; } - else if (ELAPSED(millis(), prev_request + 30000)) { // 30sec after reset disable MMU + else if (ELAPSED(millis(), prev_request, 30000)) { // 30sec after reset disable MMU SERIAL_ECHOLNPGM("MMU not responding - DISABLED"); state = 0; } @@ -276,7 +276,7 @@ void MMU2::mmu_loop() { last_cmd = cmd; cmd = MMU_CMD_NONE; } - else if (ELAPSED(millis(), prev_P0_request + 300)) { + else if (ELAPSED(millis(), prev_P0_request, 300)) { MMU2_SEND("P0"); // Read FINDA state = 2; // wait for response } @@ -296,7 +296,7 @@ void MMU2::mmu_loop() { if (cmd == MMU_CMD_NONE) ready = true; state = 1; } - else if (ELAPSED(millis(), prev_request + MMU_P0_TIMEOUT)) // Resend request after timeout (3s) + else if (ELAPSED(millis(), prev_request, MMU_P0_TIMEOUT)) // Resend request after timeout (3s) state = 1; TERN_(HAS_PRUSA_MMU2S, check_filament()); @@ -335,7 +335,7 @@ void MMU2::mmu_loop() { last_cmd = MMU_CMD_NONE; } } - else if (ELAPSED(millis(), prev_request + MMU_CMD_TIMEOUT)) { + else if (ELAPSED(millis(), prev_request, MMU_CMD_TIMEOUT)) { // resend request after timeout if (last_cmd) { DEBUG_ECHOLNPGM("MMU retry"); diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index c6dc562836..a28d95d967 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -261,7 +261,7 @@ void Power::power_off() { nextPowerCheck = now + 2500UL; if (is_power_needed()) power_on(); - else if (!lastPowerOn || (POWER_TIMEOUT > 0 && ELAPSED(now, lastPowerOn + SEC_TO_MS(POWER_TIMEOUT)))) + else if (!lastPowerOn || (POWER_TIMEOUT > 0 && ELAPSED(now, lastPowerOn, SEC_TO_MS(POWER_TIMEOUT)))) power_off(); } } diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 8a444053e6..6dfc54d99e 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -246,8 +246,8 @@ void GcodeSuite::get_destination_from_command() { * Dwell waits immediately. It does not synchronize. */ void GcodeSuite::dwell(const millis_t time) { - const millis_t startMillis = millis(); - while (FUTURE(startMillis, time)) idle(); + const millis_t start_ms = millis(); + while (PENDING(millis(), start_ms, time)) idle(); } /** diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 1d39dc3a6b..911820ee7b 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -433,14 +433,14 @@ public: static millis_t previous_move_ms, max_inactive_time; FORCE_INLINE static bool stepper_max_timed_out(const millis_t ms=millis()) { - return max_inactive_time && ELAPSED(ms, previous_move_ms + max_inactive_time); + return max_inactive_time && ELAPSED(ms, previous_move_ms, max_inactive_time); } FORCE_INLINE static void reset_stepper_timeout(const millis_t ms=millis()) { previous_move_ms = ms; } #if HAS_DISABLE_IDLE_AXES static millis_t stepper_inactive_time; FORCE_INLINE static bool stepper_inactive_timeout(const millis_t ms=millis()) { - return ELAPSED(ms, previous_move_ms + stepper_inactive_time); + return ELAPSED(ms, previous_move_ms, stepper_inactive_time); } #else static bool stepper_inactive_timeout(const millis_t) { return false; } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 3475450045..657bfab08b 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -426,7 +426,7 @@ void GCodeQueue::get_serial_commands() { // send "wait" to indicate Marlin is still waiting. #if NO_TIMEOUTS > 0 const millis_t ms = millis(); - if (ring_buffer.empty() && !any_serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { + if (ring_buffer.empty() && !any_serial_data_available() && ELAPSED(ms, last_command_time, NO_TIMEOUTS)) { SERIAL_ECHOLNPGM(STR_WAIT); last_command_time = ms; } diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 071a88e475..a0145d6165 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -755,7 +755,7 @@ void MarlinUI::draw_status_message(const bool blink) { // Draw the progress bar if the message has shown long enough // or if there is no message set. - if (ELAPSED(millis(), progress_bar_ms + PROGRESS_BAR_MSG_TIME) || !has_status()) { + if (ELAPSED(millis(), progress_bar_ms, PROGRESS_BAR_MSG_TIME) || !has_status()) { const uint8_t progress = get_progress_percent(); if (progress > 2) return draw_progress_bar(progress); } diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 679c43b402..2114209b98 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -632,7 +632,7 @@ void MarlinUI::init() { // If the message will blink rather than expire... #if DISABLED(PROGRESS_MSG_ONCE) - if (ELAPSED(ms, progress_bar_ms + PROGRESS_BAR_MSG_TIME + PROGRESS_BAR_BAR_TIME)) + if (ELAPSED(ms, progress_bar_ms, PROGRESS_BAR_MSG_TIME + PROGRESS_BAR_BAR_TIME)) progress_bar_ms = ms; #endif diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 932418331b..bb226e50c6 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -102,7 +102,7 @@ void Touch::idle() { if (touch_time) { #if ENABLED(TOUCH_SCREEN_CALIBRATION) - if (touch_control_type == NONE && ELAPSED(now, touch_time + TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS) && ui.on_status_screen()) + if (touch_control_type == NONE && ELAPSED(now, touch_time, TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS) && ui.on_status_screen()) ui.goto_screen(touch_screen_calibration); #endif return; diff --git a/Marlin/src/libs/MAX31865.cpp b/Marlin/src/libs/MAX31865.cpp index 3fe0694644..83b03e24fd 100644 --- a/Marlin/src/libs/MAX31865.cpp +++ b/Marlin/src/libs/MAX31865.cpp @@ -346,7 +346,7 @@ inline uint16_t MAX31865::readRawImmediate() { } else { TERN_(MAX31865_USE_READ_ERROR_DETECTION, const millis_t ms = millis()); - if (TERN0(MAX31865_USE_READ_ERROR_DETECTION, ABS((int)(lastRead - rtd)) > 500 && PENDING(ms, lastReadStamp + 1000))) { + if (TERN0(MAX31865_USE_READ_ERROR_DETECTION, ABS(int(lastRead - rtd)) > 500 && PENDING(ms, lastReadStamp, 1000UL))) { // If 2 readings within 1s differ too much (~20°C) it's a read error. lastFault = 0x01; lastRead |= 1; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 217405eae6..7da051f9d7 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -823,7 +823,7 @@ volatile bool Temperature::raw_temps_ready = false; ONHEATING(start_temp, current_temp, target); #endif - if (heating && current_temp > target && ELAPSED(ms, t2 + 5000UL)) { + if (heating && current_temp > target && ELAPSED(ms, t2, 5000UL)) { heating = false; SHV((bias - d) >> 1); t1 = ms; @@ -831,7 +831,7 @@ volatile bool Temperature::raw_temps_ready = false; maxT = target; } - if (!heating && current_temp < target && ELAPSED(ms, t1 + 5000UL)) { + if (!heating && current_temp < target && ELAPSED(ms, t1, 5000UL)) { heating = true; t2 = ms; t_low = t2 - t1; @@ -4666,7 +4666,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_RESIDENCY_TIME))) + #define TEMP_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_CONDITIONS (wants_to_cool ? isCoolingHotend(target_extruder) : isHeatingHotend(target_extruder)) @@ -4808,7 +4808,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_BED_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_BED_RESIDENCY_TIME))) + #define TEMP_BED_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_BED_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_BED_CONDITIONS (wants_to_cool ? isCoolingBed() : isHeatingBed()) @@ -5008,7 +5008,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_CHAMBER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME))) + #define TEMP_CHAMBER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_CHAMBER_CONDITIONS (wants_to_cool ? isCoolingChamber() : isHeatingChamber()) @@ -5108,7 +5108,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_COOLER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME))) + #define TEMP_COOLER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_COOLER_CONDITIONS (wants_to_cool ? isLaserHeating() : isLaserCooling()) diff --git a/Marlin/tests/core/test_types.cpp b/Marlin/tests/core/test_types.cpp index d569386265..317b961626 100644 --- a/Marlin/tests/core/test_types.cpp +++ b/Marlin/tests/core/test_types.cpp @@ -22,6 +22,7 @@ #include "../test/unit_tests.h" #include "src/core/types.h" +#include "src/core/millis_t.h" MARLIN_TEST(types, XYval_const_as_bools) { const XYval xy_const_true = {1, 2}; @@ -656,3 +657,11 @@ MARLIN_TEST(types, SString) { TEST_ASSERT_TRUE(strcmp_P(str, PSTR("Hello World!-123456------ < spaces!33\n^ eol! ... 1234.50*2345.602 = 2895645.67")) == 0); } + +MARLIN_TEST(types, PENDING) { + TEST_ASSERT_TRUE(PENDING(0x0000FFFF, 0x00010000)); // <= ~24.4 days + TEST_ASSERT_TRUE(ELAPSED(0x0090000A, 0x00900000)); // <= ~24.4 days + TEST_ASSERT_FALSE(PENDING(0x00000000, 0x80000000)); // > ~24.4 days + TEST_ASSERT_TRUE(PENDING(0x00000000, 0, 0x80000000)); // <= ~48.8 days + TEST_ASSERT_TRUE(PENDING(0x80000000, 0x7FFFFFF0, 0x0020)); // <= ~48.8 days +} From 448ff71899a46c71ace774dfd47767a76a226c54 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 19:03:53 -0500 Subject: [PATCH 035/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Twe?= =?UTF-8?q?ak=20MAX7219=20test=20pattern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/feature/max7219.cpp | 40 +++++++++++++++------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp index 51ec219e20..5a25ea6710 100644 --- a/Marlin/src/feature/max7219.cpp +++ b/Marlin/src/feature/max7219.cpp @@ -480,32 +480,30 @@ void Max7219::register_setup() { #if MAX7219_INIT_TEST uint8_t test_mode = 0; - millis_t next_patt_ms; bool patt_on; #if MAX7219_INIT_TEST == 2 #define MAX7219_LEDS (MAX7219_X_LEDS * MAX7219_Y_LEDS) - constexpr millis_t pattern_delay = 4; - - int8_t spiralx, spiraly, spiral_dir; + xy_int8_t spiral; + int8_t spiral_dir; uvalue_t(MAX7219_LEDS) spiral_count; - void Max7219::test_pattern() { - constexpr int8_t way[][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } }; - led_set(spiralx, spiraly, patt_on); - const int8_t x = spiralx + way[spiral_dir][0], y = spiraly + way[spiral_dir][1]; - if (!WITHIN(x, 0, MAX7219_X_LEDS - 1) || !WITHIN(y, 0, MAX7219_Y_LEDS - 1) || BIT_7219(x, y) == patt_on) + void Max7219::run_test_pattern() { + constexpr xy_int8_t way[] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } }; + led_set(spiral.x, spiral.y, patt_on); + const xy_int8_t xy = spiral + way[spiral_dir]; + if (!WITHIN(xy.x, 0, MAX7219_X_LEDS - 1) || !WITHIN(xy.y, 0, MAX7219_Y_LEDS - 1) || BIT_7219(xy.x, xy.y) == patt_on) spiral_dir = (spiral_dir + 1) & 0x3; - spiralx += way[spiral_dir][0]; - spiraly += way[spiral_dir][1]; + spiral += way[spiral_dir]; if (!spiral_count--) { if (!patt_on) test_mode = 0; else { spiral_count = MAX7219_LEDS; - spiralx = spiraly = spiral_dir = 0; + spiral.reset(); + spiral_dir = 0; patt_on = false; } } @@ -516,7 +514,11 @@ void Max7219::register_setup() { constexpr millis_t pattern_delay = 20; int8_t sweep_count, sweepx, sweep_dir; - void Max7219::test_pattern() { + void Max7219::run_test_pattern() { + static millis_t next_pattern_ms = 0; + const millis_t ms = millis(); + if (PENDING(ms, next_pattern_ms)) return; + next_pattern_ms = ms + pattern_delay; set_column(sweepx, patt_on ? 0xFFFFFFFF : 0x00000000); sweepx += sweep_dir; if (!WITHIN(sweepx, 0, MAX7219_X_LEDS - 1)) { @@ -527,26 +529,20 @@ void Max7219::register_setup() { else sweepx -= MAX7219_X_LEDS * sweep_dir; FLIP(patt_on); - next_patt_ms += 100; + next_pattern_ms += 100; if (++test_mode > 4) test_mode = 0; } } #endif - void Max7219::run_test_pattern() { - const millis_t ms = millis(); - if (PENDING(ms, next_patt_ms)) return; - next_patt_ms = ms + pattern_delay; - test_pattern(); - } - void Max7219::start_test_pattern() { clear(); test_mode = 1; patt_on = true; #if MAX7219_INIT_TEST == 2 - spiralx = spiraly = spiral_dir = 0; + spiral.reset(); + spiral_dir = 0; spiral_count = MAX7219_LEDS; #else sweep_dir = 1; From efa175820f2e379b569ae01cdc422a8ef12c1f4d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 20:55:59 -0500 Subject: [PATCH 036/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20All?= =?UTF-8?q?ow=20for=20tests=20on=20macOS=20/=20Windows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- Marlin/src/pins/pins.h | 2 +- buildroot/share/PlatformIO/scripts/collect-code-tests.py | 6 +++--- buildroot/share/PlatformIO/scripts/preflight-checks.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 83b27e566a..23826497b6 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ help: @echo "make tests-all-local-docker : Run all tests locally, using docker" @echo "make unit-test-single-local : Run unit tests for a single config locally" @echo "make unit-test-single-local-docker : Run unit tests for a single config locally, using docker" - @echo "make unit-test-all-local : Run all code tests locally" + @echo "make unit-test-all-local : Run all code tests locally" @echo "make unit-test-all-local-docker : Run all code tests locally, using docker" @echo "make setup-local-docker : Setup local docker using buildx" @echo "" diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 01ff13f8c2..55dc00c60d 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -985,7 +985,7 @@ // #elif MB(SIMULATED) - #include "native/pins_RAMPS_NATIVE.h" // Native or Simulation lin:linux_native mac:simulator_macos_debug mac:simulator_macos_release win:simulator_windows lin:simulator_linux_debug lin:simulator_linux_release + #include "native/pins_RAMPS_NATIVE.h" // Native or Simulation lin:linux_native lin:simulator_linux_debug lin:simulator_linux_release lin:linux_native_test mac:simulator_macos_debug mac:simulator_macos_release win:simulator_windows #else diff --git a/buildroot/share/PlatformIO/scripts/collect-code-tests.py b/buildroot/share/PlatformIO/scripts/collect-code-tests.py index 576e3dd06d..62f95f4b4b 100644 --- a/buildroot/share/PlatformIO/scripts/collect-code-tests.py +++ b/buildroot/share/PlatformIO/scripts/collect-code-tests.py @@ -1,6 +1,6 @@ # # collect-code-tests.py -# Convenience script to collect all code tests. Used by env:linux_native_test in native.ini. +# Convenience script to collect all code tests. Used by test envs in native.ini. # import pioutil @@ -32,7 +32,7 @@ if pioutil.is_pio_build(): "restore_configs", f"cp -f {path} ./Marlin/config.ini", "python ./buildroot/share/PlatformIO/scripts/configuration.py", - f"platformio test -e linux_native_test -f {name}", + f"platformio test -e {env['PIOENV']} -f {name}", "restore_configs", ], title = "Marlin: {}".format(name.lower().title().replace("_", " ")), @@ -46,7 +46,7 @@ if pioutil.is_pio_build(): name = "test-marlin", dependencies = None, actions = [ - f"platformio run -t marlin_{name} -e linux_native_test" + f"platformio run -t marlin_{name} -e {env['PIOENV']}" for name in targets ], title = "Marlin: Test all code test suites", diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 94b39927e0..ea642809d5 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -95,7 +95,7 @@ if pioutil.is_pio_build(): # Make sure board is compatible with the build environment. Skip for _test, # since the board is manipulated as each unit test is executed. - if not result and build_env != "linux_native_test": + if not result and not build_env.endswith("_native_test"): err = "Error: Build environment '%s' is incompatible with %s. Use one of these environments: %s" % \ ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) raise SystemExit(err) From f6eaca6fcdd31d1d1ada67a7b3e3e15135e224f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferm=C3=ADn=20Olaiz?= Date: Fri, 28 Mar 2025 00:18:08 -0300 Subject: [PATCH 037/101] =?UTF-8?q?=F0=9F=A9=B9=20MKS=5FTINYBEE=20ADC=20re?= =?UTF-8?q?ference=20voltage=20warning=20(#27755)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/Warnings.cpp | 7 +++++++ Marlin/src/pins/esp32/pins_MKS_TINYBEE.h | 19 +++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index 7c107220af..70a6905d9f 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -898,6 +898,13 @@ #warning "The (-1) AD595 Thermocouple Amplifier requires 5V input supply! Use AD8495 for 3.3V ADC." #endif +/** + * MKS_TINYBEE Analog Reference + */ +#if ENABLED(EMIT_ADC_REFERENCE_VOLTAGE_WARNING) + #warning "Check your ADC_REFERENCE_VOLTAGE on MKS TinyBee! Measure the Analog Reference voltage on the board. See pins_MKS_TINYBEE.h for details." +#endif + /** * No PWM on the Piezo Beeper? */ diff --git a/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h b/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h index 6b5411e09d..11f18f4496 100644 --- a/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h +++ b/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h @@ -115,10 +115,21 @@ //#define CONTROLLER_FAN_PIN 148 // FAN2 //#define E0_AUTO_FAN_PIN 148 // FAN2 -// -// ADC Reference Voltage -// -#define ADC_REFERENCE_VOLTAGE 2.565 // 2.5V reference VDDA +/** + * ADC Reference Voltage + * + * In some boards the voltage reference is a bit off due to low quality + * components. That is enough to throw off the ADC readings and thus the + * temperatures by more than 10°C in some cases. If you experience that + * problem, measure the reference voltage (VDDA) at the 2nd pin of + * TH1/TH2 (with the sensors disconnected) and set ADC_REFERENCE_VOLTAGE + * in your config. + */ + +#ifndef ADC_REFERENCE_VOLTAGE + #define EMIT_ADC_REFERENCE_VOLTAGE_WARNING + #define ADC_REFERENCE_VOLTAGE 2.565 +#endif /** * ------ ------ From 78d6fec6525924cf659a3d720a5960bfa1eea286 Mon Sep 17 00:00:00 2001 From: Boyd Date: Thu, 27 Mar 2025 22:31:45 -0700 Subject: [PATCH 038/101] =?UTF-8?q?=F0=9F=9A=80=20HAL=20for=20GD32=20MFL?= =?UTF-8?q?=20(Creality=20v4.2.2)=20(#27744)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-build-tests.yml | 3 + Marlin/src/HAL/GD32_MFL/HAL.cpp | 120 ++ Marlin/src/HAL/GD32_MFL/HAL.h | 158 +++ Marlin/src/HAL/GD32_MFL/MarlinSPI.h | 26 + Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp | 101 ++ Marlin/src/HAL/GD32_MFL/MarlinSerial.h | 75 ++ Marlin/src/HAL/GD32_MFL/MinSerial.cpp | 163 +++ Marlin/src/HAL/GD32_MFL/README.md | 8 + Marlin/src/HAL/GD32_MFL/SDCard.cpp | 1022 +++++++++++++++++ Marlin/src/HAL/GD32_MFL/SDCard.h | 214 ++++ Marlin/src/HAL/GD32_MFL/Servo.cpp | 122 ++ Marlin/src/HAL/GD32_MFL/Servo.h | 56 + .../HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp | 129 +++ Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp | 93 ++ Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp | 54 + Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp | 96 ++ Marlin/src/HAL/GD32_MFL/endstop_interrupts.h | 61 + Marlin/src/HAL/GD32_MFL/fast_pwm.cpp | 97 ++ Marlin/src/HAL/GD32_MFL/fastio.h | 82 ++ .../src/HAL/GD32_MFL/inc/Conditionals_LCD.h | 26 + .../src/HAL/GD32_MFL/inc/Conditionals_adv.h | 26 + .../src/HAL/GD32_MFL/inc/Conditionals_post.h | 29 + .../src/HAL/GD32_MFL/inc/Conditionals_type.h | 22 + Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h | 97 ++ Marlin/src/HAL/GD32_MFL/pinsDebug.h | 102 ++ Marlin/src/HAL/GD32_MFL/sdio.cpp | 233 ++++ Marlin/src/HAL/GD32_MFL/sdio.h | 36 + Marlin/src/HAL/GD32_MFL/spi_pins.h | 32 + Marlin/src/HAL/GD32_MFL/temp_soc.h | 29 + Marlin/src/HAL/GD32_MFL/timers.cpp | 233 ++++ Marlin/src/HAL/GD32_MFL/timers.h | 145 +++ Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h | 26 + Marlin/src/HAL/HC32/eeprom_wired.cpp | 3 + Marlin/src/HAL/HC32/pinsDebug.h | 3 + Marlin/src/HAL/HC32/spi_pins.h | 3 + Marlin/src/HAL/platforms.h | 2 + Marlin/src/HAL/shared/servo.h | 2 + Marlin/src/core/boards.h | 12 +- Marlin/src/inc/SanityCheck.h | 6 +- Marlin/src/inc/Warnings.cpp | 13 +- .../dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp | 2 +- .../u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp | 4 +- Marlin/src/libs/BL24CXX.cpp | 2 +- .../pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h | 37 + Marlin/src/pins/pins.h | 7 + Marlin/src/pins/pinsDebug_list.h | 2 + Marlin/src/pins/stm32f1/env_validate.h | 7 +- README.md | 3 +- buildroot/tests/GD32F303RE_creality_mfl | 17 + ini/gd32.ini | 47 + platformio.ini | 1 + 51 files changed, 3873 insertions(+), 16 deletions(-) create mode 100644 Marlin/src/HAL/GD32_MFL/HAL.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/HAL.h create mode 100644 Marlin/src/HAL/GD32_MFL/MarlinSPI.h create mode 100644 Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/MarlinSerial.h create mode 100644 Marlin/src/HAL/GD32_MFL/MinSerial.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/README.md create mode 100644 Marlin/src/HAL/GD32_MFL/SDCard.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/SDCard.h create mode 100644 Marlin/src/HAL/GD32_MFL/Servo.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/Servo.h create mode 100644 Marlin/src/HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/endstop_interrupts.h create mode 100644 Marlin/src/HAL/GD32_MFL/fast_pwm.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/fastio.h create mode 100644 Marlin/src/HAL/GD32_MFL/inc/Conditionals_LCD.h create mode 100644 Marlin/src/HAL/GD32_MFL/inc/Conditionals_adv.h create mode 100644 Marlin/src/HAL/GD32_MFL/inc/Conditionals_post.h create mode 100644 Marlin/src/HAL/GD32_MFL/inc/Conditionals_type.h create mode 100644 Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h create mode 100644 Marlin/src/HAL/GD32_MFL/pinsDebug.h create mode 100644 Marlin/src/HAL/GD32_MFL/sdio.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/sdio.h create mode 100644 Marlin/src/HAL/GD32_MFL/spi_pins.h create mode 100644 Marlin/src/HAL/GD32_MFL/temp_soc.h create mode 100644 Marlin/src/HAL/GD32_MFL/timers.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/timers.h create mode 100644 Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h create mode 100644 Marlin/src/pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h create mode 100755 buildroot/tests/GD32F303RE_creality_mfl create mode 100644 ini/gd32.ini diff --git a/.github/workflows/ci-build-tests.yml b/.github/workflows/ci-build-tests.yml index 320cda5b18..2fd316ec0f 100644 --- a/.github/workflows/ci-build-tests.yml +++ b/.github/workflows/ci-build-tests.yml @@ -151,6 +151,9 @@ jobs: # HC32 - HC32F460C_aquila_101 + # GD32F3 + - GD32F303RE_creality_mfl + # LPC176x - Lengthy tests - LPC1768 - LPC1769 diff --git a/Marlin/src/HAL/GD32_MFL/HAL.cpp b/Marlin/src/HAL/GD32_MFL/HAL.cpp new file mode 100644 index 0000000000..460ed52297 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/HAL.cpp @@ -0,0 +1,120 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +uint16_t MarlinHAL::adc_result; + +#if ENABLED(POSTMORTEM_DEBUGGING) + extern void install_min_serial(); +#endif + +#if ENABLED(MARLIN_DEV_MODE) + // Dump the clock frequencies of the system, AHB, APB1, APB2, and F_CPU. + static inline void HAL_clock_frequencies_dump() { + auto& rcuInstance = rcu::RCU::get_instance(); + uint32_t freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_SYS); + SERIAL_ECHOPGM("\nSYSTEM_CLOCK=", freq); + freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_AHB); + SERIAL_ECHOPGM("\nABH_CLOCK=", freq); + freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_APB1); + SERIAL_ECHOPGM("\nAPB1_CLOCK=", freq); + freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_APB2); + SERIAL_ECHOPGM("\nAPB2_CLOCK=", freq, + "\nF_CPU=", F_CPU); + // Done + SERIAL_ECHOPGM("\n--\n"); + } +#endif // MARLIN_DEV_MODE + +// Initializes the Marlin HAL +void MarlinHAL::init() { + constexpr unsigned int cpuFreq = F_CPU; + UNUSED(cpuFreq); + +#if PIN_EXISTS(LED) + OUT_WRITE(LED_PIN, LOW); +#endif + + SetTimerInterruptPriorities(); + + // Print clock frequencies to host serial + TERN_(MARLIN_DEV_MODE, HAL_clock_frequencies_dump()); + + // Register min serial + TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); +} + +// Returns the reset source based on the flags set in the RCU module +uint8_t MarlinHAL::get_reset_source() { + return + (RCU_I.get_flag(rcu::Status_Flags::FLAG_FWDGTRST)) ? RST_WATCHDOG : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_SWRST)) ? RST_SOFTWARE : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_EPRST)) ? RST_EXTERNAL : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_PORRST)) ? RST_POWER_ON : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_LPRST)) ? RST_BROWN_OUT : + 0; +} + +// Returns the amount of free memory available in bytes +int MarlinHAL::freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +// Watchdog Timer +#if ENABLED(USE_WATCHDOG) + #define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout + + #include + + FWatchdogTimer& watchdogTimer = FWatchdogTimer::get_instance(); + + // Initializes the watchdog timer + void MarlinHAL::watchdog_init() { + IF_DISABLED(DISABLE_WATCHDOG_INIT, watchdogTimer.begin(WDT_TIMEOUT_US)); + } + + // Refreshes the watchdog timer to prevent system reset + void MarlinHAL::watchdog_refresh() { + watchdogTimer.reload(); + #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) + TOGGLE(LED_PIN); // Heartbeat indicator + #endif + } +#endif + +extern "C" { + extern unsigned int _ebss; // End of bss section +} + +// Resets the system to initiate a firmware flash. +WEAK void flashFirmware(const int16_t) { + hal.reboot(); +} + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/HAL.h b/Marlin/src/HAL/GD32_MFL/HAL.h new file mode 100644 index 0000000000..a8a28cc7f3 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/HAL.h @@ -0,0 +1,158 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#define CPU_32_BIT + +#include "../../core/macros.h" +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "temp_soc.h" +#include "fastio.h" +#include "Servo.h" + +#include "../../inc/MarlinConfigPre.h" + +#include +#include +#include + +// Default graphical display delays +#define CPU_ST7920_DELAY_1 300 +#define CPU_ST7920_DELAY_2 40 +#define CPU_ST7920_DELAY_3 340 + +// Serial Ports +#include "MarlinSerial.h" + +// Interrupts +#define CRITICAL_SECTION_START() const bool irqon = !__get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END() if (irqon) __enable_irq() + +#define cli() __disable_irq() +#define sei() __enable_irq() + +// Alias of __bss_end__ +#define __bss_end __bss_end__ + +// Types +typedef double isr_float_t; // FPU ops are used for single-precision, so use double for ISRs. +typedef uint8_t pin_t; // Parity with mfl platform + +// Servo +class libServo; +typedef libServo hal_servo_t; +#define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() +#define RESUME_SERVO_OUTPUT() libServo::resume_all_servos() + +// Debugging +#define JTAG_DISABLE() AFIO_I.set_remap(gpio::Pin_Remap_Select::SWJ_DP_ONLY_REMAP) +#define JTAGSWD_DISABLE() AFIO_I.set_remap(gpio::Pin_Remap_Select::SWJ_ALL_DISABLED_REMAP) +#define JTAGSWD_RESET() AFIO_I.set_remap(gpio::Pin_Remap_Select::FULL_SWJ_REMAP) + +// ADC +#ifdef ADC_RESOLUTION + #define HAL_ADC_RESOLUTION ADC_RESOLUTION +#else + #define HAL_ADC_RESOLUTION 12 +#endif + +#define HAL_ADC_VREF_MV 3300 + +// Disable Marlin's software oversampling. +// The MFL framework uses 16x hardware oversampling by default +#define HAL_ADC_FILTERED + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#ifndef PLATFORM_M997_SUPPORT + #define PLATFORM_M997_SUPPORT +#endif + +void flashFirmware(const int16_t); + +#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment + +extern "C" char* _sbrk(int incr); +extern "C" char* dtostrf(double val, signed char width, unsigned char prec, char* sout); + +// MarlinHAL Class +class MarlinHAL { +public: + // Before setup() + MarlinHAL() {} + + // Watchdog + static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {}); + static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); + + static void init(); // called early in setup() + static void init_board() {} // called less early in setup() + static void reboot() { NVIC_SystemReset(); } // restart the firmware from 0x0 + + // Interrupts + static bool isr_state() { return !__get_PRIMASK(); } + static void isr_on() { sei(); } + static void isr_off() { cli(); } + static void delay_ms(const int ms) { delay(ms); } + + // Tasks called from idle() + static void idletask() {} + + // Reset + static uint8_t get_reset_source(); + static void clear_reset_source() { RCU_I.clear_all_reset_flags(); } + + // Free SRAM + static int freeMemory(); + + // ADC methods + static uint16_t adc_result; + + // Called by Temperature::init once at startup + static void adc_init() { analogReadResolution(HAL_ADC_RESOLUTION); } + + // Called by Temperature::init for each sensor at startup + static void adc_enable(const pin_t pin) { pinMode(pin, INPUT); } + + // Called from Temperature::isr to start ADC sampling on the given pin + static void adc_start(const pin_t pin) { adc_result = static_cast(analogRead(pin)); } + + // Check if ADC is ready for reading + static bool adc_ready() { return true; } + + // Current value of the ADC register + static uint16_t adc_value() { return adc_result; } + + // Set the PWM duty cycle for the pin to the given value. + // Optionally invert the duty cycle [default = false] + // Optionally change the maximum size of the provided value to enable finer PWM duty control [default = 255] + static void set_pwm_duty(const pin_t pin, const uint16_t value, const uint16_t scale = 255U, const bool invert = false); + + // Set the frequency of the timer for the given pin. + // All Timer PWM pins run at the same frequency. + static void set_pwm_frequency(const pin_t pin, const uint16_t f_desired); +}; diff --git a/Marlin/src/HAL/GD32_MFL/MarlinSPI.h b/Marlin/src/HAL/GD32_MFL/MarlinSPI.h new file mode 100644 index 0000000000..d0731f9e84 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MarlinSPI.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include + +using MarlinSPI = SPIClass; diff --git a/Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp b/Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp new file mode 100644 index 0000000000..c9b76a4ca4 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp @@ -0,0 +1,101 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "MarlinSerial.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +using namespace arduino; + +MarlinSerial& MarlinSerial::get_instance(usart::USART_Base Base, pin_size_t rxPin, pin_size_t txPin) { + UsartSerial& serial = UsartSerial::get_instance(Base, rxPin, txPin); + return *reinterpret_cast(&serial); +} + +#if USING_HW_SERIAL0 + MSerialT MSerial0(true, MarlinSerial::get_instance(usart::USART_Base::USART0_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL1 + MSerialT MSerial1(true, MarlinSerial::get_instance(usart::USART_Base::USART1_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL2 + MSerialT MSerial2(true, MarlinSerial::get_instance(usart::USART_Base::USART2_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL3 + MSerialT MSerial3(true, MarlinSerial::get_instance(usart::USART_Base::UART3_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL4 + MSerialT MSerial4(true, MarlinSerial::get_instance(usart::USART_Base::UART4_BASE, NO_PIN, NO_PIN)); +#endif + +#if ENABLED(EMERGENCY_PARSER) + // This callback needs to access the specific MarlinSerial instance + // We'll use a static pointer to track the current instance + static MarlinSerial* current_serial_instance = nullptr; + + static void emergency_callback() { + if (current_serial_instance) { + uint8_t last_data = current_serial_instance->get_last_data(); + emergency_parser.update(current_serial_instance->emergency_state, last_data); + } + } + + void MarlinSerial::register_emergency_callback(void (*callback)()) { + usart_.register_interrupt_callback(usart::Interrupt_Type::INTR_RBNEIE, callback); + } +#endif + +void MarlinSerial::begin(unsigned long baudrate, uint16_t config) { + UsartSerial::begin(baudrate, config); + #if DISABLED(SERIAL_DMA) + #if ENABLED(EMERGENCY_PARSER) + current_serial_instance = this; + register_emergency_callback(emergency_callback); + #endif + #endif +} + +void MarlinSerial::updateRxDmaBuffer() { + #if ENABLED(EMERGENCY_PARSER) + // Get the number of bytes available in the receive buffer + size_t available_bytes = usart_.available_for_read(true); + uint8_t data; + + // Process only the available data + for (size_t i = 0; i < available_bytes; ++i) { + if (usart_.read_rx_buffer(data)) { + emergency_parser.update(emergency_state, data); + } + } + #endif + // Call the base class implementation to handle any additional updates + UsartSerial::updateRxDmaBuffer(); +} + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/MarlinSerial.h b/Marlin/src/HAL/GD32_MFL/MarlinSerial.h new file mode 100644 index 0000000000..f47c6da032 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MarlinSerial.h @@ -0,0 +1,75 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +#include + +#include "../../core/serial_hook.h" + +#define SERIAL_INDEX_MIN 0 +#define SERIAL_INDEX_MAX 4 + +#include "../shared/serial_ports.h" + +#if defined(LCD_SERIAL_PORT) && ANY(HAS_DGUS_LCD, EXTENSIBLE_UI) + #define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() +#endif + +using namespace arduino; + +struct MarlinSerial : public UsartSerial { + static MarlinSerial& get_instance(usart::USART_Base Base, pin_size_t rxPin = NO_PIN, pin_size_t txPin = NO_PIN); + + void begin(unsigned long baudrate, uint16_t config); + inline void begin(unsigned long baudrate) { begin(baudrate, SERIAL_8N1); } + void updateRxDmaBuffer(); + + #if DISABLED(SERIAL_DMA) + FORCE_INLINE static uint8_t buffer_overruns() { return 0; } + #endif + + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + + // Accessor method to get the last received byte + uint8_t get_last_data() { return usart_.get_last_data(); } + + // Register the emergency callback + void register_emergency_callback(void (*callback)()); + #endif + +protected: + using UsartSerial::UsartSerial; +}; + +typedef Serial1Class MSerialT; +extern MSerialT MSerial0; +extern MSerialT MSerial1; +extern MSerialT MSerial2; +extern MSerialT MSerial3; +extern MSerialT MSerial4; diff --git a/Marlin/src/HAL/GD32_MFL/MinSerial.cpp b/Marlin/src/HAL/GD32_MFL/MinSerial.cpp new file mode 100644 index 0000000000..d5e8147798 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MinSerial.cpp @@ -0,0 +1,163 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) +#include "../shared/MinSerial.h" + +// Base addresses for USART peripherals +static constexpr uintptr_t USART_base[] = { + 0x40013800, // USART0 + 0x40004400, // USART1 + 0x40004800, // USART2 + 0x40004C00, // UART3 + 0x40005000 // UART4 +}; + +// Register offsets +static constexpr uint32_t STAT0_OFFSET = 0x00U; +static constexpr uint32_t DATA_OFFSET = 0x04U; +static constexpr uint32_t BAUD_OFFSET = 0x08U; +static constexpr uint32_t CTL0_OFFSET = 0x0CU; +static constexpr uint32_t CTL1_OFFSET = 0x14U; + +// Bit positions +static constexpr uint32_t TBE_BIT = 7; +static constexpr uint32_t TEN_BIT = 3; +static constexpr uint32_t UEN_BIT = 13; + +// NVIC interrupt numbers for USART +static constexpr int nvicUART[] = { 37, 38, 39, 52, 53 }; + +// RCU PCLK values for USART +static constexpr rcu::RCU_PCLK clockRegs[] = { + rcu::RCU_PCLK::PCLK_USART0, + rcu::RCU_PCLK::PCLK_USART1, + rcu::RCU_PCLK::PCLK_USART2, + rcu::RCU_PCLK::PCLK_UART3, + rcu::RCU_PCLK::PCLK_UART4 +}; + +// Memory barrier instructions +#define isb() __asm__ __volatile__ ("isb" : : : "memory") +#define dsb() __asm__ __volatile__ ("dsb" : : : "memory") +#define sw_barrier() __asm__ volatile("" : : : "memory") + +// Direct register access macros +#define USART_REG(offset) (*(volatile uint32_t*)(USART_base[SERIAL_PORT] + (offset))) +#define USART_STAT0 USART_REG(STAT0_OFFSET) +#define USART_DATA USART_REG(DATA_OFFSET) +#define USART_BAUD USART_REG(BAUD_OFFSET) +#define USART_CTL0 USART_REG(CTL0_OFFSET) +#define USART_CTL1 USART_REG(CTL1_OFFSET) + +// Bit manipulation macros +#define READ_BIT(reg, bit) (((reg) >> (bit)) & 1U) +#define SET_BIT(reg, bit) ((reg) |= (1U << (bit))) +#define CLEAR_BIT(reg, bit) ((reg) &= ~(1U << (bit))) + +// Initializes the MinSerial interface. +// This function sets up the USART interface for serial communication. +// If the selected serial port is not a hardware port, it disables the severe error reporting feature. +static void MinSerialBegin() { + #if !WITHIN(SERIAL_PORT, 0, 4) + #warning "Using POSTMORTEM_DEBUGGING requires a physical U(S)ART hardware in case of severe error." + #warning "Disabling the severe error reporting feature currently because the used serial port is not a HW port." + #else + int nvicIndex = nvicUART[SERIAL_PORT]; + + // NVIC base address for interrupt disable + struct NVICMin { + volatile uint32_t ISER[32]; + volatile uint32_t ICER[32]; + }; + NVICMin *nvicBase = (NVICMin*)0xE000E100; + + SBI32(nvicBase->ICER[nvicIndex >> 5], nvicIndex & 0x1F); + + // We require memory barriers to properly disable interrupts + // (https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the) + dsb(); + isb(); + + // Get the RCU PCLK for this USART + rcu::RCU_PCLK pclk = clockRegs[SERIAL_PORT]; + + // Disable then enable usart peripheral clocks + rcu::RCU_DEVICE.set_pclk_enable(pclk, false); + rcu::RCU_DEVICE.set_pclk_enable(pclk, true); + + // Save current baudrate + uint32_t baudrate = USART_BAUD; + + // Reset USART control registers + USART_CTL0 = 0; + USART_CTL1 = 0; // 1 stop bit + + // Restore baudrate + USART_BAUD = baudrate; + + // Enable transmitter and USART (8 bits, no parity, 1 stop bit) + SET_BIT(USART_CTL0, TEN_BIT); + SET_BIT(USART_CTL0, UEN_BIT); + #endif +} + +// Writes a single character to the serial port. +static void MinSerialWrite(char c) { + #if WITHIN(SERIAL_PORT, 0, 4) + // Wait until transmit buffer is empty + while (!READ_BIT(USART_STAT0, TBE_BIT)) { + hal.watchdog_refresh(); + sw_barrier(); + } + // Write character to data register + USART_DATA = c; + #endif +} + +// Installs the minimum serial interface. +// Sets the HAL_min_serial_init and HAL_min_serial_out function pointers to MinSerialBegin and MinSerialWrite respectively. +void install_min_serial() { + HAL_min_serial_init = &MinSerialBegin; + HAL_min_serial_out = &MinSerialWrite; +} + +extern "C" { + // A low-level assembly-based jump handler. + // Unconditionally branches to the CommonHandler_ASM function. + __attribute__((naked, aligned(4))) void JumpHandler_ASM() { + __asm__ __volatile__ ("b CommonHandler_ASM\n"); + } + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) HardFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) BusFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) UsageFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) MemManage_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) NMI_Handler(); +} + +#endif // POSTMORTEM_DEBUGGING +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/README.md b/Marlin/src/HAL/GD32_MFL/README.md new file mode 100644 index 0000000000..af23a37f2f --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/README.md @@ -0,0 +1,8 @@ +# Generic GD32 HAL based on the MFL Arduino Core + +This HAL is eventually intended to act as the generic HAL for all GD32 chips using the MFL library. + +Currently it supports: + * GD32F303RET6 + +Targeting the official [MFL Arduino Core](https://github.com/bnmguy/ArduinoCore_MFL). diff --git a/Marlin/src/HAL/GD32_MFL/SDCard.cpp b/Marlin/src/HAL/GD32_MFL/SDCard.cpp new file mode 100644 index 0000000000..15d33d2596 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/SDCard.cpp @@ -0,0 +1,1022 @@ +// +// MFL gd32f30x SDCARD using DMA through SDIO in C++ +// +// Copyright (C) 2025 B. Mourit +// +// This software is free software: you can redistribute it and/or modify it under the terms of the +// GNU Lesser General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along with this software. +// If not, see . +// + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +#include "SDCard.h" +#include +#include + +namespace sdio { + +CardDMA& CardDMA::get_instance() { + static CardDMA instance; + return instance; +} + +CardDMA::CardDMA() : + sdcard_csd_{0U, 0U, 0U, 0U}, + sdcard_cid_{0U, 0U, 0U, 0U}, + sdcard_scr_{0U, 0U}, + desired_clock_(Default_Desired_Clock), + stop_condition_(0U), + total_bytes_(0U), + count_(0U), + sdio_(SDIO::get_instance()), + config_(sdio_.get_config()), + dmaBase_(dma::DMA_Base::DMA1_BASE), + dmaChannel_(dma::DMA_Channel::CHANNEL3), + dma_(dma::DMA::get_instance(dmaBase_, dmaChannel_).value()), + sdcard_rca_(0U), + transfer_error_(SDIO_Error_Type::OK), + interface_version_(Interface_Version::UNKNOWN), + card_type_(Card_Type::UNKNOWN), + transfer_end_(false), + is_rx_(false), + multiblock_(false), + current_state_(Operational_State::READY) +{ +} + +// Initialize card and put in standby state +SDIO_Error_Type CardDMA::init() { + // Reset SDIO peripheral + sdio_.reset(); + sync_domains(); + + // Initialize SDIO peripheral + // If no SDIO_Config structure is provided the default is used. + // The default provides the parameters for initialization + // using a very low clock speed (typically <= 400KHz). + sdio_.init(); + sync_domains(); + + SDIO_Error_Type result = begin_startup_procedure(); + if (result != SDIO_Error_Type::OK) { + return result; + } + + return card_init(); +} + +// Startup command procedure according to SDIO specification +SDIO_Error_Type CardDMA::begin_startup_procedure() { + sdio_.set_power_mode(Power_Control::POWER_ON); + sdio_.set_clock_enable(true); + sync_domains(); + + // CMD0 (GO_IDLE_STATE) + if (send_command_and_check(Command_Index::CMD0, 0, Command_Response::RSP_NONE, Wait_Type::WT_NONE, [this]() { + return this->get_command_sent_result(); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD0_FAILED; + } + + // CMD8 + if (send_command_and_check(Command_Index::CMD8, Check_Pattern, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this]() { + return this->get_r7_result(); + }) != SDIO_Error_Type::OK) { + // V1.0 card + // CMD0 (GO_IDLE_STATE) + interface_version_ = Interface_Version::INTERFACE_V1_1; + if (send_command_and_check(Command_Index::CMD0, 0, Command_Response::RSP_NONE, Wait_Type::WT_NONE, [this]() { + return this->get_command_sent_result(); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD0_FAILED; + } + } else { + // V2.0 card + // CMD55 + interface_version_ = Interface_Version::INTERFACE_V2_0; + if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + } + + if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + return validate_voltage(); +} + +// Voltage validation +SDIO_Error_Type CardDMA::validate_voltage() { + uint32_t response = 0U; + uint32_t count = 0U; + bool valid_voltage = false; + + while ((count < Max_Voltage_Checks) && (valid_voltage == false)) { + if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + if (send_command_and_check(Command_Index::ACMD41, Voltage_Window | SDCARD_HCS | Switch_1_8V_Capacity, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::INVALID, index = false, crc = true]() { + return check_sdio_status(cmd, index, crc); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD41_FAILED; + } + response = sdio_.get_response(Response_Type::RESPONSE0); + valid_voltage = (((response >> 31U) == 1U) ? true : false); + count++; + } + + if (count >= Max_Voltage_Checks) { + return SDIO_Error_Type::INVALID_VOLTAGE; + } + + card_type_ = (response & SDCARD_HCS) ? Card_Type::SDCARD_HIGH_CAPACITY : Card_Type::SDCARD_STANDARD_CAPACITY; + + #if ENABLED(MARLIN_DEV_MODE) + if (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY) { + SERIAL_ECHOPGM("\n SDHC!"); + } else { + SERIAL_ECHOPGM("\n SDSC!"); + } + #endif + + return SDIO_Error_Type::OK; +} + +// Shutdown +void CardDMA::begin_shutdown_procedure() { + sdio_.set_power_mode(Power_Control::POWER_OFF); +} + +// Initialize card +SDIO_Error_Type CardDMA::card_init() { + if (sdio_.get_power_mode() == static_cast(Power_Control::POWER_OFF)) { + return SDIO_Error_Type::INVALID_OPERATION; + } + + // Skip CID/RCA for IO cards + if (card_type_ != Card_Type::SD_IO_CARD) { + if (send_command_and_check(Command_Index::CMD2, 0U, Command_Response::RSP_LONG, Wait_Type::WT_NONE, + [this, cmd = Command_Index::INVALID, index = false, crc = true]() { + return check_sdio_status(cmd, index, crc); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD2_FAILED; + } + // Store CID + store_cid(); + + // Get RCA + uint16_t r6_rca; + if (send_command_and_check(Command_Index::CMD3, 0U, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, + [this, cmd = Command_Index::CMD3, rca = &r6_rca]() { + return get_r6_result(cmd, rca); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD3_FAILED; + } + // Store RCA + sdcard_rca_ = r6_rca; + if (send_command_and_check(Command_Index::CMD9, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_LONG, Wait_Type::WT_NONE, + [this, cmd = Command_Index::INVALID, index = false, crc = true]() { + return check_sdio_status(cmd, index, crc); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD9_FAILED; + } + // Store CSD + store_csd(); + } + + Card_Info card_info; + SDIO_Error_Type result = get_card_specific_data(&card_info); + if (result != SDIO_Error_Type::OK) { + return result; + } + + if (select_deselect() != SDIO_Error_Type::OK) { + return SDIO_Error_Type::SELECT_DESELECT_FAILED; + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::store_cid() { + // Store the CID register values + sdcard_cid_[0] = sdio_.get_response(Response_Type::RESPONSE0); + sdcard_cid_[1] = sdio_.get_response(Response_Type::RESPONSE1); + sdcard_cid_[2] = sdio_.get_response(Response_Type::RESPONSE2); + sdcard_cid_[3] = sdio_.get_response(Response_Type::RESPONSE3); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::store_csd() { + // Store the CSD register values + sdcard_csd_[0] = sdio_.get_response(Response_Type::RESPONSE0); + sdcard_csd_[1] = sdio_.get_response(Response_Type::RESPONSE1); + sdcard_csd_[2] = sdio_.get_response(Response_Type::RESPONSE2); + sdcard_csd_[3] = sdio_.get_response(Response_Type::RESPONSE3); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::set_hardware_bus_width(Bus_Width width) { + if (card_type_ == Card_Type::SD_MMC || width == Bus_Width::WIDTH_8BIT) { + return SDIO_Error_Type::UNSUPPORTED_FUNCTION; + } + + // Retrieve SCR + SDIO_Error_Type result = get_scr(sdcard_rca_, sdcard_scr_); + if (result != SDIO_Error_Type::OK) { + return result; + } + + // Check and set bus width + // This function is only used to set a higher width than the default 1bit + // so no 1bit configuration logic is required. + if (width == Bus_Width::WIDTH_4BIT) { + // Send CMD55 (APP_CMD) + if (send_command_and_check(Command_Index::CMD55, static_cast(sdcard_rca_ << RCA_Shift), Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + // Send ACMD6 (SET_BUS_WIDTH) + if (send_command_and_check(Command_Index::ACMD6, 2U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD6]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD6_FAILED; + } + + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOPGM("\n wide bus set!"); + #endif + sdio_.set_bus_width(Bus_Width::WIDTH_4BIT); + + return SDIO_Error_Type::OK; + } + + return SDIO_Error_Type::UNSUPPORTED_FUNCTION; +} + +SDIO_Error_Type CardDMA::read(uint8_t* buf, uint32_t address, uint32_t count) { + if (current_state_ == Operational_State::READY) { + transfer_error_ = SDIO_Error_Type::OK; + current_state_ = Operational_State::BUSY; + is_rx_ = true; + multiblock_ = (count > 1); + + sdio_.clear_data_state_machine(Transfer_Direction::CARD_TO_SDIO); + + // Enable the interrupts + sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::RXOREIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::STBITEIE, true); + + total_bytes_ = BLOCK_SIZE * count; + + // Set DMA transfer parameters + set_dma_parameters(buf, (total_bytes_ / 4U), false); + sdio_.set_dma_enable(true); + + if (card_type_ != Card_Type::SDCARD_HIGH_CAPACITY) { + address *= 512U; + } + + // CMD16 set card block size + if (send_command_and_check(Command_Index::CMD16, BLOCK_SIZE, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + current_state_ = Operational_State::READY; + return SDIO_Error_Type::CMD16_FAILED; + } + + Block_Size block_size = get_data_block_size_index(BLOCK_SIZE); + + sdio_.set_data_state_machine_and_send(Data_Timeout, total_bytes_, block_size, + Transfer_Mode::BLOCK, Transfer_Direction::CARD_TO_SDIO, true); + + // CMD17/CMD18 (READ_SINGLE_BLOCK/READ_MULTIPLE_BLOCKS) send read command + Command_Index read_cmd = (count > 1U) ? Command_Index::CMD18 : Command_Index::CMD17; + if (send_command_and_check(read_cmd, address, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = read_cmd]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + current_state_ = Operational_State::READY; + return (count > 1U) ? SDIO_Error_Type::CMD18_FAILED : SDIO_Error_Type::CMD17_FAILED; + } + return SDIO_Error_Type::OK; + } else { + return SDIO_Error_Type::BUSY; + } +} + +SDIO_Error_Type CardDMA::write(uint8_t* buf, uint32_t address, uint32_t count) { + // Enable the interrupts + sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::STBITEIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::TXUREIE, true); + + if (card_type_ != Card_Type::SDCARD_HIGH_CAPACITY) { + address *= 512U; + } + + // CMD16 + if (send_command_and_check(Command_Index::CMD16, BLOCK_SIZE, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + return SDIO_Error_Type::CMD16_FAILED; + } + + // CMD25/CMD24 (WRITE_MULTIPLE_BLOCK/WRITE_BLOCK) send write command + Command_Index write_cmd = (count > 1U) ? Command_Index::CMD25 : Command_Index::CMD24; + if (send_command_and_check(write_cmd, address, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = write_cmd]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + return (count > 1U) ? SDIO_Error_Type::CMD25_FAILED : SDIO_Error_Type::CMD24_FAILED; + } + + total_bytes_ = BLOCK_SIZE * count; + // Start DMA transfer + set_dma_parameters(buf, (total_bytes_ / 4U), true); + sdio_.set_dma_enable(true); + + sdio_.clear_data_state_machine(Transfer_Direction::SDIO_TO_CARD); + Block_Size block_size = get_data_block_size_index(total_bytes_); + + sdio_.set_data_state_machine_and_send(Data_Timeout, total_bytes_, block_size, + Transfer_Mode::BLOCK, Transfer_Direction::SDIO_TO_CARD, true); + + while ((dma_.get_flag(dma::Status_Flags::FLAG_FTFIF)) || (dma_.get_flag(dma::Status_Flags::FLAG_ERRIF))) { + // Wait for the IRQ handler to clear + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::erase(uint32_t address_start, uint32_t address_end) { + SDIO_Error_Type result = SDIO_Error_Type::OK; + + // Card command classes CSD + uint8_t temp_byte = static_cast((sdcard_csd_[1] & (0xFFU << 24U)) >> 24U); + uint16_t classes = static_cast(temp_byte << 4U); + temp_byte = static_cast((sdcard_csd_[1] & (0xFFU << 16U)) >> 16U); + classes |= static_cast((temp_byte & 0xF0U) >> 4U); + + if ((classes & (1U << static_cast(Card_Command_Class::ERASE))) == Clear) { + return SDIO_Error_Type::UNSUPPORTED_FUNCTION; + } + + uint32_t delay_time = 120000U / sdio_.get_clock_divider(); + + if (sdio_.get_response(Response_Type::RESPONSE0) & Card_Locked) { + return SDIO_Error_Type::LOCK_UNLOCK_FAILED; + } + + // Size is fixed at 512 bytes for SDHC + if (card_type_ != Card_Type::SDCARD_HIGH_CAPACITY) { + address_start *= 512U; + address_end *= 512U; + } + + if ((card_type_ == Card_Type::SDCARD_STANDARD_CAPACITY) || (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY)) { + // CMD32 (ERASE_WR_BLK_START) + if (send_command_and_check(Command_Index::CMD32, address_start, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD32]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD32_FAILED; + } + // CMD33 (ERASE_WR_BLK_END) + if (send_command_and_check(Command_Index::CMD33, address_end, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD33]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD33_FAILED; + } + } + + // CMD38 (ERASE) + if (send_command_and_check(Command_Index::CMD38, 0U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD38]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD38_FAILED; + } + + // Loop until the counter reaches the calculated time + for (uint32_t count = 0U; count < delay_time; count++) {} + + Card_State card_state; + result = get_card_state(&card_state); + while ((result == SDIO_Error_Type::OK) && ((card_state == Card_State::PROGRAMMING) || (card_state == Card_State::RECEIVE_DATA))) { + result = get_card_state(&card_state); + } + + return result; +} + +void CardDMA::handle_interrupts() { + transfer_error_ = SDIO_Error_Type::OK; + + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTEND)) { + sdio_.clear_interrupt_flag(Clear_Flags::FLAG_DTENDC); + // Disable all interrupts + disable_all_interrupts(); + sdio_.set_data_state_machine_enable(false); + + if ((multiblock_) && (!is_rx_)) { + transfer_error_ = stop_transfer(); + if (transfer_error_ != SDIO_Error_Type::OK) {} + } + + if (!is_rx_) { + sdio_.set_dma_enable(false); + current_state_ = Operational_State::READY; + } + } else if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTCRCERR) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTTMOUT) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_STBITE) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_TXURE) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_RXORE)) { + + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTCRCERR)) { + transfer_error_ = SDIO_Error_Type::DATA_CRC_ERROR; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTTMOUT)) { + transfer_error_ = SDIO_Error_Type::DATA_TIMEOUT; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_STBITE)) { + transfer_error_ = SDIO_Error_Type::START_BIT_ERROR; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_TXURE)) { + transfer_error_ = SDIO_Error_Type::TX_FIFO_UNDERRUN; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_RXORE)) { + transfer_error_ = SDIO_Error_Type::RX_FIFO_OVERRUN; + } + sdio_.clear_multiple_interrupt_flags(clear_data_flags); + sdio_.clear_interrupt_flag(Clear_Flags::FLAG_STBITEC); + disable_all_interrupts(); + + dma_.set_transfer_abandon(); + } +} + +SDIO_Error_Type CardDMA::select_deselect() { + // CMD7 (SELECT/DESELECT_CARD) + if (send_command_and_check(Command_Index::CMD7, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD7]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD7_FAILED; + } + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_card_interface_status(uint32_t* status) { + if (status == nullptr) return SDIO_Error_Type::INVALID_PARAMETER; + + // CMD13 (SEND_STATUS) + if (send_command_and_check(Command_Index::CMD13, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD13_FAILED; + } + + *status = sdio_.get_response(Response_Type::RESPONSE0); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_sdcard_status(uint32_t* status) { + uint32_t count = 0U; + + // CMD16 (SET_BLOCKLEN) + if (send_command_and_check(Command_Index::CMD16, 64U, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD16_FAILED; + } + + // CMD55 (APP_CMD) + if (send_command_and_check(Command_Index::CMD55, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + sdio_.set_data_state_machine_and_send(Data_Timeout, 64U, Block_Size::BYTES_64, Transfer_Mode::BLOCK, Transfer_Direction::CARD_TO_SDIO, true); + + // ACMD13 (SD_STATUS) + if (send_command_and_check(Command_Index::ACMD13, 0U, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD13_FAILED; + } + + while (!sdio_.check_scr_flags()) { + if (sdio_.get_flag(Status_Flags::FLAG_RFH)) { + for (count = 0U; count < FIFO_Half_Words; count++) { + *(status + count) = sdio_.read_fifo_word(); + } + status += FIFO_Half_Words; + } + + //SDIO_Error_Type result = SDIO_Error_Type::OK; + if (sdio_.get_flag(Status_Flags::FLAG_DTCRCERR)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTCRCERRC); + return SDIO_Error_Type::DATA_CRC_ERROR; + } else if (sdio_.get_flag(Status_Flags::FLAG_DTTMOUT)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTTMOUTC); + return SDIO_Error_Type::DATA_TIMEOUT; + } else if (sdio_.get_flag(Status_Flags::FLAG_RXORE)) { + sdio_.clear_flag(Clear_Flags::FLAG_RXOREC); + return SDIO_Error_Type::RX_FIFO_OVERRUN; + } else if (sdio_.get_flag(Status_Flags::FLAG_STBITE)) { + sdio_.clear_flag(Clear_Flags::FLAG_STBITEC); + return SDIO_Error_Type::START_BIT_ERROR; + } + while (sdio_.get_flag(Status_Flags::FLAG_RXDTVAL)) { + *status = sdio_.read_fifo_word(); + ++status; + } + + sdio_.clear_multiple_interrupt_flags(clear_data_flags); + status -= 16U; + for (count = 0U; count < 16U; count++) { + status[count] = ((status[count] & 0xFFU) << 24U) | + ((status[count] & (0xFFU << 8U)) << 8U) | + ((status[count] & (0xFFU << 16U)) >> 8U) | + ((status[count] & (0xFFU << 24U)) >> 24U); + } + } + + return SDIO_Error_Type::OK; +} + +void CardDMA::check_dma_complete() { + while ((dma_.get_flag(dma::Status_Flags::FLAG_FTFIF)) || (dma_.get_flag(dma::Status_Flags::FLAG_ERRIF))) { + // Wait for the IRQ handler to clear + } +} + +SDIO_Error_Type CardDMA::stop_transfer() { + // CMD12 (STOP_TRANSMISSION) + if (send_command_and_check(Command_Index::CMD12, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD12]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD12_FAILED; + } + return SDIO_Error_Type::OK; +} + +Transfer_State CardDMA::get_transfer_state() { + Transfer_State transfer_state = Transfer_State::IDLE; + if (sdio_.get_flag(Status_Flags::FLAG_TXRUN) | sdio_.get_flag(Status_Flags::FLAG_RXRUN)) { + transfer_state = Transfer_State::BUSY; + } + + return transfer_state; +} + +uint32_t CardDMA::get_card_capacity() const { + auto extract_bits = [](uint32_t value, uint8_t start_bit, uint8_t length) -> uint32_t { + return (value >> start_bit) & ((1U << length) - 1U); + }; + + uint32_t capacity = 0U; + uint32_t device_size = 0U; + + if (card_type_ == Card_Type::SDCARD_STANDARD_CAPACITY) { + // Extract fields from CSD data using bit manipulation + uint8_t device_size_high = static_cast(extract_bits(sdcard_csd_[1], 8U, 2U)); // Bits [73:72] + uint8_t device_size_mid = static_cast(extract_bits(sdcard_csd_[1], 0U, 8U)); // Bits [71:64] + uint8_t device_size_low = static_cast(extract_bits(sdcard_csd_[2], 24U, 2U)); // Bits [63:62] + + device_size = static_cast((device_size_high) << 10U) | + static_cast((device_size_mid) << 2U) | + static_cast((device_size_low)); + + uint8_t device_size_multiplier_high = static_cast(extract_bits(sdcard_csd_[2], 16U, 2U)); // Bits [49:48] + uint8_t device_size_multiplier_low = static_cast(extract_bits(sdcard_csd_[2], 8U, 1U)); // Bit [47] + uint8_t device_size_multiplier = static_cast((device_size_multiplier_high << 1U) | device_size_multiplier_low); + uint8_t read_block_length = static_cast(extract_bits(sdcard_csd_[1], 16U, 4U)); // Bits [83:80] + + // Capacity = (device_size + 1) * MULT * BLOCK_LEN + uint32_t mult = static_cast(1U << (device_size_multiplier + 2U)); // MULT = 2 ^ (C_SIZE_MULT + 2) + uint32_t block_length = static_cast(1U << read_block_length); // BLOCK_LEN = 2 ^ READ_BL_LEN + + capacity = (device_size + 1U) * mult * block_length; + capacity /= KILOBYTE; // Convert capacity to kilobytes + + } else if (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY) { + // High-capacity card calculation + uint8_t device_size_high = static_cast(extract_bits(sdcard_csd_[1], 0U, 6U)); // Bits [69:64] + uint8_t device_size_mid = static_cast(extract_bits(sdcard_csd_[2], 24U, 8U)); // Bits [55:48] + uint8_t device_size_low = static_cast(extract_bits(sdcard_csd_[2], 16U, 8U)); // Bits [47:40] + + device_size = static_cast((device_size_high) << 16U) | + static_cast((device_size_mid) << 8U) | + static_cast(device_size_low); + + // Capacity in kilobytes + capacity = (device_size + 1U) * BLOCK_SIZE; + } + + return capacity; +} + +SDIO_Error_Type CardDMA::get_card_specific_data(Card_Info* info) { + if (info == nullptr) return SDIO_Error_Type::INVALID_PARAMETER; + + // Store basic card information + info->type = card_type_; + info->relative_address = sdcard_rca_; + + // Helper function to convert 32-bit registers to byte array + auto convert_registers_to_bytes = [](const uint32_t* registers, uint8_t* bytes, size_t reg_count) { + for (size_t i = 0U; i < reg_count; ++i) { + for (size_t j = 0U; j < 4U; ++j) { + bytes[i * 4U + j] = (registers[i] >> (24U - j * 8U)) & 0xFFU; + } + } + }; + + // Process CID data + uint8_t cid_bytes[16]; + convert_registers_to_bytes(sdcard_cid_, cid_bytes, 4); + + info->cid = { + .manufacture_id = cid_bytes[0], + .oem_id = static_cast( + (cid_bytes[1] << 8U) | + cid_bytes[2] + ), + .name0 = static_cast( + (cid_bytes[3] << 24U) | + (cid_bytes[4] << 16U) | + (cid_bytes[5] << 8U) | + cid_bytes[6] + ), + .name1 = cid_bytes[7], + .revision = cid_bytes[8], + .serial_number = static_cast( + (cid_bytes[9] << 24U) | + (cid_bytes[10] << 16U) | + (cid_bytes[11] << 8U) | + cid_bytes[12] + ), + .manufacture_date = static_cast( + ((cid_bytes[13] & 0x0FU) << 8U) | + cid_bytes[14] + ), + .checksum = static_cast(((cid_bytes[15] & 0xFEU) >> 1U)) + }; + + // Process CSD data + uint8_t csd_bytes[16]; + convert_registers_to_bytes(sdcard_csd_, csd_bytes, 4U); + + // Fill common CSD fields + info->csd = { + .transfer_speed = csd_bytes[3], + .card_command_class = static_cast((csd_bytes[4] << 4U) | ((csd_bytes[5] & 0xF0U) >> 4U)), + }; + + // Process card-type specific CSD fields and calculate capacity + if (card_type_ == Card_Type::SDCARD_STANDARD_CAPACITY) { + process_sdsc_specific_csd(info, csd_bytes); + } else if (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY) { + process_sdhc_specific_csd(info, csd_bytes); + } + + // Fill remaining common CSD fields + process_common_csd_tail(info, csd_bytes); + + return SDIO_Error_Type::OK; +} + +constexpr Block_Size CardDMA::get_data_block_size_index(uint16_t size) { + switch (size) { + case 1: return Block_Size::BYTES_1; + case 2: return Block_Size::BYTES_2; + case 4: return Block_Size::BYTES_4; + case 8: return Block_Size::BYTES_8; + case 16: return Block_Size::BYTES_16; + case 32: return Block_Size::BYTES_32; + case 64: return Block_Size::BYTES_64; + case 128: return Block_Size::BYTES_128; + case 256: return Block_Size::BYTES_256; + case 512: return Block_Size::BYTES_512; + case 1024: return Block_Size::BYTES_1024; + case 2048: return Block_Size::BYTES_2048; + case 4096: return Block_Size::BYTES_4096; + case 8192: return Block_Size::BYTES_8192; + case 16384: return Block_Size::BYTES_16384; + default: return Block_Size::BYTES_1; + } +} + +SDIO_Error_Type CardDMA::get_card_state(Card_State* card_state) { + // CMD13 (SEND_STATUS) + if (send_command_and_check(Command_Index::CMD13, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD13_FAILED; + } + + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + *card_state = static_cast((response >> 9U) & CardStateMask); + if ((response & All_R1_Error_Bits) == 0U) { + return SDIO_Error_Type::OK; + } + + if (response & All_R1_Error_Bits) { + for (const auto& entry : errorTableR1) { + if (response & entry.mask) { + return entry.errorType; + } + } + return SDIO_Error_Type::ERROR; + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_command_sent_result() { + volatile uint32_t timeout = 0x00FFFFFFU; + + while ((sdio_.get_flag(Status_Flags::FLAG_CMDSEND) == false) && (timeout != 0U)) { + timeout = timeout - 1U; + } + if (timeout == 0U) return SDIO_Error_Type::RESPONSE_TIMEOUT; + sdio_.clear_multiple_interrupt_flags(clear_command_flags); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::check_sdio_status(Command_Index index, bool check_index, bool ignore_crc) { + // Wait until one of the relevant flags is set + bool flag_set = sdio_.wait_cmd_flags(); + + if (!flag_set) { + return SDIO_Error_Type::RESPONSE_TIMEOUT; + } + + // Check the cmd received bit first, since noise can sometimes + // cause the timeout bit to get erroneously set + // If cmd was received we can safely ignore other checks + if (sdio_.get_flag(Status_Flags::FLAG_CMDRECV)) { + // If cmd was received, check the index + // Responses that dont do an index check will send an invalid cmd index + if (check_index && (index != Command_Index::INVALID)) { + uint8_t idx = sdio_.get_command_index(); + if (idx != static_cast(index)) { + return SDIO_Error_Type::ILLEGAL_COMMAND; + } + } + // Clear all flags before returning + sdio_.clear_multiple_interrupt_flags(clear_command_flags); + return SDIO_Error_Type::OK; + } + + // Timeout check + if (sdio_.get_flag(Status_Flags::FLAG_CMDTMOUT)) { + sdio_.clear_flag(Clear_Flags::FLAG_CMDTMOUTC); + return SDIO_Error_Type::RESPONSE_TIMEOUT; + } + + // CRC check + if (!ignore_crc) { + if (sdio_.get_flag(Status_Flags::FLAG_CCRCERR)) { + sdio_.clear_flag(Clear_Flags::FLAG_CCRCERRC); + return SDIO_Error_Type::COMMAND_CRC_ERROR; + } + } + + // Responses that dont do an index check will send an invalid cmd index + if (check_index && (index != Command_Index::INVALID)) { + uint8_t idx = sdio_.get_command_index(); + if (idx != static_cast(index)) { + return SDIO_Error_Type::ILLEGAL_COMMAND; + } + } + + // Clear all flags before returning + sdio_.clear_multiple_interrupt_flags(clear_command_flags); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_r1_result(Command_Index index) { + SDIO_Error_Type result = check_sdio_status(index, true, false); + if (result != SDIO_Error_Type::OK) { + return result; + } + + // Get the R1 response and check for errors + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + + if (response & All_R1_Error_Bits) { + for (const auto& entry : errorTableR1) { + if (response & entry.mask) { + return entry.errorType; + } + } + return SDIO_Error_Type::ERROR; + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_r6_result(Command_Index index, uint16_t* rca) { + SDIO_Error_Type result = check_sdio_status(index, true, false); + if (result != SDIO_Error_Type::OK) return result; + + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + + if (response & R6_Error_Bits) { + for (const auto& entry : errorTableR6) { + if (response & entry.mask) { + return entry.errorType; + } + } + return SDIO_Error_Type::ERROR; + } + *rca = static_cast(response >> 16U); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_r7_result() { + return check_sdio_status(Command_Index::INVALID, false, false); +} + +SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) { + uint32_t temp_scr[2] = {0U, 0U}; + uint32_t index_scr = 0U; + uint32_t* src_data = scr; + + // CMD16 (SET_BLOCKLEN) + if (send_command_and_check(Command_Index::CMD16, 8U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD16_FAILED; + } + + // CMD55 (APP_CMD) + if (send_command_and_check(Command_Index::CMD55, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + // Set data parameters + sdio_.set_data_state_machine_and_send(Data_Timeout, 8U, Block_Size::BYTES_8, + Transfer_Mode::BLOCK, Transfer_Direction::CARD_TO_SDIO, true); + + // ACMD51 (SEND_SCR) + if (send_command_and_check(Command_Index::ACMD51, 0U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD51]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD51_FAILED; + } + + // Store SCR + while (!sdio_.check_scr_flags()) { + if (sdio_.get_flag(Status_Flags::FLAG_RXDTVAL)) { + *(temp_scr + index_scr) = sdio_.read_fifo_word(); + ++index_scr; + } + } + + if (sdio_.get_flag(Status_Flags::FLAG_DTTMOUT)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTTMOUTC); + return SDIO_Error_Type::DATA_TIMEOUT; + } else if (sdio_.get_flag(Status_Flags::FLAG_DTCRCERR)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTCRCERRC); + return SDIO_Error_Type::DATA_CRC_ERROR; + } else if (sdio_.get_flag(Status_Flags::FLAG_RXORE)) { + sdio_.clear_flag(Clear_Flags::FLAG_RXOREC); + return SDIO_Error_Type::RX_FIFO_OVERRUN; + } + + sdio_.clear_multiple_interrupt_flags(clear_data_flags); + + constexpr uint32_t Zero_Seven = (0xFFU << 0U); + constexpr uint32_t Eight_Fifteen = (0xFFU << 8U); + constexpr uint32_t Sixteen_Twentythree = (0xFFU << 16U); + constexpr uint32_t TwentyFour_Thirtyone = (0xFFU << 24U); + + // adjust SCR value + *src_data = ((temp_scr[1] & Zero_Seven) << 24U) | ((temp_scr[1] & Eight_Fifteen) << 8U) | + ((temp_scr[1] & Sixteen_Twentythree) >> 8U) | ((temp_scr[1] & TwentyFour_Thirtyone) >> 24U); + + src_data = src_data + 1U; + *src_data = ((temp_scr[0] & Zero_Seven) << 24U) | ((temp_scr[0] & Eight_Fifteen) << 8U) | + ((temp_scr[0] & Sixteen_Twentythree) >> 8U) | ((temp_scr[0] & TwentyFour_Thirtyone) >> 24U); + + return SDIO_Error_Type::OK; +} + +// DMA for rx/tx is always DMA1 channel 3 +void CardDMA::set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write) { + constexpr uint32_t flag_bits = (1U << static_cast(dma::INTF_Bits::GIF3)); + + dma_.clear_flags(flag_bits); + + // Disable and reset DMA + dma_.set_channel_enable(false); + dma_.clear_channel(); + + dma_.init({ + count, + static_cast(reinterpret_cast(buf)), + static_cast(reinterpret_cast(sdio_.reg_address(SDIO_Regs::FIFO))), + dma::Bit_Width::WIDTH_32BIT, + dma::Bit_Width::WIDTH_32BIT, + dma::Increase_Mode::INCREASE_DISABLE, + dma::Increase_Mode::INCREASE_ENABLE, + dma::Channel_Priority::MEDIUM_PRIORITY, + is_write ? dma::Transfer_Direction::M2P : dma::Transfer_Direction::P2M + }); + + dma_.set_memory_to_memory_enable(false); + dma_.set_circulation_mode_enable(false); + + // Enable DMA interrupts for transfer complete and error + dma_.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, true); + dma_.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, true); + + // Start the DMA channel + dma_.set_channel_enable(true); +} + +SDIO_Error_Type CardDMA::wait_for_card_ready() { + volatile uint32_t timeout = 0x00FFFFFFU; + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + + while (((response & static_cast(R1_Status::READY_FOR_DATA)) == 0U) && (timeout != 0U)) { + // Continue to send CMD13 to poll the state of card until buffer empty or timeout + timeout = timeout - 1U; + // CMD13 (SEND_STATUS) + if (send_command_and_check(Command_Index::CMD13, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD13_FAILED; + } + response = sdio_.get_response(Response_Type::RESPONSE0); + } + + return (timeout == 0U) ? SDIO_Error_Type::ERROR : SDIO_Error_Type::OK; +} + +} // namespace sdio + +sdio::CardDMA& CardDMA_I = sdio::CardDMA::get_instance(); + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/SDCard.h b/Marlin/src/HAL/GD32_MFL/SDCard.h new file mode 100644 index 0000000000..b14063b69f --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/SDCard.h @@ -0,0 +1,214 @@ +// +// MFL gd32f30x SDCARD using DMA through SDIO in C++ +// +// Copyright (C) 2025 B. Mourit +// +// This software is free software: you can redistribute it and/or modify it under the terms of the +// GNU Lesser General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along with this software. +// If not, see . +// +#pragma once + +#include "../../inc/MarlinConfig.h" + +#include "SDIO.hpp" + +namespace sdio { + +class DMA; + +class CardDMA { +public: + static CardDMA& get_instance(); + + SDIO_Error_Type init(); + SDIO_Error_Type card_init(); + SDIO_Error_Type begin_startup_procedure(); + void begin_shutdown_procedure(); + // Configuration + SDIO_Error_Type set_hardware_bus_width(Bus_Width width); + // Main read/write functions for single and multiblock transfers + SDIO_Error_Type read(uint8_t* buf, uint32_t address, uint32_t count); + SDIO_Error_Type write(uint8_t* buf, uint32_t address, uint32_t count); + // DMA transfers + // Other card functions + SDIO_Error_Type erase(uint32_t address_start, uint32_t address_end); + // Interrupt handler + void handle_interrupts(); + // Card select + SDIO_Error_Type select_deselect(); + + SDIO_Error_Type get_card_interface_status(uint32_t* status); + SDIO_Error_Type get_sdcard_status(uint32_t* status); + + void check_dma_complete(); + SDIO_Error_Type stop_transfer(); + + Transfer_State get_transfer_state(); + uint32_t get_card_capacity() const; + + SDIO_Error_Type send_bus_width_command(uint32_t width_value); + + SDIO_Error_Type get_card_specific_data(Card_Info* info); + constexpr Block_Size get_data_block_size_index(uint16_t size); + + SDIO_Error_Type get_card_state(Card_State* card_state); + SDIO_Error_Type check_sdio_status(Command_Index index = Command_Index::INVALID, bool check_index = false, bool ignore_crc = false); + + // DMA configuration + void set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write); + + // SDIO configuration + void sdio_configure(const SDIO_Config config) { sdio_.init(config); } + + // Varaible stored parameters + SDIO_Error_Type get_scr(uint16_t rca, uint32_t* scr); + SDIO_Error_Type store_cid(); + SDIO_Error_Type store_csd(); + + // Accessor methods + SDIO_Config& get_config() { return config_; } + dma::DMA& get_dma_instance() { return dma_; } + void set_data_end_interrupt() { sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, true); } + void set_sdio_dma_enable(bool enable) { sdio_.set_dma_enable(enable); } + bool get_is_sdio_rx() { return is_rx_; } + void clear_sdio_data_flags() { sdio_.clear_multiple_interrupt_flags(clear_data_flags); } + void clear_sdio_cmd_flags() { sdio_.clear_multiple_interrupt_flags(clear_command_flags); } + void clear_sdio_common_flags() { sdio_.clear_multiple_interrupt_flags(clear_common_flags); } + Operational_State get_state() { return current_state_; } + void set_state(Operational_State state) { current_state_ = state; } + void set_transfer_end(bool value) { transfer_end_ = value; } + void set_transfer_error(SDIO_Error_Type error) { transfer_error_ = error; } + + inline SDIO_Error_Type set_desired_clock(uint32_t desired_clock, bool wide_bus, bool low_power) { + sdio_.init({ + desired_clock, + Clock_Edge::RISING_EDGE, + wide_bus ? Bus_Width::WIDTH_4BIT : Bus_Width::WIDTH_1BIT, + false, + low_power, + false + }); + sync_domains(); + desired_clock_ = desired_clock; + + return SDIO_Error_Type::OK; + } + +private: + CardDMA(); + + // Prevent copying or assigning + CardDMA(const CardDMA&) = delete; + CardDMA& operator=(const CardDMA&) = delete; + + // Helper function + SDIO_Error_Type wait_for_card_ready(); + + // Member variables + alignas(4) uint32_t sdcard_csd_[4]; + alignas(4) uint32_t sdcard_cid_[4]; + alignas(4) uint32_t sdcard_scr_[2]; + uint32_t desired_clock_; + uint32_t stop_condition_; + uint32_t total_bytes_; + uint32_t count_; + SDIO& sdio_; + SDIO_Config& config_; + const dma::DMA_Base dmaBase_; + const dma::DMA_Channel dmaChannel_; + dma::DMA& dma_; + uint16_t sdcard_rca_; + SDIO_Error_Type transfer_error_; + Interface_Version interface_version_; + Card_Type card_type_; + volatile bool transfer_end_; + volatile bool is_rx_; + volatile bool multiblock_; + volatile Operational_State current_state_; + + // Private helper methods + SDIO_Error_Type validate_voltage(); + SDIO_Error_Type get_r1_result(Command_Index index); + //SDIO_Error_Type get_r2_r3_result(); + SDIO_Error_Type get_r6_result(Command_Index index, uint16_t* rca); + SDIO_Error_Type get_r7_result(); + //SDIO_Error_Type get_r1_error_type(uint32_t response); + SDIO_Error_Type get_command_sent_result(); + + inline void sync_domains() { + delayMicroseconds(8); + } + + inline bool validate_transfer_params(uint32_t* buf, uint16_t size) { + if (buf == nullptr) return false; + // Size must be > 0, <= 2048 and power of 2 + if ((size == 0U) || (size > 2048U) || (size & (size - 1U))) { + return false; + } + return true; + } + + void process_sdsc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) { + info->csd.device_size = (static_cast(csd_bytes[6] & 0x03U) << 10U) | + (static_cast(csd_bytes[7]) << 2U) | + (static_cast((csd_bytes[8] & 0xC0U) >> 6U)); + info->csd.device_size_multiplier = static_cast((csd_bytes[9] & 0x03U) << 1U | + (csd_bytes[10] & 0x80U) >> 7U); + + info->block_size = static_cast(1 << info->csd.read_block_length); + info->capacity = static_cast((info->csd.device_size + 1U) * + (1U << (info->csd.device_size_multiplier + 2U)) * + info->block_size); + } + + void process_sdhc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) { + info->csd.device_size = static_cast((csd_bytes[7] & 0x3FU) << 16U) | + static_cast((csd_bytes[8]) << 8U) | + static_cast(csd_bytes[9]); + + info->block_size = BLOCK_SIZE; + info->capacity = static_cast((info->csd.device_size + 1U) * + BLOCK_SIZE * KILOBYTE); + } + + void process_common_csd_tail(Card_Info* info, const uint8_t* csd_bytes) { + info->csd.sector_size = static_cast(((csd_bytes[9] & 0x3FU) << 1U) | + (csd_bytes[10] & 0x80U) >> 7U); + info->csd.speed_factor = static_cast((csd_bytes[11] & 0x1CU) >> 2U); + info->csd.write_block_length = static_cast(((csd_bytes[11] & 0x03U) << 2U) | + ((csd_bytes[12] & 0xC0U) >> 6U)); + info->csd.checksum = static_cast((csd_bytes[15] & 0xFEU) >> 1U); + } + + inline void disable_all_interrupts() { + sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::STBITEIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::TFHIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::RFHIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::TXUREIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::RXOREIE, false); + } + + template + inline SDIO_Error_Type send_command_and_check(Command_Index command, uint32_t argument, + Command_Response response, Wait_Type type, CheckFunc check_result) { + sdio_.set_command_state_machine(command, argument, response, type); + sync_domains(); + sdio_.set_command_state_machine_enable(true); + return check_result(); + } +}; + +} // namespace sdio + +extern sdio::CardDMA& CardDMA_I; diff --git a/Marlin/src/HAL/GD32_MFL/Servo.cpp b/Marlin/src/HAL/GD32_MFL/Servo.cpp new file mode 100644 index 0000000000..d5f8533544 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/Servo.cpp @@ -0,0 +1,122 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "Servo.h" + +static uint_fast8_t servoCount = 0; +static libServo* servos[NUM_SERVOS] = {0}; +constexpr millis_t servoDelay[] = SERVO_DELAY; +static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + +// Initialize to the default timer priority. This will be overridden by a call from timers.cpp. +// This allows all timer interrupt priorities to be managed from a single location in the HAL. +static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 12, 0); + +// This must be called after the MFL Servo class has initialized the timer. +// To be safe this is currently called after every call to attach(). +static void fixServoTimerInterruptPriority() { + NVIC_SetPriority(getTimerUpIRQ(TIMER_SERVO), servo_interrupt_priority); +} + +// Default constructor for libServo class. +// Initializes the servo delay, pause state, and pause value. +// Registers the servo instance in the servos array. +libServo::libServo() : delay(servoDelay[servoCount]), + was_attached_before_pause(false), + value_before_pause(0) { + servos[servoCount++] = this; +} + +// Attaches a servo to a specified pin. +int8_t libServo::attach(const int pin) { + if (servoCount >= MAX_SERVOS) return -1; + if (pin > 0) servo_pin = pin; + auto result = mflServo.attach(servo_pin); + fixServoTimerInterruptPriority(); + return result; +} + +// Attaches a servo to a specified pin with minimum and maximum pulse widths. +int8_t libServo::attach(const int pin, const int min, const int max) { + if (servoCount >= MAX_SERVOS) return -1; + if (pin > 0) servo_pin = pin; + auto result = mflServo.attach(servo_pin, min, max); + fixServoTimerInterruptPriority(); + return result; +} + +// Moves the servo to a specified position. +void libServo::move(const int value) { + if (attach(0) >= 0) { + mflServo.write(value); + safe_delay(delay); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} + +// Pause the servo by detaching it and storing its current state. +void libServo::pause() { + was_attached_before_pause = mflServo.attached(); + if (was_attached_before_pause) { + value_before_pause = mflServo.read(); + mflServo.detach(); + } +} + +// Resume a previously paused servo. +// If the servo was attached before the pause, this function re-attaches +// the servo and moves it to the position it was in before the pause. +void libServo::resume() { + if (was_attached_before_pause) { + attach(); + move(value_before_pause); + } +} + +// Pause all servos by stopping their timers. +void libServo::pause_all_servos() { + for (auto& servo : servos) + if (servo) servo->pause(); +} + +// Resume all paused servos by starting their timers. +void libServo::resume_all_servos() { + for (auto& servo : servos) + if (servo) servo->resume(); +} + +// Set the interrupt priority for the servo. +// @param preemptPriority The preempt priority level. +// @param subPriority The sub priority level. +void libServo::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) { + servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority); +} + +#endif // HAS_SERVOS +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/Servo.h b/Marlin/src/HAL/GD32_MFL/Servo.h new file mode 100644 index 0000000000..80cff46ff8 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/Servo.h @@ -0,0 +1,56 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include + +#include "../../core/millis_t.h" + +// Inherit and expand on the official library +class libServo { +public: + libServo(); + + int8_t attach(const int pin = 0); // pin == 0 uses value from previous call + int8_t attach(const int pin, const int min, const int max); + void detach() { mflServo.detach(); } + + int read() { return mflServo.read(); } + void move(const int value); + + void pause(); + void resume(); + + static void pause_all_servos(); + static void resume_all_servos(); + + static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); + +private: + Servo mflServo; + + int servoPin = 0; + millis_t delay = 0; + + bool was_attached_before_pause; + int value_before_pause; +}; diff --git a/Marlin/src/HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp b/Marlin/src/HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp new file mode 100644 index 0000000000..b36cbfe44d --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp @@ -0,0 +1,129 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm / Ryan Power + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef ARDUINO_ARCH_MFL + +#include "../../../inc/MarlinConfig.h" + +#if ALL(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) + +#include +#include "../../shared/HAL_SPI.h" + +#define nop asm volatile ("\tnop\n") + +static inline uint8_t swSpiTransfer_mode_0(uint8_t b) { + for (uint8_t i = 0; i < 8; ++i) { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + WRITE(DOGLCD_SCK, HIGH); + WRITE(DOGLCD_MOSI, state); + b <<= 1; + WRITE(DOGLCD_SCK, LOW); + } + return b; +} + +static inline uint8_t swSpiTransfer_mode_3(uint8_t b) { + for (uint8_t i = 0; i < 8; ++i) { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + WRITE(DOGLCD_SCK, LOW); + WRITE(DOGLCD_MOSI, state); + b <<= 1; + WRITE(DOGLCD_SCK, HIGH); + } + return b; +} + +static void u8g_sw_spi_shift_out(uint8_t val) { + #if U8G_SPI_USE_MODE_3 + swSpiTransfer_mode_3(val); + #else + swSpiTransfer_mode_0(val); + #endif +} + +static void swSpiInit() { + #if PIN_EXISTS(LCD_RESET) + SET_OUTPUT(LCD_RESET_PIN); + #endif + SET_OUTPUT(DOGLCD_A0); + OUT_WRITE(DOGLCD_SCK, LOW); + OUT_WRITE(DOGLCD_MOSI, LOW); + OUT_WRITE(DOGLCD_CS, HIGH); +} + +uint8_t u8g_com_HAL_MFL_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + swSpiInit(); + break; + case U8G_COM_MSG_STOP: + break; + case U8G_COM_MSG_RESET: + #if PIN_EXISTS(LCD_RESET) + WRITE(LCD_RESET_PIN, arg_val); + #endif + break; + case U8G_COM_MSG_CHIP_SELECT: + #if U8G_SPI_USE_MODE_3 // This LCD SPI is running mode 3 while SD card is running mode 0 + if (arg_val) { // SCK idle state needs to be set to the proper idle state before + // the next chip select goes active + WRITE(DOGLCD_SCK, HIGH); // Set SCK to mode 3 idle state before CS goes active + WRITE(DOGLCD_CS, LOW); + nop; // Hold SCK high for a few ns + nop; + } + else { + WRITE(DOGLCD_CS, HIGH); + WRITE(DOGLCD_SCK, LOW); // Set SCK to mode 0 idle state after CS goes inactive + } + #else + WRITE(DOGLCD_CS, !arg_val); + #endif + break; + case U8G_COM_MSG_WRITE_BYTE: + u8g_sw_spi_shift_out(arg_val); + break; + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t* ptr = (uint8_t*)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_shift_out(*ptr++); + arg_val--; + } + } break; + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t* ptr = (uint8_t*)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_shift_out(u8g_pgm_read(ptr)); + ptr++; + arg_val--; + } + } break; + case U8G_COM_MSG_ADDRESS: // Define cmd (arg_val = 0) or data mode (arg_val = 1) + WRITE(DOGLCD_A0, arg_val); + break; + } + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB && FORCE_SOFT_SPI +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp b/Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp new file mode 100644 index 0000000000..2d3329c7f6 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp @@ -0,0 +1,93 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(IIC_BL24CXX_EEPROM) + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #error "MARLIN_EEPROM_SIZE is required for IIC_BL24CXX_EEPROM." +#endif + +size_t PersistentStore::capacity() { + return MARLIN_EEPROM_SIZE - eeprom_exclude_size; +} + +bool PersistentStore::access_start() { + eeprom_init(); + return true; +} + +bool PersistentStore::access_finish() { + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; + while (size--) { + uint8_t v = *value; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); + // EPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (++written & 0x7F) delay(4); else safe_delay(4); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); + return true; + } + } + + crc16(crc, &v, 1); + pos++; + value++; + } + + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + + return false; +} + +#endif // IIC_BL24CXX_EEPROM +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp b/Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp new file mode 100644 index 0000000000..96eebea122 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Platform-independent Arduino functions for I2C EEPROM. + * Enable USE_SHARED_EEPROM if not supplied by the framework. + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(IIC_BL24CXX_EEPROM) + +#include "../../libs/BL24CXX.h" +#include "../shared/eeprom_if.h" + +void eeprom_init() { + BL24CXX::init(); +} + +void eeprom_write_byte(uint8_t *pos, uint8_t value) { + const unsigned eeprom_address = (unsigned)pos; + return BL24CXX::writeOneByte(eeprom_address, value); +} + +uint8_t eeprom_read_byte(uint8_t *pos) { + const unsigned eeprom_address = (unsigned)pos; + return BL24CXX::readOneByte(eeprom_address); +} + +#endif // IIC_BL24CXX_EEPROM +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp b/Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp new file mode 100644 index 0000000000..58a6f85e7f --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp @@ -0,0 +1,96 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) +#endif + +size_t PersistentStore::capacity() { + return MARLIN_EEPROM_SIZE - eeprom_exclude_size; +} + +bool PersistentStore::access_start() { + eeprom_init(); + return true; +} + +bool PersistentStore::access_finish() { + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; + while (size--) { + uint8_t v = *value; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + // Avoid triggering watchdog during long EEPROM writes + if (++written & 0x7F) + delay(2); + else + safe_delay(2); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + } + + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); + if (writing) + *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/endstop_interrupts.h b/Marlin/src/HAL/GD32_MFL/endstop_interrupts.h new file mode 100644 index 0000000000..175dec3959 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/endstop_interrupts.h @@ -0,0 +1,61 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) + TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(USE_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN)); + TERN_(USE_CALIBRATION, _ATTACH(CALIBRATION_PIN)); + TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); + TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); + TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); + TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); + TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); + TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); + TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); + TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); + TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); + TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); + TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); + TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); +} diff --git a/Marlin/src/HAL/GD32_MFL/fast_pwm.cpp b/Marlin/src/HAL/GD32_MFL/fast_pwm.cpp new file mode 100644 index 0000000000..9fba673efc --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/fast_pwm.cpp @@ -0,0 +1,97 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#include +#include +#include "timers.h" + +static uint16_t timer_frequency[TIMER_COUNT]; + +void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t value, const uint16_t scale, const bool invert) { + // Calculate duty cycle based on inversion flag + const uint16_t duty = invert ? scale - value : value; + + // Check if the pin supports PWM + if (PWM_PIN(pin)) { + // Get the timer peripheral base associated with the pin + const auto timer_base = getPinOpsPeripheralBase(TIMER_PinOps, static_cast(pin)); + + // Initialize the timer instance + auto& TimerInstance = GeneralTimer::get_instance(timer_base); + + // Get channel and previous channel mode + const auto channel = getPackedPinChannel(getPackedPinOps(TIMER_PinOps, static_cast(pin))); + const InputOutputMode previous = TimerInstance.getChannelMode(channel); + + if (timer_frequency[static_cast(timer_base)] == 0) { + set_pwm_frequency(pin, PWM_FREQUENCY); + } + + // Set the PWM duty cycle + TimerInstance.setCaptureCompare(channel, duty, CCFormat::B8); + + // Configure pin as PWM output + pinOpsPinout(TIMER_PinOps, static_cast(pin)); + + // Set channel mode if not already set and start timer + if (previous != InputOutputMode::PWM0) { + TimerInstance.setChannelMode(channel, InputOutputMode::PWM0, static_cast(pin)); + TimerInstance.start(); + } + } else { + pinMode(pin, OUTPUT); + digitalWrite(pin, duty < scale / 2 ? LOW : HIGH); + } +} + +void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) { + // Check if the pin supports PWM + if (!PWM_PIN(pin)) return; + + // Get the timer peripheral base associated with the pin + const auto timer_base = getPinOpsPeripheralBase(TIMER_PinOps, static_cast(pin)); + + // Guard against modifying protected timers + #ifdef STEP_TIMER + if (timer_base == static_cast(STEP_TIMER)) return; + #endif + #ifdef TEMP_TIMER + if (timer_base == static_cast(TEMP_TIMER)) return; + #endif + #if defined(PULSE_TIMER) && MF_TIMER_PULSE != MF_TIMER_STEP + if (timer_base == static_cast(PULSE_TIMER)) return; + #endif + + // Initialize the timer instance + auto& TimerInstance = GeneralTimer::get_instance(timer_base); + + TimerInstance.setRolloverValue(f_desired, TimerFormat::HERTZ); + timer_frequency[timer_base_to_index(timer_base)] = f_desired; +} + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/fastio.h b/Marlin/src/HAL/GD32_MFL/fastio.h new file mode 100644 index 0000000000..8185be73a4 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/fastio.h @@ -0,0 +1,82 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// Fast I/O interfaces for GD32F303RE + +#include +#include +#include + +static inline void fast_write_pin_wrapper(pin_size_t IO, bool V) { + if (V) gpio::fast_set_pin(getPortFromPin(IO), getPinInPort(IO)); + else gpio::fast_clear_pin(getPortFromPin(IO), getPinInPort(IO)); +} + +static inline bool fast_read_pin_wrapper(pin_size_t IO) { + return gpio::fast_read_pin(getPortFromPin(IO), getPinInPort(IO)); +} + +static inline void fast_toggle_pin_wrapper(pin_size_t IO) { + gpio::fast_toggle_pin(getPortFromPin(IO), getPinInPort(IO)); +} + +// ------------------------ +// Defines +// ------------------------ + +#ifndef PWM + #define PWM OUTPUT +#endif + +#define _WRITE(IO, V) fast_write_pin_wrapper(IO, V) +#define _READ(IO) fast_read_pin_wrapper(IO) +#define _TOGGLE(IO) fast_toggle_pin_wrapper(IO) + +#define _GET_MODE(IO) +#define _SET_MODE(IO, M) pinMode((IO), (M)) +#define _SET_OUTPUT(IO) pinMode((IO), OUTPUT) +#define _SET_OUTPUT_OD(IO) pinMode((IO), OUTPUT_OPEN_DRAIN) + +#define WRITE(IO, V) _WRITE((IO), (V)) +#define READ(IO) _READ(IO) +#define TOGGLE(IO) _TOGGLE(IO) + +#define OUT_WRITE(IO, V) do { _SET_OUTPUT(IO); WRITE((IO), (V)); } while (0) +#define OUT_WRITE_OD(IO, V) do { _SET_OUTPUT_OD(IO); WRITE((IO), (V)); } while (0) + +#define SET_INPUT(IO) _SET_MODE((IO), INPUT) +#define SET_INPUT_PULLUP(IO) _SET_MODE((IO), INPUT_PULLUP) +#define SET_INPUT_PULLDOWN(IO) _SET_MODE((IO), INPUT_PULLDOWN) +#define SET_OUTPUT(IO) OUT_WRITE((IO), LOW) +#define SET_OUTPUT_OD(IO) OUT_WRITE_OD((IO), LOW) +#define SET_PWM(IO) _SET_MODE((IO), PWM) + +#define IS_INPUT(IO) +#define IS_OUTPUT(IO) + +#define PWM_PIN(P) isPinInPinOps(TIMER_PinOps, P) +#define NO_COMPILE_TIME_PWM + +// Wrappers for digitalRead and digitalWrite +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO, V) digitalWrite((IO), (V)) diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_LCD.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_LCD.h new file mode 100644 index 0000000000..379ecfa7f0 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if ALL(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) + #define U8G_SW_SPI_MFL 1 +#endif diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_adv.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_adv.h new file mode 100644 index 0000000000..6df84f6f92 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_adv.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if ALL(HAS_MEDIA, USBD_USE_CDC_MSC) + #define HAS_SD_HOST_DRIVE 1 +#endif diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_post.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_post.h new file mode 100644 index 0000000000..a3db122682 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_post.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// If no real or emulated EEPROM selected, fall back to SD emulation +#if USE_FALLBACK_EEPROM + #define SDCARD_EEPROM_EMULATION +#elif ANY(I2C_EEPROM, SPI_EEPROM) + #define USE_SHARED_EEPROM 1 +#endif diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_type.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_type.h new file mode 100644 index 0000000000..92cc457df5 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_type.h @@ -0,0 +1,22 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once diff --git a/Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h b/Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h new file mode 100644 index 0000000000..366765dcd5 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h @@ -0,0 +1,97 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// Test MFL GD32 specific configuration values for errors at compile-time. +#if ENABLED(SDCARD_EEPROM_EMULATION) && !HAS_MEDIA + #undef SDCARD_EEPROM_EMULATION // avoid additional error noise + #if USE_FALLBACK_EEPROM + #warning "EEPROM type not specified. Fallback is SDCARD_EEPROM_EMULATION." + #endif + #error "SDCARD_EEPROM_EMULATION requires SDSUPPORT. Enable SDSUPPORT or choose another EEPROM emulation." +#endif + +#if ENABLED(FLASH_EEPROM_LEVELING) + #error "FLASH_EEPROM_LEVELING is not supported on GD32." +#endif + +#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on GD32." +#elif ENABLED(SERIAL_STATS_DROPPED_RX) + #error "SERIAL_STATS_DROPPED_RX is not supported on GD32." +#endif + +#if TEMP_SENSOR_SOC && defined(ATEMP) && TEMP_SOC_PIN != ATEMP + #error "TEMP_SENSOR_SOC requires 'TEMP_SOC_PIN ATEMP' on GD32" +#endif + +// Check for common serial pin conflicts +#define _CHECK_SERIAL_PIN(N) (( \ + BTN_EN1 == N || BTN_EN2 == N || DOGLCD_CS == N || HEATER_BED_PIN == N || FAN0_PIN == N || \ + SDIO_D2_PIN == N || SDIO_D3_PIN == N || SDIO_CK_PIN == N || SDIO_CMD_PIN == N || \ + Y_STEP_PIN == N || Y_ENABLE_PIN == N || E0_ENABLE_PIN == N || POWER_LOSS_PIN == N \ + )) + +#define CHECK_SERIAL_PIN(T, N) defined(UART##N##_##T##_PIN) && _CHECK_SERIAL_PIN(UART##N##_##T##_PIN) + +#if SERIAL_IN_USE(0) + #if CHECK_SERIAL_PIN(TX, 0) + #error "Serial Port 0 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 0) + #error "Serial Port 0 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(1) + #if CHECK_SERIAL_PIN(TX, 1) + #error "Serial Port 1 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 1) + #error "Serial Port 1 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(2) + #if CHECK_SERIAL_PIN(TX, 2) + #error "Serial Port 2 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 2) + #error "Serial Port 2 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(3) + #if CHECK_SERIAL_PIN(TX, 3) + #error "Serial Port 3 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 3) + #error "Serial Port 3 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(4) + #if CHECK_SERIAL_PIN(TX, 4) + #error "Serial Port 4 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 4) + #error "Serial Port 4 RX IO pins conflict with another pin on the board." + #endif +#endif +#undef CHECK_SERIAL_PIN +#undef _CHECK_SERIAL_PIN diff --git a/Marlin/src/HAL/GD32_MFL/pinsDebug.h b/Marlin/src/HAL/GD32_MFL/pinsDebug.h new file mode 100644 index 0000000000..d3b3794df2 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/pinsDebug.h @@ -0,0 +1,102 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Pins Debugging for GD32 + * + * - NUMBER_PINS_TOTAL + * - MULTI_NAME_PAD + * - getPinByIndex(index) + * - printPinNameByIndex(index) + * - getPinIsDigitalByIndex(index) + * - digitalPinToAnalogIndex(pin) + * - getValidPinMode(pin) + * - isValidPin(pin) + * - isAnalogPin(pin) + * - digitalRead_mod(pin) + * - pwm_status(pin) + * - printPinPWM(pin) + * - printPinPort(pin) + * - printPinNumber(pin) + * - printPinAnalog(pin) + */ + +#include "../../inc/MarlinConfig.h" +#include +#include +#include + +#ifndef TOTAL_PIN_COUNT + #error "Expected TOTAL_PIN_COUNT not found." +#endif + +#define NUM_DIGITAL_PINS TOTAL_PIN_COUNT +#define NUMBER_PINS_TOTAL TOTAL_PIN_COUNT + +#define getPinByIndex(x) pin_t(pin_array[x].pin) +#define isValidPin(P) WITHIN(P, 0, (NUM_DIGITAL_PINS - 1)) +#define digitalRead_mod(P) extDigitalRead(P) +#define printPinNumber(P) do { sprintf_P(buffer, PSTR("%3hd "), pin_t(P)); SERIAL_ECHO(buffer); } while (0) +#define printPinAnalog(P) do { sprintf_P(buffer, PSTR(" (A%2d) "), pin_t(getAdcChannelFromPin(P))); SERIAL_ECHO(buffer); } while (0) +#define printPinNameByIndex(x) do { sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); } while (0) + +#define MULTI_NAME_PAD 21 // Space needed to be pretty if not first name assigned to a pin + +#ifndef M43_NEVER_TOUCH + #define M43_NEVER_TOUCH(x) WITHIN(x, 9, 10) // SERIAL pins: PA9(TX) PA10(RX) +#endif + +bool isAnalogPin(const pin_t pin) { + if (!isValidPin(pin)) return false; + + if (getAdcChannel(pin) != adc::ADC_Channel::INVALID) { + auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value(); + return instance.get_pin_mode(getPinInPort(pin)) == gpio::Pin_Mode::ANALOG && !M43_NEVER_TOUCH(pin); + } + + return false; +} + +bool getValidPinMode(const pin_t pin) { + if (!isValidPin(pin)) return false; + + auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value(); + gpio::Pin_Mode mode = instance.get_pin_mode(getPinInPort(pin)); + + return mode != gpio::Pin_Mode::ANALOG && mode != gpio::Pin_Mode::INPUT_FLOATING && + mode != gpio::Pin_Mode::INPUT_PULLUP && mode != gpio::Pin_Mode::INPUT_PULLDOWN; +} + +bool getPinIsDigitalByIndex(const int16_t index) { + const pin_t pin = getPinByIndex(index); + return (!isAnalogPin(pin)); +} + +int8_t digitalPinToAnalogIndex(const pin_t pin) { + if (!isValidPin(pin) || !isAnalogPin(pin)) return -1; + return pin; // Analog and digital pin indexes are shared +} + +bool pwm_status(const pin_t pin) { return false; } +void printPinPWM(const pin_t pin) { /* TODO */ } +void printPinPort(const pin_t pin) { /* TODO */ } diff --git a/Marlin/src/HAL/GD32_MFL/sdio.cpp b/Marlin/src/HAL/GD32_MFL/sdio.cpp new file mode 100644 index 0000000000..4b6d75d74f --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/sdio.cpp @@ -0,0 +1,233 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(ONBOARD_SDIO) + +#include +#include +#include "SDCard.h" +#include "sdio.h" + +using namespace sdio; + +#define TARGET_CLOCK 6000000U +#define BLOCK_SIZE 512U +#define CARD_TIMEOUT 500 // ms +#define READ_RETRIES 3U + +inline constexpr uint32_t TARGET_SDIO_CLOCK = TARGET_CLOCK; +inline constexpr uint32_t SDIO_BLOCK_SIZE = BLOCK_SIZE; +inline constexpr uint32_t SD_TIMEOUT = CARD_TIMEOUT; +inline constexpr uint8_t SDIO_READ_RETRIES = READ_RETRIES; + +Card_State cardState = Card_State::READY; + +bool SDIO_SetBusWidth(Bus_Width width) { + return (CardDMA_I.set_hardware_bus_width(width) == SDIO_Error_Type::OK); +} + +void mfl_sdio_init() { + pinOpsPinout(SD_CMD_PinOps, static_cast(SDIO_CMD_PIN)); + pinOpsPinout(SD_CK_PinOps, static_cast(SDIO_CK_PIN)); + pinOpsPinout(SD_DATA0_PinOps, static_cast(SDIO_D0_PIN)); + pinOpsPinout(SD_DATA1_PinOps, static_cast(SDIO_D1_PIN)); + pinOpsPinout(SD_DATA2_PinOps, static_cast(SDIO_D2_PIN)); + pinOpsPinout(SD_DATA3_PinOps, static_cast(SDIO_D3_PIN)); + + NVIC_EnableIRQ(DMA1_Channel3_4_IRQn); + NVIC_EnableIRQ(SDIO_IRQn); +} + +bool SDIO_Init() { + SDIO_Error_Type result = SDIO_Error_Type::OK; + uint8_t retryCount = SDIO_READ_RETRIES; + + mfl_sdio_init(); + + uint8_t retries = retryCount; + for (;;) { + hal.watchdog_refresh(); + result = CardDMA_I.init(); + if (result == SDIO_Error_Type::OK) break; + if (!--retries) return false; + } + + CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, false, false); + + retries = retryCount; + for (;;) { + hal.watchdog_refresh(); + if (SDIO_SetBusWidth(Bus_Width::WIDTH_4BIT)) break; + if (!--retries) break; + } + + CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, true, true); + + // Fallback + if (!retries) { + mfl_sdio_init(); + retries = retryCount; + for (;;) { + hal.watchdog_refresh(); + result = CardDMA_I.init(); + if (result == SDIO_Error_Type::OK) break; + if (!--retries) return false; + } + CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, false, true); + } + + return true; +} + +static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t* src, uint8_t* dst) { + hal.watchdog_refresh(); + SDIO_Error_Type result = SDIO_Error_Type::OK; + + // Write + if (src) { + result = CardDMA_I.write(reinterpret_cast(const_cast(src)), block, 1); + } + // Read + else { + result = CardDMA_I.read(dst, block, 1); + } + + if (result != SDIO_Error_Type::OK) { + return false; + } + + millis_t timeout = millis() + SD_TIMEOUT; + while (CardDMA_I.get_state() != sdio::Operational_State::READY) { + if (ELAPSED(millis(), timeout)) { + return false; + } + } + + CardDMA_I.check_dma_complete(); + + timeout = millis() + SD_TIMEOUT; + do { + result = CardDMA_I.get_card_state(&cardState); + if (ELAPSED(millis(), timeout)) { + return false; + } + } while (result == SDIO_Error_Type::OK && cardState != sdio::Card_State::TRANSFER); + + return true; +} + +bool SDIO_ReadBlock(uint32_t block, uint8_t* dst) { + // Check if the address is aligned to 4 bytes + if (reinterpret_cast(dst) & 0x03) { + return false; + } + + uint8_t retries = SDIO_READ_RETRIES; + while (retries--) { + if (SDIO_ReadWriteBlock_DMA(block, nullptr, dst)) { + return true; + } + } + + return false; +} + +bool SDIO_WriteBlock(uint32_t block, const uint8_t* src) { + // Check if the address is aligned to 4 bytes + if (reinterpret_cast(src) & 0x03) { + return false; + } + + uint8_t retries = SDIO_READ_RETRIES; + while (retries--) { + if (SDIO_ReadWriteBlock_DMA(block, src, nullptr)) { + return true; + delay(10); + } + } + + return false; +} + +bool SDIO_IsReady() { + return (CardDMA_I.get_state() == sdio::Operational_State::READY); +} + +uint32_t SDIO_GetCardSize() { + return CardDMA_I.get_card_capacity(); +} + +// DMA interrupt handler +void DMA1_IRQHandler() { + auto& dma_instance = CardDMA_I.get_dma_instance(); + bool is_receive = CardDMA_I.get_is_sdio_rx(); + + // Check for Transfer Complete Interrupt + if (dma_instance.get_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_FTFIF)) { + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, false); + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, false); + dma_instance.clear_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_FTFIF); + if (is_receive) { + CardDMA_I.set_sdio_dma_enable(false); + CardDMA_I.clear_sdio_data_flags(); + CardDMA_I.set_state(sdio::Operational_State::READY); + } else { + CardDMA_I.set_data_end_interrupt(); + } + // Signal that transfer is complete + CardDMA_I.set_transfer_end(true); + } + + else if (dma_instance.get_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_ERRIF)) { + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_HTFIE, false); + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, false); + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, false); + // Clear all flags + dma_instance.clear_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_GIF); + // Signal that an error occurred + CardDMA_I.set_transfer_error(SDIO_Error_Type::ERROR); + CardDMA_I.set_state(sdio::Operational_State::READY); + } +} + + +extern "C" { + + void SDIO_IRQHandler(void) { + CardDMA_I.handle_interrupts(); + } + + void DMA1_Channel3_4_IRQHandler(void) { + DMA1_IRQHandler(); + } + +} // extern "C" + + +#endif // ONBOARD_SDIO +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/sdio.h b/Marlin/src/HAL/GD32_MFL/sdio.h new file mode 100644 index 0000000000..b6b027ba77 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/sdio.h @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include +#include + +#define SDIO_D0_PIN PC8 +#define SDIO_D1_PIN PC9 +#define SDIO_D2_PIN PC10 +#define SDIO_D3_PIN PC11 +#define SDIO_CK_PIN PC12 +#define SDIO_CMD_PIN PD2 + +void sdio_mfl_init(); +bool SDIO_SetBusWidth(sdio::Bus_Width width); +void DMA1_IRQHandler(dma::DMA_Channel channel); diff --git a/Marlin/src/HAL/GD32_MFL/spi_pins.h b/Marlin/src/HAL/GD32_MFL/spi_pins.h new file mode 100644 index 0000000000..c8a5836838 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/spi_pins.h @@ -0,0 +1,32 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#pragma once + +// Define SPI Pins: SCK, MISO, MOSI +#ifndef SD_SCK_PIN + #define SD_SCK_PIN PIN_SPI_SCK +#endif +#ifndef SD_MISO_PIN + #define SD_MISO_PIN PIN_SPI_MISO +#endif +#ifndef SD_MOSI_PIN + #define SD_MOSI_PIN PIN_SPI_MOSI +#endif diff --git a/Marlin/src/HAL/GD32_MFL/temp_soc.h b/Marlin/src/HAL/GD32_MFL/temp_soc.h new file mode 100644 index 0000000000..eeb144c422 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/temp_soc.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#define TS_TYPICAL_V 1.405 +#define TS_TYPICAL_TEMP 25 +#define TS_TYPICAL_SLOPE 4.5 + +// TODO: Implement voltage scaling (calibrated Vrefint) and ADC resolution scaling (when applicable) +#define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) / 1000)) / ((TS_TYPICAL_SLOPE) / 1000) + TS_TYPICAL_TEMP) diff --git a/Marlin/src/HAL/GD32_MFL/timers.cpp b/Marlin/src/HAL/GD32_MFL/timers.cpp new file mode 100644 index 0000000000..bdcf5ed0ed --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/timers.cpp @@ -0,0 +1,233 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "timers.h" + +// ------------------------ +// Local defines +// ------------------------ + +#define SWSERIAL_TIMER_IRQ_PRIORITY_DEFAULT 1 // Requires tight bit timing to communicate reliably with TMC drivers +#define SERVO_TIMER_IRQ_PRIORITY_DEFAULT 1 // Requires tight PWM timing to control a BLTouch reliably +#define STEP_TIMER_IRQ_PRIORITY_DEFAULT 2 +#define TEMP_TIMER_IRQ_PRIORITY_DEFAULT 14 // Low priority avoids interference with other hardware and timers + +#ifndef TIMER_IRQ_PRIORITY + #define TIMER_IRQ_PRIORITY 12 +#endif + +#ifndef STEP_TIMER_IRQ_PRIORITY + #define STEP_TIMER_IRQ_PRIORITY STEP_TIMER_IRQ_PRIORITY_DEFAULT +#endif + +#ifndef TEMP_TIMER_IRQ_PRIORITY + #define TEMP_TIMER_IRQ_PRIORITY TEMP_TIMER_IRQ_PRIORITY_DEFAULT +#endif + +#if HAS_TMC_SW_SERIAL + #include + #ifndef SWSERIAL_TIMER_IRQ_PRIORITY + #define SWSERIAL_TIMER_IRQ_PRIORITY SWSERIAL_TIMER_IRQ_PRIORITY_DEFAULT + #endif +#endif + +#if HAS_SERVOS + #include "Servo.h" + #ifndef SERVO_TIMER_IRQ_PRIORITY + #define SERVO_TIMER_IRQ_PRIORITY SERVO_TIMER_IRQ_PRIORITY_DEFAULT + #endif +#endif + +#if ENABLED(SPEAKER) + // The MFL framework default timer priority is 12. The TEMP timer must have lower priority + // than this due to the long running temperature ISR, and STEP timer should higher priority. + #if !(TIMER_IRQ_PRIORITY > STEP_TIMER_IRQ_PRIORITY && TIMER_IRQ_PRIORITY < TEMP_TIMER_IRQ_PRIORITY) + #error "Default timer interrupt priority is unspecified or set to a value which may degrade performance." + #endif +#endif + +#ifndef HAL_TIMER_RATE + #define HAL_TIMER_RATE GetStepperTimerClkFreq() +#endif + +#ifndef STEP_TIMER + #define STEP_TIMER MF_TIMER_STEP +#endif +#ifndef TEMP_TIMER + #define TEMP_TIMER MF_TIMER_TEMP +#endif + +GeneralTimer& Step_Timer = GeneralTimer::get_instance(static_cast(STEP_TIMER)); +GeneralTimer& Temp_Timer = GeneralTimer::get_instance(static_cast(TEMP_TIMER)); + +bool is_step_timer_initialized = false; +bool is_temp_timer_initialized = false; + +// ------------------------ +// Public functions +// ------------------------ + +// Retrieves the clock frequency of the stepper timer +uint32_t GetStepperTimerClkFreq() { + return Step_Timer.getTimerClockFrequency(); +} + +/** + * @brief Starts a hardware timer + * + * If the timer is not already initialized, this function will initialize it with the given frequency. + * The timer is started immediately after initialization + * + * @param timer The timer base index to start + * @param frequency The frequency at which the timer should run + * @return None + */ +void HAL_timer_start(const uint8_t timer_number, const uint32_t frequency) { + if (HAL_timer_initialized(timer_number) || (timer_number != MF_TIMER_STEP && timer_number != MF_TIMER_TEMP)) + return; + + const bool is_step = (timer_number == MF_TIMER_STEP); + const uint8_t priority = is_step ? + static_cast(STEP_TIMER_IRQ_PRIORITY) : + static_cast(TEMP_TIMER_IRQ_PRIORITY); + + // Get the reference of the timer instance + GeneralTimer& timer = is_step ? Step_Timer : Temp_Timer; + + if (is_step) { + timer.setPrescaler(STEPPER_TIMER_PRESCALE); + timer.setRolloverValue(_MIN(static_cast(HAL_TIMER_TYPE_MAX), + (HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)), + TimerFormat::TICK); + is_step_timer_initialized = true; + } + else { + timer.setRolloverValue(frequency, TimerFormat::HERTZ); + is_temp_timer_initialized = true; + } + + timer.setAutoReloadEnable(false); + timer.setInterruptPriority(priority, 0U); + HAL_timer_enable_interrupt(timer_number); + timer.start(); +} + +/** + * @brief Enables the interrupt for the specified timer + * + * @param handle The timer handle for which to enable the interrupt + * @return None + */ +void HAL_timer_enable_interrupt(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + + if (timer_number == MF_TIMER_STEP && !timer.hasInterrupt()) + timer.attachInterrupt(Step_Handler); + else if (timer_number == MF_TIMER_TEMP && !timer.hasInterrupt()) + timer.attachInterrupt(Temp_Handler); +} + +/** + * @brief Disables the interrupt for the specified timer + * + * @param handle The timer handle for which to disable the interrupt + * @return None + */ +void HAL_timer_disable_interrupt(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + if (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) + timer.detachInterrupt(); +} + +/** + * @brief Checks if the interrupt is enabled for the specified timer + * + * @param handle The timer handle to check + * @return True if the interrupt is enabled, false otherwise + */ +bool HAL_timer_interrupt_enabled(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return false; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + return (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) + ? timer.hasInterrupt() + : false; +} + +// Sets the interrupt priorities for timers used by TMC SW serial and servos. +void SetTimerInterruptPriorities() { + TERN_(HAS_TMC_SW_SERIAL, SoftwareSerial::setInterruptPriority(SWSERIAL_TIMER_IRQ_PRIORITY, 0)); + TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIORITY, 0)); +} + +// ------------------------ +// Detect timer conflicts +// ------------------------ + +TERN_(SPEAKER, static constexpr timer::TIMER_Base timer_tone[] = {static_cast(TIMER_TONE)}); +TERN_(HAS_SERVOS, static constexpr timer::TIMER_Base timer_servo[] = {static_cast(TIMER_SERVO)}); + +enum TimerPurpose { + PURPOSE_TONE, + PURPOSE_SERVO, + PURPOSE_STEP, + PURPOSE_TEMP +}; + +// List of timers to check for conflicts +// Includes the timer purpose to ease debugging when evaluating at build-time +// This cannot yet account for timers used for PWM output, such as for fans +static constexpr struct { TimerPurpose p; int t; } timers_in_use[] = { + #if ENABLED(SPEAKER) + { PURPOSE_TONE, timer_base_to_index(timer_tone[0]) }, // Set in variant.h + #endif + #if HAS_SERVOS + { PURPOSE_SERVO, timer_base_to_index(timer_servo[0]) }, // Set in variant.h + #endif + { PURPOSE_STEP, MF_TIMER_STEP }, + { PURPOSE_TEMP, MF_TIMER_TEMP }, +}; + +// Verifies if there are any timer conflicts in the timers_in_use array +static constexpr bool verify_no_timer_conflicts() { + for (uint8_t i = 0; i < COUNT(timers_in_use); i++) + for (uint8_t j = i + 1; j < COUNT(timers_in_use); j++) + if (timers_in_use[i].t == timers_in_use[j].t) + return false; + + return true; +} + +// If this assertion fails at compile time, review the timers_in_use array. +// If default_envs is defined properly in platformio.ini, VSCode can evaluate the array +// when hovering over it, making it easy to identify the conflicting timers +static_assert(verify_no_timer_conflicts(), "One or more timer conflict detected. Examine \"timers_in_use\" to help identify conflict."); + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/timers.h b/Marlin/src/HAL/GD32_MFL/timers.h new file mode 100644 index 0000000000..539f599a16 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/timers.h @@ -0,0 +1,145 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfig.h" + +#include + +// ------------------------ +// Defines +// ------------------------ + +// Timer configuration constants +#define STEPPER_TIMER_RATE 2000000 +#define TEMP_TIMER_FREQUENCY 1000 + +// Timer instance definitions +#define MF_TIMER_STEP 3 +#define MF_TIMER_TEMP 1 +#define MF_TIMER_PULSE MF_TIMER_STEP + +#define hal_timer_t uint32_t +#define HAL_TIMER_TYPE_MAX UINT16_MAX + +extern uint32_t GetStepperTimerClkFreq(); + +// Timer prescaler calculations +#define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / STEPPER_TIMER_RATE) // Prescaler = 30 +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Stepper timer ticks per µs +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +// Timer interrupt priorities +#define STEP_TIMER_IRQ_PRIORITY 2 +#define TEMP_TIMER_IRQ_PRIORITY 14 + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) + +extern void Step_Handler(); +extern void Temp_Handler(); + +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() void Step_Handler() +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() void Temp_Handler() +#endif + +extern GeneralTimer& Step_Timer; +extern GeneralTimer& Temp_Timer; + +extern bool is_step_timer_initialized; +extern bool is_temp_timer_initialized; + +// Build-time mapping between timer base and index. Used in timers.cpp and fast_pwm.cpp +static inline constexpr struct {timer::TIMER_Base base; uint8_t timer_number;} base_to_index[] = { + { timer::TIMER_Base::TIMER0_BASE, 0 }, + { timer::TIMER_Base::TIMER1_BASE, 1 }, + { timer::TIMER_Base::TIMER2_BASE, 2 }, + { timer::TIMER_Base::TIMER3_BASE, 3 }, + { timer::TIMER_Base::TIMER4_BASE, 4 }, + { timer::TIMER_Base::TIMER5_BASE, 5 }, + { timer::TIMER_Base::TIMER6_BASE, 6 }, + { timer::TIMER_Base::TIMER7_BASE, 7 } +}; + +// Converts a timer base to an integer timer index. +constexpr int timer_base_to_index(timer::TIMER_Base base) { + for (const auto& timer : base_to_index) { + if (timer.base == base) { + return static_cast(timer.timer_number); + } + } + return -1; +} + +// ------------------------ +// Public functions +// ------------------------ + +void HAL_timer_start(const uint8_t timer, const uint32_t frequency); +void HAL_timer_enable_interrupt(const uint8_t timer); +void HAL_timer_disable_interrupt(const uint8_t timer); +bool HAL_timer_interrupt_enabled(const uint8_t timer); + +// Configure timer priorities for peripherals such as Software Serial or Servos. +// Exposed here to allow all timer priority information to reside in timers.cpp +void SetTimerInterruptPriorities(); + +// FORCE_INLINE because these are used in performance-critical situations +FORCE_INLINE bool HAL_timer_initialized(const uint8_t timer_number) { + return (timer_number == MF_TIMER_STEP) ? is_step_timer_initialized : + (timer_number == MF_TIMER_TEMP) ? is_temp_timer_initialized : + false; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return 0U; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + + return (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) + ? timer.getCounter(TimerFormat::TICK) + : 0U; +} + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_number, const hal_timer_t value) { + if (!HAL_timer_initialized(timer_number)) return; + + const uint32_t new_value = static_cast(value + 1U); + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + + if (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) { + timer.setRolloverValue(new_value, TimerFormat::TICK); + if (value < static_cast(timer.getCounter(TimerFormat::TICK))) + timer.refresh(); + } +} + +#define HAL_timer_isr_prologue(T) NOOP +#define HAL_timer_isr_epilogue(T) NOOP diff --git a/Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h b/Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h new file mode 100644 index 0000000000..720d958779 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// MFL LCD-specific defines +uint8_t u8g_com_HAL_MFL_sw_spi_fn(u8g_t* u8g, uint8_t msg, uint8_t arg_val, void* arg_ptr); // u8g_com_mfl_swspi.cpp +#define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_MFL_sw_spi_fn diff --git a/Marlin/src/HAL/HC32/eeprom_wired.cpp b/Marlin/src/HAL/HC32/eeprom_wired.cpp index d9be65b4c0..aea5fc87db 100644 --- a/Marlin/src/HAL/HC32/eeprom_wired.cpp +++ b/Marlin/src/HAL/HC32/eeprom_wired.cpp @@ -2,6 +2,9 @@ * Marlin 3D Printer Firmware * Copyright (c) 2023 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or diff --git a/Marlin/src/HAL/HC32/pinsDebug.h b/Marlin/src/HAL/HC32/pinsDebug.h index e80b5a081e..9f8e23ce44 100644 --- a/Marlin/src/HAL/HC32/pinsDebug.h +++ b/Marlin/src/HAL/HC32/pinsDebug.h @@ -2,6 +2,9 @@ * Marlin 3D Printer Firmware * Copyright (c) 2023 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or diff --git a/Marlin/src/HAL/HC32/spi_pins.h b/Marlin/src/HAL/HC32/spi_pins.h index 8a8e054b9b..5f1a94e920 100644 --- a/Marlin/src/HAL/HC32/spi_pins.h +++ b/Marlin/src/HAL/HC32/spi_pins.h @@ -2,6 +2,9 @@ * Marlin 3D Printer Firmware * Copyright (c) 2023 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or diff --git a/Marlin/src/HAL/platforms.h b/Marlin/src/HAL/platforms.h index 36fb792776..e7eea44308 100644 --- a/Marlin/src/HAL/platforms.h +++ b/Marlin/src/HAL/platforms.h @@ -37,6 +37,8 @@ #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/LPC1768/NAME) #elif defined(ARDUINO_ARCH_HC32) #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/HC32/NAME) +#elif defined(ARDUINO_ARCH_MFL) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/GD32_MFL/NAME) #elif defined(__STM32F1__) || defined(TARGET_STM32F1) #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/STM32F1/NAME) #elif defined(ARDUINO_ARCH_STM32) diff --git a/Marlin/src/HAL/shared/servo.h b/Marlin/src/HAL/shared/servo.h index fa75445ed7..0101fcb628 100644 --- a/Marlin/src/HAL/shared/servo.h +++ b/Marlin/src/HAL/shared/servo.h @@ -76,6 +76,8 @@ #include "../LPC1768/Servo.h" #elif defined(ARDUINO_ARCH_HC32) #include "../HC32/Servo.h" +#elif defined(ARDUINO_ARCH_MFL) + #include "../GD32_MFL/Servo.h" #elif defined(__STM32F1__) || defined(TARGET_STM32F1) #include "../STM32F1/Servo.h" #elif defined(ARDUINO_ARCH_STM32) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index c6713d0c98..3d34e3717e 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -383,7 +383,7 @@ #define BOARD_CHITU3D_V6 5036 // Chitu3D TronXY X5SA V6 Board (STM32F103ZE) #define BOARD_CHITU3D_V9 5037 // Chitu3D TronXY X5SA V9 Board (STM32F103ZE) #define BOARD_CREALITY_V4 5038 // Creality v4.x (STM32F103RC / STM32F103RE) -#define BOARD_CREALITY_V422 5039 // Creality v4.2.2 (STM32F103RC / STM32F103RE) +#define BOARD_CREALITY_V422 5039 // Creality v4.2.2 (STM32F103RC / STM32F103RE) ... GD32 Variant Below! #define BOARD_CREALITY_V423 5040 // Creality v4.2.3 (STM32F103RC / STM32F103RE) #define BOARD_CREALITY_V425 5041 // Creality v4.2.5 (STM32F103RC / STM32F103RE) #define BOARD_CREALITY_V427 5042 // Creality v4.2.7 (STM32F103RC / STM32F103RE) @@ -552,12 +552,18 @@ #define BOARD_AQUILA_V101 7200 // Voxelab Aquila V1.0.0/V1.0.1/V1.0.2/V1.0.3 as found in the Voxelab Aquila X2 and C2 #define BOARD_CREALITY_ENDER2P_V24S4 7201 // Creality Ender 2 Pro v2.4.S4_170 (HC32f460kcta) +// +// GD32 ARM Cortex-M4 +// + +#define BOARD_CREALITY_V422_GD32_MFL 7300 // Creality V4.2.2 MFL (GD32F303RE) ... STM32 Variant Above! + // // Raspberry Pi // -#define BOARD_RP2040 6200 // Generic RP2040 Test board -#define BOARD_BTT_SKR_PICO 6201 // BigTreeTech SKR Pico 1.x +#define BOARD_RP2040 6200 // Generic RP2040 Test board +#define BOARD_BTT_SKR_PICO 6201 // BigTreeTech SKR Pico 1.x // // Custom board diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 3c4cd44561..1a86bb37de 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -241,10 +241,10 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "SERIAL_XON_XOFF and SERIAL_STATS_* features not supported on USB-native AVR devices." #endif -// Serial DMA is only available for some STM32 MCUs and HC32 +// Serial DMA is only available for some STM32 MCUs, HC32 and GD32 #if ENABLED(SERIAL_DMA) - #ifdef ARDUINO_ARCH_HC32 - // checks for HC32 are located in HAL/HC32/inc/SanityCheck.h + #if ANY(ARDUINO_ARCH_HC32, ARDUINO_ARCH_MFL) + // See HAL/.../inc/SanityCheck.h #elif DISABLED(HAL_STM32) || NONE(STM32F0xx, STM32F1xx, STM32F2xx, STM32F4xx, STM32F7xx, STM32H7xx) #error "SERIAL_DMA is only available for some STM32 MCUs and requires HAL/STM32." #elif !defined(HAL_UART_MODULE_ENABLED) || defined(HAL_UART_MODULE_ONLY) diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index 70a6905d9f..119e2205ab 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -696,9 +696,16 @@ #warning "Don't forget to update your TFT settings in Configuration.h." #endif -#if ENABLED(EMIT_CREALITY_422_WARNING) && DISABLED(NO_CREALITY_422_DRIVER_WARNING) - // Driver labels: A=TMC2208, B=TMC2209, C=HR4988, E=A4988, H=TMC2225, H8=HR4988 - #warning "Creality 4.2.2 boards come with a variety of stepper drivers. Check the board label (typically on SD Card module) and set the correct *_DRIVER_TYPE! (A/H: TMC2208_STANDALONE B: TMC2209_STANDALONE C/E/H8: A4988). (Define NO_CREALITY_422_DRIVER_WARNING to suppress this warning.)" +#if ENABLED(EMIT_CREALITY_422_WARNING) + #if DISABLED(NO_CREALITY_422_MCU_WARNING) + #warning "Double-check your 4.2.2 board for STM32 / GD32. Use BOARD_CREALITY_V422 or BOARD_CREALITY_V422_GD32_MFL as appropriate for your MCU." + #warning "GD32 Serial Ports are numbered starting from 0. STM32 Serial Ports are numbered starting from 1." + #warning "(Define NO_CREALITY_422_MCU_WARNING to suppress these warnings.)" + #endif + #if DISABLED(NO_CREALITY_422_DRIVER_WARNING) + // Driver labels: A=TMC2208, B=TMC2209, C=HR4988, E=A4988, H=TMC2225, H8=HR4988 + #warning "Creality 4.2.2 boards come with a variety of stepper drivers. Check the board label (typically on SD Card module) and set the correct *_DRIVER_TYPE! (A/H: TMC2208_STANDALONE B: TMC2209_STANDALONE C/E/H8: A4988). (Define NO_CREALITY_422_DRIVER_WARNING to suppress this warning.)" + #endif #endif #if ENABLED(PRINTCOUNTER_SYNC) diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp index 6c330db204..76d15ce8a2 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp @@ -199,7 +199,7 @@ u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_f U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_hw_spi, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_HW_SPI); u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_HW_SPI }; -#if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) || defined(U8G_HAL_LINKS) +#if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32, ARDUINO_ARCH_MFL) || defined(U8G_HAL_LINKS) // Also use this device for HAL version of RRD class. This results in the same device being used // for the ST7920 for HAL systems no matter what is selected in marlinui_DOGM.h. u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; diff --git a/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp index 6f8990bf20..f7b50741ac 100644 --- a/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -25,7 +25,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if ANY(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) +#if ANY(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32, ARDUINO_ARCH_MFL) #include "../../../inc/MarlinConfig.h" @@ -193,4 +193,4 @@ u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_rrd_st7920_128x64_fn, &u8 #endif #endif // IS_U8GLIB_ST7920 -#endif // __AVR__ || ARDUINO_ARCH_STM32 || ARDUINO_ARCH_ESP32 +#endif // __AVR__ || ARDUINO_ARCH_STM32 || ARDUINO_ARCH_ESP32 || ARDUINO_ARCH_MFL diff --git a/Marlin/src/libs/BL24CXX.cpp b/Marlin/src/libs/BL24CXX.cpp index 767561143c..43c68887b1 100644 --- a/Marlin/src/libs/BL24CXX.cpp +++ b/Marlin/src/libs/BL24CXX.cpp @@ -48,7 +48,7 @@ #ifdef __STM32F1__ #define SDA_IN() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 8 << 12; }while(0) #define SDA_OUT() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 3 << 12; }while(0) -#elif defined(STM32F1) || defined(STM32F4) || defined(ARDUINO_ARCH_HC32) +#elif ANY(STM32F1, STM32F4, ARDUINO_ARCH_HC32, ARDUINO_ARCH_MFL) #define SDA_IN() SET_INPUT(IIC_EEPROM_SDA) #define SDA_OUT() SET_OUTPUT(IIC_EEPROM_SDA) #endif diff --git a/Marlin/src/pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h b/Marlin/src/pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h new file mode 100644 index 0000000000..70b171eef9 --- /dev/null +++ b/Marlin/src/pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Creality MFL GD32 V4.2.2 (GD32F303RE) board pin assignments + */ + +#define ALLOW_GD32F3 + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Creality V4.2.2 MFL" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME "Ender-3 MFL" +#endif + +#include "../stm32f1/pins_CREALITY_V4.h" diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 55dc00c60d..2e0919062c 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -964,6 +964,13 @@ #elif MB(CREALITY_ENDER2P_V24S4) #include "hc32f4/pins_CREALITY_ENDER2P_V24S4.h" // HC32F460 env:HC32F460C_e2p24s4 +// +// GD32 ARM Cortex-M4 +// + +#elif MB(CREALITY_V422_GD32_MFL) + #include "gd32f3/pins_CREALITY_V422_GD32_MFL.h" // GD32F303RE env:GD32F303RE_creality_mfl + // // Raspberry Pi RP2040 // diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index e93f232545..fe7f1d21ee 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -27,6 +27,8 @@ #if TARGET_LPC1768 #define ANALOG_OK(PN) (WITHIN(PN, P0_02, P0_03) || WITHIN(PN, P0_23, P0_26) || WITHIN(PN, P1_30, P1_31)) +#elif ARDUINO_ARCH_MFL + #define ANALOG_OK(PN) (WITHIN(PN, 0, 7) || WITHIN(PN, 16, 17) || WITHIN(PN, 32, 37)) #else #define ANALOG_OK(PN) WITHIN(PN, 0, NUM_ANALOG_INPUTS - 1) #endif diff --git a/Marlin/src/pins/stm32f1/env_validate.h b/Marlin/src/pins/stm32f1/env_validate.h index 47399a062d..34b07723e7 100644 --- a/Marlin/src/pins/stm32f1/env_validate.h +++ b/Marlin/src/pins/stm32f1/env_validate.h @@ -23,13 +23,16 @@ #define ENV_VALIDATE_H #if NOT_TARGET(__STM32F1__, STM32F1) - #if DISABLED(ALLOW_STM32F4) + #if NONE(ALLOW_STM32F4, ALLOW_GD32F3) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" - #elif NOT_TARGET(STM32F4) + #elif ENABLED(ALLOW_STM32F4) && NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" + #elif ENABLED(ALLOW_GD32F3) && NOT_TARGET(ARDUINO_ARCH_MFL) + #error "Oops! Make sure you have a GD32F3 MFL environment selected." #endif #endif #undef ALLOW_STM32F4 +#undef ALLOW_GD32F3 #endif diff --git a/README.md b/README.md index 160c288aad..50b86d3213 100644 --- a/README.md +++ b/README.md @@ -58,12 +58,13 @@ Every new HAL opens up a world of hardware. At this time we need HALs for RP2040 [Teensy++ 2.0](//www.microchip.com/en-us/product/AT90USB1286)|AT90USB1286|Printrboard [Arduino Due](//www.arduino.cc/en/Guide/ArduinoDue)|SAM3X8E|RAMPS-FD, RADDS, RAMPS4DUE [ESP32](//github.com/espressif/arduino-esp32)|ESP32|FYSETC E4, E4d@BOX, MRR + [GD32](//www.gigadevice.com/)|GD32 ARM Cortex-M4|Creality MFL GD32 V4.2.2 [HC32](//www.huazhoucn.com/)|HC32|Ender-2 Pro, Voxelab Aquila [LPC1768](//www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-cortex-m3/512-kb-flash-64-kb-sram-ethernet-usb-lqfp100-package:LPC1768FBD100)|ARM® Cortex-M3|MKS SBASE, Re-ARM, Selena Compact [LPC1769](//www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-cortex-m3/512-kb-flash-64-kb-sram-ethernet-usb-lqfp100-package:LPC1769FBD100)|ARM® Cortex-M3|Smoothieboard, Azteeg X5 mini, TH3D EZBoard + [Pico RP2040](//www.raspberrypi.com/documentation/microcontrollers/pico-series.html)|Dual Cortex M0+|BigTreeTech SKR Pico [STM32F103](//www.st.com/en/microcontrollers-microprocessors/stm32f103.html)|ARM® Cortex-M3|Malyan M200, GTM32 Pro, MKS Robin, BTT SKR Mini [STM32F401](//www.st.com/en/microcontrollers-microprocessors/stm32f401.html)|ARM® Cortex-M4|ARMED, Rumba32, SKR Pro, Lerdge, FYSETC S6, Artillery Ruby - [Pico RP2040](//www.raspberrypi.com/documentation/microcontrollers/pico-series.html)|Dual Cortex M0+|BigTreeTech SKR Pico [STM32F7x6](//www.st.com/en/microcontrollers-microprocessors/stm32f7x6.html)|ARM® Cortex-M7|The Borg, RemRam V1 [STM32G0B1RET6](//www.st.com/en/microcontrollers-microprocessors/stm32g0x1.html)|ARM® Cortex-M0+|BigTreeTech SKR mini E3 V3.0 [STM32H743xIT6](//www.st.com/en/microcontrollers-microprocessors/stm32h743-753.html)|ARM® Cortex-M7|BigTreeTech SKR V3.0, SKR EZ V3.0, SKR SE BX V2.0/V3.0 diff --git a/buildroot/tests/GD32F303RE_creality_mfl b/buildroot/tests/GD32F303RE_creality_mfl new file mode 100755 index 0000000000..6e0b9ff866 --- /dev/null +++ b/buildroot/tests/GD32F303RE_creality_mfl @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for GD32F303RE_creality_mfl +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_CREALITY_V422_GD32_MFL SERIAL_PORT 0 +opt_enable EEPROM_SETTINGS SDSUPPORT EMERGENCY_PARSER FAN_SOFT_PWM PINS_DEBUGGING +opt_add NO_CREALITY_422_DRIVER_WARNING +opt_add NO_AUTO_ASSIGN_WARNING +exec_test $1 $2 "Creality V4.2.2 MFL GD32 Default Configuration" "$3" + +# cleanup +restore_configs diff --git a/ini/gd32.ini b/ini/gd32.ini new file mode 100644 index 0000000000..2e5bcea3b5 --- /dev/null +++ b/ini/gd32.ini @@ -0,0 +1,47 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +#################################### +# +# HAL/MFL GD32 Environments +# +#################################### + +[gd32_base] +platform = https://github.com/bmourit/platform-mfl/archive/refs/tags/V1.0.2.zip +board_build.core = gd32 +build_src_filter = ${common.default_src_filter} + + +build_unflags = -std=gnu++11 -std=gnu++14 -std=gnu++17 +build_flags = -std=gnu++23 + -DARDUINO_ARCH_MFL + -DPLATFORM_M997_SUPPORT + -DTIMER_IRQ_PRIORITY=12 + -DADC_RESOLUTION=12 + -DCORE_DEBUG + -Wno-deprecated-declarations + -Wno-volatile +extra_scripts = ${common.extra_scripts} + +# +# Creality (GD32F303RE) +# +[env:GD32F303RE_creality_mfl] +extends = gd32_base +board = mfl_creality_422 +board_build.offset = 0x7000 +board_build.rename = firmware-{time}.bin +board_upload.offset_address = 0x08007000 +build_flags = ${gd32_base.build_flags} + -DMCU_GD32F303RE + -DGD32F303RE + -DTIMER_TONE=2 + -DSS_TIMER=3 + -DTIMER_SERVO=4 + -DTRANSFER_CLOCK_DIV=8 + -fsingle-precision-constant +extra_scripts = ${gd32_base.extra_scripts} + buildroot/share/PlatformIO/scripts/offset_and_rename.py + +monitor_speed = 115200 diff --git a/platformio.ini b/platformio.ini index ed1670dc6d..d69fdc6cea 100644 --- a/platformio.ini +++ b/platformio.ini @@ -22,6 +22,7 @@ extra_configs = ini/esp32.ini ini/features.ini ini/hc32.ini + ini/gd32.ini ini/lpc176x.ini ini/native.ini ini/samd21.ini From 849e432d62ecd9ebe23cb81b66829755b19362f9 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 28 Mar 2025 06:09:42 +0000 Subject: [PATCH 039/101] [cron] Bump distribution date (2025-03-28) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index c24e090c3d..4947d61a01 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-27" +//#define STRING_DISTRIBUTION_DATE "2025-03-28" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 690de1c353..18f02773cf 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-27" + #define STRING_DISTRIBUTION_DATE "2025-03-28" #endif /** From aad10ea1c7c1aac37d83c3d8537b4040f6f0e259 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 30 Mar 2025 14:58:16 +1300 Subject: [PATCH 040/101] =?UTF-8?q?=F0=9F=90=9B=20Fix=20E=20DIR=20init=20(?= =?UTF-8?q?#27770)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to add72fd045 --- Marlin/src/module/stepper.cpp | 10 +- Marlin/src/module/stepper/indirection.h | 240 +++++++++++++----------- 2 files changed, 137 insertions(+), 113 deletions(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 1ec82ba340..a86a33dda3 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2958,11 +2958,19 @@ void Stepper::init() { TERN_(HAS_Z3_DIR, Z3_DIR_INIT()); TERN_(HAS_Z4_DIR, Z4_DIR_INIT()); TERN_(HAS_I_DIR, I_DIR_INIT()); - TERN_(HAS_K_DIR, K_DIR_INIT()); + TERN_(HAS_J_DIR, J_DIR_INIT()); TERN_(HAS_K_DIR, K_DIR_INIT()); TERN_(HAS_U_DIR, U_DIR_INIT()); TERN_(HAS_V_DIR, V_DIR_INIT()); TERN_(HAS_W_DIR, W_DIR_INIT()); + TERN_(HAS_E0_DIR, E0_DIR_INIT()); + TERN_(HAS_E1_DIR, E1_DIR_INIT()); + TERN_(HAS_E2_DIR, E2_DIR_INIT()); + TERN_(HAS_E3_DIR, E3_DIR_INIT()); + TERN_(HAS_E4_DIR, E4_DIR_INIT()); + TERN_(HAS_E5_DIR, E5_DIR_INIT()); + TERN_(HAS_E6_DIR, E6_DIR_INIT()); + TERN_(HAS_E7_DIR, E7_DIR_INIT()); // Init Enable Pins - steppers default to disabled. #if HAS_X_ENABLE diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index d18fe830cc..e55b8ac45d 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -353,140 +353,156 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif // E0 Stepper -#ifndef E0_ENABLE_INIT - #define E0_ENABLE_INIT() SET_OUTPUT(E0_ENABLE_PIN) - #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) - #define E0_ENABLE_READ() bool(READ(E0_ENABLE_PIN)) +#if E_STEPPERS > 0 + #ifndef E0_ENABLE_INIT + #define E0_ENABLE_INIT() SET_OUTPUT(E0_ENABLE_PIN) + #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) + #define E0_ENABLE_READ() bool(READ(E0_ENABLE_PIN)) + #endif + #ifndef E0_DIR_INIT + #define E0_DIR_INIT() SET_OUTPUT(E0_DIR_PIN) + #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,INVERT_DIR(E0, STATE)) + #define E0_DIR_READ() INVERT_DIR(E0, bool(READ(E0_DIR_PIN))) + #endif + #define E0_STEP_INIT() SET_OUTPUT(E0_STEP_PIN) + #ifndef E0_STEP_WRITE + #define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE) + #endif + #define E0_STEP_READ() bool(READ(E0_STEP_PIN)) #endif -#ifndef E0_DIR_INIT - #define E0_DIR_INIT() SET_OUTPUT(E0_DIR_PIN) - #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,INVERT_DIR(E0, STATE)) - #define E0_DIR_READ() INVERT_DIR(E0, bool(READ(E0_DIR_PIN))) -#endif -#define E0_STEP_INIT() SET_OUTPUT(E0_STEP_PIN) -#ifndef E0_STEP_WRITE - #define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE) -#endif -#define E0_STEP_READ() bool(READ(E0_STEP_PIN)) // E1 Stepper -#ifndef E1_ENABLE_INIT - #define E1_ENABLE_INIT() SET_OUTPUT(E1_ENABLE_PIN) - #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) - #define E1_ENABLE_READ() bool(READ(E1_ENABLE_PIN)) +#if E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS) + #ifndef E1_ENABLE_INIT + #define E1_ENABLE_INIT() SET_OUTPUT(E1_ENABLE_PIN) + #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) + #define E1_ENABLE_READ() bool(READ(E1_ENABLE_PIN)) + #endif + #ifndef E1_DIR_INIT + #define E1_DIR_INIT() SET_OUTPUT(E1_DIR_PIN) + #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,INVERT_DIR(E1, STATE)) + #define E1_DIR_READ() INVERT_DIR(E1, bool(READ(E1_DIR_PIN))) + #endif + #define E1_STEP_INIT() SET_OUTPUT(E1_STEP_PIN) + #ifndef E1_STEP_WRITE + #define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE) + #endif + #define E1_STEP_READ() bool(READ(E1_STEP_PIN)) #endif -#ifndef E1_DIR_INIT - #define E1_DIR_INIT() SET_OUTPUT(E1_DIR_PIN) - #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,INVERT_DIR(E1, STATE)) - #define E1_DIR_READ() INVERT_DIR(E1, bool(READ(E1_DIR_PIN))) -#endif -#define E1_STEP_INIT() SET_OUTPUT(E1_STEP_PIN) -#ifndef E1_STEP_WRITE - #define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE) -#endif -#define E1_STEP_READ() bool(READ(E1_STEP_PIN)) // E2 Stepper -#ifndef E2_ENABLE_INIT - #define E2_ENABLE_INIT() SET_OUTPUT(E2_ENABLE_PIN) - #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) - #define E2_ENABLE_READ() bool(READ(E2_ENABLE_PIN)) +#if E_STEPPERS > 2 + #ifndef E2_ENABLE_INIT + #define E2_ENABLE_INIT() SET_OUTPUT(E2_ENABLE_PIN) + #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) + #define E2_ENABLE_READ() bool(READ(E2_ENABLE_PIN)) + #endif + #ifndef E2_DIR_INIT + #define E2_DIR_INIT() SET_OUTPUT(E2_DIR_PIN) + #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,INVERT_DIR(E2, STATE)) + #define E2_DIR_READ() INVERT_DIR(E2, bool(READ(E2_DIR_PIN))) + #endif + #define E2_STEP_INIT() SET_OUTPUT(E2_STEP_PIN) + #ifndef E2_STEP_WRITE + #define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE) + #endif + #define E2_STEP_READ() bool(READ(E2_STEP_PIN)) #endif -#ifndef E2_DIR_INIT - #define E2_DIR_INIT() SET_OUTPUT(E2_DIR_PIN) - #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,INVERT_DIR(E2, STATE)) - #define E2_DIR_READ() INVERT_DIR(E2, bool(READ(E2_DIR_PIN))) -#endif -#define E2_STEP_INIT() SET_OUTPUT(E2_STEP_PIN) -#ifndef E2_STEP_WRITE - #define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE) -#endif -#define E2_STEP_READ() bool(READ(E2_STEP_PIN)) // E3 Stepper -#ifndef E3_ENABLE_INIT - #define E3_ENABLE_INIT() SET_OUTPUT(E3_ENABLE_PIN) - #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) - #define E3_ENABLE_READ() bool(READ(E3_ENABLE_PIN)) +#if E_STEPPERS > 3 + #ifndef E3_ENABLE_INIT + #define E3_ENABLE_INIT() SET_OUTPUT(E3_ENABLE_PIN) + #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) + #define E3_ENABLE_READ() bool(READ(E3_ENABLE_PIN)) + #endif + #ifndef E3_DIR_INIT + #define E3_DIR_INIT() SET_OUTPUT(E3_DIR_PIN) + #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,INVERT_DIR(E3, STATE)) + #define E3_DIR_READ() INVERT_DIR(E3, bool(READ(E3_DIR_PIN))) + #endif + #define E3_STEP_INIT() SET_OUTPUT(E3_STEP_PIN) + #ifndef E3_STEP_WRITE + #define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE) + #endif + #define E3_STEP_READ() bool(READ(E3_STEP_PIN)) #endif -#ifndef E3_DIR_INIT - #define E3_DIR_INIT() SET_OUTPUT(E3_DIR_PIN) - #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,INVERT_DIR(E3, STATE)) - #define E3_DIR_READ() INVERT_DIR(E3, bool(READ(E3_DIR_PIN))) -#endif -#define E3_STEP_INIT() SET_OUTPUT(E3_STEP_PIN) -#ifndef E3_STEP_WRITE - #define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE) -#endif -#define E3_STEP_READ() bool(READ(E3_STEP_PIN)) // E4 Stepper -#ifndef E4_ENABLE_INIT - #define E4_ENABLE_INIT() SET_OUTPUT(E4_ENABLE_PIN) - #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) - #define E4_ENABLE_READ() bool(READ(E4_ENABLE_PIN)) +#if E_STEPPERS > 4 + #ifndef E4_ENABLE_INIT + #define E4_ENABLE_INIT() SET_OUTPUT(E4_ENABLE_PIN) + #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) + #define E4_ENABLE_READ() bool(READ(E4_ENABLE_PIN)) + #endif + #ifndef E4_DIR_INIT + #define E4_DIR_INIT() SET_OUTPUT(E4_DIR_PIN) + #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,INVERT_DIR(E4, STATE)) + #define E4_DIR_READ() INVERT_DIR(E4, bool(READ(E4_DIR_PIN))) + #endif + #define E4_STEP_INIT() SET_OUTPUT(E4_STEP_PIN) + #ifndef E4_STEP_WRITE + #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE) + #endif + #define E4_STEP_READ() bool(READ(E4_STEP_PIN)) #endif -#ifndef E4_DIR_INIT - #define E4_DIR_INIT() SET_OUTPUT(E4_DIR_PIN) - #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,INVERT_DIR(E4, STATE)) - #define E4_DIR_READ() INVERT_DIR(E4, bool(READ(E4_DIR_PIN))) -#endif -#define E4_STEP_INIT() SET_OUTPUT(E4_STEP_PIN) -#ifndef E4_STEP_WRITE - #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE) -#endif -#define E4_STEP_READ() bool(READ(E4_STEP_PIN)) // E5 Stepper -#ifndef E5_ENABLE_INIT - #define E5_ENABLE_INIT() SET_OUTPUT(E5_ENABLE_PIN) - #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE) - #define E5_ENABLE_READ() bool(READ(E5_ENABLE_PIN)) +#if E_STEPPERS > 5 + #ifndef E5_ENABLE_INIT + #define E5_ENABLE_INIT() SET_OUTPUT(E5_ENABLE_PIN) + #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE) + #define E5_ENABLE_READ() bool(READ(E5_ENABLE_PIN)) + #endif + #ifndef E5_DIR_INIT + #define E5_DIR_INIT() SET_OUTPUT(E5_DIR_PIN) + #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,INVERT_DIR(E5, STATE)) + #define E5_DIR_READ() INVERT_DIR(E5, bool(READ(E5_DIR_PIN))) + #endif + #define E5_STEP_INIT() SET_OUTPUT(E5_STEP_PIN) + #ifndef E5_STEP_WRITE + #define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE) + #endif + #define E5_STEP_READ() bool(READ(E5_STEP_PIN)) #endif -#ifndef E5_DIR_INIT - #define E5_DIR_INIT() SET_OUTPUT(E5_DIR_PIN) - #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,INVERT_DIR(E5, STATE)) - #define E5_DIR_READ() INVERT_DIR(E5, bool(READ(E5_DIR_PIN))) -#endif -#define E5_STEP_INIT() SET_OUTPUT(E5_STEP_PIN) -#ifndef E5_STEP_WRITE - #define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE) -#endif -#define E5_STEP_READ() bool(READ(E5_STEP_PIN)) // E6 Stepper -#ifndef E6_ENABLE_INIT - #define E6_ENABLE_INIT() SET_OUTPUT(E6_ENABLE_PIN) - #define E6_ENABLE_WRITE(STATE) WRITE(E6_ENABLE_PIN,STATE) - #define E6_ENABLE_READ() bool(READ(E6_ENABLE_PIN)) +#if E_STEPPERS > 6 + #ifndef E6_ENABLE_INIT + #define E6_ENABLE_INIT() SET_OUTPUT(E6_ENABLE_PIN) + #define E6_ENABLE_WRITE(STATE) WRITE(E6_ENABLE_PIN,STATE) + #define E6_ENABLE_READ() bool(READ(E6_ENABLE_PIN)) + #endif + #ifndef E6_DIR_INIT + #define E6_DIR_INIT() SET_OUTPUT(E6_DIR_PIN) + #define E6_DIR_WRITE(STATE) WRITE(E6_DIR_PIN,INVERT_DIR(E6, STATE)) + #define E6_DIR_READ() INVERT_DIR(E6, bool(READ(E6_DIR_PIN))) + #endif + #define E6_STEP_INIT() SET_OUTPUT(E6_STEP_PIN) + #ifndef E6_STEP_WRITE + #define E6_STEP_WRITE(STATE) WRITE(E6_STEP_PIN,STATE) + #endif + #define E6_STEP_READ() bool(READ(E6_STEP_PIN)) #endif -#ifndef E6_DIR_INIT - #define E6_DIR_INIT() SET_OUTPUT(E6_DIR_PIN) - #define E6_DIR_WRITE(STATE) WRITE(E6_DIR_PIN,INVERT_DIR(E6, STATE)) - #define E6_DIR_READ() INVERT_DIR(E6, bool(READ(E6_DIR_PIN))) -#endif -#define E6_STEP_INIT() SET_OUTPUT(E6_STEP_PIN) -#ifndef E6_STEP_WRITE - #define E6_STEP_WRITE(STATE) WRITE(E6_STEP_PIN,STATE) -#endif -#define E6_STEP_READ() bool(READ(E6_STEP_PIN)) // E7 Stepper -#ifndef E7_ENABLE_INIT - #define E7_ENABLE_INIT() SET_OUTPUT(E7_ENABLE_PIN) - #define E7_ENABLE_WRITE(STATE) WRITE(E7_ENABLE_PIN,STATE) - #define E7_ENABLE_READ() bool(READ(E7_ENABLE_PIN)) +#if E_STEPPERS > 7 + #ifndef E7_ENABLE_INIT + #define E7_ENABLE_INIT() SET_OUTPUT(E7_ENABLE_PIN) + #define E7_ENABLE_WRITE(STATE) WRITE(E7_ENABLE_PIN,STATE) + #define E7_ENABLE_READ() bool(READ(E7_ENABLE_PIN)) + #endif + #ifndef E7_DIR_INIT + #define E7_DIR_INIT() SET_OUTPUT(E7_DIR_PIN) + #define E7_DIR_WRITE(STATE) WRITE(E7_DIR_PIN,INVERT_DIR(E7, STATE)) + #define E7_DIR_READ() INVERT_DIR(E7, bool(READ(E7_DIR_PIN))) + #endif + #define E7_STEP_INIT() SET_OUTPUT(E7_STEP_PIN) + #ifndef E7_STEP_WRITE + #define E7_STEP_WRITE(STATE) WRITE(E7_STEP_PIN,STATE) + #endif + #define E7_STEP_READ() bool(READ(E7_STEP_PIN)) #endif -#ifndef E7_DIR_INIT - #define E7_DIR_INIT() SET_OUTPUT(E7_DIR_PIN) - #define E7_DIR_WRITE(STATE) WRITE(E7_DIR_PIN,INVERT_DIR(E7, STATE)) - #define E7_DIR_READ() INVERT_DIR(E7, bool(READ(E7_DIR_PIN))) -#endif -#define E7_STEP_INIT() SET_OUTPUT(E7_STEP_PIN) -#ifndef E7_STEP_WRITE - #define E7_STEP_WRITE(STATE) WRITE(E7_STEP_PIN,STATE) -#endif -#define E7_STEP_READ() bool(READ(E7_STEP_PIN)) /** * Extruder indirection for the single E axis From fd17cc962b4788185f9f2e04c96ce608691afc4a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 30 Mar 2025 06:08:25 +0000 Subject: [PATCH 041/101] [cron] Bump distribution date (2025-03-30) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 4947d61a01..a0cbd5cf9b 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-28" +//#define STRING_DISTRIBUTION_DATE "2025-03-30" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 18f02773cf..b717290a77 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-28" + #define STRING_DISTRIBUTION_DATE "2025-03-30" #endif /** From 73ed54308a6da8244ac10de04fb19d173fa54c83 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 30 Mar 2025 14:56:55 -0500 Subject: [PATCH 042/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Mov?= =?UTF-8?q?e=20ENABLE=20to=20indirection.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to add72fd045 --- Marlin/src/inc/Conditionals-5-post.h | 24 ++-- Marlin/src/module/stepper.cpp | 149 ++++-------------------- Marlin/src/module/stepper/indirection.h | 71 ++++++++++- 3 files changed, 107 insertions(+), 137 deletions(-) diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index 93be95c95d..f83c063d11 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -1065,17 +1065,19 @@ #define HAS_X_MS_PINS 1 #endif - #if PIN_EXISTS(X2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, X2_IS_TRINAMIC) - #define HAS_X2_ENABLE 1 - #endif - #if PIN_EXISTS(X2_DIR) - #define HAS_X2_DIR 1 - #endif - #if PIN_EXISTS(X2_STEP) - #define HAS_X2_STEP 1 - #endif - #if PIN_EXISTS(X2_MS1) - #define HAS_X2_MS_PINS 1 + #if HAS_X2_STEPPER + #if PIN_EXISTS(X2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, X2_IS_TRINAMIC) + #define HAS_X2_ENABLE 1 + #endif + #if PIN_EXISTS(X2_DIR) + #define HAS_X2_DIR 1 + #endif + #if PIN_EXISTS(X2_STEP) + #define HAS_X2_STEP 1 + #endif + #if PIN_EXISTS(X2_MS1) + #define HAS_X2_MS_PINS 1 + #endif #endif #endif diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index a86a33dda3..f55465ea56 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2972,131 +2972,30 @@ void Stepper::init() { TERN_(HAS_E6_DIR, E6_DIR_INIT()); TERN_(HAS_E7_DIR, E7_DIR_INIT()); - // Init Enable Pins - steppers default to disabled. - #if HAS_X_ENABLE - #ifndef X_ENABLE_INIT_STATE - #define X_ENABLE_INIT_STATE !X_ENABLE_ON - #endif - X_ENABLE_INIT(); - if (X_ENABLE_INIT_STATE) X_ENABLE_WRITE(X_ENABLE_INIT_STATE); - #if ALL(HAS_X2_STEPPER, HAS_X2_ENABLE) - X2_ENABLE_INIT(); - if (X_ENABLE_INIT_STATE) X2_ENABLE_WRITE(X_ENABLE_INIT_STATE); - #endif - #endif - #if HAS_Y_ENABLE - #ifndef Y_ENABLE_INIT_STATE - #define Y_ENABLE_INIT_STATE !Y_ENABLE_ON - #endif - Y_ENABLE_INIT(); - if (Y_ENABLE_INIT_STATE) Y_ENABLE_WRITE(Y_ENABLE_INIT_STATE); - #if ALL(HAS_Y2_STEPPER, HAS_Y2_ENABLE) - Y2_ENABLE_INIT(); - if (Y_ENABLE_INIT_STATE) Y2_ENABLE_WRITE(Y_ENABLE_INIT_STATE); - #endif - #endif - #if HAS_Z_ENABLE - #ifndef Z_ENABLE_INIT_STATE - #define Z_ENABLE_INIT_STATE !Z_ENABLE_ON - #endif - Z_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #if HAS_Z2_ENABLE - Z2_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z2_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #endif - #if HAS_Z3_ENABLE - Z3_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z3_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #endif - #if HAS_Z4_ENABLE - Z4_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z4_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #endif - #endif - #if HAS_I_ENABLE - I_ENABLE_INIT(); - if (!I_ENABLE_ON) I_ENABLE_WRITE(HIGH); - #endif - #if HAS_J_ENABLE - J_ENABLE_INIT(); - if (!J_ENABLE_ON) J_ENABLE_WRITE(HIGH); - #endif - #if HAS_K_ENABLE - K_ENABLE_INIT(); - if (!K_ENABLE_ON) K_ENABLE_WRITE(HIGH); - #endif - #if HAS_U_ENABLE - U_ENABLE_INIT(); - if (!U_ENABLE_ON) U_ENABLE_WRITE(HIGH); - #endif - #if HAS_V_ENABLE - V_ENABLE_INIT(); - if (!V_ENABLE_ON) V_ENABLE_WRITE(HIGH); - #endif - #if HAS_W_ENABLE - W_ENABLE_INIT(); - if (!W_ENABLE_ON) W_ENABLE_WRITE(HIGH); - #endif - #if HAS_E0_ENABLE - #ifndef E_ENABLE_INIT_STATE - #define E_ENABLE_INIT_STATE !E_ENABLE_ON - #endif - #ifndef E0_ENABLE_INIT_STATE - #define E0_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E0_ENABLE_INIT(); - if (E0_ENABLE_INIT_STATE) E0_ENABLE_WRITE(E0_ENABLE_INIT_STATE); - #endif - #if HAS_E1_ENABLE - #ifndef E1_ENABLE_INIT_STATE - #define E1_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E1_ENABLE_INIT(); - if (E1_ENABLE_INIT_STATE) E1_ENABLE_WRITE(E1_ENABLE_INIT_STATE); - #endif - #if HAS_E2_ENABLE - #ifndef E2_ENABLE_INIT_STATE - #define E2_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E2_ENABLE_INIT(); - if (E2_ENABLE_INIT_STATE) E2_ENABLE_WRITE(E2_ENABLE_INIT_STATE); - #endif - #if HAS_E3_ENABLE - #ifndef E3_ENABLE_INIT_STATE - #define E3_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E3_ENABLE_INIT(); - if (E3_ENABLE_INIT_STATE) E3_ENABLE_WRITE(E3_ENABLE_INIT_STATE); - #endif - #if HAS_E4_ENABLE - #ifndef E4_ENABLE_INIT_STATE - #define E4_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E4_ENABLE_INIT(); - if (E4_ENABLE_INIT_STATE) E4_ENABLE_WRITE(E4_ENABLE_INIT_STATE); - #endif - #if HAS_E5_ENABLE - #ifndef E5_ENABLE_INIT_STATE - #define E5_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E5_ENABLE_INIT(); - if (E5_ENABLE_INIT_STATE) E5_ENABLE_WRITE(E5_ENABLE_INIT_STATE); - #endif - #if HAS_E6_ENABLE - #ifndef E6_ENABLE_INIT_STATE - #define E6_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E6_ENABLE_INIT(); - if (E6_ENABLE_INIT_STATE) E6_ENABLE_WRITE(E6_ENABLE_INIT_STATE); - #endif - #if HAS_E7_ENABLE - #ifndef E7_ENABLE_INIT_STATE - #define E7_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E7_ENABLE_INIT(); - if (E7_ENABLE_INIT_STATE) E7_ENABLE_WRITE(E7_ENABLE_INIT_STATE); - #endif + // Init Enable Pins - Steppers default to disabled. + #define _INIT_CONFIG_ENABLE(A) do{ A##_ENABLE_INIT(); if (A##_ENABLE_INIT_STATE) A##_ENABLE_WRITE(HIGH); }while(0) + TERN_(HAS_X_ENABLE, _INIT_CONFIG_ENABLE(X)); + TERN_(HAS_X2_ENABLE, _INIT_CONFIG_ENABLE(X2)); + TERN_(HAS_Y_ENABLE, _INIT_CONFIG_ENABLE(Y)); + TERN_(HAS_Y2_ENABLE, _INIT_CONFIG_ENABLE(Y2)); + TERN_(HAS_Z_ENABLE, _INIT_CONFIG_ENABLE(Z)); + TERN_(HAS_Z2_ENABLE, _INIT_CONFIG_ENABLE(Z2)); + TERN_(HAS_Z3_ENABLE, _INIT_CONFIG_ENABLE(Z3)); + TERN_(HAS_Z4_ENABLE, _INIT_CONFIG_ENABLE(Z4)); + TERN_(HAS_I_ENABLE, _INIT_CONFIG_ENABLE(I)); + TERN_(HAS_J_ENABLE, _INIT_CONFIG_ENABLE(J)); + TERN_(HAS_K_ENABLE, _INIT_CONFIG_ENABLE(K)); + TERN_(HAS_U_ENABLE, _INIT_CONFIG_ENABLE(U)); + TERN_(HAS_V_ENABLE, _INIT_CONFIG_ENABLE(V)); + TERN_(HAS_W_ENABLE, _INIT_CONFIG_ENABLE(W)); + TERN_(HAS_E0_ENABLE, _INIT_CONFIG_ENABLE(E0)); + TERN_(HAS_E1_ENABLE, _INIT_CONFIG_ENABLE(E1)); + TERN_(HAS_E2_ENABLE, _INIT_CONFIG_ENABLE(E2)); + TERN_(HAS_E3_ENABLE, _INIT_CONFIG_ENABLE(E3)); + TERN_(HAS_E4_ENABLE, _INIT_CONFIG_ENABLE(E4)); + TERN_(HAS_E5_ENABLE, _INIT_CONFIG_ENABLE(E5)); + TERN_(HAS_E6_ENABLE, _INIT_CONFIG_ENABLE(E6)); + TERN_(HAS_E7_ENABLE, _INIT_CONFIG_ENABLE(E7)); #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT() #define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW) diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index e55b8ac45d..19594df66c 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -80,6 +80,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // X Stepper #if HAS_X_AXIS + #ifndef X_ENABLE_INIT_STATE + #define X_ENABLE_INIT_STATE !X_ENABLE_ON + #endif #ifndef X_ENABLE_INIT #define X_ENABLE_INIT() SET_OUTPUT(X_ENABLE_PIN) #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE) @@ -99,6 +102,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Y Stepper #if HAS_Y_AXIS + #ifndef Y_ENABLE_INIT_STATE + #define Y_ENABLE_INIT_STATE !Y_ENABLE_ON + #endif #ifndef Y_ENABLE_INIT #define Y_ENABLE_INIT() SET_OUTPUT(Y_ENABLE_PIN) #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE) @@ -118,6 +124,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z Stepper #if HAS_Z_AXIS + #ifndef Z_ENABLE_INIT_STATE + #define Z_ENABLE_INIT_STATE !Z_ENABLE_ON + #endif #ifndef Z_ENABLE_INIT #define Z_ENABLE_INIT() SET_OUTPUT(Z_ENABLE_PIN) #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE) @@ -137,6 +146,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // X2 Stepper #if HAS_X2_ENABLE + #ifndef X2_ENABLE_INIT_STATE + #define X2_ENABLE_INIT_STATE X_ENABLE_INIT_STATE + #endif #ifndef X2_ENABLE_INIT #define X2_ENABLE_INIT() SET_OUTPUT(X2_ENABLE_PIN) #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE) @@ -156,6 +168,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Y2 Stepper #if HAS_Y2_ENABLE + #ifndef Y2_ENABLE_INIT_STATE + #define Y2_ENABLE_INIT_STATE Y_ENABLE_INIT_STATE + #endif #ifndef Y2_ENABLE_INIT #define Y2_ENABLE_INIT() SET_OUTPUT(Y2_ENABLE_PIN) #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE) @@ -177,6 +192,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z2 Stepper #if HAS_Z2_ENABLE + #ifndef Z2_ENABLE_INIT_STATE + #define Z2_ENABLE_INIT_STATE Z_ENABLE_INIT_STATE + #endif #ifndef Z2_ENABLE_INIT #define Z2_ENABLE_INIT() SET_OUTPUT(Z2_ENABLE_PIN) #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE) @@ -198,6 +216,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z3 Stepper #if HAS_Z3_ENABLE + #ifndef Z3_ENABLE_INIT_STATE + #define Z3_ENABLE_INIT_STATE Z_ENABLE_INIT_STATE + #endif #ifndef Z3_ENABLE_INIT #define Z3_ENABLE_INIT() SET_OUTPUT(Z3_ENABLE_PIN) #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE) @@ -219,6 +240,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z4 Stepper #if HAS_Z4_ENABLE + #ifndef Z4_ENABLE_INIT_STATE + #define Z4_ENABLE_INIT_STATE Z_ENABLE_INIT_STATE + #endif #ifndef Z4_ENABLE_INIT #define Z4_ENABLE_INIT() SET_OUTPUT(Z4_ENABLE_PIN) #define Z4_ENABLE_WRITE(STATE) WRITE(Z4_ENABLE_PIN,STATE) @@ -240,6 +264,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // I Stepper #if HAS_I_AXIS + #ifndef I_ENABLE_INIT_STATE + #define I_ENABLE_INIT_STATE !I_ENABLE_ON + #endif #ifndef I_ENABLE_INIT #define I_ENABLE_INIT() SET_OUTPUT(I_ENABLE_PIN) #define I_ENABLE_WRITE(STATE) WRITE(I_ENABLE_PIN,STATE) @@ -259,6 +286,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // J Stepper #if HAS_J_AXIS + #ifndef J_ENABLE_INIT_STATE + #define J_ENABLE_INIT_STATE !J_ENABLE_ON + #endif #ifndef J_ENABLE_INIT #define J_ENABLE_INIT() SET_OUTPUT(J_ENABLE_PIN) #define J_ENABLE_WRITE(STATE) WRITE(J_ENABLE_PIN,STATE) @@ -278,6 +308,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // K Stepper #if HAS_K_AXIS + #ifndef K_ENABLE_INIT_STATE + #define K_ENABLE_INIT_STATE !K_ENABLE_ON + #endif #ifndef K_ENABLE_INIT #define K_ENABLE_INIT() SET_OUTPUT(K_ENABLE_PIN) #define K_ENABLE_WRITE(STATE) WRITE(K_ENABLE_PIN,STATE) @@ -297,6 +330,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // U Stepper #if HAS_U_AXIS + #ifndef U_ENABLE_INIT_STATE + #define U_ENABLE_INIT_STATE !U_ENABLE_ON + #endif #ifndef U_ENABLE_INIT #define U_ENABLE_INIT() SET_OUTPUT(U_ENABLE_PIN) #define U_ENABLE_WRITE(STATE) WRITE(U_ENABLE_PIN,STATE) @@ -316,6 +352,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // V Stepper #if HAS_V_AXIS + #ifndef V_ENABLE_INIT_STATE + #define V_ENABLE_INIT_STATE !V_ENABLE_ON + #endif #ifndef V_ENABLE_INIT #define V_ENABLE_INIT() SET_OUTPUT(V_ENABLE_PIN) #define V_ENABLE_WRITE(STATE) WRITE(V_ENABLE_PIN,STATE) @@ -335,6 +374,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // W Stepper #if HAS_W_AXIS + #ifndef W_ENABLE_INIT_STATE + #define W_ENABLE_INIT_STATE !W_ENABLE_ON + #endif #ifndef W_ENABLE_INIT #define W_ENABLE_INIT() SET_OUTPUT(W_ENABLE_PIN) #define W_ENABLE_WRITE(STATE) WRITE(W_ENABLE_PIN,STATE) @@ -353,7 +395,13 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif // E0 Stepper -#if E_STEPPERS > 0 +#if HAS_EXTRUDERS + #ifndef E_ENABLE_INIT_STATE + #define E_ENABLE_INIT_STATE !E_ENABLE_ON + #endif + #ifndef E0_ENABLE_INIT_STATE + #define E0_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E0_ENABLE_INIT #define E0_ENABLE_INIT() SET_OUTPUT(E0_ENABLE_PIN) #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) @@ -373,6 +421,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E1 Stepper #if E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS) + #ifndef E1_ENABLE_INIT_STATE + #define E1_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E1_ENABLE_INIT #define E1_ENABLE_INIT() SET_OUTPUT(E1_ENABLE_PIN) #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) @@ -392,6 +443,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E2 Stepper #if E_STEPPERS > 2 + #ifndef E2_ENABLE_INIT_STATE + #define E2_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E2_ENABLE_INIT #define E2_ENABLE_INIT() SET_OUTPUT(E2_ENABLE_PIN) #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) @@ -411,6 +465,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E3 Stepper #if E_STEPPERS > 3 + #ifndef E3_ENABLE_INIT_STATE + #define E3_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E3_ENABLE_INIT #define E3_ENABLE_INIT() SET_OUTPUT(E3_ENABLE_PIN) #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) @@ -430,6 +487,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E4 Stepper #if E_STEPPERS > 4 + #ifndef E4_ENABLE_INIT_STATE + #define E4_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E4_ENABLE_INIT #define E4_ENABLE_INIT() SET_OUTPUT(E4_ENABLE_PIN) #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) @@ -449,6 +509,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E5 Stepper #if E_STEPPERS > 5 + #ifndef E5_ENABLE_INIT_STATE + #define E5_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E5_ENABLE_INIT #define E5_ENABLE_INIT() SET_OUTPUT(E5_ENABLE_PIN) #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE) @@ -468,6 +531,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E6 Stepper #if E_STEPPERS > 6 + #ifndef E6_ENABLE_INIT_STATE + #define E6_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E6_ENABLE_INIT #define E6_ENABLE_INIT() SET_OUTPUT(E6_ENABLE_PIN) #define E6_ENABLE_WRITE(STATE) WRITE(E6_ENABLE_PIN,STATE) @@ -487,6 +553,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E7 Stepper #if E_STEPPERS > 7 + #ifndef E7_ENABLE_INIT_STATE + #define E7_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E7_ENABLE_INIT #define E7_ENABLE_INIT() SET_OUTPUT(E7_ENABLE_PIN) #define E7_ENABLE_WRITE(STATE) WRITE(E7_ENABLE_PIN,STATE) From 43177af21c279e48f41f2ad8bcaf9a0c294e6b3b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 30 Mar 2025 14:57:01 -0500 Subject: [PATCH 043/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Dig?= =?UTF-8?q?ipot=20settings=20cleanup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/settings.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index c2b4e3da38..4205261a3c 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3712,7 +3712,7 @@ void MarlinSettings::reset() { #if HAS_MOTOR_CURRENT_PWM constexpr uint32_t tmp_motor_current_setting[MOTOR_CURRENT_COUNT] = PWM_MOTOR_CURRENT; for (uint8_t q = 0; q < MOTOR_CURRENT_COUNT; ++q) - stepper.set_digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q])); + stepper.set_digipot_current(q, tmp_motor_current_setting[q]); #endif // @@ -3720,10 +3720,8 @@ void MarlinSettings::reset() { // #if HAS_MOTOR_CURRENT_SPI static constexpr uint32_t tmp_motor_current_setting[] = DIGIPOT_MOTOR_CURRENT; - DEBUG_ECHOLNPGM("Writing Digipot"); for (uint8_t q = 0; q < COUNT(tmp_motor_current_setting); ++q) stepper.set_digipot_current(q, tmp_motor_current_setting[q]); - DEBUG_ECHOLNPGM("Digipot Written"); #endif // From d2b47c354c496896866de07907e355ff96e453dd Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 31 Mar 2025 00:31:54 +0000 Subject: [PATCH 044/101] [cron] Bump distribution date (2025-03-31) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index a0cbd5cf9b..d49c6c4e3b 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-30" +//#define STRING_DISTRIBUTION_DATE "2025-03-31" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index b717290a77..5ee57c2fc0 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-30" + #define STRING_DISTRIBUTION_DATE "2025-03-31" #endif /** From 15ce5d06127553050d20f1e92cca8b67bdbddf66 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 30 Mar 2025 23:30:31 -0500 Subject: [PATCH 045/101] =?UTF-8?q?=F0=9F=94=A8=F0=9F=A9=B9=20Misc.=20code?= =?UTF-8?q?=20corrections,=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/gcode/feature/digipot/M907-M910.cpp | 29 ++++++++++++++----- Marlin/src/inc/Conditionals-6-type.h | 2 +- Marlin/src/inc/SanityCheck.h | 8 ++--- Marlin/src/module/stepper.cpp | 2 +- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index ab1c316705..b1bd9b4f95 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -51,10 +51,25 @@ void GcodeSuite::M907() { if (!parser.seen("BS" STR_AXES_LOGICAL)) return M907_report(); - if (parser.seenval('S')) for (uint8_t i = 0; i < MOTOR_CURRENT_COUNT; ++i) stepper.set_digipot_current(i, parser.value_int()); - LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper.set_digipot_current(i, parser.value_int()); // X Y Z (I J K U V W) E (map to drivers according to DIGIPOT_CHANNELS. Default with NUM_AXES 3: map X Y Z E to X Y Z E0) - // Additional extruders use B,C. - // TODO: Change these parameters because 'E' is used and D should be reserved for debugging. B? + // S - Set current in mA for all axes + if (parser.seenval('S')) + for (uint8_t i = 0; i < MOTOR_CURRENT_COUNT; ++i) + stepper.set_digipot_current(i, parser.value_int()); + + // X Y Z (I J K U V W) E (map to drivers according to DIGIPOT_CHANNELS. + // Default with NUM_AXES 3: map X Y Z E to X Y Z E0) + LOOP_LOGICAL_AXES(i) + if (parser.seenval(IAXIS_CHAR(i))) + stepper.set_digipot_current(i, parser.value_int()); + + /** + * Additional extruders use B,C in this legacy protocol + * TODO: Update to allow for an index with X, Y, Z, E axis to isolate a single stepper + * and use configured axis names instead of IJKUVW. i.e., Match the behavior of + * other G-codes that set stepper-specific parameters. If necessary deprecate G-codes. + * Bonus Points: Standardize a method that all G-codes can use to refer to one or + * more steppers/drivers and apply to various G-codes. + */ #if E_STEPPERS >= 2 if (parser.seenval('B')) stepper.set_digipot_current(E_AXIS + 1, parser.value_int()); #if E_STEPPERS >= 3 @@ -72,14 +87,12 @@ void GcodeSuite::M907() { if (!parser.seen("S" #if HAS_X_Y_XY_I_J_K_U_V_W - "XY" SECONDARY_AXIS_GANG("I", "J", "K", "U", "V", "W") + NUM_AXIS_GANG("X", "Y",, "I", "J", "K", "U", "V", "W") #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) "Z" #endif - #if HAS_MOTOR_CURRENT_PWM_E - "E" - #endif + TERN_(HAS_MOTOR_CURRENT_PWM_E, "E") )) return M907_report(); if (parser.seenval('S')) for (uint8_t a = 0; a < MOTOR_CURRENT_COUNT; ++a) stepper.set_digipot_current(a, parser.value_int()); diff --git a/Marlin/src/inc/Conditionals-6-type.h b/Marlin/src/inc/Conditionals-6-type.h index bd8e3b78b4..9f0c0c3564 100644 --- a/Marlin/src/inc/Conditionals-6-type.h +++ b/Marlin/src/inc/Conditionals-6-type.h @@ -38,7 +38,7 @@ #endif // If an axis's Homing Current differs from standard current... -#define HAS_HOME_CURRENT(N) (N##_CURRENT_HOME > 0 && N##_CURRENT_HOME != N##_CURRENT) +#define HAS_HOME_CURRENT(N) TERN0(EDITABLE_HOMING_CURRENT, N##_IS_TRINAMIC && N##_HOME_DIR != 0) || (N##_CURRENT_HOME > 0 && N##_CURRENT_HOME != N##_CURRENT) #if HAS_HOME_CURRENT(X) #define X_HAS_HOME_CURRENT 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 1a86bb37de..62e16b0156 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1890,7 +1890,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i /** * ULTIPANEL encoder */ -#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !PIN_EXISTS(SHIFT_CLK) +#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL) && !PIN_EXISTS(SHIFT_CLK) #error "ULTIPANEL controllers require some kind of encoder." #endif @@ -4041,11 +4041,11 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." #elif _PIN_CONFLICT(CONTROLLERFAN) #error "SPINDLE_LASER_PWM_PIN conflicts with CONTROLLERFAN_PIN." #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_XY) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_XY." + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_XY_PIN." #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_Z) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_Z." + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_Z_PIN." #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_E) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_E." + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_E_PIN." #endif #endif #undef _PIN_CONFLICT diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index f55465ea56..3ee2d6e91c 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -3673,7 +3673,7 @@ void Stepper::report_positions() { #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) { - if (WITHIN(driver, 0, MOTOR_CURRENT_COUNT - 1)) + if (WITHIN(driver, 0, COUNT(motor_current_setting) - 1)) motor_current_setting[driver] = current; // update motor_current_setting if (!initialized) return; From d638ee02c6ece3df4c552866ce1f1009a00b5bc1 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 1 Apr 2025 00:34:19 +0000 Subject: [PATCH 046/101] [cron] Bump distribution date (2025-04-01) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index d49c6c4e3b..bb3996fb73 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-31" +//#define STRING_DISTRIBUTION_DATE "2025-04-01" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 5ee57c2fc0..64a8aded74 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-31" + #define STRING_DISTRIBUTION_DATE "2025-04-01" #endif /** From 766dfda80e57335d11aee8501cc36606f7d2d2f9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 31 Mar 2025 21:55:58 -0500 Subject: [PATCH 047/101] =?UTF-8?q?=F0=9F=94=A8=F0=9F=A9=B9=20Pass=20Ultip?= =?UTF-8?q?anel=20with=20ADC=5FKEYPAD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/SanityCheck.h | 2 +- buildroot/tests/sanguino1284p | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 62e16b0156..cdd87b1e93 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1890,7 +1890,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i /** * ULTIPANEL encoder */ -#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL) && !PIN_EXISTS(SHIFT_CLK) +#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL) && !ANY_PIN(SHIFT_CLK, ADC_KEYPAD) #error "ULTIPANEL controllers require some kind of encoder." #endif diff --git a/buildroot/tests/sanguino1284p b/buildroot/tests/sanguino1284p index 345383cc70..0e861892d8 100755 --- a/buildroot/tests/sanguino1284p +++ b/buildroot/tests/sanguino1284p @@ -14,7 +14,7 @@ opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 \ LCD_LANGUAGE de \ CONTROLLER_FAN_PIN 27 opt_enable MINIPANEL USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE -exec_test $1 $2 "Default Configuration | MINIPANAL | CONTROLLER_FAN" "$3" +exec_test $1 $2 "Default Configuration | MINIPANEL | CONTROLLER_FAN" "$3" # # Start with default configurations... From 99b790cc92a3af0c58058271d3669723149c178d Mon Sep 17 00:00:00 2001 From: Boyd Date: Mon, 31 Mar 2025 20:30:23 -0700 Subject: [PATCH 048/101] =?UTF-8?q?=F0=9F=94=A8=20Fix=20GCC14=20/=20C++23?= =?UTF-8?q?=20volatile=20warnings=20(#27768)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/planner.cpp | 4 +++- Marlin/src/module/planner.h | 6 +++++- ini/gd32.ini | 1 - 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 630557180b..561d13fa2a 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1582,7 +1582,9 @@ void Planner::quick_stop() { const bool was_enabled = stepper.suspend(); // Drop all queue entries - block_buffer_nonbusy = block_buffer_head = block_buffer_tail; + const uint8_t tail_value = block_buffer_tail; // Read tail value once + block_buffer_head = tail_value; + block_buffer_nonbusy = tail_value; // Restart the block delay for the first movement - As the queue was // forced to empty, there's no risk the ISR will touch this. diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index b2df5824de..318be33131 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -816,7 +816,11 @@ class Planner { FORCE_INLINE static uint8_t nonbusy_movesplanned() { return block_dec_mod(block_buffer_head, block_buffer_nonbusy); } // Remove all blocks from the buffer - FORCE_INLINE static void clear_block_buffer() { block_buffer_nonbusy = block_buffer_head = block_buffer_tail = 0; } + FORCE_INLINE static void clear_block_buffer() { + block_buffer_tail = 0; + block_buffer_head = 0; + block_buffer_nonbusy = 0; + } // Check if movement queue is full FORCE_INLINE static bool is_full() { return block_buffer_tail == next_block_index(block_buffer_head); } diff --git a/ini/gd32.ini b/ini/gd32.ini index 2e5bcea3b5..1286772786 100644 --- a/ini/gd32.ini +++ b/ini/gd32.ini @@ -21,7 +21,6 @@ build_flags = -std=gnu++23 -DADC_RESOLUTION=12 -DCORE_DEBUG -Wno-deprecated-declarations - -Wno-volatile extra_scripts = ${common.extra_scripts} # From 59423da42fe3d94003ec98e2de9bb432bf350512 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 31 Mar 2025 21:19:14 -0500 Subject: [PATCH 049/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20HAS?= =?UTF-8?q?=5FMOTOR=5FCURRENT=5FPWM=5FZ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/DUE/fastio/G2_PWM.cpp | 25 ++--- .../src/gcode/feature/digipot/M907-M910.cpp | 96 +++++++++++++------ Marlin/src/inc/Conditionals-5-post.h | 5 +- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/module/stepper.cpp | 6 +- Marlin/src/pins/pinsDebug_list.h | 2 +- 6 files changed, 88 insertions(+), 48 deletions(-) diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp index 5cf86f147c..403e3356e1 100644 --- a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp +++ b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp @@ -56,16 +56,12 @@ #else #define G2_PWM_Y 0 #endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) +#if HAS_MOTOR_CURRENT_PWM_Z #define G2_PWM_Z 1 #else #define G2_PWM_Z 0 #endif -#if HAS_MOTOR_CURRENT_PWM_E - #define G2_PWM_E 1 -#else - #define G2_PWM_E 0 -#endif +#define G2_PWM_E HAS_MOTOR_CURRENT_PWM_E #define G2_MASK_X(V) (G2_PWM_X * (V)) #define G2_MASK_Y(V) (G2_PWM_Y * (V)) #define G2_MASK_Z(V) (G2_PWM_Z * (V)) @@ -80,17 +76,22 @@ PWM_map ISR_table[NUM_PWMS] = PWM_MAP_INIT; void Stepper::digipot_init() { - #if PIN_EXISTS(MOTOR_CURRENT_PWM_X) - OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, 0); // init pins + #if G2_PWM_X + OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, LOW); // init pins #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) - OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, 0); + #if G2_PWM_Y + OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, LOW); #endif #if G2_PWM_Z - OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, 0); + OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, LOW); #endif #if G2_PWM_E - OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, 0); + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, LOW); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E0) + OUT_WRITE(MOTOR_CURRENT_PWM_E0_PIN, LOW); + #endif #endif #define WPKEY (0x50574D << 8) // “PWM” in ASCII diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index b1bd9b4f95..a73f88ca89 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -46,6 +46,7 @@ * Set percentage of max current for all axes (Requires HAS_DIGIPOT_DAC) */ void GcodeSuite::M907() { + #if HAS_MOTOR_CURRENT_SPI if (!parser.seen("BS" STR_AXES_LOGICAL)) @@ -56,8 +57,9 @@ void GcodeSuite::M907() { for (uint8_t i = 0; i < MOTOR_CURRENT_COUNT; ++i) stepper.set_digipot_current(i, parser.value_int()); - // X Y Z (I J K U V W) E (map to drivers according to DIGIPOT_CHANNELS. - // Default with NUM_AXES 3: map X Y Z E to X Y Z E0) + // X Y Z I J K U V W E + // Map to drivers according to pots addresses. + // Default with NUM_AXES 3: map X Y Z E to X Y Z E0. LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper.set_digipot_current(i, parser.value_int()); @@ -83,56 +85,88 @@ void GcodeSuite::M907() { #define HAS_X_Y_XY_I_J_K_U_V_W 1 #endif - #if HAS_X_Y_XY_I_J_K_U_V_W || HAS_MOTOR_CURRENT_PWM_E || PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if ANY(HAS_X_Y_XY_I_J_K_U_V_W, HAS_MOTOR_CURRENT_PWM_E, HAS_MOTOR_CURRENT_PWM_Z) if (!parser.seen("S" #if HAS_X_Y_XY_I_J_K_U_V_W NUM_AXIS_GANG("X", "Y",, "I", "J", "K", "U", "V", "W") #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - "Z" - #endif + TERN_(HAS_MOTOR_CURRENT_PWM_Z, "Z") TERN_(HAS_MOTOR_CURRENT_PWM_E, "E") )) return M907_report(); - if (parser.seenval('S')) for (uint8_t a = 0; a < MOTOR_CURRENT_COUNT; ++a) stepper.set_digipot_current(a, parser.value_int()); + // S - Set all stepper current to the same value + if (parser.seenval('S')) { + const int16_t v = parser.value_int(); + for (uint8_t a = 0; a < MOTOR_CURRENT_COUNT; ++a) + stepper.set_digipot_current(a, v); + } - #if HAS_X_Y_XY_I_J_K_U_V_W - if (NUM_AXIS_GANG( - parser.seenval('X'), || parser.seenval('Y'), || false, - || parser.seenval('I'), || parser.seenval('J'), || parser.seenval('K'), - || parser.seenval('U'), || parser.seenval('V'), || parser.seenval('W') - )) stepper.set_digipot_current(0, parser.value_int()); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - if (parser.seenval('Z')) stepper.set_digipot_current(1, parser.value_int()); - #endif - #if HAS_MOTOR_CURRENT_PWM_E - if (parser.seenval('E')) stepper.set_digipot_current(2, parser.value_int()); - #endif + // X Y I J K U V W - All aliases to set the current for "most axes." + // Only the value of the last given parameter is used. + if (ENABLED(HAS_X_Y_XY_I_J_K_U_V_W) && NUM_AXIS_GANG( + parser.seenval('X'), || parser.seenval('Y'), || false, + || parser.seenval('I'), || parser.seenval('J'), || parser.seenval('K'), + || parser.seenval('U'), || parser.seenval('V'), || parser.seenval('W') + )) + stepper.set_digipot_current(0, parser.value_int()); + + // Z - Set the current just for the Z axis + if (TERN0(HAS_MOTOR_CURRENT_PWM_Z, parser.seenval('Z'))) + stepper.set_digipot_current(1, parser.value_int()); + + // Z - Set the current just for the Extruder + if (TERN0(HAS_MOTOR_CURRENT_PWM_E, parser.seenval('E'))) + stepper.set_digipot_current(2, parser.value_int()); #endif #endif // HAS_MOTOR_CURRENT_PWM #if HAS_MOTOR_CURRENT_I2C - // this one uses actual amps in floating point - if (parser.seenval('S')) for (uint8_t q = 0; q < DIGIPOT_I2C_NUM_CHANNELS; ++q) digipot_i2c.set_current(q, parser.value_float()); - LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) digipot_i2c.set_current(i, parser.value_float()); // X Y Z (I J K U V W) E (map to drivers according to pots adresses. Default with NUM_AXES 3 X Y Z E: map to X Y Z E0) + // This current driver takes actual Amps in floating point + // rather than milli-amps or some scalar unit. + + // S - Set the same current in Amps on all channels + if (parser.seenval('S')) { + const float v = parser.value_float(); + for (uint8_t q = 0; q < DIGIPOT_I2C_NUM_CHANNELS; ++q) + digipot_i2c.set_current(q, v); + } + + // X Y Z I J K U V W E + // Map to drivers according to pots addresses. + // Default with NUM_AXES 3: map X Y Z E to X Y Z E0. + LOOP_LOGICAL_AXES(i) + if (parser.seenval(IAXIS_CHAR(i))) + digipot_i2c.set_current(i, parser.value_float()); + // Additional extruders use B,C,D. - // TODO: Change these parameters because 'E' is used and because 'D' should be reserved for debugging. B? + // TODO: Make parameters work like other axis-specific / stepper-specific. See above. #if E_STEPPERS >= 2 for (uint8_t i = E_AXIS + 1; i < _MAX(DIGIPOT_I2C_NUM_CHANNELS, (NUM_AXES + 3)); i++) - if (parser.seenval('B' + i - (E_AXIS + 1))) digipot_i2c.set_current(i, parser.value_float()); + if (parser.seenval('B' + i - (E_AXIS + 1))) + digipot_i2c.set_current(i, parser.value_float()); #endif - #endif + + #endif // HAS_MOTOR_CURRENT_I2C #if HAS_MOTOR_CURRENT_DAC + + // S - Set the same current percentage on all axes if (parser.seenval('S')) { const float dac_percent = parser.value_float(); - LOOP_LOGICAL_AXES(i) stepper_dac.set_current_percent(i, dac_percent); + LOOP_LOGICAL_AXES(i) + stepper_dac.set_current_percent(i, dac_percent); } - LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper_dac.set_current_percent(i, parser.value_float()); // X Y Z (I J K U V W) E (map to drivers according to DAC_STEPPER_ORDER. Default with NUM_AXES 3: X Y Z E map to X Y Z E0) + + // X Y Z I J K U V W E + // Map to drivers according to pots addresses. + // Default with NUM_AXES 3: map X Y Z E to X Y Z E0. + LOOP_LOGICAL_AXES(i) + if (parser.seenval(IAXIS_CHAR(i))) + stepper_dac.set_current_percent(i, parser.value_float()); + #endif } @@ -144,8 +178,10 @@ void GcodeSuite::M907() { report_heading_etc(forReplay, F(STR_STEPPER_MOTOR_CURRENTS)); #if HAS_MOTOR_CURRENT_PWM SERIAL_ECHOLNPGM_P( // PWM-based has 3 values: - PSTR(" M907 X"), stepper.motor_current_setting[0] // X, Y, (I, J, K, U, V, W) - , SP_Z_STR, stepper.motor_current_setting[1] // Z + PSTR(" M907 X"), stepper.motor_current_setting[0] // X, Y, (I, J, K, U, V, W) + #if HAS_MOTOR_CURRENT_PWM_Z + , SP_Z_STR, stepper.motor_current_setting[1] // Z + #endif #if HAS_MOTOR_CURRENT_PWM_E , SP_E_STR, stepper.motor_current_setting[2] // E #endif diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index f83c063d11..9b16f515d6 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -2993,7 +2993,10 @@ #if ANY_PIN(MOTOR_CURRENT_PWM_E, MOTOR_CURRENT_PWM_E0, MOTOR_CURRENT_PWM_E1) #define HAS_MOTOR_CURRENT_PWM_E 1 #endif -#if HAS_MOTOR_CURRENT_PWM_E || ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W) +#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #define HAS_MOTOR_CURRENT_PWM_Z 1 +#endif +#if HAS_MOTOR_CURRENT_PWM_Z || HAS_MOTOR_CURRENT_PWM_E || ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W) #define HAS_MOTOR_CURRENT_PWM 1 #endif diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index b886902d91..99ece89f27 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -88,7 +88,7 @@ void menu_backlash(); #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y) EDIT_CURRENT_PWM(STR_A STR_B, 0); #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z EDIT_CURRENT_PWM(STR_C, 1); #endif #if HAS_MOTOR_CURRENT_PWM_E diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 3ee2d6e91c..85c7521960 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -3654,7 +3654,7 @@ void Stepper::report_positions() { #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W) case 0: #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z case 1: #endif #if HAS_MOTOR_CURRENT_PWM_E @@ -3719,7 +3719,7 @@ void Stepper::report_positions() { #endif break; case 1: - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z _WRITE_CURRENT_PWM(Z); #endif break; @@ -3784,7 +3784,7 @@ void Stepper::report_positions() { #if PIN_EXISTS(MOTOR_CURRENT_PWM_W) INIT_CURRENT_PWM(W); #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z INIT_CURRENT_PWM(Z); #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index fe7f1d21ee..ad17fe2436 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -1119,7 +1119,7 @@ #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_XY_PIN) #endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) +#if HAS_MOTOR_CURRENT_PWM_Z REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_Z_PIN) #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_I) From 2004198b078e8809540e3cd56dfaaf3bbf610ee3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 31 Mar 2025 22:53:31 -0500 Subject: [PATCH 050/101] =?UTF-8?q?=F0=9F=94=A8=F0=9F=A9=B9=20Pass=20Ultip?= =?UTF-8?q?anel=20with=20TOUCH=5FSCREEN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/SanityCheck.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index cdd87b1e93..b09bc9854a 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1888,9 +1888,9 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #endif /** - * ULTIPANEL encoder + * ULTIPANEL expects an encoder */ -#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL) && !ANY_PIN(SHIFT_CLK, ADC_KEYPAD) +#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL, TOUCH_SCREEN) && !ANY_PIN(SHIFT_CLK, ADC_KEYPAD) #error "ULTIPANEL controllers require some kind of encoder." #endif From 546a014a59a0488452ed3f4e0d2aab2ec1615e47 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 31 Mar 2025 23:33:32 -0500 Subject: [PATCH 051/101] =?UTF-8?q?=F0=9F=94=A8=F0=9F=A9=B9=20Pass=20Ultip?= =?UTF-8?q?anel=20with=20HAS=5FTOUCH=5FBUTTONS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/SanityCheck.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b09bc9854a..ad05fba2a3 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1890,7 +1890,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i /** * ULTIPANEL expects an encoder */ -#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL, TOUCH_SCREEN) && !ANY_PIN(SHIFT_CLK, ADC_KEYPAD) +#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL, TOUCH_SCREEN, HAS_TOUCH_BUTTONS) && !ANY_PIN(SHIFT_CLK, ADC_KEYPAD) #error "ULTIPANEL controllers require some kind of encoder." #endif From a80e790cf651d3b2dc85c4bb8a9ab77dcb70ec28 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 1 Apr 2025 01:22:15 -0500 Subject: [PATCH 052/101] =?UTF-8?q?=F0=9F=94=A8=F0=9F=A9=B9=20Pass=20Ultip?= =?UTF-8?q?anel=20with=20HAS=5FSLOW=5FBUTTONS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/SanityCheck.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index ad05fba2a3..5b1aa0bb2b 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1890,7 +1890,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i /** * ULTIPANEL expects an encoder */ -#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL, TOUCH_SCREEN, HAS_TOUCH_BUTTONS) && !ANY_PIN(SHIFT_CLK, ADC_KEYPAD) +#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL, TOUCH_SCREEN, HAS_TOUCH_BUTTONS, HAS_SLOW_BUTTONS) && !ANY_PIN(SHIFT_CLK, ADC_KEYPAD) #error "ULTIPANEL controllers require some kind of encoder." #endif From 26551c17c2248d2209190f6f1727fa599e2c8d10 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 1 Apr 2025 02:38:40 -0500 Subject: [PATCH 053/101] =?UTF-8?q?=F0=9F=94=A8=F0=9F=A9=B9=20Drop=20old?= =?UTF-8?q?=20ULTIPANEL=20sanity=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/SanityCheck.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 5b1aa0bb2b..1505b8b896 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1888,12 +1888,8 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #endif /** - * ULTIPANEL expects an encoder + * Encoder pulses must be positive */ -#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL, TOUCH_SCREEN, HAS_TOUCH_BUTTONS, HAS_SLOW_BUTTONS) && !ANY_PIN(SHIFT_CLK, ADC_KEYPAD) - #error "ULTIPANEL controllers require some kind of encoder." -#endif - #if ENCODER_PULSES_PER_STEP < 0 #error "ENCODER_PULSES_PER_STEP should not be negative, use REVERSE_MENU_DIRECTION instead." #endif From 30a10077cffd5ae939a20aea0d9e7f881cb62ace Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 1 Apr 2025 03:11:43 -0500 Subject: [PATCH 054/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Men?= =?UTF-8?q?u=20code=20cleanup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/marlinui.cpp | 44 +++++++++++++-------------- Marlin/src/lcd/menu/menu_filament.cpp | 17 ++++------- Marlin/src/lcd/menu/menu_item.h | 5 ++- 3 files changed, 29 insertions(+), 37 deletions(-) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 2114209b98..384bf65211 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -527,29 +527,27 @@ void MarlinUI::init() { #define ADC_MIN_KEY_DELAY 100 if (keypad_buttons) { - #if HAS_ENCODER_ACTION - refresh(LCDVIEW_REDRAW_NOW); - #if HAS_MARLINUI_MENU - if (encoderDirection == -(ENCODERBASE)) { // HAS_ADC_BUTTONS forces REVERSE_MENU_DIRECTION, so this indicates menu navigation - if (RRK(EN_KEYPAD_UP)) encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; - else if (RRK(EN_KEYPAD_DOWN)) encoderPosition -= ENCODER_STEPS_PER_MENU_ITEM; - else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } - else if (RRK(EN_KEYPAD_RIGHT)) { return_to_status(); quick_feedback(); } - } - else - #endif - { - #if HAS_MARLINUI_MENU - if (RRK(EN_KEYPAD_UP)) encoderPosition -= epps; - else if (RRK(EN_KEYPAD_DOWN)) encoderPosition += epps; - else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } - else if (RRK(EN_KEYPAD_RIGHT)) encoderPosition = 0; - #else - if (RRK(EN_KEYPAD_UP) || RRK(EN_KEYPAD_LEFT)) encoderPosition -= epps; - else if (RRK(EN_KEYPAD_DOWN) || RRK(EN_KEYPAD_RIGHT)) encoderPosition += epps; - #endif + refresh(LCDVIEW_REDRAW_NOW); + #if HAS_MARLINUI_MENU + if (encoderDirection == -(ENCODERBASE)) { // HAS_ADC_BUTTONS forces REVERSE_MENU_DIRECTION, so this indicates menu navigation + if (RRK(EN_KEYPAD_UP)) encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; + else if (RRK(EN_KEYPAD_DOWN)) encoderPosition -= ENCODER_STEPS_PER_MENU_ITEM; + else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } + else if (RRK(EN_KEYPAD_RIGHT)) { return_to_status(); quick_feedback(); } } + else #endif + { + #if HAS_MARLINUI_MENU + if (RRK(EN_KEYPAD_UP)) encoderPosition -= epps; + else if (RRK(EN_KEYPAD_DOWN)) encoderPosition += epps; + else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } + else if (RRK(EN_KEYPAD_RIGHT)) encoderPosition = 0; + #else + if (RRK(EN_KEYPAD_UP) || RRK(EN_KEYPAD_LEFT)) encoderPosition -= epps; + else if (RRK(EN_KEYPAD_DOWN) || RRK(EN_KEYPAD_RIGHT)) encoderPosition += epps; + #endif + } next_button_update_ms = millis() + ADC_MIN_KEY_DELAY; return true; } @@ -1337,11 +1335,11 @@ void MarlinUI::init() { const int8_t pulses = epps * encoderDirection; if (BUTTON_PRESSED(UP)) { - encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * pulses; + encoderDiff = pulses * (ENCODER_STEPS_PER_MENU_ITEM); next_button_update_ms = now + 300; } else if (BUTTON_PRESSED(DOWN)) { - encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * pulses; + encoderDiff = pulses * -(ENCODER_STEPS_PER_MENU_ITEM); next_button_update_ms = now + 300; } else if (BUTTON_PRESSED(LEFT)) { diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 46ebf85ba4..8d6e1b8adb 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -235,18 +235,15 @@ static FSTR_P pause_header() { // Portions from STATIC_ITEM... #define HOTEND_STATUS_ITEM() do { \ - if (_menuLineNr == _thisItemNr) { \ + if ( MY_LINE()) { \ if (ui.should_draw()) { \ IF_DISABLED(HAS_GRAPHICAL_TFT, MenuItem_static::draw(_lcdLineNr, GET_TEXT_F(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT)); \ ui.draw_hotend_status(_lcdLineNr, hotend_status_extruder); \ } \ - if (_skipStatic && encoderLine <= _thisItemNr) { \ - ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ - ++encoderLine; \ - } \ + STATIC_SKIP(); \ ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); \ } \ - ++_thisItemNr; \ + NEXT_ITEM(); \ }while(0) void menu_pause_option() { @@ -307,11 +304,9 @@ void lcd_pause_waiting_message() { _lcd_pause_message(GET_TEXT_F(MSG_ADVANCED_P void lcd_pause_resume_message() { _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); } void lcd_pause_purge_message() { - #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) - _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_CONT_PURGE)); - #else - _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_PURGE)); - #endif + _lcd_pause_message(GET_TEXT_F( + TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE) + )); } FORCE_INLINE screenFunc_t ap_message_screen(const PauseMessage message) { diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index d81b1a8843..df2c90425c 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -401,7 +401,7 @@ class MenuItem_bool : public MenuEditItemBase { #define PSTRING_ITEM_F_P(FLABEL, PVAL, STYL) do{ \ constexpr int m = 20; \ char msg[m + 1]; \ - if (_menuLineNr == _thisItemNr) { \ + if (MY_LINE()) { \ msg[0] = ':'; msg[1] = ' '; \ strlcpy_P(msg + 2, PVAL, m - 1); \ if (msg[m - 1] & 0x80) msg[m - 1] = '\0'; \ @@ -410,8 +410,7 @@ class MenuItem_bool : public MenuEditItemBase { }while(0) #define PSTRING_ITEM_N_F_P(N, V...) do{ \ - if (_menuLineNr == _thisItemNr) \ - MenuItemBase::init(N); \ + if (MY_LINE()) MenuItemBase::init(N); \ PSTRING_ITEM_F_P(V); \ }while(0) From 13db322f0ef5ef6ccb093c0794eb73a653a4e548 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 1 Apr 2025 04:32:04 -0500 Subject: [PATCH 055/101] =?UTF-8?q?=F0=9F=8E=A8=20GD32=20MFL=20followup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #27744 --- Marlin/src/HAL/GD32_MFL/MinSerial.cpp | 2 +- Marlin/src/HAL/GD32_MFL/SDCard.h | 12 ++++++------ Marlin/src/HAL/GD32_MFL/timers.cpp | 10 +++++----- Marlin/src/HAL/GD32_MFL/timers.h | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Marlin/src/HAL/GD32_MFL/MinSerial.cpp b/Marlin/src/HAL/GD32_MFL/MinSerial.cpp index d5e8147798..2cc79c8853 100644 --- a/Marlin/src/HAL/GD32_MFL/MinSerial.cpp +++ b/Marlin/src/HAL/GD32_MFL/MinSerial.cpp @@ -95,7 +95,7 @@ static void MinSerialBegin() { volatile uint32_t ICER[32]; }; NVICMin *nvicBase = (NVICMin*)0xE000E100; - + SBI32(nvicBase->ICER[nvicIndex >> 5], nvicIndex & 0x1F); // We require memory barriers to properly disable interrupts diff --git a/Marlin/src/HAL/GD32_MFL/SDCard.h b/Marlin/src/HAL/GD32_MFL/SDCard.h index b14063b69f..467482a605 100644 --- a/Marlin/src/HAL/GD32_MFL/SDCard.h +++ b/Marlin/src/HAL/GD32_MFL/SDCard.h @@ -160,12 +160,12 @@ private: info->csd.device_size = (static_cast(csd_bytes[6] & 0x03U) << 10U) | (static_cast(csd_bytes[7]) << 2U) | (static_cast((csd_bytes[8] & 0xC0U) >> 6U)); - info->csd.device_size_multiplier = static_cast((csd_bytes[9] & 0x03U) << 1U | + info->csd.device_size_multiplier = static_cast((csd_bytes[9] & 0x03U) << 1U | (csd_bytes[10] & 0x80U) >> 7U); info->block_size = static_cast(1 << info->csd.read_block_length); - info->capacity = static_cast((info->csd.device_size + 1U) * - (1U << (info->csd.device_size_multiplier + 2U)) * + info->capacity = static_cast((info->csd.device_size + 1U) * + (1U << (info->csd.device_size_multiplier + 2U)) * info->block_size); } @@ -175,15 +175,15 @@ private: static_cast(csd_bytes[9]); info->block_size = BLOCK_SIZE; - info->capacity = static_cast((info->csd.device_size + 1U) * + info->capacity = static_cast((info->csd.device_size + 1U) * BLOCK_SIZE * KILOBYTE); } void process_common_csd_tail(Card_Info* info, const uint8_t* csd_bytes) { - info->csd.sector_size = static_cast(((csd_bytes[9] & 0x3FU) << 1U) | + info->csd.sector_size = static_cast(((csd_bytes[9] & 0x3FU) << 1U) | (csd_bytes[10] & 0x80U) >> 7U); info->csd.speed_factor = static_cast((csd_bytes[11] & 0x1CU) >> 2U); - info->csd.write_block_length = static_cast(((csd_bytes[11] & 0x03U) << 2U) | + info->csd.write_block_length = static_cast(((csd_bytes[11] & 0x03U) << 2U) | ((csd_bytes[12] & 0xC0U) >> 6U)); info->csd.checksum = static_cast((csd_bytes[15] & 0xFEU) >> 1U); } diff --git a/Marlin/src/HAL/GD32_MFL/timers.cpp b/Marlin/src/HAL/GD32_MFL/timers.cpp index bdcf5ed0ed..5b2c2de7ef 100644 --- a/Marlin/src/HAL/GD32_MFL/timers.cpp +++ b/Marlin/src/HAL/GD32_MFL/timers.cpp @@ -97,10 +97,10 @@ uint32_t GetStepperTimerClkFreq() { /** * @brief Starts a hardware timer - * + * * If the timer is not already initialized, this function will initialize it with the given frequency. * The timer is started immediately after initialization - * + * * @param timer The timer base index to start * @param frequency The frequency at which the timer should run * @return None @@ -137,7 +137,7 @@ void HAL_timer_start(const uint8_t timer_number, const uint32_t frequency) { /** * @brief Enables the interrupt for the specified timer - * + * * @param handle The timer handle for which to enable the interrupt * @return None */ @@ -154,7 +154,7 @@ void HAL_timer_enable_interrupt(const uint8_t timer_number) { /** * @brief Disables the interrupt for the specified timer - * + * * @param handle The timer handle for which to disable the interrupt * @return None */ @@ -168,7 +168,7 @@ void HAL_timer_disable_interrupt(const uint8_t timer_number) { /** * @brief Checks if the interrupt is enabled for the specified timer - * + * * @param handle The timer handle to check * @return True if the interrupt is enabled, false otherwise */ diff --git a/Marlin/src/HAL/GD32_MFL/timers.h b/Marlin/src/HAL/GD32_MFL/timers.h index 539f599a16..0eb6bd563a 100644 --- a/Marlin/src/HAL/GD32_MFL/timers.h +++ b/Marlin/src/HAL/GD32_MFL/timers.h @@ -123,8 +123,8 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_number) GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; - return (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) - ? timer.getCounter(TimerFormat::TICK) + return (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) + ? timer.getCounter(TimerFormat::TICK) : 0U; } From 2f7d88d5c3f6b102bc97193dc6f7f17e0094c6f9 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 2 Apr 2025 00:30:08 +0000 Subject: [PATCH 056/101] [cron] Bump distribution date (2025-04-02) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index bb3996fb73..7ca68426b9 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-01" +//#define STRING_DISTRIBUTION_DATE "2025-04-02" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 64a8aded74..ac704f4af4 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-01" + #define STRING_DISTRIBUTION_DATE "2025-04-02" #endif /** From 9758f5e0ce28ae934ea4e96aa68a84ee272b5917 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 1 Apr 2025 23:28:20 -0500 Subject: [PATCH 057/101] =?UTF-8?q?=F0=9F=93=9D=20Informative=20PID=20comm?= =?UTF-8?q?ents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 16 +++++++++------- Marlin/Configuration_adv.h | 14 +++++++------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 9a96169646..08ef067328 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -696,8 +696,9 @@ #define PID_K1 0.95 // Smoothing factor within any PID loop #if ENABLED(PIDTEMP) - //#define MIN_POWER 0 - //#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to toggle activation. + //#define MIN_POWER 0 // Min power to improve PID stability (0..PID_MAX). + // Get the power from the temperature report ('M105' => @:nnn) and try P*2-20 to P*2-10. + //#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to enable/disable. //#define PID_PARAMS_PER_HOTEND // Use separate PID parameters for each extruder (useful for mismatched extruders) // Set/get with G-code: M301 E[extruder number, 0-2] @@ -796,8 +797,9 @@ //#define PIDTEMPBED #if ENABLED(PIDTEMPBED) - //#define MIN_BED_POWER 0 - //#define PID_BED_DEBUG // Print Bed PID debug data to the serial port. + //#define MIN_BED_POWER 0 // Min power to improve PID stability (0..MAX_BED_POWER). + // Get the power from the temperature report ('M105' => B@:nnn) and try P*2-20 to P*2-10. + //#define PID_BED_DEBUG // Print Bed PID debug data to the serial port. Use 'M303 D' to enable/disable. // 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) // from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) @@ -878,12 +880,12 @@ #define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current #if ENABLED(PIDTEMPCHAMBER) - #define MIN_CHAMBER_POWER 0 - //#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port. + #define MIN_CHAMBER_POWER 0 // Min power to improve PID stability. (0..MAX_CHAMBER_POWER) + // Get the power from the temperature report ('M105' => C@:nnn) and try P*2-20 to P*2-10. + //#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port. Use 'M303 D' to enable/disable. // Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element // and placed inside the small Creality printer enclosure tent. - // #define DEFAULT_chamberKp 37.04 #define DEFAULT_chamberKi 1.40 #define DEFAULT_chamberKd 655.17 diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f24ece5986..2e0ca3d4a1 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1342,20 +1342,20 @@ //#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..." //#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved" - #define CALIBRATION_FEEDRATE_SLOW 60 // mm/min - #define CALIBRATION_FEEDRATE_FAST 1200 // mm/min - #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/min + #define CALIBRATION_FEEDRATE_SLOW 60 // (mm/min) + #define CALIBRATION_FEEDRATE_FAST 1200 // (mm/min) + #define CALIBRATION_FEEDRATE_TRAVEL 3000 // (mm/min) // The following parameters refer to the conical section of the nozzle tip. - #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm - #define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm + #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // (mm) + #define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // (mm) // Uncomment to enable reporting (required for "G425 V", but consumes flash). //#define CALIBRATION_REPORTING // The true location and dimension the cube/bolt/washer on the bed. - #define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm - #define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm + #define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // (mm) + #define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // (mm) // Comment out any sides which are unreachable by the probe. For best // auto-calibration results, all sides must be reachable. From a4c35b1555948a31ce0ac5d15a61617ced31a2d3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 1 Apr 2025 23:40:22 -0500 Subject: [PATCH 058/101] =?UTF-8?q?=F0=9F=9A=B8=20Disable=20MIN=5FCHAMBER?= =?UTF-8?q?=5FPOWER?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 08ef067328..69cae47ee1 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -880,9 +880,9 @@ #define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current #if ENABLED(PIDTEMPCHAMBER) - #define MIN_CHAMBER_POWER 0 // Min power to improve PID stability. (0..MAX_CHAMBER_POWER) - // Get the power from the temperature report ('M105' => C@:nnn) and try P*2-20 to P*2-10. - //#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port. Use 'M303 D' to enable/disable. + //#define MIN_CHAMBER_POWER 0 // Min power to improve PID stability. (0..MAX_CHAMBER_POWER) + // Get the power from the temperature report ('M105' => C@:nnn) and try P*2-20 to P*2-10. + //#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port. Use 'M303 D' to enable/disable. // Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element // and placed inside the small Creality printer enclosure tent. From c6dad4d1aaea5756b0931e4f3b66590a2a5437f6 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 3 Apr 2025 00:29:22 +0000 Subject: [PATCH 059/101] [cron] Bump distribution date (2025-04-03) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 7ca68426b9..594f3546b6 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-02" +//#define STRING_DISTRIBUTION_DATE "2025-04-03" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index ac704f4af4..adb9112bfe 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-02" + #define STRING_DISTRIBUTION_DATE "2025-04-03" #endif /** From c080518b125303bea33caa21075c1fbfae192fa8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 4 Apr 2025 21:58:49 -0500 Subject: [PATCH 060/101] =?UTF-8?q?=F0=9F=8E=A8=20DGUS/MKS=20cosmetic=20fi?= =?UTF-8?q?xes,=20most?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/core/macros.h | 7 +- Marlin/src/gcode/control/M605.cpp | 2 +- Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp | 34 +- Marlin/src/lcd/extui/dgus/DGUSDisplay.h | 17 +- .../src/lcd/extui/dgus/DGUSScreenHandler.cpp | 50 +- Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h | 8 +- .../lcd/extui/dgus/DGUSScreenHandlerBase.h | 16 +- Marlin/src/lcd/extui/dgus/dgus_extui.cpp | 8 +- .../lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp | 6 +- .../lcd/extui/dgus/fysetc/DGUSDisplayDef.h | 2 +- .../extui/dgus/fysetc/DGUSScreenHandler.cpp | 22 +- .../lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp | 6 +- .../lcd/extui/dgus/hiprecy/DGUSDisplayDef.h | 2 +- .../extui/dgus/hiprecy/DGUSScreenHandler.cpp | 20 +- .../src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp | 24 +- .../src/lcd/extui/dgus/mks/DGUSDisplayDef.h | 385 +++-- .../lcd/extui/dgus/mks/DGUSScreenHandler.cpp | 1281 ++++++++--------- .../lcd/extui/dgus/mks/DGUSScreenHandler.h | 8 +- .../lcd/extui/dgus/origin/DGUSDisplayDef.cpp | 2 +- .../lcd/extui/dgus/origin/DGUSDisplayDef.h | 2 +- .../extui/dgus/origin/DGUSScreenHandler.cpp | 22 +- .../dgus_e3s1pro/DGUSSDCardHandler_Basic.cpp | 6 +- .../extui/dgus_e3s1pro/DGUSScreenHandler.cpp | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 2 +- Marlin/src/module/endstops.h | 2 +- Marlin/src/pins/samd/pins_MINITRONICS20.h | 2 +- buildroot/tests/FYSETC_F6 | 7 + 27 files changed, 941 insertions(+), 1004 deletions(-) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 344ab04e74..c75d684566 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -658,11 +658,8 @@ #define IF_ELSE(TF) _IF_ELSE(_BOOL(TF)) #define _IF_ELSE(TF) _CAT(_IF_, TF) -#define _IF_1(V...) V _IF_1_ELSE -#define _IF_0(...) _IF_0_ELSE - -#define _IF_1_ELSE(...) -#define _IF_0_ELSE(V...) V +#define _IF_1(V...) V OMIT +#define _IF_0(...) EMIT #define HAS_ARGS(V...) _BOOL(FIRST(_END_OF_ARGUMENTS_ V)()) #define _END_OF_ARGUMENTS_() 0 diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index 167cdae4a9..56d7594b08 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -115,7 +115,7 @@ else if (!parser.seen('W')) // if no S or W parameter, the DXC mode gets reset to the user's default dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; - #ifdef DEBUG_DXC_MODE + #if ENABLED(DEBUG_DXC_MODE) if (parser.seen('W')) { DEBUG_ECHO_START(); diff --git a/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp index 074dad96c2..94ea71817e 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp @@ -46,7 +46,7 @@ DGUSDisplay dgus; -#ifdef DEBUG_DGUS_COMM +#if ENABLED(DEBUG_DGUS_COMM) #define DEBUGLCDCOMM_ECHOPGM DEBUG_ECHOPGM #else #define DEBUGLCDCOMM_ECHOPGM(...) NOOP @@ -76,7 +76,22 @@ void DGUSDisplay::initDisplay() { requestScreen(TERN(SHOW_BOOTSCREEN, DGUS_SCREEN_BOOT, DGUS_SCREEN_MAIN)); } -void DGUSDisplay::writeVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr) { +void DGUSDisplay::writeVariable_P(uint16_t adr, const void *values, uint8_t valueslen, bool isstr/*=false*/) { + const char* myvalues = static_cast(values); + bool strend = !myvalues; + writeHeader(adr, DGUS_CMD_WRITEVAR, valueslen); + while (valueslen--) { + char x; + if (!strend) x = pgm_read_byte(myvalues++); + if ((isstr && !x) || strend) { + strend = true; + x = ' '; + } + LCD_SERIAL.write(x); + } +} + +void DGUSDisplay::writeVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr/*=false*/) { const char* myvalues = static_cast(values); bool strend = !myvalues; writeHeader(adr, DGUS_CMD_WRITEVAR, valueslen); @@ -120,21 +135,6 @@ void DGUSDisplay::writeVariable(uint16_t adr, long value) { writeVariable(adr, static_cast(&tmp), sizeof(long)); } -void DGUSDisplay::writeVariablePGM(uint16_t adr, const void *values, uint8_t valueslen, bool isstr) { - const char* myvalues = static_cast(values); - bool strend = !myvalues; - writeHeader(adr, DGUS_CMD_WRITEVAR, valueslen); - while (valueslen--) { - char x; - if (!strend) x = pgm_read_byte(myvalues++); - if ((isstr && !x) || strend) { - strend = true; - x = ' '; - } - LCD_SERIAL.write(x); - } -} - void DGUSDisplay::processRx() { #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) diff --git a/Marlin/src/lcd/extui/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/dgus/DGUSDisplay.h index 816360d3f3..6329d8fb23 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/dgus/DGUSDisplay.h @@ -60,15 +60,28 @@ public: static void initDisplay(); // Variable access. + static void writeVariable_P(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); static void writeVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); - static void writeVariablePGM(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); static void writeVariable(uint16_t adr, int16_t value); static void writeVariable(uint16_t adr, uint16_t value); static void writeVariable(uint16_t adr, uint8_t value); static void writeVariable(uint16_t adr, int8_t value); static void writeVariable(uint16_t adr, long value); - // Utility functions for bridging ui_api and dbus + static void writeStringVar_P(uint16_t adr, PGM_P const pstr, uint8_t vallen=32) { + writeVariable_P(adr, (const void *)pstr, vallen, true); + } + static void writeStringVar(uint16_t adr, const char * const cstr, uint8_t vallen=32) { + writeVariable(adr, (const void *)cstr, vallen, true); + } + static void writeStringVar(uint16_t adr, const uint16_t * const zhstr, uint8_t vallen=16) { + writeVariable(adr, (const void *)zhstr, vallen, true); + } + static void writeVariable(uint16_t adr, FSTR_P const fstr, uint8_t vallen=32) { + writeStringVar_P(adr, FTOP(fstr), vallen); + } + + // Utility functions for bridging ui_api and dgus template static void setVariable(DGUS_VP_Variable &var) { writeVariable(var.VP, (WireType)Getter(selector)); diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp index 00876f10e1..f85fc9beac 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp @@ -101,7 +101,7 @@ void DGUSScreenHandler::setStatusMessage(const char *msg) { } } -void DGUSScreenHandler::setstatusmessagePGM(PGM_P const msg) { +void DGUSScreenHandler::setStatusMessage_P(PGM_P const msg) { DGUS_VP_Variable ramcopy; if (populate_VPVar(VP_M117, &ramcopy)) { ramcopy.memadr = (void*) msg; @@ -164,10 +164,11 @@ void DGUSScreenHandler::sendStringToDisplay(DGUS_VP_Variable &var) { // overwrite the remainings with spaces.// var.size has the display buffer size! void DGUSScreenHandler::sendStringToDisplayPGM(DGUS_VP_Variable &var) { char *tmp = (char*) var.memadr; - dgus.writeVariablePGM(var.VP, tmp, var.size, true); + dgus.writeVariable_P(var.VP, tmp, var.size, true); } #if HAS_PID_HEATING + void DGUSScreenHandler::sendTemperaturePID(DGUS_VP_Variable &var) { float value = *(float *)var.memadr; value /= 10; @@ -200,7 +201,8 @@ void DGUSScreenHandler::sendStringToDisplayPGM(DGUS_VP_Variable &var) { tmp[1] = endian.lb[0]; dgus.writeVariable(var.VP, tmp, 2); } -#endif + +#endif // HAS_PID_HEATING #if ENABLED(PRINTCOUNTER) @@ -221,7 +223,7 @@ void DGUSScreenHandler::sendStringToDisplayPGM(DGUS_VP_Variable &var) { dgus.writeVariable(VP_PrintsTotal, buf, var.size, true); } -#endif +#endif // PRINTCOUNTER // Send fan status value to the display. #if HAS_FAN @@ -249,8 +251,7 @@ void DGUSScreenHandler::sendHeaterStatusToDisplay(DGUS_VP_Variable &var) { void DGUSScreenHandler::sendWaitingStatusToDisplay(DGUS_VP_Variable &var) { // In FYSETC UI design there are 10 statuses to loop - static uint16_t period = 0; - static uint16_t index = 0; + static uint16_t period = 0, index = 0; if (period++ > DGUS_UI_WAITING_STATUS_PERIOD) { dgus.writeVariable(var.VP, index); if (++index >= DGUS_UI_WAITING_STATUS) index = 0; @@ -270,9 +271,9 @@ void DGUSScreenHandler::sendHeaterStatusToDisplay(DGUS_VP_Variable &var) { return; } - // if we are printing, we jump to two screens after the requested one. - // This should host e.g a print pause / print abort / print resume dialog. - // This concept allows to recycle this hook for other file + // If we are printing we jump to two screens after the requested one. + // This should host, e.g., a print pause / print abort / print resume dialog. + // This concept allows to recycle this hook for other files. if (ExtUI::isPrintingFromMedia() && !card.flag.abort_sd_printing) { gotoScreen(DGUS_SCREEN_SDPRINTMANIPULATION); return; @@ -324,7 +325,7 @@ void DGUSScreenHandler::sendHeaterStatusToDisplay(DGUS_VP_Variable &var) { void DGUSScreenHandler::sdCardError() { DGUSScreenHandler::sdCardRemoved(); - sendInfoScreen(F("NOTICE"), nullptr, F("SD card error"), nullptr, true, true, true, true); + sendInfoScreen(F("NOTICE"), nullptr, F("SD card error"), nullptr); setupConfirmAction(nullptr); gotoScreen(DGUS_SCREEN_POPUP); } @@ -432,9 +433,9 @@ void DGUSScreenHandler::handleManualExtrude(DGUS_VP_Variable &var, void *val_ptr switch (var.VP) { #if HAS_HOTEND case VP_MOVE_E0: target_extruder = ExtUI::extruder_t::E0; break; - #if HAS_MULTI_EXTRUDER - case VP_MOVE_E1: target_extruder = ExtUI::extruder_t::E1; break; - #endif + #endif + #if HAS_MULTI_EXTRUDER + case VP_MOVE_E1: target_extruder = ExtUI::extruder_t::E1; break; #endif default: return; } @@ -491,12 +492,12 @@ void DGUSScreenHandler::handleSettings(DGUS_VP_Variable &var, void *val_ptr) { ExtUI::extruder_t extruder; switch (var.VP) { default: return; - #if HAS_EXTRUDERS - case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; - #if HAS_MULTI_EXTRUDER - case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; - #endif - #endif + #if HAS_EXTRUDERS + case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HAS_MULTI_EXTRUDER + case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + #endif } ExtUI::setAxisSteps_per_mm(value, extruder); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel @@ -506,21 +507,17 @@ void DGUSScreenHandler::handleSettings(DGUS_VP_Variable &var, void *val_ptr) { #if HAS_PID_HEATING void DGUSScreenHandler::handlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr) { - char buf[32] = {0}; - switch (var.VP) { default: break; #if ENABLED(PIDTEMP) #if HAS_HOTEND case VP_PID_AUTOTUNE_E0: // Autotune Extruder 0 - sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E0); - queue.enqueue_one_now(buf); + queue.enqueue_one_now(F("M303 E0 C5 S210 U1")); break; #endif #if HAS_MULTI_HOTEND case VP_PID_AUTOTUNE_E1: - sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E1); - queue.enqueue_one_now(buf); + queue.enqueue_one_now(F("M303 E1 C5 S210 U1")); break; #endif #endif @@ -536,6 +533,7 @@ void DGUSScreenHandler::handleSettings(DGUS_VP_Variable &var, void *val_ptr) { gotoScreen(DGUS_SCREEN_WAITING); #endif } + #endif // HAS_PID_HEATING #if HAS_BED_PROBE @@ -607,7 +605,7 @@ void DGUSScreenHandler::handleHeaterControl(DGUS_VP_Variable &var, void *val_ptr uint16_t value = BE16_P(val_ptr); if (value) { queue.inject(F("M1000")); - dgus.writeVariable(VP_SD_Print_Filename, filelist.filename(), 32, true); + dgus.writeStringVar(VP_SD_Print_Filename, filelist.filename()); gotoScreen(PLR_SCREEN_RECOVER); } else { diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h index cb403dbdad..d8d66b764c 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h @@ -32,10 +32,10 @@ #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) typedef struct { - ExtUI::extruder_t extruder; // which extruder to operate - uint8_t action; // load or unload - bool heated; // heating done ? - float purge_length; // the length to extrude before unload, prevent filament jam + uint8_t extruder; // Which extruder index to operate + uint8_t action; // Load or unload + bool heated; // Heating done? + float purge_length; // The length to extrude before unload, prevent filament jam } filament_data_t; extern filament_data_t filament_data; diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h b/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h index 8ee0fa68c8..ceaeb7cd7f 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h @@ -37,21 +37,21 @@ public: // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifying whether the strings are in RAM or FLASH. - static void sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash) { - sendInfoScreen_P(FTOP(line1), FTOP(line2), line3, line4, l1inflash, l2inflash, l3inflash, liinflash); + static void sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash); + static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { + sendInfoScreen_P(FTOP(line1), FTOP(line2), line3, line4, l1inflash, l2inflash, l3inflash, l4inflash); } - static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, FSTR_P const line3, FSTR_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash) { - sendInfoScreen_P(FTOP(line1), FTOP(line2), FTOP(line3), FTOP(line4), l1inflash, l2inflash, l3inflash, liinflash); + static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, FSTR_P const line3, FSTR_P const line4) { + sendInfoScreen_P(FTOP(line1), FTOP(line2), FTOP(line3), FTOP(line4), true, true, true, true); } - static void handleUserConfirmationPopUp(uint16_t confirmVP, PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void handleUserConfirmationPopUp(uint16_t confirmVP, PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash); // "M117" Message -- msg is a RAM ptr. static void setStatusMessage(const char *msg); // The same for messages from Flash - static void setstatusmessagePGM(PGM_P const msg); - static void setStatusMessage(FSTR_P const fmsg) { setstatusmessagePGM(FTOP(fmsg)); } + static void setStatusMessage_P(PGM_P const msg); + static void setStatusMessage(FSTR_P const fmsg) { setStatusMessage_P(FTOP(fmsg)); } // Callback for VP "Display wants to change screen on idle printer" static void screenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); // Callback for VP "Screen has been changed" diff --git a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp index adc78caf07..e68eed16fd 100644 --- a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp +++ b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp @@ -43,7 +43,7 @@ namespace ExtUI { void onIdle() { screen.loop(); } void onPrinterKilled(FSTR_P const error, FSTR_P const) { - screen.sendInfoScreen(GET_TEXT_F(MSG_HALTED), error, FPSTR(NUL_STR), GET_TEXT_F(MSG_PLEASE_RESET), true, true, true, true); + screen.sendInfoScreen(GET_TEXT_F(MSG_HALTED), error, FPSTR(NUL_STR), GET_TEXT_F(MSG_PLEASE_RESET)); screen.gotoScreen(DGUS_SCREEN_KILL); while (!screen.loop()); // Wait while anything is left to be sent } @@ -75,13 +75,11 @@ namespace ExtUI { } // For fancy LCDs include an icon ID, message, and translated button title - void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + void onUserConfirmRequired(const int, const char * const cstr, FSTR_P const) { onUserConfirmRequired(cstr); - UNUSED(icon); UNUSED(fBtn); } - void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + void onUserConfirmRequired(const int, FSTR_P const fstr, FSTR_P const) { onUserConfirmRequired(fstr); - UNUSED(icon); UNUSED(fBtn); } #if ENABLED(ADVANCED_PAUSE_FEATURE) diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp index 575e56103e..24e472be05 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp @@ -340,7 +340,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_MOVE_Z, nullptr, screen.handleManualMove, nullptr), VPHELPER(VP_HOME_ALL, nullptr, screen.handleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOCK, nullptr, screen.handleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, screen.handlePowerLossRecovery, nullptr), #endif @@ -361,7 +361,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_HOTEND VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, screen.sendFloatAsLongValueToDisplay<2>), VPHELPER(VP_MOVE_E0, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, screen.handleHeaterControl, nullptr), @@ -382,7 +382,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_MULTI_HOTEND VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), // ERROR: Flow is per-extruder, not per-hotend + VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), // ERROR: Flow is per-extruder, not per-hotend VPHELPER(VP_MOVE_E1, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, screen.handleHeaterControl, nullptr), VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, screen.sendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h index d8dc81b566..3bac9cf2c6 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h @@ -116,7 +116,7 @@ constexpr uint16_t VP_MOVE_E1 = 0x2112; //constexpr uint16_t VP_MOVE_E4 = 0x2118; //constexpr uint16_t VP_MOVE_E5 = 0x211A; constexpr uint16_t VP_HOME_ALL = 0x2120; -constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; +constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2130; // Power loss recovery constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp index 8c26066b28..be0e60a8df 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp @@ -141,7 +141,7 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { updateNewScreen(target); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } @@ -288,7 +288,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif break; case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + #ifdef PREHEAT_2_TEMP_HOTEND + e_temp = PREHEAT_2_TEMP_HOTEND; + #endif break; case 2: // Load PET #ifdef PREHEAT_3_TEMP_HOTEND @@ -308,9 +310,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (filament_data.action == 0) { // Go back to utility screen #if HAS_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + thermalManager.setTargetHotend(e_temp, 0); #if HAS_MULTI_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + thermalManager.setTargetHotend(e_temp, 1); #endif #endif gotoScreen(DGUS_SCREEN_UTILITY); @@ -320,13 +322,13 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { default: return; #if HAS_HOTEND case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; + filament_data.extruder = 0; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif #if HAS_MULTI_HOTEND case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; + filament_data.extruder = 1; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif @@ -348,7 +350,7 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { //gotoScreen(DGUS_SCREEN_FILAMENT_LOADING); filament_data.heated = true; } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; } else { // unload filament if (!filament_data.heated) { @@ -357,14 +359,14 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } // Before unloading extrude to prevent jamming if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; filament_data.purge_length -= movevalue; } else { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) - movevalue; } } - ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0); } } #endif // DGUS_FILAMENT_LOADUNLOAD diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp index 338f6a319c..79e0ccf942 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp @@ -338,7 +338,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_MOVE_Z, nullptr, screen.handleManualMove, nullptr), VPHELPER(VP_HOME_ALL, nullptr, screen.handleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOCK, nullptr, screen.handleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, screen.handlePowerLossRecovery, nullptr), #endif @@ -358,7 +358,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_HOTEND VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, screen.sendFloatAsLongValueToDisplay<2>), VPHELPER(VP_MOVE_E0, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, screen.handleHeaterControl, nullptr), @@ -379,7 +379,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_MULTI_HOTEND VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, nullptr, screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, screen.handleHeaterControl, nullptr), VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, screen.sendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h index 3019b6651e..a5e0d327a4 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h @@ -116,7 +116,7 @@ constexpr uint16_t VP_MOVE_E1 = 0x2112; //constexpr uint16_t VP_MOVE_E4 = 0x2118; //constexpr uint16_t VP_MOVE_E5 = 0x211A; constexpr uint16_t VP_HOME_ALL = 0x2120; -constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; +constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2130; // Power loss recovery constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp index f817453f1b..297c71f8a9 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp @@ -143,7 +143,7 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { updateNewScreen(target); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } @@ -290,7 +290,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif break; case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + #ifdef PREHEAT_2_TEMP_HOTEND + e_temp = PREHEAT_2_TEMP_HOTEND; + #endif break; case 2: // Load PET #ifdef PREHEAT_3_TEMP_HOTEND @@ -310,9 +312,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (filament_data.action == 0) { // Go back to utility screen #if HAS_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + thermalManager.setTargetHotend(e_temp, 0); #if HAS_MULTI_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + thermalManager.setTargetHotend(e_temp, 1); #endif #endif gotoScreen(DGUS_SCREEN_UTILITY); @@ -322,13 +324,13 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { default: return; #if HAS_HOTEND case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; + filament_data.extruder = 0; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif #if HAS_MULTI_HOTEND case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; + filament_data.extruder = 1; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif @@ -350,7 +352,7 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { //gotoScreen(DGUS_SCREEN_FILAMENT_LOADING); filament_data.heated = true; } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; } else { // unload filament if (!filament_data.heated) { @@ -359,11 +361,11 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } // Before unloading extrude to prevent jamming if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; filament_data.purge_length -= movevalue; } else { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) - movevalue; } } ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp index 08eff9d41e..7288b03b18 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp @@ -180,7 +180,7 @@ const uint16_t MKSList_Tool[] PROGMEM = { 0x0000 }; -const uint16_t MKSList_EXTRUE[] PROGMEM = { +const uint16_t MKSList_EXTRUDE[] PROGMEM = { // E Temp REPEAT(EXTRUDERS, MKSLIST_E_ITEM) // HB Temp @@ -265,7 +265,7 @@ const uint16_t MKSList_TempOnly[] PROGMEM = { 0x0000 }; -const uint16_t MKSList_Pluse[] PROGMEM = { +const uint16_t MKSList_Pulse[] PROGMEM = { // E Temp REPEAT(EXTRUDERS, MKSLIST_E_ITEM) // HB Temp @@ -273,7 +273,7 @@ const uint16_t MKSList_Pluse[] PROGMEM = { // FAN VP_Fan0_Percentage, - // Pluse + // Steps/mm VP_X_STEP_PER_MM, VP_Y_STEP_PER_MM, VP_Z_STEP_PER_MM, @@ -291,7 +291,7 @@ const uint16_t MKSList_MaxSpeed[] PROGMEM = { // FAN VP_Fan0_Percentage, - // Pluse + // Max Speed VP_X_MAX_SPEED, VP_Y_MAX_SPEED, VP_Z_MAX_SPEED, @@ -463,16 +463,16 @@ const struct VPMapping VPMap[] PROGMEM = { { MKSLCD_SCREEN_HOME, MKSList_Home }, // Home, Page 1 { MKSLCD_SCREEN_SETTING, MKSList_Setting }, // Setting, Page 2 { MKSLCD_SCREEM_TOOL, MKSList_Tool }, // Page 3 - { MKSLCD_SCREEN_EXTRUDE_P1, MKSList_EXTRUE }, // Page 4 - { MKSLCD_SCREEN_EXTRUDE_P2, MKSList_EXTRUE }, // Page 11 - { MKSLCD_PAUSE_SETTING_EX, MKSList_EXTRUE }, // Page 57 - { MKSLCD_PAUSE_SETTING_EX2, MKSList_EXTRUE }, // Page 61 + { MKSLCD_SCREEN_EXTRUDE_P1, MKSList_EXTRUDE }, // Page 4 + { MKSLCD_SCREEN_EXTRUDE_P2, MKSList_EXTRUDE }, // Page 11 + { MKSLCD_PAUSE_SETTING_EX, MKSList_EXTRUDE }, // Page 57 + { MKSLCD_PAUSE_SETTING_EX2, MKSList_EXTRUDE }, // Page 61 { MKSLCD_SCREEN_LEVEL, MKSList_LEVEL }, // Page 5 { MKSLCD_SCREEN_MOVE, MKSList_MOVE }, // Page 6 { MKSLCD_SCREEN_PRINT, MKSList_Print }, // Page 7 { MKSLCD_SCREEN_PAUSE, MKSList_Print }, // Page 26 { MKSLCD_SCREEN_CHOOSE_FILE, MKSList_SD_File }, // Page 15 - { MKSLCD_SCREEN_MOTOR_PLUSE, MKSList_Pluse }, // Page 51 + { MKSLCD_SCREEN_MOTOR_PULSE, MKSList_Pulse }, // Page 51 { MKSLCD_SCREEN_MOTOR_SPEED, MKSList_MaxSpeed }, // Page 55 { MKSLCD_SCREEN_MOTOR_ACC_MAX, MKSList_MaxAcc }, // Page 53 { MKSLCD_SCREEN_LEVEL_DATA, MKSList_Level_Point }, // Page 48 @@ -522,7 +522,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_MOVE_DISTANCE, &manualMoveStep, screen.getManualMovestep, nullptr), - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOCK, nullptr, screen.handleManualMove, nullptr), VPHELPER(VP_LEVEL_POINT, nullptr, screen.manualAssistLeveling, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) @@ -545,7 +545,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_HOTEND VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, screen.sendFloatAsLongValueToDisplay<2>), VPHELPER(VP_MOVE_E0, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, screen.handleHeaterControl, nullptr), @@ -570,7 +570,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_MULTI_HOTEND VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, screen.handleHeaterControl, nullptr), VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, screen.sendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h index 95bee17229..a0b95aa14a 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h @@ -53,25 +53,9 @@ extern xyz_int_t tmc_step; extern uint16_t lcd_default_light; -#if X_HAS_STEALTHCHOP - extern uint16_t tmc_x_current; -#endif -#if Y_HAS_STEALTHCHOP - extern uint16_t tmc_y_current; -#endif -#if Z_HAS_STEALTHCHOP - extern uint16_t tmc_z_current; -#endif -#if E0_HAS_STEALTHCHOP - extern uint16_t tmc_e0_current; -#endif -#if E1_HAS_STEALTHCHOP - extern uint16_t tmc_e1_current; -#endif - typedef enum { EX_HEATING, - EX_HEAT_STARUS, + EX_HEAT_STATUS, EX_CHANGING, EX_CHANGE_STATUS, EX_NONE, @@ -80,7 +64,7 @@ typedef enum { typedef struct { //uint8_t ex_change_flag:1; //uint8_t ex_heat_flag:1; - uint8_t ex_load_unload_flag:1; //0:unload 1:load + uint8_t ex_load_unload_flag:1; // 0:unload 1:load EX_STATUS_DEF ex_status; uint32_t ex_tick_start; uint32_t ex_tick_end; @@ -121,118 +105,118 @@ extern NOZZLE_PARK_DEF nozzle_park_mks; enum DGUS_ScreenID : uint8_t { #if ENABLED(USE_MKS_GREEN_UI) - DGUS_SCREEN_BOOT = 33, - DGUS_SCREEN_MAIN = 60, - DGUS_SCREEN_STATUS = 60, - DGUS_SCREEN_STATUS2 = 60, - DGUS_SCREEN_PREHEAT = 18, - DGUS_SCREEN_POWER_LOSS = 100, - DGUS_SCREEN_MANUALMOVE = 192, - DGUS_SCREEN_UTILITY = 120, - DGUS_SCREEN_FILAMENT_UNLOADING = 158, - DGUS_SCREEN_SDFILELIST = 15, - DGUS_SCREEN_SDPRINTMANIPULATION = 15, - DGUS_SCREEN_SDPRINTTUNE = 17, + DGUS_SCREEN_BOOT = 33, + DGUS_SCREEN_MAIN = 60, + DGUS_SCREEN_STATUS = 60, + DGUS_SCREEN_STATUS2 = 60, + DGUS_SCREEN_PREHEAT = 18, + DGUS_SCREEN_POWER_LOSS = 100, + DGUS_SCREEN_MANUALMOVE = 192, + DGUS_SCREEN_UTILITY = 120, + DGUS_SCREEN_FILAMENT_UNLOADING = 158, + DGUS_SCREEN_SDFILELIST = 15, + DGUS_SCREEN_SDPRINTMANIPULATION = 15, + DGUS_SCREEN_SDPRINTTUNE = 17, - MKSLCD_SCREEN_BOOT = 33, - MKSLCD_SCREEN_HOME = 60, // MKS main page - MKSLCD_SCREEN_SETTING = 62, // MKS Setting page / no wifi whit - MKSLCD_SCREEM_TOOL = 64, // MKS Tool page - MKSLCD_SCREEN_EXTRUDE_P1 = 75, - MKSLCD_SCREEN_EXTRUDE_P2 = 77, - MKSLCD_SCREEN_LEVEL = 73, - MKSLCD_AUTO_LEVEL = 81, - MKSLCD_SCREEN_MOVE = 66, - MKSLCD_SCREEN_PRINT = 68, - MKSLCD_SCREEN_PAUSE = 70, - MKSLCD_SCREEN_CHOOSE_FILE = 87, - MKSLCD_SCREEN_NO_CHOOSE_FILE = 88, - MKSLCD_SCREEN_Config = 101, - MKSLCD_SCREEN_Config_MOTOR = 103, - MKSLCD_SCREEN_MOTOR_PLUSE = 104, - MKSLCD_SCREEN_MOTOR_SPEED = 102, - MKSLCD_SCREEN_MOTOR_ACC_MAX = 105, - MKSLCD_SCREEN_PRINT_CONFIG = 72, - MKSLCD_SCREEN_LEVEL_DATA = 106, - MKSLCD_PrintPause_SET = 107, - MKSLCD_FILAMENT_DATA = 50, - MKSLCD_ABOUT = 83, - MKSLCD_PID = 108, - MKSLCD_PAUSE_SETTING_MOVE = 98, - MKSLCD_PAUSE_SETTING_EX = 96, - MKSLCD_PAUSE_SETTING_EX2 = 97, - MKSLCD_SCREEN_PRINT_CONFIRM = 94, - MKSLCD_SCREEN_EX_CONFIG = 112, - MKSLCD_SCREEN_EEP_Config = 89, - MKSLCD_SCREEN_PrintDone = 92, - MKSLCD_SCREEN_TMC_Config = 111, - MKSLCD_Screen_Offset_Config = 109, - MKSLCD_Screen_PMove = 98, - MKSLCD_Screen_Baby = 79, + MKSLCD_SCREEN_BOOT = 33, + MKSLCD_SCREEN_HOME = 60, // MKS main page + MKSLCD_SCREEN_SETTING = 62, // MKS Setting page / no wifi whit + MKSLCD_SCREEM_TOOL = 64, // MKS Tool page + MKSLCD_SCREEN_EXTRUDE_P1 = 75, + MKSLCD_SCREEN_EXTRUDE_P2 = 77, + MKSLCD_SCREEN_LEVEL = 73, + MKSLCD_AUTO_LEVEL = 81, + MKSLCD_SCREEN_MOVE = 66, + MKSLCD_SCREEN_PRINT = 68, + MKSLCD_SCREEN_PAUSE = 70, + MKSLCD_SCREEN_CHOOSE_FILE = 87, + MKSLCD_SCREEN_NO_CHOOSE_FILE = 88, + MKSLCD_SCREEN_Config = 101, + MKSLCD_SCREEN_Config_MOTOR = 103, + MKSLCD_SCREEN_MOTOR_PULSE = 104, + MKSLCD_SCREEN_MOTOR_SPEED = 102, + MKSLCD_SCREEN_MOTOR_ACC_MAX = 105, + MKSLCD_SCREEN_PRINT_CONFIG = 72, + MKSLCD_SCREEN_LEVEL_DATA = 106, + MKSLCD_PrintPause_SET = 107, + MKSLCD_FILAMENT_DATA = 50, + MKSLCD_ABOUT = 83, + MKSLCD_PID = 108, + MKSLCD_PAUSE_SETTING_MOVE = 98, + MKSLCD_PAUSE_SETTING_EX = 96, + MKSLCD_PAUSE_SETTING_EX2 = 97, + MKSLCD_SCREEN_PRINT_CONFIRM = 94, + MKSLCD_SCREEN_EX_CONFIG = 112, + MKSLCD_SCREEN_EEP_Config = 89, + MKSLCD_SCREEN_PrintDone = 92, + MKSLCD_SCREEN_TMC_Config = 111, + MKSLCD_Screen_Offset_Config = 109, + MKSLCD_Screen_PMove = 98, + MKSLCD_Screen_Baby = 79, #else - DGUS_SCREEN_BOOT = 120, - DGUS_SCREEN_MAIN = 1, + DGUS_SCREEN_BOOT = 120, + DGUS_SCREEN_MAIN = 1, - DGUS_SCREEN_STATUS = 1, - DGUS_SCREEN_STATUS2 = 1, - DGUS_SCREEN_PREHEAT = 18, - DGUS_SCREEN_POWER_LOSS = 100, - DGUS_SCREEN_MANUALMOVE = 192, - DGUS_SCREEN_UTILITY = 120, - DGUS_SCREEN_FILAMENT_UNLOADING = 158, - DGUS_SCREEN_SDFILELIST = 15, - DGUS_SCREEN_SDPRINTMANIPULATION = 15, - DGUS_SCREEN_SDPRINTTUNE = 17, + DGUS_SCREEN_STATUS = 1, + DGUS_SCREEN_STATUS2 = 1, + DGUS_SCREEN_PREHEAT = 18, + DGUS_SCREEN_POWER_LOSS = 100, + DGUS_SCREEN_MANUALMOVE = 192, + DGUS_SCREEN_UTILITY = 120, + DGUS_SCREEN_FILAMENT_UNLOADING = 158, + DGUS_SCREEN_SDFILELIST = 15, + DGUS_SCREEN_SDPRINTMANIPULATION = 15, + DGUS_SCREEN_SDPRINTTUNE = 17, - MKSLCD_SCREEN_BOOT = 0, - MKSLCD_SCREEN_HOME = 1, // MKS main page - MKSLCD_SCREEN_SETTING = 2, // MKS Setting page / no wifi whit - MKSLCD_SCREEM_TOOL = 3, // MKS Tool page - MKSLCD_SCREEN_EXTRUDE_P1 = 4, - MKSLCD_SCREEN_EXTRUDE_P2 = 11, - MKSLCD_SCREEN_LEVEL = 5, - MKSLCD_AUTO_LEVEL = 73, - MKSLCD_SCREEN_LEVEL_PRESS = 9, - MKSLCD_SCREEN_MOVE = 6, - MKSLCD_SCREEN_PRINT = 7, - MKSLCD_SCREEN_PRINT_PRESS = 13, - MKSLCD_SCREEN_PAUSE = 26, - MKSLCD_SCREEN_PAUSE_PRESS = 26, - MKSLCD_SCREEN_CHOOSE_FILE = 15, - MKSLCD_SCREEN_NO_CHOOSE_FILE = 17, - MKSLCD_SCREEN_Config = 46, - MKSLCD_SCREEN_Config_MOTOR = 47, - MKSLCD_SCREEN_MOTOR_PLUSE = 51, - MKSLCD_SCREEN_MOTOR_SPEED = 55, - MKSLCD_SCREEN_MOTOR_ACC_MAX = 53, - MKSLCD_SCREEN_PRINT_CONFIG = 60, - MKSLCD_SCREEN_LEVEL_DATA = 48, - MKSLCD_PrintPause_SET = 49, - MKSLCD_FILAMENT_DATA = 50, - MKSLCD_ABOUT = 36, - MKSLCD_PID = 56, - MKSLCD_PAUSE_SETTING_MOVE = 58, - MKSLCD_PAUSE_SETTING_EX = 57, - MKSLCD_PAUSE_SETTING_EX2 = 61, - MKSLCD_SCREEN_NO_FILE = 42, - MKSLCD_SCREEN_PRINT_CONFIRM = 43, - MKSLCD_SCREEN_EX_CONFIG = 65, - MKSLCD_SCREEN_EEP_Config = 20, - MKSLCD_SCREEN_PrintDone = 25, - MKSLCD_SCREEN_TMC_Config = 70, - MKSLCD_Screen_Offset_Config = 30, - MKSLCD_Screen_PMove = 64, - MKSLCD_Screen_Baby = 71, + MKSLCD_SCREEN_BOOT = 0, + MKSLCD_SCREEN_HOME = 1, // MKS main page + MKSLCD_SCREEN_SETTING = 2, // MKS Setting page / no wifi whit + MKSLCD_SCREEM_TOOL = 3, // MKS Tool page + MKSLCD_SCREEN_EXTRUDE_P1 = 4, + MKSLCD_SCREEN_EXTRUDE_P2 = 11, + MKSLCD_SCREEN_LEVEL = 5, + MKSLCD_AUTO_LEVEL = 73, + MKSLCD_SCREEN_LEVEL_PRESS = 9, + MKSLCD_SCREEN_MOVE = 6, + MKSLCD_SCREEN_PRINT = 7, + MKSLCD_SCREEN_PRINT_PRESS = 13, + MKSLCD_SCREEN_PAUSE = 26, + MKSLCD_SCREEN_PAUSE_PRESS = 26, + MKSLCD_SCREEN_CHOOSE_FILE = 15, + MKSLCD_SCREEN_NO_CHOOSE_FILE = 17, + MKSLCD_SCREEN_Config = 46, + MKSLCD_SCREEN_Config_MOTOR = 47, + MKSLCD_SCREEN_MOTOR_PULSE = 51, + MKSLCD_SCREEN_MOTOR_SPEED = 55, + MKSLCD_SCREEN_MOTOR_ACC_MAX = 53, + MKSLCD_SCREEN_PRINT_CONFIG = 60, + MKSLCD_SCREEN_LEVEL_DATA = 48, + MKSLCD_PrintPause_SET = 49, + MKSLCD_FILAMENT_DATA = 50, + MKSLCD_ABOUT = 36, + MKSLCD_PID = 56, + MKSLCD_PAUSE_SETTING_MOVE = 58, + MKSLCD_PAUSE_SETTING_EX = 57, + MKSLCD_PAUSE_SETTING_EX2 = 61, + MKSLCD_SCREEN_NO_FILE = 42, + MKSLCD_SCREEN_PRINT_CONFIRM = 43, + MKSLCD_SCREEN_EX_CONFIG = 65, + MKSLCD_SCREEN_EEP_Config = 20, + MKSLCD_SCREEN_PrintDone = 25, + MKSLCD_SCREEN_TMC_Config = 70, + MKSLCD_Screen_Offset_Config = 30, + MKSLCD_Screen_PMove = 64, + MKSLCD_Screen_Baby = 71, #endif - DGUS_SCREEN_CONFIRM = 240, - DGUS_SCREEN_KILL = 250, //!< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") - DGUS_SCREEN_WAITING = 251, - DGUS_SCREEN_POPUP = 252, //!< special target, popup screen will also return this code to say "return to previous screen" - DGUS_SCREEN_UNUSED = 255 + DGUS_SCREEN_CONFIRM = 240, + DGUS_SCREEN_KILL = 250, //!< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") + DGUS_SCREEN_WAITING = 251, + DGUS_SCREEN_POPUP = 252, //!< special target, popup screen will also return this code to say "return to previous screen" + DGUS_SCREEN_UNUSED = 255 }; // Place for status messages. @@ -290,7 +274,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint8_t VP_MSGSTR4_LEN = 0x20; constexpr uint16_t VP_MARLIN_VERSION = 0x1A00; - constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. + constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. constexpr uint16_t VP_SCREENCHANGE_ASK = 0x1500; constexpr uint16_t VP_SCREENCHANGE = 0x1501; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. @@ -347,8 +331,9 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_MOVE_E5 = 0x231A; constexpr uint16_t VP_MOVE_E6 = 0x231C; constexpr uint16_t VP_MOVE_E7 = 0x231E; + constexpr uint16_t VP_HOME_ALL = 0x2320; - constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2330; + constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2330; constexpr uint16_t VP_MOVE_DISTANCE = 0x2334; constexpr uint16_t VP_X_HOME = 0x2336; constexpr uint16_t VP_Y_HOME = 0x2338; @@ -383,7 +368,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2500; constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2504; constexpr uint16_t VP_LOAD_Filament = 0x2508; - // constexpr uint16_t VP_LOAD_UNLOAD_Cancle = 0x250A; + //constexpr uint16_t VP_LOAD_UNLOAD_Cancel = 0x250A; constexpr uint16_t VP_UNLOAD_Filament = 0x250B; constexpr uint16_t VP_Filament_distance = 0x2600; constexpr uint16_t VP_Filament_speed = 0x2604; @@ -467,10 +452,10 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_SD_Print_Filename = 0x32C0; // X Y Z Point - constexpr uint16_t VP_XPos = 0x3300; // 4 Byte Fixed point number; format xxx.yy - constexpr uint16_t VP_YPos = 0x3302; // 4 Byte Fixed point number; format xxx.yy - constexpr uint16_t VP_ZPos = 0x3304; // 4 Byte Fixed point number; format xxx.yy - constexpr uint16_t VP_EPos = 0x3306; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_XPos = 0x3300; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_YPos = 0x3302; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_ZPos = 0x3304; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_EPos = 0x3306; // 4 Byte Fixed point number; format xxx.yy // Print constexpr uint16_t VP_PrintProgress_Percentage = 0x3330; // 2 Byte Integer (0..100) @@ -481,16 +466,16 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_PrintsTotal = 0x3380; constexpr uint16_t VP_PrintsTotal_LEN = 16; - constexpr uint16_t VP_File_Pictutr0 = 0x3400; - constexpr uint16_t VP_File_Pictutr1 = 0x3402; - constexpr uint16_t VP_File_Pictutr2 = 0x3404; - constexpr uint16_t VP_File_Pictutr3 = 0x3406; - constexpr uint16_t VP_File_Pictutr4 = 0x3408; - constexpr uint16_t VP_File_Pictutr5 = 0x340A; - constexpr uint16_t VP_File_Pictutr6 = 0x340C; - constexpr uint16_t VP_File_Pictutr7 = 0x340E; - constexpr uint16_t VP_File_Pictutr8 = 0x3410; - constexpr uint16_t VP_File_Pictutr9 = 0x3412; + constexpr uint16_t VP_File_Picture0 = 0x3400; + constexpr uint16_t VP_File_Picture1 = 0x3402; + constexpr uint16_t VP_File_Picture2 = 0x3404; + constexpr uint16_t VP_File_Picture3 = 0x3406; + constexpr uint16_t VP_File_Picture4 = 0x3408; + constexpr uint16_t VP_File_Picture5 = 0x340A; + constexpr uint16_t VP_File_Picture6 = 0x340C; + constexpr uint16_t VP_File_Picture7 = 0x340E; + constexpr uint16_t VP_File_Picture8 = 0x3410; + constexpr uint16_t VP_File_Picture9 = 0x3412; constexpr uint16_t VP_BED_STATUS = 0x341C; @@ -512,101 +497,103 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_PrintTime_S = 0x3504; // PIDs - constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 - constexpr uint16_t VP_E0_PID_I = 0x3702; - constexpr uint16_t VP_E0_PID_D = 0x3704; - constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , uint16_t , 0~1638.4 - constexpr uint16_t VP_E1_PID_I = 0x3708; - constexpr uint16_t VP_E1_PID_D = 0x370A; - constexpr uint16_t VP_BED_PID_P = 0x3710; - constexpr uint16_t VP_BED_PID_I = 0x3712; - constexpr uint16_t VP_BED_PID_D = 0x3714; + constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 + constexpr uint16_t VP_E0_PID_I = 0x3702; + constexpr uint16_t VP_E0_PID_D = 0x3704; + constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , uint16_t , 0~1638.4 + constexpr uint16_t VP_E1_PID_I = 0x3708; + constexpr uint16_t VP_E1_PID_D = 0x370A; + constexpr uint16_t VP_BED_PID_P = 0x3710; + constexpr uint16_t VP_BED_PID_I = 0x3712; + constexpr uint16_t VP_BED_PID_D = 0x3714; - constexpr uint16_t VP_EEPROM_CTRL = 0x3720; + constexpr uint16_t VP_EEPROM_CTRL = 0x3720; - constexpr uint16_t VP_OFFSET_X = 0x3724; - constexpr uint16_t VP_OFFSET_Y = 0x3728; - constexpr uint16_t VP_OFFSET_Z = 0x372B; + constexpr uint16_t VP_OFFSET_X = 0x3724; + constexpr uint16_t VP_OFFSET_Y = 0x3728; + constexpr uint16_t VP_OFFSET_Z = 0x372B; // PID autotune - constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x3800; - constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x3802; - constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x3804; - constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x3806; - constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x3808; - constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x380A; - constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x380C; + constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x3800; + constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x3802; + constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x3804; + constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x3806; + constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x3808; + constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x380A; + constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x380C; + // Calibrate Z - constexpr uint16_t VP_Z_CALIBRATE = 0x3810; + constexpr uint16_t VP_Z_CALIBRATE = 0x3810; - constexpr uint16_t VP_AutoTurnOffSw = 0x3812; - constexpr uint16_t VP_LCD_BLK = 0x3814; + constexpr uint16_t VP_AutoTurnOffSw = 0x3812; + constexpr uint16_t VP_LCD_BLK = 0x3814; - constexpr uint16_t VP_X_PARK_POS = 0x3900; - constexpr uint16_t VP_Y_PARK_POS = 0x3902; - constexpr uint16_t VP_Z_PARK_POS = 0x3904; + constexpr uint16_t VP_X_PARK_POS = 0x3900; + constexpr uint16_t VP_Y_PARK_POS = 0x3902; + constexpr uint16_t VP_Z_PARK_POS = 0x3904; /* -------------------------------0x4000-0x4FFF------------------------------- */ // Heater Control Buttons , triged between "cool down" and "heat PLA" state - constexpr uint16_t VP_E0_CONTROL = 0x4010; - constexpr uint16_t VP_E1_CONTROL = 0x4012; + constexpr uint16_t VP_E0_CONTROL = 0x4010; + constexpr uint16_t VP_E1_CONTROL = 0x4012; //constexpr uint16_t VP_E2_CONTROL = 0x2214; //constexpr uint16_t VP_E3_CONTROL = 0x2216; //constexpr uint16_t VP_E4_CONTROL = 0x2218; //constexpr uint16_t VP_E5_CONTROL = 0x221A; - constexpr uint16_t VP_BED_CONTROL = 0x401C; + constexpr uint16_t VP_BED_CONTROL = 0x401C; // Preheat - constexpr uint16_t VP_E0_BED_PREHEAT = 0x4020; - constexpr uint16_t VP_E1_BED_PREHEAT = 0x4022; + constexpr uint16_t VP_E0_BED_PREHEAT = 0x4020; + constexpr uint16_t VP_E1_BED_PREHEAT = 0x4022; //constexpr uint16_t VP_E2_BED_PREHEAT = 0x4024; //constexpr uint16_t VP_E3_BED_PREHEAT = 0x4026; //constexpr uint16_t VP_E4_BED_PREHEAT = 0x4028; //constexpr uint16_t VP_E5_BED_PREHEAT = 0x402A; // Filament load and unload - // constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x4030; - // constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x4032; + //constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x4030; + //constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x4032; // Settings store , reset // Level data - constexpr uint16_t VP_Level_Point_One_X = 0x4100; - constexpr uint16_t VP_Level_Point_One_Y = 0x4102; - constexpr uint16_t VP_Level_Point_Two_X = 0x4104; - constexpr uint16_t VP_Level_Point_Two_Y = 0x4106; - constexpr uint16_t VP_Level_Point_Three_X = 0x4108; - constexpr uint16_t VP_Level_Point_Three_Y = 0x410A; - constexpr uint16_t VP_Level_Point_Four_X = 0x410C; - constexpr uint16_t VP_Level_Point_Four_Y = 0x410E; - constexpr uint16_t VP_Level_Point_Five_X = 0x4110; - constexpr uint16_t VP_Level_Point_Five_Y = 0x4112; + constexpr uint16_t VP_Level_Point_One_X = 0x4100; + constexpr uint16_t VP_Level_Point_One_Y = 0x4102; + constexpr uint16_t VP_Level_Point_Two_X = 0x4104; + constexpr uint16_t VP_Level_Point_Two_Y = 0x4106; + constexpr uint16_t VP_Level_Point_Three_X = 0x4108; + constexpr uint16_t VP_Level_Point_Three_Y = 0x410A; + constexpr uint16_t VP_Level_Point_Four_X = 0x410C; + constexpr uint16_t VP_Level_Point_Four_Y = 0x410E; + constexpr uint16_t VP_Level_Point_Five_X = 0x4110; + constexpr uint16_t VP_Level_Point_Five_Y = 0x4112; /* H43 Version */ - constexpr uint16_t VP_MKS_H43_VERSION = 0x4A00; // MKS H43 V1.0.0 - constexpr uint16_t VP_MKS_H43_VERSION_LEN = 16; - constexpr uint16_t VP_MKS_H43_UpdataVERSION = 0x4A10; // MKS H43 V1.0.0 - constexpr uint16_t VP_MKS_H43_UpdataVERSION_LEN = 16; + constexpr uint16_t VP_MKS_H43_VERSION = 0x4A00; // MKS H43 V1.0.0 + constexpr uint16_t VP_MKS_H43_VERSION_LEN = 16; + constexpr uint16_t VP_MKS_H43_UpdataVERSION = 0x4A10; // MKS H43 V1.0.0 + constexpr uint16_t VP_MKS_H43_UpdataVERSION_LEN = 16; /* -------------------------------0x5000-0xFFFF------------------------------- */ constexpr uint16_t VP_HOME_Dis = 0x5000; constexpr uint16_t VP_Setting_Dis = 0x5010; constexpr uint16_t VP_Tool_Dis = 0x5020; constexpr uint16_t VP_Printing_Dis = 0x5030; + constexpr uint16_t VP_Print_Dis = 0x5250; constexpr uint16_t VP_Language_Dis = 0x5080; constexpr uint16_t VP_LossPoint_Dis = 0x5090; constexpr uint16_t VP_PrintPauseConfig_Dis = 0x5120; - constexpr uint16_t VP_MotorPluse_Dis = 0x5140; + constexpr uint16_t VP_MotorPulse_Dis = 0x5140; constexpr uint16_t VP_MotorMaxSpeed_Dis = 0x5150; constexpr uint16_t VP_MotorMaxAcc_Dis = 0x5160; - constexpr uint16_t VP_X_Pluse_Dis = 0x5170; - constexpr uint16_t VP_Y_Pluse_Dis = 0x5180; - constexpr uint16_t VP_Z_Pluse_Dis = 0x5190; - constexpr uint16_t VP_E0_Pluse_Dis = 0x51A0; - constexpr uint16_t VP_E1_Pluse_Dis = 0x51B0; + constexpr uint16_t VP_X_Pulse_Dis = 0x5170; + constexpr uint16_t VP_Y_Pulse_Dis = 0x5180; + constexpr uint16_t VP_Z_Pulse_Dis = 0x5190; + constexpr uint16_t VP_E0_Pulse_Dis = 0x51A0; + constexpr uint16_t VP_E1_Pulse_Dis = 0x51B0; constexpr uint16_t VP_X_Max_Speed_Dis = 0x5280; constexpr uint16_t VP_Y_Max_Speed_Dis = 0x5290; @@ -614,11 +601,11 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_E0_Max_Speed_Dis = 0x52B0; constexpr uint16_t VP_E1_Max_Speed_Dis = 0x52C0; - constexpr uint16_t VP_X_Max_Acc_Speed_Dis = 0x51E0; - constexpr uint16_t VP_Y_Max_Acc_Speed_Dis = 0x51F0; - constexpr uint16_t VP_Z_Max_Acc_Speed_Dis = 0x5200; - constexpr uint16_t VP_E0_Max_Acc_Speed_Dis = 0x5210; - constexpr uint16_t VP_E1_Max_Acc_Speed_Dis = 0x5220; + constexpr uint16_t VP_X_Max_Acc_Dis = 0x51E0; + constexpr uint16_t VP_Y_Max_Acc_Dis = 0x51F0; + constexpr uint16_t VP_Z_Max_Acc_Dis = 0x5200; + constexpr uint16_t VP_E0_Max_Acc_Dis = 0x5210; + constexpr uint16_t VP_E1_Max_Acc_Dis = 0x5220; constexpr uint16_t VP_PrintTime_Dis = 0x5470; constexpr uint16_t VP_E0_Temp_Dis = 0x5310; @@ -672,8 +659,8 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_Length_Dis = 0x5B00; - constexpr uint16_t VP_PrintConfrim_Info_Dis = 0x5B90; - constexpr uint16_t VP_StopPrintConfrim_Info_Dis = 0x5B80; + constexpr uint16_t VP_PrintConfirm_Info_Dis = 0x5B90; + constexpr uint16_t VP_StopPrintConfirm_Info_Dis = 0x5B80; constexpr uint16_t VP_Point_One_Dis = 0x5BA0; constexpr uint16_t VP_Point_Two_Dis = 0x5BB0; @@ -681,8 +668,6 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_Point_Four_Dis = 0x5BD0; constexpr uint16_t VP_Point_Five_Dis = 0x5BE0; - constexpr uint16_t VP_Print_Dis = 0x5250; - constexpr uint16_t VP_About_Dis = 0x5A00; constexpr uint16_t VP_Config_Dis = 0x5A10; constexpr uint16_t VP_Filament_Dis = 0x5A20; diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp index 1761451da1..0ac704ed3d 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp @@ -60,17 +60,17 @@ MKS_Language mks_language_index; // Initialized by settings.load #if 0 void DGUSScreenHandlerMKS::sendinfoscreen_ch(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4) { - dgus.writeVariable(VP_MSGSTR1, line1, 32, true); - dgus.writeVariable(VP_MSGSTR2, line2, 32, true); - dgus.writeVariable(VP_MSGSTR3, line3, 32, true); - dgus.writeVariable(VP_MSGSTR4, line4, 32, true); + dgus.writeStringVar(VP_MSGSTR1, line1, 32); + dgus.writeStringVar(VP_MSGSTR2, line2, 32); + dgus.writeStringVar(VP_MSGSTR3, line3, 32); + dgus.writeStringVar(VP_MSGSTR4, line4, 32); } void DGUSScreenHandlerMKS::sendinfoscreen_en(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4) { - dgus.writeVariable(VP_MSGSTR1, line1, 32, true); - dgus.writeVariable(VP_MSGSTR2, line2, 32, true); - dgus.writeVariable(VP_MSGSTR3, line3, 32, true); - dgus.writeVariable(VP_MSGSTR4, line4, 32, true); + dgus.writeStringVar(VP_MSGSTR1, line1); + dgus.writeStringVar(VP_MSGSTR2, line2); + dgus.writeStringVar(VP_MSGSTR3, line3); + dgus.writeStringVar(VP_MSGSTR4, line4); } void DGUSScreenHandlerMKS::sendInfoScreen(const void *line1, const void *line2, const void *line3, const void *line4, uint16_t language) { @@ -85,14 +85,14 @@ void DGUSScreenHandlerMKS::sendInfoScreen(const void *line1, const void *line2, void DGUSScreenHandlerMKS::sendFanToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { uint16_t tmp = *(uint8_t *) var.memadr; // +1 -> avoid rounding issues for the display. - // tmp = map(tmp, 0, 255, 0, 100); + //tmp = map(constrain(tmp, 0, 255), 0, 255, 0, 100); dgus.writeVariable(var.VP, tmp); } } void DGUSScreenHandlerMKS::sendBabyStepToDisplay(DGUS_VP_Variable &var) { float value = current_position.z; - value *= cpow(10, 2); + value *= 100; //cpow(10, 2); dgus.writeVariable(VP_SD_Print_Baby, (uint16_t)value); } @@ -113,17 +113,20 @@ void DGUSScreenHandlerMKS::setUint8(DGUS_VP_Variable &var, void *val_ptr) { void DGUSScreenHandlerMKS::sendGbkToDisplay(DGUS_VP_Variable &var) { uint16_t *tmp = (uint16_t*) var.memadr; - dgus.writeVariable(var.VP, tmp, var.size, true); + dgus.writeStringVar(var.VP, tmp, var.size); } void DGUSScreenHandlerMKS::sendStringToDisplay_Language(DGUS_VP_Variable &var) { - if (mks_language_index == MKS_English) { - char *tmp = (char*) var.memadr; - dgus.writeVariable(var.VP, tmp, var.size, true); - } - else if (mks_language_index == MKS_SimpleChinese) { - uint16_t *tmp = (uint16_t *)var.memadr; - dgus.writeVariable(var.VP, tmp, var.size, true); + switch (mks_language_index) { + default: + case MKS_English: { + char *tmp = (char*) var.memadr; + dgus.writeStringVar(var.VP, tmp, var.size); + } break; + case MKS_SimpleChinese: { + uint16_t *tmp = (uint16_t *)var.memadr; + dgus.writeStringVar(var.VP, tmp, var.size); + } break; } } @@ -168,7 +171,7 @@ void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { #if ENABLED(DGUS_PRINT_FILENAME) // Send print filename - dgus.writeVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + dgus.writeStringVar(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN); #endif // Setup Confirmation screen @@ -212,7 +215,6 @@ void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { nozzle_park_mks.print_pause_start_flag = 1; nozzle_park_mks.blstatus = true; ExtUI::pausePrint(); - //ExtUI::mks_pausePrint(); } break; @@ -235,7 +237,7 @@ void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { } sendStringToDisplay(var); - dgus.writeVariable(VP_File_Pictutr0 + target_line * 2, dir_icon_val); + dgus.writeVariable(VP_File_Picture0 + target_line * 2, dir_icon_val); } void DGUSScreenHandler::sdCardInserted() { @@ -248,8 +250,8 @@ void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { void DGUSScreenHandler::sdCardRemoved() { if (current_screenID == DGUS_SCREEN_SDFILELIST - || (current_screenID == DGUS_SCREEN_CONFIRM && (confirmVP == VP_SD_AbortPrintConfirmed || confirmVP == VP_SD_FileSelectConfirm)) - || current_screenID == DGUS_SCREEN_SDPRINTMANIPULATION + || (current_screenID == DGUS_SCREEN_CONFIRM && (confirmVP == VP_SD_AbortPrintConfirmed || confirmVP == VP_SD_FileSelectConfirm)) + || current_screenID == DGUS_SCREEN_SDPRINTMANIPULATION ) filelist.refresh(); } @@ -261,12 +263,13 @@ void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { gotoScreen(MKSLCD_SCREEN_PrintDone); } -#else +#else // !HAS_MEDIA + void DGUSScreenHandlerMKS::printReturn(DGUS_VP_Variable& var, void *val_ptr) { - const uint16_t value = BE16_P(val_ptr); - if (value == 0x0F) gotoScreen(DGUS_SCREEN_MAIN); + if (BE16_P(val_ptr) == 0x0F) gotoScreen(DGUS_SCREEN_MAIN); } -#endif // HAS_MEDIA + +#endif void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { uint8_t *tmp = (uint8_t*)val_ptr; @@ -276,10 +279,9 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { // meaning "return to previous screen" DGUS_ScreenID target = (DGUS_ScreenID)tmp[1]; - // when the dgus had reboot, it will enter the DGUS_SCREEN_MAIN page, - // so user can change any page to use this function, an it will check - // if robin nano is printing. when it is, dgus will enter the printing - // page to continue print; + // When the DGUS reboots it enters the DGUS_SCREEN_MAIN page so the user + // can change any page to use this function and it will check whether a print + // job is active. If so DGUS will go to the printing page to continue the job. // //if (printJobOngoing() || printingIsPaused()) { // if (target == MKSLCD_PAUSE_SETTING_MOVE || target == MKSLCD_PAUSE_SETTING_EX @@ -288,7 +290,7 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { // } // else // gotoScreen(MKSLCD_SCREEN_PRINT); - // return; + // return; //} if (target == DGUS_SCREEN_POPUP) { @@ -302,7 +304,7 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { updateNewScreen(target); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } @@ -323,10 +325,7 @@ void DGUSScreenHandlerMKS::zOffsetConfirm(DGUS_VP_Variable &var, void *val_ptr) void DGUSScreenHandlerMKS::getTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t value = BE16_P(val_ptr); - switch (value) { - case 0 ... 1: DGUSAutoTurnOff = (bool)value; break; - default: break; - } + if (value < 2) DGUSAutoTurnOff = (bool)value; } void DGUSScreenHandlerMKS::getMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) { @@ -337,14 +336,13 @@ void DGUSScreenHandlerMKS::getMinExtrudeTemp(DGUS_VP_Variable &var, void *val_pt } void DGUSScreenHandlerMKS::getZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t value = BE16_P(val_ptr); float val_distance = 0; - switch (value) { - case 0: val_distance = 0.01; break; - case 1: val_distance = 0.1; break; - case 2: val_distance = 0.5; break; - case 3: val_distance = 1; break; - default: val_distance = 0.01; break; + switch (BE16_P(val_ptr)) { + default: + case 0: val_distance = 0.01f; break; + case 1: val_distance = 0.10f; break; + case 2: val_distance = 0.50f; break; + case 3: val_distance = 1.00f; break; } ZOffset_distance = val_distance; } @@ -354,11 +352,10 @@ void DGUSScreenHandlerMKS::getManualMovestep(DGUS_VP_Variable &var, void *val_pt } void DGUSScreenHandlerMKS::eepromControl(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t eep_flag = BE16_P(val_ptr); - switch (eep_flag) { + switch (BE16_P(val_ptr)) { case 0: settings.save(); - settings.load(); // load eeprom data to check the data is right + //settings.load(); // Load EEPROM to validate the data gotoScreen(MKSLCD_SCREEN_EEP_Config); break; @@ -366,56 +363,39 @@ void DGUSScreenHandlerMKS::eepromControl(DGUS_VP_Variable &var, void *val_ptr) { settings.reset(); gotoScreen(MKSLCD_SCREEN_EEP_Config); break; - - default: break; } } void DGUSScreenHandlerMKS::zOffsetSelect(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t z = BE16_P(val_ptr); - switch (z) { - case 0: Z_distance = 0.01; break; - case 1: Z_distance = 0.1; break; - case 2: Z_distance = 0.5; break; - default: Z_distance = 1; break; + switch (BE16_P(val_ptr)) { + case 0: Z_distance = 0.01f; break; + case 1: Z_distance = 0.10f; break; + case 2: Z_distance = 0.50f; break; + case 3: + default: Z_distance = 1.00f; break; } } void DGUSScreenHandlerMKS::getOffsetValue(DGUS_VP_Variable &var, void *val_ptr) { - #if HAS_BED_PROBE - const int32_t value = BE32_P(val_ptr); - const float Offset = value / 100.0f; - + const float offset = BE32_P(val_ptr) / 100.0f; switch (var.VP) { default: break; - case VP_OFFSET_X: probe.offset.x = Offset; break; - case VP_OFFSET_Y: probe.offset.y = Offset; break; - case VP_OFFSET_Z: probe.offset.z = Offset; break; + case VP_OFFSET_X: probe.offset.x = offset; break; + case VP_OFFSET_Y: probe.offset.y = offset; break; + case VP_OFFSET_Z: probe.offset.z = offset; break; } settings.save(); #endif } void DGUSScreenHandlerMKS::languageChange(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t lag_flag = BE16_P(val_ptr); - switch (lag_flag) { - case MKS_SimpleChinese: - languageDisplay(MKS_SimpleChinese); - mks_language_index = MKS_SimpleChinese; - dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_Choose); - dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_NoChoose); - settings.save(); - break; - case MKS_English: - languageDisplay(MKS_English); - mks_language_index = MKS_English; - dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_NoChoose); - dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_Choose); - settings.save(); - break; - default: break; - } + const MKS_Language lang = (MKS_Language)BE16_P(val_ptr); + if (lang != MKS_SimpleChinese && lang != MKS_English) return; + mks_language_index = lang; + updateDisplayLanguage(); + languagePInit(); + settings.save(); } #if ENABLED(MESH_BED_LEVELING) @@ -426,8 +406,8 @@ void DGUSScreenHandlerMKS::levelControl(DGUS_VP_Variable &var, void *val_ptr) { #if ENABLED(MESH_BED_LEVELING) auto cs = getCurrentScreen(); #endif - const uint16_t lev_but = BE16_P(val_ptr); - switch (lev_but) { + + switch (BE16_P(val_ptr)) { case 0: #if ENABLED(AUTO_BED_LEVELING_BILINEAR) @@ -442,22 +422,27 @@ void DGUSScreenHandlerMKS::levelControl(DGUS_VP_Variable &var, void *val_ptr) { mesh_point_count = GRID_MAX_POINTS; - if (mks_language_index == MKS_English) { - const char level_buf_en[] = "Start Level"; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en, 32, true); - } - else if (mks_language_index == MKS_SimpleChinese) { - const uint16_t level_buf_ch[] = {0xAABF, 0xBCCA, 0xF7B5, 0xBDC6, 0x2000}; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch, 32, true); + switch (mks_language_index) { + default: + case MKS_English: { + const char level_buf_en[] = "Start Leveling"; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_en); + } break; + case MKS_SimpleChinese: { + const uint16_t level_buf_ch[] = { 0xAABF, 0xBCCA, 0xF7B5, 0xBDC6, 0x2000 }; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_ch); + } break; } cs = getCurrentScreen(); if (cs != MKSLCD_AUTO_LEVEL) gotoScreen(MKSLCD_AUTO_LEVEL); + #else gotoScreen(MKSLCD_SCREEN_LEVEL); #endif + break; case 1: @@ -470,26 +455,23 @@ void DGUSScreenHandlerMKS::levelControl(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandlerMKS::meshLevelDistanceConfig(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t mesh_dist = BE16_P(val_ptr); - switch (mesh_dist) { - case 0: mesh_adj_distance = 0.01; break; - case 1: mesh_adj_distance = 0.1; break; - case 2: mesh_adj_distance = 1; break; - default: mesh_adj_distance = 0.1; break; + switch (BE16_P(val_ptr)) { + case 0: mesh_adj_distance = 0.01f; break; + case 1: mesh_adj_distance = 0.10f; break; + case 2: mesh_adj_distance = 1.00f; break; + default: mesh_adj_distance = 0.10f; break; } } void DGUSScreenHandlerMKS::meshLevel(DGUS_VP_Variable &var, void *val_ptr) { #if ENABLED(MESH_BED_LEVELING) - const uint16_t mesh_val = BE16_P(val_ptr); - // static uint8_t a_first_level = 1; char cmd_buf[30]; float offset = mesh_adj_distance; int16_t integer, Deci, Deci2; if (!queue.ring_buffer.empty()) return; - switch (mesh_val) { + switch (BE16_P(val_ptr)) { case 0: offset = mesh_adj_distance; integer = offset; // get int @@ -502,7 +484,6 @@ void DGUSScreenHandlerMKS::meshLevel(DGUS_VP_Variable &var, void *val_ptr) { snprintf_P(cmd_buf, 30, PSTR("G1 Z%d.%d%d"), integer, Deci, Deci2); queue.enqueue_one_now(cmd_buf); queue.enqueue_now(F("G90")); - //soft_endstop._enabled = true; break; case 1: @@ -521,42 +502,49 @@ void DGUSScreenHandlerMKS::meshLevel(DGUS_VP_Variable &var, void *val_ptr) { case 2: if (mesh_point_count == GRID_MAX_POINTS) { // The first point - - queue.enqueue_now(F("G28")); - queue.enqueue_now(F("G29S1")); + queue.enqueue_now(F("G28\nG29S1")); mesh_point_count--; - if (mks_language_index == MKS_English) { - const char level_buf_en1[] = "Next Point"; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en1, 32, true); - } - else if (mks_language_index == MKS_SimpleChinese) { - const uint16_t level_buf_ch1[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch1, 32, true); + switch (mks_language_index) { + default: + case MKS_English: { + const char level_buf_en1[] = "Next Point"; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_en1); + } break; + case MKS_SimpleChinese: { + const uint16_t level_buf_ch1[] = { 0xC2CF, 0xBBD2, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_ch1); + } break; } } - else if (mesh_point_count > 1) { // 倒数第二个点 + else if (mesh_point_count > 1) { queue.enqueue_now(F("G29S2")); mesh_point_count--; - if (mks_language_index == MKS_English) { - const char level_buf_en2[] = "Next Point"; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); - } - else if (mks_language_index == MKS_SimpleChinese) { - const uint16_t level_buf_ch2[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); + switch (mks_language_index) { + default: + case MKS_English: { + const char level_buf_en2[] = "Next Point"; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_en2); + } break; + case MKS_SimpleChinese: { + const uint16_t level_buf_ch2[] = { 0xC2CF, 0xBBD2, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_ch2); + } break; } } else if (mesh_point_count == 1) { queue.enqueue_now(F("G29S2")); mesh_point_count--; - if (mks_language_index == MKS_English) { - const char level_buf_en2[] = "Leveling Done"; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); - } - else if (mks_language_index == MKS_SimpleChinese) { - const uint16_t level_buf_ch2[] = {0xF7B5, 0xBDC6, 0xEACD, 0xC9B3, 0x2000}; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); + switch (mks_language_index) { + default: + case MKS_English: { + const char level_buf_en2[] = "Leveling Done"; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_en2); + } break; + case MKS_SimpleChinese: { + const uint16_t level_buf_ch2[] = { 0xF7B5, 0xBDC6, 0xEACD, 0xC9B3, 0x2000 }; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_ch2); + } break; } settings.save(); } @@ -568,8 +556,7 @@ void DGUSScreenHandlerMKS::meshLevel(DGUS_VP_Variable &var, void *val_ptr) { } break; - default: - break; + default: break; } #endif // MESH_BED_LEVELING } @@ -579,8 +566,7 @@ void DGUSScreenHandlerMKS::sdFileBack(DGUS_VP_Variable&, void*) { } void DGUSScreenHandlerMKS::lcdBLKAdjust(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t lcd_val = BE16_P(val_ptr); - lcd_default_light = constrain(lcd_val, 10, 100); + lcd_default_light = constrain(BE16_P(val_ptr), 10, 100); const uint16_t lcd_data[2] = { lcd_default_light, lcd_default_light }; dgus.writeVariable(0x0082, &lcd_data, 5, true); @@ -646,30 +632,24 @@ void DGUSScreenHandlerMKS::tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr) switch (var.VP) { case VP_TMC_X_STEP: - #if USE_SENSORLESS - #if X_HAS_STEALTHCHOP - stepperX.homing_threshold(mks_min(tmc_val, 255)); - settings.save(); - //tmc_step.x = stepperX.homing_threshold(); - #endif + #if USE_SENSORLESS && X_HAS_STEALTHCHOP + stepperX.homing_threshold(mks_min(tmc_val, 255)); + settings.save(); + //tmc_step.x = stepperX.homing_threshold(); #endif break; case VP_TMC_Y_STEP: - #if USE_SENSORLESS - #if Y_HAS_STEALTHCHOP - stepperY.homing_threshold(mks_min(tmc_val, 255)); - settings.save(); - //tmc_step.y = stepperY.homing_threshold(); - #endif + #if USE_SENSORLESS && Y_HAS_STEALTHCHOP + stepperY.homing_threshold(mks_min(tmc_val, 255)); + settings.save(); + //tmc_step.y = stepperY.homing_threshold(); #endif break; case VP_TMC_Z_STEP: - #if USE_SENSORLESS - #if Z_HAS_STEALTHCHOP - stepperZ.homing_threshold(mks_min(tmc_val, 255)); - settings.save(); - //tmc_step.z = stepperZ.homing_threshold(); - #endif + #if USE_SENSORLESS && Z_HAS_STEALTHCHOP + stepperZ.homing_threshold(mks_min(tmc_val, 255)); + settings.save(); + //tmc_step.z = stepperZ.homing_threshold(); #endif break; case VP_TMC_X_Current: @@ -691,7 +671,7 @@ void DGUSScreenHandlerMKS::tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr) #endif break; case VP_TMC_Y1_Current: - #if X2_IS_TRINAMIC + #if Y2_IS_TRINAMIC stepperY2.rms_current(tmc_val); settings.save(); #endif @@ -721,8 +701,7 @@ void DGUSScreenHandlerMKS::tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr) #endif break; - default: - break; + default: break; } #if USE_SENSORLESS TERN_(X_HAS_STEALTHCHOP, tmc_step.x = stepperX.homing_threshold()); @@ -749,55 +728,38 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { default: return; #if HAS_X_AXIS case VP_MOVE_X: - axiscode = 'X'; - if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + if (!ExtUI::canMove(ExtUI::axis_t::X)) return; + axiscode = 'X'; speed = manual_feedrate_mm_m.x; break; #endif #if HAS_Y_AXIS case VP_MOVE_Y: - axiscode = 'Y'; - speed = manual_feedrate_mm_m.y; - if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; + if (!ExtUI::canMove(ExtUI::axis_t::Y)) return; + axiscode = 'Y'; speed = manual_feedrate_mm_m.y; break; #endif #if HAS_Z_AXIS case VP_MOVE_Z: - axiscode = 'Z'; - speed = manual_feedrate_mm_m.z; - if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; + if (!ExtUI::canMove(ExtUI::axis_t::Z)) return; + axiscode = 'Z'; speed = manual_feedrate_mm_m.z; break; #endif - case VP_MOTOR_LOCK_UNLOK: - movevalue = 5; - break; + case VP_MOTOR_LOCK_UNLOCK: movevalue = 5; break; - case VP_HOME_ALL: // only used for homing - axiscode = '\0'; - movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. - break; + // Ignore value sent from display, this VP is _ONLY_ for homing. + case VP_HOME_ALL: axiscode = '\0'; movevalue = 0; break; #if HAS_X_AXIS - case VP_X_HOME: - axiscode = 'X'; - movevalue = 0; - break; + case VP_X_HOME: axiscode = 'X'; movevalue = 0; break; #endif - #if HAS_Y_AXIS - case VP_Y_HOME: - axiscode = 'Y'; - movevalue = 0; - break; + case VP_Y_HOME: axiscode = 'Y'; movevalue = 0; break; #endif - #if HAS_Z_AXIS - case VP_Z_HOME: - axiscode = 'Z'; - movevalue = 0; - break; + case VP_Z_HOME: axiscode = 'Z'; movevalue = 0; break; #endif } @@ -810,70 +772,55 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } if (!movevalue) { - // char buf[6] = "G28 X"; - // buf[4] = axiscode; - - char buf[6]; - sprintf(buf, "G28 %c", axiscode); - queue.enqueue_one_now(buf); + queue.enqueue_one_now(TS(F("G28"), axiscode)); forceCompleteUpdate(); return; } - else if (movevalue == 5) { - char buf[6]; - snprintf_P(buf,6,PSTR("M84 %c"), axiscode); - queue.enqueue_one_now(buf); + + if (movevalue == 5) { + queue.enqueue_one_now(TS(F("M84"), axiscode)); forceCompleteUpdate(); return; } - else { - // movement - const bool old_relative_mode = relative_mode; - if (!relative_mode) queue.enqueue_now(F("G91")); - char buf[32]; // G1 X9999.99 F12345 - //const uint16_t backup_speed = MMS_TO_MMM(feedrate_mm_s); - char sign[] = "\0"; - int16_t value = movevalue / 100; - if (movevalue < 0) { value = -value; sign[0] = '-'; } - const int16_t fraction = ABS(movevalue) % 100; - snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); - queue.enqueue_one_now(buf); - //if (backup_speed != speed) { - // snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); - // queue.enqueue_one_now(buf); - //} + // Movement + const bool old_relative_mode = relative_mode; + if (!relative_mode) queue.enqueue_now(F("G91")); + char buf[32]; // G1 X9999.99 F12345 + //const uint16_t backup_speed = MMS_TO_MMM(feedrate_mm_s); + char sign[] = "\0"; + int16_t value = movevalue / 100; + if (movevalue < 0) { value = -value; sign[0] = '-'; } + const int16_t fraction = ABS(movevalue) % 100; + snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); + queue.enqueue_one_now(buf); - //while (!enqueue_and_echo_command(buf)) idle(); + //if (backup_speed != speed) { + // snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); + // queue.enqueue_one_now(buf); + //} - if (!old_relative_mode) queue.enqueue_now(F("G90")); - } + //while (!enqueue_and_echo_command(buf)) idle(); + + if (!old_relative_mode) queue.enqueue_now(F("G90")); forceCompleteUpdate(); - - cannotmove: - return; } void DGUSScreenHandlerMKS::getParkPos(DGUS_VP_Variable &var, void *val_ptr) { const int16_t pos = BE16_P(val_ptr); - switch (var.VP) { case VP_X_PARK_POS: mks_park_pos.x = pos; break; case VP_Y_PARK_POS: mks_park_pos.y = pos; break; case VP_Z_PARK_POS: mks_park_pos.z = pos; break; - default: break; } - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleChangeLevelPoint(DGUS_VP_Variable &var, void *val_ptr) { - const int16_t raw = BE16_P(val_ptr); - - *(int16_t*)var.memadr = raw; - + *(int16_t*)var.memadr = BE16_P(val_ptr); settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } #if ENABLED(EDITABLE_STEPS_PER_UNIT) @@ -910,7 +857,7 @@ void DGUSScreenHandlerMKS::handleChangeLevelPoint(DGUS_VP_Variable &var, void *v } ExtUI::setAxisSteps_per_mm(value, extruder); settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } #endif // EDITABLE_STEPS_PER_UNIT @@ -938,16 +885,16 @@ void DGUSScreenHandlerMKS::handleExtruderMaxSpeedChange(DGUS_VP_Variable &var, v ExtUI::extruder_t extruder; switch (var.VP) { default: return; - #if HAS_HOTEND - case VP_E0_MAX_SPEED: extruder = ExtUI::extruder_t::E0; break; - #endif - #if HAS_MULTI_HOTEND - #endif - case VP_E1_MAX_SPEED: extruder = ExtUI::extruder_t::E1; break; + #if HAS_HOTEND + case VP_E0_MAX_SPEED: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HAS_MULTI_HOTEND + case VP_E1_MAX_SPEED: extruder = ExtUI::extruder_t::E1; break; + #endif } ExtUI::setAxisMaxFeedrate_mm_s(value, extruder); settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleMaxAccChange(DGUS_VP_Variable &var, void *val_ptr) { @@ -981,74 +928,71 @@ void DGUSScreenHandlerMKS::handleExtruderAccChange(DGUS_VP_Variable &var, void * } ExtUI::setAxisMaxAcceleration_mm_s2(value, extruder); settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleTravelAccChange(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t travel = BE16_P(val_ptr); - planner.settings.travel_acceleration = (float)travel; - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + planner.settings.travel_acceleration = (float)BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleFeedRateMinChange(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t t = BE16_P(val_ptr); - planner.settings.min_feedrate_mm_s = (float)t; - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + planner.settings.min_feedrate_mm_s = (float)BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleMin_T_F(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t t_f = BE16_P(val_ptr); - planner.settings.min_travel_feedrate_mm_s = (float)t_f; - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + planner.settings.min_travel_feedrate_mm_s = (float)BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleAccChange(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t acc = BE16_P(val_ptr); - planner.settings.acceleration = (float)acc; - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + planner.settings.acceleration = (float)BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } #if ENABLED(PREVENT_COLD_EXTRUSION) void DGUSScreenHandlerMKS::handleGetExMinTemp(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t ex_min_temp = BE16_P(val_ptr); - thermalManager.extrude_min_temp = ex_min_temp; - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + thermalManager.extrude_min_temp = BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } #endif #if HAS_PID_HEATING + void DGUSScreenHandler::handleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t rawvalue = BE16_P(val_ptr); - const float value = float(rawvalue); + const float value = (float)BE16_P(val_ptr); float newvalue = 0; switch (var.VP) { default: return; - #if HAS_HOTEND - case VP_E0_PID_P: newvalue = value; break; - case VP_E0_PID_I: newvalue = scalePID_i(value); break; - case VP_E0_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HAS_MULTI_HOTEND - case VP_E1_PID_P: newvalue = value; break; - case VP_E1_PID_I: newvalue = scalePID_i(value); break; - case VP_E1_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HAS_HEATED_BED - case VP_BED_PID_P: newvalue = value; break; - case VP_BED_PID_I: newvalue = scalePID_i(value); break; - case VP_BED_PID_D: newvalue = scalePID_d(value); break; - #endif + #if HAS_HOTEND + case VP_E0_PID_P: newvalue = value; break; + case VP_E0_PID_I: newvalue = scalePID_i(value); break; + case VP_E0_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_MULTI_HOTEND + case VP_E1_PID_P: newvalue = value; break; + case VP_E1_PID_I: newvalue = scalePID_i(value); break; + case VP_E1_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: newvalue = value; break; + case VP_BED_PID_I: newvalue = scalePID_i(value); break; + case VP_BED_PID_D: newvalue = scalePID_d(value); break; + #endif } *(float *)var.memadr = newvalue; settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } + #endif // HAS_PID_HEATING #if ENABLED(BABYSTEPPING) + void DGUSScreenHandler::handleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { const float step = ZOffset_distance; @@ -1088,22 +1032,17 @@ void DGUSScreenHandlerMKS::handleAccChange(DGUS_VP_Variable &var, void *val_ptr) } forceCompleteUpdate(); } + #endif // BABYSTEPPING void DGUSScreenHandlerMKS::getManualFilament(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t len = BE16_P(val_ptr); - const float value = (float)len; - - distanceFilament = value; - - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + distanceFilament = (float)BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::getManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t len = BE16_P(val_ptr); - filamentSpeed_mm_s = len; - - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + filamentSpeed_mm_s = BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::filamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir) { @@ -1146,7 +1085,7 @@ void DGUSScreenHandlerMKS::filamentLoadUnload(DGUS_VP_Variable &var, void *val_p #if ALL(HAS_HOTEND, PREVENT_COLD_EXTRUSION) if (hotend_too_cold) { if (thermalManager.targetTooColdToExtrude(hotend_too_cold - 1)) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, hotend_too_cold - 1); - sendInfoScreen(F("NOTICE"), nullptr, F("Please wait."), F("Nozzle heating!"), true, true, true, true); + sendInfoScreen(F("NOTICE"), nullptr, F("Please wait."), F("Nozzle heating!")); setupConfirmAction(nullptr); gotoScreen(DGUS_SCREEN_POPUP); } @@ -1154,11 +1093,11 @@ void DGUSScreenHandlerMKS::filamentLoadUnload(DGUS_VP_Variable &var, void *val_p if (swap_tool) { char buf[30]; - snprintf_P(buf, 30 + snprintf_P(buf, 30, #if ANY(HAS_MULTI_HOTEND, SINGLENOZZLE) - , PSTR("M1002T%cE%dF%d"), char('0' + swap_tool - 1) + PSTR("M1002T%cE%dF%d"), char('0' + swap_tool - 1) #else - , PSTR("M1002E%dF%d") + PSTR("M1002E%dF%d") #endif , (int)distanceFilament * filamentDir, filamentSpeed_mm_s * 60 ); @@ -1181,11 +1120,13 @@ void GcodeSuite::M1002() { const uint8_t old_axis_relative = axis_relative; set_e_relative(); // M83 + { char buf[20]; snprintf_P(buf, 20, PSTR("G1E%dF%d"), parser.intval('E'), parser.intval('F')); process_subcommands_now(buf); } + axis_relative = old_axis_relative; } @@ -1200,7 +1141,6 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) void DGUSScreenHandler::handleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { - uint8_t e_temp = 0; filament_data.heated = false; uint16_t preheat_option = BE16_P(val_ptr); if (preheat_option >= 10) { // Unload filament type @@ -1213,6 +1153,7 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) else // Cancel filament operation filament_data.action = 0; + uint8_t e_temp = 0; switch (preheat_option) { case 0: // Load PLA #ifdef PREHEAT_1_TEMP_HOTEND @@ -1220,7 +1161,9 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) #endif break; case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + #ifdef PREHEAT_2_TEMP_HOTEND + e_temp = PREHEAT_2_TEMP_HOTEND; + #endif break; case 2: // Load PET #ifdef PREHEAT_3_TEMP_HOTEND @@ -1234,35 +1177,31 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) break; case 9: // Cool down default: - e_temp = 0; - break; + e_temp = 0; break; } if (filament_data.action == 0) { // Go back to utility screen - #if HAS_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); - #endif - #if HAS_MULTI_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); - #endif + TERN_(HAS_EXTRUDERS, thermalManager.setTargetHotend(e_temp, 0)); + TERN_(HAS_MULTI_EXTRUDER, thermalManager.setTargetHotend(e_temp, 1)); gotoScreen(DGUS_SCREEN_UTILITY); + return; } - else { // Go to the preheat screen to show the heating progress - switch (var.VP) { - default: return; - #if HAS_HOTEND - case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - #if HAS_MULTI_HOTEND - case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - } + + // Go to the preheat screen to show the heating progress + switch (var.VP) { + default: return; + #if HAS_EXTRUDERS + case VP_E0_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = 0; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + #if HAS_MULTI_EXTRUDER + case VP_E1_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = 1; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif } } @@ -1278,7 +1217,7 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) if (!filament_data.heated) { filament_data.heated = true; } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; } else { // unload filament if (!filament_data.heated) { @@ -1287,14 +1226,14 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) } // Before unloading extrude to prevent jamming if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; filament_data.purge_length -= movevalue; } else { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) - movevalue; } } - ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0); } } @@ -1315,11 +1254,12 @@ bool DGUSScreenHandlerMKS::loop() { if (language_times != 0) { languagePInit(); - languageDisplay(mks_language_index); + updateDisplayLanguage(); language_times--; } #if ENABLED(SHOW_BOOTSCREEN) + static bool booted = false; if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) { booted = true; @@ -1347,24 +1287,15 @@ bool DGUSScreenHandlerMKS::loop() { #if ENABLED(DGUS_MKS_RUNOUT_SENSOR) if (booted && printingIsActive()) runoutIdle(); #endif + #endif // SHOW_BOOTSCREEN return isScreenComplete(); } void DGUSScreenHandlerMKS::languagePInit() { - switch (mks_language_index) { - case MKS_SimpleChinese: - dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_Choose); - dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_NoChoose); - break; - case MKS_English: - dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_NoChoose); - dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_Choose); - break; - default: - break; - } + dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)(mks_language_index == MKS_English ? MKS_Language_NoChoose : MKS_Language_Choose)); + dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)(mks_language_index == MKS_English ? MKS_Language_Choose : MKS_Language_NoChoose)); } void DGUSScreenHandlerMKS::extrudeLoadInit() { @@ -1397,542 +1328,544 @@ void DGUSScreenHandlerMKS::runoutIdle() { queue.inject(F("M25")); gotoScreen(MKSLCD_SCREEN_PAUSE); - sendInfoScreen(F("NOTICE"), nullptr, F("Please change filament!"), nullptr, true, true, true, true); + sendInfoScreen(F("NOTICE"), nullptr, F("Please change filament!"), nullptr); //setupConfirmAction(nullptr); gotoScreen(DGUS_SCREEN_POPUP); break; case UNRUNOUT_STATUS: - if (FILAMENT_IS_OUT()) - runout_mks.runout_status = RUNOUT_STATUS; + if (FILAMENT_IS_OUT()) runout_mks.runout_status = RUNOUT_STATUS; break; case RUNOUT_BEGIN_STATUS: - if (!FILAMENT_IS_OUT()) - runout_mks.runout_status = RUNOUT_WAITING_STATUS; + if (!FILAMENT_IS_OUT()) runout_mks.runout_status = RUNOUT_WAITING_STATUS; break; case RUNOUT_WAITING_STATUS: - if (FILAMENT_IS_OUT()) - runout_mks.runout_status = RUNOUT_BEGIN_STATUS; + if (FILAMENT_IS_OUT()) runout_mks.runout_status = RUNOUT_BEGIN_STATUS; break; default: break; } - #endif + #endif // DGUS_MKS_RUNOUT_SENSOR } -void DGUSScreenHandlerMKS::languageDisplay(uint8_t var) { - if (var == MKS_English) { - const char home_buf_en[] = "Home"; - dgus.writeVariable(VP_HOME_Dis, home_buf_en, 32, true); +void DGUSScreenHandlerMKS::updateDisplayLanguage() { + switch (mks_language_index) { + case MKS_English : { + const char home_buf_en[] = "Home"; + dgus.writeStringVar(VP_HOME_Dis, home_buf_en); - const char setting_buf_en[] = "Setting"; - dgus.writeVariable(VP_Setting_Dis, setting_buf_en, 32, true); + const char setting_buf_en[] = "Settings"; + dgus.writeStringVar(VP_Setting_Dis, setting_buf_en); - const char Tool_buf_en[] = "Tool"; - dgus.writeVariable(VP_Tool_Dis, Tool_buf_en, 32, true); + const char Tool_buf_en[] = "Tools"; + dgus.writeStringVar(VP_Tool_Dis, Tool_buf_en); - const char Print_buf_en[] = "Print"; - dgus.writeVariable(VP_Print_Dis, Print_buf_en, 32, true); + const char Print_buf_en[] = "Print"; + dgus.writeStringVar(VP_Print_Dis, Print_buf_en); - const char Language_buf_en[] = "Language"; - dgus.writeVariable(VP_Language_Dis, Language_buf_en, 32, true); + const char Language_buf_en[] = "Language"; + dgus.writeStringVar(VP_Language_Dis, Language_buf_en); - const char About_buf_en[] = "About"; - dgus.writeVariable(VP_About_Dis, About_buf_en, 32, true); + const char About_buf_en[] = "About"; + dgus.writeStringVar(VP_About_Dis, About_buf_en); - const char Config_buf_en[] = "Config"; - dgus.writeVariable(VP_Config_Dis, Config_buf_en, 32, true); + const char Config_buf_en[] = "Config"; + dgus.writeStringVar(VP_Config_Dis, Config_buf_en); - const char MotorConfig_buf_en[] = "MotorConfig"; - dgus.writeVariable(VP_MotorConfig_Dis, MotorConfig_buf_en, 32, true); + const char MotorConfig_buf_en[] = "Motion Config"; + dgus.writeStringVar(VP_MotorConfig_Dis, MotorConfig_buf_en); - const char LevelConfig_buf_en[] = "LevelConfig"; - dgus.writeVariable(VP_LevelConfig_Dis, LevelConfig_buf_en, 32, true); + const char LevelConfig_buf_en[] = "Level Config"; + dgus.writeStringVar(VP_LevelConfig_Dis, LevelConfig_buf_en); - const char TemperatureConfig_buf_en[] = "Temperature"; - dgus.writeVariable(VP_TemperatureConfig_Dis, TemperatureConfig_buf_en, 32, true); + const char TemperatureConfig_buf_en[] = "Temperature"; + dgus.writeStringVar(VP_TemperatureConfig_Dis, TemperatureConfig_buf_en); - const char Advance_buf_en[] = "Advance"; - dgus.writeVariable(VP_Advance_Dis, Advance_buf_en, 32, true); + const char Advance_buf_en[] = "Advanced"; + dgus.writeStringVar(VP_Advance_Dis, Advance_buf_en); - const char Filament_buf_en[] = "Extrude"; - dgus.writeVariable(VP_Filament_Dis, Filament_buf_en, 32, true); + const char Filament_buf_en[] = "Extrude"; + dgus.writeStringVar(VP_Filament_Dis, Filament_buf_en); - const char Move_buf_en[] = "Move"; - dgus.writeVariable(VP_Move_Dis, Move_buf_en, 32, true); + const char Move_buf_en[] = "Move"; + dgus.writeStringVar(VP_Move_Dis, Move_buf_en); - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - const char Level_buf_en[] = "AutoLevel"; - dgus.writeVariable(VP_Level_Dis, Level_buf_en, 32, true); - #elif ENABLED(MESH_BED_LEVELING) - const char Level_buf_en[] = "MeshLevel"; - dgus.writeVariable(VP_Level_Dis, Level_buf_en, 32, true); - #else - const char Level_buf_en[] = "Level"; - dgus.writeVariable(VP_Level_Dis, Level_buf_en, 32, true); - #endif + const char Level_buf_en[] = + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + "Auto" + #elif ENABLED(MESH_BED_LEVELING) + "Mesh" + #endif + "Level" + ; + dgus.writeStringVar(VP_Level_Dis, Level_buf_en); - const char MotorPluse_buf_en[] = "MotorPluse"; - dgus.writeVariable(VP_MotorPluse_Dis, MotorPluse_buf_en, 32, true); + const char MotorPulse_buf_en[] = "MotorPulse"; + dgus.writeStringVar(VP_MotorPulse_Dis, MotorPulse_buf_en); - const char MotorMaxSpeed_buf_en[] = "MotorMaxSpeed"; - dgus.writeVariable(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_en, 32, true); + const char MotorMaxSpeed_buf_en[] = "MotorMaxSpeed"; + dgus.writeStringVar(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_en); - const char MotorMaxAcc_buf_en[] = "MotorAcc"; - dgus.writeVariable(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_en, 32, true); + const char MotorMaxAcc_buf_en[] = "MotorAcc"; + dgus.writeStringVar(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_en); - const char TravelAcc_buf_en[] = "TravelAcc"; - dgus.writeVariable(VP_TravelAcc_Dis, TravelAcc_buf_en, 32, true); + const char TravelAcc_buf_en[] = "Travel Acc."; + dgus.writeStringVar(VP_TravelAcc_Dis, TravelAcc_buf_en); - const char FeedRateMin_buf_en[] = "FeedRateMin"; - dgus.writeVariable(VP_FeedRateMin_Dis, FeedRateMin_buf_en, 32, true); + const char FeedRateMin_buf_en[] = "Min FeedRate"; + dgus.writeStringVar(VP_FeedRateMin_Dis, FeedRateMin_buf_en); - const char TravelFeeRateMin_buf_en[] = "TravelFeedRateMin"; - dgus.writeVariable(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_en, 32, true); + const char TravelFeeRateMin_buf_en[] = "Travel Min FeedRate"; + dgus.writeStringVar(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_en); - const char Acc_buf_en[] = "Acc"; - dgus.writeVariable(VP_ACC_Dis, Acc_buf_en, 32, true); + const char Acc_buf_en[] = "Acceleration"; + dgus.writeStringVar(VP_ACC_Dis, Acc_buf_en); - const char Point_One_buf_en[] = "Point_First"; - dgus.writeVariable(VP_Point_One_Dis, Point_One_buf_en, 32, true); + const char Point_One_buf_en[] = "Point 1"; + dgus.writeStringVar(VP_Point_One_Dis, Point_One_buf_en); - const char Point_Two_buf_en[] = "Point_Second"; - dgus.writeVariable(VP_Point_Two_Dis, Point_Two_buf_en, 32, true); + const char Point_Two_buf_en[] = "Point 2"; + dgus.writeStringVar(VP_Point_Two_Dis, Point_Two_buf_en); - const char Point_Three_buf_en[] = "Point_Third"; - dgus.writeVariable(VP_Point_Three_Dis, Point_Three_buf_en, 32, true); + const char Point_Three_buf_en[] = "Point 3"; + dgus.writeStringVar(VP_Point_Three_Dis, Point_Three_buf_en); - const char Point_Four_buf_en[] = "Point_Fourth"; - dgus.writeVariable(VP_Point_Four_Dis, Point_Four_buf_en, 32, true); + const char Point_Four_buf_en[] = "Point 4"; + dgus.writeStringVar(VP_Point_Four_Dis, Point_Four_buf_en); - const char Point_Five_buf_en[] = "Point_Fifth"; - dgus.writeVariable(VP_Point_Five_Dis, Point_Five_buf_en, 32, true); + const char Point_Five_buf_en[] = "Point 5"; + dgus.writeStringVar(VP_Point_Five_Dis, Point_Five_buf_en); - const char Extrusion_buf_en[] = "Extrusion"; - dgus.writeVariable(VP_Extrusion_Dis, Extrusion_buf_en, 32, true); + const char Extrusion_buf_en[] = "Extrusion"; + dgus.writeStringVar(VP_Extrusion_Dis, Extrusion_buf_en); - const char HeatBed_buf_en[] = "HeatBed"; - dgus.writeVariable(VP_HeatBed_Dis, HeatBed_buf_en, 32, true); + const char HeatBed_buf_en[] = "HeatBed"; + dgus.writeStringVar(VP_HeatBed_Dis, HeatBed_buf_en); - const char FactoryDefaults_buf_en[] = "FactoryDefaults"; - dgus.writeVariable(VP_FactoryDefaults_Dis, FactoryDefaults_buf_en, 32, true); + const char FactoryDefaults_buf_en[] = "Factory Defaults"; + dgus.writeStringVar(VP_FactoryDefaults_Dis, FactoryDefaults_buf_en); - const char StoreSetting_buf_en[] = "StoreSetting"; - dgus.writeVariable(VP_StoreSetting_Dis, StoreSetting_buf_en, 32, true); + const char StoreSetting_buf_en[] = "Store Setting"; + dgus.writeStringVar(VP_StoreSetting_Dis, StoreSetting_buf_en); - const char PrintPauseConfig_buf_en[] = "PrintPauseConfig"; - dgus.writeVariable(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_en, 32, true); + const char PrintPauseConfig_buf_en[] = "PrintPause Config"; + dgus.writeStringVar(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_en); - const char X_Pluse_buf_en[] = "X_Pluse"; - dgus.writeVariable(VP_X_Pluse_Dis, X_Pluse_buf_en, 32, true); + const char X_Pulse_buf_en[] = "X_Pulse"; + dgus.writeStringVar(VP_X_Pulse_Dis, X_Pulse_buf_en); - const char Y_Pluse_buf_en[] = "Y_Pluse"; - dgus.writeVariable(VP_Y_Pluse_Dis, Y_Pluse_buf_en, 32, true); + const char Y_Pulse_buf_en[] = "Y_Pulse"; + dgus.writeStringVar(VP_Y_Pulse_Dis, Y_Pulse_buf_en); - const char Z_Pluse_buf_en[] = "Z_Pluse"; - dgus.writeVariable(VP_Z_Pluse_Dis, Z_Pluse_buf_en, 32, true); + const char Z_Pulse_buf_en[] = "Z_Pulse"; + dgus.writeStringVar(VP_Z_Pulse_Dis, Z_Pulse_buf_en); - const char E0_Pluse_buf_en[] = "E0_Pluse"; - dgus.writeVariable(VP_E0_Pluse_Dis, E0_Pluse_buf_en, 32, true); + const char E0_Pulse_buf_en[] = "E0_Pulse"; + dgus.writeStringVar(VP_E0_Pulse_Dis, E0_Pulse_buf_en); - const char E1_Pluse_buf_en[] = "E1_Pluse"; - dgus.writeVariable(VP_E1_Pluse_Dis, E1_Pluse_buf_en, 32, true); + const char E1_Pulse_buf_en[] = "E1_Pulse"; + dgus.writeStringVar(VP_E1_Pulse_Dis, E1_Pulse_buf_en); - const char X_Max_Speed_buf_en[] = "X_Max_Speed"; - dgus.writeVariable(VP_X_Max_Speed_Dis, X_Max_Speed_buf_en, 32, true); + const char X_Max_Speed_buf_en[] = "X Max Speed"; + dgus.writeStringVar(VP_X_Max_Speed_Dis, X_Max_Speed_buf_en); - const char Y_Max_Speed_buf_en[] = "Y_Max_Speed"; - dgus.writeVariable(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_en, 32, true); + const char Y_Max_Speed_buf_en[] = "Y Max Speed"; + dgus.writeStringVar(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_en); - const char Z_Max_Speed_buf_en[] = "Z_Max_Speed"; - dgus.writeVariable(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_en, 32, true); + const char Z_Max_Speed_buf_en[] = "Z Max Speed"; + dgus.writeStringVar(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_en); - const char E0_Max_Speed_buf_en[] = "E0_Max_Speed"; - dgus.writeVariable(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_en, 32, true); + const char E0_Max_Speed_buf_en[] = "E0 Max Speed"; + dgus.writeStringVar(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_en); - const char E1_Max_Speed_buf_en[] = "E1_Max_Speed"; - dgus.writeVariable(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_en, 32, true); + const char E1_Max_Speed_buf_en[] = "E1 Max Speed"; + dgus.writeStringVar(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_en); - const char X_Max_Acc_Speed_buf_en[] = "X_Max_Acc_Speed"; - dgus.writeVariable(VP_X_Max_Acc_Speed_Dis, X_Max_Acc_Speed_buf_en, 32, true); + const char X_Max_Acc_Speed_buf_en[] = "X Max Acc"; + dgus.writeStringVar(VP_X_Max_Acc_Dis, X_Max_Acc_Speed_buf_en); - const char Y_Max_Acc_Speed_buf_en[] = "Y_Max_Acc_Speed"; - dgus.writeVariable(VP_Y_Max_Acc_Speed_Dis, Y_Max_Acc_Speed_buf_en, 32, true); + const char Y_Max_Acc_Speed_buf_en[] = "Y Max Acc"; + dgus.writeStringVar(VP_Y_Max_Acc_Dis, Y_Max_Acc_Speed_buf_en); - const char Z_Max_Acc_Speed_buf_en[] = "Z_Max_Acc_Speed"; - dgus.writeVariable(VP_Z_Max_Acc_Speed_Dis, Z_Max_Acc_Speed_buf_en, 32, true); + const char Z_Max_Acc_Speed_buf_en[] = "Z Max Acc"; + dgus.writeStringVar(VP_Z_Max_Acc_Dis, Z_Max_Acc_Speed_buf_en); - const char E0_Max_Acc_Speed_buf_en[] = "E0_Max_Acc_Speed"; - dgus.writeVariable(VP_E0_Max_Acc_Speed_Dis, E0_Max_Acc_Speed_buf_en, 32, true); + const char E0_Max_Acc_Speed_buf_en[] = "E0 Max Acc"; + dgus.writeStringVar(VP_E0_Max_Acc_Dis, E0_Max_Acc_Speed_buf_en); - const char E1_Max_Acc_Speed_buf_en[] = "E1_Max_Acc_Speed"; - dgus.writeVariable(VP_E1_Max_Acc_Speed_Dis, E1_Max_Acc_Speed_buf_en, 32, true); + const char E1_Max_Acc_Speed_buf_en[] = "E1 Max Acc"; + dgus.writeStringVar(VP_E1_Max_Acc_Dis, E1_Max_Acc_Speed_buf_en); - const char X_PARK_POS_buf_en[] = "X_PARK_POS"; - dgus.writeVariable(VP_X_PARK_POS_Dis, X_PARK_POS_buf_en, 32, true); + const char X_PARK_POS_buf_en[] = "X Park Pos"; + dgus.writeStringVar(VP_X_PARK_POS_Dis, X_PARK_POS_buf_en); - const char Y_PARK_POS_buf_en[] = "Y_PARK_POS"; - dgus.writeVariable(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_en, 32, true); + const char Y_PARK_POS_buf_en[] = "Y Park Pos"; + dgus.writeStringVar(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_en); - const char Z_PARK_POS_buf_en[] = "Z_PARK_POS"; - dgus.writeVariable(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_en, 32, true); + const char Z_PARK_POS_buf_en[] = "Z Park Pos"; + dgus.writeStringVar(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_en); - const char Length_buf_en[] = "Length"; - dgus.writeVariable(VP_Length_Dis, Length_buf_en, 32, true); + const char Length_buf_en[] = "Length"; + dgus.writeStringVar(VP_Length_Dis, Length_buf_en); - const char Speed_buf_en[] = "Speed"; - dgus.writeVariable(VP_Speed_Dis, Speed_buf_en, 32, true); + const char Speed_buf_en[] = "Speed"; + dgus.writeStringVar(VP_Speed_Dis, Speed_buf_en); - const char InOut_buf_en[] = "InOut"; - dgus.writeVariable(VP_InOut_Dis, InOut_buf_en, 32, true); + const char InOut_buf_en[] = "In/Out"; + dgus.writeStringVar(VP_InOut_Dis, InOut_buf_en); - const char PrintTimet_buf_en[] = "PrintTime"; - dgus.writeVariable(VP_PrintTime_Dis, PrintTimet_buf_en, 32, true); + const char PrintTimet_buf_en[] = "Print Time"; + dgus.writeStringVar(VP_PrintTime_Dis, PrintTimet_buf_en); - const char E0_Temp_buf_en[] = "E0_Temp"; - dgus.writeVariable(VP_E0_Temp_Dis, E0_Temp_buf_en, 32, true); + const char E0_Temp_buf_en[] = "E0 Temp"; + dgus.writeStringVar(VP_E0_Temp_Dis, E0_Temp_buf_en); - const char E1_Temp_buf_en[] = "E1_Temp"; - dgus.writeVariable(VP_E1_Temp_Dis, E1_Temp_buf_en, 32, true); + const char E1_Temp_buf_en[] = "E1 Temp"; + dgus.writeStringVar(VP_E1_Temp_Dis, E1_Temp_buf_en); - const char HB_Temp_buf_en[] = "HB_Temp"; - dgus.writeVariable(VP_HB_Temp_Dis, HB_Temp_buf_en, 32, true); + const char HB_Temp_buf_en[] = "HB Temp"; + dgus.writeStringVar(VP_HB_Temp_Dis, HB_Temp_buf_en); - const char Feedrate_buf_en[] = "Feedrate"; - dgus.writeVariable(VP_Feedrate_Dis, Feedrate_buf_en, 32, true); + const char Feedrate_buf_en[] = "Feedrate"; + dgus.writeStringVar(VP_Feedrate_Dis, Feedrate_buf_en); - const char PrintAcc_buf_en[] = "PrintSpeed"; - dgus.writeVariable(VP_PrintAcc_Dis, PrintAcc_buf_en, 32, true); + const char PrintAcc_buf_en[] = "Print Speed"; + dgus.writeStringVar(VP_PrintAcc_Dis, PrintAcc_buf_en); - const char FAN_Speed_buf_en[] = "FAN_Speed"; - dgus.writeVariable(VP_Fan_Speed_Dis, FAN_Speed_buf_en, 32, true); + const char FAN_Speed_buf_en[] = "FAN Speed"; + dgus.writeStringVar(VP_Fan_Speed_Dis, FAN_Speed_buf_en); - const char Printing_buf_en[] = "Printing"; - dgus.writeVariable(VP_Printing_Dis, Printing_buf_en, 32, true); + const char Printing_buf_en[] = "Printing"; + dgus.writeStringVar(VP_Printing_Dis, Printing_buf_en); - const char Info_EEPROM_1_buf_en[] = "Store setting?"; - dgus.writeVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_en, 32, true); + const char Info_EEPROM_1_buf_en[] = "Store Settings?"; + dgus.writeStringVar(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_en); - const char Info_EEPROM_2_buf_en[] = "Revert setting?"; - dgus.writeVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_en, 32, true); + const char Info_EEPROM_2_buf_en[] = "Revert Settings?"; + dgus.writeStringVar(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_en); - const char Info_PrintFinish_1_buf_en[] = "Print Done"; - dgus.writeVariable(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_en, 32, true); + const char Info_PrintFinish_1_buf_en[] = "Print Done"; + dgus.writeStringVar(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_en); - const char TMC_X_Step_buf_en[] = "X_SenSitivity"; - dgus.writeVariable(VP_TMC_X_Step_Dis, TMC_X_Step_buf_en, 32, true); + const char TMC_X_Step_buf_en[] = "X Sensitivity"; + dgus.writeStringVar(VP_TMC_X_Step_Dis, TMC_X_Step_buf_en); - const char TMC_Y_Step_buf_en[] = "Y_SenSitivity"; - dgus.writeVariable(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_en, 32, true); + const char TMC_Y_Step_buf_en[] = "Y Sensitivity"; + dgus.writeStringVar(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_en); - const char TMC_Z_Step_buf_en[] = "Z_SenSitivity"; - dgus.writeVariable(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_en, 32, true); + const char TMC_Z_Step_buf_en[] = "Z Sensitivity"; + dgus.writeStringVar(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_en); - const char TMC_X_Current_buf_en[] = "X_Current"; - dgus.writeVariable(VP_TMC_X_Current_Dis, TMC_X_Current_buf_en, 32, true); + const char TMC_X_Current_buf_en[] = "X Current"; + dgus.writeStringVar(VP_TMC_X_Current_Dis, TMC_X_Current_buf_en); - const char TMC_Y_Current_buf_en[] = "Y_Current"; - dgus.writeVariable(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_en, 32, true); + const char TMC_Y_Current_buf_en[] = "Y Current"; + dgus.writeStringVar(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_en); - const char TMC_Z_Current_buf_en[] = "Z_Current"; - dgus.writeVariable(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_en, 32, true); + const char TMC_Z_Current_buf_en[] = "Z Current"; + dgus.writeStringVar(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_en); - const char TMC_E0_Current_buf_en[] = "E0_Current"; - dgus.writeVariable(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_en, 32, true); + const char TMC_E0_Current_buf_en[] = "E0 Current"; + dgus.writeStringVar(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_en); - const char TMC_X1_Current_buf_en[] = "X1_Current"; - dgus.writeVariable(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_en, 32, true); + const char TMC_X1_Current_buf_en[] = "X2 Current"; + dgus.writeStringVar(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_en); - const char TMC_Y1_Current_buf_en[] = "Y1_Current"; - dgus.writeVariable(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_en, 32, true); + const char TMC_Y1_Current_buf_en[] = "Y2 Current"; + dgus.writeStringVar(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_en); - const char TMC_Z1_Current_buf_en[] = "Z1_Current"; - dgus.writeVariable(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_en, 32, true); + const char TMC_Z1_Current_buf_en[] = "Z2 Current"; + dgus.writeStringVar(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_en); - const char TMC_E1_Current_buf_en[] = "E1_Current"; - dgus.writeVariable(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_en, 32, true); + const char TMC_E1_Current_buf_en[] = "E1 Current"; + dgus.writeStringVar(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_en); - const char Min_Ex_Temp_buf_en[] = "Min_Ex_Temp"; - dgus.writeVariable(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_en, 32, true); + const char Min_Ex_Temp_buf_en[] = "Min Extrude Temp"; + dgus.writeStringVar(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_en); - const char AutoLEVEL_INFO1_buf_en[] = "Please Press Button!"; - dgus.writeVariable(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_en, 32, true); + const char AutoLEVEL_INFO1_buf_en[] = "Please Press Button!"; + dgus.writeStringVar(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_en); - const char EX_TEMP_INFO2_buf_en[] = "Please wait a monent"; - dgus.writeVariable(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_en, 32, true); + const char EX_TEMP_INFO2_buf_en[] = "Please wait a moment"; + dgus.writeStringVar(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_en); - const char EX_TEMP_INFO3_buf_en[] = "Cancle"; - dgus.writeVariable(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_en, 32, true); + const char EX_TEMP_INFO3_buf_en[] = "Cancel"; + dgus.writeStringVar(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_en); - const char PrintConfrim_Info_buf_en[] = "Start Print?"; - dgus.writeVariable(VP_PrintConfrim_Info_Dis, PrintConfrim_Info_buf_en, 32, true); + const char PrintConfirm_Info_buf_en[] = "Start Print?"; + dgus.writeStringVar(VP_PrintConfirm_Info_Dis, PrintConfirm_Info_buf_en); - const char StopPrintConfrim_Info_buf_en[] = "Stop Print?"; - dgus.writeVariable(VP_StopPrintConfrim_Info_Dis, StopPrintConfrim_Info_buf_en, 32, true); + const char StopPrintConfirm_Info_buf_en[] = "Stop Print?"; + dgus.writeStringVar(VP_StopPrintConfirm_Info_Dis, StopPrintConfirm_Info_buf_en); - const char Printting_buf_en[] = "Printing"; - dgus.writeVariable(VP_Printting_Dis, Printting_buf_en, 32, true); + const char Printting_buf_en[] = "Printing"; + dgus.writeStringVar(VP_Printting_Dis, Printting_buf_en); - const char LCD_BLK_buf_en[] = "Backlight"; - dgus.writeVariable(VP_LCD_BLK_Dis, LCD_BLK_buf_en, 32, true); - } - else if (var == MKS_SimpleChinese) { - uint16_t home_buf_ch[] = { 0xF7D6, 0xB3D2 }; - dgus.writeVariable(VP_HOME_Dis, home_buf_ch, 4, true); + const char LCD_BLK_buf_en[] = "Backlight"; + dgus.writeStringVar(VP_LCD_BLK_Dis, LCD_BLK_buf_en); - const uint16_t Setting_Dis[] = { 0xE8C9, 0xC3D6, 0x2000, 0x2000, 0x2000 }; - dgus.writeVariable(VP_Setting_Dis, Setting_Dis, 7, true); + } break; // MKS_English - const uint16_t Tool_Dis[] = { 0xA4B9, 0xDFBE }; - dgus.writeVariable(VP_Tool_Dis, Tool_Dis, 4, true); + case MKS_SimpleChinese: { + uint16_t home_buf_ch[] = { 0xF7D6, 0xB3D2 }; + dgus.writeStringVar(VP_HOME_Dis, home_buf_ch, 4); - const uint16_t Print_buf_ch[] = { 0xF2B4, 0xA1D3, 0x2000 }; - dgus.writeVariable(VP_Print_Dis, Print_buf_ch, 6, true); + const uint16_t Setting_Dis[] = { 0xE8C9, 0xC3D6, 0x2000, 0x2000, 0x2000 }; + dgus.writeStringVar(VP_Setting_Dis, Setting_Dis, 7); - const uint16_t Language_buf_ch[] = { 0xEFD3, 0xD4D1, 0x2000, 0x2000 }; - dgus.writeVariable(VP_Language_Dis, Language_buf_ch, 8, true); + const uint16_t Tool_Dis[] = { 0xA4B9, 0xDFBE }; + dgus.writeStringVar(VP_Tool_Dis, Tool_Dis, 4); - const uint16_t About_buf_ch[] = { 0xD8B9, 0xDAD3, 0x2000 }; - dgus.writeVariable(VP_About_Dis, About_buf_ch, 6, true); + const uint16_t Print_buf_ch[] = { 0xF2B4, 0xA1D3, 0x2000 }; + dgus.writeStringVar(VP_Print_Dis, Print_buf_ch, 6); - const uint16_t Config_buf_ch[] = { 0xE4C5, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_Config_Dis, Config_buf_ch, 6, true); + const uint16_t Language_buf_ch[] = { 0xEFD3, 0xD4D1, 0x2000, 0x2000 }; + dgus.writeStringVar(VP_Language_Dis, Language_buf_ch, 8); - const uint16_t MotorConfig_buf_ch[] = { 0xE7B5, 0xFABB, 0xE4C5, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_MotorConfig_Dis, MotorConfig_buf_ch, 12, true); + const uint16_t About_buf_ch[] = { 0xD8B9, 0xDAD3, 0x2000 }; + dgus.writeStringVar(VP_About_Dis, About_buf_ch, 6); - const uint16_t LevelConfig_buf_ch[] = { 0xD6CA, 0xAFB6, 0xF7B5, 0xBDC6, 0xE8C9, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_LevelConfig_Dis, LevelConfig_buf_ch, 32, true); + const uint16_t Config_buf_ch[] = { 0xE4C5, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_Config_Dis, Config_buf_ch, 6); - const uint16_t TemperatureConfig_buf_ch[] = { 0xC2CE, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TemperatureConfig_Dis, TemperatureConfig_buf_ch, 11, true); + const uint16_t MotorConfig_buf_ch[] = { 0xE7B5, 0xFABB, 0xE4C5, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_MotorConfig_Dis, MotorConfig_buf_ch, 12); - const uint16_t Advance_buf_ch[] = { 0xDFB8, 0xB6BC, 0xE8C9, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_Advance_Dis, Advance_buf_ch, 16, true); + const uint16_t LevelConfig_buf_ch[] = { 0xD6CA, 0xAFB6, 0xF7B5, 0xBDC6, 0xE8C9, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_LevelConfig_Dis, LevelConfig_buf_ch, 32); - const uint16_t Filament_buf_ch[] = { 0xB7BC, 0xF6B3, 0x2000 }; - dgus.writeVariable(VP_Filament_Dis, Filament_buf_ch, 8, true); + const uint16_t TemperatureConfig_buf_ch[] = { 0xC2CE, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TemperatureConfig_Dis, TemperatureConfig_buf_ch, 11); - const uint16_t Move_buf_ch[] = { 0xC6D2, 0xAFB6, 0x2000 }; - dgus.writeVariable(VP_Move_Dis, Move_buf_ch, 4, true); + const uint16_t Advance_buf_ch[] = { 0xDFB8, 0xB6BC, 0xE8C9, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_Advance_Dis, Advance_buf_ch, 32); - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - const uint16_t Level_buf_ch[] = { 0xD4D7, 0xAFB6, 0xF7B5, 0xBDC6, 0x2000 }; - dgus.writeVariable(VP_Level_Dis, Level_buf_ch, 32, true); - #elif ENABLED(MESH_BED_LEVELING) - const uint16_t Level_buf_ch[] = { 0xF8CD, 0xF1B8, 0xF7B5, 0xBDC6, 0x2000 }; - dgus.writeVariable(VP_Level_Dis, Level_buf_ch, 32, true); - #else - const uint16_t Level_buf_ch[] = { 0xD6CA, 0xAFB6, 0xF7B5, 0xBDC6, 0x2000 }; - dgus.writeVariable(VP_Level_Dis, Level_buf_ch, 32, true); - #endif + const uint16_t Filament_buf_ch[] = { 0xB7BC, 0xF6B3, 0x2000 }; + dgus.writeStringVar(VP_Filament_Dis, Filament_buf_ch, 8); - const uint16_t MotorPluse_buf_ch[] = { 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_MotorPluse_Dis, MotorPluse_buf_ch, 16, true); + const uint16_t Move_buf_ch[] = { 0xC6D2, 0xAFB6, 0x2000 }; + dgus.writeStringVar(VP_Move_Dis, Move_buf_ch, 4); - const uint16_t MotorMaxSpeed_buf_ch[] = { 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_ch, 16, true); + const uint16_t Level_buf_ch[] = { + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + 0xD4D7, 0xAFB6 + #elif ENABLED(MESH_BED_LEVELING) + 0xF8CD, 0xF1B8 + #else + 0xD6CA, 0xAFB6 + #endif + , 0xF7B5, 0xBDC6, 0x2000 + }; + dgus.writeStringVar(VP_Level_Dis, Level_buf_ch, 32); - const uint16_t MotorMaxAcc_buf_ch[] = { 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_ch, 16, true); + const uint16_t MotorPulse_buf_ch[] = { 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_MotorPulse_Dis, MotorPulse_buf_ch); - const uint16_t TravelAcc_buf_ch[] = { 0xD5BF, 0xD0D0, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TravelAcc_Dis, TravelAcc_buf_ch, 16, true); + const uint16_t MotorMaxSpeed_buf_ch[] = { 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_ch); - const uint16_t FeedRateMin_buf_ch[] = { 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_FeedRateMin_Dis, FeedRateMin_buf_ch, 12, true); + const uint16_t MotorMaxAcc_buf_ch[] = { 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_ch); - const uint16_t TravelFeeRateMin_buf_ch[] = { 0xD5BF, 0xD0D0, 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_ch, 24, true); + const uint16_t TravelAcc_buf_ch[] = { 0xD5BF, 0xD0D0, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TravelAcc_Dis, TravelAcc_buf_ch); - const uint16_t Acc_buf_ch[] = { 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_ACC_Dis, Acc_buf_ch, 16, true); + const uint16_t FeedRateMin_buf_ch[] = { 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_FeedRateMin_Dis, FeedRateMin_buf_ch, 12); - const uint16_t Point_One_buf_ch[] = { 0xDAB5, 0xBBD2, 0xE3B5, 0x2000 }; - dgus.writeVariable(VP_Point_One_Dis, Point_One_buf_ch, 12, true); + const uint16_t TravelFeeRateMin_buf_ch[] = { 0xD5BF, 0xD0D0, 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_ch, 24); - const uint16_t Point_Two_buf_ch[] = { 0xDAB5, 0xFEB6, 0xE3B5, 0x2000 }; - dgus.writeVariable(VP_Point_Two_Dis, Point_Two_buf_ch, 12, true); + const uint16_t Acc_buf_ch[] = { 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_ACC_Dis, Acc_buf_ch); - const uint16_t Point_Three_buf_ch[] = { 0xDAB5, 0xFDC8, 0xE3B5, 0x2000 }; - dgus.writeVariable(VP_Point_Three_Dis, Point_Three_buf_ch, 12, true); + const uint16_t Point_One_buf_ch[] = { 0xDAB5, 0xBBD2, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_Point_One_Dis, Point_One_buf_ch, 12); - const uint16_t Point_Four_buf_ch[] = { 0xDAB5, 0xC4CB, 0xE3B5, 0x2000 }; - dgus.writeVariable(VP_Point_Four_Dis, Point_Four_buf_ch, 12, true); + const uint16_t Point_Two_buf_ch[] = { 0xDAB5, 0xFEB6, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_Point_Two_Dis, Point_Two_buf_ch, 12); - const uint16_t Point_Five_buf_ch[] = { 0xDAB5, 0xE5CE, 0xE3B5, 0x2000 }; - dgus.writeVariable(VP_Point_Five_Dis, Point_Five_buf_ch, 12, true); + const uint16_t Point_Three_buf_ch[] = { 0xDAB5, 0xFDC8, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_Point_Three_Dis, Point_Three_buf_ch, 12); - const uint16_t Extrusion_buf_ch[] = { 0xB7BC, 0xF6B3, 0xB7CD, 0x2000 }; - dgus.writeVariable(VP_Extrusion_Dis, Extrusion_buf_ch, 12, true); + const uint16_t Point_Four_buf_ch[] = { 0xDAB5, 0xC4CB, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_Point_Four_Dis, Point_Four_buf_ch, 12); - const uint16_t HeatBed_buf_ch[] = { 0xC8C8, 0xB2B4, 0x2000 }; - dgus.writeVariable(VP_HeatBed_Dis, HeatBed_buf_ch, 12, true); + const uint16_t Point_Five_buf_ch[] = { 0xDAB5, 0xE5CE, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_Point_Five_Dis, Point_Five_buf_ch, 12); - const uint16_t FactoryDefaults_buf_ch[] = { 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_FactoryDefaults_Dis, FactoryDefaults_buf_ch, 16, true); + const uint16_t Extrusion_buf_ch[] = { 0xB7BC, 0xF6B3, 0xB7CD, 0x2000 }; + dgus.writeStringVar(VP_Extrusion_Dis, Extrusion_buf_ch, 12); - const uint16_t StoreSetting_buf_ch[] = { 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_StoreSetting_Dis, StoreSetting_buf_ch, 16, true); + const uint16_t HeatBed_buf_ch[] = { 0xC8C8, 0xB2B4, 0x2000 }; + dgus.writeStringVar(VP_HeatBed_Dis, HeatBed_buf_ch, 12); - const uint16_t PrintPauseConfig_buf_ch[] = { 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_ch, 32, true); + const uint16_t FactoryDefaults_buf_ch[] = { 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_FactoryDefaults_Dis, FactoryDefaults_buf_ch); - const uint16_t X_Pluse_buf_ch[] = { 0x2058, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_X_Pluse_Dis, X_Pluse_buf_ch, 16, true); + const uint16_t StoreSetting_buf_ch[] = { 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_StoreSetting_Dis, StoreSetting_buf_ch); - const uint16_t Y_Pluse_buf_ch[] = { 0x2059, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_Y_Pluse_Dis, Y_Pluse_buf_ch, 16, true); + const uint16_t PrintPauseConfig_buf_ch[] = { 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_ch, 32); - const uint16_t Z_Pluse_buf_ch[] = { 0x205A, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_Z_Pluse_Dis, Z_Pluse_buf_ch, 16, true); + const uint16_t X_Pulse_buf_ch[] = { 0x2058, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_X_Pulse_Dis, X_Pulse_buf_ch); - const uint16_t E0_Pluse_buf_ch[] = { 0x3045, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_E0_Pluse_Dis, E0_Pluse_buf_ch, 16, true); + const uint16_t Y_Pulse_buf_ch[] = { 0x2059, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_Y_Pulse_Dis, Y_Pulse_buf_ch); - const uint16_t E1_Pluse_buf_ch[] = { 0x3145, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_E1_Pluse_Dis, E1_Pluse_buf_ch, 16, true); + const uint16_t Z_Pulse_buf_ch[] = { 0x205A, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_Z_Pulse_Dis, Z_Pulse_buf_ch); - const uint16_t X_Max_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_X_Max_Speed_Dis, X_Max_Speed_buf_ch, 16, true); + const uint16_t E0_Pulse_buf_ch[] = { 0x3045, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_E0_Pulse_Dis, E0_Pulse_buf_ch); - const uint16_t Y_Max_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_ch, 16, true); + const uint16_t E1_Pulse_buf_ch[] = { 0x3145, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_E1_Pulse_Dis, E1_Pulse_buf_ch); - const uint16_t Z_Max_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_ch, 16, true); + const uint16_t X_Max_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_X_Max_Speed_Dis, X_Max_Speed_buf_ch); - const uint16_t E0_Max_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_ch, 16, true); + const uint16_t Y_Max_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_ch); - const uint16_t E1_Max_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_ch, 16, true); + const uint16_t Z_Max_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_ch); - const uint16_t X_Max_Acc_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_X_Max_Acc_Speed_Dis, X_Max_Acc_Speed_buf_ch, 16, true); + const uint16_t E0_Max_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_ch); - const uint16_t Y_Max_Acc_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Y_Max_Acc_Speed_Dis, Y_Max_Acc_Speed_buf_ch, 16, true); + const uint16_t E1_Max_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_ch); - const uint16_t Z_Max_Acc_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Z_Max_Acc_Speed_Dis, Z_Max_Acc_Speed_buf_ch, 16, true); + const uint16_t X_Max_Acc_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_X_Max_Acc_Dis, X_Max_Acc_Speed_buf_ch); - const uint16_t E0_Max_Acc_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E0_Max_Acc_Speed_Dis, E0_Max_Acc_Speed_buf_ch, 16, true); + const uint16_t Y_Max_Acc_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Y_Max_Acc_Dis, Y_Max_Acc_Speed_buf_ch); - const uint16_t E1_Max_Acc_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E1_Max_Acc_Speed_Dis, E1_Max_Acc_Speed_buf_ch, 16, true); + const uint16_t Z_Max_Acc_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Z_Max_Acc_Dis, Z_Max_Acc_Speed_buf_ch); - const uint16_t X_PARK_POS_buf_ch[] = { 0x2058, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_X_PARK_POS_Dis, X_PARK_POS_buf_ch, 16, true); + const uint16_t E0_Max_Acc_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E0_Max_Acc_Dis, E0_Max_Acc_Speed_buf_ch); - const uint16_t Y_PARK_POS_buf_ch[] = { 0x2059, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_ch, 16, true); + const uint16_t E1_Max_Acc_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E1_Max_Acc_Dis, E1_Max_Acc_Speed_buf_ch); - const uint16_t Z_PARK_POS_buf_ch[] = { 0x205A, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_ch, 16, true); + const uint16_t X_PARK_POS_buf_ch[] = { 0x2058, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_X_PARK_POS_Dis, X_PARK_POS_buf_ch); - const uint16_t Length_buf_ch[] = { 0xBDB2, 0xA4B3, 0x2000 }; - dgus.writeVariable(VP_Length_Dis, Length_buf_ch, 8, true); + const uint16_t Y_PARK_POS_buf_ch[] = { 0x2059, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_ch); - const uint16_t Speed_buf_ch[] = { 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Speed_Dis, Speed_buf_ch, 8, true); + const uint16_t Z_PARK_POS_buf_ch[] = { 0x205A, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_ch); - const uint16_t InOut_buf_ch[] = { 0xF8BD, 0xF6B3, 0x2000 }; - dgus.writeVariable(VP_InOut_Dis, InOut_buf_ch, 8, true); + const uint16_t Length_buf_ch[] = { 0xBDB2, 0xA4B3, 0x2000 }; + dgus.writeStringVar(VP_Length_Dis, Length_buf_ch, 8); - const uint16_t PrintTimet_buf_en[] = { 0xF2B4, 0xA1D3, 0xB1CA, 0xE4BC, 0x2000 }; - dgus.writeVariable(VP_PrintTime_Dis, PrintTimet_buf_en, 16, true); + const uint16_t Speed_buf_ch[] = { 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Speed_Dis, Speed_buf_ch, 8); - const uint16_t E0_Temp_buf_ch[] = { 0x3045, 0xC2CE, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E0_Temp_Dis, E0_Temp_buf_ch, 16, true); + const uint16_t InOut_buf_ch[] = { 0xF8BD, 0xF6B3, 0x2000 }; + dgus.writeStringVar(VP_InOut_Dis, InOut_buf_ch, 8); - const uint16_t E1_Temp_buf_ch[] = { 0x3145, 0xC2CE, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E1_Temp_Dis, E1_Temp_buf_ch, 16, true); + const uint16_t PrintTimet_buf_ch[] = { 0xF2B4, 0xA1D3, 0xB1CA, 0xE4BC, 0x2000 }; + dgus.writeStringVar(VP_PrintTime_Dis, PrintTimet_buf_ch); - const uint16_t HB_Temp_buf_ch[] = { 0xC8C8, 0xB2B4, 0xC2CE, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_HB_Temp_Dis, HB_Temp_buf_ch, 16, true); + const uint16_t E0_Temp_buf_ch[] = { 0x3045, 0xC2CE, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E0_Temp_Dis, E0_Temp_buf_ch); - const uint16_t Feedrate_buf_ch[] = { 0xB7BC, 0xF6B3, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Feedrate_Dis, Feedrate_buf_ch, 16, true); + const uint16_t E1_Temp_buf_ch[] = { 0x3145, 0xC2CE, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E1_Temp_Dis, E1_Temp_buf_ch); - const uint16_t PrintAcc_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_PrintAcc_Dis, PrintAcc_buf_ch, 16, true); + const uint16_t HB_Temp_buf_ch[] = { 0xC8C8, 0xB2B4, 0xC2CE, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_HB_Temp_Dis, HB_Temp_buf_ch); - const uint16_t FAN_Speed_buf_ch[] = { 0xE7B7, 0xC8C9, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Fan_Speed_Dis, FAN_Speed_buf_ch, 16, true); + const uint16_t Feedrate_buf_ch[] = { 0xB7BC, 0xF6B3, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Feedrate_Dis, Feedrate_buf_ch); - const uint16_t Printing_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; - dgus.writeVariable(VP_Printing_Dis, Printing_buf_ch, 16, true); + const uint16_t PrintAcc_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_PrintAcc_Dis, PrintAcc_buf_ch); - const uint16_t Info_EEPROM_1_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; - dgus.writeVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_ch, 32, true); + const uint16_t FAN_Speed_buf_ch[] = { 0xE7B7, 0xC8C9, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Fan_Speed_Dis, FAN_Speed_buf_ch); - const uint16_t Info_EEPROM_2_buf_ch[] = { 0xC7CA, 0xF1B7, 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; - dgus.writeVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_ch, 32, true); + const uint16_t Printing_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; + dgus.writeStringVar(VP_Printing_Dis, Printing_buf_ch); - const uint16_t TMC_X_Step_buf_ch[] = { 0x2058, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TMC_X_Step_Dis, TMC_X_Step_buf_ch, 16, true); + const uint16_t Info_EEPROM_1_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; + dgus.writeStringVar(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_ch, 32); - const uint16_t TMC_Y_Step_buf_ch[] = { 0x2059, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_ch, 16, true); + const uint16_t Info_EEPROM_2_buf_ch[] = { 0xC7CA, 0xF1B7, 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; + dgus.writeStringVar(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_ch, 32); - const uint16_t TMC_Z_Step_buf_ch[] = { 0x205A, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_ch, 16, true); + const uint16_t TMC_X_Step_buf_ch[] = { 0x2058, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TMC_X_Step_Dis, TMC_X_Step_buf_ch); - const uint16_t Info_PrintFinish_1_buf_ch[] = { 0xF2B4, 0xA1D3, 0xEACD, 0xC9B3, 0x2000 }; - dgus.writeVariable(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_ch, 32, true); + const uint16_t TMC_Y_Step_buf_ch[] = { 0x2059, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_ch); - const uint16_t TMC_X_Current_buf_ch[] = { 0x2058, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_X_Current_Dis, TMC_X_Current_buf_ch, 16, true); + const uint16_t TMC_Z_Step_buf_ch[] = { 0x205A, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_ch); - const uint16_t TMC_Y_Current_buf_ch[] = { 0x2059, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_ch, 16, true); + const uint16_t Info_PrintFinish_1_buf_ch[] = { 0xF2B4, 0xA1D3, 0xEACD, 0xC9B3, 0x2000 }; + dgus.writeStringVar(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_ch, 32); - const uint16_t TMC_Z_Current_buf_ch[] = { 0x205A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_ch, 16, true); + const uint16_t TMC_X_Current_buf_ch[] = { 0x2058, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_X_Current_Dis, TMC_X_Current_buf_ch); - const uint16_t TMC_E0_Current_buf_ch[] = { 0x3045, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_ch, 16, true); + const uint16_t TMC_Y_Current_buf_ch[] = { 0x2059, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_ch); - const uint16_t TMC_X1_Current_buf_ch[] = { 0x3158, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_ch, 16, true); + const uint16_t TMC_Z_Current_buf_ch[] = { 0x205A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_ch); - const uint16_t TMC_Y1_Current_buf_ch[] = { 0x3159, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_ch, 16, true); + const uint16_t TMC_E0_Current_buf_ch[] = { 0x3045, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_ch); - const uint16_t TMC_Z1_Current_buf_ch[] = { 0x315A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_ch, 16, true); + const uint16_t TMC_X1_Current_buf_ch[] = { 0x3158, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_ch); - const uint16_t TMC_E1_Current_buf_ch[] = { 0x3145, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_ch, 16, true); + const uint16_t TMC_Y1_Current_buf_ch[] = { 0x3159, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_ch); - const uint16_t Min_Ex_Temp_buf_ch[] = { 0xEED7, 0xA1D0, 0xB7BC, 0xF6B3, 0xC2CE, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_ch, 32, true); + const uint16_t TMC_Z1_Current_buf_ch[] = { 0x315A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_ch); - const uint16_t AutoLEVEL_INFO1_buf_ch[] = { 0xEBC7, 0xB4B0, 0xC2CF, 0xB4B0, 0xA5C5, 0x2000 }; - dgus.writeVariable(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_ch, 32, true); + const uint16_t TMC_E1_Current_buf_ch[] = { 0x3145, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_ch); - const uint16_t EX_TEMP_INFO2_buf_ch[] = { 0xEBC7, 0xD4C9, 0xC8B5, 0x2000 }; - dgus.writeVariable(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_ch, 32, true); + const uint16_t Min_Ex_Temp_buf_ch[] = { 0xEED7, 0xA1D0, 0xB7BC, 0xF6B3, 0xC2CE, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_ch, 32); - const uint16_t EX_TEMP_INFO3_buf_ch[] = { 0xA1C8, 0xFBCF, 0xD3BC, 0xC8C8, 0x2000 }; - dgus.writeVariable(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_ch, 32, true); + const uint16_t AutoLEVEL_INFO1_buf_ch[] = { 0xEBC7, 0xB4B0, 0xC2CF, 0xB4B0, 0xA5C5, 0x2000 }; + dgus.writeStringVar(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_ch, 32); - const uint16_t PrintConfrim_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xAABF, 0xBCCA, 0xF2B4, 0xA1D3, 0x2000 }; - dgus.writeVariable(VP_PrintConfrim_Info_Dis, PrintConfrim_Info_buf_ch, 32, true); + const uint16_t EX_TEMP_INFO2_buf_ch[] = { 0xEBC7, 0xD4C9, 0xC8B5, 0x2000 }; + dgus.writeStringVar(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_ch, 32); - const uint16_t StopPrintConfrim_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3CD, 0xB9D6, 0xF2B4, 0xA1D3, 0x2000 }; - dgus.writeVariable(VP_StopPrintConfrim_Info_Dis, StopPrintConfrim_Info_buf_ch, 32, true); + const uint16_t EX_TEMP_INFO3_buf_ch[] = { 0xA1C8, 0xFBCF, 0xD3BC, 0xC8C8, 0x2000 }; + dgus.writeStringVar(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_ch, 32); - const uint16_t Printting_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; - dgus.writeVariable(VP_Printting_Dis, Printting_buf_ch, 32, true); + const uint16_t PrintConfirm_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xAABF, 0xBCCA, 0xF2B4, 0xA1D3, 0x2000 }; + dgus.writeStringVar(VP_PrintConfirm_Info_Dis, PrintConfirm_Info_buf_ch, 32); - const uint16_t LCD_BLK_buf_ch[] = { 0xB3B1, 0xE2B9, 0xE8C9, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_LCD_BLK_Dis, LCD_BLK_buf_ch, 32, true); - } + const uint16_t StopPrintConfirm_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3CD, 0xB9D6, 0xF2B4, 0xA1D3, 0x2000 }; + dgus.writeStringVar(VP_StopPrintConfirm_Info_Dis, StopPrintConfirm_Info_buf_ch, 32); + + const uint16_t Printting_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; + dgus.writeStringVar(VP_Printting_Dis, Printting_buf_ch, 32); + + const uint16_t LCD_BLK_buf_ch[] = { 0xB3B1, 0xE2B9, 0xE8C9, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_LCD_BLK_Dis, LCD_BLK_buf_ch, 32); + + } break; // MKS_SimpleChinese + } // switch } #endif // DGUS_LCD_UI_MKS diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h index 2a026f751e..7bcb7c0a02 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h @@ -25,6 +25,9 @@ enum DGUS_ScreenID : uint8_t; +enum MKS_Choose : uint8_t { MKS_Language_Choose, MKS_Language_NoChoose }; +enum MKS_Language : uint8_t { MKS_SimpleChinese, MKS_English }; + class DGUSScreenHandlerMKS : public DGUSScreenHandler { public: DGUSScreenHandlerMKS() = default; @@ -53,7 +56,7 @@ public: #if ENABLED(PREVENT_COLD_EXTRUSION) static void handleGetExMinTemp(DGUS_VP_Variable &var, void *val_ptr); #endif - static void languageDisplay(uint8_t var); + static void updateDisplayLanguage(); static void tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr); static void getTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr); static void languagePInit(); @@ -105,9 +108,6 @@ public: static bool loop(); }; -enum MKS_Choose : uint8_t { MKS_Language_Choose, MKS_Language_NoChoose }; -enum MKS_Language : uint8_t { MKS_SimpleChinese, MKS_English }; - extern MKS_Language mks_language_index; extern bool DGUSAutoTurnOff; diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp index 4875020f55..ac408e8d9c 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp @@ -150,7 +150,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_HOME_ALL, nullptr, screen.handleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOCK, nullptr, screen.handleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, screen.handlePowerLossRecovery, nullptr), #endif diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h index 136b90e641..d34b90b45f 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h @@ -111,7 +111,7 @@ constexpr uint16_t VP_MOVE_E1 = 0x2112; //constexpr uint16_t VP_MOVE_E4 = 0x2118; //constexpr uint16_t VP_MOVE_E5 = 0x211A; constexpr uint16_t VP_HOME_ALL = 0x2120; -constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; +constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2130; // Power loss recovery constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp index 943d8c50a5..0afc8a25ad 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp @@ -143,7 +143,7 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { updateNewScreen(target); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } @@ -290,7 +290,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif break; case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + #ifdef PREHEAT_2_TEMP_HOTEND + e_temp = PREHEAT_2_TEMP_HOTEND; + #endif break; case 2: // Load PET #ifdef PREHEAT_3_TEMP_HOTEND @@ -310,9 +312,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (filament_data.action == 0) { // Go back to utility screen #if HAS_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + thermalManager.setTargetHotend(e_temp, 0); #if HAS_MULTI_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + thermalManager.setTargetHotend(e_temp, 1); #endif #endif gotoScreen(DGUS_SCREEN_UTILITY); @@ -322,13 +324,13 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { default: return; #if HAS_HOTEND case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; + filament_data.extruder = 0; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif #if HAS_MULTI_HOTEND case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; + filament_data.extruder = 1; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif @@ -350,7 +352,7 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { //gotoScreen(DGUS_SCREEN_FILAMENT_LOADING); filament_data.heated = true; } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; } else { // unload filament if (!filament_data.heated) { @@ -359,14 +361,14 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } // Before unloading extrude to prevent jamming if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; filament_data.purge_length -= movevalue; } else { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) - movevalue; } } - ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0); } } #endif // DGUS_FILAMENT_LOADUNLOAD diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSSDCardHandler_Basic.cpp b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSSDCardHandler_Basic.cpp index 85c7b660a7..4cb0cdf89b 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSSDCardHandler_Basic.cpp +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSSDCardHandler_Basic.cpp @@ -52,7 +52,7 @@ void DGUS_SDCardHandler::Reset() { currentSeekPos++; } - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) DEBUG_ECHOPGM("Reset() :", fileCount); DEBUG_CHAR('/'); DEBUG_ECHOLN(currentSeekPos); @@ -71,7 +71,7 @@ void DGUS_SDCardHandler::onPageLoad(DGUS_SDCardHandler::page_t page) { uint16_t currentSeekPos = 0; uint16_t entriesCount = fileList.count(); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) DEBUG_ECHOLNPGM("onPageLoad(): seek page ", pageIndex); #endif while (currentFilePos < pageIndex * DGUS_E3S1PRO_BASIC_SDCARD_FILES_PER_PAGE @@ -83,7 +83,7 @@ void DGUS_SDCardHandler::onPageLoad(DGUS_SDCardHandler::page_t page) { currentFilePos++; } - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) DEBUG_ECHOPGM("onPageLoad() :", currentFilePos); DEBUG_CHAR('/'); DEBUG_ECHOLN(currentSeekPos - 1); diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp index c88412fe2c..938663f9b3 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp @@ -208,7 +208,7 @@ void DGUSScreenHandler::userConfirmation() { if (confirm_return_screen >= DGUS_ScreenID::FILE1 && confirm_return_screen <= DGUS_ScreenID::FILE4) dgus_sdcard_handler.onPageLoad(DGUS_SCREEN_TO_PAGE(confirm_return_screen)); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) DEBUG_ECHOLNPGM("trig confirmed, ret:", (uint16_t)confirm_return_screen); #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index c581bab4e3..259a81fb0e 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -112,7 +112,7 @@ void menu_advanced_settings(); #else #define S1_SPACE(I) #endif - #define STOP_ITEM(A,I,M,L) TERN(HAS_##A##I##_##M##_STATE, _STOP_ITEM, _IF_1_ELSE)(STRINGIFY(A) STRINGIFY(I) S1_SPACE(I) " " L, A##I##_##M) + #define STOP_ITEM(A,I,M,L) TERN(HAS_##A##I##_##M##_STATE, _STOP_ITEM, OMIT)(STRINGIFY(A) STRINGIFY(I) S1_SPACE(I) " " L, A##I##_##M) #define STOP_MINMAX(A,I) STOP_ITEM(A,I,MIN,"Min") STOP_ITEM(A,I,MAX,"Max") #define FIL_ITEM(N) PSTRING_ITEM_N_P(N-1, MSG_FILAMENT_EN, FILAMENT_IS_OUT(N) ? PSTR("out") : PSTR("PRESENT"), SS_FULL); diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index 10ae915beb..1ef217b64a 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -32,7 +32,7 @@ #define ES_ENUM(A,M) _ES_ENUM(A,M) #define _ES_ITEM(N) , N -#define ES_ITEM(K,N) TERN(K,_ES_ITEM,_IF_1_ELSE)(N) +#define ES_ITEM(K,N) TERN(K,_ES_ITEM,OMIT)(N) #define _ESN_ITEM(K,A,M) ES_ITEM(K,ES_ENUM(A,M)) #define ES_MINMAX(A) ES_ITEM(HAS_##A##_MIN_STATE, ES_ENUM(A,MIN)) ES_ITEM(HAS_##A##_MAX_STATE, ES_ENUM(A,MAX)) diff --git a/Marlin/src/pins/samd/pins_MINITRONICS20.h b/Marlin/src/pins/samd/pins_MINITRONICS20.h index 83206e3bc6..0f61aea713 100644 --- a/Marlin/src/pins/samd/pins_MINITRONICS20.h +++ b/Marlin/src/pins/samd/pins_MINITRONICS20.h @@ -128,7 +128,7 @@ #endif // Verify that drivers match the hardware -#if (HAS_X_AXIS && !AXIS_DRIVER_TYPE_X(DRV8825)) || (HAS_Y_AXIS && !AXIS_DRIVER_TYPE_Y(DRV8825)) || (HAS_Z_AXIS && !AXIS_DRIVER_TYPE_Z(DRV8825)) || (HAS_EXTRUDER && !AXIS_DRIVER_TYPE_E0(DRV8825)) +#if (HAS_X_AXIS && !AXIS_DRIVER_TYPE_X(DRV8825)) || (HAS_Y_AXIS && !AXIS_DRIVER_TYPE_Y(DRV8825)) || (HAS_Z_AXIS && !AXIS_DRIVER_TYPE_Z(DRV8825)) || (HAS_EXTRUDERS && !AXIS_DRIVER_TYPE_E0(DRV8825)) #error "Minitronics v2.0 has hard-wired DRV8825 drivers. Comment out this line to continue." #endif diff --git a/buildroot/tests/FYSETC_F6 b/buildroot/tests/FYSETC_F6 index 6dd7bb60fa..4c647d57d4 100755 --- a/buildroot/tests/FYSETC_F6 +++ b/buildroot/tests/FYSETC_F6 @@ -13,6 +13,13 @@ restore_configs opt_set MOTHERBOARD BOARD_FYSETC_F6_13 LCD_SERIAL_PORT 1 DGUS_LCD_UI FYSETC exec_test $1 $2 "DGUS (FYSETC)" "$3" +# +# Test DGUS_LCD_UI MKS +# +restore_configs +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 LCD_SERIAL_PORT 1 DGUS_LCD_UI MKS +exec_test $1 $2 "DGUS (MKS)" "$3" + # # Test DGUS_LCD_UI RELOADED # From 7a257ef3e1f229aabf857e93661b68d197635b61 Mon Sep 17 00:00:00 2001 From: schnurly <93942607+schnurly@users.noreply.github.com> Date: Sat, 5 Apr 2025 05:27:50 +0200 Subject: [PATCH 061/101] =?UTF-8?q?=F0=9F=9A=B8=20Fix=20MKS=20UI=20print?= =?UTF-8?q?=20done=20state=20(#27730)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/extui/mks_ui/draw_dialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/lcd/extui/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/mks_ui/draw_dialog.cpp index 4b2474a8e6..8713bf8909 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_dialog.cpp @@ -123,6 +123,7 @@ static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { #endif } else if (DIALOG_IS(TYPE_FINISH_PRINT)) { + uiCfg.print_state = IDLE; clear_cur_ui(); lv_draw_ready_print(); } From c5de0c69e584ad1b22e5ee2e99b0459f6fc98135 Mon Sep 17 00:00:00 2001 From: narno2202 <130909513+narno2202@users.noreply.github.com> Date: Sat, 5 Apr 2025 06:17:30 +0200 Subject: [PATCH 062/101] =?UTF-8?q?=F0=9F=9A=B8=20Refactor=20MKS=20H43=20L?= =?UTF-8?q?CD=20(#27776)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- .../src/lcd/extui/dgus/DGUSScreenHandler.cpp | 6 +- Marlin/src/lcd/extui/dgus/dgus_extui.cpp | 13 +- .../src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp | 201 +++----- .../src/lcd/extui/dgus/mks/DGUSDisplayDef.h | 128 ++--- .../lcd/extui/dgus/mks/DGUSScreenHandler.cpp | 475 +++++++----------- .../lcd/extui/dgus/mks/DGUSScreenHandler.h | 13 +- 6 files changed, 314 insertions(+), 522 deletions(-) diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp index f85fc9beac..e40aab0bff 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp @@ -325,7 +325,11 @@ void DGUSScreenHandler::sendHeaterStatusToDisplay(DGUS_VP_Variable &var) { void DGUSScreenHandler::sdCardError() { DGUSScreenHandler::sdCardRemoved(); - sendInfoScreen(F("NOTICE"), nullptr, F("SD card error"), nullptr); + #if DGUS_LCD_UI_MKS + screen.sendInfoScreenMKS(F("NOTICE"), nullptr, F("SD card error"), nullptr, mks_language_index); + #else + sendInfoScreen(F("NOTICE"), nullptr, F("SD card error"), nullptr, true, true, true, true); + #endif setupConfirmAction(nullptr); gotoScreen(DGUS_SCREEN_POPUP); } diff --git a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp index e68eed16fd..3706ca449c 100644 --- a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp +++ b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp @@ -43,7 +43,12 @@ namespace ExtUI { void onIdle() { screen.loop(); } void onPrinterKilled(FSTR_P const error, FSTR_P const) { - screen.sendInfoScreen(GET_TEXT_F(MSG_HALTED), error, FPSTR(NUL_STR), GET_TEXT_F(MSG_PLEASE_RESET)); + #if DGUS_LCD_UI_MKS + screen.sendInfoScreenMKS(GET_TEXT_F(MSG_HALTED), error, nullptr, GET_TEXT_F(MSG_PLEASE_RESET), mks_language_index); + #else + screen.sendInfoScreen(GET_TEXT_F(MSG_HALTED), error, FPSTR(NUL_STR), GET_TEXT_F(MSG_PLEASE_RESET)); + #endif + screen.gotoScreen(DGUS_SCREEN_KILL); while (!screen.loop()); // Wait while anything is left to be sent } @@ -64,7 +69,11 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { if (msg) { - screen.sendInfoScreen(F("Please confirm."), nullptr, msg, nullptr, true, true, false, true); + #if DGUS_LCD_UI_MKS + screen.sendInfoScreenMKS(F("Please confirm."), nullptr, msg, nullptr, mks_language_index); + #else + screen.sendInfoScreen(F("Please confirm."), nullptr, msg, nullptr, true, false, false, false); + #endif screen.setupConfirmAction(setUserConfirmed); screen.gotoScreen(DGUS_SCREEN_POPUP); } diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp index 7288b03b18..4a67f78b8c 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp @@ -103,7 +103,7 @@ void MKS_resume_print_move() { float z_offset_add = 0; -xyz_int_t tmc_step; // = { 0, 0, 0 } +xyz_int_t tmc_stall_sens; // = { 0, 0, 0 } uint16_t lcd_default_light = 50; @@ -117,7 +117,10 @@ const uint16_t VPList_Boot[] PROGMEM = { }; #define MKSLIST_E_ITEM(N) VP_T_E##N##_Is, VP_T_E##N##_Set, +#define INFO_BAR REPEAT(EXTRUDERS, MKSLIST_E_ITEM) VP_T_Bed_Is, VP_T_Bed_Set, VP_Fan0_Percentage, +// Not defined in firmware 1.30 or 1.31 +/* const uint16_t VPList_Main[] PROGMEM = { // VP_M117, for completeness, but it cannot be auto-uploaded. #if HAS_HOTEND @@ -140,53 +143,31 @@ const uint16_t VPList_Main[] PROGMEM = { #endif 0x0000 }; +*/ const uint16_t MKSList_Home[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, - // Language - // VP_HOME_Dis, + INFO_BAR 0x0000 }; const uint16_t MKSList_Setting[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, - // Language - VP_Setting_Dis, + INFO_BAR + 0x0000 }; const uint16_t MKSList_Tool[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, - // Language - VP_Tool_Dis, - // LCD BLK + INFO_BAR + + // LCD BackLight VP_LCD_BLK, + 0x0000 }; const uint16_t MKSList_EXTRUDE[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR VP_Filament_distance, VP_Filament_speed, @@ -195,34 +176,19 @@ const uint16_t MKSList_EXTRUDE[] PROGMEM = { }; const uint16_t MKSList_LEVEL[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR 0x0000 }; const uint16_t MKSList_MOVE[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR 0x0000 }; const uint16_t MKSList_Print[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR // Print Percent VP_PrintProgress_Percentage, @@ -254,24 +220,13 @@ const uint16_t MKSList_SD_File[] PROGMEM = { }; const uint16_t MKSList_TempOnly[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, - // LCD BLK - VP_LCD_BLK, + INFO_BAR + 0x0000 }; -const uint16_t MKSList_Pulse[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, +const uint16_t MKSList_Steps_mm[] PROGMEM = { + INFO_BAR // Steps/mm VP_X_STEP_PER_MM, @@ -284,12 +239,7 @@ const uint16_t MKSList_Pulse[] PROGMEM = { }; const uint16_t MKSList_MaxSpeed[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR // Max Speed VP_X_MAX_SPEED, @@ -302,31 +252,20 @@ const uint16_t MKSList_MaxSpeed[] PROGMEM = { }; const uint16_t MKSList_MaxAcc[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR - // ACC - VP_ACC_SPEED, - VP_X_ACC_MAX_SPEED, - VP_Y_ACC_MAX_SPEED, - VP_Z_ACC_MAX_SPEED, - VP_E0_ACC_MAX_SPEED, - VP_E1_ACC_MAX_SPEED, + // Acceleration + VP_X_MAX_ACC, + VP_Y_MAX_ACC, + VP_Z_MAX_ACC, + VP_E0_MAX_ACC, + VP_E1_MAX_ACC, 0x0000 }; const uint16_t MKSList_PID[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR // PID VP_E0_PID_P, @@ -337,12 +276,7 @@ const uint16_t MKSList_PID[] PROGMEM = { }; const uint16_t MKSList_Level_Point[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR // Level Point VP_Level_Point_One_X, @@ -372,10 +306,7 @@ const uint16_t MKSList_Level_PrintConfig[] PROGMEM = { }; const uint16_t MKSList_PrintPauseConfig[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, + INFO_BAR VP_X_PARK_POS, VP_Y_PARK_POS, @@ -384,11 +315,8 @@ const uint16_t MKSList_PrintPauseConfig[] PROGMEM = { 0x0000 }; -const uint16_t MKSList_MotoConfig[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, +const uint16_t MKSList_MotionConfig[] PROGMEM = { + INFO_BAR VP_TRAVEL_SPEED, VP_FEEDRATE_MIN_SPEED, @@ -398,24 +326,18 @@ const uint16_t MKSList_MotoConfig[] PROGMEM = { }; const uint16_t MKSList_EX_Config[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, + INFO_BAR VP_MIN_EX_T,VP_Min_EX_T_E, + 0x0000 }; const uint16_t MKSTMC_Config[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - VP_MIN_EX_T, + INFO_BAR - VP_TMC_X_STEP, - VP_TMC_Y_STEP, - VP_TMC_Z_STEP, + VP_TMC_X_SENS, + VP_TMC_Y_SENS, + VP_TMC_Z_SENS, VP_TMC_X1_Current, VP_TMC_Y1_Current, VP_TMC_X_Current, @@ -431,20 +353,23 @@ const uint16_t MKSTMC_Config[] PROGMEM = { const uint16_t MKSAuto_Level[] PROGMEM = { VP_MESH_LEVEL_POINT_DIS, VP_ZPos, + 0x0000 }; const uint16_t MKSOffset_Config[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + INFO_BAR + VP_OFFSET_X, VP_OFFSET_Y, VP_OFFSET_Z, + 0x0000 }; const uint16_t MKSBabyStep[] PROGMEM = { VP_ZOffset_DE_DIS, + 0x0000 }; @@ -472,14 +397,14 @@ const struct VPMapping VPMap[] PROGMEM = { { MKSLCD_SCREEN_PRINT, MKSList_Print }, // Page 7 { MKSLCD_SCREEN_PAUSE, MKSList_Print }, // Page 26 { MKSLCD_SCREEN_CHOOSE_FILE, MKSList_SD_File }, // Page 15 - { MKSLCD_SCREEN_MOTOR_PULSE, MKSList_Pulse }, // Page 51 - { MKSLCD_SCREEN_MOTOR_SPEED, MKSList_MaxSpeed }, // Page 55 - { MKSLCD_SCREEN_MOTOR_ACC_MAX, MKSList_MaxAcc }, // Page 53 + { MKSLCD_SCREEN_STEPS_MM, MKSList_Steps_mm }, // Page 51 + { MKSLCD_SCREEN_AXIS_SPEED, MKSList_MaxSpeed }, // Page 55 + { MKSLCD_SCREEN_AXIS_ACC_MAX, MKSList_MaxAcc }, // Page 53 { MKSLCD_SCREEN_LEVEL_DATA, MKSList_Level_Point }, // Page 48 { MKSLCD_PrintPause_SET, MKSList_PrintPauseConfig }, // Page 49 - { MKSLCD_FILAMENT_DATA, MKSList_SD_File }, // Page 50 + //{ MKSLCD_FILAMENT_DATA, MKSList_SD_File }, // Page 50 { MKSLCD_SCREEN_Config, MKSList_TempOnly }, // Page 46 - { MKSLCD_SCREEN_Config_MOTOR, MKSList_MotoConfig }, // Page 47 + { MKSLCD_SCREEN_Config_MOTOR, MKSList_MotionConfig }, // Page 47 { MKSLCD_PID, MKSList_PID }, // Page 56 { MKSLCD_ABOUT, MKSList_About }, // Page 36 { MKSLCD_SCREEN_PRINT_CONFIG, MKSList_Level_PrintConfig }, // Page 60 @@ -495,7 +420,7 @@ const struct VPMapping VPMap[] PROGMEM = { }; const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; -const char H43Version[] PROGMEM = "MKS H43_V1.30"; +const char H43Version[] PROGMEM = "MKS H43_V1.31"; const char Updata_Time[] PROGMEM = STRING_DISTRIBUTION_DATE; const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { @@ -664,27 +589,27 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_Z_MAX_SPEED, &planner.settings.max_feedrate_mm_s[Z_AXIS], screen.handleMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), #if HAS_HOTEND - VPHELPER(VP_E0_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(0)], screen.handleExtruderMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E0_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(0)], screen.handleMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), #if HAS_MULTI_HOTEND - VPHELPER(VP_E1_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], screen.handleExtruderMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E1_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], screen.handleMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), #endif #endif - VPHELPER(VP_X_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[X_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), - VPHELPER(VP_Y_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Y_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), - VPHELPER(VP_Z_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Z_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_X_MAX_ACC, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[X_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_Y_MAX_ACC, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Y_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_Z_MAX_ACC, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Z_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), #if HAS_HOTEND - VPHELPER(VP_E0_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(0)], screen.handleExtruderAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_E0_MAX_ACC, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(0)], screen.handleMaxAccChange, screen.sendWordValueToDisplay), #if HAS_MULTI_HOTEND - VPHELPER(VP_E1_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], screen.handleExtruderAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_E1_MAX_ACC, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], screen.handleMaxAccChange, screen.sendWordValueToDisplay), #endif #endif VPHELPER(VP_TRAVEL_SPEED, (uint16_t *)&planner.settings.travel_acceleration, screen.handleTravelAccChange, screen.sendFloatAsIntValueToDisplay<0>), VPHELPER(VP_FEEDRATE_MIN_SPEED, (uint16_t *)&planner.settings.min_feedrate_mm_s, screen.handleFeedRateMinChange, screen.sendFloatAsIntValueToDisplay<0>), VPHELPER(VP_T_F_SPEED, (uint16_t *)&planner.settings.min_travel_feedrate_mm_s, screen.handleMin_T_F, screen.sendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_ACC_SPEED, (uint16_t *)&planner.settings.acceleration, screen.handleAccChange, screen.sendWordValueToDisplay), + //VPHELPER(VP_DEFAULT_ACC, (uint16_t *)&planner.settings.acceleration, screen.handleAccChange, screen.sendWordValueToDisplay), VPHELPER(VP_X_PARK_POS, &mks_park_pos.x, screen.getParkPos, screen.sendWordValueToDisplay), VPHELPER(VP_Y_PARK_POS, &mks_park_pos.y, screen.getParkPos, screen.sendWordValueToDisplay), @@ -696,13 +621,13 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if ENABLED(SENSORLESS_HOMING) // TMC SENSORLESS Setting #if X_HAS_STEALTHCHOP - VPHELPER(VP_TMC_X_STEP, &tmc_step.x, screen.tmcChangeConfig, screen.sendTMCStepValue), + VPHELPER(VP_TMC_X_SENS, &tmc_stall_sens.x, screen.tmcChangeConfig, screen.sendTMCSensValue), #endif #if Y_HAS_STEALTHCHOP - VPHELPER(VP_TMC_Y_STEP, &tmc_step.y, screen.tmcChangeConfig, screen.sendTMCStepValue), + VPHELPER(VP_TMC_Y_SENS, &tmc_stall_sens.y, screen.tmcChangeConfig, screen.sendTMCSensValue), #endif #if Z_HAS_STEALTHCHOP - VPHELPER(VP_TMC_Z_STEP, &tmc_step.z, screen.tmcChangeConfig, screen.sendTMCStepValue), + VPHELPER(VP_TMC_Z_SENS, &tmc_stall_sens.z, screen.tmcChangeConfig, screen.sendTMCSensValue), #endif #endif @@ -753,9 +678,9 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if ENABLED(EDITABLE_STEPS_PER_UNIT) #if HAS_HOTEND - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<0>), #if HAS_MULTI_HOTEND - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<0>), #endif #endif #endif diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h index a0b95aa14a..a0e5b5d731 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h @@ -49,7 +49,7 @@ void MKS_resume_print_move(); extern float z_offset_add; -extern xyz_int_t tmc_step; +extern xyz_int_t tmc_stall_sens; extern uint16_t lcd_default_light; @@ -130,16 +130,16 @@ enum DGUS_ScreenID : uint8_t { MKSLCD_SCREEN_PRINT = 68, MKSLCD_SCREEN_PAUSE = 70, MKSLCD_SCREEN_CHOOSE_FILE = 87, - MKSLCD_SCREEN_NO_CHOOSE_FILE = 88, + //MKSLCD_SCREEN_NO_CHOOSE_FILE = 88, // Missing in 1.31 firmware MKSLCD_SCREEN_Config = 101, MKSLCD_SCREEN_Config_MOTOR = 103, - MKSLCD_SCREEN_MOTOR_PULSE = 104, - MKSLCD_SCREEN_MOTOR_SPEED = 102, - MKSLCD_SCREEN_MOTOR_ACC_MAX = 105, + MKSLCD_SCREEN_STEPS_MM = 104, + MKSLCD_SCREEN_AXIS_SPEED = 102, + MKSLCD_SCREEN_AXIS_ACC_MAX = 105, MKSLCD_SCREEN_PRINT_CONFIG = 72, MKSLCD_SCREEN_LEVEL_DATA = 106, MKSLCD_PrintPause_SET = 107, - MKSLCD_FILAMENT_DATA = 50, + //MKSLCD_FILAMENT_DATA = 50, // Missing in 1.31 firmware MKSLCD_ABOUT = 83, MKSLCD_PID = 108, MKSLCD_PAUSE_SETTING_MOVE = 98, @@ -185,16 +185,16 @@ enum DGUS_ScreenID : uint8_t { MKSLCD_SCREEN_PAUSE = 26, MKSLCD_SCREEN_PAUSE_PRESS = 26, MKSLCD_SCREEN_CHOOSE_FILE = 15, - MKSLCD_SCREEN_NO_CHOOSE_FILE = 17, + //MKSLCD_SCREEN_NO_CHOOSE_FILE = 17, // Missing in 1.30 firmware MKSLCD_SCREEN_Config = 46, MKSLCD_SCREEN_Config_MOTOR = 47, - MKSLCD_SCREEN_MOTOR_PULSE = 51, + MKSLCD_SCREEN_STEPS_MM = 51, MKSLCD_SCREEN_MOTOR_SPEED = 55, MKSLCD_SCREEN_MOTOR_ACC_MAX = 53, MKSLCD_SCREEN_PRINT_CONFIG = 60, MKSLCD_SCREEN_LEVEL_DATA = 48, MKSLCD_PrintPause_SET = 49, - MKSLCD_FILAMENT_DATA = 50, + //MKSLCD_FILAMENT_DATA = 50, // Missing in 1.31 firmware MKSLCD_ABOUT = 36, MKSLCD_PID = 56, MKSLCD_PAUSE_SETTING_MOVE = 58, @@ -214,7 +214,7 @@ enum DGUS_ScreenID : uint8_t { DGUS_SCREEN_CONFIRM = 240, DGUS_SCREEN_KILL = 250, //!< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") - DGUS_SCREEN_WAITING = 251, + DGUS_SCREEN_WAITING = 252, // Missing in 1.30 and 1.31 firmware, workaround DGUS_SCREEN_POPUP = 252, //!< special target, popup screen will also return this code to say "return to previous screen" DGUS_SCREEN_UNUSED = 255 }; @@ -226,23 +226,8 @@ constexpr uint8_t VP_M117_LEN = 0x20; // Heater status constexpr uint16_t VP_E0_STATUS = 0x3410; constexpr uint16_t VP_E1_STATUS = 0x3412; -//constexpr uint16_t VP_E2_STATUS = 0x3414; -//constexpr uint16_t VP_E3_STATUS = 0x3416; -//constexpr uint16_t VP_E4_STATUS = 0x3418; -//constexpr uint16_t VP_E5_STATUS = 0x341A; constexpr uint16_t VP_MOVE_OPTION = 0x3500; -// // PIDs -// constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 -// constexpr uint16_t VP_E0_PID_I = 0x3702; -// constexpr uint16_t VP_E0_PID_D = 0x3704; -// constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , uint16_t , 0~1638.4 -// constexpr uint16_t VP_E1_PID_I = 0x3708; -// constexpr uint16_t VP_E1_PID_D = 0x370A; -// constexpr uint16_t VP_BED_PID_P = 0x3710; -// constexpr uint16_t VP_BED_PID_I = 0x3712; -// constexpr uint16_t VP_BED_PID_D = 0x3714; - // Waiting screen status constexpr uint16_t VP_WAITING_STATUS = 0x3800; @@ -288,22 +273,11 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x1680; /* -------------------------------0x2000-0x2FFF------------------------------- */ // Temperatures. + // Only E0 and E1 are present in H43 firmware constexpr uint16_t VP_T_E0_Is = 0x2000; // 4 Byte Integer constexpr uint16_t VP_T_E0_Set = 0x2004; // 2 Byte Integer constexpr uint16_t VP_T_E1_Is = 0x2008; // 4 Byte Integer constexpr uint16_t VP_T_E1_Set = 0x200B; // 2 Byte Integer - constexpr uint16_t VP_T_E2_Is = 0x2010; // 4 Byte Integer - constexpr uint16_t VP_T_E2_Set = 0x2014; // 2 Byte Integer - constexpr uint16_t VP_T_E3_Is = 0x2018; // 4 Byte Integer - constexpr uint16_t VP_T_E3_Set = 0x201B; // 2 Byte Integer - constexpr uint16_t VP_T_E4_Is = 0x2020; // 4 Byte Integer - constexpr uint16_t VP_T_E4_Set = 0x2024; // 2 Byte Integer - constexpr uint16_t VP_T_E5_Is = 0x2028; // 4 Byte Integer - constexpr uint16_t VP_T_E5_Set = 0x202B; // 2 Byte Integer - constexpr uint16_t VP_T_E6_Is = 0x2030; // 4 Byte Integer - constexpr uint16_t VP_T_E6_Set = 0x2034; // 2 Byte Integer - constexpr uint16_t VP_T_E7_Is = 0x2038; // 4 Byte Integer - constexpr uint16_t VP_T_E7_Set = 0x203B; // 2 Byte Integer constexpr uint16_t VP_T_Bed_Is = 0x2040; // 4 Byte Integer constexpr uint16_t VP_T_Bed_Set = 0x2044; // 2 Byte Integer @@ -312,12 +286,6 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_Flowrate_E0 = 0x2200; // 2 Byte Integer constexpr uint16_t VP_Flowrate_E1 = 0x2202; // 2 Byte Integer - constexpr uint16_t VP_Flowrate_E2 = 0x2204; - constexpr uint16_t VP_Flowrate_E3 = 0x2206; - constexpr uint16_t VP_Flowrate_E4 = 0x2208; - constexpr uint16_t VP_Flowrate_E5 = 0x220A; - constexpr uint16_t VP_Flowrate_E6 = 0x220C; - constexpr uint16_t VP_Flowrate_E7 = 0x220E; // Move constexpr uint16_t VP_MOVE_X = 0x2300; @@ -325,12 +293,6 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_MOVE_Z = 0x2304; constexpr uint16_t VP_MOVE_E0 = 0x2310; constexpr uint16_t VP_MOVE_E1 = 0x2312; - constexpr uint16_t VP_MOVE_E2 = 0x2314; - constexpr uint16_t VP_MOVE_E3 = 0x2316; - constexpr uint16_t VP_MOVE_E4 = 0x2318; - constexpr uint16_t VP_MOVE_E5 = 0x231A; - constexpr uint16_t VP_MOVE_E6 = 0x231C; - constexpr uint16_t VP_MOVE_E7 = 0x231E; constexpr uint16_t VP_HOME_ALL = 0x2320; constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2330; @@ -350,9 +312,6 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_LANGUAGE_CHANGE = 0x2380; constexpr uint16_t VP_LANGUAGE_CHANGE1 = 0x2382; constexpr uint16_t VP_LANGUAGE_CHANGE2 = 0x2384; - constexpr uint16_t VP_LANGUAGE_CHANGE3 = 0x2386; - constexpr uint16_t VP_LANGUAGE_CHANGE4 = 0x2388; - constexpr uint16_t VP_LANGUAGE_CHANGE5 = 0x238A; // LEVEL constexpr uint16_t VP_LEVEL_POINT = 0x2400; @@ -396,12 +355,6 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_Z_STEP_PER_MM = 0x2908; constexpr uint16_t VP_E0_STEP_PER_MM = 0x2910; constexpr uint16_t VP_E1_STEP_PER_MM = 0x2912; - constexpr uint16_t VP_E2_STEP_PER_MM = 0x2914; - constexpr uint16_t VP_E3_STEP_PER_MM = 0x2916; - constexpr uint16_t VP_E4_STEP_PER_MM = 0x2918; - constexpr uint16_t VP_E5_STEP_PER_MM = 0x291A; - constexpr uint16_t VP_E6_STEP_PER_MM = 0x291C; - constexpr uint16_t VP_E7_STEP_PER_MM = 0x291E; constexpr uint16_t VP_X_MAX_SPEED = 0x2A00; constexpr uint16_t VP_Y_MAX_SPEED = 0x2A04; @@ -409,16 +362,16 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_E0_MAX_SPEED = 0x2A0C; constexpr uint16_t VP_E1_MAX_SPEED = 0x2A10; - constexpr uint16_t VP_X_ACC_MAX_SPEED = 0x2A28; - constexpr uint16_t VP_Y_ACC_MAX_SPEED = 0x2A2C; - constexpr uint16_t VP_Z_ACC_MAX_SPEED = 0x2A30; - constexpr uint16_t VP_E0_ACC_MAX_SPEED = 0x2A34; - constexpr uint16_t VP_E1_ACC_MAX_SPEED = 0x2A38; + constexpr uint16_t VP_X_MAX_ACC = 0x2A28; + constexpr uint16_t VP_Y_MAX_ACC = 0x2A2C; + constexpr uint16_t VP_Z_MAX_ACC = 0x2A30; + constexpr uint16_t VP_E0_MAX_ACC = 0x2A34; + constexpr uint16_t VP_E1_MAX_ACC = 0x2A38; constexpr uint16_t VP_TRAVEL_SPEED = 0x2A3C; constexpr uint16_t VP_FEEDRATE_MIN_SPEED = 0x2A40; constexpr uint16_t VP_T_F_SPEED = 0x2A44; - constexpr uint16_t VP_ACC_SPEED = 0x2A48; + constexpr uint16_t VP_DEFAULT_ACC = 0x2A48; /* -------------------------------0x3000-0x3FFF------------------------------- */ // Buttons on the SD-Card File listing. @@ -479,9 +432,9 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_BED_STATUS = 0x341C; - constexpr uint16_t VP_TMC_X_STEP = 0x3430; - constexpr uint16_t VP_TMC_Y_STEP = 0x3432; - constexpr uint16_t VP_TMC_Z_STEP = 0x3434; + constexpr uint16_t VP_TMC_X_SENS = 0x3430; + constexpr uint16_t VP_TMC_Y_SENS = 0x3432; + constexpr uint16_t VP_TMC_Z_SENS = 0x3434; constexpr uint16_t VP_TMC_X1_Current = 0x3436; constexpr uint16_t VP_TMC_Y1_Current = 0x3438; @@ -516,10 +469,6 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; // PID autotune constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x3800; constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x3802; - constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x3804; - constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x3806; - constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x3808; - constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x380A; constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x380C; // Calibrate Z @@ -536,19 +485,11 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; // Heater Control Buttons , triged between "cool down" and "heat PLA" state constexpr uint16_t VP_E0_CONTROL = 0x4010; constexpr uint16_t VP_E1_CONTROL = 0x4012; - //constexpr uint16_t VP_E2_CONTROL = 0x2214; - //constexpr uint16_t VP_E3_CONTROL = 0x2216; - //constexpr uint16_t VP_E4_CONTROL = 0x2218; - //constexpr uint16_t VP_E5_CONTROL = 0x221A; constexpr uint16_t VP_BED_CONTROL = 0x401C; // Preheat constexpr uint16_t VP_E0_BED_PREHEAT = 0x4020; constexpr uint16_t VP_E1_BED_PREHEAT = 0x4022; - //constexpr uint16_t VP_E2_BED_PREHEAT = 0x4024; - //constexpr uint16_t VP_E3_BED_PREHEAT = 0x4026; - //constexpr uint16_t VP_E4_BED_PREHEAT = 0x4028; - //constexpr uint16_t VP_E5_BED_PREHEAT = 0x402A; // Filament load and unload //constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x4030; @@ -578,22 +519,21 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_HOME_Dis = 0x5000; constexpr uint16_t VP_Setting_Dis = 0x5010; constexpr uint16_t VP_Tool_Dis = 0x5020; - constexpr uint16_t VP_Printing_Dis = 0x5030; constexpr uint16_t VP_Print_Dis = 0x5250; constexpr uint16_t VP_Language_Dis = 0x5080; constexpr uint16_t VP_LossPoint_Dis = 0x5090; constexpr uint16_t VP_PrintPauseConfig_Dis = 0x5120; - constexpr uint16_t VP_MotorPulse_Dis = 0x5140; - constexpr uint16_t VP_MotorMaxSpeed_Dis = 0x5150; - constexpr uint16_t VP_MotorMaxAcc_Dis = 0x5160; + constexpr uint16_t VP_AxisRes_Dis = 0x5140; + constexpr uint16_t VP_AxisMaxSpeed_Dis = 0x5150; + constexpr uint16_t VP_AxisMaxAcc_Dis = 0x5160; - constexpr uint16_t VP_X_Pulse_Dis = 0x5170; - constexpr uint16_t VP_Y_Pulse_Dis = 0x5180; - constexpr uint16_t VP_Z_Pulse_Dis = 0x5190; - constexpr uint16_t VP_E0_Pulse_Dis = 0x51A0; - constexpr uint16_t VP_E1_Pulse_Dis = 0x51B0; + constexpr uint16_t VP_X_Steps_mm_Dis = 0x5170; + constexpr uint16_t VP_Y_Steps_mm_Dis = 0x5180; + constexpr uint16_t VP_Z_Steps_mm_Dis = 0x5190; + constexpr uint16_t VP_E0_Steps_mm_Dis = 0x51A0; + constexpr uint16_t VP_E1_Steps_mm_Dis = 0x51B0; constexpr uint16_t VP_X_Max_Speed_Dis = 0x5280; constexpr uint16_t VP_Y_Max_Speed_Dis = 0x5290; @@ -629,7 +569,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_Extrusion_Dis = 0x5230; constexpr uint16_t VP_HeatBed_Dis = 0x5240; - constexpr uint16_t VP_Printting_Dis = 0x5430; + constexpr uint16_t VP_Printing_Dis = 0x5430; constexpr uint16_t VP_FactoryDefaults_Dis = 0x54C0; constexpr uint16_t VP_StoreSetting_Dis = 0x54B0; constexpr uint16_t VP_Info_EEPROM_2_Dis = 0x54D0; @@ -637,9 +577,9 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_AutoLevel_1_Dis = 0x55F0; - constexpr uint16_t VP_TMC_X_Step_Dis = 0x5530; - constexpr uint16_t VP_TMC_Y_Step_Dis = 0x5540; - constexpr uint16_t VP_TMC_Z_Step_Dis = 0x5550; + constexpr uint16_t VP_TMC_X_SENS_Dis = 0x5530; + constexpr uint16_t VP_TMC_Y_SENS_Dis = 0x5540; + constexpr uint16_t VP_TMC_Z_SENS_Dis = 0x5550; constexpr uint16_t VP_TMC_X1_Current_Dis = 0x5560; constexpr uint16_t VP_TMC_Y1_Current_Dis = 0x5570; constexpr uint16_t VP_TMC_X_Current_Dis = 0x5580; @@ -653,6 +593,9 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_EX_TEMP_INFO1_Dis = 0x5610; constexpr uint16_t VP_EX_TEMP_INFO2_Dis = 0x5620; constexpr uint16_t VP_EX_TEMP_INFO3_Dis = 0x5630; + constexpr uint16_t VP_X_Offset_Dis = 0x5660; + constexpr uint16_t VP_Y_Offset_Dis = 0x5670; + constexpr uint16_t VP_Z_Offset_Dis = 0x5680; constexpr uint16_t VP_LCD_BLK_Dis = 0x56A0; constexpr uint16_t VP_Info_PrintFinish_1_Dis = 0x5C00; constexpr uint16_t VP_Info_PrintFinish_2_Dis = 0x5C10; @@ -678,6 +621,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_MotorConfig_Dis = 0x5100; constexpr uint16_t VP_LevelConfig_Dis = 0x5110; + constexpr uint16_t VP_Probe_Offset_Dis = 0x5650; constexpr uint16_t VP_Advance_Dis = 0x5130; constexpr uint16_t VP_TemperatureConfig_Dis = 0x5390; diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp index 0ac704ed3d..b24c6d5e2e 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp @@ -58,29 +58,33 @@ bool DGUSAutoTurnOff = false; MKS_Language mks_language_index; // Initialized by settings.load -#if 0 -void DGUSScreenHandlerMKS::sendinfoscreen_ch(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4) { - dgus.writeStringVar(VP_MSGSTR1, line1, 32); - dgus.writeStringVar(VP_MSGSTR2, line2, 32); - dgus.writeStringVar(VP_MSGSTR3, line3, 32); - dgus.writeStringVar(VP_MSGSTR4, line4, 32); -} - -void DGUSScreenHandlerMKS::sendinfoscreen_en(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4) { +void DGUSScreenHandlerMKS::sendInfoScreen(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4) { dgus.writeStringVar(VP_MSGSTR1, line1); dgus.writeStringVar(VP_MSGSTR2, line2); dgus.writeStringVar(VP_MSGSTR3, line3); dgus.writeStringVar(VP_MSGSTR4, line4); } -void DGUSScreenHandlerMKS::sendInfoScreen(const void *line1, const void *line2, const void *line3, const void *line4, uint16_t language) { - if (language == MKS_English) - DGUSScreenHandlerMKS::sendinfoscreen_en((char *)line1, (char *)line2, (char *)line3, (char *)line4); - else if (language == MKS_SimpleChinese) - DGUSScreenHandlerMKS::sendinfoscreen_ch((uint16_t *)line1, (uint16_t *)line2, (uint16_t *)line3, (uint16_t *)line4); +void DGUSScreenHandlerMKS::sendInfoScreen(const char *line1, const char *line2, const char *line3, const char *line4) { + dgus.writeStringVar(VP_MSGSTR1, line1); + dgus.writeStringVar(VP_MSGSTR2, line2); + dgus.writeStringVar(VP_MSGSTR3, line3); + dgus.writeStringVar(VP_MSGSTR4, line4); } -#endif +void DGUSScreenHandlerMKS::sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4) { + dgus.writeStringVar_P(VP_MSGSTR1, line1); + dgus.writeStringVar_P(VP_MSGSTR2, line2); + dgus.writeStringVar_P(VP_MSGSTR3, line3); + dgus.writeStringVar_P(VP_MSGSTR4, line4); +} + +void DGUSScreenHandlerMKS::sendInfoScreenMKS(const void *line1, const void *line2, const void *line3, const void *line4, const MKS_Language language) { + if (language == MKS_English) + DGUSScreenHandlerMKS::sendInfoScreen_P((char *)line1, (char *)line2, (char *)line3, (char *)line4); + else if (language == MKS_SimpleChinese) + DGUSScreenHandlerMKS::sendInfoScreen((uint16_t *)line1, (uint16_t *)line2, (uint16_t *)line3, (uint16_t *)line4); +} void DGUSScreenHandlerMKS::sendFanToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { @@ -130,18 +134,18 @@ void DGUSScreenHandlerMKS::sendStringToDisplay_Language(DGUS_VP_Variable &var) { } } -void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { +void DGUSScreenHandlerMKS::sendTMCSensValue(DGUS_VP_Variable &var) { #if ENABLED(SENSORLESS_HOMING) #if X_HAS_STEALTHCHOP - tmc_step.x = stepperX.homing_threshold(); + tmc_stall_sens.x = stepperX.homing_threshold(); dgus.writeVariable(var.VP, *(int16_t*)var.memadr); #endif #if Y_HAS_STEALTHCHOP - tmc_step.y = stepperY.homing_threshold(); + tmc_stall_sens.y = stepperY.homing_threshold(); dgus.writeVariable(var.VP, *(int16_t*)var.memadr); #endif #if Z_HAS_STEALTHCHOP - tmc_step.z = stepperZ.homing_threshold(); + tmc_stall_sens.z = stepperZ.homing_threshold(); dgus.writeVariable(var.VP, *(int16_t*)var.memadr); #endif #endif @@ -475,10 +479,8 @@ void DGUSScreenHandlerMKS::meshLevel(DGUS_VP_Variable &var, void *val_ptr) { case 0: offset = mesh_adj_distance; integer = offset; // get int - Deci = (offset * 10); - Deci = Deci % 10; - Deci2 = offset * 100; - Deci2 = Deci2 % 10; + Deci = (offset * 10) % 10; + Deci2 = (offset * 100) % 10; soft_endstop._enabled = false; queue.enqueue_now(F("G91")); snprintf_P(cmd_buf, 30, PSTR("G1 Z%d.%d%d"), integer, Deci, Deci2); @@ -489,10 +491,8 @@ void DGUSScreenHandlerMKS::meshLevel(DGUS_VP_Variable &var, void *val_ptr) { case 1: offset = mesh_adj_distance; integer = offset; // get int - Deci = (offset * 10); - Deci = Deci % 10; - Deci2 = offset * 100; - Deci2 = Deci2 % 10; + Deci = (offset * 10) % 10; + Deci2 = (offset * 100) % 10; soft_endstop._enabled = false; queue.enqueue_now(F("G91")); snprintf_P(cmd_buf, 30, PSTR("G1 Z-%d.%d%d"), integer, Deci, Deci2); @@ -617,98 +617,90 @@ void DGUSScreenHandlerMKS::manualAssistLeveling(DGUS_VP_Variable &var, void *val break; } - if (WITHIN(point_val, 0x0002, 0x0005)) { - //queue.enqueue_now(F("G28Z")); + if (WITHIN(point_val, 0x0002, 0x0005)) queue.enqueue_now(F("G1Z-10")); - } } -#define mks_min(a, b) ((a) < (b)) ? (a) : (b) -#define mks_max(a, b) ((a) > (b)) ? (a) : (b) -void DGUSScreenHandlerMKS::tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { - #if ANY(HAS_TRINAMIC_CONFIG, HAS_STEALTHCHOP) +#if ANY(HAS_TRINAMIC_CONFIG, HAS_STEALTHCHOP) + + void DGUSScreenHandlerMKS::tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t tmc_val = BE16_P(val_ptr); - #endif + switch (var.VP) { + case VP_TMC_X_SENS: + #if USE_SENSORLESS && X_HAS_STEALTHCHOP + stepperX.homing_threshold(_MIN(tmc_val, 255)); + settings.save(); + tmc_stall_sens.x = stepperX.homing_threshold(); + #endif + break; + case VP_TMC_Y_SENS: + #if USE_SENSORLESS && Y_HAS_STEALTHCHOP + stepperY.homing_threshold(_MIN(tmc_val, 255)); + settings.save(); + tmc_stall_sens.y = stepperY.homing_threshold(); + #endif + break; + case VP_TMC_Z_SENS: + #if USE_SENSORLESS && Z_HAS_STEALTHCHOP + stepperZ.homing_threshold(_MIN(tmc_val, 255)); + settings.save(); + tmc_stall_sens.z = stepperZ.homing_threshold(); + #endif + break; + case VP_TMC_X_Current: + #if X_IS_TRINAMIC + stepperX.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_X1_Current: + #if X2_IS_TRINAMIC + stepperX2.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_Y_Current: + #if Y_IS_TRINAMIC + stepperY.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_Y1_Current: + #if Y2_IS_TRINAMIC + stepperY2.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_Z_Current: + #if Z_IS_TRINAMIC + stepperZ.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_Z1_Current: + #if Z2_IS_TRINAMIC + stepperZ2.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_E0_Current: + #if E0_IS_TRINAMIC + stepperE0.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_E1_Current: + #if E1_IS_TRINAMIC + stepperE1.rms_current(tmc_val); + settings.save(); + #endif + break; - switch (var.VP) { - case VP_TMC_X_STEP: - #if USE_SENSORLESS && X_HAS_STEALTHCHOP - stepperX.homing_threshold(mks_min(tmc_val, 255)); - settings.save(); - //tmc_step.x = stepperX.homing_threshold(); - #endif - break; - case VP_TMC_Y_STEP: - #if USE_SENSORLESS && Y_HAS_STEALTHCHOP - stepperY.homing_threshold(mks_min(tmc_val, 255)); - settings.save(); - //tmc_step.y = stepperY.homing_threshold(); - #endif - break; - case VP_TMC_Z_STEP: - #if USE_SENSORLESS && Z_HAS_STEALTHCHOP - stepperZ.homing_threshold(mks_min(tmc_val, 255)); - settings.save(); - //tmc_step.z = stepperZ.homing_threshold(); - #endif - break; - case VP_TMC_X_Current: - #if X_IS_TRINAMIC - stepperX.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_X1_Current: - #if X2_IS_TRINAMIC - stepperX2.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_Y_Current: - #if Y_IS_TRINAMIC - stepperY.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_Y1_Current: - #if Y2_IS_TRINAMIC - stepperY2.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_Z_Current: - #if Z_IS_TRINAMIC - stepperZ.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_Z1_Current: - #if Z2_IS_TRINAMIC - stepperZ2.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_E0_Current: - #if E0_IS_TRINAMIC - stepperE0.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_E1_Current: - #if E1_IS_TRINAMIC - stepperE1.rms_current(tmc_val); - settings.save(); - #endif - break; - - default: break; + default: break; + } } - #if USE_SENSORLESS - TERN_(X_HAS_STEALTHCHOP, tmc_step.x = stepperX.homing_threshold()); - TERN_(Y_HAS_STEALTHCHOP, tmc_step.y = stepperY.homing_threshold()); - TERN_(Z_HAS_STEALTHCHOP, tmc_step.z = stepperZ.homing_threshold()); - #endif -} + +#endif // HAS_TRINAMIC_CONFIG || HAS_STEALTHCHOP void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { int16_t movevalue = BE16_P(val_ptr); @@ -721,11 +713,10 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (!print_job_timer.isPaused() && !queue.ring_buffer.empty()) return; - char axiscode; - uint16_t speed = manual_feedrate_mm_m.x; // Default feedrate for manual moves + char axiscode = '\0'; + uint16_t speed = 0; switch (var.VP) { // switch X Y Z or Home - default: return; #if HAS_X_AXIS case VP_MOVE_X: if (!ExtUI::canMove(ExtUI::axis_t::X)) return; @@ -763,13 +754,8 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif } - if (movevalue != 0 && movevalue != 5) { // get move distance - switch (movevalue) { - case 0x0001: movevalue = manualMoveStep; break; - case 0x0002: movevalue = -manualMoveStep; break; - default: movevalue = 0; break; - } - } + if WITHIN(movevalue, 1, 4) // get move distance + movevalue == 1 ? movevalue = manualMoveStep : movevalue = -manualMoveStep; if (!movevalue) { queue.enqueue_one_now(TS(F("G28"), axiscode)); @@ -786,8 +772,10 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { // Movement const bool old_relative_mode = relative_mode; if (!relative_mode) queue.enqueue_now(F("G91")); + + // TODO: Use MString / TS() ... + char buf[32]; // G1 X9999.99 F12345 - //const uint16_t backup_speed = MMS_TO_MMM(feedrate_mm_s); char sign[] = "\0"; int16_t value = movevalue / 100; if (movevalue < 0) { value = -value; sign[0] = '-'; } @@ -795,13 +783,6 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); queue.enqueue_one_now(buf); - //if (backup_speed != speed) { - // snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); - // queue.enqueue_one_now(buf); - //} - - //while (!enqueue_and_echo_command(buf)) idle(); - if (!old_relative_mode) queue.enqueue_now(F("G90")); forceCompleteUpdate(); @@ -826,36 +807,18 @@ void DGUSScreenHandlerMKS::handleChangeLevelPoint(DGUS_VP_Variable &var, void *v #if ENABLED(EDITABLE_STEPS_PER_UNIT) void DGUSScreenHandlerMKS::handleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t raw = BE16_P(val_ptr); - const float value = (float)raw; - - ExtUI::axis_t axis; + const float value = (float)BE16_P(val_ptr); switch (var.VP) { - default: return; - case VP_X_STEP_PER_MM: axis = ExtUI::axis_t::X; break; - case VP_Y_STEP_PER_MM: axis = ExtUI::axis_t::Y; break; - case VP_Z_STEP_PER_MM: axis = ExtUI::axis_t::Z; break; - } - ExtUI::setAxisSteps_per_mm(value, axis); - settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - } - - void DGUSScreenHandlerMKS::handleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t raw = BE16_P(val_ptr); - const float value = (float)raw; - - ExtUI::extruder_t extruder; - switch (var.VP) { - default: return; + case VP_X_STEP_PER_MM: ExtUI::setAxisSteps_per_mm(value, ExtUI::axis_t::X); break; + case VP_Y_STEP_PER_MM: ExtUI::setAxisSteps_per_mm(value, ExtUI::axis_t::Y); break; + case VP_Z_STEP_PER_MM: ExtUI::setAxisSteps_per_mm(value, ExtUI::axis_t::Z); break; #if HAS_HOTEND - case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; + case VP_E0_STEP_PER_MM: ExtUI::setAxisSteps_per_mm(value, ExtUI::extruder_t::E0); break; #endif #if HAS_MULTI_HOTEND - case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + case VP_E1_STEP_PER_MM: ExtUI::setAxisSteps_per_mm(value, ExtUI::extruder_t::E1); break; #endif } - ExtUI::setAxisSteps_per_mm(value, extruder); settings.save(); skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } @@ -863,70 +826,36 @@ void DGUSScreenHandlerMKS::handleChangeLevelPoint(DGUS_VP_Variable &var, void *v #endif // EDITABLE_STEPS_PER_UNIT void DGUSScreenHandlerMKS::handleMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t raw = BE16_P(val_ptr); - const float value = (float)raw; - - ExtUI::axis_t axis; + const float value = (float)BE16_P(val_ptr); switch (var.VP) { - case VP_X_MAX_SPEED: axis = ExtUI::axis_t::X; break; - case VP_Y_MAX_SPEED: axis = ExtUI::axis_t::Y; break; - case VP_Z_MAX_SPEED: axis = ExtUI::axis_t::Z; break; - default: return; - } - ExtUI::setAxisMaxFeedrate_mm_s(value, axis); - settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel -} - -void DGUSScreenHandlerMKS::handleExtruderMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t raw = BE16_P(val_ptr); - const float value = (float)raw; - - ExtUI::extruder_t extruder; - switch (var.VP) { - default: return; + case VP_X_MAX_SPEED: ExtUI::setAxisMaxFeedrate_mm_s(value, ExtUI::axis_t::X); break; + case VP_Y_MAX_SPEED: ExtUI::setAxisMaxFeedrate_mm_s(value, ExtUI::axis_t::Y); break; + case VP_Z_MAX_SPEED: ExtUI::setAxisMaxFeedrate_mm_s(value, ExtUI::axis_t::Z); break; #if HAS_HOTEND - case VP_E0_MAX_SPEED: extruder = ExtUI::extruder_t::E0; break; + case VP_E0_MAX_SPEED: ExtUI::setAxisMaxFeedrate_mm_s(value, ExtUI::extruder_t::E0); break; #endif #if HAS_MULTI_HOTEND - case VP_E1_MAX_SPEED: extruder = ExtUI::extruder_t::E1; break; + case VP_E1_MAX_SPEED: ExtUI::setAxisMaxFeedrate_mm_s(value, ExtUI::extruder_t::E1); break; #endif } - ExtUI::setAxisMaxFeedrate_mm_s(value, extruder); settings.save(); skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleMaxAccChange(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t raw = BE16_P(val_ptr); - const float value = (float)raw; - - ExtUI::axis_t axis; - switch (var.VP) { - default: return; - case VP_X_ACC_MAX_SPEED: axis = ExtUI::axis_t::X; break; - case VP_Y_ACC_MAX_SPEED: axis = ExtUI::axis_t::Y; break; - case VP_Z_ACC_MAX_SPEED: axis = ExtUI::axis_t::Z; break; - } - ExtUI::setAxisMaxAcceleration_mm_s2(value, axis); - settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel -} - -void DGUSScreenHandlerMKS::handleExtruderAccChange(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t raw = BE16_P(val_ptr); - float value = (float)raw; - ExtUI::extruder_t extruder; + const float value = (float)BE16_P(val_ptr); switch (var.VP) { default: return; + case VP_X_MAX_ACC: ExtUI::setAxisMaxAcceleration_mm_s2(value, ExtUI::axis_t::X); break; + case VP_Y_MAX_ACC: ExtUI::setAxisMaxAcceleration_mm_s2(value, ExtUI::axis_t::Y); break; + case VP_Z_MAX_ACC: ExtUI::setAxisMaxAcceleration_mm_s2(value, ExtUI::axis_t::Z); break; #if HAS_HOTEND - case VP_E0_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E0; settings.load(); break; + case VP_E0_MAX_ACC: ExtUI::setAxisMaxAcceleration_mm_s2(value, ExtUI::extruder_t::E0); break; #endif #if HAS_MULTI_HOTEND - case VP_E1_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E1; settings.load(); break; + case VP_E1_MAX_ACC: ExtUI::setAxisMaxAcceleration_mm_s2(value, ExtUI::extruder_t::E1); break; #endif } - ExtUI::setAxisMaxAcceleration_mm_s2(value, extruder); settings.save(); skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } @@ -994,37 +923,14 @@ void DGUSScreenHandlerMKS::handleAccChange(DGUS_VP_Variable &var, void *val_ptr) #if ENABLED(BABYSTEPPING) void DGUSScreenHandler::handleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { - const float step = ZOffset_distance; - - const uint16_t flag = BE16_P(val_ptr); - switch (flag) { + switch (BE16_P(val_ptr)) { case 0: - if (step == 0.01) - queue.inject(F("M290 Z-0.01")); - else if (step == 0.1) - queue.inject(F("M290 Z-0.1")); - else if (step == 0.5) - queue.inject(F("M290 Z-0.5")); - else if (step == 1) - queue.inject(F("M290 Z-1")); - else - queue.inject(F("M290 Z-0.01")); - + queue.inject(TS(F("M290 Z"), -ZOffset_distance)); z_offset_add -= ZOffset_distance; break; case 1: - if (step == 0.01) - queue.inject(F("M290 Z0.01")); - else if (step == 0.1) - queue.inject(F("M290 Z0.1")); - else if (step == 0.5) - queue.inject(F("M290 Z0.5")); - else if (step == 1) - queue.inject(F("M290 Z1")); - else - queue.inject(F("M290 Z-0.01")); - + queue.inject(TS(F("M290 Z"), ZOffset_distance)); z_offset_add += ZOffset_distance; break; @@ -1084,15 +990,16 @@ void DGUSScreenHandlerMKS::filamentLoadUnload(DGUS_VP_Variable &var, void *val_p #if ALL(HAS_HOTEND, PREVENT_COLD_EXTRUSION) if (hotend_too_cold) { - if (thermalManager.targetTooColdToExtrude(hotend_too_cold - 1)) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, hotend_too_cold - 1); - sendInfoScreen(F("NOTICE"), nullptr, F("Please wait."), F("Nozzle heating!")); + if (thermalManager.targetTooColdToExtrude(hotend_too_cold - 1)) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, hotend_too_cold - 1); + sendInfoScreenMKS(F("NOTICE"), nullptr, F("Please wait."), F("Nozzle heating!"), MKS_English); setupConfirmAction(nullptr); gotoScreen(DGUS_SCREEN_POPUP); } #endif if (swap_tool) { - char buf[30]; + char buf[30]; // TODO: Use MString / TS() snprintf_P(buf, 30, #if ANY(HAS_MULTI_HOTEND, SINGLENOZZLE) PSTR("M1002T%cE%dF%d"), char('0' + swap_tool - 1) @@ -1112,7 +1019,7 @@ void DGUSScreenHandlerMKS::filamentLoadUnload(DGUS_VP_Variable &var, void *val_p void GcodeSuite::M1002() { #if ANY(HAS_MULTI_HOTEND, SINGLENOZZLE) { - char buf[3]; + char buf[3]; // TODO: Use MString / TS() sprintf_P(buf, PSTR("T%c"), char('0' + parser.intval('T'))); process_subcommands_now(buf); } @@ -1122,7 +1029,7 @@ void GcodeSuite::M1002() { set_e_relative(); // M83 { - char buf[20]; + char buf[20]; // TODO: Use MString / TS() snprintf_P(buf, 20, PSTR("G1E%dF%d"), parser.intval('E'), parser.intval('F')); process_subcommands_now(buf); } @@ -1264,9 +1171,9 @@ bool DGUSScreenHandlerMKS::loop() { if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) { booted = true; #if USE_SENSORLESS - TERN_(X_HAS_STEALTHCHOP, tmc_step.x = stepperX.homing_threshold()); - TERN_(Y_HAS_STEALTHCHOP, tmc_step.y = stepperY.homing_threshold()); - TERN_(Z_HAS_STEALTHCHOP, tmc_step.z = stepperZ.homing_threshold()); + TERN_(X_HAS_STEALTHCHOP, tmc_stall_sens.x = stepperX.homing_threshold()); + TERN_(Y_HAS_STEALTHCHOP, tmc_stall_sens.y = stepperY.homing_threshold()); + TERN_(Z_HAS_STEALTHCHOP, tmc_stall_sens.z = stepperZ.homing_threshold()); #endif #if ENABLED(PREVENT_COLD_EXTRUSION) @@ -1328,7 +1235,7 @@ void DGUSScreenHandlerMKS::runoutIdle() { queue.inject(F("M25")); gotoScreen(MKSLCD_SCREEN_PAUSE); - sendInfoScreen(F("NOTICE"), nullptr, F("Please change filament!"), nullptr); + sendInfoScreenMKS(F("NOTICE"), nullptr, F("Please change filament!"), nullptr, MKS_English); //setupConfirmAction(nullptr); gotoScreen(DGUS_SCREEN_POPUP); break; @@ -1383,6 +1290,9 @@ void DGUSScreenHandlerMKS::updateDisplayLanguage() { const char TemperatureConfig_buf_en[] = "Temperature"; dgus.writeStringVar(VP_TemperatureConfig_Dis, TemperatureConfig_buf_en); + const char Probe_Offset_buf_en[] = "Probe Offset"; + dgus.writeStringVar(VP_Probe_Offset_Dis, Probe_Offset_buf_en); + const char Advance_buf_en[] = "Advanced"; dgus.writeStringVar(VP_Advance_Dis, Advance_buf_en); @@ -1402,14 +1312,14 @@ void DGUSScreenHandlerMKS::updateDisplayLanguage() { ; dgus.writeStringVar(VP_Level_Dis, Level_buf_en); - const char MotorPulse_buf_en[] = "MotorPulse"; - dgus.writeStringVar(VP_MotorPulse_Dis, MotorPulse_buf_en); + const char AxisRes_buf_en[] = "Axis Resolution"; + dgus.writeStringVar(VP_AxisRes_Dis, AxisRes_buf_en); - const char MotorMaxSpeed_buf_en[] = "MotorMaxSpeed"; - dgus.writeStringVar(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_en); + const char AxisMaxSpeed_buf_en[] = "Axis Max Speed"; + dgus.writeStringVar(VP_AxisMaxSpeed_Dis, AxisMaxSpeed_buf_en); - const char MotorMaxAcc_buf_en[] = "MotorAcc"; - dgus.writeStringVar(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_en); + const char AxisMaxAcc_buf_en[] = "Axis Max Acc."; + dgus.writeStringVar(VP_AxisMaxAcc_Dis, AxisMaxAcc_buf_en); const char TravelAcc_buf_en[] = "Travel Acc."; dgus.writeStringVar(VP_TravelAcc_Dis, TravelAcc_buf_en); @@ -1447,26 +1357,26 @@ void DGUSScreenHandlerMKS::updateDisplayLanguage() { const char FactoryDefaults_buf_en[] = "Factory Defaults"; dgus.writeStringVar(VP_FactoryDefaults_Dis, FactoryDefaults_buf_en); - const char StoreSetting_buf_en[] = "Store Setting"; + const char StoreSetting_buf_en[] = "Store Settings"; dgus.writeStringVar(VP_StoreSetting_Dis, StoreSetting_buf_en); const char PrintPauseConfig_buf_en[] = "PrintPause Config"; dgus.writeStringVar(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_en); - const char X_Pulse_buf_en[] = "X_Pulse"; - dgus.writeStringVar(VP_X_Pulse_Dis, X_Pulse_buf_en); + const char X_Steps_mm_buf_en[] = "X steps/mm"; + dgus.writeStringVar(VP_X_Steps_mm_Dis, X_Steps_mm_buf_en); - const char Y_Pulse_buf_en[] = "Y_Pulse"; - dgus.writeStringVar(VP_Y_Pulse_Dis, Y_Pulse_buf_en); + const char Y_Steps_mm_buf_en[] = "Y steps/mm"; + dgus.writeStringVar(VP_Y_Steps_mm_Dis, Y_Steps_mm_buf_en); - const char Z_Pulse_buf_en[] = "Z_Pulse"; - dgus.writeStringVar(VP_Z_Pulse_Dis, Z_Pulse_buf_en); + const char Z_Steps_mm_buf_en[] = "Z steps/mm"; + dgus.writeStringVar(VP_Z_Steps_mm_Dis, Z_Steps_mm_buf_en); - const char E0_Pulse_buf_en[] = "E0_Pulse"; - dgus.writeStringVar(VP_E0_Pulse_Dis, E0_Pulse_buf_en); + const char E0_Steps_mm_buf_en[] = "E0 steps/mm"; + dgus.writeStringVar(VP_E0_Steps_mm_Dis, E0_Steps_mm_buf_en); - const char E1_Pulse_buf_en[] = "E1_Pulse"; - dgus.writeStringVar(VP_E1_Pulse_Dis, E1_Pulse_buf_en); + const char E1_Steps_mm_buf_en[] = "E1 steps/mm"; + dgus.writeStringVar(VP_E1_Steps_mm_Dis, E1_Steps_mm_buf_en); const char X_Max_Speed_buf_en[] = "X Max Speed"; dgus.writeStringVar(VP_X_Max_Speed_Dis, X_Max_Speed_buf_en); @@ -1550,13 +1460,13 @@ void DGUSScreenHandlerMKS::updateDisplayLanguage() { dgus.writeStringVar(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_en); const char TMC_X_Step_buf_en[] = "X Sensitivity"; - dgus.writeStringVar(VP_TMC_X_Step_Dis, TMC_X_Step_buf_en); + dgus.writeStringVar(VP_TMC_X_SENS_Dis, TMC_X_Step_buf_en); const char TMC_Y_Step_buf_en[] = "Y Sensitivity"; - dgus.writeStringVar(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_en); + dgus.writeStringVar(VP_TMC_Y_SENS_Dis, TMC_Y_Step_buf_en); const char TMC_Z_Step_buf_en[] = "Z Sensitivity"; - dgus.writeStringVar(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_en); + dgus.writeStringVar(VP_TMC_Z_SENS_Dis, TMC_Z_Step_buf_en); const char TMC_X_Current_buf_en[] = "X Current"; dgus.writeStringVar(VP_TMC_X_Current_Dis, TMC_X_Current_buf_en); @@ -1585,6 +1495,15 @@ void DGUSScreenHandlerMKS::updateDisplayLanguage() { const char Min_Ex_Temp_buf_en[] = "Min Extrude Temp"; dgus.writeStringVar(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_en); + const char X_Offset_buf_en[] = "X Offset"; + dgus.writeStringVar(VP_X_Offset_Dis, X_Offset_buf_en); + + const char Y_Offset_buf_en[] = "Y Offset"; + dgus.writeStringVar(VP_Y_Offset_Dis, Y_Offset_buf_en); + + const char Z_Offset_buf_en[] = "Z Offset"; + dgus.writeStringVar(VP_Z_Offset_Dis, Z_Offset_buf_en); + const char AutoLEVEL_INFO1_buf_en[] = "Please Press Button!"; dgus.writeStringVar(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_en); @@ -1600,9 +1519,6 @@ void DGUSScreenHandlerMKS::updateDisplayLanguage() { const char StopPrintConfirm_Info_buf_en[] = "Stop Print?"; dgus.writeStringVar(VP_StopPrintConfirm_Info_Dis, StopPrintConfirm_Info_buf_en); - const char Printting_buf_en[] = "Printing"; - dgus.writeStringVar(VP_Printting_Dis, Printting_buf_en); - const char LCD_BLK_buf_en[] = "Backlight"; dgus.writeStringVar(VP_LCD_BLK_Dis, LCD_BLK_buf_en); @@ -1660,14 +1576,14 @@ void DGUSScreenHandlerMKS::updateDisplayLanguage() { }; dgus.writeStringVar(VP_Level_Dis, Level_buf_ch, 32); - const uint16_t MotorPulse_buf_ch[] = { 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeStringVar(VP_MotorPulse_Dis, MotorPulse_buf_ch); + const uint16_t AxisRes_buf_ch[] = { 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_AxisRes_Dis, AxisRes_buf_ch); - const uint16_t MotorMaxSpeed_buf_ch[] = { 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeStringVar(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_ch); + const uint16_t AxisMaxSpeed_buf_ch[] = { 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_AxisMaxSpeed_Dis, AxisMaxSpeed_buf_ch); - const uint16_t MotorMaxAcc_buf_ch[] = { 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeStringVar(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_ch); + const uint16_t AxisMaxAcc_buf_ch[] = { 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_AxisMaxAcc_Dis, AxisMaxAcc_buf_ch); const uint16_t TravelAcc_buf_ch[] = { 0xD5BF, 0xD0D0, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; dgus.writeStringVar(VP_TravelAcc_Dis, TravelAcc_buf_ch); @@ -1711,20 +1627,20 @@ void DGUSScreenHandlerMKS::updateDisplayLanguage() { const uint16_t PrintPauseConfig_buf_ch[] = { 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; dgus.writeStringVar(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_ch, 32); - const uint16_t X_Pulse_buf_ch[] = { 0x2058, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeStringVar(VP_X_Pulse_Dis, X_Pulse_buf_ch); + const uint16_t X_Steps_mm_buf_ch[] = { 0x2058, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_X_Steps_mm_Dis, X_Steps_mm_buf_ch); - const uint16_t Y_Pulse_buf_ch[] = { 0x2059, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeStringVar(VP_Y_Pulse_Dis, Y_Pulse_buf_ch); + const uint16_t Y_Steps_mm_buf_ch[] = { 0x2059, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_Y_Steps_mm_Dis, Y_Steps_mm_buf_ch); - const uint16_t Z_Pulse_buf_ch[] = { 0x205A, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeStringVar(VP_Z_Pulse_Dis, Z_Pulse_buf_ch); + const uint16_t Z_Steps_mm_buf_ch[] = { 0x205A, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_Z_Steps_mm_Dis, Z_Steps_mm_buf_ch); - const uint16_t E0_Pulse_buf_ch[] = { 0x3045, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeStringVar(VP_E0_Pulse_Dis, E0_Pulse_buf_ch); + const uint16_t E0_Steps_mm_buf_ch[] = { 0x3045, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_E0_Steps_mm_Dis, E0_Steps_mm_buf_ch); - const uint16_t E1_Pulse_buf_ch[] = { 0x3145, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeStringVar(VP_E1_Pulse_Dis, E1_Pulse_buf_ch); + const uint16_t E1_Steps_mm_buf_ch[] = { 0x3145, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_E1_Steps_mm_Dis, E1_Steps_mm_buf_ch); const uint16_t X_Max_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; dgus.writeStringVar(VP_X_Max_Speed_Dis, X_Max_Speed_buf_ch); @@ -1805,13 +1721,13 @@ void DGUSScreenHandlerMKS::updateDisplayLanguage() { dgus.writeStringVar(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_ch, 32); const uint16_t TMC_X_Step_buf_ch[] = { 0x2058, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; - dgus.writeStringVar(VP_TMC_X_Step_Dis, TMC_X_Step_buf_ch); + dgus.writeStringVar(VP_TMC_X_SENS_Dis, TMC_X_Step_buf_ch); const uint16_t TMC_Y_Step_buf_ch[] = { 0x2059, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; - dgus.writeStringVar(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_ch); + dgus.writeStringVar(VP_TMC_Y_SENS_Dis, TMC_Y_Step_buf_ch); const uint16_t TMC_Z_Step_buf_ch[] = { 0x205A, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; - dgus.writeStringVar(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_ch); + dgus.writeStringVar(VP_TMC_Z_SENS_Dis, TMC_Z_Step_buf_ch); const uint16_t Info_PrintFinish_1_buf_ch[] = { 0xF2B4, 0xA1D3, 0xEACD, 0xC9B3, 0x2000 }; dgus.writeStringVar(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_ch, 32); @@ -1858,9 +1774,6 @@ void DGUSScreenHandlerMKS::updateDisplayLanguage() { const uint16_t StopPrintConfirm_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3CD, 0xB9D6, 0xF2B4, 0xA1D3, 0x2000 }; dgus.writeStringVar(VP_StopPrintConfirm_Info_Dis, StopPrintConfirm_Info_buf_ch, 32); - const uint16_t Printting_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; - dgus.writeStringVar(VP_Printting_Dis, Printting_buf_ch, 32); - const uint16_t LCD_BLK_buf_ch[] = { 0xB3B1, 0xE2B9, 0xE8C9, 0xC3D6, 0x2000 }; dgus.writeStringVar(VP_LCD_BLK_Dis, LCD_BLK_buf_ch, 32); diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h index 7bcb7c0a02..58acb5fe60 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h @@ -32,11 +32,10 @@ class DGUSScreenHandlerMKS : public DGUSScreenHandler { public: DGUSScreenHandlerMKS() = default; - #if 0 - static void sendinfoscreen_ch(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4); - static void sendinfoscreen_en(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4); - static void sendInfoScreen(const void *line1, const void *line2, const void *line3, const void *line4, uint16_t language); - #endif + static void sendInfoScreen(const char *line1, const char *line2, const char *line3, const char *line4); + static void sendInfoScreen(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4); + static void sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4); + static void sendInfoScreenMKS(const void *line1, const void *line2, const void *line3, const void *line4, const MKS_Language language); static void screenBackChange(DGUS_VP_Variable &var, void *val_ptr); @@ -72,10 +71,8 @@ public: #endif static void handleMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr); - static void handleExtruderMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr); static void handleAccChange(DGUS_VP_Variable &var, void *val_ptr); static void handleMaxAccChange(DGUS_VP_Variable &var, void *val_ptr); - static void handleExtruderAccChange(DGUS_VP_Variable &var, void *val_ptr); static void handleChangeLevelPoint(DGUS_VP_Variable &var, void *val_ptr); static void handleTravelAccChange(DGUS_VP_Variable &var, void *val_ptr); static void handleFeedRateMinChange(DGUS_VP_Variable &var, void *val_ptr); @@ -101,7 +98,7 @@ public: static void sendFanToDisplay(DGUS_VP_Variable &var); static void sendGbkToDisplay(DGUS_VP_Variable &var); static void sendStringToDisplay_Language(DGUS_VP_Variable &var); - static void sendTMCStepValue(DGUS_VP_Variable &var); + static void sendTMCSensValue(DGUS_VP_Variable &var); static void setUint8(DGUS_VP_Variable &var, void *val_ptr); From 489727330bbe97fbedef6476ad57a39f961a4f05 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 5 Apr 2025 06:08:15 +0000 Subject: [PATCH 063/101] [cron] Bump distribution date (2025-04-05) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 594f3546b6..26d094f40a 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-03" +//#define STRING_DISTRIBUTION_DATE "2025-04-05" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index adb9112bfe..337bcc5850 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-03" + #define STRING_DISTRIBUTION_DATE "2025-04-05" #endif /** From 493c5eec21cd01c15f63bdfe1018eb7ce5e28ed7 Mon Sep 17 00:00:00 2001 From: Vovodroid Date: Sun, 6 Apr 2025 21:42:14 +0300 Subject: [PATCH 064/101] =?UTF-8?q?=F0=9F=9A=B8=20Report=20M48=20Max=20Del?= =?UTF-8?q?ta=20(#26286)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/calibrate/M48.cpp | 14 +++++++++++++- Marlin/src/lcd/language/language_en.h | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 910395e561..981a1d9877 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -261,7 +261,19 @@ void GcodeSuite::M48() { #if HAS_STATUS_MESSAGE // Display M48 results in the status bar - ui.set_status_and_level(MString<30>(GET_TEXT_F(MSG_M48_DEVIATION), F(": "), w_float_t(sigma, 2, 6))); + if (MAX_MESSAGE_SIZE <= 20) { + // 12345678901234567890 + // Deviation: 0.123456 + ui.set_status_and_level(TS(GET_TEXT_F(MSG_M48_DEVIATION), F(": "), w_float_t(sigma, 2, 6))); + } else if (MAX_MESSAGE_SIZE <= 30) { + // 123456789012345678901234567890 + // Dev:0.12345, Max delta:0.12345 + ui.set_status_and_level(TS(GET_TEXT_F(MSG_M48_DEV), ':', w_float_t(sigma, 2, 5), F(", "), GET_TEXT(MSG_M48_MAX_DELTA), ':', w_float_t(_MAX(mean - min, max - mean), 2, 5))); + } else { + // 1234567890123456789012345678901234567890 + // Deviation: 1.23456, Max delta: 1.23456 + ui.set_status_and_level(TS(GET_TEXT_F(MSG_M48_DEVIATION), F(": "), w_float_t(sigma, 2, 6), F(", "), GET_TEXT(MSG_M48_MAX_DELTA), F(": "), w_float_t(_MAX(mean - min, max - mean), 2, 6))); + } #endif } diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 571f85e8ce..54740c923e 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -222,7 +222,9 @@ namespace LanguageNarrow_en { LSTR MSG_M48_TEST = _UxGT("M48 Probe Test"); LSTR MSG_M48_POINT = _UxGT("M48 Point"); LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Probe out of bounds"); + LSTR MSG_M48_DEV = _UxGT("Dev"); LSTR MSG_M48_DEVIATION = _UxGT("Deviation"); + LSTR MSG_M48_MAX_DELTA = _UxGT("Max delta"); LSTR MSG_IDEX_MENU = _UxGT("IDEX Mode"); LSTR MSG_OFFSETS_MENU = _UxGT("Tool Offsets"); LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); From bc85f5bebfdc3637f971d8dac2927940c7f83877 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 6 Apr 2025 13:48:01 -0500 Subject: [PATCH 065/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Add?= =?UTF-8?q?=20Parser::has=5Fstring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/config/M550.cpp | 2 +- Marlin/src/gcode/control/T.cpp | 2 +- Marlin/src/gcode/lcd/M117.cpp | 2 +- Marlin/src/gcode/parser.h | 2 ++ Marlin/src/gcode/stats/M75-M78.cpp | 2 +- Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp | 2 +- 6 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Marlin/src/gcode/config/M550.cpp b/Marlin/src/gcode/config/M550.cpp index 6ff0c506de..88712786da 100644 --- a/Marlin/src/gcode/config/M550.cpp +++ b/Marlin/src/gcode/config/M550.cpp @@ -42,7 +42,7 @@ void GcodeSuite::M550() { machine_name = parser.value_string(); else if (TERN(GCODE_QUOTED_STRINGS, false, parser.seen('P'))) machine_name = parser.string_arg[0] == 'P' ? &parser.string_arg[1] : parser.string_arg; - else if (parser.string_arg && parser.string_arg[0]) + else if (parser.has_string()) machine_name = parser.string_arg; else did_set = false; diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index 9f6fb2bb00..ce6428950e 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -69,7 +69,7 @@ void GcodeSuite::T(const int8_t tool_index) { reset_stepper_timeout(); #if HAS_PRUSA_MMU3 - if (parser.string_arg) { + if (parser.has_string()) { mmu3.tool_change(parser.string_arg[0], uint8_t(tool_index)); // Special commands T?/Tx/Tc return; } diff --git a/Marlin/src/gcode/lcd/M117.cpp b/Marlin/src/gcode/lcd/M117.cpp index 57a26851fd..e8b9cc46f6 100644 --- a/Marlin/src/gcode/lcd/M117.cpp +++ b/Marlin/src/gcode/lcd/M117.cpp @@ -32,7 +32,7 @@ */ void GcodeSuite::M117() { - if (parser.string_arg && parser.string_arg[0]) + if (parser.has_string()) ui.set_status_no_expire(parser.string_arg); else ui.reset_status(); diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 401548b309..e56a723087 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -97,6 +97,8 @@ public: FORCE_INLINE static void cancel_motion_mode() { motion_mode_codenum = -1; } #endif + FORCE_INLINE static bool has_string() { return string_arg && string_arg[0]; } + #if ENABLED(DEBUG_GCODE_PARSER) static void debug(); #endif diff --git a/Marlin/src/gcode/stats/M75-M78.cpp b/Marlin/src/gcode/stats/M75-M78.cpp index 03e76d531d..8ab94577ef 100644 --- a/Marlin/src/gcode/stats/M75-M78.cpp +++ b/Marlin/src/gcode/stats/M75-M78.cpp @@ -43,7 +43,7 @@ void GcodeSuite::M75() { startOrResumeJob(); // ... ExtUI::onPrintTimerStarted() #if ENABLED(DWIN_LCD_PROUI) // TODO: Remove if M75 is never used - if (!IS_SD_PRINTING()) dwinPrintHeader(parser.string_arg && parser.string_arg[0] ? parser.string_arg : GET_TEXT(MSG_HOST_START_PRINT)); + if (!IS_SD_PRINTING()) dwinPrintHeader(parser.has_string() ? parser.string_arg : GET_TEXT(MSG_HOST_START_PRINT)); #endif } diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp index 660d7faed7..8fb672931d 100644 --- a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp @@ -100,7 +100,7 @@ void RTS::onStartup() { delay_ms(400); // Delay to allow screen to configure #if ENABLED(CONFIGURABLE_MACHINE_NAME) - const MString<32> ready(message_string, " Ready"); + const MString<32> ready(machine_name, " Ready"); onStatusChanged(ready); #else onStatusChanged(F(MACHINE_NAME " Ready")); From 9f0879785e0187863c6610f31b1311e5bbf6d899 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 7 Apr 2025 00:31:15 +0000 Subject: [PATCH 066/101] [cron] Bump distribution date (2025-04-07) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 26d094f40a..f5b31acafd 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-05" +//#define STRING_DISTRIBUTION_DATE "2025-04-07" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 337bcc5850..c49c7faeb6 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-05" + #define STRING_DISTRIBUTION_DATE "2025-04-07" #endif /** From d7b73542a168a27840d207f26255b42146d6adcb Mon Sep 17 00:00:00 2001 From: narno2202 <130909513+narno2202@users.noreply.github.com> Date: Mon, 7 Apr 2025 03:58:05 +0200 Subject: [PATCH 067/101] =?UTF-8?q?=F0=9F=9A=B8=20Refactor=20MKS=20H43=20L?= =?UTF-8?q?CD=20(2)=20(#27780)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #27776 --- Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp index b24c6d5e2e..662430ab79 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp @@ -81,7 +81,7 @@ void DGUSScreenHandlerMKS::sendInfoScreen_P(PGM_P const line1, PGM_P const line2 void DGUSScreenHandlerMKS::sendInfoScreenMKS(const void *line1, const void *line2, const void *line3, const void *line4, const MKS_Language language) { if (language == MKS_English) - DGUSScreenHandlerMKS::sendInfoScreen_P((char *)line1, (char *)line2, (char *)line3, (char *)line4); + DGUSScreenHandlerMKS::sendInfoScreen((char *)line1, (char *)line2, (char *)line3, (char *)line4); else if (language == MKS_SimpleChinese) DGUSScreenHandlerMKS::sendInfoScreen((uint16_t *)line1, (uint16_t *)line2, (uint16_t *)line3, (uint16_t *)line4); } From 7bfecf659b9c02ca87201b32801ec8cac672e70e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 6 Apr 2025 21:09:40 -0500 Subject: [PATCH 068/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Mis?= =?UTF-8?q?c.=20dgus/mks=20comments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/extui/dgus/DGUSDisplay.h | 10 +++++++--- Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp | 4 ++-- Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp | 2 +- Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h | 7 ++++++- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/extui/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/dgus/DGUSDisplay.h index 6329d8fb23..e54b916ec6 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/dgus/DGUSDisplay.h @@ -68,18 +68,22 @@ public: static void writeVariable(uint16_t adr, int8_t value); static void writeVariable(uint16_t adr, long value); + // Western PROGMEM string constant static void writeStringVar_P(uint16_t adr, PGM_P const pstr, uint8_t vallen=32) { writeVariable_P(adr, (const void *)pstr, vallen, true); } + // Western F-string constant + static void writeVariable(uint16_t adr, FSTR_P const fstr, uint8_t vallen=32) { + writeStringVar_P(adr, FTOP(fstr), vallen); + } + // Western string constant static void writeStringVar(uint16_t adr, const char * const cstr, uint8_t vallen=32) { writeVariable(adr, (const void *)cstr, vallen, true); } + // Chinese string constant static void writeStringVar(uint16_t adr, const uint16_t * const zhstr, uint8_t vallen=16) { writeVariable(adr, (const void *)zhstr, vallen, true); } - static void writeVariable(uint16_t adr, FSTR_P const fstr, uint8_t vallen=32) { - writeStringVar_P(adr, FTOP(fstr), vallen); - } // Utility functions for bridging ui_api and dgus template diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp index e40aab0bff..38b3d93853 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp @@ -326,9 +326,9 @@ void DGUSScreenHandler::sendHeaterStatusToDisplay(DGUS_VP_Variable &var) { void DGUSScreenHandler::sdCardError() { DGUSScreenHandler::sdCardRemoved(); #if DGUS_LCD_UI_MKS - screen.sendInfoScreenMKS(F("NOTICE"), nullptr, F("SD card error"), nullptr, mks_language_index); + sendInfoScreenMKS(F("NOTICE"), nullptr, F("SD card error"), nullptr, mks_language_index); #else - sendInfoScreen(F("NOTICE"), nullptr, F("SD card error"), nullptr, true, true, true, true); + sendInfoScreen(F("NOTICE"), nullptr, F("SD card error"), nullptr); #endif setupConfirmAction(nullptr); gotoScreen(DGUS_SCREEN_POPUP); diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp index 662430ab79..2a9ba87d68 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp @@ -1525,7 +1525,7 @@ void DGUSScreenHandlerMKS::updateDisplayLanguage() { } break; // MKS_English case MKS_SimpleChinese: { - uint16_t home_buf_ch[] = { 0xF7D6, 0xB3D2 }; + const uint16_t home_buf_ch[] = { 0xF7D6, 0xB3D2 }; dgus.writeStringVar(VP_HOME_Dis, home_buf_ch, 4); const uint16_t Setting_Dis[] = { 0xE8C9, 0xC3D6, 0x2000, 0x2000, 0x2000 }; diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h index 58acb5fe60..01faed6896 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h @@ -32,9 +32,14 @@ class DGUSScreenHandlerMKS : public DGUSScreenHandler { public: DGUSScreenHandlerMKS() = default; + // Western / Chinese PROGMEM strings + static void sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4); + + // Western / Chinese strings static void sendInfoScreen(const char *line1, const char *line2, const char *line3, const char *line4); static void sendInfoScreen(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4); - static void sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4); + + // Use the language parameter to choose Western / Chinese string method static void sendInfoScreenMKS(const void *line1, const void *line2, const void *line3, const void *line4, const MKS_Language language); static void screenBackChange(DGUS_VP_Variable &var, void *val_ptr); From 6984c7f30883737593aaf17ee9c8f7d3004704ae Mon Sep 17 00:00:00 2001 From: Andrey Samokhin <97097314+AndreySamokhin@users.noreply.github.com> Date: Mon, 7 Apr 2025 05:18:01 +0300 Subject: [PATCH 069/101] =?UTF-8?q?=F0=9F=94=A7=20Max=20Stepper=20Rate=20s?= =?UTF-8?q?anity-checks=20(#27764)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/Conditionals-4-adv.h | 2 +- Marlin/src/inc/SanityCheck.h | 78 +++++++++++++++++++++++++++++ buildroot/tests/LPC1769 | 2 +- buildroot/tests/STM32H743VI_btt | 1 + 4 files changed, 81 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/Conditionals-4-adv.h b/Marlin/src/inc/Conditionals-4-adv.h index eaa8aca5b0..653a754700 100644 --- a/Marlin/src/inc/Conditionals-4-adv.h +++ b/Marlin/src/inc/Conditionals-4-adv.h @@ -1296,7 +1296,7 @@ #define MAXIMUM_STEPPER_RATE 150000 #elif HAS_DRIVER(DRV8825) #define MAXIMUM_STEPPER_RATE 250000 - #elif HAS_DRIVER(A4988) + #elif HAS_DRIVER(A4988) || HAS_DRIVER(A5984) #define MAXIMUM_STEPPER_RATE 500000 #elif HAS_DRIVER(LV8729) #define MAXIMUM_STEPPER_RATE 1000000 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 1505b8b896..fa06bac9f5 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3720,6 +3720,84 @@ static_assert(COUNT(sanity_arr_3) >= LOGICAL_AXES, "DEFAULT_MAX_ACCELERATION re static_assert(COUNT(sanity_arr_3) <= DISTINCT_AXES, "DEFAULT_MAX_ACCELERATION has too many elements." _EXTRA_NOTE); static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive."); +#if MAXIMUM_STEPPER_RATE + static_assert(TERN1(HAS_X_AXIS, sanity_arr_1[X_AXIS] * sanity_arr_2[X_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[X] * DEFAULT_AXIS_STEPS_PER_UNIT[X] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_Y_AXIS, sanity_arr_1[Y_AXIS] * sanity_arr_2[Y_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[Y] * DEFAULT_AXIS_STEPS_PER_UNIT[Y] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_Z_AXIS, sanity_arr_1[Z_AXIS] * sanity_arr_2[Z_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[Z] * DEFAULT_AXIS_STEPS_PER_UNIT[Z] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_I_AXIS, sanity_arr_1[I_AXIS] * sanity_arr_2[I_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[I] * DEFAULT_AXIS_STEPS_PER_UNIT[I] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_J_AXIS, sanity_arr_1[J_AXIS] * sanity_arr_2[J_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[J] * DEFAULT_AXIS_STEPS_PER_UNIT[J] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_K_AXIS, sanity_arr_1[K_AXIS] * sanity_arr_2[K_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[K] * DEFAULT_AXIS_STEPS_PER_UNIT[K] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_U_AXIS, sanity_arr_1[U_AXIS] * sanity_arr_2[U_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[U] * DEFAULT_AXIS_STEPS_PER_UNIT[U] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_V_AXIS, sanity_arr_1[V_AXIS] * sanity_arr_2[V_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[V] * DEFAULT_AXIS_STEPS_PER_UNIT[V] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_W_AXIS, sanity_arr_1[W_AXIS] * sanity_arr_2[W_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[W] * DEFAULT_AXIS_STEPS_PER_UNIT[W] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #if ALL(HAS_EXTRUDERS, SANITY_CHECK_E_STEPPER_RATES) + #if DISABLED(DISTINCT_E_FACTORS) + static_assert(sanity_arr_1[E_AXIS] * sanity_arr_2[E_AXIS] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E] * DEFAULT_AXIS_STEPS_PER_UNIT[E] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #else + #define _ELEM_E(A,N) _MIN(E_AXIS+N,COUNT(sanity_arr_##A)-1) + static_assert(sanity_arr_1[_ELEM_E(1,0)] * sanity_arr_2[_ELEM_E(2,0)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E0] * DEFAULT_AXIS_STEPS_PER_UNIT[E0] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #if HAS_MULTI_EXTRUDER + static_assert(sanity_arr_1[_ELEM_E(1,1)] * sanity_arr_2[_ELEM_E(2,1)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E1] * DEFAULT_AXIS_STEPS_PER_UNIT[E1] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 2 + static_assert(sanity_arr_1[_ELEM_E(1,2)] * sanity_arr_2[_ELEM_E(2,2)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E2] * DEFAULT_AXIS_STEPS_PER_UNIT[E2] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 3 + static_assert(sanity_arr_1[_ELEM_E(1,3)] * sanity_arr_2[_ELEM_E(2,3)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E3] * DEFAULT_AXIS_STEPS_PER_UNIT[E3] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 4 + static_assert(sanity_arr_1[_ELEM_E(1,4)] * sanity_arr_2[_ELEM_E(2,4)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E4] * DEFAULT_AXIS_STEPS_PER_UNIT[E4] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 5 + static_assert(sanity_arr_1[_ELEM_E(1,5)] * sanity_arr_2[_ELEM_E(2,5)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E5] * DEFAULT_AXIS_STEPS_PER_UNIT[E5] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 6 + static_assert(sanity_arr_1[_ELEM_E(1,6)] * sanity_arr_2[_ELEM_E(2,6)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E6] * DEFAULT_AXIS_STEPS_PER_UNIT[E6] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 7 + static_assert(sanity_arr_1[_ELEM_E(1,7)] * sanity_arr_2[_ELEM_E(2,7)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E7] * DEFAULT_AXIS_STEPS_PER_UNIT[E7] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #undef _ELEM_E + #endif + #endif // HAS_EXTRUDERS +#endif // MAXIMUM_STEPPER_RATE + #if NUM_AXES constexpr float sanity_arr_4[] = HOMING_FEEDRATE_MM_M; static_assert(COUNT(sanity_arr_4) == NUM_AXES, "HOMING_FEEDRATE_MM_M requires " _NUM_AXES_STR "elements (and no others)."); diff --git a/buildroot/tests/LPC1769 b/buildroot/tests/LPC1769 index a97790e988..f29bbb5656 100755 --- a/buildroot/tests/LPC1769 +++ b/buildroot/tests/LPC1769 @@ -46,7 +46,7 @@ opt_set MOTHERBOARD BOARD_COHESION3D_REMIX \ TEMP_SENSOR_0 1 \ X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2130 Z_DRIVER_TYPE TMC2130 I_DRIVER_TYPE TB6560 \ DEFAULT_AXIS_STEPS_PER_UNIT '{ 80, 80, 400, 500, 80 }' \ - DEFAULT_MAX_FEEDRATE '{ 300, 300, 5, 25, 300 }' \ + DEFAULT_MAX_FEEDRATE '{ 187, 187, 5, 25, 187 }' \ DEFAULT_MAX_ACCELERATION '{ 3000, 3000, 100, 10000, 3000 }' \ MANUAL_FEEDRATE '{ 50*60, 50*60, 4*60, 2*60, 50*60 }' \ AXIS_RELATIVE_MODES '{ false, false, false, false, false }' \ diff --git a/buildroot/tests/STM32H743VI_btt b/buildroot/tests/STM32H743VI_btt index e73a786ff4..7ca63aa53a 100755 --- a/buildroot/tests/STM32H743VI_btt +++ b/buildroot/tests/STM32H743VI_btt @@ -12,6 +12,7 @@ set -e # restore_configs use_example_configs "Creality/Ender-5 Plus/BigTreeTech SKR 3" +opt_set DEFAULT_MAX_FEEDRATE '{ 6250, 6250, 15, 5375 }' exec_test $1 $2 "Creality Ender-5 Plus with BigTreeTech SKR 3" "$3" From ed4afab00404d437cb3f76e41fc160ffad6417f0 Mon Sep 17 00:00:00 2001 From: narno2202 <130909513+narno2202@users.noreply.github.com> Date: Tue, 8 Apr 2025 00:38:11 +0200 Subject: [PATCH 070/101] =?UTF-8?q?=F0=9F=9A=B8=20Fix=20FT=20Motion=20Line?= =?UTF-8?q?ar=20Advance=20MarlinUI=20edit=20item=20(#27786)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 4717f4b221..f6f13e2a4e 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -503,7 +503,7 @@ void menu_move() { #if HAS_EXTRUDERS EDIT_ITEM(bool, MSG_LINEAR_ADVANCE, &c.linearAdvEna); if (c.linearAdvEna || ENABLED(FT_MOTION_NO_MENU_TOGGLE)) - EDIT_ITEM(float42_52, MSG_ADVANCE_K, &c.linearAdvK, 0, 10); + EDIT_ITEM(float62, MSG_ADVANCE_K, &c.linearAdvK, 0.0f, 1000.0f); #endif END_MENU(); From bdc0bd0eef1920ff850434eeb0954d8c5715001a Mon Sep 17 00:00:00 2001 From: Boyd Date: Mon, 7 Apr 2025 16:22:58 -0700 Subject: [PATCH 071/101] =?UTF-8?q?=E2=9C=A8=20Native=20GD32=20support=20f?= =?UTF-8?q?or=20Aquila=20v1.0.1=20(#27765)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-build-tests.yml | 3 ++ Marlin/src/HAL/GD32_MFL/HAL.h | 4 +- Marlin/src/core/boards.h | 10 ++++- .../pins/gd32f1/pins_AQUILA_101_GD32_MFL.h | 37 +++++++++++++++++++ Marlin/src/pins/pins.h | 7 ++++ Marlin/src/pins/stm32f1/env_validate.h | 5 ++- buildroot/tests/GD32F103RC_aquila_mfl | 17 +++++++++ ini/gd32.ini | 27 ++++++++++++-- 8 files changed, 102 insertions(+), 8 deletions(-) create mode 100644 Marlin/src/pins/gd32f1/pins_AQUILA_101_GD32_MFL.h create mode 100755 buildroot/tests/GD32F103RC_aquila_mfl diff --git a/.github/workflows/ci-build-tests.yml b/.github/workflows/ci-build-tests.yml index 2fd316ec0f..58fd02eb5d 100644 --- a/.github/workflows/ci-build-tests.yml +++ b/.github/workflows/ci-build-tests.yml @@ -154,6 +154,9 @@ jobs: # GD32F3 - GD32F303RE_creality_mfl + # GD32F1 + - GD32F103RC_aquila_mfl + # LPC176x - Lengthy tests - LPC1768 - LPC1769 diff --git a/Marlin/src/HAL/GD32_MFL/HAL.h b/Marlin/src/HAL/GD32_MFL/HAL.h index a8a28cc7f3..fd3a10d72b 100644 --- a/Marlin/src/HAL/GD32_MFL/HAL.h +++ b/Marlin/src/HAL/GD32_MFL/HAL.h @@ -82,7 +82,9 @@ typedef libServo hal_servo_t; // Disable Marlin's software oversampling. // The MFL framework uses 16x hardware oversampling by default -#define HAL_ADC_FILTERED +#ifdef GD32F303RE + #define HAL_ADC_FILTERED +#endif #define GET_PIN_MAP_PIN(index) index #define GET_PIN_MAP_INDEX(pin) pin diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 3d34e3717e..e7851d001a 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -549,14 +549,20 @@ // HC32 ARM Cortex-M4 // -#define BOARD_AQUILA_V101 7200 // Voxelab Aquila V1.0.0/V1.0.1/V1.0.2/V1.0.3 as found in the Voxelab Aquila X2 and C2 +#define BOARD_AQUILA_V101 7200 // Voxelab Aquila V1.0.0/1/2/3 (e.g., Aquila X2, C2). ... GD32 Variant Below! #define BOARD_CREALITY_ENDER2P_V24S4 7201 // Creality Ender 2 Pro v2.4.S4_170 (HC32f460kcta) +// +// GD32 ARM Cortex-M3 +// + +#define BOARD_AQUILA_V101_GD32_MFL 7300 // Voxelab Aquila V1.0.1 MFL (GD32F103RC) ... STM32/HC32 Variant Above! + // // GD32 ARM Cortex-M4 // -#define BOARD_CREALITY_V422_GD32_MFL 7300 // Creality V4.2.2 MFL (GD32F303RE) ... STM32 Variant Above! +#define BOARD_CREALITY_V422_GD32_MFL 7400 // Creality V4.2.2 MFL (GD32F303RE) ... STM32 Variant Above! // // Raspberry Pi diff --git a/Marlin/src/pins/gd32f1/pins_AQUILA_101_GD32_MFL.h b/Marlin/src/pins/gd32f1/pins_AQUILA_101_GD32_MFL.h new file mode 100644 index 0000000000..f3bc9378e9 --- /dev/null +++ b/Marlin/src/pins/gd32f1/pins_AQUILA_101_GD32_MFL.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Aquila v1.0.1 GD32 MFL (GD32F103RC) board pin assignments + */ + +#define ALLOW_GD32F1 + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Aquila v1.0.1 GD32 MFL" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME "Aquila" +#endif + +#include "../stm32f1/pins_CREALITY_V4.h" diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 2e0919062c..dcb8415de8 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -964,6 +964,13 @@ #elif MB(CREALITY_ENDER2P_V24S4) #include "hc32f4/pins_CREALITY_ENDER2P_V24S4.h" // HC32F460 env:HC32F460C_e2p24s4 +// +// GD32 ARM Cortex-M3 +// + +#elif MB(AQUILA_V101_GD32_MFL) + #include "gd32f1/pins_AQUILA_101_GD32_MFL.h" // GD32F103RC env:GD32F103RC_aquila_mfl + // // GD32 ARM Cortex-M4 // diff --git a/Marlin/src/pins/stm32f1/env_validate.h b/Marlin/src/pins/stm32f1/env_validate.h index 34b07723e7..e219e7cd51 100644 --- a/Marlin/src/pins/stm32f1/env_validate.h +++ b/Marlin/src/pins/stm32f1/env_validate.h @@ -23,16 +23,19 @@ #define ENV_VALIDATE_H #if NOT_TARGET(__STM32F1__, STM32F1) - #if NONE(ALLOW_STM32F4, ALLOW_GD32F3) + #if NONE(ALLOW_STM32F4, ALLOW_GD32F3, ALLOW_GD32F1) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif ENABLED(ALLOW_STM32F4) && NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif ENABLED(ALLOW_GD32F3) && NOT_TARGET(ARDUINO_ARCH_MFL) #error "Oops! Make sure you have a GD32F3 MFL environment selected." + #elif ENABLED(ALLOW_GD32F1) && NOT_TARGET(ARDUINO_ARCH_MFL) + #error "Oops! Make sure you have a GD32F1 MFL environment selected." #endif #endif #undef ALLOW_STM32F4 #undef ALLOW_GD32F3 +#undef ALLOW_GD32F1 #endif diff --git a/buildroot/tests/GD32F103RC_aquila_mfl b/buildroot/tests/GD32F103RC_aquila_mfl new file mode 100755 index 0000000000..ca7cd05936 --- /dev/null +++ b/buildroot/tests/GD32F103RC_aquila_mfl @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for GD32F103RC_aquila_mfl +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_AQUILA_V101_GD32_MFL SERIAL_PORT 0 +opt_enable EEPROM_SETTINGS SDSUPPORT EMERGENCY_PARSER FAN_SOFT_PWM PINS_DEBUGGING +opt_add NO_CREALITY_422_DRIVER_WARNING +opt_add NO_AUTO_ASSIGN_WARNING +exec_test $1 $2 "Aquila v1.0.1 MFL GD32 Default Configuration" "$3" + +# cleanup +restore_configs diff --git a/ini/gd32.ini b/ini/gd32.ini index 1286772786..e983f496ec 100644 --- a/ini/gd32.ini +++ b/ini/gd32.ini @@ -30,8 +30,8 @@ extra_scripts = ${common.extra_scripts} extends = gd32_base board = mfl_creality_422 board_build.offset = 0x7000 -board_build.rename = firmware-{time}.bin board_upload.offset_address = 0x08007000 +board_build.rename = firmware-{time}.bin build_flags = ${gd32_base.build_flags} -DMCU_GD32F303RE -DGD32F303RE @@ -40,7 +40,26 @@ build_flags = ${gd32_base.build_flags} -DTIMER_SERVO=4 -DTRANSFER_CLOCK_DIV=8 -fsingle-precision-constant -extra_scripts = ${gd32_base.extra_scripts} - buildroot/share/PlatformIO/scripts/offset_and_rename.py - +extra_scripts = ${gd32_base.extra_scripts} + buildroot/share/PlatformIO/scripts/offset_and_rename.py +monitor_speed = 115200 + +# +# Aquila v1.0.1 (GD32F103RC) +# +[env:GD32F103RC_aquila_mfl] +extends = gd32_base +board = mfl_aquila +board_build.offset = 0x7000 +board_upload.offset_address = 0x08007000 +board_build.rename = firmware-{time}.bin +build_flags = ${gd32_base.build_flags} + -DMCU_GD32F103RC + -DGD32F103RC + -DTIMER_TONE=2 + -DSS_TIMER=3 + -DTIMER_SERVO=4 + -DTRANSFER_CLOCK_DIV=8 +extra_scripts = ${gd32_base.extra_scripts} + buildroot/share/PlatformIO/scripts/offset_and_rename.py monitor_speed = 115200 From cbd79a5e870579cfcbf0cac3c4e6f85ce6940d30 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 7 Apr 2025 18:05:57 -0500 Subject: [PATCH 072/101] =?UTF-8?q?=E2=9C=85=20Tweak=20pip/PIO=20caching?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-build-tests.yml | 13 +++++++++---- .github/workflows/ci-unit-tests.yml | 13 +++++++++---- .github/workflows/ci-validate-boards.yml | 4 ++-- .github/workflows/ci-validate-pins.yml | 4 ++-- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci-build-tests.yml b/.github/workflows/ci-build-tests.yml index 58fd02eb5d..f80417c0fe 100644 --- a/.github/workflows/ci-build-tests.yml +++ b/.github/workflows/ci-build-tests.yml @@ -170,15 +170,20 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + key: ${{ runner.os }}-pip-build-v1 restore-keys: | - ${{ runner.os }}-pip- + ${{ runner.os }}-pip-build- - name: Cache PlatformIO uses: actions/cache@v4 with: - path: ~/.platformio - key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} + path: | + ~/.platformio + .pio/build + .pio/libdeps + key: ${{ runner.os }}-pio-build-v1 + restore-keys: | + ${{ runner.os }}-pio-build- - name: Select Python 3.9 uses: actions/setup-python@v5 diff --git a/.github/workflows/ci-unit-tests.yml b/.github/workflows/ci-unit-tests.yml index 9a311aabc6..30af812dff 100644 --- a/.github/workflows/ci-unit-tests.yml +++ b/.github/workflows/ci-unit-tests.yml @@ -46,15 +46,20 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + key: ${{ runner.os }}-pip-unit-v1 restore-keys: | - ${{ runner.os }}-pip- + ${{ runner.os }}-pip-unit- - name: Cache PlatformIO uses: actions/cache@v4 with: - path: ~/.platformio - key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} + path: | + ~/.platformio + .pio/build + .pio/libdeps + key: ${{ runner.os }}-pio-tests-v1 + restore-keys: | + ${{ runner.os }}-pio-tests- - name: Select Python 3.9 uses: actions/setup-python@v5 diff --git a/.github/workflows/ci-validate-boards.yml b/.github/workflows/ci-validate-boards.yml index baa7b8b6e1..36f3a3522a 100644 --- a/.github/workflows/ci-validate-boards.yml +++ b/.github/workflows/ci-validate-boards.yml @@ -33,9 +33,9 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + key: ${{ runner.os }}-pip-boards-v1 restore-keys: | - ${{ runner.os }}-pip- + ${{ runner.os }}-pip-boards- - name: Select Python 3.9 uses: actions/setup-python@v5 diff --git a/.github/workflows/ci-validate-pins.yml b/.github/workflows/ci-validate-pins.yml index 695f8eff18..ae777427e7 100644 --- a/.github/workflows/ci-validate-pins.yml +++ b/.github/workflows/ci-validate-pins.yml @@ -36,9 +36,9 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + key: ${{ runner.os }}-pip-pins-v1 restore-keys: | - ${{ runner.os }}-pip- + ${{ runner.os }}-pip-pins- - name: Select Python 3.9 uses: actions/setup-python@v5 From db4990f2c4f36eb56323c262b42042ec8efb6ad9 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 8 Apr 2025 00:29:33 +0000 Subject: [PATCH 073/101] [cron] Bump distribution date (2025-04-08) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index f5b31acafd..d071d96c66 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-07" +//#define STRING_DISTRIBUTION_DATE "2025-04-08" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index c49c7faeb6..13b8eee07e 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-07" + #define STRING_DISTRIBUTION_DATE "2025-04-08" #endif /** From 6f5e6fd25b80aa994b2a887e0c20d3a67e3d2fb5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 9 Apr 2025 18:41:12 -0500 Subject: [PATCH 074/101] =?UTF-8?q?=F0=9F=A9=B9=20TFT=5FBUFFER=5FSIZE=20?= =?UTF-8?q?=3D>=20=5FWORDS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #26011 --- Marlin/src/pins/rp2040/pins_RP2040.h | 2 +- .../pins/stm32f4/pins_BTT_SKR_V2_0_common.h | 2 +- .../src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h | 2 +- .../pins/stm32f4/pins_MKS_NEPTUNE_X_common.h | 39 +------------------ 4 files changed, 5 insertions(+), 40 deletions(-) diff --git a/Marlin/src/pins/rp2040/pins_RP2040.h b/Marlin/src/pins/rp2040/pins_RP2040.h index 48e37e4e1f..6a4e54f0bd 100644 --- a/Marlin/src/pins/rp2040/pins_RP2040.h +++ b/Marlin/src/pins/rp2040/pins_RP2040.h @@ -293,7 +293,7 @@ #define SPI_FLASH_SCK_PIN SD_SCK_PIN #endif - #define TFT_BUFFER_SIZE 0xFFFF + #define TFT_BUFFER_WORDS 0xFFFF #ifndef TFT_DRIVER #define TFT_DRIVER ST7796 #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h index 692b50be40..51b27efa39 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h @@ -483,7 +483,7 @@ #elif ENABLED(FYSETC_MINI_12864_2_1) #define NEOPIXEL_PIN EXP1_06_PIN #endif - #endif // !FYSETC_MINI_12864 + #endif // FYSETC_MINI_12864 #if IS_ULTIPANEL #define LCD_PINS_D5 EXP1_06_PIN diff --git a/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h b/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h index 3ae1432a14..4626176a99 100644 --- a/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h @@ -472,7 +472,7 @@ #define LCD_READ_ID 0xD3 #define LCD_USE_DMA_SPI - #define TFT_BUFFER_SIZE 14400 + #define TFT_BUFFER_WORDS 14400 #endif diff --git a/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h b/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h index 7d1d7943cf..4e59f1c5dd 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h @@ -208,41 +208,6 @@ #define MKS_TEST_PS_ON_PIN PB2 // PW_OFF #endif -// -// TFT with FSMC interface -// -#if HAS_FSMC_TFT - /** - * Note: MKS Robin TFT screens use various TFT controllers. - * If the screen stays white, disable 'TFT_RESET_PIN' - * to let the bootloader init the screen. - */ - #define TFT_RESET_PIN PC6 // FSMC_RST - #define TFT_BACKLIGHT_PIN PD13 - - #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h - #define DOGLCD_SCK -1 - - #define TOUCH_CS_PIN PA7 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define TFT_CS_PIN FSMC_CS_PIN - #define TFT_RS_PIN FSMC_RS_PIN - - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 - - #define TFT_BUFFER_SIZE 14400 -#endif - // // Onboard SD card // @@ -305,5 +270,5 @@ #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 - #define TFT_BUFFER_SIZE 14400 -#endif + #define TFT_BUFFER_WORDS 14400 +#endif // HAS_FSMC_TFT From 47820cac8a20987508236cdc4de639502f500b2f Mon Sep 17 00:00:00 2001 From: Andrew <18502096+classicrocker883@users.noreply.github.com> Date: Wed, 9 Apr 2025 20:08:10 -0400 Subject: [PATCH 075/101] =?UTF-8?q?=F0=9F=8E=A8=20Whitespace=20cleanups=20?= =?UTF-8?q?(#27784)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Makefile | 10 +- Marlin/src/HAL/AVR/pinsDebug_plus_70.h | 504 ++++++++--------- Marlin/src/HAL/DUE/HAL_SPI.cpp | 14 +- Marlin/src/HAL/RP2040/timers.h | 8 +- Marlin/src/HAL/STM32F1/HAL_N32.h | 16 +- Marlin/src/HAL/STM32F1/sdio.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/fastio.h | 6 +- Marlin/src/HAL/TEENSY35_36/fastio.h | 6 +- Marlin/src/core/serial_base.h | 2 +- Marlin/src/core/types.h | 4 +- Marlin/src/feature/bedlevel/ubl/ubl.h | 2 +- Marlin/src/gcode/host/M360.cpp | 2 +- Marlin/src/inc/Conditionals-2-LCD.h | 2 +- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 4 +- Marlin/src/lcd/e3v2/proui/menus.cpp | 4 +- .../lcd/extui/anycubic_chiron/chiron_tft.cpp | 4 +- .../src/lcd/extui/anycubic_vyper/dgus_tft.cpp | 4 +- .../lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp | 2 +- .../lcd/extui/dgus/fysetc/DGUSDisplayDef.h | 12 +- .../lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp | 2 +- .../lcd/extui/dgus/hiprecy/DGUSDisplayDef.h | 10 +- .../src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp | 12 +- .../src/lcd/extui/dgus/mks/DGUSDisplayDef.h | 12 +- .../lcd/extui/dgus/origin/DGUSDisplayDef.cpp | 2 +- .../lcd/extui/dgus/origin/DGUSDisplayDef.h | 10 +- .../ftdi_eve_lib/scripts/font2cpp.py | 2 +- Marlin/src/lcd/extui/mks_ui/tft_Language_en.h | 4 +- Marlin/src/lcd/extui/mks_ui/tft_Language_it.h | 4 +- Marlin/src/lcd/extui/mks_ui/tft_Language_ru.h | 4 +- Marlin/src/lcd/extui/ui_api.h | 4 +- Marlin/src/lcd/tft/ui_color_ui.cpp | 6 +- Marlin/src/module/scara.cpp | 4 +- Marlin/src/module/temperature.cpp | 4 +- Marlin/src/module/thermistor/thermistor_666.h | 2 +- Marlin/src/pins/sam/pins_ALLIGATOR_R2.h | 2 +- .../src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h | 2 +- Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h | 2 +- .../usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h | 2 +- buildroot/share/PlatformIO/scripts/exc.S | 2 +- .../variants/MARLIN_FLY_D5/ldscript.ld | 2 +- .../variants/MARLIN_FLY_D7/ldscript.ld | 2 +- .../MARLIN_MEGA_EXTENDED/pins_arduino.h | 516 +++++++++--------- .../marlin_maple_CHITU_F103/board.cpp | 128 ++--- .../variants/marlin_maple_MEEB_3DP/board.cpp | 6 +- .../scripts/createTemperatureLookupMarlin.py | 2 +- buildroot/tests/BTT_GTR_V1_0 | 2 +- docs/Cutter.md | 2 +- ini/hc32.ini | 12 +- 48 files changed, 686 insertions(+), 686 deletions(-) diff --git a/Marlin/Makefile b/Marlin/Makefile index 63b1029e1b..ce26bd3572 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -127,9 +127,9 @@ NEOPIXEL ?= 0 # on GCC versions: # https://www.avrfreaks.net/comment/1789106#comment-1789106 -CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | cut -f3 -d\ ) -CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d\ ) -CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ ) +CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | cut -f3 -d' ' ) +CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d' ' ) +CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d' ' ) CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) ))) ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1) $(warning This GCC version $(CC_VER) is likely broken. Enabling relocation workaround.) @@ -868,8 +868,8 @@ else ifeq ($(HARDWARE_VARIANT), archim) endif # Add all the source directories as include directories too -CINCS = ${addprefix -I ,${VPATH}} -CXXINCS = ${addprefix -I ,${VPATH}} +CINCS = ${addprefix -I, ${VPATH}} +CXXINCS = ${addprefix -I, ${VPATH}} # Silence warnings for library code (won't work for .h files, unfortunately) LIBWARN = -w -Wno-packed-bitfield-compat diff --git a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h index fa479cfe8f..6565acd523 100644 --- a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h +++ b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h @@ -48,92 +48,92 @@ const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = { // PORTLIST // ------------------------ - PE , // PE 0 ** 0 ** USART0_RX - PE , // PE 1 ** 1 ** USART0_TX - PE , // PE 4 ** 2 ** PWM2 - PE , // PE 5 ** 3 ** PWM3 - PG , // PG 5 ** 4 ** PWM4 - PE , // PE 3 ** 5 ** PWM5 - PH , // PH 3 ** 6 ** PWM6 - PH , // PH 4 ** 7 ** PWM7 - PH , // PH 5 ** 8 ** PWM8 - PH , // PH 6 ** 9 ** PWM9 - PB , // PB 4 ** 10 ** PWM10 - PB , // PB 5 ** 11 ** PWM11 - PB , // PB 6 ** 12 ** PWM12 - PB , // PB 7 ** 13 ** PWM13 - PJ , // PJ 1 ** 14 ** USART3_TX - PJ , // PJ 0 ** 15 ** USART3_RX - PH , // PH 1 ** 16 ** USART2_TX - PH , // PH 0 ** 17 ** USART2_RX - PD , // PD 3 ** 18 ** USART1_TX - PD , // PD 2 ** 19 ** USART1_RX - PD , // PD 1 ** 20 ** I2C_SDA - PD , // PD 0 ** 21 ** I2C_SCL - PA , // PA 0 ** 22 ** D22 - PA , // PA 1 ** 23 ** D23 - PA , // PA 2 ** 24 ** D24 - PA , // PA 3 ** 25 ** D25 - PA , // PA 4 ** 26 ** D26 - PA , // PA 5 ** 27 ** D27 - PA , // PA 6 ** 28 ** D28 - PA , // PA 7 ** 29 ** D29 - PC , // PC 7 ** 30 ** D30 - PC , // PC 6 ** 31 ** D31 - PC , // PC 5 ** 32 ** D32 - PC , // PC 4 ** 33 ** D33 - PC , // PC 3 ** 34 ** D34 - PC , // PC 2 ** 35 ** D35 - PC , // PC 1 ** 36 ** D36 - PC , // PC 0 ** 37 ** D37 - PD , // PD 7 ** 38 ** D38 - PG , // PG 2 ** 39 ** D39 - PG , // PG 1 ** 40 ** D40 - PG , // PG 0 ** 41 ** D41 - PL , // PL 7 ** 42 ** D42 - PL , // PL 6 ** 43 ** D43 - PL , // PL 5 ** 44 ** D44 - PL , // PL 4 ** 45 ** D45 - PL , // PL 3 ** 46 ** D46 - PL , // PL 2 ** 47 ** D47 - PL , // PL 1 ** 48 ** D48 - PL , // PL 0 ** 49 ** D49 - PB , // PB 3 ** 50 ** SPI_MISO - PB , // PB 2 ** 51 ** SPI_MOSI - PB , // PB 1 ** 52 ** SPI_SCK - PB , // PB 0 ** 53 ** SPI_SS - PF , // PF 0 ** 54 ** A0 - PF , // PF 1 ** 55 ** A1 - PF , // PF 2 ** 56 ** A2 - PF , // PF 3 ** 57 ** A3 - PF , // PF 4 ** 58 ** A4 - PF , // PF 5 ** 59 ** A5 - PF , // PF 6 ** 60 ** A6 - PF , // PF 7 ** 61 ** A7 - PK , // PK 0 ** 62 ** A8 - PK , // PK 1 ** 63 ** A9 - PK , // PK 2 ** 64 ** A10 - PK , // PK 3 ** 65 ** A11 - PK , // PK 4 ** 66 ** A12 - PK , // PK 5 ** 67 ** A13 - PK , // PK 6 ** 68 ** A14 - PK , // PK 7 ** 69 ** A15 - PG , // PG 4 ** 70 ** - PG , // PG 3 ** 71 ** - PJ , // PJ 2 ** 72 ** - PJ , // PJ 3 ** 73 ** - PJ , // PJ 7 ** 74 ** - PJ , // PJ 4 ** 75 ** - PJ , // PJ 5 ** 76 ** - PJ , // PJ 6 ** 77 ** - PE , // PE 2 ** 78 ** - PE , // PE 6 ** 79 ** - PE , // PE 7 ** 80 ** - PD , // PD 4 ** 81 ** - PD , // PD 5 ** 82 ** - PD , // PD 6 ** 83 ** - PH , // PH 2 ** 84 ** - PH , // PH 7 ** 85 ** + PE, // PE 0 ** 0 ** USART0_RX + PE, // PE 1 ** 1 ** USART0_TX + PE, // PE 4 ** 2 ** PWM2 + PE, // PE 5 ** 3 ** PWM3 + PG, // PG 5 ** 4 ** PWM4 + PE, // PE 3 ** 5 ** PWM5 + PH, // PH 3 ** 6 ** PWM6 + PH, // PH 4 ** 7 ** PWM7 + PH, // PH 5 ** 8 ** PWM8 + PH, // PH 6 ** 9 ** PWM9 + PB, // PB 4 ** 10 ** PWM10 + PB, // PB 5 ** 11 ** PWM11 + PB, // PB 6 ** 12 ** PWM12 + PB, // PB 7 ** 13 ** PWM13 + PJ, // PJ 1 ** 14 ** USART3_TX + PJ, // PJ 0 ** 15 ** USART3_RX + PH, // PH 1 ** 16 ** USART2_TX + PH, // PH 0 ** 17 ** USART2_RX + PD, // PD 3 ** 18 ** USART1_TX + PD, // PD 2 ** 19 ** USART1_RX + PD, // PD 1 ** 20 ** I2C_SDA + PD, // PD 0 ** 21 ** I2C_SCL + PA, // PA 0 ** 22 ** D22 + PA, // PA 1 ** 23 ** D23 + PA, // PA 2 ** 24 ** D24 + PA, // PA 3 ** 25 ** D25 + PA, // PA 4 ** 26 ** D26 + PA, // PA 5 ** 27 ** D27 + PA, // PA 6 ** 28 ** D28 + PA, // PA 7 ** 29 ** D29 + PC, // PC 7 ** 30 ** D30 + PC, // PC 6 ** 31 ** D31 + PC, // PC 5 ** 32 ** D32 + PC, // PC 4 ** 33 ** D33 + PC, // PC 3 ** 34 ** D34 + PC, // PC 2 ** 35 ** D35 + PC, // PC 1 ** 36 ** D36 + PC, // PC 0 ** 37 ** D37 + PD, // PD 7 ** 38 ** D38 + PG, // PG 2 ** 39 ** D39 + PG, // PG 1 ** 40 ** D40 + PG, // PG 0 ** 41 ** D41 + PL, // PL 7 ** 42 ** D42 + PL, // PL 6 ** 43 ** D43 + PL, // PL 5 ** 44 ** D44 + PL, // PL 4 ** 45 ** D45 + PL, // PL 3 ** 46 ** D46 + PL, // PL 2 ** 47 ** D47 + PL, // PL 1 ** 48 ** D48 + PL, // PL 0 ** 49 ** D49 + PB, // PB 3 ** 50 ** SPI_MISO + PB, // PB 2 ** 51 ** SPI_MOSI + PB, // PB 1 ** 52 ** SPI_SCK + PB, // PB 0 ** 53 ** SPI_SS + PF, // PF 0 ** 54 ** A0 + PF, // PF 1 ** 55 ** A1 + PF, // PF 2 ** 56 ** A2 + PF, // PF 3 ** 57 ** A3 + PF, // PF 4 ** 58 ** A4 + PF, // PF 5 ** 59 ** A5 + PF, // PF 6 ** 60 ** A6 + PF, // PF 7 ** 61 ** A7 + PK, // PK 0 ** 62 ** A8 + PK, // PK 1 ** 63 ** A9 + PK, // PK 2 ** 64 ** A10 + PK, // PK 3 ** 65 ** A11 + PK, // PK 4 ** 66 ** A12 + PK, // PK 5 ** 67 ** A13 + PK, // PK 6 ** 68 ** A14 + PK, // PK 7 ** 69 ** A15 + PG, // PG 4 ** 70 ** + PG, // PG 3 ** 71 ** + PJ, // PJ 2 ** 72 ** + PJ, // PJ 3 ** 73 ** + PJ, // PJ 7 ** 74 ** + PJ, // PJ 4 ** 75 ** + PJ, // PJ 5 ** 76 ** + PJ, // PJ 6 ** 77 ** + PE, // PE 2 ** 78 ** + PE, // PE 6 ** 79 ** + PE, // PE 7 ** 80 ** + PD, // PD 4 ** 81 ** + PD, // PD 5 ** 82 ** + PD, // PD 6 ** 83 ** + PH, // PH 2 ** 84 ** + PH, // PH 7 ** 85 ** }; #define digitalPinToPort_plus_70(P) ( pgm_read_byte( digital_pin_to_port_PGM_plus_70 + (P) ) ) @@ -141,92 +141,92 @@ const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = { const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = { // PIN IN PORT // ------------------------ - _BV( 0 ) , // PE 0 ** 0 ** USART0_RX - _BV( 1 ) , // PE 1 ** 1 ** USART0_TX - _BV( 4 ) , // PE 4 ** 2 ** PWM2 - _BV( 5 ) , // PE 5 ** 3 ** PWM3 - _BV( 5 ) , // PG 5 ** 4 ** PWM4 - _BV( 3 ) , // PE 3 ** 5 ** PWM5 - _BV( 3 ) , // PH 3 ** 6 ** PWM6 - _BV( 4 ) , // PH 4 ** 7 ** PWM7 - _BV( 5 ) , // PH 5 ** 8 ** PWM8 - _BV( 6 ) , // PH 6 ** 9 ** PWM9 - _BV( 4 ) , // PB 4 ** 10 ** PWM10 - _BV( 5 ) , // PB 5 ** 11 ** PWM11 - _BV( 6 ) , // PB 6 ** 12 ** PWM12 - _BV( 7 ) , // PB 7 ** 13 ** PWM13 - _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX - _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX - _BV( 1 ) , // PH 1 ** 16 ** USART2_TX - _BV( 0 ) , // PH 0 ** 17 ** USART2_RX - _BV( 3 ) , // PD 3 ** 18 ** USART1_TX - _BV( 2 ) , // PD 2 ** 19 ** USART1_RX - _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA - _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL - _BV( 0 ) , // PA 0 ** 22 ** D22 - _BV( 1 ) , // PA 1 ** 23 ** D23 - _BV( 2 ) , // PA 2 ** 24 ** D24 - _BV( 3 ) , // PA 3 ** 25 ** D25 - _BV( 4 ) , // PA 4 ** 26 ** D26 - _BV( 5 ) , // PA 5 ** 27 ** D27 - _BV( 6 ) , // PA 6 ** 28 ** D28 - _BV( 7 ) , // PA 7 ** 29 ** D29 - _BV( 7 ) , // PC 7 ** 30 ** D30 - _BV( 6 ) , // PC 6 ** 31 ** D31 - _BV( 5 ) , // PC 5 ** 32 ** D32 - _BV( 4 ) , // PC 4 ** 33 ** D33 - _BV( 3 ) , // PC 3 ** 34 ** D34 - _BV( 2 ) , // PC 2 ** 35 ** D35 - _BV( 1 ) , // PC 1 ** 36 ** D36 - _BV( 0 ) , // PC 0 ** 37 ** D37 - _BV( 7 ) , // PD 7 ** 38 ** D38 - _BV( 2 ) , // PG 2 ** 39 ** D39 - _BV( 1 ) , // PG 1 ** 40 ** D40 - _BV( 0 ) , // PG 0 ** 41 ** D41 - _BV( 7 ) , // PL 7 ** 42 ** D42 - _BV( 6 ) , // PL 6 ** 43 ** D43 - _BV( 5 ) , // PL 5 ** 44 ** D44 - _BV( 4 ) , // PL 4 ** 45 ** D45 - _BV( 3 ) , // PL 3 ** 46 ** D46 - _BV( 2 ) , // PL 2 ** 47 ** D47 - _BV( 1 ) , // PL 1 ** 48 ** D48 - _BV( 0 ) , // PL 0 ** 49 ** D49 - _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO - _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI - _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK - _BV( 0 ) , // PB 0 ** 53 ** SPI_SS - _BV( 0 ) , // PF 0 ** 54 ** A0 - _BV( 1 ) , // PF 1 ** 55 ** A1 - _BV( 2 ) , // PF 2 ** 56 ** A2 - _BV( 3 ) , // PF 3 ** 57 ** A3 - _BV( 4 ) , // PF 4 ** 58 ** A4 - _BV( 5 ) , // PF 5 ** 59 ** A5 - _BV( 6 ) , // PF 6 ** 60 ** A6 - _BV( 7 ) , // PF 7 ** 61 ** A7 - _BV( 0 ) , // PK 0 ** 62 ** A8 - _BV( 1 ) , // PK 1 ** 63 ** A9 - _BV( 2 ) , // PK 2 ** 64 ** A10 - _BV( 3 ) , // PK 3 ** 65 ** A11 - _BV( 4 ) , // PK 4 ** 66 ** A12 - _BV( 5 ) , // PK 5 ** 67 ** A13 - _BV( 6 ) , // PK 6 ** 68 ** A14 - _BV( 7 ) , // PK 7 ** 69 ** A15 - _BV( 4 ) , // PG 4 ** 70 ** - _BV( 3 ) , // PG 3 ** 71 ** - _BV( 2 ) , // PJ 2 ** 72 ** - _BV( 3 ) , // PJ 3 ** 73 ** - _BV( 7 ) , // PJ 7 ** 74 ** - _BV( 4 ) , // PJ 4 ** 75 ** - _BV( 5 ) , // PJ 5 ** 76 ** - _BV( 6 ) , // PJ 6 ** 77 ** - _BV( 2 ) , // PE 2 ** 78 ** - _BV( 6 ) , // PE 6 ** 79 ** - _BV( 7 ) , // PE 7 ** 80 ** - _BV( 4 ) , // PD 4 ** 81 ** - _BV( 5 ) , // PD 5 ** 82 ** - _BV( 6 ) , // PD 6 ** 83 ** - _BV( 2 ) , // PH 2 ** 84 ** - _BV( 7 ) , // PH 7 ** 85 ** + _BV( 0 ), // PE 0 ** 0 ** USART0_RX + _BV( 1 ), // PE 1 ** 1 ** USART0_TX + _BV( 4 ), // PE 4 ** 2 ** PWM2 + _BV( 5 ), // PE 5 ** 3 ** PWM3 + _BV( 5 ), // PG 5 ** 4 ** PWM4 + _BV( 3 ), // PE 3 ** 5 ** PWM5 + _BV( 3 ), // PH 3 ** 6 ** PWM6 + _BV( 4 ), // PH 4 ** 7 ** PWM7 + _BV( 5 ), // PH 5 ** 8 ** PWM8 + _BV( 6 ), // PH 6 ** 9 ** PWM9 + _BV( 4 ), // PB 4 ** 10 ** PWM10 + _BV( 5 ), // PB 5 ** 11 ** PWM11 + _BV( 6 ), // PB 6 ** 12 ** PWM12 + _BV( 7 ), // PB 7 ** 13 ** PWM13 + _BV( 1 ), // PJ 1 ** 14 ** USART3_TX + _BV( 0 ), // PJ 0 ** 15 ** USART3_RX + _BV( 1 ), // PH 1 ** 16 ** USART2_TX + _BV( 0 ), // PH 0 ** 17 ** USART2_RX + _BV( 3 ), // PD 3 ** 18 ** USART1_TX + _BV( 2 ), // PD 2 ** 19 ** USART1_RX + _BV( 1 ), // PD 1 ** 20 ** I2C_SDA + _BV( 0 ), // PD 0 ** 21 ** I2C_SCL + _BV( 0 ), // PA 0 ** 22 ** D22 + _BV( 1 ), // PA 1 ** 23 ** D23 + _BV( 2 ), // PA 2 ** 24 ** D24 + _BV( 3 ), // PA 3 ** 25 ** D25 + _BV( 4 ), // PA 4 ** 26 ** D26 + _BV( 5 ), // PA 5 ** 27 ** D27 + _BV( 6 ), // PA 6 ** 28 ** D28 + _BV( 7 ), // PA 7 ** 29 ** D29 + _BV( 7 ), // PC 7 ** 30 ** D30 + _BV( 6 ), // PC 6 ** 31 ** D31 + _BV( 5 ), // PC 5 ** 32 ** D32 + _BV( 4 ), // PC 4 ** 33 ** D33 + _BV( 3 ), // PC 3 ** 34 ** D34 + _BV( 2 ), // PC 2 ** 35 ** D35 + _BV( 1 ), // PC 1 ** 36 ** D36 + _BV( 0 ), // PC 0 ** 37 ** D37 + _BV( 7 ), // PD 7 ** 38 ** D38 + _BV( 2 ), // PG 2 ** 39 ** D39 + _BV( 1 ), // PG 1 ** 40 ** D40 + _BV( 0 ), // PG 0 ** 41 ** D41 + _BV( 7 ), // PL 7 ** 42 ** D42 + _BV( 6 ), // PL 6 ** 43 ** D43 + _BV( 5 ), // PL 5 ** 44 ** D44 + _BV( 4 ), // PL 4 ** 45 ** D45 + _BV( 3 ), // PL 3 ** 46 ** D46 + _BV( 2 ), // PL 2 ** 47 ** D47 + _BV( 1 ), // PL 1 ** 48 ** D48 + _BV( 0 ), // PL 0 ** 49 ** D49 + _BV( 3 ), // PB 3 ** 50 ** SPI_MISO + _BV( 2 ), // PB 2 ** 51 ** SPI_MOSI + _BV( 1 ), // PB 1 ** 52 ** SPI_SCK + _BV( 0 ), // PB 0 ** 53 ** SPI_SS + _BV( 0 ), // PF 0 ** 54 ** A0 + _BV( 1 ), // PF 1 ** 55 ** A1 + _BV( 2 ), // PF 2 ** 56 ** A2 + _BV( 3 ), // PF 3 ** 57 ** A3 + _BV( 4 ), // PF 4 ** 58 ** A4 + _BV( 5 ), // PF 5 ** 59 ** A5 + _BV( 6 ), // PF 6 ** 60 ** A6 + _BV( 7 ), // PF 7 ** 61 ** A7 + _BV( 0 ), // PK 0 ** 62 ** A8 + _BV( 1 ), // PK 1 ** 63 ** A9 + _BV( 2 ), // PK 2 ** 64 ** A10 + _BV( 3 ), // PK 3 ** 65 ** A11 + _BV( 4 ), // PK 4 ** 66 ** A12 + _BV( 5 ), // PK 5 ** 67 ** A13 + _BV( 6 ), // PK 6 ** 68 ** A14 + _BV( 7 ), // PK 7 ** 69 ** A15 + _BV( 4 ), // PG 4 ** 70 ** + _BV( 3 ), // PG 3 ** 71 ** + _BV( 2 ), // PJ 2 ** 72 ** + _BV( 3 ), // PJ 3 ** 73 ** + _BV( 7 ), // PJ 7 ** 74 ** + _BV( 4 ), // PJ 4 ** 75 ** + _BV( 5 ), // PJ 5 ** 76 ** + _BV( 6 ), // PJ 6 ** 77 ** + _BV( 2 ), // PE 2 ** 78 ** + _BV( 6 ), // PE 6 ** 79 ** + _BV( 7 ), // PE 7 ** 80 ** + _BV( 4 ), // PD 4 ** 81 ** + _BV( 5 ), // PD 5 ** 82 ** + _BV( 6 ), // PD 6 ** 83 ** + _BV( 2 ), // PH 2 ** 84 ** + _BV( 7 ), // PH 7 ** 85 ** }; #define digitalPinToBitMask_plus_70(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM_plus_70 + (P) ) ) @@ -234,86 +234,86 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = { const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = { // TIMERS // ------------------------ - NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX - NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX - TIMER3B , // PE 4 ** 2 ** PWM2 - TIMER3C , // PE 5 ** 3 ** PWM3 - TIMER0B , // PG 5 ** 4 ** PWM4 - TIMER3A , // PE 3 ** 5 ** PWM5 - TIMER4A , // PH 3 ** 6 ** PWM6 - TIMER4B , // PH 4 ** 7 ** PWM7 - TIMER4C , // PH 5 ** 8 ** PWM8 - TIMER2B , // PH 6 ** 9 ** PWM9 - TIMER2A , // PB 4 ** 10 ** PWM10 - TIMER1A , // PB 5 ** 11 ** PWM11 - TIMER1B , // PB 6 ** 12 ** PWM12 - TIMER0A , // PB 7 ** 13 ** PWM13 - NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX - NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX - NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX - NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX - NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX - NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX - NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA - NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL - NOT_ON_TIMER , // PA 0 ** 22 ** D22 - NOT_ON_TIMER , // PA 1 ** 23 ** D23 - NOT_ON_TIMER , // PA 2 ** 24 ** D24 - NOT_ON_TIMER , // PA 3 ** 25 ** D25 - NOT_ON_TIMER , // PA 4 ** 26 ** D26 - NOT_ON_TIMER , // PA 5 ** 27 ** D27 - NOT_ON_TIMER , // PA 6 ** 28 ** D28 - NOT_ON_TIMER , // PA 7 ** 29 ** D29 - NOT_ON_TIMER , // PC 7 ** 30 ** D30 - NOT_ON_TIMER , // PC 6 ** 31 ** D31 - NOT_ON_TIMER , // PC 5 ** 32 ** D32 - NOT_ON_TIMER , // PC 4 ** 33 ** D33 - NOT_ON_TIMER , // PC 3 ** 34 ** D34 - NOT_ON_TIMER , // PC 2 ** 35 ** D35 - NOT_ON_TIMER , // PC 1 ** 36 ** D36 - NOT_ON_TIMER , // PC 0 ** 37 ** D37 - NOT_ON_TIMER , // PD 7 ** 38 ** D38 - NOT_ON_TIMER , // PG 2 ** 39 ** D39 - NOT_ON_TIMER , // PG 1 ** 40 ** D40 - NOT_ON_TIMER , // PG 0 ** 41 ** D41 - NOT_ON_TIMER , // PL 7 ** 42 ** D42 - NOT_ON_TIMER , // PL 6 ** 43 ** D43 - TIMER5C , // PL 5 ** 44 ** D44 - TIMER5B , // PL 4 ** 45 ** D45 - TIMER5A , // PL 3 ** 46 ** D46 - NOT_ON_TIMER , // PL 2 ** 47 ** D47 - NOT_ON_TIMER , // PL 1 ** 48 ** D48 - NOT_ON_TIMER , // PL 0 ** 49 ** D49 - NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO - NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI - NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK - NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS - NOT_ON_TIMER , // PF 0 ** 54 ** A0 - NOT_ON_TIMER , // PF 1 ** 55 ** A1 - NOT_ON_TIMER , // PF 2 ** 56 ** A2 - NOT_ON_TIMER , // PF 3 ** 57 ** A3 - NOT_ON_TIMER , // PF 4 ** 58 ** A4 - NOT_ON_TIMER , // PF 5 ** 59 ** A5 - NOT_ON_TIMER , // PF 6 ** 60 ** A6 - NOT_ON_TIMER , // PF 7 ** 61 ** A7 - NOT_ON_TIMER , // PK 0 ** 62 ** A8 - NOT_ON_TIMER , // PK 1 ** 63 ** A9 - NOT_ON_TIMER , // PK 2 ** 64 ** A10 - NOT_ON_TIMER , // PK 3 ** 65 ** A11 - NOT_ON_TIMER , // PK 4 ** 66 ** A12 - NOT_ON_TIMER , // PK 5 ** 67 ** A13 - NOT_ON_TIMER , // PK 6 ** 68 ** A14 - NOT_ON_TIMER , // PK 7 ** 69 ** A15 - NOT_ON_TIMER , // PG 4 ** 70 ** - NOT_ON_TIMER , // PG 3 ** 71 ** - NOT_ON_TIMER , // PJ 2 ** 72 ** - NOT_ON_TIMER , // PJ 3 ** 73 ** - NOT_ON_TIMER , // PJ 7 ** 74 ** - NOT_ON_TIMER , // PJ 4 ** 75 ** - NOT_ON_TIMER , // PJ 5 ** 76 ** - NOT_ON_TIMER , // PJ 6 ** 77 ** - NOT_ON_TIMER , // PE 2 ** 78 ** - NOT_ON_TIMER , // PE 6 ** 79 ** + NOT_ON_TIMER, // PE 0 ** 0 ** USART0_RX + NOT_ON_TIMER, // PE 1 ** 1 ** USART0_TX + TIMER3B, // PE 4 ** 2 ** PWM2 + TIMER3C, // PE 5 ** 3 ** PWM3 + TIMER0B, // PG 5 ** 4 ** PWM4 + TIMER3A, // PE 3 ** 5 ** PWM5 + TIMER4A, // PH 3 ** 6 ** PWM6 + TIMER4B, // PH 4 ** 7 ** PWM7 + TIMER4C, // PH 5 ** 8 ** PWM8 + TIMER2B, // PH 6 ** 9 ** PWM9 + TIMER2A, // PB 4 ** 10 ** PWM10 + TIMER1A, // PB 5 ** 11 ** PWM11 + TIMER1B, // PB 6 ** 12 ** PWM12 + TIMER0A, // PB 7 ** 13 ** PWM13 + NOT_ON_TIMER, // PJ 1 ** 14 ** USART3_TX + NOT_ON_TIMER, // PJ 0 ** 15 ** USART3_RX + NOT_ON_TIMER, // PH 1 ** 16 ** USART2_TX + NOT_ON_TIMER, // PH 0 ** 17 ** USART2_RX + NOT_ON_TIMER, // PD 3 ** 18 ** USART1_TX + NOT_ON_TIMER, // PD 2 ** 19 ** USART1_RX + NOT_ON_TIMER, // PD 1 ** 20 ** I2C_SDA + NOT_ON_TIMER, // PD 0 ** 21 ** I2C_SCL + NOT_ON_TIMER, // PA 0 ** 22 ** D22 + NOT_ON_TIMER, // PA 1 ** 23 ** D23 + NOT_ON_TIMER, // PA 2 ** 24 ** D24 + NOT_ON_TIMER, // PA 3 ** 25 ** D25 + NOT_ON_TIMER, // PA 4 ** 26 ** D26 + NOT_ON_TIMER, // PA 5 ** 27 ** D27 + NOT_ON_TIMER, // PA 6 ** 28 ** D28 + NOT_ON_TIMER, // PA 7 ** 29 ** D29 + NOT_ON_TIMER, // PC 7 ** 30 ** D30 + NOT_ON_TIMER, // PC 6 ** 31 ** D31 + NOT_ON_TIMER, // PC 5 ** 32 ** D32 + NOT_ON_TIMER, // PC 4 ** 33 ** D33 + NOT_ON_TIMER, // PC 3 ** 34 ** D34 + NOT_ON_TIMER, // PC 2 ** 35 ** D35 + NOT_ON_TIMER, // PC 1 ** 36 ** D36 + NOT_ON_TIMER, // PC 0 ** 37 ** D37 + NOT_ON_TIMER, // PD 7 ** 38 ** D38 + NOT_ON_TIMER, // PG 2 ** 39 ** D39 + NOT_ON_TIMER, // PG 1 ** 40 ** D40 + NOT_ON_TIMER, // PG 0 ** 41 ** D41 + NOT_ON_TIMER, // PL 7 ** 42 ** D42 + NOT_ON_TIMER, // PL 6 ** 43 ** D43 + TIMER5C, // PL 5 ** 44 ** D44 + TIMER5B, // PL 4 ** 45 ** D45 + TIMER5A, // PL 3 ** 46 ** D46 + NOT_ON_TIMER, // PL 2 ** 47 ** D47 + NOT_ON_TIMER, // PL 1 ** 48 ** D48 + NOT_ON_TIMER, // PL 0 ** 49 ** D49 + NOT_ON_TIMER, // PB 3 ** 50 ** SPI_MISO + NOT_ON_TIMER, // PB 2 ** 51 ** SPI_MOSI + NOT_ON_TIMER, // PB 1 ** 52 ** SPI_SCK + NOT_ON_TIMER, // PB 0 ** 53 ** SPI_SS + NOT_ON_TIMER, // PF 0 ** 54 ** A0 + NOT_ON_TIMER, // PF 1 ** 55 ** A1 + NOT_ON_TIMER, // PF 2 ** 56 ** A2 + NOT_ON_TIMER, // PF 3 ** 57 ** A3 + NOT_ON_TIMER, // PF 4 ** 58 ** A4 + NOT_ON_TIMER, // PF 5 ** 59 ** A5 + NOT_ON_TIMER, // PF 6 ** 60 ** A6 + NOT_ON_TIMER, // PF 7 ** 61 ** A7 + NOT_ON_TIMER, // PK 0 ** 62 ** A8 + NOT_ON_TIMER, // PK 1 ** 63 ** A9 + NOT_ON_TIMER, // PK 2 ** 64 ** A10 + NOT_ON_TIMER, // PK 3 ** 65 ** A11 + NOT_ON_TIMER, // PK 4 ** 66 ** A12 + NOT_ON_TIMER, // PK 5 ** 67 ** A13 + NOT_ON_TIMER, // PK 6 ** 68 ** A14 + NOT_ON_TIMER, // PK 7 ** 69 ** A15 + NOT_ON_TIMER, // PG 4 ** 70 ** + NOT_ON_TIMER, // PG 3 ** 71 ** + NOT_ON_TIMER, // PJ 2 ** 72 ** + NOT_ON_TIMER, // PJ 3 ** 73 ** + NOT_ON_TIMER, // PJ 7 ** 74 ** + NOT_ON_TIMER, // PJ 4 ** 75 ** + NOT_ON_TIMER, // PJ 5 ** 76 ** + NOT_ON_TIMER, // PJ 6 ** 77 ** + NOT_ON_TIMER, // PE 2 ** 78 ** + NOT_ON_TIMER, // PE 6 ** 79 ** }; #define digitalPinToTimer_plus_70(P) ( pgm_read_byte( digital_pin_to_timer_PGM_plus_70 + (P) ) ) diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp index 5bbc4223bb..e44549357e 100644 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -208,8 +208,8 @@ A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */ - : [bin]"+r"(bin), - [work]"+r"(work) + : [bin]"+r"( bin ), + [work]"+r"( work ) : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), [sck_mask]"r"( SCK_MASK ), [sck_port]"r"( SCK_PORT_PLUS30 ) @@ -350,7 +350,7 @@ static void spiRxBlock0(uint8_t *ptr, uint32_t todo) { uint32_t bin = 0; uint32_t work = 0; - uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */ + uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS(((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */ uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */ uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN); @@ -412,10 +412,10 @@ A("strb.w %[bin], [%[ptr]], #1") /* Store read value into buffer, increment buffer pointer */ A("bne.n loop%=") /* Repeat until done */ - : [ptr]"+r"(ptr), - [todo]"+r"(todo), - [bin]"+r"(bin), - [work]"+r"(work) + : [ptr]"+r"( ptr ), + [todo]"+r"( todo ), + [bin]"+r"( bin ), + [work]"+r"( work ) : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), [sck_mask]"r"( SCK_MASK ), [sck_port]"r"( SCK_PORT_PLUS30 ) diff --git a/Marlin/src/HAL/RP2040/timers.h b/Marlin/src/HAL/RP2040/timers.h index 83fdc0a2fc..512c6ba465 100644 --- a/Marlin/src/HAL/RP2040/timers.h +++ b/Marlin/src/HAL/RP2040/timers.h @@ -131,19 +131,19 @@ FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, hal_time switch (timer_num) { case 0: - alarm_pool_add_alarm_in_us(HAL_timer_pool_0 ,compare , HAL_timer_alarm_pool_0_callback ,0 ,false ); + alarm_pool_add_alarm_in_us(HAL_timer_pool_0, compare, HAL_timer_alarm_pool_0_callback, 0, false); break; case 1: - alarm_pool_add_alarm_in_us(HAL_timer_pool_1 ,compare , HAL_timer_alarm_pool_1_callback ,0 ,false ); + alarm_pool_add_alarm_in_us(HAL_timer_pool_1, compare, HAL_timer_alarm_pool_1_callback, 0, false); break; case 2: - alarm_pool_add_alarm_in_us(HAL_timer_pool_2 ,compare , HAL_timer_alarm_pool_2_callback ,0 ,false ); + alarm_pool_add_alarm_in_us(HAL_timer_pool_2, compare, HAL_timer_alarm_pool_2_callback, 0, false); break; case 3: - alarm_pool_add_alarm_in_us(HAL_timer_pool_3 ,compare , HAL_timer_alarm_pool_3_callback ,0 ,false ); + alarm_pool_add_alarm_in_us(HAL_timer_pool_3, compare, HAL_timer_alarm_pool_3_callback, 0, false); break; } } diff --git a/Marlin/src/HAL/STM32F1/HAL_N32.h b/Marlin/src/HAL/STM32F1/HAL_N32.h index 7162e2b971..8b47ef4b96 100644 --- a/Marlin/src/HAL/STM32F1/HAL_N32.h +++ b/Marlin/src/HAL/STM32F1/HAL_N32.h @@ -239,8 +239,8 @@ typedef struct { #define ADC_WORKMODE_SLOW_INTERL ((uint32_t)0x00080000) #define ADC_WORKMODE_ALTER_TRIG ((uint32_t)0x00090000) -#define ADC_EXT_TRIGCONV_T1_CC3 ((uint32_t)0x00040000) //!< For ADC1, ADC2 , ADC3 and ADC4 -#define ADC_EXT_TRIGCONV_NONE ((uint32_t)0x000E0000) //!< For ADC1, ADC2 , ADC3 and ADC4 +#define ADC_EXT_TRIGCONV_T1_CC3 ((uint32_t)0x00040000) //!< For ADC1, ADC2, ADC3, and ADC4 +#define ADC_EXT_TRIGCONV_NONE ((uint32_t)0x000E0000) //!< For ADC1, ADC2, ADC3, and ADC4 #define ADC_DAT_ALIGN_R ((uint32_t)0x00000000) #define ADC_DAT_ALIGN_L ((uint32_t)0x00000800) @@ -603,9 +603,9 @@ typedef struct { #define DMA_CHCFG7_PINC ((uint16_t)0x0040) //!< Peripheral increment mode #define DMA_CHCFG7_MINC ((uint16_t)0x0080) //!< Memory increment mode -#define DMA_CHCFG7_PSIZE , ((uint16_t)0x0300) //!< PSIZE[1:0] bits (Peripheral size) -#define DMA_CHCFG7_PSIZE_0 ((uint16_t)0x0100) //!< Bit 0 -#define DMA_CHCFG7_PSIZE_1 ((uint16_t)0x0200) //!< Bit 1 +#define DMA_CHCFG7_PSIZE ((uint16_t)0x0300) //!< PSIZE[1:0] bits (Peripheral size) +#define DMA_CHCFG7_PSIZE_0 ((uint16_t)0x0100) //!< Bit 0 +#define DMA_CHCFG7_PSIZE_1 ((uint16_t)0x0200) //!< Bit 1 #define DMA_CHCFG7_MSIZE ((uint16_t)0x0C00) //!< MSIZE[1:0] bits (Memory size) #define DMA_CHCFG7_MSIZE_0 ((uint16_t)0x0400) //!< Bit 0 @@ -627,9 +627,9 @@ typedef struct { #define DMA_CHCFG8_PINC ((uint16_t)0x0040) //!< Peripheral increment mode #define DMA_CHCFG8_MINC ((uint16_t)0x0080) //!< Memory increment mode -#define DMA_CHCFG8_PSIZE , ((uint16_t)0x0300) //!< PSIZE[1:0] bits (Peripheral size) -#define DMA_CHCFG8_PSIZE_0 ((uint16_t)0x0100) //!< Bit 0 -#define DMA_CHCFG8_PSIZE_1 ((uint16_t)0x0200) //!< Bit 1 +#define DMA_CHCFG8_PSIZE ((uint16_t)0x0300) //!< PSIZE[1:0] bits (Peripheral size) +#define DMA_CHCFG8_PSIZE_0 ((uint16_t)0x0100) //!< Bit 0 +#define DMA_CHCFG8_PSIZE_1 ((uint16_t)0x0200) //!< Bit 1 #define DMA_CHCFG8_MSIZE ((uint16_t)0x0C00) //!< MSIZE[1:0] bits (Memory size) #define DMA_CHCFG8_MSIZE_0 ((uint16_t)0x0400) //!< Bit 0 diff --git a/Marlin/src/HAL/STM32F1/sdio.cpp b/Marlin/src/HAL/STM32F1/sdio.cpp index 5bb1ddb6c5..258422eba3 100644 --- a/Marlin/src/HAL/STM32F1/sdio.cpp +++ b/Marlin/src/HAL/STM32F1/sdio.cpp @@ -219,7 +219,7 @@ bool SDIO_CmdAppSetBusWidth(uint32_t rsa, uint32_t argument) { bool SDIO_CmdAppOperCommand(uint32_t sdType) { if (!SDIO_CmdAppCommand(0)) return false; - SDIO_SendCommand(ACMD41_SD_APP_OP_COND , SDMMC_VOLTAGE_WINDOW_SD | sdType); + SDIO_SendCommand(ACMD41_SD_APP_OP_COND, SDMMC_VOLTAGE_WINDOW_SD | sdType); return SDIO_GetCmdResp3(); } diff --git a/Marlin/src/HAL/TEENSY31_32/fastio.h b/Marlin/src/HAL/TEENSY31_32/fastio.h index 622799ec8c..b582c7bfec 100644 --- a/Marlin/src/HAL/TEENSY31_32/fastio.h +++ b/Marlin/src/HAL/TEENSY31_32/fastio.h @@ -53,17 +53,17 @@ #define _SET_INPUT(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1); \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 0; \ }while(0) #define _SET_OUTPUT(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE|PORT_PCR_DSE; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 1; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 1; \ }while(0) #define _SET_INPUT_PULLUP(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 0; \ }while(0) #define _IS_INPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) diff --git a/Marlin/src/HAL/TEENSY35_36/fastio.h b/Marlin/src/HAL/TEENSY35_36/fastio.h index 622799ec8c..b582c7bfec 100644 --- a/Marlin/src/HAL/TEENSY35_36/fastio.h +++ b/Marlin/src/HAL/TEENSY35_36/fastio.h @@ -53,17 +53,17 @@ #define _SET_INPUT(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1); \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 0; \ }while(0) #define _SET_OUTPUT(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE|PORT_PCR_DSE; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 1; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 1; \ }while(0) #define _SET_INPUT_PULLUP(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 0; \ }while(0) #define _IS_INPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index a2f49417b7..a8700f3d23 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -220,7 +220,7 @@ struct SerialBase { // On non 2-complement CPU, there would be no possible representation for 2147483648. write('-'); } - printNumber_unsigned((uint_fixed_print_t)n , base); + printNumber_unsigned((uint_fixed_print_t)n, base); } // Print a decimal number diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index 395dc430f5..0de49771ee 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -892,8 +892,8 @@ struct XYZEval { // Absolute difference between two objects FI constexpr XYZEval diff(const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(_ABS(e - rs.e)), T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); } - FI constexpr XYZEval diff(const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(0 , T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); } - FI constexpr XYZEval diff(const XYval &rs) const { return LOGICAL_AXIS_ARRAY(0 , T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), z, i, j, k, u, v, w ); } + FI constexpr XYZEval diff(const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(0, T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); } + FI constexpr XYZEval diff(const XYval &rs) const { return LOGICAL_AXIS_ARRAY(0, T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), z, i, j, k, u, v, w ); } // Modifier operators FI XYZEval& operator+=(const XYval &rs) { XY_CODE(x += rs.x, y += rs.y); return *this; } diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index b08cb812f8..84ecc3a6c7 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -70,7 +70,7 @@ private: static void move_z_with_encoder(const_float_t multiplier); static float measure_point_with_encoder(); static float measure_business_card_thickness(); - static void manually_probe_remaining_mesh(const xy_pos_t&, const_float_t , const_float_t , const bool) __O0; + static void manually_probe_remaining_mesh(const xy_pos_t&, const_float_t, const_float_t, const bool) __O0; static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) __O0; #endif diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index 535ed48039..63071f6113 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -44,7 +44,7 @@ static void config_line(PGM_P const name, const float val, PGM_P const pref=null SERIAL_ECHOLN(val); } static void config_line(FSTR_P const name, const float val, FSTR_P const pref=nullptr, const int8_t ind=-1) { - config_line(FTOP(name), val, FTOP(pref) , ind); + config_line(FTOP(name), val, FTOP(pref), ind); } static void config_line_e(const int8_t e, PGM_P const name, const float val) { config_line(name, val, PSTR("Extr."), e + 1); diff --git a/Marlin/src/inc/Conditionals-2-LCD.h b/Marlin/src/inc/Conditionals-2-LCD.h index 2462231593..633cd2beb6 100644 --- a/Marlin/src/inc/Conditionals-2-LCD.h +++ b/Marlin/src/inc/Conditionals-2-LCD.h @@ -78,7 +78,7 @@ #define MKS_MINI_12864 #endif -// MKS_MINI_12864_V3 , BTT_MINI_12864 and BEEZ_MINI_12864 are nearly identical to FYSETC_MINI_12864_2_1 +// MKS_MINI_12864_V3, BTT_MINI_12864 and BEEZ_MINI_12864 are nearly identical to FYSETC_MINI_12864_2_1 #if ANY(MKS_MINI_12864_V3, BTT_MINI_12864, BEEZ_MINI_12864) #define FYSETC_MINI_12864_2_1 #endif diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index b9c637d722..5811ac11bb 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -427,7 +427,7 @@ private: v1 = -rmax; v2 = rmin; } - jyersDWIN.updateStatus(TS(GET_TEXT_F(MSG_COLORS_RED), ' ', p_float_t(v1, 3) , F("..0.."), p_float_t(v2, 3), ' ', GET_TEXT_F(MSG_COLORS_GREEN))); + jyersDWIN.updateStatus(TS(GET_TEXT_F(MSG_COLORS_RED), ' ', p_float_t(v1, 3), F("..0.."), p_float_t(v2, 3), ' ', GET_TEXT_F(MSG_COLORS_GREEN))); drawing_mesh = false; } @@ -3033,7 +3033,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_StepY, F("M48 Probe Test")); else { gcode.process_subcommands_now( - TS(F("G28O\nM48X") , p_float_t((X_BED_SIZE + X_MIN_POS) / 2.0f, 3), 'Y', p_float_t((Y_BED_SIZE + Y_MIN_POS) / 2.0f, 3), 'P', testcount) + TS(F("G28O\nM48X"), p_float_t((X_BED_SIZE + X_MIN_POS) / 2.0f, 3), 'Y', p_float_t((Y_BED_SIZE + Y_MIN_POS) / 2.0f, 3), 'P', testcount) ); } break; diff --git a/Marlin/src/lcd/e3v2/proui/menus.cpp b/Marlin/src/lcd/e3v2/proui/menus.cpp index 7edf32169d..0451944645 100644 --- a/Marlin/src/lcd/e3v2/proui/menus.cpp +++ b/Marlin/src/lcd/e3v2/proui/menus.cpp @@ -100,7 +100,7 @@ void toggleCheckboxLine(bool &checked) { } void drawMenuIntValue(uint16_t bcolor, const uint8_t line, uint8_t iNum, const int32_t value/*=0*/) { - DWINUI::drawSignedInt(hmiData.colorText, bcolor, iNum , VALX, MBASE(line) - 1, value); + DWINUI::drawSignedInt(hmiData.colorText, bcolor, iNum, VALX, MBASE(line) - 1, value); } void onDrawMenuItem(MenuItem* menuitem, int8_t line) { @@ -163,7 +163,7 @@ void DrawItemEdit(const bool selected) { switch (checkkey) { case ID_SetIntNoDraw: if (menuData.liveUpdate) menuData.liveUpdate(); break; case ID_SetInt: - case ID_SetPInt: DWINUI::drawSignedInt(hmiData.colorText, bcolor, iNum , VALX, MBASE(currentMenu->line()) - 1, menuData.value); break; + case ID_SetPInt: DWINUI::drawSignedInt(hmiData.colorText, bcolor, iNum, VALX, MBASE(currentMenu->line()) - 1, menuData.value); break; case ID_SetFloat: case ID_SetPFloat: DWINUI::drawSignedFloat(hmiData.colorText, bcolor, iNum, menuData.dp, VALX - 2 * DWINUI::fontWidth(), MBASE(currentMenu->line()), menuData.value / POW(10, menuData.dp)); break; default: break; diff --git a/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp index 9e38face6f..e6e8c88155 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp @@ -130,7 +130,7 @@ void ChironTFT::idleLoop() { void ChironTFT::printerKilled(FSTR_P const error, FSTR_P const component) { tftSendLn(AC_msg_kill_lcd); #if ACDEBUG(AC_MARLIN) - DEBUG_ECHOLNPGM("printerKilled()\nerror: ", error , "\ncomponent: ", component); + DEBUG_ECHOLNPGM("printerKilled()\nerror: ", error, "\ncomponent: ", component); #endif } @@ -875,7 +875,7 @@ void ChironTFT::panelProcess(uint8_t req) { const float currval = getMeshPoint(pos); setMeshPoint(pos, constrain(currval + Zshift, AC_LOWEST_MESHPOINT_VAL, 2)); #if ACDEBUG(AC_INFO) - DEBUG_ECHOLNPGM("Change mesh point X", x," Y",y ," from ", currval, " to ", getMeshPoint(pos) ); + DEBUG_ECHOLNPGM("Change mesh point X", x," Y", y," from ", currval, " to ", getMeshPoint(pos) ); #endif } const float currZOffset = getZOffset_mm(); diff --git a/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp b/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp index d23b10898e..696cfad684 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp +++ b/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp @@ -64,7 +64,7 @@ namespace Anycubic { DgusTFT::page25, DgusTFT::page26, DgusTFT::page27, DgusTFT::page28, DgusTFT::page29, DgusTFT::page30, DgusTFT::page31, DgusTFT::page32 #if HAS_LEVELING - , DgusTFT::page33 , DgusTFT::page34 + , DgusTFT::page33, DgusTFT::page34 #endif }; @@ -1108,7 +1108,7 @@ namespace Anycubic { */ } else if (0x82 == data_buf[0]) { - // send_cmd_to_pc(cmd ,start ); + // send_cmd_to_pc(cmd, start ); } } } diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp index 24e472be05..9ec98779c8 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp @@ -311,7 +311,7 @@ const struct VPMapping VPMap[] PROGMEM = { { DGUS_SCREEN_PID_E, VPList_PIDE0 }, { DGUS_SCREEN_PID_BED, VPList_PIDBED }, { DGUS_SCREEN_INFOS, VPList_Infos }, - { 0 , nullptr } // List is terminated with an nullptr as table entry. + { 0, nullptr } // List is terminated with an nullptr as table entry. }; const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h index 3bac9cf2c6..1ba2a25ea3 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h @@ -121,13 +121,13 @@ constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2130; // Power loss recovery constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; -// Fan Control Buttons , switch between "off" and "on" +// Fan Control Buttons, switch between "off" and "on" constexpr uint16_t VP_FAN0_CONTROL = 0x2200; constexpr uint16_t VP_FAN1_CONTROL = 0x2202; constexpr uint16_t VP_FAN2_CONTROL = 0x2204; constexpr uint16_t VP_FAN3_CONTROL = 0x2206; -// Heater Control Buttons , triged between "cool down" and "heat PLA" state +// Heater Control Buttons, triged between "cool down" and "heat PLA" state constexpr uint16_t VP_E0_CONTROL = 0x2210; constexpr uint16_t VP_E1_CONTROL = 0x2212; //constexpr uint16_t VP_E2_CONTROL = 0x2214; @@ -148,7 +148,7 @@ constexpr uint16_t VP_E1_BED_PREHEAT = 0x2222; constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2302; -// Settings store , reset +// Settings store, reset constexpr uint16_t VP_SETTINGS = 0x2400; // PID autotune @@ -258,7 +258,7 @@ constexpr uint16_t VP_BED_STATUS = 0x331C; constexpr uint16_t VP_MOVE_OPTION = 0x3400; // Step per mm -constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment, uint16_t, 0~1638.4 //constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; //constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; @@ -272,10 +272,10 @@ constexpr uint16_t VP_E1_STEP_PER_MM = 0x3612; //constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; // PIDs -constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_E0_PID_I = 0x3702; constexpr uint16_t VP_E0_PID_D = 0x3704; -constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_E1_PID_I = 0x3708; constexpr uint16_t VP_E1_PID_D = 0x370A; constexpr uint16_t VP_BED_PID_P = 0x3710; diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp index 79e0ccf942..db0ebbc903 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp @@ -308,7 +308,7 @@ const struct VPMapping VPMap[] PROGMEM = { { DGUS_SCREEN_PID_E, VPList_PIDE0 }, { DGUS_SCREEN_PID_BED, VPList_PIDBED }, { DGUS_SCREEN_INFOS, VPList_Infos }, - { 0 , nullptr } // List is terminated with an nullptr as table entry. + { 0, nullptr } // List is terminated with an nullptr as table entry. }; const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h index a5e0d327a4..f7a716f4d5 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h @@ -121,13 +121,13 @@ constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2130; // Power loss recovery constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; -// Fan Control Buttons , switch between "off" and "on" +// Fan Control Buttons, switch between "off" and "on" constexpr uint16_t VP_FAN0_CONTROL = 0x2200; constexpr uint16_t VP_FAN1_CONTROL = 0x2202; //constexpr uint16_t VP_FAN2_CONTROL = 0x2204; //constexpr uint16_t VP_FAN3_CONTROL = 0x2206; -// Heater Control Buttons , triged between "cool down" and "heat PLA" state +// Heater Control Buttons, triged between "cool down" and "heat PLA" state constexpr uint16_t VP_E0_CONTROL = 0x2210; constexpr uint16_t VP_E1_CONTROL = 0x2212; //constexpr uint16_t VP_E2_CONTROL = 0x2214; @@ -147,7 +147,7 @@ constexpr uint16_t VP_E0_BED_PREHEAT = 0x2220; // Filament load and unload constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; -// Settings store , reset +// Settings store, reset constexpr uint16_t VP_SETTINGS = 0x2400; // PID autotune @@ -257,7 +257,7 @@ constexpr uint16_t VP_BED_STATUS = 0x331C; constexpr uint16_t VP_MOVE_OPTION = 0x3400; // Step per mm -constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment, uint16_t, 0~1638.4 //constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; //constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; @@ -271,7 +271,7 @@ constexpr uint16_t VP_E0_STEP_PER_MM = 0x3610; //constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; // PIDs -constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_E0_PID_I = 0x3702; constexpr uint16_t VP_E0_PID_D = 0x3704; constexpr uint16_t VP_BED_PID_P = 0x3710; diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp index 4a67f78b8c..b108dab0a0 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp @@ -327,7 +327,7 @@ const uint16_t MKSList_MotionConfig[] PROGMEM = { const uint16_t MKSList_EX_Config[] PROGMEM = { INFO_BAR - VP_MIN_EX_T,VP_Min_EX_T_E, + VP_MIN_EX_T, VP_Min_EX_T_E, 0x0000 }; @@ -666,9 +666,9 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_SD_Print_LiveAdjustZ_Confirm, nullptr, screen.zOffsetConfirm, nullptr), - VPHELPER(VP_ZOffset_Distance,nullptr ,screen.getZoffsetDistance, nullptr), + VPHELPER(VP_ZOffset_Distance, nullptr, screen.getZoffsetDistance, nullptr), VPHELPER(VP_MESH_LEVEL_ADJUST, nullptr, screen.meshLevelDistanceConfig, nullptr), - VPHELPER(VP_MESH_LEVEL_POINT,nullptr, screen.meshLevel, nullptr), + VPHELPER(VP_MESH_LEVEL_POINT, nullptr, screen.meshLevel, nullptr), #if ENABLED(PREVENT_COLD_EXTRUSION) VPHELPER(VP_Min_EX_T_E, &thermalManager.extrude_min_temp, screen.getMinExtrudeTemp, screen.sendWordValueToDisplay), @@ -709,9 +709,9 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_ZOffset_DE_DIS, &z_offset_add, nullptr, screen.sendFloatAsLongValueToDisplay<2>), #endif #if HAS_BED_PROBE - VPHELPER(VP_OFFSET_X, &probe.offset.x, screen.getOffsetValue,screen.sendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_OFFSET_Y, &probe.offset.y, screen.getOffsetValue,screen.sendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_OFFSET_Z, &probe.offset.z, screen.getOffsetValue,screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_X, &probe.offset.x, screen.getOffsetValue, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_Y, &probe.offset.y, screen.getOffsetValue, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_Z, &probe.offset.z, screen.getOffsetValue, screen.sendFloatAsLongValueToDisplay<2>), #endif #else VPHELPER(VP_SD_FileSelected, nullptr, screen.printReturn, nullptr), diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h index a0e5b5d731..ba5508e441 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h @@ -301,7 +301,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_Y_HOME = 0x2338; constexpr uint16_t VP_Z_HOME = 0x233A; - // Fan Control Buttons , switch between "off" and "on" + // Fan Control Buttons, switch between "off" and "on" constexpr uint16_t VP_FAN0_CONTROL = 0x2350; constexpr uint16_t VP_FAN1_CONTROL = 0x2352; constexpr uint16_t VP_FAN2_CONTROL = 0x2354; @@ -350,7 +350,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_FAN3_STATUS = 0x2716; // Step per mm - constexpr uint16_t VP_X_STEP_PER_MM = 0x2900; // at the moment , uint16_t , 0~1638.4 + constexpr uint16_t VP_X_STEP_PER_MM = 0x2900; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_Y_STEP_PER_MM = 0x2904; constexpr uint16_t VP_Z_STEP_PER_MM = 0x2908; constexpr uint16_t VP_E0_STEP_PER_MM = 0x2910; @@ -450,10 +450,10 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_PrintTime_S = 0x3504; // PIDs - constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 + constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_E0_PID_I = 0x3702; constexpr uint16_t VP_E0_PID_D = 0x3704; - constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , uint16_t , 0~1638.4 + constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_E1_PID_I = 0x3708; constexpr uint16_t VP_E1_PID_D = 0x370A; constexpr uint16_t VP_BED_PID_P = 0x3710; @@ -482,7 +482,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_Z_PARK_POS = 0x3904; /* -------------------------------0x4000-0x4FFF------------------------------- */ - // Heater Control Buttons , triged between "cool down" and "heat PLA" state + // Heater Control Buttons, triged between "cool down" and "heat PLA" state constexpr uint16_t VP_E0_CONTROL = 0x4010; constexpr uint16_t VP_E1_CONTROL = 0x4012; constexpr uint16_t VP_BED_CONTROL = 0x401C; @@ -495,7 +495,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; //constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x4030; //constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x4032; - // Settings store , reset + // Settings store, reset // Level data constexpr uint16_t VP_Level_Point_One_X = 0x4100; diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp index ac408e8d9c..2cb7bd6f83 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp @@ -119,7 +119,7 @@ const struct VPMapping VPMap[] PROGMEM = { { DGUS_SCREEN_FLOWRATES, VPList_SD_FlowRates }, { DGUS_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, { DGUS_SCREEN_SDFILELIST, VPList_SDFileList }, - { 0 , nullptr } // List is terminated with an nullptr as table entry. + { 0, nullptr } // List is terminated with an nullptr as table entry. }; const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h index d34b90b45f..6b5b780283 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h @@ -116,13 +116,13 @@ constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2130; // Power loss recovery constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; -// Fan Control Buttons , switch between "off" and "on" +// Fan Control Buttons, switch between "off" and "on" constexpr uint16_t VP_FAN0_CONTROL = 0x2200; constexpr uint16_t VP_FAN1_CONTROL = 0x2202; //constexpr uint16_t VP_FAN2_CONTROL = 0x2204; //constexpr uint16_t VP_FAN3_CONTROL = 0x2206; -// Heater Control Buttons , triged between "cool down" and "heat PLA" state +// Heater Control Buttons, triged between "cool down" and "heat PLA" state constexpr uint16_t VP_E0_CONTROL = 0x2210; constexpr uint16_t VP_E1_CONTROL = 0x2212; //constexpr uint16_t VP_E2_CONTROL = 0x2214; @@ -143,7 +143,7 @@ constexpr uint16_t VP_E1_BED_CONTROL = 0x2222; constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2302; -// Settings store , reset +// Settings store, reset constexpr uint16_t VP_SETTINGS = 0x2400; // PID autotune @@ -247,7 +247,7 @@ constexpr uint16_t VP_BED_STATUS = 0x331C; constexpr uint16_t VP_MOVE_OPTION = 0x3400; // Step per mm -constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment, uint16_t, 0~1638.4 //constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; //constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; @@ -261,7 +261,7 @@ constexpr uint16_t VP_E0_STEP_PER_MM = 0x3610; //constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; // PIDs -constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_E0_PID_I = 0x3702; constexpr uint16_t VP_E0_PID_D = 0x3704; constexpr uint16_t VP_BED_PID_P = 0x3710; diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/font2cpp.py b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/font2cpp.py index 98a2420497..8d066d876a 100755 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/font2cpp.py +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/font2cpp.py @@ -56,7 +56,7 @@ class WriteSource: data.append(0) # Combine each two adjacent values into one i = iter(data) - data = list(map(lambda a, b: a << 4 | b, i ,i)) + data = list(map(lambda a, b: a << 4 | b, i, i)) # Pack the data data = pack_rle(data) # Convert values into hex strings diff --git a/Marlin/src/lcd/extui/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/mks_ui/tft_Language_en.h index 5195986e35..f012b17ea7 100644 --- a/Marlin/src/lcd/extui/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/mks_ui/tft_Language_en.h @@ -399,8 +399,8 @@ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN "Heat completed,please load filament \nto extruder,and click \nfor start loading." #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_EN "Please load filament to extruder,\nand click for start loading." #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_EN "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_EN "Is unloading,please wait!" +#define FILAMENT_DIALOG_LOADING_TIPS_EN "Is loading, please wait!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_EN "Is unloading, please wait!" #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN "Load filament completed,\nclick for return!" #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN "Unload filament completed,\nclick for return!" diff --git a/Marlin/src/lcd/extui/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/mks_ui/tft_Language_it.h index b74842afef..2be8f7d17b 100644 --- a/Marlin/src/lcd/extui/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/mks_ui/tft_Language_it.h @@ -149,8 +149,8 @@ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT "Heat completed,please load filament \nto extruder,and click \nfor start loading." #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_IT "Please load filament to extruder,\nand click for start loading." #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading,please wait!" +#define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading, please wait!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading, please wait!" #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,\nclick for return!" #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,\nclick for return!" diff --git a/Marlin/src/lcd/extui/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/mks_ui/tft_Language_ru.h index da36ed14c7..aced93f4b6 100644 --- a/Marlin/src/lcd/extui/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/mks_ui/tft_Language_ru.h @@ -148,8 +148,8 @@ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU "Heat completed,please load filament \nto extruder,and click \nfor start loading." #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_RU "Please load filament to extruder,\nand click for start loading." #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_RU "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_RU "Is unloading,please wait!" +#define FILAMENT_DIALOG_LOADING_TIPS_RU "Is loading, please wait!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_RU "Is unloading, please wait!" #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU "Load filament completed,\nclick for return!" #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU "Unload filament completed,\nclick for return!" diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index dfe393e39a..5e781706bc 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -430,7 +430,7 @@ namespace ExtUI { float getPID_Kp(const extruder_t); float getPID_Ki(const extruder_t); float getPID_Kd(const extruder_t); - void setPID(const_float_t, const_float_t , const_float_t , extruder_t); + void setPID(const_float_t, const_float_t, const_float_t, extruder_t); void startPIDTune(const celsius_t, extruder_t); #endif @@ -439,7 +439,7 @@ namespace ExtUI { float getBedPID_Kp(); float getBedPID_Ki(); float getBedPID_Kd(); - void setBedPID(const_float_t, const_float_t , const_float_t); + void setBedPID(const_float_t, const_float_t, const_float_t); void startBedPIDTune(const celsius_t); #endif diff --git a/Marlin/src/lcd/tft/ui_color_ui.cpp b/Marlin/src/lcd/tft/ui_color_ui.cpp index 64eed045e1..8186650070 100644 --- a/Marlin/src/lcd/tft/ui_color_ui.cpp +++ b/Marlin/src/lcd/tft/ui_color_ui.cpp @@ -248,21 +248,21 @@ void MarlinUI::draw_status_screen() { tft.add_rectangle(0, 0, COORDINATES_W, COORDINATES_H, COLOR_AXIS_HOMED); #if HAS_X_AXIS && defined(X_MARK_X) && defined(X_MARK_Y) && defined(X_VALUE_X) && defined(X_VALUE_Y) - tft.add_text(X_MARK_X, X_MARK_Y, COLOR_AXIS_HOMED , "X"); + tft.add_text(X_MARK_X, X_MARK_Y, COLOR_AXIS_HOMED, "X"); const bool nhx = axis_should_home(X_AXIS); tft_string.set(blink && nhx ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); tft.add_text(X_VALUE_X, X_VALUE_Y, nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); #endif #if HAS_Y_AXIS && defined(Y_MARK_X) && defined(Y_MARK_Y) && defined(Y_VALUE_X) && defined(Y_VALUE_Y) - tft.add_text(Y_MARK_X, Y_MARK_Y, COLOR_AXIS_HOMED , "Y"); + tft.add_text(Y_MARK_X, Y_MARK_Y, COLOR_AXIS_HOMED, "Y"); const bool nhy = axis_should_home(Y_AXIS); tft_string.set(blink && nhy ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); tft.add_text(Y_VALUE_X, Y_VALUE_Y, nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); #endif #if HAS_Z_AXIS && defined(Z_MARK_X) && defined(Z_MARK_Y) && defined(Z_VALUE_X) && defined(Z_VALUE_Y) && defined(Z_VALUE_OFFSET) - tft.add_text(Z_MARK_X, Z_MARK_Y, COLOR_AXIS_HOMED , "Z"); + tft.add_text(Z_MARK_X, Z_MARK_Y, COLOR_AXIS_HOMED, "Z"); uint16_t offset = Z_VALUE_OFFSET; const bool nhz = axis_should_home(Z_AXIS); if (blink && nhz) diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index d6656d36d8..50aaf56196 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -223,7 +223,7 @@ float segments_per_second = DEFAULT_SEGMENTS_PER_SECOND; //const int x_axis_home_dir = TOOL_X_HOME_DIR(active_extruder); - //const xy_pos_t pos { max_length(X_AXIS) , max_length(Y_AXIS) }; + //const xy_pos_t pos { max_length(X_AXIS), max_length(Y_AXIS) }; //const float mlz = max_length(X_AXIS), // Move all carriages together linearly until an endstop is hit. @@ -293,7 +293,7 @@ float segments_per_second = DEFAULT_SEGMENTS_PER_SECOND; delta.set(DEGREES(THETA), DEGREES(PHI), DEGREES(PSI)); - //SERIAL_ECHOLNPGM(" SCARA (x,y,z) ", spos.x , ",", spos.y, ",", spos.z, " Rho=", RHO, " Rho2=", RHO2, " Theta=", THETA, " Phi=", PHI, " Psi=", PSI, " Gamma=", GAMMA); + //SERIAL_ECHOLNPGM(" SCARA (x,y,z) ", spos.x, ",", spos.y, ",", spos.z, " Rho=", RHO, " Rho2=", RHO2, " Theta=", THETA, " Phi=", PHI, " Psi=", PSI, " Gamma=", GAMMA); } #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 7da051f9d7..169d86a72f 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1755,7 +1755,7 @@ void Temperature::mintemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_T float ambient_xfer_coeff = mpc.ambient_xfer_coeff_fan0; #if ENABLED(MPC_INCLUDE_FAN) const uint8_t fan_index = TERN(SINGLEFAN, 0, ee); - const float fan_fraction = TERN_(MPC_FAN_0_ACTIVE_HOTEND, !this_hotend ? 0.0f : ) fan_speed[fan_index] * RECIPROCAL(255); + const float fan_fraction = TERN_(MPC_FAN_0_ACTIVE_HOTEND, !this_hotend ? 0.0f :) fan_speed[fan_index] * RECIPROCAL(255); ambient_xfer_coeff += fan_fraction * mpc.fan255_adjustment; #endif @@ -3589,7 +3589,7 @@ void Temperature::disable_all_heaters() { #define THERMO_SEL(A,B,C) (hindex > 1 ? (C) : hindex == 1 ? (B) : (A)) #define MAXTC_CS_WRITE(V) do{ switch (hindex) { case 1: WRITE(TEMP_1_CS_PIN, V); break; case 2: WRITE(TEMP_2_CS_PIN, V); break; default: WRITE(TEMP_0_CS_PIN, V); } }while(0) #elif MAX_TC_COUNT > 1 - #define THERMO_SEL(A,B,C) ( hindex == 1 ? (B) : (A)) + #define THERMO_SEL(A,B,C) (hindex == 1 ? (B) : (A)) #define MAXTC_CS_WRITE(V) do{ switch (hindex) { case 1: WRITE(TEMP_1_CS_PIN, V); break; default: WRITE(TEMP_0_CS_PIN, V); } }while(0) #endif #else diff --git a/Marlin/src/module/thermistor/thermistor_666.h b/Marlin/src/module/thermistor/thermistor_666.h index 14a03c23b5..1b3a3a4615 100644 --- a/Marlin/src/module/thermistor/thermistor_666.h +++ b/Marlin/src/module/thermistor/thermistor_666.h @@ -42,7 +42,7 @@ constexpr temp_entry_t temptable_666[] PROGMEM = { { OV( 86), 176 }, { OV(103), 166 }, { OV(120), 157 }, - { OV(137) ,150 }, + { OV(137), 150 }, { OV(154), 144 }, { OV(172), 138 }, { OV(189), 134 }, diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h index 6f6182a684..5e9df26fdd 100644 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -92,7 +92,7 @@ #define MICROSTEP32 HIGH,HIGH,LOW #endif -//#define MOTOR_FAULT_PIN 22 // PB26 , motor X-Y-Z-E0 motor FAULT +//#define MOTOR_FAULT_PIN 22 // PB26, motor X-Y-Z-E0 motor FAULT // // Temperature Sensors diff --git a/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h b/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h index 7e145ccc0e..98ec48de80 100644 --- a/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h +++ b/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h @@ -36,7 +36,7 @@ #endif #ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "BRICOLEMON LITE V1.0" // , Lemoncrest & BricoGeek collaboration. + #define BOARD_INFO_NAME "BRICOLEMON LITE V1.0" // Lemoncrest & BricoGeek collaboration. #endif /** diff --git a/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h b/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h index c00caa73a4..37f0b79f6b 100644 --- a/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h +++ b/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h @@ -30,7 +30,7 @@ #endif #ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "BRICOLEMON V1.0" // , Lemoncrest & BricoGeek collaboration. + #define BOARD_INFO_NAME "BRICOLEMON V1.0" // Lemoncrest & BricoGeek collaboration. #endif /** diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h index 652b43fd2e..cb99851fdd 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h @@ -79,7 +79,7 @@ extern "C" #define NVIC_GET_PENDING(n) NVIC_GetPendingIRQ((IRQn_Type)n) #define NVIC_SET_PENDING(n) NVIC_SetPendingIRQ((IRQn_Type)n) #define NVIC_ENABLE_IRQ(n) NVIC_EnableIRQ((IRQn_Type)n) -#define NVIC_SET_PRIORITY(n ,p) NVIC_SetPriority((IRQn_Type)n, (uint32_t) p) +#define NVIC_SET_PRIORITY(n, p) NVIC_SetPriority((IRQn_Type)n, (uint32_t) p) //extern "C" { // extern uint32_t _VectorsRam[VECTORTABLE_SIZE] __attribute__((aligned(VECTORTABLE_ALIGNMENT))); //} diff --git a/buildroot/share/PlatformIO/scripts/exc.S b/buildroot/share/PlatformIO/scripts/exc.S index 1db462bb23..3a61701aca 100644 --- a/buildroot/share/PlatformIO/scripts/exc.S +++ b/buildroot/share/PlatformIO/scripts/exc.S @@ -81,7 +81,7 @@ __exc_usagefault: .thumb_func __default_exc: ldr r2, NVIC_CCR @ Enable returning to thread mode even if there are - mov r1 ,#1 @ pending exceptions. See flag NONEBASETHRDENA. + mov r1, #1 @ pending exceptions. See flag NONEBASETHRDENA. str r1, [r2] cpsid i @ Disable global interrupts ldr r2, SYSTICK_CSR @ Disable systick handler diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld index e86d8aa274..9d9d6e5a59 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld +++ b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld @@ -37,7 +37,7 @@ _Min_Stack_Size = 0x400; /* required amount of stack */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K - FLASH (rx) : ORIGIN = 0x8000000 , LENGTH = 128K + FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K } /* Sections */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld index e86d8aa274..9d9d6e5a59 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld +++ b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld @@ -37,7 +37,7 @@ _Min_Stack_Size = 0x400; /* required amount of stack */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K - FLASH (rx) : ORIGIN = 0x8000000 , LENGTH = 128K + FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K } /* Sections */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h b/buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h index cae4d83024..2d342f57c7 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h @@ -168,274 +168,274 @@ const uint16_t PROGMEM port_to_input_PGM[] = { const uint8_t PROGMEM digital_pin_to_port_PGM[] = { // PORTLIST // ------------------------------------------- - PE , // PE 0 ** 0 ** USART0_RX - PE , // PE 1 ** 1 ** USART0_TX - PE , // PE 4 ** 2 ** PWM2 - PE , // PE 5 ** 3 ** PWM3 - PG , // PG 5 ** 4 ** PWM4 - PE , // PE 3 ** 5 ** PWM5 - PH , // PH 3 ** 6 ** PWM6 - PH , // PH 4 ** 7 ** PWM7 - PH , // PH 5 ** 8 ** PWM8 - PH , // PH 6 ** 9 ** PWM9 - PB , // PB 4 ** 10 ** PWM10 - PB , // PB 5 ** 11 ** PWM11 - PB , // PB 6 ** 12 ** PWM12 - PB , // PB 7 ** 13 ** PWM13 - PJ , // PJ 1 ** 14 ** USART3_TX - PJ , // PJ 0 ** 15 ** USART3_RX - PH , // PH 1 ** 16 ** USART2_TX - PH , // PH 0 ** 17 ** USART2_RX - PD , // PD 3 ** 18 ** USART1_TX - PD , // PD 2 ** 19 ** USART1_RX - PD , // PD 1 ** 20 ** I2C_SDA - PD , // PD 0 ** 21 ** I2C_SCL - PA , // PA 0 ** 22 ** D22 - PA , // PA 1 ** 23 ** D23 - PA , // PA 2 ** 24 ** D24 - PA , // PA 3 ** 25 ** D25 - PA , // PA 4 ** 26 ** D26 - PA , // PA 5 ** 27 ** D27 - PA , // PA 6 ** 28 ** D28 - PA , // PA 7 ** 29 ** D29 - PC , // PC 7 ** 30 ** D30 - PC , // PC 6 ** 31 ** D31 - PC , // PC 5 ** 32 ** D32 - PC , // PC 4 ** 33 ** D33 - PC , // PC 3 ** 34 ** D34 - PC , // PC 2 ** 35 ** D35 - PC , // PC 1 ** 36 ** D36 - PC , // PC 0 ** 37 ** D37 - PD , // PD 7 ** 38 ** D38 - PG , // PG 2 ** 39 ** D39 - PG , // PG 1 ** 40 ** D40 - PG , // PG 0 ** 41 ** D41 - PL , // PL 7 ** 42 ** D42 - PL , // PL 6 ** 43 ** D43 - PL , // PL 5 ** 44 ** D44 - PL , // PL 4 ** 45 ** D45 - PL , // PL 3 ** 46 ** D46 - PL , // PL 2 ** 47 ** D47 - PL , // PL 1 ** 48 ** D48 - PL , // PL 0 ** 49 ** D49 - PB , // PB 3 ** 50 ** SPI_MISO - PB , // PB 2 ** 51 ** SPI_MOSI - PB , // PB 1 ** 52 ** SPI_SCK - PB , // PB 0 ** 53 ** SPI_SS - PF , // PF 0 ** 54 ** A0 - PF , // PF 1 ** 55 ** A1 - PF , // PF 2 ** 56 ** A2 - PF , // PF 3 ** 57 ** A3 - PF , // PF 4 ** 58 ** A4 - PF , // PF 5 ** 59 ** A5 - PF , // PF 6 ** 60 ** A6 - PF , // PF 7 ** 61 ** A7 - PK , // PK 0 ** 62 ** A8 - PK , // PK 1 ** 63 ** A9 - PK , // PK 2 ** 64 ** A10 - PK , // PK 3 ** 65 ** A11 - PK , // PK 4 ** 66 ** A12 - PK , // PK 5 ** 67 ** A13 - PK , // PK 6 ** 68 ** A14 - PK , // PK 7 ** 69 ** A15 - PG , // PG 4 ** 70 ** D70 - PG , // PG 3 ** 71 ** D71 - PJ , // PJ 2 ** 72 ** D72 - PJ , // PJ 3 ** 73 ** D73 - PJ , // PJ 7 ** 74 ** D74 - PJ , // PJ 4 ** 75 ** D75 - PJ , // PJ 5 ** 76 ** D76 - PJ , // PJ 6 ** 77 ** D77 - PE , // PE 2 ** 78 ** D78 - PE , // PE 6 ** 79 ** D79 - PE , // PE 7 ** 80 ** D80 - PD , // PD 4 ** 81 ** D81 - PD , // PD 5 ** 82 ** D82 - PD , // PD 6 ** 83 ** D83 - PH , // PH 2 ** 84 ** D84 - PH , // PH 7 ** 85 ** D85 + PE, // PE 0 ** 0 ** USART0_RX + PE, // PE 1 ** 1 ** USART0_TX + PE, // PE 4 ** 2 ** PWM2 + PE, // PE 5 ** 3 ** PWM3 + PG, // PG 5 ** 4 ** PWM4 + PE, // PE 3 ** 5 ** PWM5 + PH, // PH 3 ** 6 ** PWM6 + PH, // PH 4 ** 7 ** PWM7 + PH, // PH 5 ** 8 ** PWM8 + PH, // PH 6 ** 9 ** PWM9 + PB, // PB 4 ** 10 ** PWM10 + PB, // PB 5 ** 11 ** PWM11 + PB, // PB 6 ** 12 ** PWM12 + PB, // PB 7 ** 13 ** PWM13 + PJ, // PJ 1 ** 14 ** USART3_TX + PJ, // PJ 0 ** 15 ** USART3_RX + PH, // PH 1 ** 16 ** USART2_TX + PH, // PH 0 ** 17 ** USART2_RX + PD, // PD 3 ** 18 ** USART1_TX + PD, // PD 2 ** 19 ** USART1_RX + PD, // PD 1 ** 20 ** I2C_SDA + PD, // PD 0 ** 21 ** I2C_SCL + PA, // PA 0 ** 22 ** D22 + PA, // PA 1 ** 23 ** D23 + PA, // PA 2 ** 24 ** D24 + PA, // PA 3 ** 25 ** D25 + PA, // PA 4 ** 26 ** D26 + PA, // PA 5 ** 27 ** D27 + PA, // PA 6 ** 28 ** D28 + PA, // PA 7 ** 29 ** D29 + PC, // PC 7 ** 30 ** D30 + PC, // PC 6 ** 31 ** D31 + PC, // PC 5 ** 32 ** D32 + PC, // PC 4 ** 33 ** D33 + PC, // PC 3 ** 34 ** D34 + PC, // PC 2 ** 35 ** D35 + PC, // PC 1 ** 36 ** D36 + PC, // PC 0 ** 37 ** D37 + PD, // PD 7 ** 38 ** D38 + PG, // PG 2 ** 39 ** D39 + PG, // PG 1 ** 40 ** D40 + PG, // PG 0 ** 41 ** D41 + PL, // PL 7 ** 42 ** D42 + PL, // PL 6 ** 43 ** D43 + PL, // PL 5 ** 44 ** D44 + PL, // PL 4 ** 45 ** D45 + PL, // PL 3 ** 46 ** D46 + PL, // PL 2 ** 47 ** D47 + PL, // PL 1 ** 48 ** D48 + PL, // PL 0 ** 49 ** D49 + PB, // PB 3 ** 50 ** SPI_MISO + PB, // PB 2 ** 51 ** SPI_MOSI + PB, // PB 1 ** 52 ** SPI_SCK + PB, // PB 0 ** 53 ** SPI_SS + PF, // PF 0 ** 54 ** A0 + PF, // PF 1 ** 55 ** A1 + PF, // PF 2 ** 56 ** A2 + PF, // PF 3 ** 57 ** A3 + PF, // PF 4 ** 58 ** A4 + PF, // PF 5 ** 59 ** A5 + PF, // PF 6 ** 60 ** A6 + PF, // PF 7 ** 61 ** A7 + PK, // PK 0 ** 62 ** A8 + PK, // PK 1 ** 63 ** A9 + PK, // PK 2 ** 64 ** A10 + PK, // PK 3 ** 65 ** A11 + PK, // PK 4 ** 66 ** A12 + PK, // PK 5 ** 67 ** A13 + PK, // PK 6 ** 68 ** A14 + PK, // PK 7 ** 69 ** A15 + PG, // PG 4 ** 70 ** D70 + PG, // PG 3 ** 71 ** D71 + PJ, // PJ 2 ** 72 ** D72 + PJ, // PJ 3 ** 73 ** D73 + PJ, // PJ 7 ** 74 ** D74 + PJ, // PJ 4 ** 75 ** D75 + PJ, // PJ 5 ** 76 ** D76 + PJ, // PJ 6 ** 77 ** D77 + PE, // PE 2 ** 78 ** D78 + PE, // PE 6 ** 79 ** D79 + PE, // PE 7 ** 80 ** D80 + PD, // PD 4 ** 81 ** D81 + PD, // PD 5 ** 82 ** D82 + PD, // PD 6 ** 83 ** D83 + PH, // PH 2 ** 84 ** D84 + PH, // PH 7 ** 85 ** D85 }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { // PIN IN PORT // ------------------------------------------- - _BV( 0 ) , // PE 0 ** 0 ** USART0_RX - _BV( 1 ) , // PE 1 ** 1 ** USART0_TX - _BV( 4 ) , // PE 4 ** 2 ** PWM2 - _BV( 5 ) , // PE 5 ** 3 ** PWM3 - _BV( 5 ) , // PG 5 ** 4 ** PWM4 - _BV( 3 ) , // PE 3 ** 5 ** PWM5 - _BV( 3 ) , // PH 3 ** 6 ** PWM6 - _BV( 4 ) , // PH 4 ** 7 ** PWM7 - _BV( 5 ) , // PH 5 ** 8 ** PWM8 - _BV( 6 ) , // PH 6 ** 9 ** PWM9 - _BV( 4 ) , // PB 4 ** 10 ** PWM10 - _BV( 5 ) , // PB 5 ** 11 ** PWM11 - _BV( 6 ) , // PB 6 ** 12 ** PWM12 - _BV( 7 ) , // PB 7 ** 13 ** PWM13 - _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX - _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX - _BV( 1 ) , // PH 1 ** 16 ** USART2_TX - _BV( 0 ) , // PH 0 ** 17 ** USART2_RX - _BV( 3 ) , // PD 3 ** 18 ** USART1_TX - _BV( 2 ) , // PD 2 ** 19 ** USART1_RX - _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA - _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL - _BV( 0 ) , // PA 0 ** 22 ** D22 - _BV( 1 ) , // PA 1 ** 23 ** D23 - _BV( 2 ) , // PA 2 ** 24 ** D24 - _BV( 3 ) , // PA 3 ** 25 ** D25 - _BV( 4 ) , // PA 4 ** 26 ** D26 - _BV( 5 ) , // PA 5 ** 27 ** D27 - _BV( 6 ) , // PA 6 ** 28 ** D28 - _BV( 7 ) , // PA 7 ** 29 ** D29 - _BV( 7 ) , // PC 7 ** 30 ** D30 - _BV( 6 ) , // PC 6 ** 31 ** D31 - _BV( 5 ) , // PC 5 ** 32 ** D32 - _BV( 4 ) , // PC 4 ** 33 ** D33 - _BV( 3 ) , // PC 3 ** 34 ** D34 - _BV( 2 ) , // PC 2 ** 35 ** D35 - _BV( 1 ) , // PC 1 ** 36 ** D36 - _BV( 0 ) , // PC 0 ** 37 ** D37 - _BV( 7 ) , // PD 7 ** 38 ** D38 - _BV( 2 ) , // PG 2 ** 39 ** D39 - _BV( 1 ) , // PG 1 ** 40 ** D40 - _BV( 0 ) , // PG 0 ** 41 ** D41 - _BV( 7 ) , // PL 7 ** 42 ** D42 - _BV( 6 ) , // PL 6 ** 43 ** D43 - _BV( 5 ) , // PL 5 ** 44 ** D44 - _BV( 4 ) , // PL 4 ** 45 ** D45 - _BV( 3 ) , // PL 3 ** 46 ** D46 - _BV( 2 ) , // PL 2 ** 47 ** D47 - _BV( 1 ) , // PL 1 ** 48 ** D48 - _BV( 0 ) , // PL 0 ** 49 ** D49 - _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO - _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI - _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK - _BV( 0 ) , // PB 0 ** 53 ** SPI_SS - _BV( 0 ) , // PF 0 ** 54 ** A0 - _BV( 1 ) , // PF 1 ** 55 ** A1 - _BV( 2 ) , // PF 2 ** 56 ** A2 - _BV( 3 ) , // PF 3 ** 57 ** A3 - _BV( 4 ) , // PF 4 ** 58 ** A4 - _BV( 5 ) , // PF 5 ** 59 ** A5 - _BV( 6 ) , // PF 6 ** 60 ** A6 - _BV( 7 ) , // PF 7 ** 61 ** A7 - _BV( 0 ) , // PK 0 ** 62 ** A8 - _BV( 1 ) , // PK 1 ** 63 ** A9 - _BV( 2 ) , // PK 2 ** 64 ** A10 - _BV( 3 ) , // PK 3 ** 65 ** A11 - _BV( 4 ) , // PK 4 ** 66 ** A12 - _BV( 5 ) , // PK 5 ** 67 ** A13 - _BV( 6 ) , // PK 6 ** 68 ** A14 - _BV( 7 ) , // PK 7 ** 69 ** A15 - _BV( 4 ) , // PG 4 ** 70 ** D70 - _BV( 3 ) , // PG 3 ** 71 ** D71 - _BV( 2 ) , // PJ 2 ** 72 ** D72 - _BV( 3 ) , // PJ 3 ** 73 ** D73 - _BV( 7 ) , // PJ 7 ** 74 ** D74 - _BV( 4 ) , // PJ 4 ** 75 ** D75 - _BV( 5 ) , // PJ 5 ** 76 ** D76 - _BV( 6 ) , // PJ 6 ** 77 ** D77 - _BV( 2 ) , // PE 2 ** 78 ** D78 - _BV( 6 ) , // PE 6 ** 79 ** D79 - _BV( 7 ) , // PE 7 ** 80 ** D80 - _BV( 4 ) , // PD 4 ** 81 ** D81 - _BV( 5 ) , // PD 5 ** 82 ** D82 - _BV( 6 ) , // PD 6 ** 83 ** D83 - _BV( 2 ) , // PH 2 ** 84 ** D84 - _BV( 7 ) , // PH 7 ** 85 ** D85 + _BV( 0 ), // PE 0 ** 0 ** USART0_RX + _BV( 1 ), // PE 1 ** 1 ** USART0_TX + _BV( 4 ), // PE 4 ** 2 ** PWM2 + _BV( 5 ), // PE 5 ** 3 ** PWM3 + _BV( 5 ), // PG 5 ** 4 ** PWM4 + _BV( 3 ), // PE 3 ** 5 ** PWM5 + _BV( 3 ), // PH 3 ** 6 ** PWM6 + _BV( 4 ), // PH 4 ** 7 ** PWM7 + _BV( 5 ), // PH 5 ** 8 ** PWM8 + _BV( 6 ), // PH 6 ** 9 ** PWM9 + _BV( 4 ), // PB 4 ** 10 ** PWM10 + _BV( 5 ), // PB 5 ** 11 ** PWM11 + _BV( 6 ), // PB 6 ** 12 ** PWM12 + _BV( 7 ), // PB 7 ** 13 ** PWM13 + _BV( 1 ), // PJ 1 ** 14 ** USART3_TX + _BV( 0 ), // PJ 0 ** 15 ** USART3_RX + _BV( 1 ), // PH 1 ** 16 ** USART2_TX + _BV( 0 ), // PH 0 ** 17 ** USART2_RX + _BV( 3 ), // PD 3 ** 18 ** USART1_TX + _BV( 2 ), // PD 2 ** 19 ** USART1_RX + _BV( 1 ), // PD 1 ** 20 ** I2C_SDA + _BV( 0 ), // PD 0 ** 21 ** I2C_SCL + _BV( 0 ), // PA 0 ** 22 ** D22 + _BV( 1 ), // PA 1 ** 23 ** D23 + _BV( 2 ), // PA 2 ** 24 ** D24 + _BV( 3 ), // PA 3 ** 25 ** D25 + _BV( 4 ), // PA 4 ** 26 ** D26 + _BV( 5 ), // PA 5 ** 27 ** D27 + _BV( 6 ), // PA 6 ** 28 ** D28 + _BV( 7 ), // PA 7 ** 29 ** D29 + _BV( 7 ), // PC 7 ** 30 ** D30 + _BV( 6 ), // PC 6 ** 31 ** D31 + _BV( 5 ), // PC 5 ** 32 ** D32 + _BV( 4 ), // PC 4 ** 33 ** D33 + _BV( 3 ), // PC 3 ** 34 ** D34 + _BV( 2 ), // PC 2 ** 35 ** D35 + _BV( 1 ), // PC 1 ** 36 ** D36 + _BV( 0 ), // PC 0 ** 37 ** D37 + _BV( 7 ), // PD 7 ** 38 ** D38 + _BV( 2 ), // PG 2 ** 39 ** D39 + _BV( 1 ), // PG 1 ** 40 ** D40 + _BV( 0 ), // PG 0 ** 41 ** D41 + _BV( 7 ), // PL 7 ** 42 ** D42 + _BV( 6 ), // PL 6 ** 43 ** D43 + _BV( 5 ), // PL 5 ** 44 ** D44 + _BV( 4 ), // PL 4 ** 45 ** D45 + _BV( 3 ), // PL 3 ** 46 ** D46 + _BV( 2 ), // PL 2 ** 47 ** D47 + _BV( 1 ), // PL 1 ** 48 ** D48 + _BV( 0 ), // PL 0 ** 49 ** D49 + _BV( 3 ), // PB 3 ** 50 ** SPI_MISO + _BV( 2 ), // PB 2 ** 51 ** SPI_MOSI + _BV( 1 ), // PB 1 ** 52 ** SPI_SCK + _BV( 0 ), // PB 0 ** 53 ** SPI_SS + _BV( 0 ), // PF 0 ** 54 ** A0 + _BV( 1 ), // PF 1 ** 55 ** A1 + _BV( 2 ), // PF 2 ** 56 ** A2 + _BV( 3 ), // PF 3 ** 57 ** A3 + _BV( 4 ), // PF 4 ** 58 ** A4 + _BV( 5 ), // PF 5 ** 59 ** A5 + _BV( 6 ), // PF 6 ** 60 ** A6 + _BV( 7 ), // PF 7 ** 61 ** A7 + _BV( 0 ), // PK 0 ** 62 ** A8 + _BV( 1 ), // PK 1 ** 63 ** A9 + _BV( 2 ), // PK 2 ** 64 ** A10 + _BV( 3 ), // PK 3 ** 65 ** A11 + _BV( 4 ), // PK 4 ** 66 ** A12 + _BV( 5 ), // PK 5 ** 67 ** A13 + _BV( 6 ), // PK 6 ** 68 ** A14 + _BV( 7 ), // PK 7 ** 69 ** A15 + _BV( 4 ), // PG 4 ** 70 ** D70 + _BV( 3 ), // PG 3 ** 71 ** D71 + _BV( 2 ), // PJ 2 ** 72 ** D72 + _BV( 3 ), // PJ 3 ** 73 ** D73 + _BV( 7 ), // PJ 7 ** 74 ** D74 + _BV( 4 ), // PJ 4 ** 75 ** D75 + _BV( 5 ), // PJ 5 ** 76 ** D76 + _BV( 6 ), // PJ 6 ** 77 ** D77 + _BV( 2 ), // PE 2 ** 78 ** D78 + _BV( 6 ), // PE 6 ** 79 ** D79 + _BV( 7 ), // PE 7 ** 80 ** D80 + _BV( 4 ), // PD 4 ** 81 ** D81 + _BV( 5 ), // PD 5 ** 82 ** D82 + _BV( 6 ), // PD 6 ** 83 ** D83 + _BV( 2 ), // PH 2 ** 84 ** D84 + _BV( 7 ), // PH 7 ** 85 ** D85 }; const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { // TIMERS // ------------------------------------------- - NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX - NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX - TIMER3B , // PE 4 ** 2 ** PWM2 - TIMER3C , // PE 5 ** 3 ** PWM3 - TIMER0B , // PG 5 ** 4 ** PWM4 - TIMER3A , // PE 3 ** 5 ** PWM5 - TIMER4A , // PH 3 ** 6 ** PWM6 - TIMER4B , // PH 4 ** 7 ** PWM7 - TIMER4C , // PH 5 ** 8 ** PWM8 - TIMER2B , // PH 6 ** 9 ** PWM9 - TIMER2A , // PB 4 ** 10 ** PWM10 - TIMER1A , // PB 5 ** 11 ** PWM11 - TIMER1B , // PB 6 ** 12 ** PWM12 - TIMER0A , // PB 7 ** 13 ** PWM13 - NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX - NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX - NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX - NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX - NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX - NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX - NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA - NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL - NOT_ON_TIMER , // PA 0 ** 22 ** D22 - NOT_ON_TIMER , // PA 1 ** 23 ** D23 - NOT_ON_TIMER , // PA 2 ** 24 ** D24 - NOT_ON_TIMER , // PA 3 ** 25 ** D25 - NOT_ON_TIMER , // PA 4 ** 26 ** D26 - NOT_ON_TIMER , // PA 5 ** 27 ** D27 - NOT_ON_TIMER , // PA 6 ** 28 ** D28 - NOT_ON_TIMER , // PA 7 ** 29 ** D29 - NOT_ON_TIMER , // PC 7 ** 30 ** D30 - NOT_ON_TIMER , // PC 6 ** 31 ** D31 - NOT_ON_TIMER , // PC 5 ** 32 ** D32 - NOT_ON_TIMER , // PC 4 ** 33 ** D33 - NOT_ON_TIMER , // PC 3 ** 34 ** D34 - NOT_ON_TIMER , // PC 2 ** 35 ** D35 - NOT_ON_TIMER , // PC 1 ** 36 ** D36 - NOT_ON_TIMER , // PC 0 ** 37 ** D37 - NOT_ON_TIMER , // PD 7 ** 38 ** D38 - NOT_ON_TIMER , // PG 2 ** 39 ** D39 - NOT_ON_TIMER , // PG 1 ** 40 ** D40 - NOT_ON_TIMER , // PG 0 ** 41 ** D41 - NOT_ON_TIMER , // PL 7 ** 42 ** D42 - NOT_ON_TIMER , // PL 6 ** 43 ** D43 - TIMER5C , // PL 5 ** 44 ** D44 - TIMER5B , // PL 4 ** 45 ** D45 - TIMER5A , // PL 3 ** 46 ** D46 - NOT_ON_TIMER , // PL 2 ** 47 ** D47 - NOT_ON_TIMER , // PL 1 ** 48 ** D48 - NOT_ON_TIMER , // PL 0 ** 49 ** D49 - NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO - NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI - NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK - NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS - NOT_ON_TIMER , // PF 0 ** 54 ** A0 - NOT_ON_TIMER , // PF 1 ** 55 ** A1 - NOT_ON_TIMER , // PF 2 ** 56 ** A2 - NOT_ON_TIMER , // PF 3 ** 57 ** A3 - NOT_ON_TIMER , // PF 4 ** 58 ** A4 - NOT_ON_TIMER , // PF 5 ** 59 ** A5 - NOT_ON_TIMER , // PF 6 ** 60 ** A6 - NOT_ON_TIMER , // PF 7 ** 61 ** A7 - NOT_ON_TIMER , // PK 0 ** 62 ** A8 - NOT_ON_TIMER , // PK 1 ** 63 ** A9 - NOT_ON_TIMER , // PK 2 ** 64 ** A10 - NOT_ON_TIMER , // PK 3 ** 65 ** A11 - NOT_ON_TIMER , // PK 4 ** 66 ** A12 - NOT_ON_TIMER , // PK 5 ** 67 ** A13 - NOT_ON_TIMER , // PK 6 ** 68 ** A14 - NOT_ON_TIMER , // PK 7 ** 69 ** A15 - NOT_ON_TIMER , // PG 4 ** 70 ** D70 - NOT_ON_TIMER , // PG 3 ** 71 ** D71 - NOT_ON_TIMER , // PJ 2 ** 72 ** D72 - NOT_ON_TIMER , // PJ 3 ** 73 ** D73 - NOT_ON_TIMER , // PJ 7 ** 74 ** D74 - NOT_ON_TIMER , // PJ 4 ** 75 ** D75 - NOT_ON_TIMER , // PJ 5 ** 76 ** D76 - NOT_ON_TIMER , // PJ 6 ** 77 ** D77 - NOT_ON_TIMER , // PE 2 ** 78 ** D78 - NOT_ON_TIMER , // PE 6 ** 79 ** D79 - NOT_ON_TIMER , // PE 7 ** 80 ** D80 - NOT_ON_TIMER , // PD 4 ** 81 ** D81 - NOT_ON_TIMER , // PD 5 ** 82 ** D82 - NOT_ON_TIMER , // PD 6 ** 83 ** D83 - NOT_ON_TIMER , // PH 2 ** 84 ** D84 - NOT_ON_TIMER , // PH 7 ** 85 ** D85 + NOT_ON_TIMER, // PE 0 ** 0 ** USART0_RX + NOT_ON_TIMER, // PE 1 ** 1 ** USART0_TX + TIMER3B, // PE 4 ** 2 ** PWM2 + TIMER3C, // PE 5 ** 3 ** PWM3 + TIMER0B, // PG 5 ** 4 ** PWM4 + TIMER3A, // PE 3 ** 5 ** PWM5 + TIMER4A, // PH 3 ** 6 ** PWM6 + TIMER4B, // PH 4 ** 7 ** PWM7 + TIMER4C, // PH 5 ** 8 ** PWM8 + TIMER2B, // PH 6 ** 9 ** PWM9 + TIMER2A, // PB 4 ** 10 ** PWM10 + TIMER1A, // PB 5 ** 11 ** PWM11 + TIMER1B, // PB 6 ** 12 ** PWM12 + TIMER0A, // PB 7 ** 13 ** PWM13 + NOT_ON_TIMER, // PJ 1 ** 14 ** USART3_TX + NOT_ON_TIMER, // PJ 0 ** 15 ** USART3_RX + NOT_ON_TIMER, // PH 1 ** 16 ** USART2_TX + NOT_ON_TIMER, // PH 0 ** 17 ** USART2_RX + NOT_ON_TIMER, // PD 3 ** 18 ** USART1_TX + NOT_ON_TIMER, // PD 2 ** 19 ** USART1_RX + NOT_ON_TIMER, // PD 1 ** 20 ** I2C_SDA + NOT_ON_TIMER, // PD 0 ** 21 ** I2C_SCL + NOT_ON_TIMER, // PA 0 ** 22 ** D22 + NOT_ON_TIMER, // PA 1 ** 23 ** D23 + NOT_ON_TIMER, // PA 2 ** 24 ** D24 + NOT_ON_TIMER, // PA 3 ** 25 ** D25 + NOT_ON_TIMER, // PA 4 ** 26 ** D26 + NOT_ON_TIMER, // PA 5 ** 27 ** D27 + NOT_ON_TIMER, // PA 6 ** 28 ** D28 + NOT_ON_TIMER, // PA 7 ** 29 ** D29 + NOT_ON_TIMER, // PC 7 ** 30 ** D30 + NOT_ON_TIMER, // PC 6 ** 31 ** D31 + NOT_ON_TIMER, // PC 5 ** 32 ** D32 + NOT_ON_TIMER, // PC 4 ** 33 ** D33 + NOT_ON_TIMER, // PC 3 ** 34 ** D34 + NOT_ON_TIMER, // PC 2 ** 35 ** D35 + NOT_ON_TIMER, // PC 1 ** 36 ** D36 + NOT_ON_TIMER, // PC 0 ** 37 ** D37 + NOT_ON_TIMER, // PD 7 ** 38 ** D38 + NOT_ON_TIMER, // PG 2 ** 39 ** D39 + NOT_ON_TIMER, // PG 1 ** 40 ** D40 + NOT_ON_TIMER, // PG 0 ** 41 ** D41 + NOT_ON_TIMER, // PL 7 ** 42 ** D42 + NOT_ON_TIMER, // PL 6 ** 43 ** D43 + TIMER5C, // PL 5 ** 44 ** D44 + TIMER5B, // PL 4 ** 45 ** D45 + TIMER5A, // PL 3 ** 46 ** D46 + NOT_ON_TIMER, // PL 2 ** 47 ** D47 + NOT_ON_TIMER, // PL 1 ** 48 ** D48 + NOT_ON_TIMER, // PL 0 ** 49 ** D49 + NOT_ON_TIMER, // PB 3 ** 50 ** SPI_MISO + NOT_ON_TIMER, // PB 2 ** 51 ** SPI_MOSI + NOT_ON_TIMER, // PB 1 ** 52 ** SPI_SCK + NOT_ON_TIMER, // PB 0 ** 53 ** SPI_SS + NOT_ON_TIMER, // PF 0 ** 54 ** A0 + NOT_ON_TIMER, // PF 1 ** 55 ** A1 + NOT_ON_TIMER, // PF 2 ** 56 ** A2 + NOT_ON_TIMER, // PF 3 ** 57 ** A3 + NOT_ON_TIMER, // PF 4 ** 58 ** A4 + NOT_ON_TIMER, // PF 5 ** 59 ** A5 + NOT_ON_TIMER, // PF 6 ** 60 ** A6 + NOT_ON_TIMER, // PF 7 ** 61 ** A7 + NOT_ON_TIMER, // PK 0 ** 62 ** A8 + NOT_ON_TIMER, // PK 1 ** 63 ** A9 + NOT_ON_TIMER, // PK 2 ** 64 ** A10 + NOT_ON_TIMER, // PK 3 ** 65 ** A11 + NOT_ON_TIMER, // PK 4 ** 66 ** A12 + NOT_ON_TIMER, // PK 5 ** 67 ** A13 + NOT_ON_TIMER, // PK 6 ** 68 ** A14 + NOT_ON_TIMER, // PK 7 ** 69 ** A15 + NOT_ON_TIMER, // PG 4 ** 70 ** D70 + NOT_ON_TIMER, // PG 3 ** 71 ** D71 + NOT_ON_TIMER, // PJ 2 ** 72 ** D72 + NOT_ON_TIMER, // PJ 3 ** 73 ** D73 + NOT_ON_TIMER, // PJ 7 ** 74 ** D74 + NOT_ON_TIMER, // PJ 4 ** 75 ** D75 + NOT_ON_TIMER, // PJ 5 ** 76 ** D76 + NOT_ON_TIMER, // PJ 6 ** 77 ** D77 + NOT_ON_TIMER, // PE 2 ** 78 ** D78 + NOT_ON_TIMER, // PE 6 ** 79 ** D79 + NOT_ON_TIMER, // PE 7 ** 80 ** D80 + NOT_ON_TIMER, // PD 4 ** 81 ** D81 + NOT_ON_TIMER, // PD 5 ** 82 ** D82 + NOT_ON_TIMER, // PD 6 ** 83 ** D83 + NOT_ON_TIMER, // PH 2 ** 84 ** D84 + NOT_ON_TIMER, // PH 7 ** 85 ** D85 }; #endif diff --git a/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board.cpp b/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board.cpp index 8a4320a664..afaece9760 100644 --- a/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board.cpp +++ b/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board.cpp @@ -131,74 +131,74 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ - {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ + {&gpiod, NULL, NULL, 0, 0, ADCx}, /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx}, /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx}, /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ - {&gpiod, NULL, NULL, 3, 0, ADCx} , /* PD3 FSMC_CLK */ - {&gpiod, NULL, NULL, 4, 0, ADCx} , /* PD4 FSMC_NOE */ - {&gpiod, NULL, NULL, 5, 0, ADCx} , /* PD5 FSMC_NWE */ - {&gpiod, NULL, NULL, 6, 0, ADCx} , /* PD6 FSMC_NWAIT */ - {&gpiod, NULL, NULL, 7, 0, ADCx} , /* PD7 FSMC_NE1/FSMC_NCE2 */ - {&gpiod, NULL, NULL, 8, 0, ADCx} , /* PD8 FSMC_D13 */ - {&gpiod, NULL, NULL, 9, 0, ADCx} , /* PD9 FSMC_D14 */ - {&gpiod, NULL, NULL, 10, 0, ADCx} , /* PD10 FSMC_D15 */ - {&gpiod, NULL, NULL, 11, 0, ADCx} , /* PD11 FSMC_A16 */ - {&gpiod, NULL, NULL, 12, 0, ADCx} , /* PD12 FSMC_A17 */ - {&gpiod, NULL, NULL, 13, 0, ADCx} , /* PD13 FSMC_A18 */ - {&gpiod, NULL, NULL, 14, 0, ADCx} , /* PD14 FSMC_D0 */ - {&gpiod, NULL, NULL, 15, 0, ADCx} , /* PD15 FSMC_D1 */ + {&gpiod, NULL, NULL, 3, 0, ADCx}, /* PD3 FSMC_CLK */ + {&gpiod, NULL, NULL, 4, 0, ADCx}, /* PD4 FSMC_NOE */ + {&gpiod, NULL, NULL, 5, 0, ADCx}, /* PD5 FSMC_NWE */ + {&gpiod, NULL, NULL, 6, 0, ADCx}, /* PD6 FSMC_NWAIT */ + {&gpiod, NULL, NULL, 7, 0, ADCx}, /* PD7 FSMC_NE1/FSMC_NCE2 */ + {&gpiod, NULL, NULL, 8, 0, ADCx}, /* PD8 FSMC_D13 */ + {&gpiod, NULL, NULL, 9, 0, ADCx}, /* PD9 FSMC_D14 */ + {&gpiod, NULL, NULL, 10, 0, ADCx}, /* PD10 FSMC_D15 */ + {&gpiod, NULL, NULL, 11, 0, ADCx}, /* PD11 FSMC_A16 */ + {&gpiod, NULL, NULL, 12, 0, ADCx}, /* PD12 FSMC_A17 */ + {&gpiod, NULL, NULL, 13, 0, ADCx}, /* PD13 FSMC_A18 */ + {&gpiod, NULL, NULL, 14, 0, ADCx}, /* PD14 FSMC_D0 */ + {&gpiod, NULL, NULL, 15, 0, ADCx}, /* PD15 FSMC_D1 */ - {&gpioe, NULL, NULL, 0, 0, ADCx} , /* PE0 */ - {&gpioe, NULL, NULL, 1, 0, ADCx} , /* PE1 */ - {&gpioe, NULL, NULL, 2, 0, ADCx} , /* PE2 */ - {&gpioe, NULL, NULL, 3, 0, ADCx} , /* PE3 */ - {&gpioe, NULL, NULL, 4, 0, ADCx} , /* PE4 */ - {&gpioe, NULL, NULL, 5, 0, ADCx} , /* PE5 */ - {&gpioe, NULL, NULL, 6, 0, ADCx} , /* PE6 */ - {&gpioe, NULL, NULL, 7, 0, ADCx} , /* PE7 */ - {&gpioe, NULL, NULL, 8, 0, ADCx} , /* PE8 */ - {&gpioe, NULL, NULL, 9, 0, ADCx} , /* PE9 */ - {&gpioe, NULL, NULL, 10, 0, ADCx} , /* PE10 */ - {&gpioe, NULL, NULL, 11, 0, ADCx} , /* PE11 */ - {&gpioe, NULL, NULL, 12, 0, ADCx} , /* PE12 */ - {&gpioe, NULL, NULL, 13, 0, ADCx} , /* PE13 */ - {&gpioe, NULL, NULL, 14, 0, ADCx} , /* PE14 */ - {&gpioe, NULL, NULL, 15, 0, ADCx} , /* PE15 */ + {&gpioe, NULL, NULL, 0, 0, ADCx}, /* PE0 */ + {&gpioe, NULL, NULL, 1, 0, ADCx}, /* PE1 */ + {&gpioe, NULL, NULL, 2, 0, ADCx}, /* PE2 */ + {&gpioe, NULL, NULL, 3, 0, ADCx}, /* PE3 */ + {&gpioe, NULL, NULL, 4, 0, ADCx}, /* PE4 */ + {&gpioe, NULL, NULL, 5, 0, ADCx}, /* PE5 */ + {&gpioe, NULL, NULL, 6, 0, ADCx}, /* PE6 */ + {&gpioe, NULL, NULL, 7, 0, ADCx}, /* PE7 */ + {&gpioe, NULL, NULL, 8, 0, ADCx}, /* PE8 */ + {&gpioe, NULL, NULL, 9, 0, ADCx}, /* PE9 */ + {&gpioe, NULL, NULL, 10, 0, ADCx}, /* PE10 */ + {&gpioe, NULL, NULL, 11, 0, ADCx}, /* PE11 */ + {&gpioe, NULL, NULL, 12, 0, ADCx}, /* PE12 */ + {&gpioe, NULL, NULL, 13, 0, ADCx}, /* PE13 */ + {&gpioe, NULL, NULL, 14, 0, ADCx}, /* PE14 */ + {&gpioe, NULL, NULL, 15, 0, ADCx}, /* PE15 */ - {&gpiof, NULL, NULL, 0, 0, ADCx} , /* PF0 */ - {&gpiof, NULL, NULL, 1, 0, ADCx} , /* PF1 */ - {&gpiof, NULL, NULL, 2, 0, ADCx} , /* PF2 */ - {&gpiof, NULL, NULL, 3, 0, ADCx} , /* PF3 */ - {&gpiof, NULL, NULL, 4, 0, ADCx} , /* PF4 */ - {&gpiof, NULL, NULL, 5, 0, ADCx} , /* PF5 */ - {&gpiof, NULL, NULL, 6, 0, ADCx} , /* PF6 */ - {&gpiof, NULL, NULL, 7, 0, ADCx} , /* PF7 */ - {&gpiof, NULL, NULL, 8, 0, ADCx} , /* PF8 */ - {&gpiof, NULL, NULL, 9, 0, ADCx} , /* PF9 */ - {&gpiof, NULL, NULL, 10, 0, ADCx} , /* PF10 */ - {&gpiof, NULL, NULL, 11, 0, ADCx} , /* PF11 */ - {&gpiof, NULL, NULL, 12, 0, ADCx} , /* PF12 */ - {&gpiof, NULL, NULL, 13, 0, ADCx} , /* PF13 */ - {&gpiof, NULL, NULL, 14, 0, ADCx} , /* PF14 */ - {&gpiof, NULL, NULL, 15, 0, ADCx} , /* PF15 */ + {&gpiof, NULL, NULL, 0, 0, ADCx}, /* PF0 */ + {&gpiof, NULL, NULL, 1, 0, ADCx}, /* PF1 */ + {&gpiof, NULL, NULL, 2, 0, ADCx}, /* PF2 */ + {&gpiof, NULL, NULL, 3, 0, ADCx}, /* PF3 */ + {&gpiof, NULL, NULL, 4, 0, ADCx}, /* PF4 */ + {&gpiof, NULL, NULL, 5, 0, ADCx}, /* PF5 */ + {&gpiof, NULL, NULL, 6, 0, ADCx}, /* PF6 */ + {&gpiof, NULL, NULL, 7, 0, ADCx}, /* PF7 */ + {&gpiof, NULL, NULL, 8, 0, ADCx}, /* PF8 */ + {&gpiof, NULL, NULL, 9, 0, ADCx}, /* PF9 */ + {&gpiof, NULL, NULL, 10, 0, ADCx}, /* PF10 */ + {&gpiof, NULL, NULL, 11, 0, ADCx}, /* PF11 */ + {&gpiof, NULL, NULL, 12, 0, ADCx}, /* PF12 */ + {&gpiof, NULL, NULL, 13, 0, ADCx}, /* PF13 */ + {&gpiof, NULL, NULL, 14, 0, ADCx}, /* PF14 */ + {&gpiof, NULL, NULL, 15, 0, ADCx}, /* PF15 */ - {&gpiog, NULL, NULL, 0, 0, ADCx} , /* PG0 */ - {&gpiog, NULL, NULL, 1, 0, ADCx} , /* PG1 */ - {&gpiog, NULL, NULL, 2, 0, ADCx} , /* PG2 */ - {&gpiog, NULL, NULL, 3, 0, ADCx} , /* PG3 */ - {&gpiog, NULL, NULL, 4, 0, ADCx} , /* PG4 */ - {&gpiog, NULL, NULL, 5, 0, ADCx} , /* PG5 */ - {&gpiog, NULL, NULL, 6, 0, ADCx} , /* PG6 */ - {&gpiog, NULL, NULL, 7, 0, ADCx} , /* PG7 */ - {&gpiog, NULL, NULL, 8, 0, ADCx} , /* PG8 */ - {&gpiog, NULL, NULL, 9, 0, ADCx} , /* PG9 */ - {&gpiog, NULL, NULL, 10, 0, ADCx} , /* PG10 */ - {&gpiog, NULL, NULL, 11, 0, ADCx} , /* PG11 */ - {&gpiog, NULL, NULL, 12, 0, ADCx} , /* PG12 */ - {&gpiog, NULL, NULL, 13, 0, ADCx} , /* PG13 */ - {&gpiog, NULL, NULL, 14, 0, ADCx} , /* PG14 */ - {&gpiog, NULL, NULL, 15, 0, ADCx} /* PG15 */ + {&gpiog, NULL, NULL, 0, 0, ADCx}, /* PG0 */ + {&gpiog, NULL, NULL, 1, 0, ADCx}, /* PG1 */ + {&gpiog, NULL, NULL, 2, 0, ADCx}, /* PG2 */ + {&gpiog, NULL, NULL, 3, 0, ADCx}, /* PG3 */ + {&gpiog, NULL, NULL, 4, 0, ADCx}, /* PG4 */ + {&gpiog, NULL, NULL, 5, 0, ADCx}, /* PG5 */ + {&gpiog, NULL, NULL, 6, 0, ADCx}, /* PG6 */ + {&gpiog, NULL, NULL, 7, 0, ADCx}, /* PG7 */ + {&gpiog, NULL, NULL, 8, 0, ADCx}, /* PG8 */ + {&gpiog, NULL, NULL, 9, 0, ADCx}, /* PG9 */ + {&gpiog, NULL, NULL, 10, 0, ADCx}, /* PG10 */ + {&gpiog, NULL, NULL, 11, 0, ADCx}, /* PG11 */ + {&gpiog, NULL, NULL, 12, 0, ADCx}, /* PG12 */ + {&gpiog, NULL, NULL, 13, 0, ADCx}, /* PG13 */ + {&gpiog, NULL, NULL, 14, 0, ADCx}, /* PG14 */ + {&gpiog, NULL, NULL, 15, 0, ADCx} /* PG15 */ }; /* Basically everything that is defined as having a timer us PWM */ diff --git a/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board.cpp b/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board.cpp index 5ddeb1f1d9..332c9f005e 100644 --- a/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board.cpp +++ b/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board.cpp @@ -132,9 +132,9 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ - {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ + {&gpiod, NULL, NULL, 0, 0, ADCx}, /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx}, /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx}, /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ }; /* Basically everything that is defined as having a timer us PWM */ diff --git a/buildroot/share/scripts/createTemperatureLookupMarlin.py b/buildroot/share/scripts/createTemperatureLookupMarlin.py index eb8c094957..5515681bfc 100755 --- a/buildroot/share/scripts/createTemperatureLookupMarlin.py +++ b/buildroot/share/scripts/createTemperatureLookupMarlin.py @@ -141,7 +141,7 @@ def main(argv): for temp in temps: adc = t.adc(temp) - print(" { OV(%7.2f), %4s }%s // v=%.3f\tr=%.3f\tres=%.3f degC/count" % (adc , temp, \ + print(" { OV(%7.2f), %4s }%s // v=%.3f\tr=%.3f\tres=%.3f degC/count" % (adc, temp, \ ',' if temp != temps[-1] else ' ', \ t.voltage(adc), \ t.resist( adc), \ diff --git a/buildroot/tests/BTT_GTR_V1_0 b/buildroot/tests/BTT_GTR_V1_0 index c6cb7d5feb..e40f3ffa53 100755 --- a/buildroot/tests/BTT_GTR_V1_0 +++ b/buildroot/tests/BTT_GTR_V1_0 @@ -36,7 +36,7 @@ opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 SERIAL_PORT -1 \ EXTRUDERS 3 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 \ SERVO1_PIN PE9 SERVO2_PIN PE11 \ SERVO_DELAY '{ 300, 300, 300 }' \ - SWITCHING_TOOLHEAD_X_POS '{ 215, 0 ,0 }' \ + SWITCHING_TOOLHEAD_X_POS '{ 215, 0, 0 }' \ MPC_HEATER_POWER '{ 40.0f, 40.0f, 40.0f }' \ MPC_BLOCK_HEAT_CAPACITY '{ 16.7f, 16.7f, 16.7f }' \ MPC_SENSOR_RESPONSIVENESS '{ 0.22f, 0.22f, 0.22f }' \ diff --git a/docs/Cutter.md b/docs/Cutter.md index 8f4b7e67aa..207036c6e8 100644 --- a/docs/Cutter.md +++ b/docs/Cutter.md @@ -4,7 +4,7 @@ With Marlin version 2.0.9.x or higher, Laser improvements were introduced that e ### Architecture -Laser selectable feature capability is defined through 4 global mode flags within G-code ,laser/spindle, planner and stepper routines. The default mode maintains the standard laser function. G-Codes are received, processed and parsed to determine what mode to set through M3, M4 and M5 commands. When the inline mode parameter set is detected, laser power processing will be driven through the planner and stepper routines. Handling of the initial power values and settings are performed by G-Code parsing and the laser/spindle routines. +Laser selectable feature capability is defined through 4 global mode flags within G-code, laser/spindle, planner and stepper routines. The default mode maintains the standard laser function. G-Codes are received, processed and parsed to determine what mode to set through M3, M4 and M5 commands. When the inline mode parameter set is detected, laser power processing will be driven through the planner and stepper routines. Handling of the initial power values and settings are performed by G-Code parsing and the laser/spindle routines. Inline power feeds from the block->inline_power variable into the planner's laser.power when in continuous power mode. Further power adjustment will be applied if the laser power trap feature is active otherwise laser.power is used as set in the stepper for the entire block. When laser power trap is active the power levels are step incremented during acceleration and step decremented during deceleration. diff --git a/ini/hc32.ini b/ini/hc32.ini index a99614beec..8a55e3b495 100644 --- a/ini/hc32.ini +++ b/ini/hc32.ini @@ -33,12 +33,12 @@ platform_packages = framework-hc32f46x-ddl@https://github.com/shadow578/framewor board = generic_hc32f460 build_src_filter = ${common.default_src_filter} + + build_type = release -build_flags = -D ARDUINO_ARCH_HC32 - -D PLATFORM_M997_SUPPORT # Enable M997 command - # NOTE: DDL and Arduino debug mode are - # automatically enabled with MARLIN_DEV_MODE - #-D __DEBUG # force DDL debug mode - #-D __CORE_DEBUG # force Arduino core debug mode +build_flags = -DARDUINO_ARCH_HC32 + -DPLATFORM_M997_SUPPORT # Enable M997 command + # NOTE: DDL and Arduino debug mode are + # automatically enabled with MARLIN_DEV_MODE + #-D__DEBUG # force DDL debug mode + #-D__CORE_DEBUG # force Arduino core debug mode # HC32 app configuration file board_build.app_config = Marlin/src/HAL/HC32/app_config.h From 8cb6e57789e76e5cf359f276b5993f9d8c771ac0 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 10 Apr 2025 00:31:25 +0000 Subject: [PATCH 076/101] [cron] Bump distribution date (2025-04-10) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index d071d96c66..6982c994d4 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-08" +//#define STRING_DISTRIBUTION_DATE "2025-04-10" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 13b8eee07e..4e7935271a 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-08" + #define STRING_DISTRIBUTION_DATE "2025-04-10" #endif /** From 893dddcbd1a7da69eeb09092fe265e12aa34539a Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 12 Apr 2025 13:12:31 -0700 Subject: [PATCH 077/101] =?UTF-8?q?=F0=9F=93=9D=20Malyan=20LCD=20uses=20en?= =?UTF-8?q?coders=20(#27781)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 69cae47ee1..af7e17ad05 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -3282,7 +3282,7 @@ #endif // -// Touch-screen LCD for Malyan M200/M300 printers +// LCD for Malyan M200/M300 printers // //#define MALYAN_LCD From d1947fac07e326c749c3617591872b7ff471ec79 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 13 Apr 2025 00:56:12 +0000 Subject: [PATCH 078/101] [cron] Bump distribution date (2025-04-13) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 6982c994d4..cb253de7bc 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-10" +//#define STRING_DISTRIBUTION_DATE "2025-04-13" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 4e7935271a..aa30ba6e18 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-10" + #define STRING_DISTRIBUTION_DATE "2025-04-13" #endif /** From 6d2dfcaa1cb55d11e3689094144ada1751fe2ff5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 12 Apr 2025 16:13:49 -0500 Subject: [PATCH 079/101] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20i2c=20encoder=20re?= =?UTF-8?q?port?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/feature/encoder_i2c.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index 55bde4ca62..3d9466f7ed 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -652,7 +652,7 @@ void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, else { if (noOffset) { const int32_t raw_count = encoders[idx].get_raw_count(); - SERIAL_CHAR(AXIS_CHAR(encoders[idx).get_axis()], ' '); + SERIAL_CHAR(AXIS_CHAR(encoders[idx].get_axis()), ' '); for (uint8_t j = 31; j > 0; j--) SERIAL_ECHO((bool)(0x00000001 & (raw_count >> j))); @@ -707,7 +707,7 @@ void I2CPositionEncodersMgr::change_module_address(const uint8_t oldaddr, const // and enable it (it will likely have failed initialization on power-up, before the address change). const int8_t idx = idx_from_addr(newaddr); if (idx >= 0 && !encoders[idx].get_active()) { - SERIAL_CHAR(AXIS_CHAR(encoders[idx).get_axis()]); + SERIAL_CHAR(AXIS_CHAR(encoders[idx].get_axis())); SERIAL_ECHOLNPGM(" axis encoder was not detected on printer startup. Trying again."); encoders[idx].set_active(encoders[idx].passes_test(true)); } From a55355d088c94b8c12bbccaf708fe986d0448c14 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 13 Apr 2025 00:55:58 -0500 Subject: [PATCH 080/101] =?UTF-8?q?=F0=9F=9A=B8=20FT=20Motion=20menu=20fix?= =?UTF-8?q?,=20neaten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/language/language_en.h | 4 ++-- Marlin/src/lcd/language/language_it.h | 4 ++-- Marlin/src/lcd/language/language_ru.h | 4 ++-- Marlin/src/lcd/language/language_tr.h | 4 ++-- Marlin/src/lcd/menu/menu_motion.cpp | 18 ++++++------------ Marlin/src/libs/numtostr.cpp | 2 +- 6 files changed, 15 insertions(+), 21 deletions(-) diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 54740c923e..686a0b759c 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -894,7 +894,7 @@ namespace LanguageNarrow_en { LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing"); LSTR MSG_FIXED_TIME_MOTION = _UxGT("Fixed-Time Motion"); - LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Comp. Mode:"); + LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Comp. Mode: $"); LSTR MSG_FTM_ZV = _UxGT("ZV"); LSTR MSG_FTM_ZVD = _UxGT("ZVD"); LSTR MSG_FTM_ZVDD = _UxGT("ZVDD"); @@ -905,7 +905,7 @@ namespace LanguageNarrow_en { LSTR MSG_FTM_MZV = _UxGT("MZV"); //LSTR MSG_FTM_ULENDO_FBS = _UxGT("Ulendo FBS"); //LSTR MSG_FTM_DISCTF = _UxGT("DISCTF"); - LSTR MSG_FTM_DYN_MODE = _UxGT("DF Mode:"); + LSTR MSG_FTM_DYN_MODE = _UxGT("DF Mode: $"); LSTR MSG_FTM_Z_BASED = _UxGT("Z-based"); LSTR MSG_FTM_MASS_BASED = _UxGT("Mass-based"); LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Base Freq."); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 1e81514440..c1b5366332 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -861,8 +861,8 @@ namespace LanguageNarrow_it { LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Appianamento"); LSTR MSG_FIXED_TIME_MOTION = _UxGT("Movimento a Tempo-Fisso"); - LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Modo Comp:"); - LSTR MSG_FTM_DYN_MODE = _UxGT("Modo DF:"); + LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Modo Comp: $"); + LSTR MSG_FTM_DYN_MODE = _UxGT("Modo DF: $"); LSTR MSG_FTM_Z_BASED = _UxGT("Base-Z"); LSTR MSG_FTM_MASS_BASED = _UxGT("Base-Massa"); LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Freq. base"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 92011f66a6..991fd638ef 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -811,7 +811,7 @@ namespace LanguageNarrow_ru { // did not translate as there is no local terms/slang yet LSTR MSG_FIXED_TIME_MOTION = _UxGT("FT Motion"); - LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Режим комп.:"); + LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Режим комп.: $"); LSTR MSG_FTM_ZV = _UxGT("ZV"); LSTR MSG_FTM_ZVD = _UxGT("ZVD"); LSTR MSG_FTM_EI = _UxGT("EI"); @@ -820,7 +820,7 @@ namespace LanguageNarrow_ru { LSTR MSG_FTM_MZV = _UxGT("MZV"); //LSTR MSG_FTM_ULENDO_FBS = _UxGT("Ulendo ФBС"); //LSTR MSG_FTM_DISCTF = _UxGT("DISCTF"); - LSTR MSG_FTM_DYN_MODE = _UxGT("DF Mode:"); + LSTR MSG_FTM_DYN_MODE = _UxGT("DF Mode: $"); LSTR MSG_FTM_Z_BASED = _UxGT("Z-based"); LSTR MSG_FTM_MASS_BASED = _UxGT("Mass-based"); LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Base Freq."); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index b52ded8db8..947f094fa6 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -796,7 +796,7 @@ namespace LanguageNarrow_tr { LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Yumuşatma"); LSTR MSG_FIXED_TIME_MOTION = _UxGT("Sabit Zamanlı Hareket"); - LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Telafi Modu:"); + LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Telafi Modu: $"); LSTR MSG_FTM_ZV = _UxGT("ZV"); LSTR MSG_FTM_ZVD = _UxGT("ZVD"); LSTR MSG_FTM_ZVDD = _UxGT("ZVDD"); @@ -807,7 +807,7 @@ namespace LanguageNarrow_tr { LSTR MSG_FTM_MZV = _UxGT("MZV"); //LSTR MSG_FTM_ULENDO_FBS = _UxGT("Ulendo FBS"); //LSTR MSG_FTM_DISCTF = _UxGT("DISCTF"); - LSTR MSG_FTM_DYN_MODE = _UxGT("DF Modu:"); + LSTR MSG_FTM_DYN_MODE = _UxGT("DF Modu: $"); LSTR MSG_FTM_Z_BASED = _UxGT("Z-based"); LSTR MSG_FTM_MASS_BASED = _UxGT("Mass-based"); LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Base Freq."); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index f6f13e2a4e..e2adbfded2 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -426,8 +426,7 @@ void menu_move() { // Show only when FT Motion is active (or optionally always show) if (c.active || ENABLED(FT_MOTION_NO_MENU_TOGGLE)) { #if HAS_X_AXIS - SUBMENU_N(X_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); - MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[X_AXIS]); MENU_ITEM_ADDON_END(); + SUBMENU_N_S(X_AXIS, shaper_name[X_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); if (AXIS_HAS_SHAPER(X)) { EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq.x, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params); @@ -437,8 +436,7 @@ void menu_move() { } #endif #if HAS_Y_AXIS - SUBMENU_N(Y_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); - MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[Y_AXIS]); MENU_ITEM_ADDON_END(); + SUBMENU_N_S(Y_AXIS, shaper_name[Y_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); if (AXIS_HAS_SHAPER(Y)) { EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq.y, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params); @@ -449,8 +447,7 @@ void menu_move() { #endif #if HAS_DYNAMIC_FREQ - SUBMENU(MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); - MENU_ITEM_ADDON_START_RJ(11); lcd_put_u8str(dmode); MENU_ITEM_ADDON_END(); + SUBMENU_S(dmode, MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); if (c.dynFreqMode != dynFreqMode_DISABLED) { #if HAS_X_AXIS EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_DFREQ_K_N, &c.dynFreqK.x, 0.0f, 20.0f); @@ -489,16 +486,13 @@ void menu_move() { BACK_ITEM(MSG_TUNE); #if HAS_X_AXIS - SUBMENU_N(X_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); - MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[X_AXIS]); MENU_ITEM_ADDON_END(); + SUBMENU_N_S(X_AXIS, shaper_name[X_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); #endif #if HAS_Y_AXIS - SUBMENU_N(Y_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); - MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[Y_AXIS]); MENU_ITEM_ADDON_END(); + SUBMENU_N_S(Y_AXIS, shaper_name[Y_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); #endif #if HAS_DYNAMIC_FREQ - SUBMENU(MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); - MENU_ITEM_ADDON_START_RJ(dmode.length()); lcd_put_u8str(dmode); MENU_ITEM_ADDON_END(); + SUBMENU_S(dmode, MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); #endif #if HAS_EXTRUDERS EDIT_ITEM(bool, MSG_LINEAR_ADVANCE, &c.linearAdvEna); diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index aa00b5d6e2..830e9b356b 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -406,8 +406,8 @@ inline const char* ftostrX2rj(const_float_t f, const int index=1) { case 1: conv[1] = RJDIGIT(i, 100000); case 2: conv[2] = RJDIGIT(i, 10000); case 3: conv[3] = RJDIGIT(i, 1000); - case 4: conv[4] = RJDIGIT(i, 100); } + conv[4] = DIGIMOD(i, 100); conv[5] = '.'; conv[6] = DIGIMOD(i, 10); conv[7] = DIGIMOD(i, 1); From aee25d75ea2b8e8b0a6b90fb366d0fc9ea2db584 Mon Sep 17 00:00:00 2001 From: narno2202 <130909513+narno2202@users.noreply.github.com> Date: Sun, 13 Apr 2025 08:36:21 +0200 Subject: [PATCH 081/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20DGU?= =?UTF-8?q?SScreenHandler=20hack=20for=20MKS=20(#27789)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp index 38b3d93853..79353a4e23 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp @@ -326,7 +326,7 @@ void DGUSScreenHandler::sendHeaterStatusToDisplay(DGUS_VP_Variable &var) { void DGUSScreenHandler::sdCardError() { DGUSScreenHandler::sdCardRemoved(); #if DGUS_LCD_UI_MKS - sendInfoScreenMKS(F("NOTICE"), nullptr, F("SD card error"), nullptr, mks_language_index); + screen.sendInfoScreenMKS(F("NOTICE"), nullptr, F("SD card error"), nullptr, mks_language_index); #else sendInfoScreen(F("NOTICE"), nullptr, F("SD card error"), nullptr); #endif From c173ecd89ae636c2deaf7310a626569b6a6c4797 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 13 Apr 2025 02:06:50 -0500 Subject: [PATCH 082/101] =?UTF-8?q?=F0=9F=8E=A8=20Misc.=20serial=20echo/ch?= =?UTF-8?q?ar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/MarlinCore.cpp | 6 ++-- Marlin/src/core/bug_on.h | 8 ++--- Marlin/src/core/utility.cpp | 11 ++---- Marlin/src/feature/cancel_object.cpp | 2 +- Marlin/src/feature/encoder_i2c.cpp | 53 ++++++++++++---------------- Marlin/src/libs/hex_print.cpp | 2 +- Marlin/src/sd/cardreader.cpp | 23 ++++-------- 7 files changed, 40 insertions(+), 65 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index bfe69ba94e..f2b2589ee6 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -428,8 +428,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { if (gcode.stepper_max_timed_out(ms)) { SERIAL_ERROR_START(); - SERIAL_ECHOPGM(STR_KILL_PRE); - SERIAL_ECHOLNPGM(STR_KILL_INACTIVE_TIME, parser.command_ptr); + SERIAL_ECHOLN(F(STR_KILL_PRE), F(STR_KILL_INACTIVE_TIME), parser.command_ptr); kill(); } @@ -497,8 +496,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { // ---------------------------------------------------------------- if (killCount >= KILL_DELAY) { SERIAL_ERROR_START(); - SERIAL_ECHOPGM(STR_KILL_PRE); - SERIAL_ECHOLNPGM(STR_KILL_BUTTON); + SERIAL_ECHOLN(F(STR_KILL_PRE), F(STR_KILL_BUTTON)); kill(); } #endif diff --git a/Marlin/src/core/bug_on.h b/Marlin/src/core/bug_on.h index 7f1243ed40..8ff565ff73 100644 --- a/Marlin/src/core/bug_on.h +++ b/Marlin/src/core/bug_on.h @@ -27,12 +27,12 @@ // Useful macro for stopping the CPU on an unexpected condition // This is used like SERIAL_ECHOPGM, that is: a key-value call of the local variables you want // to dump to the serial port before stopping the CPU. - // \/ Don't replace by SERIAL_ECHOPGM since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building - #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLNPGM(": "); SERIAL_ECHOLNPGM(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) + // \/ Don't use SERIAL_ECHOPGM with ONLY_FILENAME. It can't be a PGM string, + #define BUG_ON(V...) do { SERIAL_ECHOLN(ONLY_FILENAME, __LINE__, F(": ")); SERIAL_ECHOLNPGM(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) #elif ENABLED(MARLIN_DEV_MODE) // Don't stop the CPU here, but at least dump the bug on the serial port - // \/ Don't replace by SERIAL_ECHOPGM since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building - #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLNPGM(": BUG!"); SERIAL_ECHOLNPGM(V); SERIAL_FLUSHTX(); } while(0) + // \/ Don't use SERIAL_ECHOPGM with ONLY_FILENAME. It can't be a PGM string, + #define BUG_ON(V...) do { SERIAL_ECHOLN(ONLY_FILENAME, __LINE__, F(": BUG!")); SERIAL_ECHOLNPGM(V); SERIAL_FLUSHTX(); } while(0) #else // Release mode, let's ignore the bug #define BUG_ON(V...) NOOP diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index 6a8452bfaa..cc49cf2cfb 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -154,10 +154,8 @@ void safe_delay(millis_t ms) { const float rz = bedlevel.get_z_correction(current_position); SERIAL_ECHO(ftostr43sign(rz, '+')); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - if (planner.z_fade_height) { - SERIAL_ECHOPGM(" (", ftostr43sign(rz * planner.fade_scaling_factor_for_z(current_position.z), '+')); - SERIAL_CHAR(')'); - } + if (planner.z_fade_height) + SERIAL_ECHO(F(" ("), ftostr43sign(rz * planner.fade_scaling_factor_for_z(current_position.z), '+'), C(')')); #endif #endif } @@ -176,10 +174,7 @@ void safe_delay(millis_t ms) { SERIAL_ECHOPGM("MBL Adjustment Z", ftostr43sign(z_offset + z_correction, '+')); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) if (planner.z_fade_height) { - SERIAL_ECHOPGM(" (", ftostr43sign( - z_offset + z_correction * planner.fade_scaling_factor_for_z(current_position.z), '+' - )); - SERIAL_CHAR(')'); + SERIAL_ECHO(F(" ("), ftostr43sign(z_offset + z_correction * planner.fade_scaling_factor_for_z(current_position.z), '+'), C(')')); } #endif } diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index 818661b1f0..c17c9988e4 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -72,7 +72,7 @@ void CancelObject::report() { SERIAL_ECHO_START(); SERIAL_ECHOPGM("Canceled:"); for (int i = 0; i < state.object_count; i++) - if (TEST(state.canceled, i)) { SERIAL_CHAR(' '); SERIAL_ECHO(i); } + if (TEST(state.canceled, i)) SERIAL_ECHO(C(' '), i); SERIAL_EOL(); } diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index 3d9466f7ed..1930176aa6 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -168,8 +168,7 @@ void I2CPositionEncoder::update() { float sumP = 0; for (uint8_t i = 0; i < I2CPE_ERR_PRST_ARRAY_SIZE; ++i) sumP += errPrst[i]; const int32_t errorP = int32_t(sumP * RECIPROCAL(I2CPE_ERR_PRST_ARRAY_SIZE)); - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" : CORRECT ERR ", errorP * planner.mm_per_step[encoderAxis], "mm"); + SERIAL_ECHOLN(C(AXIS_CHAR(encoderAxis)), F(" : CORRECT ERR "), errorP * planner.mm_per_step[encoderAxis], F("mm")); babystep.add_steps(encoderAxis, -LROUND(errorP)); errPrstIdx = 0; } @@ -188,8 +187,7 @@ void I2CPositionEncoder::update() { if (ABS(error) > I2CPE_ERR_CNT_THRESH * planner.settings.axis_steps_per_mm[encoderAxis]) { const millis_t ms = millis(); if (ELAPSED(ms, nextErrorCountTime)) { - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" : LARGE ERR ", error, "; diffSum=", diffSum); + SERIAL_ECHOLN(C(AXIS_CHAR(encoderAxis)), F(" : LARGE ERR "), error, F("; diffSum="), diffSum); errorCount++; nextErrorCountTime = ms + I2CPE_ERR_CNT_DEBOUNCE_MS; } @@ -208,8 +206,7 @@ void I2CPositionEncoder::set_homed() { homed = trusted = true; #ifdef I2CPE_DEBUG - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" axis encoder homed, offset of ", zeroOffset, " ticks."); + SERIAL_ECHO(C(AXIS_CHAR(encoderAxis)), F(" axis encoder homed, offset of "), zeroOffset, F(" ticks.\n")); #endif } } @@ -219,8 +216,7 @@ void I2CPositionEncoder::set_unhomed() { homed = trusted = false; #ifdef I2CPE_DEBUG - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" axis encoder unhomed."); + SERIAL_ECHO(C(AXIS_CHAR(encoderAxis)), F(" axis encoder unhomed.\n")); #endif } @@ -247,10 +243,8 @@ float I2CPositionEncoder::get_axis_error_mm(const bool report) { diff = actual - target, error = ABS(diff) > 10000 ? 0 : diff; // Huge error is a bad reading - if (report) { - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" axis target=", target, "mm; actual=", actual, "mm; err=", error, "mm"); - } + if (report) + SERIAL_ECHO(C(AXIS_CHAR(encoderAxis)), F(" axis target="), target, F("mm; actual="), actual, F("mm; err="), error, F("mm\n")); return error; } @@ -282,10 +276,8 @@ int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) { errorPrev = error; - if (report) { - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" axis target=", target, "; actual=", encoderCountInStepperTicksScaled, "; err=", error); - } + if (report) + SERIAL_ECHOLN(C(AXIS_CHAR(encoderAxis)), F(" axis target="), target, F("; actual="), encoderCountInStepperTicksScaled, F("; err="), error); if (suppressOutput) { if (report) SERIAL_ECHOLNPGM("!Discontinuity. Suppressing error."); @@ -647,23 +639,22 @@ void I2CPositionEncodersMgr::init() { void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, const bool noOffset) { CHECK_IDX(); - if (units) + if (units) { SERIAL_ECHOLN(noOffset ? encoders[idx].mm_from_count(encoders[idx].get_raw_count()) : encoders[idx].get_position_mm()); - else { - if (noOffset) { - const int32_t raw_count = encoders[idx].get_raw_count(); - SERIAL_CHAR(AXIS_CHAR(encoders[idx].get_axis()), ' '); - - for (uint8_t j = 31; j > 0; j--) - SERIAL_ECHO((bool)(0x00000001 & (raw_count >> j))); - - SERIAL_ECHO((bool)(0x00000001 & raw_count)); - SERIAL_CHAR(' '); - SERIAL_ECHOLN(raw_count); - } - else - SERIAL_ECHOLN(encoders[idx].get_position()); + return; } + + if (noOffset) { + const int32_t raw_count = encoders[idx].get_raw_count(); + SERIAL_CHAR(AXIS_CHAR(encoders[idx].get_axis()), ' '); + + for (uint8_t j = 31; j >= 0; j--) + SERIAL_ECHO(TEST32(raw_count, j)); + + SERIAL_ECHOLN(C(' '), raw_count); + } + else + SERIAL_ECHOLN(encoders[idx].get_position()); } void I2CPositionEncodersMgr::change_module_address(const uint8_t oldaddr, const uint8_t newaddr) { diff --git a/Marlin/src/libs/hex_print.cpp b/Marlin/src/libs/hex_print.cpp index 9ff3fc6eb2..f0095b18ce 100644 --- a/Marlin/src/libs/hex_print.cpp +++ b/Marlin/src/libs/hex_print.cpp @@ -59,7 +59,7 @@ char* hex_address(const void * const a) { void print_hex_nybble(const uint8_t n) { SERIAL_CHAR(hex_nybble(n)); } void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } void print_hex_word(const uint16_t w) { SERIAL_ECHO(_hex_word(w)); } -void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } +void print_hex_address(const void * const a) { SERIAL_ECHO(hex_address(a)); } void print_hex_long(const uint32_t w, const char delimiter/*='\0'*/, const bool prefix/*=false*/) { if (prefix) SERIAL_ECHOPGM("0x"); diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 68b5846c2f..647e071c72 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -330,24 +330,21 @@ void CardReader::printListing(MediaFile parent, const char * const prepend, cons } } else if (is_visible_entity(p OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin))) { - if (prepend) { SERIAL_ECHO(prepend); SERIAL_CHAR('/'); } - SERIAL_ECHO(createFilename(filename, p)); - SERIAL_CHAR(' '); - SERIAL_ECHO(p.fileSize); + if (prepend) SERIAL_ECHO(prepend, C('/')); + SERIAL_ECHO(createFilename(filename, p), C(' '), p.fileSize); if (includeTime) { - SERIAL_CHAR(' '); uint16_t crmodDate = p.lastWriteDate, crmodTime = p.lastWriteTime; if (crmodDate < p.creationDate || (crmodDate == p.creationDate && crmodTime < p.creationTime)) { crmodDate = p.creationDate; crmodTime = p.creationTime; } - SERIAL_ECHOPGM("0x", hex_word(crmodDate)); + SERIAL_ECHOPGM(" 0x", hex_word(crmodDate)); print_hex_word(crmodTime); } #if ENABLED(LONG_FILENAME_HOST_SUPPORT) if (includeLong) { SERIAL_CHAR(' '); - if (prependLong) { SERIAL_ECHO(prependLong); SERIAL_CHAR('/'); } + if (prependLong) SERIAL_ECHO(prependLong, C('/')); SERIAL_ECHO(longFilename[0] ? longFilename : filename); } #endif @@ -470,10 +467,7 @@ void CardReader::printSelectedFilename() { SERIAL_ECHO(dosFilename); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) selectFileByName(dosFilename); - if (longFilename[0]) { - SERIAL_CHAR(' '); - SERIAL_ECHO(longFilename); - } + if (longFilename[0]) SERIAL_ECHO(C(' '), longFilename); #endif } else @@ -856,11 +850,8 @@ void CardReader::report_status(TERN_(QUIETER_AUTO_REPORT_SD_STATUS, const bool i if (has_job) old_sdpos = sdpos; #endif - if (has_job) { - SERIAL_ECHOPGM(STR_SD_PRINTING_BYTE, sdpos); - SERIAL_CHAR('/'); - SERIAL_ECHOLN(filesize); - } + if (has_job) + SERIAL_ECHOLN(F(STR_SD_PRINTING_BYTE), sdpos, C('/'), filesize); else SERIAL_ECHOLNPGM(STR_SD_NOT_PRINTING); } From 9a6bf16938eaa1bbb8ba4e15c691ccc53f10c371 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 13 Apr 2025 03:18:35 -0500 Subject: [PATCH 083/101] =?UTF-8?q?=F0=9F=9A=B8=20Some=20default=20filamen?= =?UTF-8?q?t=20runout=20pins?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/mega/pins_HJC2560C_REV2.h | 12 ++++++++---- Marlin/src/pins/ramps/pins_ULTIMAIN_2.h | 10 ++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h index 38e6617f51..4b454f2968 100644 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -22,7 +22,7 @@ #pragma once /** - * Geeetech HJC2560-C Rev 2.x board pin assignments + * Geeetech HJC2560-C Rev 1.x and 2.x board pin assignments * ATmega2560 */ @@ -78,6 +78,13 @@ #endif #define DEFAULT_PWM_MOTOR_CURRENT { 1300, 1300, 1250 } +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 24 // Filament runout +#endif + // // Temperature Sensors // @@ -138,9 +145,6 @@ //#ifndef LCD_CONTRAST_PIN // #define LCD_CONTRAST_PIN 5 // LCD_Contrast //#endif - #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 24 // Filament runout - #endif #else #define LCD_PINS_D5 21 #define LCD_PINS_D6 5 diff --git a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h index 448c79a8d2..4633bfc037 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h @@ -89,6 +89,16 @@ #endif #define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250} +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 54 // ADC0 +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN 55 // ADC1 +#endif + // // Temperature Sensors // From db427415376db9ed4f4287a6a5b6b8842575446d Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 13 Apr 2025 20:27:45 +1200 Subject: [PATCH 084/101] =?UTF-8?q?=F0=9F=94=A7=20Raise=20MBL=20grid=20siz?= =?UTF-8?q?e=20limit=20(#27790)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 2 +- Marlin/src/inc/SanityCheck.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index af7e17ad05..faa6f56843 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2276,7 +2276,7 @@ //=========================================================================== #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed - #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_X 3 #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index fa06bac9f5..c40a2f7632 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1649,8 +1649,8 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #elif ENABLED(MESH_BED_LEVELING) #if ENABLED(DELTA) #error "MESH_BED_LEVELING is not compatible with DELTA printers." - #elif (GRID_MAX_POINTS_X) > 9 || (GRID_MAX_POINTS_Y) > 9 - #error "GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y must be less than 10 for MBL." + #elif !WITHIN(GRID_MAX_POINTS_X, 2, 255) || !WITHIN(GRID_MAX_POINTS_Y, 2, 255) + #error "GRID_MAX_POINTS_[XY] must be between 2 and 255 for MESH_BED_LEVELING." #endif #endif From 69464790e220a7a96eb92d3f47a57c44dadd2c75 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 14 Apr 2025 00:32:24 +0000 Subject: [PATCH 085/101] [cron] Bump distribution date (2025-04-14) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index cb253de7bc..008997c83a 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-13" +//#define STRING_DISTRIBUTION_DATE "2025-04-14" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index aa30ba6e18..ba062ee43d 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-13" + #define STRING_DISTRIBUTION_DATE "2025-04-14" #endif /** From 7d82f95df879250286c6cf230784bc0d217fda19 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 14 Apr 2025 16:45:12 -0500 Subject: [PATCH 086/101] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20DWIN=5FCREALITY=5F?= =?UTF-8?q?LCD=5FSTD=5FICONS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/e3v2/common/dwin_set.h | 38 ++++++++++++++++++++------- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 16 +++++------ Marlin/src/lcd/e3v2/jyersui/dwin.h | 32 ++-------------------- 3 files changed, 38 insertions(+), 48 deletions(-) diff --git a/Marlin/src/lcd/e3v2/common/dwin_set.h b/Marlin/src/lcd/e3v2/common/dwin_set.h index 644efb40ba..f59bb74cd3 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_set.h +++ b/Marlin/src/lcd/e3v2/common/dwin_set.h @@ -132,17 +132,7 @@ #define ICON_Printer_0 93 #define ICON_Box 200 #define ICON_Checkbox 201 -#define ICON_Fade 202 -#define ICON_Mesh 203 -#define ICON_Tilt 204 -#define ICON_Brightness 205 #define ICON_Probe 206 -#define ICON_AxisD 249 -#define ICON_AxisBR 250 -#define ICON_AxisTR 251 -#define ICON_AxisBL 252 -#define ICON_AxisTL 253 -#define ICON_AxisC 254 #define ICON_Folder ICON_More #define ICON_AdvSet ICON_Language @@ -162,3 +152,31 @@ #define ICON_FWRetZRaise ICON_MoveZ #define ICON_FWRecSpeed ICON_Setspeed #define ICON_FWRecExtra ICON_StepE + +#if DISABLED(DWIN_CREALITY_LCD_STD_ICONS) + // Index of custom icons should be >= CUSTOM_ICON_START + #define CUSTOM_ICON_START 200 + #define ICON_Checkbox_F ICON_Box + #define ICON_Checkbox_T ICON_Checkbox + #define ICON_Fade 202 + #define ICON_Mesh 203 + #define ICON_Tilt 204 + #define ICON_Brightness 205 + #define ICON_AxisD 249 + #define ICON_AxisBR 250 + #define ICON_AxisTR 251 + #define ICON_AxisBL 252 + #define ICON_AxisTL 253 + #define ICON_AxisC 254 +#else + #define ICON_Fade ICON_Version + #define ICON_Mesh ICON_Version + #define ICON_Tilt ICON_Version + #define ICON_Brightness ICON_Version + #define ICON_AxisD ICON_Axis + #define ICON_AxisBR ICON_Axis + #define ICON_AxisTR ICON_Axis + #define ICON_AxisBL ICON_Axis + #define ICON_AxisTL ICON_Axis + #define ICON_AxisC ICON_Axis +#endif diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 5811ac11bb..d582b96ed7 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -523,18 +523,18 @@ void JyersDWIN::drawMenuItem(const uint8_t row, const uint8_t icon/*=0*/, FSTR_P } void JyersDWIN::drawCheckbox(const uint8_t row, const bool value) { - #if ENABLED(DWIN_CREALITY_LCD_CUSTOM_ICONS) // Draw appropriate checkbox icon + #if DISABLED(DWIN_CREALITY_LCD_STD_ICONS) // Draw appropriate checkbox icon dwinIconShow(ICON, (value ? ICON_Checkbox_T : ICON_Checkbox_F), 226, MBASE(row) - 3); #else // Draw a basic checkbox using rectangles and lines dwinDrawRectangle(1, COLOR_BG_BLACK, 226, MBASE(row) - 3, 226 + 20, MBASE(row) - 3 + 20); - dwinDrawRectangle(0, COLOR_WHITE, 226, MBASE(row) - 3, 226 + 20, MBASE(row) - 3 + 20); + dwinDrawRectangle(0, COLOR_WHITE, 226, MBASE(row) - 3, 226 + 20, MBASE(row) - 3 + 20); if (value) { - dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 11, 226 + 8, MBASE(row) - 3 + 17); - dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 17, 226 + 19, MBASE(row) - 3 + 1); - dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 12, 226 + 8, MBASE(row) - 3 + 18); - dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 18, 226 + 19, MBASE(row) - 3 + 2); - dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 13, 226 + 8, MBASE(row) - 3 + 19); - dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 19, 226 + 19, MBASE(row) - 3 + 3); + dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 11, 226 + 8, MBASE(row) - 3 + 17); + dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 17, 226 + 19, MBASE(row) - 3 + 1); + dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 12, 226 + 8, MBASE(row) - 3 + 18); + dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 18, 226 + 19, MBASE(row) - 3 + 2); + dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 13, 226 + 8, MBASE(row) - 3 + 19); + dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 19, 226 + 19, MBASE(row) - 3 + 3); } #endif } diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.h b/Marlin/src/lcd/e3v2/jyersui/dwin.h index 48e413efbb..40c7490e30 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.h +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.h @@ -26,7 +26,6 @@ */ #include "dwin_lcd.h" -#include "../common/dwin_set.h" #include "../common/dwin_font.h" #include "../common/dwin_color.h" #include "../common/encoder.h" @@ -35,7 +34,8 @@ #include "../../../inc/MarlinConfigPre.h" -//#define DWIN_CREALITY_LCD_CUSTOM_ICONS +#define DWIN_CREALITY_LCD_STD_ICONS +#include "../common/dwin_set.h" enum processID : uint8_t { Proc_Main, Proc_Print, Proc_Menu, Proc_Value, Proc_Option, @@ -120,34 +120,6 @@ enum menuID : uint8_t { ID_PreheatHotend }; -// Custom icons -#if ENABLED(DWIN_CREALITY_LCD_CUSTOM_ICONS) - // index of every custom icon should be >= CUSTOM_ICON_START - #define CUSTOM_ICON_START ICON_Checkbox_F - #define ICON_Checkbox_F 200 - #define ICON_Checkbox_T 201 - #define ICON_Fade 202 - #define ICON_Mesh 203 - #define ICON_Tilt 204 - #define ICON_Brightness 205 - #define ICON_AxisD 249 - #define ICON_AxisBR 250 - #define ICON_AxisTR 251 - #define ICON_AxisBL 252 - #define ICON_AxisTL 253 - #define ICON_AxisC 254 -#else - #define ICON_Fade ICON_Version - #define ICON_Mesh ICON_Version - #define ICON_Tilt ICON_Version - #define ICON_Brightness ICON_Version - #define ICON_AxisD ICON_Axis - #define ICON_AxisBR ICON_Axis - #define ICON_AxisTR ICON_Axis - #define ICON_AxisBL ICON_Axis - #define ICON_AxisTL ICON_Axis - #define ICON_AxisC ICON_Axis -#endif enum colorID : uint8_t { Default, White, Green, Cyan, Blue, Magenta, Red, Orange, Yellow, Brown, Black From b5d7b4aee6352009346fe968e6367215dcecb25b Mon Sep 17 00:00:00 2001 From: DerAndere <26200979+DerAndere1@users.noreply.github.com> Date: Mon, 14 Apr 2025 23:50:26 +0200 Subject: [PATCH 087/101] =?UTF-8?q?=E2=9C=A8=20DEFAULT=5FACCELERATION=5FSP?= =?UTF-8?q?INDLE=20(#27759)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 2 ++ Marlin/src/feature/spindle_laser.cpp | 27 ++++++++++++--- Marlin/src/feature/spindle_laser.h | 9 +++-- Marlin/src/inc/Conditionals-4-adv.h | 3 ++ Marlin/src/inc/SanityCheck.h | 2 ++ Marlin/src/lcd/e3v2/common/limits.h | 6 ++++ Marlin/src/lcd/e3v2/creality/dwin.cpp | 24 +++++++++++++ Marlin/src/lcd/e3v2/creality/dwin.h | 9 +++++ Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/menu/menu_advanced.cpp | 11 ++++++ Marlin/src/module/settings.cpp | 50 +++++++++++++++++++++++++-- buildroot/tests/mega1280 | 3 +- 12 files changed, 136 insertions(+), 11 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 2e0ca3d4a1..d4b4307b05 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3682,6 +3682,8 @@ #define SPEED_POWER_MIN 5000 // (RPM) #define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM #define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments) + + //#define DEFAULT_ACCELERATION_SPINDLE 1000 // (°/s/s) Default spindle acceleration (speed change with time) #endif #else diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index b83c1c1797..5f0ea7dd7b 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -43,6 +43,10 @@ bool SpindleLaser::enable_state; // Virtual uint8_t SpindleLaser::power, // Actual power output 0-255 ocr or "0 = off" > 0 = "on" SpindleLaser::last_power_applied; // = 0 // Basic power state tracking +#if HAS_SPINDLE_ACCELERATION + uint32_t SpindleLaser::acceleration_spindle_deg_per_s2; // (°/s/s) Spindle acceleration. Initialized by settings.load +#endif + #if ENABLED(LASER_FEATURE) cutter_test_pulse_t SpindleLaser::testPulse = 50; // (ms) Test fire pulse default duration uint8_t SpindleLaser::last_block_power; // = 0 // Track power changes for dynamic inline power @@ -100,7 +104,22 @@ void SpindleLaser::init() { #if ENABLED(HAL_CAN_SET_PWM_FREQ) && SPINDLE_LASER_FREQUENCY hal.set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), frequency); #endif - hal.set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); + #if HAS_SPINDLE_ACCELERATION + const int16_t diff = ocr - last_power_applied; + const uint8_t abs_diff = ABS(diff); + uint8_t current_ocr = last_power_applied; + // Duration between ocr increments. SPEED_POWER_MAX is in RPM. + const millis_t duration = (float(SPEED_POWER_MAX) * (60000.f / 2550.f) / float(acceleration_spindle_deg_per_s2)) * abs_diff; + millis_t next_ocr_change = millis() + duration; + while (current_ocr != ocr) { + while (PENDING(millis(), next_ocr_change)) idle(); + current_ocr += diff > 0 ? 1 : -1; + hal.set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), current_ocr ^ SPINDLE_LASER_PWM_OFF); + next_ocr_change += duration; + } + #else + hal.set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); + #endif } void SpindleLaser::set_ocr(const uint8_t ocr) { @@ -111,10 +130,10 @@ void SpindleLaser::init() { } void SpindleLaser::ocr_off() { + _set_ocr(0); #if PIN_EXISTS(SPINDLE_LASER_ENA) WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Cutter OFF #endif - _set_ocr(0); } #endif // SPINDLE_LASER_USE_PWM @@ -127,9 +146,8 @@ void SpindleLaser::init() { */ void SpindleLaser::apply_power(const uint8_t opwr) { if (enabled() || opwr == 0) { // 0 check allows us to disable where no ENA pin exists - // Test and set the last power used to improve performance + // Test the last power used to improve performance if (opwr == last_power_applied) return; - last_power_applied = opwr; // Handle PWM driven or just simple on/off #if ENABLED(SPINDLE_LASER_USE_PWM) if (CUTTER_UNIT_IS(RPM) && unitPower == 0) @@ -146,6 +164,7 @@ void SpindleLaser::apply_power(const uint8_t opwr) { WRITE(SPINDLE_LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE); isReadyForUI = true; #endif + last_power_applied = opwr; } else { #if PIN_EXISTS(SPINDLE_LASER_ENA) diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index a443d7df5e..a283f0786d 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -109,11 +109,14 @@ public: static uint8_t power, last_power_applied; // Basic power state tracking - static cutter_frequency_t frequency; // Set PWM frequency; range: 2K-50K + static cutter_frequency_t frequency; // (Hz) Laser/Spindle PWM frequency (2000..50000) - static cutter_power_t menuPower, // Power as set via LCD menu in PWM, Percentage or RPM - unitPower; // Power as displayed status in PWM, Percentage or RPM + static cutter_power_t menuPower, // Power as set via LCD menu in PWM, Percentage, or RPM + unitPower; // Power as displayed status in PWM, Percentage, or RPM + #if HAS_SPINDLE_ACCELERATION + static uint32_t acceleration_spindle_deg_per_s2; // (°/s/s) Spindle acceleration + #endif static void init(); #if ENABLED(HAL_CAN_SET_PWM_FREQ) && SPINDLE_LASER_FREQUENCY diff --git a/Marlin/src/inc/Conditionals-4-adv.h b/Marlin/src/inc/Conditionals-4-adv.h index 653a754700..109fca6b29 100644 --- a/Marlin/src/inc/Conditionals-4-adv.h +++ b/Marlin/src/inc/Conditionals-4-adv.h @@ -1090,6 +1090,9 @@ #define _CUTTER_POWER_RPM 3 #define _CUTTER_POWER(V) _CAT(_CUTTER_POWER_, V) #define CUTTER_UNIT_IS(V) (_CUTTER_POWER(CUTTER_POWER_UNIT) == _CUTTER_POWER(V)) + #if DEFAULT_ACCELERATION_SPINDLE + #define HAS_SPINDLE_ACCELERATION 1 + #endif #endif #if !defined(__AVR__) || !defined(USBCON) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index c40a2f7632..169f84983c 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -4072,6 +4072,8 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." #error "SPINDLE_LASER_PWM_INVERT is required for (SPINDLE|LASER)_FEATURE." #elif !(defined(SPEED_POWER_MIN) && defined(SPEED_POWER_MAX) && defined(SPEED_POWER_STARTUP)) #error "SPINDLE_LASER_USE_PWM equation constant(s) missing." + #elif DEFAULT_ACCELERATION_SPINDLE > SPEED_POWER_MAX - SPEED_POWER_MIN + #error "DEFAULT_ACCELERATION_SPINDLE must be <= SPEED_POWER_MAX - SPEED_POWER_MIN." #elif _PIN_CONFLICT(X_MIN) #error "SPINDLE_LASER_PWM_PIN conflicts with X_MIN_PIN." #elif _PIN_CONFLICT(X_MAX) diff --git a/Marlin/src/lcd/e3v2/common/limits.h b/Marlin/src/lcd/e3v2/common/limits.h index 560c8735a7..c773240b28 100644 --- a/Marlin/src/lcd/e3v2/common/limits.h +++ b/Marlin/src/lcd/e3v2/common/limits.h @@ -65,6 +65,12 @@ constexpr xyze_float_t max_acceleration_edit_values = #endif ; +#if HAS_SPINDLE_ACCELERATION + constexpr float min_acceleration_edit_values_spindle = 1, + default_acceleration_spindle = DEFAULT_ACCELERATION_SPINDLE, + max_acceleration_edit_values_spindle = default_acceleration_spindle * DEFAULT_MAX_MULTIPLIER; +#endif + // // Max Jerk limits // diff --git a/Marlin/src/lcd/e3v2/creality/dwin.cpp b/Marlin/src/lcd/e3v2/creality/dwin.cpp index fcbeecde83..56830086fd 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -1595,6 +1595,27 @@ void hmiMaxAccelerationXYZE() { drawEditInteger4(select_acc.now, hmiValues.maxAcceleration, true); } + +#if HAS_SPINDLE_ACCELERATION + + void hmiSpindleAcceleration() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + if (applyEncoder(encoder_diffState, hmiValues.spindleAcceleration)) { + checkkey = ID_SpindleAcceleration; + encoderRate.enabled = false; + cutter.spindle_acceleration_deg_per_s2 = hmiValues.spindleAcceleration; + drawEditInteger4(select_acc.now, hmiValues.spindleAcceleration); + return; + } + // SpindleAcceleration limit + LIMIT(hmiValues.spindleAcceleration, min_acceleration_edit_values_spindle, max_acceleration_edit_values_spindle); + // SpindleAcceleration value + drawEditInteger4(select_acc.now, hmiValues.spindleAcceleration, true); + } + +#endif // HAS_SPINDLE_ACCELERATION + #if ENABLED(CLASSIC_JERK) void hmiMaxJerkXYZE() { @@ -4283,6 +4304,9 @@ void dwinHandleScreen() { case ID_PrintSpeed: hmiPrintSpeed(); break; case ID_MaxSpeedValue: hmiMaxFeedspeedXYZE(); break; case ID_MaxAccelerationValue: hmiMaxAccelerationXYZE(); break; + #if HAS_SPINDLE_ACCELERATION + case ID_SpindleAccelerationValue: hmiSpindleAcceleration(); break; + #endif #if ENABLED(CLASSIC_JERK) case ID_MaxJerkValue: hmiMaxJerkXYZE(); break; #endif diff --git a/Marlin/src/lcd/e3v2/creality/dwin.h b/Marlin/src/lcd/e3v2/creality/dwin.h index fce52d8cf4..50723d015c 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.h +++ b/Marlin/src/lcd/e3v2/creality/dwin.h @@ -53,6 +53,9 @@ enum processID : uint8_t { #endif ID_MaxSpeed, ID_MaxSpeedValue, ID_MaxAcceleration, ID_MaxAccelerationValue, + #if HAS_SPINDLE_ACCELERATION + ID_SpindleAccelerationValue, + #endif ID_MaxJerk, ID_MaxJerkValue, ID_Step, ID_StepValue, ID_HomeOff, ID_HomeOffX, ID_HomeOffY, ID_HomeOffZ, @@ -105,6 +108,9 @@ typedef struct { int16_t printSpeed = 100; float maxFeedSpeed = 0; float maxAcceleration = 0; + #if HAS_SPINDLE_ACCELERATION + float spindleAcceleration = 0; + #endif float maxJerkScaled = 0; float maxStepScaled = 0; float offset_value = 0; @@ -203,6 +209,9 @@ void hmiPrintSpeed(); void hmiMaxFeedspeedXYZE(); void hmiMaxAccelerationXYZE(); +#if HAS_SPINDLE_ACCELERATION + void hmiSpindleAcceleration(); +#endif void hmiMaxJerkXYZE(); #if ENABLED(EDITABLE_STEPS_PER_UNIT) void hmiStepXYZE(); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 686a0b759c..d184c0358f 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -452,6 +452,7 @@ namespace LanguageNarrow_en { LSTR MSG_AMAX_EN = _UxGT("Max * Accel"); LSTR MSG_A_RETRACT = _UxGT("Retract Accel"); LSTR MSG_A_TRAVEL = _UxGT("Travel Accel"); + LSTR MSG_A_SPINDLE = _UxGT("Spindle Accel"); LSTR MSG_INPUT_SHAPING = _UxGT("Input Shaping"); LSTR MSG_SHAPING_ENABLE_N = _UxGT("Enable @ shaping"); LSTR MSG_SHAPING_DISABLE_N = _UxGT("Disable @ shaping"); diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 99ece89f27..8080a23ba4 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -37,6 +37,10 @@ #include "../../gcode/parser.h" #endif +#if HAS_SPINDLE_ACCELERATION + #include "../../feature/spindle_laser.h" +#endif + #if HAS_BED_PROBE #include "../../module/probe.h" #endif @@ -511,6 +515,9 @@ void menu_backlash(); #else const xyze_ulong_t &max_accel_edit_scaled = max_accel_edit; #endif + #if HAS_SPINDLE_ACCELERATION + constexpr uint32_t max_spindle_accel_edit = 99000; + #endif START_MENU(); BACK_ITEM(MSG_ADVANCED_SETTINGS); @@ -544,6 +551,10 @@ void menu_backlash(); EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS], 100, max_accel_edit_scaled.e, []{ planner.refresh_acceleration_rates(); }); #endif + #if HAS_SPINDLE_ACCELERATION + EDIT_ITEM_FAST(long5_25, MSG_A_SPINDLE, &cutter.acceleration_spindle_deg_per_s2, 100, max_spindle_accel_edit); + #endif + #ifdef XY_FREQUENCY_LIMIT EDIT_ITEM(int8, MSG_XY_FREQUENCY_LIMIT, &planner.xy_freq_limit_hz, 0, 100, planner.refresh_frequency_limit, true); editable.uint8 = uint8_t(LROUND(planner.xy_freq_min_speed_factor * 255)); // percent to u8 diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 4205261a3c..7062164dc9 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -60,6 +60,10 @@ #include "../HAL/shared/eeprom_api.h" #endif +#if HAS_SPINDLE_ACCELERATION + #include "../feature/spindle_laser.h" +#endif + #if HAS_BED_PROBE #include "probe.h" #endif @@ -252,6 +256,13 @@ typedef struct SettingsDataStruct { xyz_pos_t hotend_offset[HOTENDS - 1]; // M218 XYZ #endif + // + // Spindle Acceleration + // + #if HAS_SPINDLE_ACCELERATION + uint32_t acceleration_spindle; // cutter.acceleration_spindle_deg_per_s2 + #endif + // // FILAMENT_RUNOUT_SENSOR // @@ -941,7 +952,7 @@ void MarlinSettings::postprocess() { #endif // NUM_AXES // - // Hotend Offsets, if any + // Hotend Offsets // { #if HAS_HOTEND_OFFSET @@ -951,6 +962,16 @@ void MarlinSettings::postprocess() { #endif } + // + // Spindle Acceleration + // + { + #if HAS_SPINDLE_ACCELERATION + _FIELD_TEST(acceleration_spindle); + EEPROM_WRITE(cutter.acceleration_spindle_deg_per_s2); + #endif + } + // // Filament Runout Sensor // @@ -1985,7 +2006,7 @@ void MarlinSettings::postprocess() { #endif // NUM_AXES // - // Hotend Offsets, if any + // Hotend Offsets // { #if HAS_HOTEND_OFFSET @@ -1995,6 +2016,16 @@ void MarlinSettings::postprocess() { #endif } + // + // Spindle Acceleration + // + { + #if HAS_SPINDLE_ACCELERATION + _FIELD_TEST(acceleration_spindle); + EEPROM_READ(cutter.acceleration_spindle_deg_per_s2); + #endif + } + // // Filament Runout Sensor // @@ -2003,7 +2034,7 @@ void MarlinSettings::postprocess() { _FIELD_TEST(runout_sensor_enabled); EEPROM_READ(runout_sensor_enabled); #if HAS_FILAMENT_SENSOR - if (!validating) runout.enabled = runout_sensor_enabled < 0 ? FIL_RUNOUT_ENABLED_DEFAULT : runout_sensor_enabled; + if (!validating) runout.enabled = runout_sensor_enabled < 0 ? FIL_RUNOUT_ENABLED_DEFAULT : runout_sensor_enabled; #endif TERN_(HAS_FILAMENT_SENSOR, if (runout.enabled) runout.reset()); @@ -3286,14 +3317,27 @@ void MarlinSettings::reset() { TERN_(HAS_JUNCTION_DEVIATION, planner.junction_deviation_mm = float(JUNCTION_DEVIATION_MM)); + // + // Home Offset + // #if HAS_SCARA_OFFSET scara_home_offset.reset(); #elif HAS_HOME_OFFSET home_offset.reset(); #endif + // + // Hotend Offsets + // TERN_(HAS_HOTEND_OFFSET, reset_hotend_offsets()); + // + // Spindle Acceleration + // + #if HAS_SPINDLE_ACCELERATION + cutter.acceleration_spindle_deg_per_s2 = DEFAULT_ACCELERATION_SPINDLE; + #endif + // // Filament Runout Sensor // diff --git a/buildroot/tests/mega1280 b/buildroot/tests/mega1280 index 1b1a8f86b7..6d703ac8f6 100755 --- a/buildroot/tests/mega1280 +++ b/buildroot/tests/mega1280 @@ -19,7 +19,8 @@ restore_configs opt_set LCD_LANGUAGE an \ POWER_MONITOR_CURRENT_PIN 14 POWER_MONITOR_VOLTAGE_PIN 15 \ CLOSED_LOOP_ENABLE_PIN 44 CLOSED_LOOP_MOVE_COMPLETE_PIN 45 -opt_enable SPINDLE_FEATURE ULTIMAKERCONTROLLER LCD_BED_LEVELING EDITABLE_HOMING_FEEDRATE \ +opt_enable SPINDLE_FEATURE DEFAULT_ACCELERATION_SPINDLE \ + ULTIMAKERCONTROLLER LCD_BED_LEVELING EDITABLE_HOMING_FEEDRATE \ EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ SENSORLESS_BACKOFF_MM HOMING_BACKOFF_POST_MM HOME_Y_BEFORE_X CODEPENDENT_XY_HOMING \ MESH_BED_LEVELING ENABLE_LEVELING_FADE_HEIGHT MESH_G28_REST_ORIGIN \ From 5e8a5230a35400c9a9ce833f2b0de7ef865cdc6e Mon Sep 17 00:00:00 2001 From: feldi12 <25982433+feldi12@users.noreply.github.com> Date: Tue, 15 Apr 2025 00:08:40 +0200 Subject: [PATCH 088/101] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Optimize=20PID,=20?= =?UTF-8?q?increase=20PID=20range=20(#27740)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 2 +- Marlin/src/lcd/sovol_rts/sovol_rts.cpp | 6 +++--- Marlin/src/module/temperature.h | 13 +++++-------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index faa6f56843..91a3b342b6 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -899,7 +899,7 @@ #if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER) //#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay - #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + #define PID_FUNCTIONAL_RANGE 20 // If the temperature difference between the target temperature and the actual temperature // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. //#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of flash) diff --git a/Marlin/src/lcd/sovol_rts/sovol_rts.cpp b/Marlin/src/lcd/sovol_rts/sovol_rts.cpp index c92850494b..dcd5d9b384 100644 --- a/Marlin/src/lcd/sovol_rts/sovol_rts.cpp +++ b/Marlin/src/lcd/sovol_rts/sovol_rts.cpp @@ -1312,9 +1312,9 @@ void RTS::handleData() { #endif #if ENABLED(PIDTEMPBED) - case Hot_Bed_P: thermalManager.temp_bed.pid.Kp = float(recdat.data[0]) / 100.0f; break; - case Hot_Bed_I: thermalManager.temp_bed.pid.Ki = float(recdat.data[0]) * 8.0f / 10000.0f; break; - case Hot_Bed_D: thermalManager.temp_bed.pid.Kd = float(recdat.data[0]) / 0.8f; break; + case Hot_Bed_P: thermalManager.temp_bed.pid.set_Kp(float(recdat.data[0]) / 100.0f); break; + case Hot_Bed_I: thermalManager.temp_bed.pid.set_Ki(float(recdat.data[0]) * 8.0f / 10000.0f); break; + case Hot_Bed_D: thermalManager.temp_bed.pid.set_Kd(float(recdat.data[0]) / 0.8f); break; #endif #if HAS_X_AXIS diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 934b1b1246..77c16bba0a 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -173,7 +173,7 @@ typedef struct { float p, i, d, c, f; } raw_pidcf_t; struct PID_t { protected: bool pid_reset = true; - float temp_iState = 0.0f, temp_dState = 0.0f; + float temp_dState = 0; float work_p = 0, work_i = 0, work_d = 0; public: @@ -217,17 +217,14 @@ typedef struct { float p, i, d, c, f; } raw_pidcf_t; } else { if (pid_reset) { + work_i = 0; + work_d = 0; pid_reset = false; - temp_iState = 0.0; - work_d = 0.0; } - const float max_power_over_i_gain = float(MAX_POW) / Ki - float(MIN_POW); - temp_iState = constrain(temp_iState + pid_error, 0, max_power_over_i_gain); - work_p = Kp * pid_error; - work_i = Ki * temp_iState; - work_d = work_d + PID_K2 * (Kd * (temp_dState - current) - work_d); + work_i = constrain(work_i + Ki * pid_error, 0, float(MAX_POW - MIN_POW)); + work_d += (Kd * (temp_dState - current) - work_d) * PID_K2; output_pow = constrain(work_p + work_i + work_d + float(MIN_POW), 0, MAX_POW); } From 7cd1b7708f1679015a9247876ca3f0367a2fc3a5 Mon Sep 17 00:00:00 2001 From: B Date: Mon, 14 Apr 2025 15:52:51 -0700 Subject: [PATCH 089/101] =?UTF-8?q?=F0=9F=90=9B=20Fix=20Servos=20in=20GD32?= =?UTF-8?q?=20HAL=20(#27791)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/GD32_MFL/Servo.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Marlin/src/HAL/GD32_MFL/Servo.cpp b/Marlin/src/HAL/GD32_MFL/Servo.cpp index d5f8533544..6cbcbc049b 100644 --- a/Marlin/src/HAL/GD32_MFL/Servo.cpp +++ b/Marlin/src/HAL/GD32_MFL/Servo.cpp @@ -41,23 +41,26 @@ static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityG // This must be called after the MFL Servo class has initialized the timer. // To be safe this is currently called after every call to attach(). static void fixServoTimerInterruptPriority() { - NVIC_SetPriority(getTimerUpIRQ(TIMER_SERVO), servo_interrupt_priority); + auto& servoTimerIdx = GeneralTimer::get_instance(static_cast(TIMER_SERVO)); + NVIC_SetPriority(servoTimerIdx.getTimerUpIRQ(), servo_interrupt_priority); } // Default constructor for libServo class. // Initializes the servo delay, pause state, and pause value. // Registers the servo instance in the servos array. -libServo::libServo() : delay(servoDelay[servoCount]), +libServo::libServo() : + delay(servoDelay[servoCount]), was_attached_before_pause(false), - value_before_pause(0) { + value_before_pause(0) +{ servos[servoCount++] = this; } // Attaches a servo to a specified pin. int8_t libServo::attach(const int pin) { if (servoCount >= MAX_SERVOS) return -1; - if (pin > 0) servo_pin = pin; - auto result = mflServo.attach(servo_pin); + if (pin > 0) servoPin = pin; + auto result = mflServo.attach(servoPin); fixServoTimerInterruptPriority(); return result; } @@ -65,8 +68,8 @@ int8_t libServo::attach(const int pin) { // Attaches a servo to a specified pin with minimum and maximum pulse widths. int8_t libServo::attach(const int pin, const int min, const int max) { if (servoCount >= MAX_SERVOS) return -1; - if (pin > 0) servo_pin = pin; - auto result = mflServo.attach(servo_pin, min, max); + if (pin > 0) servoPin = pin; + auto result = mflServo.attach(servoPin, min, max); fixServoTimerInterruptPriority(); return result; } From 1d4c002c2ab0ed67edb3a7fcc2f5463844f02d7c Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 15 Apr 2025 00:30:55 +0000 Subject: [PATCH 090/101] [cron] Bump distribution date (2025-04-15) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 008997c83a..11822b4b13 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-14" +//#define STRING_DISTRIBUTION_DATE "2025-04-15" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index ba062ee43d..65e128bdf9 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-14" + #define STRING_DISTRIBUTION_DATE "2025-04-15" #endif /** From 1242e875aadcb5b5ef8a9f54fd99f32a0adbdde8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 15 Apr 2025 15:49:23 -0500 Subject: [PATCH 091/101] =?UTF-8?q?=F0=9F=9A=B8=20More=20frequent=20button?= =?UTF-8?q?=20polling=20(#27797)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 2 ++ Marlin/src/inc/Conditionals-5-post.h | 4 ++++ Marlin/src/module/temperature.cpp | 11 ++++++++--- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d4b4307b05..73073762f1 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2268,6 +2268,8 @@ #define ADC_BUTTON_DEBOUNCE_DELAY 16 // (count) Increase if buttons bounce or repeat too fast #endif +//#define FAST_BUTTON_POLLING // Poll buttons at ~1kHz on 8-bit AVR. Set to 'false' for slow polling on 32-bit. + // @section safety /** diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index 9b16f515d6..380e8e6071 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -3557,6 +3557,10 @@ #define HAS_ROTARY_ENCODER 1 #endif +#if defined(CPU_32_BIT) && !defined(FAST_BUTTON_POLLING) + #define FAST_BUTTON_POLLING +#endif + #if PIN_EXISTS(SAFE_POWER) && DISABLED(DISABLE_DRIVER_SAFE_POWER_PROTECT) #define HAS_DRIVER_SAFE_POWER_PROTECT 1 #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 169d86a72f..5c9f122067 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -4283,10 +4283,15 @@ void Temperature::isr() { #endif // SLOW_PWM_HEATERS // - // Update lcd buttons 488 times per second + // Update lcd buttons at ~488Hz or ~976Hz // - static bool do_buttons; - if ((do_buttons ^= true)) ui.update_buttons(); + #if ENABLED(FAST_BUTTON_POLLING) + constexpr bool do_buttons = true; + #else + static bool do_buttons; + do_buttons ^= true; + #endif + if (do_buttons) ui.update_buttons(); /** * One sensor is sampled on every other call of the ISR. From f149e14d1a18fef4089d907d15083afc182c4e6b Mon Sep 17 00:00:00 2001 From: Andrew <18502096+classicrocker883@users.noreply.github.com> Date: Tue, 15 Apr 2025 18:36:27 -0400 Subject: [PATCH 092/101] =?UTF-8?q?=F0=9F=9A=B8=20Fix=20missing=20"echo:"?= =?UTF-8?q?=20in=20some=20reports=20(#27794)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/feature/ethernet.cpp | 42 +++++++++++++++ Marlin/src/feature/ethernet.h | 6 +++ Marlin/src/gcode/config/M200-M205.cpp | 6 +-- .../src/gcode/feature/network/M552-M554.cpp | 52 +++---------------- Marlin/src/gcode/feature/nonlinear/M592.cpp | 2 +- Marlin/src/gcode/feature/pause/M603.cpp | 1 - Marlin/src/gcode/feature/trinamic/M569.cpp | 2 +- Marlin/src/gcode/gcode.h | 6 +-- Marlin/src/gcode/probe/M423.cpp | 3 +- Marlin/src/gcode/temp/M86_M87.cpp | 2 +- Marlin/src/module/settings.cpp | 15 ++---- 11 files changed, 71 insertions(+), 66 deletions(-) diff --git a/Marlin/src/feature/ethernet.cpp b/Marlin/src/feature/ethernet.cpp index 9b022b4e17..cdf176f832 100644 --- a/Marlin/src/feature/ethernet.cpp +++ b/Marlin/src/feature/ethernet.cpp @@ -172,4 +172,46 @@ void MarlinEthernet::check() { } } +void say_ethernet() { SERIAL_ECHOPGM(" Ethernet "); } + +void MarlinEthernet::ETH0_report(const bool forReplay/*=true*/) { + say_ethernet(); + SERIAL_ECHO_TERNARY(ethernet.hardware_enabled, "port ", "en", "dis", "abled.\n"); + if (ethernet.hardware_enabled) { + say_ethernet(); + SERIAL_ECHO_TERNARY(ethernet.have_telnet_client, "client ", "en", "dis", "abled.\n"); + } + else + SERIAL_ECHOLNPGM("Send 'M552 S1' to enable."); +} + +void MarlinEthernet::MAC_report(const bool forReplay/*=true*/) { + if (!forReplay) SERIAL_ECHO_START(); + SERIAL_ECHOPGM("MAC: "); + if (ethernet.hardware_enabled) { + uint8_t mac[6]; + Ethernet.MACAddress(mac); + for (uint8_t i = 0; i < 6; ++i) { + if (mac[i] < 0x10) SERIAL_CHAR('0'); + SERIAL_PRINT(mac[i], PrintBase::Hex); + if (i < 5) SERIAL_CHAR(':'); + } + } + else + SERIAL_ECHOPGM("Disabled"); + SERIAL_EOL(); +} + +// Display current values when the link is active, +// otherwise show the stored values +void MarlinEthernet::ip_report(const uint16_t cmd, FSTR_P const post, const IPAddress &ipo, const bool forReplay/*=true*/) { + if (!forReplay) SERIAL_ECHO_START(); + SERIAL_ECHO(F(" M"), cmd, C(' ')); + for (uint8_t i = 0; i < 4; ++i) { + SERIAL_ECHO(ipo[i]); + if (i < 3) SERIAL_CHAR('.'); + } + SERIAL_ECHOLN(F(" ; "), post); +} + #endif // HAS_ETHERNET diff --git a/Marlin/src/feature/ethernet.h b/Marlin/src/feature/ethernet.h index 70a58efce7..7aa364fc3c 100644 --- a/Marlin/src/feature/ethernet.h +++ b/Marlin/src/feature/ethernet.h @@ -25,6 +25,8 @@ #include #endif +#include "../HAL/shared/Marduino.h" + // Teensy 4.1 uses internal MAC Address class MarlinEthernet { @@ -34,6 +36,10 @@ class MarlinEthernet { static EthernetClient telnetClient; static void init(); static void check(); + + static void ETH0_report(const bool forReplay=true); + static void MAC_report(const bool forReplay=true); + static void ip_report(const uint16_t cmd, FSTR_P const post, const IPAddress &ipo, const bool forReplay=true); }; extern MarlinEthernet ethernet; diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp index a0466fbeab..a55813aeae 100644 --- a/Marlin/src/gcode/config/M200-M205.cpp +++ b/Marlin/src/gcode/config/M200-M205.cpp @@ -78,10 +78,10 @@ TERN_(MARLIN_SMALL_BUILD, return); if (!forReplay) { - report_heading(forReplay, F(STR_FILAMENT_SETTINGS), false); + report_heading(false, F(STR_FILAMENT_SETTINGS), false); if (!parser.volumetric_enabled) SERIAL_ECHOPGM(" (Disabled):"); SERIAL_EOL(); - report_echo_start(forReplay); + report_echo_start(false); } #if EXTRUDERS == 1 @@ -231,7 +231,7 @@ void GcodeSuite::M203_report(const bool forReplay/*=true*/) { #if ENABLED(DISTINCT_E_FACTORS) for (uint8_t i = 0; i < E_STEPPERS; ++i) { - if (!forReplay) SERIAL_ECHO_START(); + report_echo_start(forReplay); SERIAL_ECHOLNPGM_P( PSTR(" M203 T"), i , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS_N(i)]) diff --git a/Marlin/src/gcode/feature/network/M552-M554.cpp b/Marlin/src/gcode/feature/network/M552-M554.cpp index 9a09a973c8..fc965fc3bd 100644 --- a/Marlin/src/gcode/feature/network/M552-M554.cpp +++ b/Marlin/src/gcode/feature/network/M552-M554.cpp @@ -28,44 +28,6 @@ #include "../../../core/serial.h" #include "../../gcode.h" -void say_ethernet() { SERIAL_ECHOPGM(" Ethernet "); } - -void ETH0_report() { - say_ethernet(); - SERIAL_ECHO_TERNARY(ethernet.hardware_enabled, "port ", "en", "dis", "abled.\n"); - if (ethernet.hardware_enabled) { - say_ethernet(); - SERIAL_ECHO_TERNARY(ethernet.have_telnet_client, "client ", "en", "dis", "abled.\n"); - } - else - SERIAL_ECHOLNPGM("Send 'M552 S1' to enable."); -} - -void MAC_report() { - uint8_t mac[6]; - if (ethernet.hardware_enabled) { - Ethernet.MACAddress(mac); - SERIAL_ECHOPGM(" MAC: "); - for (uint8_t i = 0; i < 6; ++i) { - if (mac[i] < 16) SERIAL_CHAR('0'); - SERIAL_PRINT(mac[i], PrintBase::Hex); - if (i < 5) SERIAL_CHAR(':'); - } - } - SERIAL_EOL(); -} - -// Display current values when the link is active, -// otherwise show the stored values -void ip_report(const uint16_t cmd, FSTR_P const post, const IPAddress &ipo) { - SERIAL_CHAR('M'); SERIAL_ECHO(cmd); SERIAL_CHAR(' '); - for (uint8_t i = 0; i < 4; ++i) { - SERIAL_ECHO(ipo[i]); - if (i < 3) SERIAL_CHAR('.'); - } - SERIAL_ECHOLN(F(" ; "), post); -} - /** * M552: Set IP address, enable/disable network interface * @@ -92,13 +54,13 @@ void GcodeSuite::M552() { } } const bool nopar = !seenS && !seenP; - if (nopar || seenS) ETH0_report(); + if (nopar || seenS) ethernet.ETH0_report(); if (nopar || seenP) M552_report(); } -void GcodeSuite::M552_report() { +void GcodeSuite::M552_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); - ip_report(552, F("ip address"), Ethernet.linkStatus() == LinkON ? Ethernet.localIP() : ethernet.ip); + ethernet.ip_report(552, F("ip address"), Ethernet.linkStatus() == LinkON ? Ethernet.localIP() : ethernet.ip, forReplay); } /** @@ -111,9 +73,9 @@ void GcodeSuite::M553() { M553_report(); } -void GcodeSuite::M553_report() { +void GcodeSuite::M553_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); - ip_report(553, F("subnet mask"), Ethernet.linkStatus() == LinkON ? Ethernet.subnetMask() : ethernet.subnet); + ethernet.ip_report(553, F("subnet mask"), Ethernet.linkStatus() == LinkON ? Ethernet.subnetMask() : ethernet.subnet, forReplay); } /** @@ -126,9 +88,9 @@ void GcodeSuite::M554() { M554_report(); } -void GcodeSuite::M554_report() { +void GcodeSuite::M554_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); - ip_report(554, F("gateway"), Ethernet.linkStatus() == LinkON ? Ethernet.gatewayIP() : ethernet.gateway); + ethernet.ip_report(554, F("gateway"), Ethernet.linkStatus() == LinkON ? Ethernet.gatewayIP() : ethernet.gateway, forReplay); } #endif // HAS_ETHERNET diff --git a/Marlin/src/gcode/feature/nonlinear/M592.cpp b/Marlin/src/gcode/feature/nonlinear/M592.cpp index 2fc02133ec..77a6258ddc 100644 --- a/Marlin/src/gcode/feature/nonlinear/M592.cpp +++ b/Marlin/src/gcode/feature/nonlinear/M592.cpp @@ -29,7 +29,7 @@ void GcodeSuite::M592_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); - report_heading(forReplay, F(STR_NONLINEAR_EXTRUSION)); + report_heading_etc(forReplay, F(STR_NONLINEAR_EXTRUSION)); SERIAL_ECHOLNPGM(" M592 A", stepper.ne.A, " B", stepper.ne.B, " C", stepper.ne.C); } diff --git a/Marlin/src/gcode/feature/pause/M603.cpp b/Marlin/src/gcode/feature/pause/M603.cpp index fcc042f58e..fd8a779ae0 100644 --- a/Marlin/src/gcode/feature/pause/M603.cpp +++ b/Marlin/src/gcode/feature/pause/M603.cpp @@ -64,7 +64,6 @@ void GcodeSuite::M603_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); report_heading(forReplay, F(STR_FILAMENT_LOAD_UNLOAD)); - #if EXTRUDERS == 1 report_echo_start(forReplay); SERIAL_ECHOPGM(" M603 L", LINEAR_UNIT(fc_settings[0].load_length), " U", LINEAR_UNIT(fc_settings[0].unload_length), " ;"); diff --git a/Marlin/src/gcode/feature/trinamic/M569.cpp b/Marlin/src/gcode/feature/trinamic/M569.cpp index 06a4992ceb..99bbf6ed35 100644 --- a/Marlin/src/gcode/feature/trinamic/M569.cpp +++ b/Marlin/src/gcode/feature/trinamic/M569.cpp @@ -160,7 +160,7 @@ void GcodeSuite::M569_report(const bool forReplay/*=true*/) { report_heading(forReplay, F(STR_DRIVER_STEPPING_MODE)); auto say_M569 = [](const bool forReplay, FSTR_P const etc=nullptr, const bool eol=false) { - if (!forReplay) SERIAL_ECHO_START(); + report_echo_start(forReplay); SERIAL_ECHOPGM(" M569 S1"); if (etc) SERIAL_ECHO(C(' '), etc); if (eol) SERIAL_EOL(); diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 911820ee7b..706a7387db 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -1137,11 +1137,11 @@ private: #if HAS_ETHERNET static void M552(); - static void M552_report(); + static void M552_report(const bool forReplay=true); static void M553(); - static void M553_report(); + static void M553_report(const bool forReplay=true); static void M554(); - static void M554_report(); + static void M554_report(const bool forReplay=true); #endif #if HAS_STEALTHCHOP diff --git a/Marlin/src/gcode/probe/M423.cpp b/Marlin/src/gcode/probe/M423.cpp index 7ab887eb64..17941d64f3 100644 --- a/Marlin/src/gcode/probe/M423.cpp +++ b/Marlin/src/gcode/probe/M423.cpp @@ -88,10 +88,11 @@ void GcodeSuite::M423() { void GcodeSuite::M423_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); - report_heading(forReplay, F("X-Twist Correction")); + report_heading_etc(forReplay, F("X-Twist Correction")); SERIAL_ECHOLNPGM(" M423 A", xatc.start, " I", xatc.spacing); for (uint8_t x = 0; x < XATC_MAX_POINTS; ++x) { const float z = xatc.z_offset[x]; + report_echo_start(forReplay); SERIAL_ECHOPGM(" M423 X", x, " Z"); serial_offset(isnan(z) ? 0 : z); SERIAL_EOL(); diff --git a/Marlin/src/gcode/temp/M86_M87.cpp b/Marlin/src/gcode/temp/M86_M87.cpp index 502052e87b..442d325c56 100644 --- a/Marlin/src/gcode/temp/M86_M87.cpp +++ b/Marlin/src/gcode/temp/M86_M87.cpp @@ -37,7 +37,7 @@ void GcodeSuite::M86_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); hotend_idle_settings_t &c = hotend_idle.cfg; - report_heading(forReplay, F("Hotend Idle Timeout")); + report_heading_etc(forReplay, F("Hotend Idle Timeout")); SERIAL_ECHOLNPGM(" M86" #if HAS_HEATED_BED " B", c.bed_target, diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 7062164dc9..a6714b3e6a 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -190,11 +190,6 @@ #pragma pack(push, 1) // No padding between variables -#if HAS_ETHERNET - void ETH0_report(); - void MAC_report(); -#endif - #define _EN_ITEM(N) , E##N #define _EN1_ITEM(N) , E##N:1 @@ -4210,11 +4205,11 @@ void MarlinSettings::reset() { #if HAS_ETHERNET CONFIG_ECHO_HEADING("Ethernet"); - if (!forReplay) ETH0_report(); - CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); MAC_report(); - CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); gcode.M552_report(); - CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); gcode.M553_report(); - CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); gcode.M554_report(); + if (!forReplay) ethernet.ETH0_report(false); + ethernet.MAC_report(forReplay); + gcode.M552_report(forReplay); + gcode.M553_report(forReplay); + gcode.M554_report(forReplay); #endif TERN_(HAS_MULTI_LANGUAGE, gcode.M414_report(forReplay)); From c0e108b21df5452e7376d48797cbaf7ac8b63904 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 16 Apr 2025 00:30:52 +0000 Subject: [PATCH 093/101] [cron] Bump distribution date (2025-04-16) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 11822b4b13..2015e2ce0a 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-15" +//#define STRING_DISTRIBUTION_DATE "2025-04-16" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 65e128bdf9..cb0252d149 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-15" + #define STRING_DISTRIBUTION_DATE "2025-04-16" #endif /** From 8867c458311c7e5c34ad73a4fb95c716bbd90bc7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 16 Apr 2025 14:26:52 -0500 Subject: [PATCH 094/101] =?UTF-8?q?=F0=9F=8E=A8=20Fix=20and/or=20warning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/feature/digipot/M907-M910.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index a73f88ca89..425d27a72d 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -104,11 +104,11 @@ void GcodeSuite::M907() { // X Y I J K U V W - All aliases to set the current for "most axes." // Only the value of the last given parameter is used. - if (ENABLED(HAS_X_Y_XY_I_J_K_U_V_W) && NUM_AXIS_GANG( + if (ENABLED(HAS_X_Y_XY_I_J_K_U_V_W) && (NUM_AXIS_GANG( parser.seenval('X'), || parser.seenval('Y'), || false, || parser.seenval('I'), || parser.seenval('J'), || parser.seenval('K'), || parser.seenval('U'), || parser.seenval('V'), || parser.seenval('W') - )) + ))) stepper.set_digipot_current(0, parser.value_int()); // Z - Set the current just for the Z axis From f3be22c4ffbd016a0dcac19eaf3649c8c7eec3e5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 16 Apr 2025 14:29:31 -0500 Subject: [PATCH 095/101] =?UTF-8?q?=F0=9F=8E=A8=20Delete=20libsam=5Fsam3x8?= =?UTF-8?q?e=5Fgcc=5Frel.a.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../libsam_sam3x8e_gcc_rel.a.txt | 576 ------------------ 1 file changed, 576 deletions(-) delete mode 100644 buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/libsam_sam3x8e_gcc_rel.a.txt diff --git a/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/libsam_sam3x8e_gcc_rel.a.txt b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/libsam_sam3x8e_gcc_rel.a.txt deleted file mode 100644 index 9b614811bd..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/libsam_sam3x8e_gcc_rel.a.txt +++ /dev/null @@ -1,576 +0,0 @@ - -adc10_sam3u.o: - -adc12_sam3u.o: - -adc_sam3snxa.o: - -pio.o: -00000000 T PIO_Clear -00000000 T PIO_Configure -00000000 T PIO_DisableInterrupt -00000000 T PIO_Get -00000000 T PIO_GetOutputDataStatus -00000000 T PIO_PullUp -00000000 T PIO_Set -00000000 T PIO_SetDebounceFilter -00000000 T PIO_SetInput -00000000 T PIO_SetOutput -00000000 T PIO_SetPeripheral - -pmc.o: -00000000 T pmc_clr_fast_startup_input -00000000 T pmc_disable_all_pck -00000000 T pmc_disable_all_periph_clk -00000000 T pmc_disable_interrupt -00000000 T pmc_disable_pck -00000000 T pmc_disable_periph_clk -00000000 T pmc_disable_pllack -00000000 T pmc_disable_udpck -00000000 T pmc_disable_upll_clock -00000000 T pmc_enable_all_pck -00000000 T pmc_enable_all_periph_clk -00000000 T pmc_enable_backupmode -00000000 T pmc_enable_interrupt -00000000 T pmc_enable_pck -00000000 T pmc_enable_periph_clk -00000000 T pmc_enable_pllack -00000000 T pmc_enable_sleepmode -00000000 T pmc_enable_udpck -00000000 T pmc_enable_upll_clock -00000000 T pmc_enable_waitmode -00000000 T pmc_get_interrupt_mask -00000000 T pmc_get_status -00000000 T pmc_get_writeprotect_status -00000000 T pmc_is_locked_pllack -00000000 T pmc_is_locked_upll -00000000 T pmc_is_pck_enabled -00000000 T pmc_is_periph_clk_enabled -00000000 T pmc_mck_set_prescaler -00000000 T pmc_mck_set_source -00000000 T pmc_osc_disable_fastrc -00000000 T pmc_osc_disable_xtal -00000000 T pmc_osc_enable_fastrc -00000000 T pmc_osc_is_ready_32kxtal -00000000 T pmc_osc_is_ready_mainck -00000000 T pmc_pck_set_prescaler -00000000 T pmc_pck_set_source -00000000 T pmc_set_fast_startup_input -00000000 T pmc_set_writeprotect -00000000 T pmc_switch_mainck_to_fastrc -00000000 T pmc_switch_mainck_to_xtal -00000000 T pmc_switch_mck_to_mainck -00000000 T pmc_switch_mck_to_pllack -00000000 T pmc_switch_mck_to_sclk -00000000 T pmc_switch_mck_to_upllck -00000000 T pmc_switch_pck_to_mainck -00000000 T pmc_switch_pck_to_pllack -00000000 T pmc_switch_pck_to_sclk -00000000 T pmc_switch_pck_to_upllck -00000000 T pmc_switch_sclk_to_32kxtal -00000000 T pmc_switch_udpck_to_pllack -00000000 T pmc_switch_udpck_to_upllck - -pwmc.o: -00000000 t FindClockConfiguration -00000000 T PWMC_ConfigureChannel -00000000 T PWMC_ConfigureChannelExt -00000000 T PWMC_ConfigureClocks -00000000 T PWMC_ConfigureComparisonUnit -00000000 T PWMC_ConfigureEventLineMode -00000000 T PWMC_ConfigureSyncChannel -00000000 T PWMC_DisableChannel -00000000 T PWMC_DisableChannelIt -00000000 T PWMC_DisableIt -00000000 T PWMC_DisableOverrideOutput -00000000 T PWMC_EnableChannel -00000000 T PWMC_EnableChannelIt -00000000 T PWMC_EnableFaultProtection -00000000 T PWMC_EnableIt -00000000 T PWMC_EnableOverrideOutput -00000000 T PWMC_FaultClear -00000000 T PWMC_SetDeadTime -00000000 T PWMC_SetDutyCycle -00000000 T PWMC_SetFaultMode -00000000 T PWMC_SetFaultProtectionValue -00000000 T PWMC_SetOverrideValue -00000000 T PWMC_SetPeriod -00000000 T PWMC_SetSyncChannelUpdatePeriod -00000000 T PWMC_SetSyncChannelUpdateUnlock -00000000 T PWMC_WriteBuffer - U __assert_func -00000000 r __func__.6793 -00000000 r __func__.6804 -00000000 r __func__.6819 -00000000 r __func__.6830 -00000000 r __func__.6841 -00000000 r __func__.6848 -00000000 r __func__.6932 -00000000 r __func__.6938 - -rtc.o: -00000000 T RTC_ClearSCCR -00000000 T RTC_DisableIt -00000000 T RTC_EnableIt -00000000 T RTC_GetDate -00000000 T RTC_GetHourMode -00000000 T RTC_GetSR -00000000 T RTC_GetTime -00000000 T RTC_SetDate -00000000 T RTC_SetDateAlarm -00000000 T RTC_SetHourMode -00000000 T RTC_SetTime -00000000 T RTC_SetTimeAlarm - U __assert_func -00000000 r __func__.6790 -00000000 r __func__.6799 -00000000 r __func__.6804 - -rtt.o: -00000000 T RTT_EnableIT -00000000 T RTT_GetStatus -00000000 T RTT_GetTime -00000000 T RTT_SetAlarm -00000000 T RTT_SetPrescaler - U __assert_func -00000000 r __func__.6797 -00000000 r __func__.6805 - -spi.o: -00000000 T SPI_Configure -00000000 T SPI_ConfigureNPCS -00000000 T SPI_Disable -00000000 T SPI_DisableIt -00000000 T SPI_Enable -00000000 T SPI_EnableIt -00000000 T SPI_GetStatus -00000000 T SPI_IsFinished -00000000 T SPI_Read -00000000 T SPI_Write - U pmc_enable_periph_clk - -tc.o: -00000000 T TC_Configure -00000000 T TC_FindMckDivisor -00000000 T TC_GetStatus -00000000 T TC_ReadCV -00000000 T TC_SetRA -00000000 T TC_SetRB -00000000 T TC_SetRC -00000000 T TC_Start -00000000 T TC_Stop - U __assert_func -00000000 r __func__.6792 -00000000 r __func__.6798 -00000000 r __func__.6804 - -timetick.o: -00000000 T GetTickCount -00000000 T Sleep -00000000 T TimeTick_Configure -00000000 T TimeTick_Increment -00000000 T Wait -00000000 b _dwTickCount - -twi.o: -00000000 T TWI_ByteReceived -00000000 T TWI_ByteSent -00000000 T TWI_ConfigureMaster -00000000 T TWI_ConfigureSlave -00000000 T TWI_Disable -00000000 T TWI_DisableIt -00000000 T TWI_EnableIt -00000000 T TWI_GetMaskedStatus -00000000 T TWI_GetStatus -00000000 T TWI_ReadByte -00000000 T TWI_SendSTOPCondition -00000000 T TWI_SetClock -00000000 T TWI_StartRead -00000000 T TWI_StartWrite -00000000 T TWI_Stop -00000000 T TWI_TransferComplete -00000000 T TWI_WriteByte - U __assert_func -00000000 r __func__.7151 -00000000 r __func__.7157 -00000000 r __func__.7172 -00000000 r __func__.7176 -00000000 r __func__.7184 -00000000 r __func__.7191 -00000000 r __func__.7195 -00000000 r __func__.7200 -00000000 r __func__.7208 -00000000 r __func__.7222 -00000000 r __func__.7227 -00000000 r __func__.7231 -00000000 r __func__.7236 -00000000 r __func__.7240 - -usart.o: -00000000 T USART_Configure -00000000 T USART_DisableIt -00000000 T USART_EnableIt -00000000 T USART_GetChar -00000000 T USART_GetStatus -00000000 T USART_IsDataAvailable -00000000 T USART_IsRxReady -00000000 T USART_PutChar -00000000 T USART_Read -00000000 T USART_ReadBuffer -00000000 T USART_SetIrdaFilter -00000000 T USART_SetReceiverEnabled -00000000 T USART_SetTransmitterEnabled -00000000 T USART_Write -00000000 T USART_WriteBuffer - U __assert_func -00000000 r __func__.7068 - -wdt.o: -00000000 T WDT_Disable -00000000 T WDT_Enable -00000000 T WDT_GetPeriod -00000000 T WDT_GetStatus -00000000 T WDT_Restart - -system_sam3xa.o: -00000000 D SystemCoreClock -00000000 T SystemCoreClockUpdate -00000000 T SystemInit -00000000 T system_init_flash - -startup_sam3xa.o: - U ADC_Handler - U BusFault_Handler - U CAN0_Handler - U CAN1_Handler - U DACC_Handler - U DMAC_Handler - U DebugMon_Handler - U EFC0_Handler - U EFC1_Handler - U EMAC_Handler - U HSMCI_Handler - U HardFault_Handler - U MemManage_Handler - U NMI_Handler - U PIOA_Handler - U PIOB_Handler - U PIOC_Handler - U PIOD_Handler - U PMC_Handler - U PWM_Handler - U PendSV_Handler - U RSTC_Handler - U RTC_Handler - U RTT_Handler -00000000 T Reset_Handler - U SMC_Handler - U SPI0_Handler - U SSC_Handler - U SUPC_Handler - U SVC_Handler - U SysTick_Handler - U TC0_Handler - U TC1_Handler - U TC2_Handler - U TC3_Handler - U TC4_Handler - U TC5_Handler - U TC6_Handler - U TC7_Handler - U TC8_Handler - U TRNG_Handler - U TWI0_Handler - U TWI1_Handler - U UART_Handler - U UOTGHS_Handler - U USART0_Handler - U USART1_Handler - U USART2_Handler - U USART3_Handler - U UsageFault_Handler - U WDT_Handler - U _erelocate - U _estack - U _etext - U _ezero - U _sfixed - U _srelocate - U _szero -00000000 R exception_table - U main - -adc.o: -00000000 T adc_configure_power_save -00000000 T adc_configure_sequence -00000000 T adc_configure_timing -00000000 T adc_configure_trigger -00000000 T adc_disable_all_channel -00000000 T adc_disable_anch -00000000 T adc_disable_channel -00000000 T adc_disable_channel_differential_input -00000000 T adc_disable_channel_input_offset -00000000 T adc_disable_interrupt -00000000 T adc_disable_tag -00000000 T adc_disable_ts -00000000 T adc_enable_all_channel -00000000 T adc_enable_anch -00000000 T adc_enable_channel -00000000 T adc_enable_channel_differential_input -00000000 T adc_enable_channel_input_offset -00000000 T adc_enable_interrupt -00000000 T adc_enable_tag -00000000 T adc_enable_ts -00000000 T adc_get_actual_adc_clock -00000000 T adc_get_channel_status -00000000 T adc_get_channel_value -00000000 T adc_get_comparison_mode -00000000 T adc_get_interrupt_mask -00000000 T adc_get_latest_value -00000000 T adc_get_overrun_status -00000000 T adc_get_pdc_base -00000000 T adc_get_status -00000000 T adc_get_tag -00000000 T adc_get_writeprotect_status -00000000 T adc_init -00000000 T adc_set_bias_current -00000000 T adc_set_channel_input_gain -00000000 T adc_set_comparison_channel -00000000 T adc_set_comparison_mode -00000000 T adc_set_comparison_window -00000000 T adc_set_resolution -00000000 T adc_set_writeprotect -00000000 T adc_start -00000000 T adc_start_sequencer -00000000 T adc_stop -00000000 T adc_stop_sequencer - -udp.o: - -udphs.o: - -uotghs.o: -00000000 T UOTGHS_Handler -00000000 B gpf_isr - -interrupt_sam_nvic.o: -00000000 D g_interrupt_enabled - -uotghs_device.o: -00000000 T UDD_Attach -00000000 T UDD_ClearIN -00000000 T UDD_ClearOUT -00000000 T UDD_ClearSetupInt -00000000 T UDD_Detach -00000000 T UDD_FifoByteCount -00000000 T UDD_GetFrameNumber -00000000 T UDD_Init -00000000 T UDD_InitEP -00000000 T UDD_InitEndpoints -00000000 T UDD_ReadWriteAllowed -00000000 T UDD_ReceivedSetupInt -00000000 T UDD_Recv -00000000 T UDD_Recv8 -00000000 T UDD_ReleaseRX -00000000 T UDD_ReleaseTX -00000000 T UDD_Send -00000000 T UDD_Send8 -00000000 T UDD_SetAddress -00000000 T UDD_SetStack -00000000 T UDD_Stall -00000000 T UDD_WaitForINOrOUT -00000000 T UDD_WaitIN -00000000 T UDD_WaitOUT - U g_interrupt_enabled - U gpf_isr - U pmc_enable_periph_clk - U pmc_enable_udpck - U pmc_enable_upll_clock - U pmc_switch_udpck_to_upllck -00000000 b ul_recv_fifo_ptr -00000000 b ul_send_fifo_ptr - -uotghs_host.o: -00000000 T UHD_BusReset -00000000 T UHD_GetVBUSState -00000000 t UHD_ISR -00000000 T UHD_Init -00000000 T UHD_Pipe0_Alloc -00000000 T UHD_Pipe_Alloc -00000000 T UHD_Pipe_Free -00000000 T UHD_Pipe_Is_Transfer_Complete -00000000 T UHD_Pipe_Read -00000000 T UHD_Pipe_Send -00000000 T UHD_Pipe_Write -00000000 T UHD_SetStack - U g_interrupt_enabled - U gpf_isr - U pmc_enable_periph_clk - U pmc_enable_udpck - U pmc_enable_upll_clock - U pmc_switch_udpck_to_upllck -00000000 b uhd_state - -dacc.o: -00000000 T dacc_disable_channel -00000000 T dacc_disable_interrupt -00000000 T dacc_disable_trigger -00000000 T dacc_enable_channel -00000000 T dacc_enable_flexible_selection -00000000 T dacc_enable_interrupt -00000000 T dacc_get_analog_control -00000000 T dacc_get_channel_status -00000000 T dacc_get_interrupt_mask -00000000 T dacc_get_interrupt_status -00000000 T dacc_get_pdc_base -00000000 T dacc_get_writeprotect_status -00000000 T dacc_reset -00000000 T dacc_set_analog_control -00000000 T dacc_set_channel_selection -00000000 T dacc_set_power_save -00000000 T dacc_set_timing -00000000 T dacc_set_transfer_mode -00000000 T dacc_set_trigger -00000000 T dacc_set_writeprotect -00000000 T dacc_write_conversion_data - -can.o: -00000000 R can_bit_time -00000000 T can_disable -00000000 T can_disable_autobaud_listen_mode -00000000 T can_disable_interrupt -00000000 T can_disable_low_power_mode -00000000 T can_disable_overload_frame -00000000 T can_disable_time_triggered_mode -00000000 T can_disable_timer_freeze -00000000 T can_disable_tx_repeat -00000000 T can_enable -00000000 T can_enable_autobaud_listen_mode -00000000 T can_enable_interrupt -00000000 T can_enable_low_power_mode -00000000 T can_enable_overload_frame -00000000 T can_enable_time_triggered_mode -00000000 T can_enable_timer_freeze -00000000 T can_enable_tx_repeat -00000000 T can_get_internal_timer_value -00000000 T can_get_interrupt_mask -00000000 T can_get_rx_error_cnt -00000000 T can_get_status -00000000 T can_get_timestamp_value -00000000 T can_get_tx_error_cnt -00000000 T can_global_send_abort_cmd -00000000 T can_global_send_transfer_cmd -00000000 T can_init -00000000 T can_mailbox_get_status -00000000 T can_mailbox_init -00000000 T can_mailbox_read -00000000 T can_mailbox_send_abort_cmd -00000000 T can_mailbox_send_transfer_cmd -00000000 T can_mailbox_set_timemark -00000000 T can_mailbox_tx_remote_frame -00000000 T can_mailbox_write -00000000 T can_reset_all_mailbox -00000000 T can_reset_internal_timer -00000000 T can_reset_mailbox_data -00000000 T can_set_rx_sync_stage -00000000 T can_set_timestamp_capture_point - U memset - -efc.o: -00000000 T efc_disable_frdy_interrupt -00000000 T efc_enable_frdy_interrupt -00000000 T efc_get_flash_access_mode -00000000 T efc_get_result -00000000 T efc_get_status -00000000 T efc_get_wait_state -00000000 T efc_init -00000000 T efc_perform_command -0000006c T efc_perform_fcr -00000000 T efc_perform_read_sequence -00000000 T efc_set_flash_access_mode -00000000 T efc_set_wait_state -00000068 T efc_write_fmr -00000000 b iap_perform_command.7049 - -gpbr.o: -00000000 T gpbr_read -00000000 T gpbr_write - -ssc.o: - U memset -00000000 T ssc_disable_interrupt -00000000 T ssc_disable_rx -00000000 T ssc_disable_tx -00000000 T ssc_disable_tx_frame_sync_data -00000000 T ssc_enable_interrupt -00000000 T ssc_enable_rx -00000000 T ssc_enable_tx -00000000 T ssc_enable_tx_frame_sync_data -00000000 T ssc_get_interrupt_mask -00000000 T ssc_get_rx_access -00000000 T ssc_get_rx_compare -00000000 T ssc_get_status -00000000 T ssc_get_tx_access -00000000 T ssc_get_writeprotect_status -00000000 T ssc_i2s_set_receiver -00000000 T ssc_i2s_set_transmitter -00000000 T ssc_is_rx_enabled -00000000 T ssc_is_rx_ready -00000000 T ssc_is_tx_empty -00000000 T ssc_is_tx_enabled -00000000 T ssc_is_tx_ready -00000000 T ssc_read -00000000 T ssc_read_sync_data -00000000 T ssc_reset -00000000 T ssc_set_clock_divider -00000000 T ssc_set_loop_mode -00000000 T ssc_set_normal_mode -00000000 T ssc_set_receiver -00000000 T ssc_set_rx_compare -00000000 T ssc_set_rx_stop_selection -00000000 T ssc_set_td_default_level -00000000 T ssc_set_transmitter -00000000 T ssc_set_writeprotect -00000000 T ssc_write -00000000 T ssc_write_sync_data - -trng.o: -00000000 T trng_disable -00000000 T trng_disable_interrupt -00000000 T trng_enable -00000000 T trng_enable_interrupt -00000000 T trng_get_interrupt_mask -00000000 T trng_get_interrupt_status -00000000 T trng_read_output_data - -rstc.o: -00000000 T rstc_disable_user_reset -00000000 T rstc_disable_user_reset_interrupt -00000000 T rstc_enable_user_reset -00000000 T rstc_enable_user_reset_interrupt -00000000 T rstc_get_reset_cause -00000000 T rstc_get_status -00000000 T rstc_reset_extern -00000000 T rstc_set_external_reset -00000000 T rstc_start_software_reset - -emac.o: -00000000 t circ_inc -00000000 T emac_dev_get_tx_load -00000000 T emac_dev_init -00000000 T emac_dev_read -00000000 T emac_dev_reset -00000000 T emac_dev_set_rx_callback -00000000 T emac_dev_set_tx_wakeup_callback -00000000 T emac_dev_write -00000000 T emac_handler -00000000 T emac_phy_read -00000000 T emac_phy_write -00000000 t emac_reset_rx_mem -00000000 t emac_reset_tx_mem -00000000 b gs_rx_desc -00000000 b gs_tx_callback -00000000 b gs_tx_desc -00000000 b gs_uc_rx_buffer -00000000 b gs_uc_tx_buffer - U memcpy From bd382fb8a128ac0ab36b4c539646812dd470eb37 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 16 Apr 2025 14:43:53 -0500 Subject: [PATCH 096/101] =?UTF-8?q?=F0=9F=94=A8=20Suppress=20generate=5Fve?= =?UTF-8?q?rsion=20(for=20now)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildroot/bin/generate_version | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/buildroot/bin/generate_version b/buildroot/bin/generate_version index ff85fe7ecf..edc25e18af 100755 --- a/buildroot/bin/generate_version +++ b/buildroot/bin/generate_version @@ -3,12 +3,19 @@ # generate_version # # Make a Version.h file to accompany CUSTOM_VERSION_FILE +# Invoked automatically by Arduino IDE # # Authors: jbrazio, thinkyhead, InsanityAutomation, rfinnie # set -e +# Only run if ALLOW_GENERATE_VERSION is set +if [[ "$ALLOW_GENERATE_VERSION" != "1" ]]; then + echo "Skipping generate_version because ALLOW_GENERATE_VERSION is not set." + exit 0 +fi + DIR="${1:-Marlin}" READ_FILE="${READ_FILE:-${DIR}/Version.h}" WRITE_FILE="${WRITE_FILE:-${READ_FILE}}" From 62c1c116f74713a50577d1992b423de40c3bc0c5 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 17 Apr 2025 00:30:15 +0000 Subject: [PATCH 097/101] [cron] Bump distribution date (2025-04-17) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 2015e2ce0a..b7b07dd43d 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-16" +//#define STRING_DISTRIBUTION_DATE "2025-04-17" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index cb0252d149..c34074006d 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-16" + #define STRING_DISTRIBUTION_DATE "2025-04-17" #endif /** From 58f03953b8a6d8c86ec2d82000b6b7d33712b1a8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 17 Apr 2025 15:42:21 -0500 Subject: [PATCH 098/101] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20Linear=20Advance?= =?UTF-8?q?=20edit=20item?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 8080a23ba4..2ffdee798d 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -736,7 +736,7 @@ void menu_advanced_settings() { EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 10); #else EXTRUDER_LOOP() - EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[e], 0, 10); + EDIT_ITEM_N(float42_52, e, MSG_ADVANCE_K_E, &planner.extruder_advance_K[e], 0, 10); #endif #endif From 4ea75ad284107959ea33dbb7875a55a689594faf Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 17 Apr 2025 15:43:40 -0500 Subject: [PATCH 099/101] =?UTF-8?q?=F0=9F=8E=A8=20Cosmetic=20updates,=20fi?= =?UTF-8?q?x=20alias=20warning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/ESP32/i2s.cpp | 16 ++--- Marlin/src/feature/max7219.cpp | 2 +- .../src/feature/mmu3/mmu3_error_converter.cpp | 8 +-- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/lcd/menu/menu_advanced.cpp | 10 +++- Marlin/src/lcd/menu/menu_item.h | 8 +++ Marlin/src/module/planner.cpp | 60 +++++++++---------- 7 files changed, 59 insertions(+), 47 deletions(-) diff --git a/Marlin/src/HAL/ESP32/i2s.cpp b/Marlin/src/HAL/ESP32/i2s.cpp index 4b17db3daf..6aeeb0e3dc 100644 --- a/Marlin/src/HAL/ESP32/i2s.cpp +++ b/Marlin/src/HAL/ESP32/i2s.cpp @@ -145,7 +145,7 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) { void stepperTask(void *parameter) { uint32_t nextMainISR = 0; #if ENABLED(LIN_ADVANCE) - uint32_t nextAdvanceISR = Stepper::LA_ADV_NEVER; + uint32_t nextAdvanceISR = stepper.LA_ADV_NEVER; #endif for (;;) { @@ -167,13 +167,13 @@ void stepperTask(void *parameter) { if (!using_ftMotion) { if (!nextMainISR) { - Stepper::pulse_phase_isr(); - nextMainISR = Stepper::block_phase_isr(); + stepper.pulse_phase_isr(); + nextMainISR = stepper.block_phase_isr(); } #if ENABLED(LIN_ADVANCE) else if (!nextAdvanceISR) { - Stepper::advance_isr(); - nextAdvanceISR = Stepper::la_interval; + stepper.advance_isr(); + nextAdvanceISR = stepper.la_interval; } #endif else @@ -182,10 +182,10 @@ void stepperTask(void *parameter) { nextMainISR--; #if ENABLED(LIN_ADVANCE) - if (nextAdvanceISR == Stepper::LA_ADV_NEVER) - nextAdvanceISR = Stepper::la_interval; + if (nextAdvanceISR == stepper.LA_ADV_NEVER) + nextAdvanceISR = stepper.la_interval; - if (nextAdvanceISR && nextAdvanceISR != Stepper::LA_ADV_NEVER) + if (nextAdvanceISR && nextAdvanceISR != stepper.LA_ADV_NEVER) nextAdvanceISR--; #endif } diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp index 5a25ea6710..5a61922c1d 100644 --- a/Marlin/src/feature/max7219.cpp +++ b/Marlin/src/feature/max7219.cpp @@ -757,7 +757,7 @@ void Max7219::idle_tasks() { #ifdef MAX7219_DEBUG_MULTISTEPPING static uint8_t last_multistepping = 0; - const uint8_t multistepping = Stepper::steps_per_isr; + const uint8_t multistepping = stepper.steps_per_isr; if (multistepping != last_multistepping) { static uint8_t log2_old = 0; uint8_t log2_new = 0; diff --git a/Marlin/src/feature/mmu3/mmu3_error_converter.cpp b/Marlin/src/feature/mmu3/mmu3_error_converter.cpp index d5d124427e..d7fc651fbd 100644 --- a/Marlin/src/feature/mmu3/mmu3_error_converter.cpp +++ b/Marlin/src/feature/mmu3/mmu3_error_converter.cpp @@ -196,16 +196,16 @@ namespace MMU3 { return FindErrorIndex(ERR_OTHER_UNKNOWN_ERROR); } - uint16_t PrusaErrorCode(const uint8_t i) { return (uint16_t)pgm_read_word(&errorCodes[i]); } + uint16_t PrusaErrorCode(const uint8_t i) { return pgm_read_word(errorCodes + i); } - FSTR_P const PrusaErrorTitle(const uint8_t i) { return (FSTR_P const)pgm_read_ptr(&errorTitles[i]); } - FSTR_P const PrusaErrorDesc(const uint8_t i) { return (FSTR_P const)pgm_read_ptr(&errorDescs[i]); } + FSTR_P const PrusaErrorTitle(const uint8_t i) { return (FSTR_P const)pgm_read_ptr(errorTitles + i); } + FSTR_P const PrusaErrorDesc(const uint8_t i) { return (FSTR_P const)pgm_read_ptr(errorDescs + i); } uint8_t PrusaErrorButtons(const uint8_t i) { return pgm_read_byte(errorButtons + i); } FSTR_P const PrusaErrorButtonTitle(const uint8_t bi) { // -1 represents the hidden NoOperation button which is not drawn in any way - return (FSTR_P const)pgm_read_ptr(&btnOperation[bi - 1]); + return (FSTR_P const)pgm_read_ptr(btnOperation + bi - 1); } Buttons ButtonPressed(const ErrorCode ec) { diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 169f84983c..cd3c1cd573 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -4460,7 +4460,7 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." * Direct Stepping requirements */ #if ENABLED(DIRECT_STEPPING) - #if ENABLED(CPU_32_BIT) + #ifdef CPU_32_BIT #error "Direct Stepping is not supported on 32-bit boards." #elif !IS_FULL_CARTESIAN #error "Direct Stepping is incompatible with enabled kinematics." diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 2ffdee798d..137439c6df 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -104,6 +104,10 @@ void menu_backlash(); #endif #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) + #define HAS_ADV_FILAMENT_MENU 1 +#endif + +#if HAS_ADV_FILAMENT_MENU // // Advanced Settings > Filament // @@ -138,7 +142,7 @@ void menu_backlash(); EDIT_ITEM_FAST_N(float43, e, MSG_FILAMENT_DIAM_E, &planner.filament_size[e], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); #endif } - #endif + #endif // !NO_VOLUMETRICS #if ENABLED(CONFIGURE_FILAMENT_CHANGE) constexpr float extrude_maxlength = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 999); @@ -169,7 +173,7 @@ void menu_backlash(); END_MENU(); } -#endif // !NO_VOLUMETRICS || ADVANCED_PAUSE_FEATURE +#endif // HAS_ADV_FILAMENT_MENU // // Advanced Settings > Temperature helpers @@ -729,7 +733,7 @@ void menu_advanced_settings() { SUBMENU(MSG_TEMPERATURE, menu_advanced_temperature); #endif - #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) + #if HAS_ADV_FILAMENT_MENU SUBMENU(MSG_FILAMENT, menu_advanced_filament); #elif ENABLED(LIN_ADVANCE) #if DISTINCT_E < 2 diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index df2c90425c..af4558cefc 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -276,6 +276,14 @@ class MenuItem_bool : public MenuEditItemBase { * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, SPEED_EDIT_MIN, SPEED_EDIT_MAX) * MenuItem_int3::action(flabel, &feedrate_percentage, SPEED_EDIT_MIN, SPEED_EDIT_MAX) * MenuItem_int3::draw(sel, row, flabel, &feedrate_percentage, SPEED_EDIT_MIN, SPEED_EDIT_MAX) + * + * Variants use standard suffixes. N:Number Index, S:C-string for substitution, F:F-string label, f:F-string for substitution + * _MENU_ITEM_F(TYPE, V...) Item with optional data + * _MENU_ITEM_N_S_F(TYPE, N, S, V...) Item with index value, C-string, and optional data + * _MENU_ITEM_N_f_F(TYPE, N, f, V...) Item with index value and F-string + * _MENU_ITEM_N_F(TYPE, N, V...) Item with index value + * _MENU_ITEM_S_F(TYPE, S, V...) Item with a unique string + * _MENU_ITEM_f_F(TYPE, f, V...) Item with a unique F-string */ #if ENABLED(ENCODER_RATE_MULTIPLIER) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 561d13fa2a..b3df490cf0 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -780,7 +780,7 @@ block_t* Planner::get_current_block() { * by the provided factors. If entry_factor is 0 don't change the initial_rate. * Assumes that the implied initial_rate and final_rate are no less than * sqrt(block->acceleration_steps_per_s2 / 2). This is ensured through - * minimum_planner_speed_sqr / min_entry_speed_sqr though note there's one + * minimum_planner_speed_sqr / min_entry_speed_sqr - but there's one * exception in recalculate_trapezoids(). * * ############ VERY IMPORTANT ############ @@ -854,6 +854,8 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t block->accelerate_before = accelerate_steps; block->decelerate_start = block->step_event_count - decelerate_steps; block->initial_rate = initial_rate; + block->final_rate = final_rate; + #if ENABLED(S_CURVE_ACCELERATION) block->acceleration_time = acceleration_time; block->deceleration_time = deceleration_time; @@ -861,7 +863,6 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t block->deceleration_time_inverse = deceleration_time_inverse; block->cruise_rate = cruise_rate; #endif - block->final_rate = final_rate; #if ENABLED(LIN_ADVANCE) if (block->la_advance_rate) { @@ -892,30 +893,29 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t * Laser Trap Power works for all Jerk and Curve modes; however Arc-based moves will have issues since * the segments are usually too small. */ - if (cutter.cutter_mode == CUTTER_MODE_CONTINUOUS) { - if (planner.laser_inline.status.isPowered && planner.laser_inline.status.isEnabled) { - if (block->laser.power > 0) { - NOLESS(block->laser.power, laser_power_floor); - block->laser.trap_ramp_active_pwr = (block->laser.power - laser_power_floor) * (initial_rate / float(block->nominal_rate)) + laser_power_floor; - block->laser.trap_ramp_entry_incr = (block->laser.power - block->laser.trap_ramp_active_pwr) / accelerate_steps; - float laser_pwr = block->laser.power * (final_rate / float(block->nominal_rate)); - NOLESS(laser_pwr, laser_power_floor); - block->laser.trap_ramp_exit_decr = (block->laser.power - laser_pwr) / decelerate_steps; - #if ENABLED(DEBUG_LASER_TRAP) - SERIAL_ECHO_MSG("lp:",block->laser.power); - SERIAL_ECHO_MSG("as:",accelerate_steps); - SERIAL_ECHO_MSG("ds:",decelerate_steps); - SERIAL_ECHO_MSG("p.trap:",block->laser.trap_ramp_active_pwr); - SERIAL_ECHO_MSG("p.incr:",block->laser.trap_ramp_entry_incr); - SERIAL_ECHO_MSG("p.decr:",block->laser.trap_ramp_exit_decr); - #endif - } - else { - block->laser.trap_ramp_active_pwr = 0; - block->laser.trap_ramp_entry_incr = 0; - block->laser.trap_ramp_exit_decr = 0; - } - + if (cutter.cutter_mode == CUTTER_MODE_CONTINUOUS + && planner.laser_inline.status.isPowered && planner.laser_inline.status.isEnabled + ) { + if (block->laser.power > 0) { + NOLESS(block->laser.power, laser_power_floor); + block->laser.trap_ramp_active_pwr = (block->laser.power - laser_power_floor) * (initial_rate / float(block->nominal_rate)) + laser_power_floor; + block->laser.trap_ramp_entry_incr = (block->laser.power - block->laser.trap_ramp_active_pwr) / accelerate_steps; + float laser_pwr = block->laser.power * (final_rate / float(block->nominal_rate)); + NOLESS(laser_pwr, laser_power_floor); + block->laser.trap_ramp_exit_decr = (block->laser.power - laser_pwr) / decelerate_steps; + #if ENABLED(DEBUG_LASER_TRAP) + SERIAL_ECHO_MSG("lp:", block->laser.power); + SERIAL_ECHO_MSG("as:", accelerate_steps); + SERIAL_ECHO_MSG("ds:", decelerate_steps); + SERIAL_ECHO_MSG("p.trap:", block->laser.trap_ramp_active_pwr); + SERIAL_ECHO_MSG("p.incr:", block->laser.trap_ramp_entry_incr); + SERIAL_ECHO_MSG("p.decr:", block->laser.trap_ramp_exit_decr); + #endif + } + else { + block->laser.trap_ramp_active_pwr = 0; + block->laser.trap_ramp_entry_incr = 0; + block->laser.trap_ramp_exit_decr = 0; } } #endif // LASER_POWER_TRAP @@ -2440,7 +2440,7 @@ bool Planner::_populate_block( block->acceleration_steps_per_s2 = accel; block->acceleration = accel / steps_per_mm; #if DISABLED(S_CURVE_ACCELERATION) - block->acceleration_rate = (uint32_t)(accel * (float(1UL << 24) / (STEPPER_TIMER_RATE))); + block->acceleration_rate = uint32_t(accel * (float(1UL << 24) / (STEPPER_TIMER_RATE))); #endif #if ENABLED(LIN_ADVANCE) @@ -2448,10 +2448,10 @@ bool Planner::_populate_block( block->la_scaling = 0; if (use_advance_lead) { - // the Bresenham algorithm will convert this step rate into extruder steps + // The Bresenham algorithm will convert this step rate into extruder steps block->la_advance_rate = extruder_advance_K[E_INDEX_N(extruder)] * block->acceleration_steps_per_s2; - // reduce LA ISR frequency by calling it only often enough to ensure that there will + // Reduce LA ISR frequency by calling it only often enough to ensure that there will // never be more than four extruder steps per call for (uint32_t dividend = block->steps.e << 1; dividend <= (block->step_event_count >> 2); dividend <<= 1) block->la_scaling++; @@ -2461,7 +2461,7 @@ bool Planner::_populate_block( SERIAL_ECHOLNPGM("eISR running at > 10kHz: ", block->la_advance_rate); #endif } - #endif + #endif // LIN_ADVANCE // Formula for the average speed over a 1 step worth of distance if starting from zero and // accelerating at the current limit. Since we can only change the speed every step this is a From 65b8ced80ccb9462cf9052a80f8e7f8a2a832b81 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 17 Apr 2025 17:29:20 -0500 Subject: [PATCH 100/101] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Cla?= =?UTF-8?q?rify=20DEPLOY=5FALARM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/feature/bltouch.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/feature/bltouch.h b/Marlin/src/feature/bltouch.h index 0f9f2e68ba..1371ec9f46 100644 --- a/Marlin/src/feature/bltouch.h +++ b/Marlin/src/feature/bltouch.h @@ -26,6 +26,7 @@ // BLTouch commands are sent as servo angles typedef unsigned char BLTCommand; +#define DEPLOY_ALARM true #define STOW_ALARM true #define BLTOUCH_DEPLOY 10 #define BLTOUCH_STOW 90 @@ -104,7 +105,7 @@ public: static bool triggered(); private: - static bool _deploy_query_alarm() { return command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } + static bool _deploy_query_alarm() { return command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY) == DEPLOY_ALARM; } static bool _stow_query_alarm() { return command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY) == STOW_ALARM; } static void clear(); From 7b083be5c5dda3486642af7b4cea3853c1057162 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 18 Apr 2025 00:29:57 +0000 Subject: [PATCH 101/101] [cron] Bump distribution date (2025-04-18) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index b7b07dd43d..2260bfc119 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-04-17" +//#define STRING_DISTRIBUTION_DATE "2025-04-18" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index c34074006d..e4d0c6679b 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-04-17" + #define STRING_DISTRIBUTION_DATE "2025-04-18" #endif /**