From 22d3a993e7d5d2499517ddda8de5b8450735ab56 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 25 Oct 2021 01:03:57 +0000 Subject: [PATCH 01/78] [cron] Bump distribution date (2021-10-25) --- 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 410304f25c2d..c158f2732e47 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 "2021-10-24" +//#define STRING_DISTRIBUTION_DATE "2021-10-25" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index d70399ee1af4..5dea5c709cc6 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 "2021-10-24" + #define STRING_DISTRIBUTION_DATE "2021-10-25" #endif /** From 6a6bf0fd1b04f79215ee6d64596fdb1dcd72ccaa Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 24 Oct 2021 23:33:27 -0500 Subject: [PATCH 02/78] =?UTF-8?q?=F0=9F=94=A7=20Fewer=20alerts=20about=20Z?= =?UTF-8?q?=5FSAFE=5FHOMING?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/SanityCheck.h | 4 ---- Marlin/src/inc/Warnings.cpp | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index e406093a98eb..d342b6c76a1e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1660,10 +1660,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "Z_PROBE_LOW_POINT must be less than or equal to 0." #endif - #if HOMING_Z_WITH_PROBE && IS_CARTESIAN && DISABLED(Z_SAFE_HOMING) - #error "Z_SAFE_HOMING is recommended when homing with a probe. Enable it or comment out this line to continue." - #endif - #if ENABLED(PROBE_ACTIVATION_SWITCH) #ifndef PROBE_ACTIVATION_SWITCH_STATE #error "PROBE_ACTIVATION_SWITCH_STATE is required for PROBE_ACTIVATION_SWITCH." diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index a0affac56aba..d258aefd82f7 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -484,3 +484,7 @@ #if ENABLED(EMIT_CREALITY_422_WARNING) || MB(CREALITY_V4) #warning "Creality 4.2.2 boards may have A4988 or TMC2208_STANDALONE drivers. Check your board and make sure to select the correct DRIVER_TYPE!" #endif + +#if HOMING_Z_WITH_PROBE && IS_CARTESIAN && DISABLED(Z_SAFE_HOMING) + #error "Z_SAFE_HOMING is recommended when homing with a probe. Enable Z_SAFE_HOMING or comment out this line to continue." +#endif From f8968ed13c217ffa8db13d15c1d136e8d3864c1e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 24 Oct 2021 23:32:34 -0500 Subject: [PATCH 03/78] =?UTF-8?q?=F0=9F=90=9B=20More=20explicit=20allocati?= =?UTF-8?q?on=20of=20solenoids?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In reference to #22887 --- Marlin/Configuration.h | 1 - Marlin/src/feature/solenoid.cpp | 40 +++----------------- Marlin/src/inc/Conditionals_post.h | 59 ++++++++++++++++++------------ Marlin/src/inc/SanityCheck.h | 2 +- 4 files changed, 41 insertions(+), 61 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index e6b81bfed845..d8ced232b461 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -260,7 +260,6 @@ #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder - //#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381 #if ENABLED(PARKING_EXTRUDER) diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp index 623f223caa1b..b6795d1a1ef8 100644 --- a/Marlin/src/feature/solenoid.cpp +++ b/Marlin/src/feature/solenoid.cpp @@ -34,28 +34,12 @@ #include "../module/tool_change.h" #endif -#define HAS_SOLENOID(N) (HAS_SOLENOID_##N && (ENABLED(MANUAL_SOLENOID_CONTROL) || N < EXTRUDERS)) - // Used primarily with MANUAL_SOLENOID_CONTROL static void set_solenoid(const uint8_t num, const bool active) { const uint8_t value = active ? PE_MAGNET_ON_STATE : !PE_MAGNET_ON_STATE; + #define _SOL_CASE(N) case N: TERN_(HAS_SOLENOID_##N, OUT_WRITE(SOL##N##_PIN, value)); break; switch (num) { - case 0: OUT_WRITE(SOL0_PIN, value); break; - #if HAS_SOLENOID(1) - case 1: OUT_WRITE(SOL1_PIN, value); break; - #endif - #if HAS_SOLENOID(2) - case 2: OUT_WRITE(SOL2_PIN, value); break; - #endif - #if HAS_SOLENOID(3) - case 3: OUT_WRITE(SOL3_PIN, value); break; - #endif - #if HAS_SOLENOID(4) - case 4: OUT_WRITE(SOL4_PIN, value); break; - #endif - #if HAS_SOLENOID(5) - case 5: OUT_WRITE(SOL5_PIN, value); break; - #endif + REPEAT(8, _SOL_CASE) default: SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); break; } @@ -67,25 +51,11 @@ static void set_solenoid(const uint8_t num, const bool active) { void enable_solenoid(const uint8_t num) { set_solenoid(num, true); } void disable_solenoid(const uint8_t num) { set_solenoid(num, false); } -void enable_solenoid_on_active_extruder() { enable_solenoid(active_extruder); } +void enable_solenoid_on_active_extruder() { } void disable_all_solenoids() { - disable_solenoid(0); - #if HAS_SOLENOID(1) - disable_solenoid(1); - #endif - #if HAS_SOLENOID(2) - disable_solenoid(2); - #endif - #if HAS_SOLENOID(3) - disable_solenoid(3); - #endif - #if HAS_SOLENOID(4) - disable_solenoid(4); - #endif - #if HAS_SOLENOID(5) - disable_solenoid(5); - #endif + #define _SOL_DISABLE(N) TERN_(HAS_SOLENOID_##N, disable_solenoid(N)); + REPEAT(8, _SOL_DISABLE) } #endif // EXT_SOLENOID || MANUAL_SOLENOID_CONTROL diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 9dfc7b187ade..41a2ab39383c 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1635,9 +1635,6 @@ #if PIN_EXISTS(E0_MS1) #define HAS_E0_MS_PINS 1 #endif - #if PIN_EXISTS(SOL0) - #define HAS_SOLENOID_0 1 - #endif #if E_STEPPERS > 1 #if PIN_EXISTS(E1_ENABLE) || AXIS_IS_L64XX(E1) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1)) @@ -1652,9 +1649,6 @@ #if PIN_EXISTS(E1_MS1) #define HAS_E1_MS_PINS 1 #endif - #if PIN_EXISTS(SOL1) - #define HAS_SOLENOID_1 1 - #endif #endif #if E_STEPPERS > 2 @@ -1670,9 +1664,6 @@ #if PIN_EXISTS(E2_MS1) #define HAS_E2_MS_PINS 1 #endif - #if PIN_EXISTS(SOL2) - #define HAS_SOLENOID_2 1 - #endif #endif #if E_STEPPERS > 3 @@ -1688,9 +1679,6 @@ #if PIN_EXISTS(E3_MS1) #define HAS_E3_MS_PINS 1 #endif - #if PIN_EXISTS(SOL3) - #define HAS_SOLENOID_3 1 - #endif #endif #if E_STEPPERS > 4 @@ -1706,9 +1694,6 @@ #if PIN_EXISTS(E4_MS1) #define HAS_E4_MS_PINS 1 #endif - #if PIN_EXISTS(SOL4) - #define HAS_SOLENOID_4 1 - #endif #endif #if E_STEPPERS > 5 @@ -1724,9 +1709,6 @@ #if PIN_EXISTS(E5_MS1) #define HAS_E5_MS_PINS 1 #endif - #if PIN_EXISTS(SOL5) - #define HAS_SOLENOID_5 1 - #endif #endif #if E_STEPPERS > 6 @@ -1742,9 +1724,6 @@ #if PIN_EXISTS(E6_MS1) #define HAS_E6_MS_PINS 1 #endif - #if PIN_EXISTS(SOL6) - #define HAS_SOLENOID_6 1 - #endif #endif #if E_STEPPERS > 7 @@ -1760,9 +1739,6 @@ #if PIN_EXISTS(E7_MS1) #define HAS_E7_MS_PINS 1 #endif - #if PIN_EXISTS(SOL7) - #define HAS_SOLENOID_7 1 - #endif #endif #if !defined(DISABLE_INACTIVE_E) && ENABLED(DISABLE_E) @@ -1772,6 +1748,41 @@ #undef DISABLE_INACTIVE_E #endif // HAS_EXTRUDERS +/** + * Set solenoid flags if any features use solenoids + * - EXT_SOLENOID (M380, M381) to enable/disable the extruder solenoid + * - MANUAL_SOLENOID_CONTROL (M380, M381) to enable/disable solenoids by index + * - PARKING_EXTRUDER uses SOL0_PIN and SOL1_PIN + * - SOLENOID_PROBE uses SOL1_PIN + * - Z_PROBE_SLED uses SOL1_PIN, when defined (unless EXT_SOLENOID is enabled) + */ +#if ANY(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL, PARKING_EXTRUDER, SOLENOID_PROBE, Z_PROBE_SLED) + #if PIN_EXISTS(SOL0) && (EITHER(MANUAL_SOLENOID_CONTROL, PARKING_EXTRUDER) || BOTH(EXT_SOLENOID, HAS_EXTRUDERS)) + #define HAS_SOLENOID_0 1 + #endif + #if PIN_EXISTS(SOL1) && (ANY(MANUAL_SOLENOID_CONTROL, PARKING_EXTRUDER, SOLENOID_PROBE, Z_PROBE_SLED) || TERN0(EXT_SOLENOID, E_STEPPERS > 1)) + #define HAS_SOLENOID_1 1 + #endif + #if PIN_EXISTS(SOL2) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 2)) + #define HAS_SOLENOID_2 2 + #endif + #if PIN_EXISTS(SOL3) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 3)) + #define HAS_SOLENOID_3 3 + #endif + #if PIN_EXISTS(SOL4) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 4)) + #define HAS_SOLENOID_4 4 + #endif + #if PIN_EXISTS(SOL5) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 5)) + #define HAS_SOLENOID_5 5 + #endif + #if PIN_EXISTS(SOL6) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 6)) + #define HAS_SOLENOID_6 6 + #endif + #if PIN_EXISTS(SOL7) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 7)) + #define HAS_SOLENOID_7 7 + #endif +#endif + // // Trinamic Stepper Drivers // diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index d342b6c76a1e..8ad184ecf14e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1241,7 +1241,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * (Magnetic) Parking Extruder requirements */ -#if ANY(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) +#if EITHER(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) #if ENABLED(EXT_SOLENOID) #error "(MAGNETIC_)PARKING_EXTRUDER and EXT_SOLENOID are incompatible. (Pins are used twice.)" #elif EXTRUDERS != 2 From 444f27dfa0bba82b73b428b7adcc50d44b99775a Mon Sep 17 00:00:00 2001 From: tombrazier <68918209+tombrazier@users.noreply.github.com> Date: Mon, 25 Oct 2021 06:33:40 +0100 Subject: [PATCH 04/78] =?UTF-8?q?=F0=9F=90=9B=20Add=20USE=5FTEMP=5FEXT=5FC?= =?UTF-8?q?OMPENSATION=20options=20(#23007)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 8 +++++++- Marlin/src/feature/probe_temp_comp.h | 20 +++++++++++++++++--- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/inc/SanityCheck.h | 16 ++++++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e934ed92c36d..fbf2c419439a 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2006,7 +2006,7 @@ #define PTC_PROBE_POS { 90, 100 } // Enable additional compensation using hotend temperature - // Note: this values cannot be calibrated automatically but have to be set manually + // Note: this values cannot be calibrated automatically but have to be set manually via M871. //#define USE_TEMP_EXT_COMPENSATION // Probe temperature calibration generates a table of values starting at PTC_SAMPLE_START @@ -2022,6 +2022,12 @@ //#define BTC_SAMPLE_RES 5 // (°C) //#define BTC_SAMPLE_COUNT 10 + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + //#define ETC_SAMPLE_START 180 // (°C) + //#define ETC_SAMPLE_RES 5 // (°C) + //#define ETC_SAMPLE_COUNT 20 + #endif + // The temperature the probe should be at while taking measurements during bed temperature // calibration. //#define BTC_PROBE_TEMP 30 // (°C) diff --git a/Marlin/src/feature/probe_temp_comp.h b/Marlin/src/feature/probe_temp_comp.h index f24b9acd9b18..e5d459b8e8e4 100644 --- a/Marlin/src/feature/probe_temp_comp.h +++ b/Marlin/src/feature/probe_temp_comp.h @@ -72,6 +72,20 @@ typedef struct { #endif #define BTC_SAMPLE_END (BTC_SAMPLE_START + (BTC_SAMPLE_COUNT) * BTC_SAMPLE_RES) +// Extruder temperature calibration constants +#if ENABLED(USE_TEMP_EXT_COMPENSATION) + #ifndef ETC_SAMPLE_COUNT + #define ETC_SAMPLE_COUNT 20 + #endif + #ifndef ETC_SAMPLE_RES + #define ETC_SAMPLE_RES 5 + #endif + #ifndef ETC_SAMPLE_START + #define ETC_SAMPLE_START 180 + #endif + #define ETC_SAMPLE_END (ETC_SAMPLE_START + (ETC_SAMPLE_COUNT) * ETC_SAMPLE_RES) +#endif + #ifndef PTC_PROBE_HEATING_OFFSET #define PTC_PROBE_HEATING_OFFSET 0.5f #endif @@ -81,10 +95,10 @@ typedef struct { #endif static constexpr temp_calib_t cali_info_init[TSI_COUNT] = { - { PTC_SAMPLE_COUNT, PTC_SAMPLE_RES, PTC_SAMPLE_START, PTC_SAMPLE_END }, // Probe - { BTC_SAMPLE_COUNT, BTC_SAMPLE_RES, BTC_SAMPLE_START, BTC_SAMPLE_END }, // Bed + { PTC_SAMPLE_COUNT, PTC_SAMPLE_RES, PTC_SAMPLE_START, PTC_SAMPLE_END }, // Probe + { BTC_SAMPLE_COUNT, BTC_SAMPLE_RES, BTC_SAMPLE_START, BTC_SAMPLE_END }, // Bed #if ENABLED(USE_TEMP_EXT_COMPENSATION) - { 20, 5, 180, 180 + 5 * 20 } // Extruder + { ETC_SAMPLE_COUNT, ETC_SAMPLE_RES, ETC_SAMPLE_START, ETC_SAMPLE_END }, // Extruder #endif }; diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index f7afd93c8198..5d94797f16a1 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -648,7 +648,7 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(PROBE_TEMP_COMPENSATION) temp_comp.compensate_measurement(TSI_BED, thermalManager.degBed(), abl.measured_z); temp_comp.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), abl.measured_z); - TERN_(USE_TEMP_EXT_COMPENSATION, temp_comp.compensate_measurement(TSI_EXT, thermalManager.degHotend(), abl.measured_z)); + TERN_(USE_TEMP_EXT_COMPENSATION, temp_comp.compensate_measurement(TSI_EXT, thermalManager.degHotend(0), abl.measured_z)); #endif #if ENABLED(AUTO_BED_LEVELING_LINEAR) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 8ad184ecf14e..60238e6c8025 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -648,6 +648,22 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L constexpr decltype(_btc_probe_temp) _test_btc_probe_temp = 12.3f; static_assert(_test_btc_probe_temp != 12.3f, "BTC_PROBE_TEMP must be a whole number."); #endif + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + #ifdef ETC_SAMPLE_START + constexpr auto _etc_sample_start = ETC_SAMPLE_START; + constexpr decltype(_etc_sample_start) _test_etc_sample_start = 12.3f; + static_assert(_test_etc_sample_start != 12.3f, "ETC_SAMPLE_START must be a whole number."); + #endif + #ifdef ETC_SAMPLE_RES + constexpr auto _etc_sample_res = ETC_SAMPLE_RES; + constexpr decltype(_etc_sample_res) _test_etc_sample_res = 12.3f; + static_assert(_test_etc_sample_res != 12.3f, "ETC_SAMPLE_RES must be a whole number."); + #endif + #endif + + #if ENABLED(USE_TEMP_EXT_COMPENSATION) && EXTRUDERS != 1 + #error "USE_TEMP_EXT_COMPENSATION only works with a single extruder." + #endif #endif /** From f6c7fbd1ab62b0c3aa70c971ad6c30d062d3252a Mon Sep 17 00:00:00 2001 From: Dennis Date: Mon, 25 Oct 2021 07:35:11 +0200 Subject: [PATCH 05/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20JyersUI=20current=20?= =?UTF-8?q?positions=20(scaling)=20(#23005)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index a4e05cace9ec..691c03af0dfc 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -904,21 +904,21 @@ void CrealityDWINClass::Draw_Status_Area(bool icons/*=false*/) { if ((update_x = axis_should_home(X_AXIS) && ui.get_blink())) DWIN_Draw_String(true, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 35, 459, F(" -?- ")); else - DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 1, 35, 459, current_position.x * 10); + DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 1, 35, 459, current_position.x); } if (update_y) { y = current_position.y; if ((update_y = axis_should_home(Y_AXIS) && ui.get_blink())) DWIN_Draw_String(true, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 120, 459, F(" -?- ")); else - DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 1, 120, 459, current_position.y * 10); + DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 1, 120, 459, current_position.y); } if (update_z) { z = current_position.z; if ((update_z = axis_should_home(Z_AXIS) && ui.get_blink())) DWIN_Draw_String(true, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 205, 459, F(" -?- ")); else - DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 2, 205, 459, (current_position.z>=0) ? current_position.z * 100 : 0); + DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 2, 205, 459, (current_position.z>=0) ? current_position.z : 0); } DWIN_UpdateLCD(); } From d79ea20dcd139ae0073051fd15405fef5b40dbf4 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Mon, 25 Oct 2021 01:39:48 -0400 Subject: [PATCH 06/78] =?UTF-8?q?=E2=9C=A8=20Creality=20v2.4.S1=20(Ender?= =?UTF-8?q?=207)=20board=20=20(#23010)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/core/boards.h | 21 +++++------ Marlin/src/pins/pins.h | 2 ++ Marlin/src/pins/stm32f1/pins_CREALITY_V24S1.h | 36 +++++++++++++++++++ Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 9 +++-- 4 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V24S1.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index ab8383ddb5ba..82c68f317126 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -346,16 +346,17 @@ #define BOARD_CREALITY_V431_D 4046 // Creality v4.3.1d (STM32F103RE) #define BOARD_CREALITY_V452 4047 // Creality v4.5.2 (STM32F103RE) #define BOARD_CREALITY_V453 4048 // Creality v4.5.3 (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4049 // Trigorilla Pro (STM32F103ZET6) -#define BOARD_FLY_MINI 4050 // FLYmaker FLY MINI (STM32F103RCT6) -#define BOARD_FLSUN_HISPEED 4051 // FLSUN HiSpeedV1 (STM32F103VET6) -#define BOARD_BEAST 4052 // STM32F103RET6 Libmaple-based controller -#define BOARD_MINGDA_MPX_ARM_MINI 4053 // STM32F103ZET6 Mingda MD-16 -#define BOARD_GTM32_PRO_VD 4054 // STM32F103VET6 controller -#define BOARD_ZONESTAR_ZM3E2 4055 // Zonestar ZM3E2 (STM32F103RCT6) -#define BOARD_ZONESTAR_ZM3E4 4056 // Zonestar ZM3E4 V1 (STM32F103VCT6) -#define BOARD_ZONESTAR_ZM3E4V2 4057 // Zonestar ZM3E4 V2 (STM32F103VCT6) -#define BOARD_ERYONE_ERY32_MINI 4058 // Eryone Ery32 mini (STM32F103VET6) +#define BOARD_CREALITY_V24S1 4049 // Creality v2.4.S1 (STM32F103RE) v101 as found in the Ender 7 +#define BOARD_TRIGORILLA_PRO 4050 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_FLY_MINI 4051 // FLYmaker FLY MINI (STM32F103RCT6) +#define BOARD_FLSUN_HISPEED 4052 // FLSUN HiSpeedV1 (STM32F103VET6) +#define BOARD_BEAST 4053 // STM32F103RET6 Libmaple-based controller +#define BOARD_MINGDA_MPX_ARM_MINI 4054 // STM32F103ZET6 Mingda MD-16 +#define BOARD_GTM32_PRO_VD 4055 // STM32F103VET6 controller +#define BOARD_ZONESTAR_ZM3E2 4056 // Zonestar ZM3E2 (STM32F103RCT6) +#define BOARD_ZONESTAR_ZM3E4 4057 // Zonestar ZM3E4 V1 (STM32F103VCT6) +#define BOARD_ZONESTAR_ZM3E4V2 4058 // Zonestar ZM3E4 V2 (STM32F103VCT6) +#define BOARD_ERYONE_ERY32_MINI 4059 // Eryone Ery32 mini (STM32F103VET6) // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 64cebc42e767..4de4446cf5c4 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -563,6 +563,8 @@ #include "stm32f1/pins_CREALITY_V452.h" // STM32F1 env:STM32F103RET6_creality env:STM32F103RET6_creality_maple #elif MB(CREALITY_V453) #include "stm32f1/pins_CREALITY_V453.h" // STM32F1 env:STM32F103RET6_creality env:STM32F103RET6_creality_maple +#elif MB(CREALITY_V24S1) + #include "stm32f1/pins_CREALITY_V24S1.h" // STM32F1 env:STM32F103RET6_creality env:STM32F103RET6_creality_maple #elif MB(TRIGORILLA_PRO) #include "stm32f1/pins_TRIGORILLA_PRO.h" // STM32F1 env:trigorilla_pro env:trigorilla_pro_maple #elif MB(FLY_MINI) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V24S1.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V24S1.h new file mode 100644 index 000000000000..ffd7baa00c4d --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V24S1.h @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 v2.4.S1 (STM32F103RE) v101 as found in the Ender 7 board pin assignments + */ + +#define BOARD_INFO_NAME "Creality v2.4.S1 V101" +#define DEFAULT_MACHINE_NAME "Creality3D" + +// +// Heaters +// +#define HEATER_BED_PIN PA15 // HOT BED + +#include "pins_CREALITY_V4.h" diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index c60d4dc2babf..ea58b5b3a99c 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -134,9 +134,12 @@ // // Heaters / Fans // -#define HEATER_0_PIN PA1 // HEATER1 -#define HEATER_BED_PIN PA2 // HOT BED - +#ifndef HEATER_0_PIN + #define HEATER_0_PIN PA1 // HEATER1 +#endif +#ifndef HEATER_BED_PIN + #define HEATER_BED_PIN PA2 // HOT BED +#endif #ifndef FAN_PIN #define FAN_PIN PA0 // FAN #endif From 5ef0468251b24fae5d2053691ff986b95fcd1631 Mon Sep 17 00:00:00 2001 From: Lefteris Garyfalakis <46350667+lefterisgar@users.noreply.github.com> Date: Mon, 25 Oct 2021 09:06:13 +0300 Subject: [PATCH 07/78] =?UTF-8?q?=F0=9F=9A=B8=20E3V2=20Enhanced=20cosmetic?= =?UTF-8?q?=20fixes=20(#23009)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/e3v2/enhanced/dwin.cpp | 4 +++- Marlin/src/lcd/e3v2/enhanced/meshviewer.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp index f9f2da5a4cf8..1bea3ceb1518 100644 --- a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp +++ b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp @@ -1105,7 +1105,7 @@ void Draw_Info_Menu() { LOOP_L_N(i, 3) { DWINUI::Draw_Icon(ICON_PrintSize + i, 26, 99 + i * 73); - DWIN_Draw_Line(HMI_data.SplitLine_Color, 16, MBASE(2) + i * 73, 256, 156 + i * 73); + DWIN_Draw_HLine(HMI_data.SplitLine_Color, 16, MBASE(2) + i * 73, 240); } DWIN_UpdateLCD(); @@ -1651,6 +1651,7 @@ void HMI_SaveProcessID(const uint8_t id) { void DWIN_StartHoming() { HMI_flag.home_flag = true; HMI_SaveProcessID(Homing); + Title.ShowCaption(F("Axis Homing")); DWIN_Draw_Popup(ICON_BLTouch, F("Axis Homing"), F("Please wait until done.")); } @@ -1666,6 +1667,7 @@ void DWIN_CompletedHoming() { void DWIN_MeshLevelingStart() { #if HAS_ONESTEP_LEVELING HMI_SaveProcessID(Leveling); + Title.ShowCaption(F("Bed Leveling")); DWIN_Draw_Popup(ICON_AutoLeveling, GET_TEXT_F(MSG_BED_LEVELING), F("Please wait until done.")); #elif ENABLED(MESH_BED_LEVELING) Draw_ManualMesh_Menu(); diff --git a/Marlin/src/lcd/e3v2/enhanced/meshviewer.cpp b/Marlin/src/lcd/e3v2/enhanced/meshviewer.cpp index d874db79cae1..8d6b5fa2c084 100644 --- a/Marlin/src/lcd/e3v2/enhanced/meshviewer.cpp +++ b/Marlin/src/lcd/e3v2/enhanced/meshviewer.cpp @@ -51,7 +51,7 @@ void MeshViewerClass::Draw() { NOLESS(maxz, v); NOMORE(minz, v); } - Title.ShowCaption(F("Mesh viewer")); + Title.ShowCaption(F("Mesh Viewer")); DWINUI::ClearMenuArea(); DWINUI::Draw_Icon(ICON_Continue_E, 86, 305); DWIN_Draw_Rectangle(0, HMI_data.SplitLine_Color, px(0), py(0), px(GRID_MAX_POINTS_X - 1), py(GRID_MAX_POINTS_Y - 1)); From 70863058cd91b155a9d299680c34430c8d9a4192 Mon Sep 17 00:00:00 2001 From: Miguel Risco-Castillo Date: Mon, 25 Oct 2021 01:08:15 -0500 Subject: [PATCH 08/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20Ender-3=20V2=20Enhan?= =?UTF-8?q?ced=20SetFlow=20(#23016)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/e3v2/enhanced/dwin.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp index 1bea3ceb1518..b861b0274a02 100644 --- a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp +++ b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp @@ -2343,7 +2343,8 @@ void SetSpeed() { SetPIntOnClick(MIN_PRINT_SPEED, MAX_PRINT_SPEED); } #endif // ADVANCED_PAUSE_FEATURE -void SetFlow() { SetPIntOnClick(MIN_PRINT_FLOW, MAX_PRINT_FLOW); } +void ApplyFlow() { planner.refresh_e_factor(0); } +void SetFlow() { SetPIntOnClick(MIN_PRINT_FLOW, MAX_PRINT_FLOW, ApplyFlow); } // Leveling Bed Corners void LevBed(uint8_t point) { From b619a7184406a3fff2d67d33f1f82159721bb1bc Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Mon, 25 Oct 2021 19:12:07 +1300 Subject: [PATCH 09/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20b=C3=B8rken=20E=5FDU?= =?UTF-8?q?AL=5FSTEPPER=5FDRIVERS=20(#23017)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/module/stepper.cpp | 2 +- Marlin/src/module/stepper/indirection.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 41a2ab39383c..6a70a5ce5439 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1636,7 +1636,7 @@ #define HAS_E0_MS_PINS 1 #endif - #if E_STEPPERS > 1 + #if E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS) #if PIN_EXISTS(E1_ENABLE) || AXIS_IS_L64XX(E1) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1)) #define HAS_E1_ENABLE 1 #endif diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index e374b85d7a48..a54bf53c4906 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2744,7 +2744,7 @@ void Stepper::init() { #if E_STEPPERS && HAS_E0_STEP E_AXIS_INIT(0); #endif - #if E_STEPPERS > 1 && HAS_E1_STEP + #if (E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS)) && HAS_E1_STEP E_AXIS_INIT(1); #endif #if E_STEPPERS > 2 && HAS_E2_STEP diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 3e3ebd411f08..93b765d7a52e 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -751,14 +751,14 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef ENABLE_STEPPER_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE + #if (E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS)) && HAS_E1_ENABLE #define ENABLE_STEPPER_E1() E1_ENABLE_WRITE( E_ENABLE_ON) #else #define ENABLE_STEPPER_E1() NOOP #endif #endif #ifndef DISABLE_STEPPER_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE + #if (E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS)) && HAS_E1_ENABLE #define DISABLE_STEPPER_E1() E1_ENABLE_WRITE(!E_ENABLE_ON) #else #define DISABLE_STEPPER_E1() NOOP From 90716eb7ce6ffd315b923e85a19d3bca65b78ff0 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sun, 24 Oct 2021 23:14:02 -0700 Subject: [PATCH 10/78] =?UTF-8?q?=E2=9C=A8=20Octopus=20Pro=20V1.0=20with?= =?UTF-8?q?=20STM32F429ZGT6=20(#23008)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/pins.h | 2 +- .../marlin_BigTree_Octopus_Pro_v1_F429.json | 50 ++ .../PeripheralPins.c | 433 ++++++++++++++++++ .../PinNamesVar.h | 30 ++ .../hal_conf_extra.h | 53 +++ .../ldscript.ld | 209 +++++++++ .../variant.cpp | 233 ++++++++++ .../variant.h | 216 +++++++++ ini/stm32f4.ini | 25 + 9 files changed, 1250 insertions(+), 1 deletion(-) create mode 100644 buildroot/share/PlatformIO/boards/marlin_BigTree_Octopus_Pro_v1_F429.json create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/hal_conf_extra.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/ldscript.ld create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/variant.h diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 4de4446cf5c4..3b83e14d62a1 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -628,7 +628,7 @@ #elif MB(BTT_OCTOPUS_V1_1) #include "stm32f4/pins_BTT_OCTOPUS_V1_1.h" // STM32F4 env:BIGTREE_OCTOPUS_V1 env:BIGTREE_OCTOPUS_V1_USB #elif MB(BTT_OCTOPUS_PRO_V1_0) - #include "stm32f4/pins_BTT_OCTOPUS_PRO_V1_0.h" // STM32F4 env:BIGTREE_OCTOPUS_V1 env:BIGTREE_OCTOPUS_V1_USB + #include "stm32f4/pins_BTT_OCTOPUS_PRO_V1_0.h" // STM32F4 env:BIGTREE_OCTOPUS_V1 env:BIGTREE_OCTOPUS_V1_USB env:BIGTREE_OCTOPUS_PRO_V1_F429 env:BIGTREE_OCTOPUS_PRO_V1_F429_USB #elif MB(LERDGE_K) #include "stm32f4/pins_LERDGE_K.h" // STM32F4 env:LERDGEK env:LERDGEK_usb_flash_drive #elif MB(LERDGE_S) diff --git a/buildroot/share/PlatformIO/boards/marlin_BigTree_Octopus_Pro_v1_F429.json b/buildroot/share/PlatformIO/boards/marlin_BigTree_Octopus_Pro_v1_F429.json new file mode 100644 index 000000000000..66ee1c842e52 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/marlin_BigTree_Octopus_Pro_v1_F429.json @@ -0,0 +1,50 @@ +{ + "build": { + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F4 -DSTM32F429xx", + "f_cpu": "168000000L", + "mcu": "stm32f429zgt6", + "product_line": "STM32F429xx", + "variant": "MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429" + }, + "connectivity": [ + "can" + ], + "debug": { + "default_tools": [ + "stlink" + ], + "jlink_device": "STM32F429ZG", + "onboard_tools": [ + "stlink" + ], + "openocd_board": "stm32f429", + "openocd_target": "stm32f4x", + "svd_path": "STM32F429x.svd" + }, + "frameworks": [ + "arduino", + "cmsis", + "mbed", + "stm32cube", + "libopencm3", + "zephyr" + ], + "name": "STM32F429ZG (128k RAM, 64k CCM RAM, 1024k Flash", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 131072, + "maximum_size": 1048576, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f429-439.html", + "vendor": "ST" +} diff --git a/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/PeripheralPins.c new file mode 100644 index 000000000000..d0905853a9a9 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/PeripheralPins.c @@ -0,0 +1,433 @@ +/* + ******************************************************************************* + * Copyright (c) 2016, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +// ===== +// Note: Commented lines are alternative possibilities which are not used per default. +// If you change them, you will have to know what you do +// ===== + + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +const PinMap PinMap_ADC[] = { + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 TH_0 + {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 TH_1 + {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 TH_2 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 TH_3 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 EXP_13 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 PT100 + {NC, NP, 0} + + // {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + // {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + // {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + // {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + //{PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + // {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + // {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + // {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + // {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + // {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + // {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + // {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + // {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + +}; +#endif + +//*** DAC *** + +#ifdef HAL_DAC_MODULE_ENABLED +const PinMap PinMap_DAC[] = { + // {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + // {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - LD2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +const PinMap PinMap_I2C_SDA[] = { + // {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + // {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + // {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + // {PC_7, FMPI2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)}, + // {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + // {PC_12, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +const PinMap PinMap_I2C_SCL[] = { + // {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + // {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + // {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + // {PC_6, FMPI2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +const PinMap PinMap_PWM[] = { + {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 BED + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 HEATER0 + {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 HEATER1 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 HEATER2 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 HEATER3 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 FAN0 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 FAN1 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 FAN2 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 FAN3 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 FAN4 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 FAN5 + + /** + * Unused by specifications on Octopus. + * Uncomment the corresponding line if you want to have HardwarePWM on some pins. + * WARNING: check timers' usage first to avoid conflicts. + * If you don't know what you're doing leave things as they are or you WILL break something (including hardware) + * If you alter this section DO NOT report bugs to Marlin team since they are most likely caused by you. Thank you. + */ + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 BLTOUCH is a "servo" + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 BLTOUCH is a "servo" + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + //{PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + //144 pins mcu, 114 gpio + //{PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + + //176 pins mcu, 140 gpio + //{PH_10, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PH_6, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + //{PH_11, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + //{PI_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + //{PI_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_TX[] = { + // {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + // {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_RX[] = { + // {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PC_5, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + // {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_RTS[] = { + // {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PA_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_CTS[] = { + // {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PB_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_9, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_0, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + // {PB_2, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + // {PC_1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, + // {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PA_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_7, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PB_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + // {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +const PinMap PinMap_CAN_RD[] = { + // {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + // {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + // {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + // {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_CAN_MODULE_ENABLED +const PinMap PinMap_CAN_TD[] = { + // {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + // {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + // {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + // {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {NC, NP, 0} +}; +#endif + +//*** ETHERNET *** + +//*** No Ethernet *** + +//*** QUADSPI *** + +#ifdef HAL_QSPI_MODULE_ENABLED +const PinMap PinMap_QUADSPI[] = { + // {PA_1, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO3 + // {PB_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_CLK + // {PB_6, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK1_NCS + // {PC_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO0 + // {PC_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO1 + // {PC_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK2_NCS + {NC, NP, 0} +}; +#endif + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +const PinMap PinMap_USB_OTG_FS[] = { + // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_OTG_FS_VBUS + // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID + {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM + {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP + {NC, NP, 0} +}; + +const PinMap PinMap_USB_OTG_HS[] = { + //{PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID + //{PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS + {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM + {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP + + /*#error "USB in HS mode isn't supported by the board" + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 + {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 + {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 + {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 + {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP + {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR + {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT + */ + {NC, NP, 0} +}; + + +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + // {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 + // {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + // {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + // {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/PinNamesVar.h new file mode 100644 index 000000000000..bff3f2134987 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/PinNamesVar.h @@ -0,0 +1,30 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, /* SYS_WKUP0 */ +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_OTG_FS_DM = PA_11, + USB_OTG_FS_DP = PA_12, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/hal_conf_extra.h new file mode 100644 index 000000000000..d62c510095c9 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/hal_conf_extra.h @@ -0,0 +1,53 @@ +#pragma once + +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED // Needed for Endstop (and other external) Interrupts +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +//#define HAL_RTC_MODULE_ENABLED // Real Time Clock...do we use it? +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED // by default +//#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) +#define HAL_SD_MODULE_ENABLED + +//#undef HAL_SD_MODULE_ENABLED +#undef HAL_DAC_MODULE_ENABLED +#undef HAL_FLASH_MODULE_ENABLED +#undef HAL_CAN_MODULE_ENABLED +#undef HAL_CAN_LEGACY_MODULE_ENABLED +#undef HAL_CEC_MODULE_ENABLED +#undef HAL_CRYP_MODULE_ENABLED +#undef HAL_DCMI_MODULE_ENABLED +#undef HAL_DMA2D_MODULE_ENABLED +#undef HAL_ETH_MODULE_ENABLED +#undef HAL_NAND_MODULE_ENABLED +#undef HAL_NOR_MODULE_ENABLED +#undef HAL_PCCARD_MODULE_ENABLED +#undef HAL_SRAM_MODULE_ENABLED +#undef HAL_SDRAM_MODULE_ENABLED +#undef HAL_HASH_MODULE_ENABLED +#undef HAL_SMBUS_MODULE_ENABLED +#undef HAL_I2S_MODULE_ENABLED +#undef HAL_IWDG_MODULE_ENABLED +#undef HAL_LTDC_MODULE_ENABLED +#undef HAL_DSI_MODULE_ENABLED +#undef HAL_QSPI_MODULE_ENABLED +#undef HAL_RNG_MODULE_ENABLED +#undef HAL_SAI_MODULE_ENABLED +#undef HAL_IRDA_MODULE_ENABLED +#undef HAL_SMARTCARD_MODULE_ENABLED +#undef HAL_WWDG_MODULE_ENABLED +//#undef HAL_HCD_MODULE_ENABLED +#undef HAL_FMPI2C_MODULE_ENABLED +#undef HAL_SPDIFRX_MODULE_ENABLED +#undef HAL_DFSDM_MODULE_ENABLED +#undef HAL_LPTIM_MODULE_ENABLED +#undef HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/ldscript.ld new file mode 100644 index 000000000000..4cac4ac6e2a7 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/ldscript.ld @@ -0,0 +1,209 @@ +/* +***************************************************************************** +** + +** File : LinkerScript.ld +** +** Abstract : Linker script for STM32F429VGTx Device with +** 2048KByte FLASH, 192KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2014 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20000000 + LD_MAX_DATA_SIZE; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +FLASH (rx) : ORIGIN = 0x08000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +MEMORY_ARRAY (rw) : ORIGIN = 0x10000000, LENGTH = 0x144 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text ALIGN(4): + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata ALIGN(4) : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + _siccmram = LOADADDR(.ccmram); + + /* CCM-RAM section + * + * IMPORTANT NOTE! + * If initialized variables will be placed in this section, + * the startup code needs to be modified to copy the init-values. + */ + .ccmram : + { + . = ALIGN(4); + _sccmram = .; /* create a global symbol at ccmram start */ + *(.ccmram) + *(.ccmram*) + + . = ALIGN(4); + _eccmram = .; /* create a global symbol at ccmram end */ + } >CCMRAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } + ExtRAMData : {*(.ExtRAMData)} >MEMORY_ARRAY +} diff --git a/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/variant.cpp new file mode 100644 index 000000000000..c8ed0d1e52ec --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/variant.cpp @@ -0,0 +1,233 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library 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 2.1 of the License, or (at your option) any later version. + + This library 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 library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Pin number +const PinName digitalPin[] = { + PA_0, //D0 + PA_1, //D1 + PA_2, //D2 + PA_3, //D3 + PA_4, //D4 + PA_5, //D5 + PA_6, //D6 + PA_7, //D7 + PA_8, //D8 + PA_9, //D9 + PA_10, //D10 + PA_11, //D11 + PA_12, //D12 + PA_13, //D13 + PA_14, //D14 + PA_15, //D15 + PB_0, //D16 + PB_1, //D17 + PB_2, //D18 + PB_3, //D19 + PB_4, //D20 + PB_5, //D21 + PB_6, //D22 + PB_7, //D23 + PB_8, //D24 + PB_9, //D25 + PB_10, //D26 + PB_11, //D27 + PB_12, //D28 + PB_13, //D29 + PB_14, //D30 + PB_15, //D31 + PC_0, //D32 + PC_1, //D33 + PC_2, //D34 + PC_3, //D35 + PC_4, //D36 + PC_5, //D37 + PC_6, //D38 + PC_7, //D39 + PC_8, //D40 + PC_9, //D41 + PC_10, //D42 + PC_11, //D43 + PC_12, //D44 + PC_13, //D45 + PC_14, //D46 + PC_15, //D47 + PD_0, //D48 + PD_1, //D49 + PD_2, //D50 + PD_3, //D51 + PD_4, //D52 + PD_5, //D53 + PD_6, //D54 + PD_7, //D55 + PD_8, //D56 + PD_9, //D57 + PD_10, //D58 + PD_11, //D59 + PD_12, //D60 + PD_13, //D61 + PD_14, //D62 + PD_15, //D63 + PE_0, //D64 + PE_1, //D65 + PE_2, //D66 + PE_3, //D67 + PE_4, //D68 + PE_5, //D69 + PE_6, //D70 + PE_7, //D71 + PE_8, //D72 + PE_9, //D73 + PE_10, //D74 + PE_11, //D75 + PE_12, //D76 + PE_13, //D77 + PE_14, //D78 + PE_15, //D79 + PF_0, //D80 + PF_1, //D81 + PF_2, //D82 + PF_3, //D83 + PF_4, //D84 + PF_5, //D85 + PF_6, //D86 + PF_7, //D87 + PF_8, //D88 + PF_9, //D89 + PF_10, //D90 + PF_11, //D91 + PF_12, //D92 + PF_13, //D93 + PF_14, //D94 + PF_15, //D95 + PG_0, //D96 + PG_1, //D97 + PG_2, //D98 + PG_3, //D99 + PG_4, //D100 + PG_5, //D101 + PG_6, //D102 + PG_7, //D103 + PG_8, //D104 + PG_9, //D105 + PG_10, //D106 + PG_11, //D107 + PG_12, //D108 + PG_13, //D109 + PG_14, //D110 + PG_15, //D111 + + //Duplicated ADC Pins + PA_3, //D112/A0 + PA_4, //D113/A1 + PC_0, //D114/A2 + PC_1, //D115/A3 + PC_2, //D116/A4 + PC_3, //D117/A5 + PC_4, //D118/A6 + PF_3, //D119/A16 - 1:FSMC_A3 2:ADC3_IN9 + PF_4, //D120/A17 - 1:FSMC_A4 2:ADC3_IN14 + PF_5, //D121/A18 - 1:FSMC_A5 2:ADC3_IN15 + PF_6, //D122/A19 - 1:TIM10_CH1 2:ADC3_IN4 + PF_7, //D123/A20 - 1:TIM11_CH1 2:ADC3_IN5 + PF_8, //D124/A20 - 1:TIM11_CH1 2:ADC3_IN6 +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief System Clock Configuration + * The system Clock is configured as follow : + * System Clock source = PLL (HSE) + * SYSCLK(Hz) = 168000000 + * HCLK(Hz) = 168000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 4 + * APB2 Prescaler = 2 + * HSE Frequency(Hz) = 8000000 + * PLL_M = 8 + * PLL_N = 336 + * PLL_P = 2 + * PLL_Q = 7 + * VDD(V) = 3.3 + * Main regulator output voltage = Scale1 mode + * Flash Latency(WS) = 5 + * @param None + * @retval None + */ +WEAK void SystemClock_Config(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + + /* Enable Power Control clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /* Enable HSE Oscillator and activate PLL with HSE as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + /* Initialization Error */ + } + + if(HAL_PWREx_EnableOverDrive() != HAL_OK) + { + /* Initialization Error */ + } + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 + clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + /* Initialization Error */ + } +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/variant.h new file mode 100644 index 000000000000..0147ece0ab20 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429/variant.h @@ -0,0 +1,216 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library 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 2.1 of the License, or (at your option) any later version. + + This library 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 library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +#define PA0 0 //D0 +#define PA1 1 //D1 +#define PA2 2 //D2 +#define PA3 3 //D3 +#define PA4 4 //D4 +#define PA5 5 //D5 +#define PA6 6 //D6 +#define PA7 7 //D7 +#define PA8 8 //D8 +#define PA9 9 //D9 +#define PA10 10 //D10 +#define PA11 11 //D11 +#define PA12 12 //D12 +#define PA13 13 //D13 +#define PA14 14 //D14 +#define PA15 15 //D15 +#define PB0 16 //D16 +#define PB1 17 //D17 +#define PB2 18 //D18 +#define PB3 19 //D19 +#define PB4 20 //D20 +#define PB5 21 //D21 +#define PB6 22 //D22 +#define PB7 23 //D23 +#define PB8 24 //D24 +#define PB9 25 //D25 +#define PB10 26 //D26 +#define PB11 27 //D27 +#define PB12 28 //D28 +#define PB13 29 //D29 +#define PB14 30 //D30 +#define PB15 31 //D31 +#define PC0 32 //D32 +#define PC1 33 //D33 +#define PC2 34 //D34 +#define PC3 35 //D35 +#define PC4 36 //D36 +#define PC5 37 //D37 +#define PC6 38 //D38 +#define PC7 39 //D39 +#define PC8 40 //D40 +#define PC9 41 //D41 +#define PC10 42 //D42 +#define PC11 43 //D43 +#define PC12 44 //D44 +#define PC13 45 //D45 +#define PC14 46 //D46 +#define PC15 47 //D47 +#define PD0 48 //D48 +#define PD1 49 //D49 +#define PD2 50 //D50 +#define PD3 51 //D51 +#define PD4 52 //D52 +#define PD5 53 //D53 +#define PD6 54 //D54 +#define PD7 55 //D55 +#define PD8 56 //D56 +#define PD9 57 //D57 +#define PD10 58 //D58 +#define PD11 59 //D59 +#define PD12 60 //D60 +#define PD13 61 //D61 +#define PD14 62 //D62 +#define PD15 63 //D63 +#define PE0 64 //D64 +#define PE1 65 //D65 +#define PE2 66 //D66 +#define PE3 67 //D67 +#define PE4 68 //D68 +#define PE5 69 //D69 +#define PE6 70 //D70 +#define PE7 71 //D71 +#define PE8 72 //D72 +#define PE9 73 //D73 +#define PE10 74 //D74 +#define PE11 75 //D75 +#define PE12 76 //D76 +#define PE13 77 //D77 +#define PE14 78 //D78 +#define PE15 79 //D79 +#define PF0 80 //D64 +#define PF1 81 //D65 +#define PF2 82 //D66 +#define PF3 83 //D67 +#define PF4 84 //D68 +#define PF5 85 //D69 +#define PF6 86 //D70 +#define PF7 87 //D71 +#define PF8 88 //D72 +#define PF9 89 //D73 +#define PF10 90 //D74 +#define PF11 91 //D75 +#define PF12 92 //D76 +#define PF13 93 //D77 +#define PF14 94 //D78 +#define PF15 95 //D79 +#define PG0 96 //D64 +#define PG1 97 //D65 +#define PG2 98 //D66 +#define PG3 99 //D67 +#define PG4 100 //D68 +#define PG5 101 //D69 +#define PG6 102 //D70 +#define PG7 103 //D71 +#define PG8 104 //D72 +#define PG9 105 //D73 +#define PG10 106 //D74 +#define PG11 107 //D75 +#define PG12 108 //D76 +#define PG13 109 //D77 +#define PG14 110 //D78 +#define PG15 111 //D79 + +// This must be a literal with the same value as PEND +#define NUM_DIGITAL_PINS 125 +// This must be a literal with a value less than or equal to to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 13 +#define NUM_ANALOG_FIRST 112 + +//#define ADC_RESOLUTION 12 + +// PWM resolution +//#define PWM_RESOLUTION 12 +#define PWM_FREQUENCY 1000 // >= 20 Khz => inaudible noise for fans +#define PWM_MAX_DUTY_CYCLE 255 + +// SPI Definitions +#define PIN_SPI_SS PA4 +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 + +// I2C Definitions +#define PIN_WIRE_SDA PB9 +#define PIN_WIRE_SCL PB8 + +// Timer Definitions +// Do not use timer used by PWM pin. See PinMap_PWM. +#define TIMER_TONE TIM6 +#define TIMER_SERVO TIM5 +#define TIMER_SERIAL TIM7 + +// UART Definitions +//#define SERIAL_UART_INSTANCE 1 // Connected to EXP3 header +/* Enable Serial 3 */ +#define HAVE_HWSERIAL1 +#define HAVE_HWSERIAL3 + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +/* HAL configuration */ +#define HSE_VALUE 8000000U + +#define FLASH_PAGE_SIZE (4U * 1024U) + +#ifdef __cplusplus +} // extern "C" +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_HARDWARE_OPEN Serial +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index a6bc125d219a..3e0c400a6b2b 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -255,6 +255,31 @@ build_flags = ${stm_flash_drive.build_flags} -DUSBD_IRQ_SUBPRIO=6 -DUSBD_USE_CDC_MSC +# +# BigTreeTech Octopus Pro V1.0 (STM32F429ZGT6 ARM Cortex-M4) +# +[env:BIGTREE_OCTOPUS_PRO_V1_F429] +platform = ${common_stm32.platform} +extends = stm32_variant +board = marlin_BigTree_Octopus_Pro_v1_F429 +board_build.offset = 0x8000 +build_flags = ${stm32_variant.build_flags} + -DUSE_USB_HS_IN_FS + +# +# BigTreeTech Octopus Pro V1.0 (STM32F429ZGT6 ARM Cortex-M4) with USB Flash Drive Support +# +[env:BIGTREE_OCTOPUS_PRO_V1_F429_USB] +platform = ${common_stm32.platform} +extends = env:BIGTREE_OCTOPUS_PRO_V1_F429 +platform_packages = ${stm_flash_drive.platform_packages} +build_unflags = -DUSBD_USE_CDC +build_flags = ${stm_flash_drive.build_flags} + -DSTM32F446_5VX -DUSE_USB_HS_IN_FS + -DUSE_USBHOST_HS -DUSBD_IRQ_PRIO=5 + -DUSBD_IRQ_SUBPRIO=6 + -DUSBD_USE_CDC_MSC + # # Lerdge base # From 930cb7c3175eb85866bb673a861f8945c3c18726 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Tue, 26 Oct 2021 10:02:29 +1300 Subject: [PATCH 11/78] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Add'l=20PCINTs=20for?= =?UTF-8?q?=20Mega=20Extended=20(#23019)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../variants/MARLIN_MEGA_EXTENDED/pins_arduino.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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 dbbb7b48327a..1129f8edae10 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h @@ -85,19 +85,23 @@ static const uint8_t A15 = PIN_A15; // A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins) // Only pins available for RECEIVE (TRANSMIT can be on any pin): // (I've deliberately left out pin mapping to the Hardware USARTs - seems senseless to me) -// Pins: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 +// Pins: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69, 72, 73, 75, 76, 77 #define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 13)) || \ (((p) >= 50) && ((p) <= 53)) || \ - (((p) >= 62) && ((p) <= 69)) ? (&PCICR) : nullptr ) + (((p) >= 62) && ((p) <= 69)) || \ + (((p) >= 72) && ((p) <= 73)) || \ + (((p) >= 75) && ((p) <= 77)) ? (&PCICR) : nullptr ) #define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \ ( (((p) >= 62) && ((p) <= 69)) ? 2 : \ - 0 ) ) + ( (((p) >= 72) && ((p) <= 73)) || (((p) >= 75) && ((p) <= 77)) ? 1 : \ + 0 ) ) ) #define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \ ( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \ - nullptr ) ) + ( (((p) >= 72) && ((p) <= 73)) || (((p) >= 75) && ((p) <= 77)) ? (&PCMSK1) : \ + nullptr ) ) ) #define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \ ( ((p) == 50) ? 3 : \ @@ -105,7 +109,9 @@ static const uint8_t A15 = PIN_A15; ( ((p) == 52) ? 1 : \ ( ((p) == 53) ? 0 : \ ( (((p) >= 62) && ((p) <= 69)) ? ((p) - 62) : \ - 0 ) ) ) ) ) ) + ( (((p) >= 72) && ((p) <= 73)) ? ((p) - 69) : \ + ( (((p) >= 75) && ((p) <= 77)) ? ((p) - 70) : \ + 0 ) ) ) ) ) ) ) ) #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : ((p) >= 18 && (p) <= 21 ? 23 - (p) : NOT_AN_INTERRUPT))) From 73875cf9ccd4b23bbe2a46bb57192109b7d1a7c6 Mon Sep 17 00:00:00 2001 From: tombrazier <68918209+tombrazier@users.noreply.github.com> Date: Mon, 25 Oct 2021 22:29:40 +0100 Subject: [PATCH 12/78] =?UTF-8?q?=F0=9F=9A=B8=20Default=20T0=20for=20M569,?= =?UTF-8?q?=20M906,=20M913=20(#23020)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/feature/L6470/M906.cpp | 2 +- Marlin/src/gcode/feature/trinamic/M569.cpp | 2 +- Marlin/src/gcode/feature/trinamic/M906.cpp | 2 +- Marlin/src/gcode/feature/trinamic/M911-M914.cpp | 2 +- Marlin/src/gcode/gcode.cpp | 9 +++++---- Marlin/src/gcode/gcode.h | 2 +- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Marlin/src/gcode/feature/L6470/M906.cpp b/Marlin/src/gcode/feature/L6470/M906.cpp index a74365e84d07..d058ce5501ae 100644 --- a/Marlin/src/gcode/feature/L6470/M906.cpp +++ b/Marlin/src/gcode/feature/L6470/M906.cpp @@ -280,7 +280,7 @@ void GcodeSuite::M906() { #if E_STEPPERS case E_AXIS: { - const int8_t target_e_stepper = get_target_e_stepper_from_command(); + const int8_t target_e_stepper = get_target_e_stepper_from_command(0); if (target_e_stepper < 0) return; switch (target_e_stepper) { #if AXIS_IS_L64XX(E0) diff --git a/Marlin/src/gcode/feature/trinamic/M569.cpp b/Marlin/src/gcode/feature/trinamic/M569.cpp index 2803c445927e..cb33d46d2528 100644 --- a/Marlin/src/gcode/feature/trinamic/M569.cpp +++ b/Marlin/src/gcode/feature/trinamic/M569.cpp @@ -133,7 +133,7 @@ static void say_stealth_status() { */ void GcodeSuite::M569() { if (parser.seen('S')) - set_stealth_status(parser.value_bool(), get_target_e_stepper_from_command()); + set_stealth_status(parser.value_bool(), get_target_e_stepper_from_command(0)); else say_stealth_status(); } diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp index 74596831d312..f28718c831ba 100644 --- a/Marlin/src/gcode/feature/trinamic/M906.cpp +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -104,7 +104,7 @@ void GcodeSuite::M906() { #if E_STEPPERS case E_AXIS: { - const int8_t target_e_stepper = get_target_e_stepper_from_command(); + const int8_t target_e_stepper = get_target_e_stepper_from_command(0); if (target_e_stepper < 0) return; switch (target_e_stepper) { #if AXIS_IS_TMC(E0) diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp index 6e177960ef89..3f83558fd428 100644 --- a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp +++ b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp @@ -268,7 +268,7 @@ break; #if E_STEPPERS case E_AXIS: { - const int8_t target_e_stepper = get_target_e_stepper_from_command(); + const int8_t target_e_stepper = get_target_e_stepper_from_command(0); if (target_e_stepper < 0) return; switch (target_e_stepper) { TERN_(E0_HAS_STEALTHCHOP, case 0: TMC_SET_PWMTHRS_E(0); break;) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index ef219351850f..30c7d926e02b 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -137,11 +137,12 @@ int8_t GcodeSuite::get_target_extruder_from_command() { } /** - * Get the target e stepper from the T parameter - * Return -1 if the T parameter is out of range or unspecified + * 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. */ -int8_t GcodeSuite::get_target_e_stepper_from_command() { - const int8_t e = parser.intval('T', -1); +int8_t GcodeSuite::get_target_e_stepper_from_command(const int8_t dval/*=-1*/) { + const int8_t e = parser.intval('T', dval); if (WITHIN(e, 0, E_STEPPERS - 1)) return e; SERIAL_ECHO_START(); diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 21f0d3942f40..5ad4750fe451 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -390,7 +390,7 @@ class GcodeSuite { static void say_units(); static int8_t get_target_extruder_from_command(); - static int8_t get_target_e_stepper_from_command(); + static int8_t get_target_e_stepper_from_command(const int8_t dval=-1); static void get_destination_from_command(); static void process_parsed_command(const bool no_ok=false); From 79626062d03f2f336b43378cc950ead9bffc8703 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 26 Oct 2021 00:59:45 +0000 Subject: [PATCH 13/78] [cron] Bump distribution date (2021-10-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 c158f2732e47..311c36aa31c5 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 "2021-10-25" +//#define STRING_DISTRIBUTION_DATE "2021-10-26" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 5dea5c709cc6..39fc8dc23389 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 "2021-10-25" + #define STRING_DISTRIBUTION_DATE "2021-10-26" #endif /** From 9338b7f06e03fd27ac8b2babb96e92a2701700ad Mon Sep 17 00:00:00 2001 From: woisy00 Date: Wed, 27 Oct 2021 01:05:34 +0200 Subject: [PATCH 14/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20AUTOTEMP=20bug=20(th?= =?UTF-8?q?ermal=20runaway)=20(#23025)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Regression from 9823a37 --- Marlin/Configuration_adv.h | 2 +- Marlin/src/module/planner.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index fbf2c419439a..d6217ba94061 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -414,7 +414,7 @@ */ #define AUTOTEMP #if ENABLED(AUTOTEMP) - #define AUTOTEMP_OLDWEIGHT 0.98 + #define AUTOTEMP_OLDWEIGHT 0.98 // Factor used to weight previous readings (0.0 < value < 1.0) // Turn on AUTOTEMP on M104/M109 by default using proportions set here //#define AUTOTEMP_PROPORTIONAL #if ENABLED(AUTOTEMP_PROPORTIONAL) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index b89a313f2bcb..2552efc69a26 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1457,7 +1457,7 @@ void Planner::check_axes_activity() { float t = autotemp_min + high * autotemp_factor; LIMIT(t, autotemp_min, autotemp_max); - if (t < oldt) t *= (1.0f - (AUTOTEMP_OLDWEIGHT)) + oldt * (AUTOTEMP_OLDWEIGHT); + if (t < oldt) t = t * (1.0f - (AUTOTEMP_OLDWEIGHT)) + oldt * (AUTOTEMP_OLDWEIGHT); oldt = t; thermalManager.setTargetHotend(t, active_extruder); } From 65dfc407a5a57eaaa036475b079153efdd1a51da Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 26 Oct 2021 19:36:16 -0500 Subject: [PATCH 15/78] =?UTF-8?q?=F0=9F=9A=B8=20Tweaks=20to=20UBL=20G29=20?= =?UTF-8?q?Q?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index d78a5e25786e..df83923fef0a 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -346,13 +346,14 @@ void unified_bed_leveling::G29() { if (parser.seen('Q')) { const int16_t test_pattern = parser.has_value() ? parser.value_int() : -99; - if (!WITHIN(test_pattern, -1, 2)) { - SERIAL_ECHOLNPGM("Invalid test_pattern value. (-1 to 2)\n"); + if (!WITHIN(test_pattern, TERN0(UBL_DEVEL_DEBUGGING, -1), 2)) { + SERIAL_ECHOLNPGM("?Invalid (Q) test pattern. (" TERN(UBL_DEVEL_DEBUGGING, "-1", "0") " to 2)\n"); return; } - SERIAL_ECHOLNPGM("Loading test_pattern values.\n"); + SERIAL_ECHOLNPGM("Applying test pattern.\n"); switch (test_pattern) { + default: case -1: TERN_(UBL_DEVEL_DEBUGGING, g29_eeprom_dump()); break; case 0: From de6dfc9abc9aed3769c92ab89e35ee598424c3fe Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 27 Oct 2021 01:02:46 +0000 Subject: [PATCH 16/78] [cron] Bump distribution date (2021-10-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 311c36aa31c5..8bfe27d29edf 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 "2021-10-26" +//#define STRING_DISTRIBUTION_DATE "2021-10-27" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 39fc8dc23389..904e519c206e 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 "2021-10-26" + #define STRING_DISTRIBUTION_DATE "2021-10-27" #endif /** From 2199ae77c80aa419a580f9ed8dc2f11ecddd6912 Mon Sep 17 00:00:00 2001 From: tome9111991 <57866234+tome9111991@users.noreply.github.com> Date: Wed, 27 Oct 2021 21:58:32 +0200 Subject: [PATCH 17/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20E3V2=20(CrealityUI)?= =?UTF-8?q?=20position=20display=20(#23023)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #23005, #22778 --- Marlin/src/lcd/e3v2/creality/dwin.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/e3v2/creality/dwin.cpp b/Marlin/src/lcd/e3v2/creality/dwin.cpp index 3326ccb1f31d..0f8a7397289c 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -1659,7 +1659,7 @@ void _update_axis_value(const AxisEnum axis, const uint16_t x, const uint16_t y, else if (blink && draw_empty) DWIN_Draw_String(true, font8x16, Color_White, Color_Bg_Black, x, y, F(" ")); else - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, x, y, p * 10); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, x, y, p); } } @@ -1769,11 +1769,11 @@ void update_variable() { if (BABY_Z_VAR != _offset) { _offset = BABY_Z_VAR; if (BABY_Z_VAR < 0) { - Draw_Stat_Float(207, 417, -_offset * 100); + Draw_Stat_Float(207, 417, -_offset); DWIN_Draw_String(true, font8x16, Color_White, Color_Bg_Black, 205, 419, F("-")); } else { - Draw_Stat_Float(207, 417, _offset * 100); + Draw_Stat_Float(207, 417, _offset); DWIN_Draw_String(true, font8x16, Color_White, Color_Bg_Black, 205, 419, F(" ")); } } From 3f6c8d5dc56938f95edaecddf20e9b76aec6df29 Mon Sep 17 00:00:00 2001 From: somehibs Date: Wed, 27 Oct 2021 21:00:02 +0100 Subject: [PATCH 18/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20serial=20PORT=5FREST?= =?UTF-8?q?ORE=20(and=20BUFFER=5FMONITORING)=20(#23022)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/core/serial.h | 2 +- Marlin/src/gcode/queue.cpp | 2 +- Marlin/src/libs/autoreport.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index e058f1e5cdbf..aee4d4d43db8 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -87,7 +87,7 @@ extern uint8_t marlin_debug_flags; // interface with the ability to output to multiple serial ports. #if HAS_MULTI_SERIAL #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) - #define _PORT_RESTORE(n,p) RESTORE(n) + #define _PORT_RESTORE(n) RESTORE(n) #define SERIAL_ASSERT(P) if (multiSerial.portMask!=(P)) { debugger(); } // If we have a catchall, use that directly #ifdef SERIAL_CATCHALL diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index cc072e51a194..fd98a39cd6cb 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -719,7 +719,7 @@ void GCodeQueue::advance() { if (auto_buffer_report_interval && ELAPSED(ms, next_buffer_report_ms)) { next_buffer_report_ms = ms + 1000UL * auto_buffer_report_interval; - PORT_REDIRECT(SERIAL_BOTH); + PORT_REDIRECT(SerialMask::All); report_buffer_statistics(); PORT_RESTORE(); } diff --git a/Marlin/src/libs/autoreport.h b/Marlin/src/libs/autoreport.h index a6bc5adbf770..9aa74ab81e08 100644 --- a/Marlin/src/libs/autoreport.h +++ b/Marlin/src/libs/autoreport.h @@ -44,7 +44,7 @@ struct AutoReporter { next_report_ms = ms + SEC_TO_MS(report_interval); PORT_REDIRECT(report_port_mask); Helper::report(); - //PORT_RESTORE(); + PORT_RESTORE(); } } }; From 11f1335efb448c5774c92ca14a72e6dbec9dac23 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Thu, 28 Oct 2021 09:06:06 +1300 Subject: [PATCH 19/78] =?UTF-8?q?=F0=9F=A9=B9=20Retain=20LCD=20pins=20with?= =?UTF-8?q?=20motor=20expansion=20(#23024)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index dc82a2857f20..a072242adc74 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -281,7 +281,7 @@ #define BEEPER_PIN EXP1_05_PIN #endif -#elif HAS_WIRED_LCD && !BTT_MOTOR_EXPANSION +#elif HAS_WIRED_LCD #if ENABLED(ANET_FULL_GRAPHICS_LCD_ALT_WIRING) #error "CAUTION! ANET_FULL_GRAPHICS_LCD_ALT_WIRING requires wiring modifications. See 'pins_BTT_SKR_V1_4.h' for details. Comment out this line to continue." From c0337da6334923ea7b65bcd4f9c1ea08c8b33cf2 Mon Sep 17 00:00:00 2001 From: Zlopi Date: Wed, 27 Oct 2021 23:10:46 +0300 Subject: [PATCH 20/78] =?UTF-8?q?=F0=9F=9A=B8=20Scroll=20long=20filename?= =?UTF-8?q?=20on=20MKS=20TFT=20(#23031)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/tft/ui_common.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/tft/ui_common.cpp b/Marlin/src/lcd/tft/ui_common.cpp index e152ceab505b..8c503d2c9eea 100644 --- a/Marlin/src/lcd/tft/ui_common.cpp +++ b/Marlin/src/lcd/tft/ui_common.cpp @@ -167,8 +167,7 @@ void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { menu_item(row); tft_string.set(pstr, itemIndex, itemString); - if (vstr) - tft_string.add(vstr); + if (vstr) tft_string.add(vstr); tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); } @@ -176,9 +175,9 @@ void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t st void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { menu_item(row, sel); - if (isDir) - tft.add_image(MENU_ITEM_ICON_X, MENU_ITEM_ICON_Y, imgDirectory, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - tft.add_text(MENU_ITEM_ICON_SPACE, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, theCard.longest_filename()); + if (isDir) tft.add_image(MENU_ITEM_ICON_X, MENU_ITEM_ICON_Y, imgDirectory, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + constexpr uint8_t maxlen = (MENU_ITEM_HEIGHT) - (MENU_TEXT_Y_OFFSET) + 1; + tft.add_text(MENU_ITEM_ICON_SPACE, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, ui.scrolled_filename(theCard, maxlen, row, sel)); } #endif From fbc125b06c0858d1dbdd29908ad862ed25918b3b Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 28 Oct 2021 01:00:14 +0000 Subject: [PATCH 21/78] [cron] Bump distribution date (2021-10-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 8bfe27d29edf..e61ec1b4e7e7 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 "2021-10-27" +//#define STRING_DISTRIBUTION_DATE "2021-10-28" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 904e519c206e..a1ad05bd3ab6 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 "2021-10-27" + #define STRING_DISTRIBUTION_DATE "2021-10-28" #endif /** From aa2c6387e95bdab955499627e3890561842f0a6a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 26 Oct 2021 21:54:43 -0500 Subject: [PATCH 22/78] =?UTF-8?q?=F0=9F=8E=A8=20Apply=20HAS=5FMULTI=5FHOTE?= =?UTF-8?q?ND=20conditional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lcd/e3v2/marlinui/ui_status_480x272.cpp | 15 +++---- .../src/lcd/extui/dgus/DGUSScreenHandler.cpp | 8 ++-- .../lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp | 12 ++--- .../extui/dgus/fysetc/DGUSScreenHandler.cpp | 4 +- .../lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp | 44 ++++++++----------- .../extui/dgus/hiprecy/DGUSScreenHandler.cpp | 6 +-- .../src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp | 10 ++--- .../lcd/extui/dgus/origin/DGUSDisplayDef.cpp | 10 ++--- .../extui/dgus/origin/DGUSScreenHandler.cpp | 6 +-- .../lcd/extui/dgus_reloaded/DGUSRxHandler.cpp | 12 ++--- .../lcd/extui/dgus_reloaded/DGUSTxHandler.cpp | 8 ++-- .../extui/dgus_reloaded/config/DGUS_Addr.h | 4 +- .../dgus_reloaded/definition/DGUS_VPList.cpp | 4 +- Marlin/src/lcd/menu/menu_temperature.cpp | 7 +-- Marlin/src/lcd/tft/ui_common.h | 4 +- Marlin/src/pins/esp32/pins_E4D.h | 2 +- Marlin/src/pins/esp32/pins_FYSETC_E4.h | 2 +- Marlin/src/pins/esp32/pins_MRR_ESPA.h | 2 +- Marlin/src/pins/esp32/pins_MRR_ESPE.h | 2 +- Marlin/src/pins/ramps/pins_K8600.h | 2 +- Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h | 2 +- .../src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V452.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V453.h | 2 +- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 2 +- .../src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 2 +- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h | 2 +- .../pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 2 +- .../src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 2 +- Marlin/src/pins/stm32f4/pins_ANET_ET4.h | 2 +- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 2 +- Marlin/src/pins/stm32f7/pins_REMRAM_V1.h | 2 +- 41 files changed, 100 insertions(+), 106 deletions(-) diff --git a/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp b/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp index 703db2ee45de..306e9044f703 100644 --- a/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp +++ b/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp @@ -132,20 +132,19 @@ FORCE_INLINE void _draw_fan_status(const uint16_t x, const uint16_t y) { } } -#if HOTENDS > 2 - #define HOTEND_STATS 3 -#elif HOTENDS > 1 - #define HOTEND_STATS 2 -#elif HAS_HOTEND - #define HOTEND_STATS 1 -#endif - /** * Draw a single heater icon with current and target temperature, at the given XY */ FORCE_INLINE void _draw_heater_status(const heater_id_t heater, const uint16_t x, const uint16_t y) { #if HAS_HOTEND + #if HOTENDS > 2 + #define HOTEND_STATS 3 + #elif HOTENDS > 1 + #define HOTEND_STATS 2 + #elif HAS_HOTEND + #define HOTEND_STATS 1 + #endif static celsius_t old_temp[HOTEND_STATS] = ARRAY_N_1(HOTEND_STATS, 500), old_target[HOTEND_STATS] = ARRAY_N_1(HOTEND_STATS, 500); static bool old_on[HOTEND_STATS] = ARRAY_N_1(HOTEND_STATS, false); diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp index c9e7268f04dd..be08b074ff53 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp @@ -185,7 +185,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { case VP_E0_PID_I: valuesend = unscalePID_i(value); break; case VP_E0_PID_D: valuesend = unscalePID_d(value); break; #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND case VP_E1_PID_P: valuesend = value; break; case VP_E1_PID_I: valuesend = unscalePID_i(value); break; case VP_E1_PID_D: valuesend = unscalePID_d(value); break; @@ -400,7 +400,7 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va acceptedvalue = thermalManager.degTargetHotend(0); break; #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND case VP_T_E1_Set: NOMORE(newvalue, HEATER_1_MAXTEMP); thermalManager.setTargetHotend(newvalue, 1); @@ -551,7 +551,7 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E0); break; #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND case VP_PID_AUTOTUNE_E1: sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E1); break; @@ -598,7 +598,7 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr switch (var.VP) { #if HAS_HOTEND case VP_E0_CONTROL: - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND case VP_E1_CONTROL: #if HOTENDS >= 3 case VP_E2_CONTROL: diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp index d73a7ea552a6..a4c0997bf8a0 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp @@ -51,7 +51,7 @@ const uint16_t VPList_Main[] PROGMEM = { #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, VP_E0_STATUS, #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #if HAS_HEATED_BED @@ -73,7 +73,7 @@ const uint16_t VPList_Temp[] PROGMEM = { #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #if HAS_HEATED_BED @@ -87,7 +87,7 @@ const uint16_t VPList_Status[] PROGMEM = { #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #if HAS_HEATED_BED @@ -120,7 +120,7 @@ const uint16_t VPList_Preheat[] PROGMEM = { #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #if HAS_HEATED_BED @@ -187,7 +187,7 @@ const uint16_t VPList_SD_PrintManipulation[] PROGMEM = { #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #if HAS_HEATED_BED @@ -379,7 +379,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, ScreenHandler.HandleFilamentOption, ScreenHandler.HandleFilamentLoadUnload), #endif #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay), // ERROR: Flow is per-extruder, not per-hotend diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp index 2f08136cbb00..750acece1c06 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp @@ -256,7 +256,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { case VP_E0_PID_I: newvalue = scalePID_i(value); break; case VP_E0_PID_D: newvalue = scalePID_d(value); break; #endif - #if HOTENDS >= 2 + #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; @@ -334,7 +334,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #if HAS_HOTEND thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); #endif GotoScreen(DGUSLCD_SCREEN_UTILITY); diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp index bdcff47ae812..f3f361f84e83 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp @@ -50,7 +50,7 @@ const uint16_t VPList_Main[] PROGMEM = { // VP_M117, for completeness, but it cannot be auto-uploaded. #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, VP_E0_STATUS, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #endif @@ -72,7 +72,7 @@ const uint16_t VPList_Main[] PROGMEM = { const uint16_t VPList_Temp[] PROGMEM = { #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #endif @@ -86,7 +86,7 @@ const uint16_t VPList_Status[] PROGMEM = { // VP_M117, for completeness, but it cannot be auto-uploaded #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #endif @@ -107,7 +107,7 @@ const uint16_t VPList_Status2[] PROGMEM = { // VP_M117, for completeness, but it cannot be auto-uploaded #if HAS_HOTEND VP_Flowrate_E0, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_Flowrate_E1, #endif #endif @@ -119,7 +119,7 @@ const uint16_t VPList_Status2[] PROGMEM = { const uint16_t VPList_Preheat[] PROGMEM = { #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #endif @@ -137,7 +137,7 @@ const uint16_t VPList_ManualMove[] PROGMEM = { const uint16_t VPList_ManualExtrude[] PROGMEM = { #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #endif @@ -159,7 +159,7 @@ const uint16_t VPList_Filament_heating[] PROGMEM = { #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, VP_E0_FILAMENT_LOAD_UNLOAD, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #endif @@ -169,7 +169,7 @@ const uint16_t VPList_Filament_heating[] PROGMEM = { const uint16_t VPList_Filament_load_unload[] PROGMEM = { #if HAS_HOTEND VP_E0_FILAMENT_LOAD_UNLOAD, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_E1_FILAMENT_LOAD_UNLOAD, #endif #endif @@ -185,7 +185,7 @@ const uint16_t VPList_SD_PrintManipulation[] PROGMEM = { VP_PrintProgress_Percentage, VP_PrintTime, #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #endif @@ -205,7 +205,7 @@ const uint16_t VPList_SD_PrintManipulation[] PROGMEM = { const uint16_t VPList_SDPrintTune[] PROGMEM = { #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #endif @@ -222,23 +222,17 @@ const uint16_t VPList_SDPrintTune[] PROGMEM = { }; const uint16_t VPList_StepPerMM[] PROGMEM = { - VP_X_STEP_PER_MM, - VP_Y_STEP_PER_MM, - VP_Z_STEP_PER_MM, - #if HAS_HOTEND - VP_E0_STEP_PER_MM, - #if HOTENDS >= 2 - VP_E1_STEP_PER_MM, - #endif - #endif - 0x0000 + VP_X_STEP_PER_MM + , VP_Y_STEP_PER_MM + , VP_Z_STEP_PER_MM + OPTARG(HAS_HOTEND, VP_E0_STEP_PER_MM) + OPTARG(HAS_MULTI_HOTEND, VP_E1_STEP_PER_MM) + , 0x0000 }; const uint16_t VPList_PIDE0[] PROGMEM = { #if ENABLED(PIDTEMP) - VP_E0_PID_P, - VP_E0_PID_I, - VP_E0_PID_D, + VP_E0_PID_P, VP_E0_PID_I, VP_E0_PID_D, #endif 0x0000 }; @@ -382,7 +376,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, ScreenHandler.HandlePIDAutotune, nullptr), #endif #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay), @@ -435,7 +429,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #if HAS_HOTEND VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #endif #endif diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp index f72a9f439d83..79a3cb91038d 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp @@ -256,7 +256,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { case VP_E0_PID_I: newvalue = scalePID_i(value); break; case VP_E0_PID_D: newvalue = scalePID_d(value); break; #endif - #if HOTENDS >= 2 + #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; @@ -333,7 +333,7 @@ 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); - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); #endif #endif @@ -348,7 +348,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND case VP_E1_FILAMENT_LOAD_UNLOAD: filament_data.extruder = ExtUI::extruder_t::E1; thermalManager.setTargetHotend(e_temp, filament_data.extruder); diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp index 9ecfb57397b9..ff013967c08d 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp @@ -122,7 +122,7 @@ const uint16_t VPList_Main[] PROGMEM = { // VP_M117, for completeness, but it cannot be auto-uploaded. #if HAS_HOTEND MKSLIST_E_ITEM(0) VP_E0_STATUS, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND MKSLIST_E_ITEM(1) VP_E1_STATUS, #endif #endif @@ -567,7 +567,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay), @@ -656,7 +656,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_HOTEND VPHELPER(VP_E0_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(0)], ScreenHandler.HandleExtruderMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VPHELPER(VP_E1_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], ScreenHandler.HandleExtruderMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), #endif #endif @@ -667,7 +667,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_HOTEND VPHELPER(VP_E0_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(0)], ScreenHandler.HandleExtruderAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VPHELPER(VP_E1_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], ScreenHandler.HandleExtruderAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), #endif #endif @@ -744,7 +744,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_HOTEND VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), #endif #endif diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp index 2f5e2787d615..0115d3b8c13b 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp @@ -57,7 +57,7 @@ const uint16_t VPList_Main[] PROGMEM = { const uint16_t VPList_Temp[] PROGMEM = { #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #endif @@ -71,7 +71,7 @@ const uint16_t VPList_Status[] PROGMEM = { // VP_M117, for completeness, but it cannot be auto-uploaded #if HAS_HOTEND VP_T_E0_Is, VP_T_E0_Set, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_T_E1_Is, VP_T_E1_Set, #endif #endif @@ -92,7 +92,7 @@ const uint16_t VPList_Status2[] PROGMEM = { // VP_M117, for completeness, but it cannot be auto-uploaded #if HAS_HOTEND VP_Flowrate_E0, - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VP_Flowrate_E1, #endif #endif @@ -182,7 +182,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, ScreenHandler.HandleFilamentOption, ScreenHandler.HandleFilamentLoadUnload), #endif #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay), @@ -237,7 +237,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #if HAS_HOTEND VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #endif #endif diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp index 82404ead9462..b77c92b7eb95 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp @@ -256,7 +256,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { case VP_E0_PID_I: newvalue = scalePID_i(value); break; case VP_E0_PID_D: newvalue = scalePID_d(value); break; #endif - #if HOTENDS >= 2 + #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; @@ -333,7 +333,7 @@ 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); - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); #endif #endif @@ -348,7 +348,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND case VP_E1_FILAMENT_LOAD_UNLOAD: filament_data.extruder = ExtUI::extruder_t::E1; thermalManager.setTargetHotend(e_temp, filament_data.extruder); diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp index f0844dc78504..cf95bb1d761d 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp @@ -327,7 +327,7 @@ void DGUSRxHandler::TempTarget(DGUS_VP &vp, void *data_ptr) { case DGUS_Addr::TEMP_SetTarget_H0: ExtUI::setTargetTemp_celsius(temp, ExtUI::H0); break; - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND case DGUS_Addr::TEMP_SetTarget_H1: ExtUI::setTargetTemp_celsius(temp, ExtUI::H1); break; @@ -347,7 +347,7 @@ void DGUSRxHandler::TempCool(DGUS_VP &vp, void *data_ptr) { case DGUS_Data::Heater::ALL: ExtUI::setTargetTemp_celsius(0, ExtUI::BED); ExtUI::setTargetTemp_celsius(0, ExtUI::H0); - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND ExtUI::setTargetTemp_celsius(0, ExtUI::H1); #endif break; @@ -357,7 +357,7 @@ void DGUSRxHandler::TempCool(DGUS_VP &vp, void *data_ptr) { case DGUS_Data::Heater::H0: ExtUI::setTargetTemp_celsius(0, ExtUI::H0); break; - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND case DGUS_Data::Heater::H1: ExtUI::setTargetTemp_celsius(0, ExtUI::H1); break; @@ -827,7 +827,7 @@ void DGUSRxHandler::PIDSelect(DGUS_VP &vp, void *data_ptr) { dgus_screen_handler.pid_heater = heater; break; case DGUS_Data::Heater::H0: - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND case DGUS_Data::Heater::H1: #endif dgus_screen_handler.pid_temp = DGUS_PLA_TEMP_HOTEND; @@ -858,7 +858,7 @@ void DGUSRxHandler::PIDSetTemp(DGUS_VP &vp, void *data_ptr) { case DGUS_Data::Heater::H0: temp = constrain(temp, HEATER_0_MINTEMP, (HEATER_0_MAXTEMP - HOTEND_OVERSHOOT)); break; - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND case DGUS_Data::Heater::H1: temp = constrain(temp, HEATER_1_MINTEMP, (HEATER_1_MAXTEMP - HOTEND_OVERSHOOT)); break; @@ -900,7 +900,7 @@ void DGUSRxHandler::PIDRun(DGUS_VP &vp, void *data_ptr) { dgus_screen_handler.SetStatusMessage(F("PID disabled")); return; #endif - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND case DGUS_Data::Heater::H1: #if ENABLED(PIDTEMP) heater = H_E1; diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp index 3fc48d2ebbb9..8d5703876564 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp @@ -275,7 +275,7 @@ void DGUSTxHandler::TempMax(DGUS_VP &vp) { case DGUS_Addr::TEMP_Max_H0: temp = HEATER_0_MAXTEMP - HOTEND_OVERSHOOT; break; - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND case DGUS_Addr::TEMP_Max_H1: temp = HEATER_1_MAXTEMP - HOTEND_OVERSHOOT; break; @@ -428,7 +428,7 @@ void DGUSTxHandler::PIDKp(DGUS_VP &vp) { case DGUS_Data::Heater::H0: value = ExtUI::getPIDValues_Kp(ExtUI::E0); break; - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND case DGUS_Data::Heater::H1: value = ExtUI::getPIDValues_Kp(ExtUI::E1); break; @@ -454,7 +454,7 @@ void DGUSTxHandler::PIDKi(DGUS_VP &vp) { case DGUS_Data::Heater::H0: value = ExtUI::getPIDValues_Ki(ExtUI::E0); break; - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND case DGUS_Data::Heater::H1: value = ExtUI::getPIDValues_Ki(ExtUI::E1); break; @@ -480,7 +480,7 @@ void DGUSTxHandler::PIDKd(DGUS_VP &vp) { case DGUS_Data::Heater::H0: value = ExtUI::getPIDValues_Kd(ExtUI::E0); break; - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND case DGUS_Data::Heater::H1: value = ExtUI::getPIDValues_Kd(ExtUI::E1); break; diff --git a/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_Addr.h b/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_Addr.h index 4207119c87f2..39e97156d083 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_Addr.h +++ b/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_Addr.h @@ -64,7 +64,7 @@ enum class DGUS_Addr : uint16_t { TEMP_Preset = 0x2010, // Popup / Data: DGUS_Data::TempPreset TEMP_SetTarget_Bed = 0x2011, // Type: Integer (16 bits signed) TEMP_SetTarget_H0 = 0x2012, // Type: Integer (16 bits signed) - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND TEMP_SetTarget_H1 = 0x2013, // Type: Integer (16 bits signed) #endif TEMP_Cool = 0x2014, // Data: DGUS_Data::Heater @@ -123,7 +123,7 @@ enum class DGUS_Addr : uint16_t { TEMP_Current_H0 = 0x30FF, // Type: Integer (16 bits signed) TEMP_Target_H0 = 0x3100, // Type: Integer (16 bits signed) TEMP_Max_H0 = 0x3101, // Type: Integer (16 bits unsigned) - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND TEMP_Current_H1 = 0x3102, // Type: Integer (16 bits signed) TEMP_Target_H1 = 0x3103, // Type: Integer (16 bits signed) TEMP_Max_H1 = 0x3104, // Type: Integer (16 bits unsigned) diff --git a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp index 27b6d9036cee..e77aa4501165 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp @@ -102,7 +102,7 @@ const struct DGUS_VP vp_list[] PROGMEM = { VP_HELPER_RX(DGUS_Addr::TEMP_Preset, &DGUSRxHandler::TempPreset), VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_Bed, &DGUSRxHandler::TempTarget), VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_H0, &DGUSRxHandler::TempTarget), - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_H1, &DGUSRxHandler::TempTarget), #endif VP_HELPER_RX(DGUS_Addr::TEMP_Cool, &DGUSRxHandler::TempCool), @@ -217,7 +217,7 @@ const struct DGUS_VP vp_list[] PROGMEM = { &thermalManager.temp_hotend[ExtUI::heater_t::H0].target, &DGUSTxHandler::ExtraToInteger), VP_HELPER_TX(DGUS_Addr::TEMP_Max_H0, &DGUSTxHandler::TempMax), - #if HOTENDS > 1 + #if HAS_MULTI_HOTEND VP_HELPER_TX_AUTO(DGUS_Addr::TEMP_Current_H1, &thermalManager.temp_hotend[ExtUI::heater_t::H1].celsius, &DGUSTxHandler::ExtraToInteger), diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 65cef5b76df7..3abb2e9c2032 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -122,7 +122,8 @@ void Temperature::lcd_preheat(const uint8_t e, const int8_t indh, const int8_t i HOTEND_LOOP() PREHEAT_ITEMS(editable.int8, e); ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M_ALL, []() { - HOTEND_LOOP() thermalManager.setTargetHotend(ui.material_preset[editable.int8].hotend_temp, e); + const celsius_t t = ui.material_preset[editable.int8].hotend_temp; + HOTEND_LOOP() thermalManager.setTargetHotend(t, e); TERN(HAS_HEATED_BED, _preheat_bed(editable.int8), ui.return_to_status()); }); @@ -268,7 +269,7 @@ void menu_temperature() { // LOOP_L_N(m, PREHEAT_COUNT) { editable.int8 = m; - #if HOTENDS > 1 || HAS_HEATED_BED + #if HAS_MULTI_HOTEND || HAS_HEATED_BED SUBMENU_S(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m); #elif HAS_HOTEND ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); @@ -295,7 +296,7 @@ void menu_temperature() { LOOP_L_N(m, PREHEAT_COUNT) { editable.int8 = m; - #if HOTENDS > 1 || HAS_HEATED_BED + #if HAS_MULTI_HOTEND || HAS_HEATED_BED SUBMENU_S(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m); #else ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); diff --git a/Marlin/src/lcd/tft/ui_common.h b/Marlin/src/lcd/tft/ui_common.h index d3ffd4bc31ac..7329c31a52a5 100644 --- a/Marlin/src/lcd/tft/ui_common.h +++ b/Marlin/src/lcd/tft/ui_common.h @@ -57,7 +57,7 @@ void menu_item(const uint8_t row, bool sel = false); #define ABSOLUTE_ZERO -273.15 -#if HAS_TEMP_CHAMBER && HOTENDS > 1 +#if HAS_TEMP_CHAMBER && HAS_MULTI_HOTEND #define ITEM_E0 0 #define ITEM_E1 1 #define ITEM_BED 2 @@ -74,7 +74,7 @@ void menu_item(const uint8_t row, bool sel = false); #define ITEM_COOLER 0 #define ITEM_FAN 1 #define ITEMS_COUNT 2 -#elif HOTENDS > 1 +#elif HAS_MULTI_HOTEND #define ITEM_E0 0 #define ITEM_E1 1 #define ITEM_BED 2 diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h index 54621f36c1e6..02a5fe4e33aa 100644 --- a/Marlin/src/pins/esp32/pins_E4D.h +++ b/Marlin/src/pins/esp32/pins_E4D.h @@ -32,7 +32,7 @@ #if EXTRUDERS > 1 || E_STEPPERS > 1 #error "E4d@box only supports one E Stepper. Comment out this line to continue." -#elif HOTENDS > 1 +#elif HAS_MULTI_HOTEND #error "E4d@box only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/esp32/pins_FYSETC_E4.h b/Marlin/src/pins/esp32/pins_FYSETC_E4.h index 2b2fe40c4a41..4e71a66a221b 100644 --- a/Marlin/src/pins/esp32/pins_FYSETC_E4.h +++ b/Marlin/src/pins/esp32/pins_FYSETC_E4.h @@ -32,7 +32,7 @@ #if EXTRUDERS > 1 || E_STEPPERS > 1 #error "FYSETC E4 only supports one E Stepper. Comment out this line to continue." -#elif HOTENDS > 1 +#elif HAS_MULTI_HOTEND #error "FYSETC E4 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h index ab4f401f2671..a5f70e81592b 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPA.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPA.h @@ -32,7 +32,7 @@ #if EXTRUDERS > 1 || E_STEPPERS > 1 #error "MRR ESPA only supports one E Stepper. Comment out this line to continue." -#elif HOTENDS > 1 +#elif HAS_MULTI_HOTEND #error "MRR ESPA only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index 1f829b77554c..ae4f0c6e36be 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -33,7 +33,7 @@ #if EXTRUDERS > 2 || E_STEPPERS > 2 #error "MRR ESPE only supports two E Steppers. Comment out this line to continue." -#elif HOTENDS > 1 +#elif HAS_MULTI_HOTEND #error "MRR ESPE only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_K8600.h b/Marlin/src/pins/ramps/pins_K8600.h index f37516b710e8..015512992782 100644 --- a/Marlin/src/pins/ramps/pins_K8600.h +++ b/Marlin/src/pins/ramps/pins_K8600.h @@ -25,7 +25,7 @@ * VERTEX NANO Arduino Mega with RAMPS EFB v1.4 pin assignments. */ -#if HOTENDS > 1 +#if HAS_MULTI_HOTEND #error "Only 1 hotend is supported for Vertex Nano." #endif diff --git a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h index 3b2639b4312e..75ee01946ae5 100644 --- a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h +++ b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h @@ -28,7 +28,7 @@ #define REQUIRE_MEGA2560 #include "env_validate.h" -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "Longer3D LGT KIT V1.0 board only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h b/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h index ebd0bdc0c697..358395890624 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h @@ -21,7 +21,7 @@ */ #pragma once -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "Ender-4 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index f8e3e76ada53..b0b201f1d50d 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -23,7 +23,7 @@ #include "env_validate.h" -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "CCROBOT-ONLINE MEEB_3DP only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index ea58b5b3a99c..bf2a55fc7b99 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -27,7 +27,7 @@ #include "env_validate.h" -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "Creality V4 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h index 52ebdecc3576..ae54805a94c6 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h @@ -27,7 +27,7 @@ #include "env_validate.h" -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "CREALITY supports up to 1 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h index 64e07a0bc832..a2add81c8b11 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h @@ -25,7 +25,7 @@ * Creality v4.5.2 (STM32F103RET6) board pin assignments */ -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "Creality v4.5.2 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h index ca437312c8e1..7b8c3280d2b7 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h @@ -25,7 +25,7 @@ * Creality v4.5.3 (STM32F103RET6) board pin assignments */ -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "Creality v4.5.3 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index 3b7a4e4402bb..e19d3300921a 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -31,7 +31,7 @@ #if NOT_TARGET(__STM32F1__, STM32F1xx) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#elif HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "FLSUN HiSpeedV1 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index 98465a86073e..beae0a3bf0b6 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -32,7 +32,7 @@ #include "env_validate.h" -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "JGAurora A5S A1 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 34fbdaf02fbd..7585a6e28951 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -27,7 +27,7 @@ #if NOT_TARGET(__STM32F1__, STM32F1xx) #error "Oops! Select a STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#elif HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "Longer3D only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h index 89ace3493fc2..6b05bb7a7487 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h @@ -25,7 +25,7 @@ * MKS Robin E3 (STM32F103RCT6) board pin assignments */ -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "MKS Robin E3 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h index a629bce9f38d..9d11af43ef2b 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h @@ -25,7 +25,7 @@ * MKS Robin E3D (STM32F103RCT6) board pin assignments */ -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "MKS Robin E3D only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h index 718f9dc27a1a..930ef9722d50 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h @@ -25,7 +25,7 @@ * MKS Robin E3D v1.1 (STM32F103RCT6) board pin assignments */ -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "MKS Robin E3D v1.1 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index c5080b5227cd..06b9721403c1 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -27,7 +27,7 @@ #include "env_validate.h" -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "MKS Robin E3P only supports one hotend / E-stepper. Comment out this line to continue." #elif HAS_FSMC_TFT #error "MKS Robin E3P doesn't support FSMC-based TFT displays." diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h index 30720e0c7f0e..7a38507c7621 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h @@ -25,7 +25,7 @@ * MKS Robin E3 v1.1 (STM32F103RCT6) board pin assignments */ -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "MKS Robin E3 v1.1 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index 3767748e53ef..94f7313996d0 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -23,7 +23,7 @@ #include "env_validate.h" -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "MKS Robin Lite only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index ae45d8b6d150..c981fdc00a57 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -27,7 +27,7 @@ #include "env_validate.h" -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "MKS Robin mini only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h index 834301043288..eb3af65f32eb 100644 --- a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h +++ b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h @@ -23,7 +23,7 @@ #include "env_validate.h" -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "Anet ET4 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index d054e354f76b..44485b0776c3 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -23,7 +23,7 @@ #include "env_validate.h" -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "BIGTREE BTT002 V1.0 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 12e47e35cc42..7f35c0f5dd7f 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -24,7 +24,7 @@ #define ALLOW_STM32DUINO #include "env_validate.h" -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "LERDGE X only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h index 133dcd2935d3..dbf2593c481d 100644 --- a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h +++ b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h @@ -32,7 +32,7 @@ #define SRAM_EEPROM_EMULATION // Emulate the EEPROM using Backup SRAM #endif -#if HOTENDS > 1 || E_STEPPERS > 1 +#if HAS_MULTI_HOTEND || E_STEPPERS > 1 #error "RemRam only supports one hotend / E-stepper. Comment out this line to continue." #endif From a1c4aad1472bb418bc0c0bc52322032b68df3a1f Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Thu, 28 Oct 2021 03:26:05 -0700 Subject: [PATCH 23/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20MKS=20Robin=20E3/E3D?= =?UTF-8?q?=20Z=20Stop/Probe=20pins=20(#23034)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index dd1008ee3ae8..a221ce94c532 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -54,8 +54,14 @@ // #define X_STOP_PIN PA12 #define Y_STOP_PIN PA11 -#define Z_MIN_PIN PC6 -#define Z_MAX_PIN PB1 +#define Z_STOP_PIN PC6 + +// +// Z Probe +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PB1 +#endif // // Steppers From 5d04c7496cec3b8a564ac302da116e3783c4b1d3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 28 Oct 2021 19:22:35 -0500 Subject: [PATCH 24/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20EZBoard=20V2=20board?= =?UTF-8?q?=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/core/boards.h | 2 +- Marlin/src/pins/pins.h | 7 +++++-- ...{pins_TH3D_EZBOARD_LITE_V2.h => pins_TH3D_EZBOARD_V2.h} | 2 +- .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../hal_conf_extra.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../variant.h | 0 ini/stm32f4.ini | 6 +++--- 10 files changed, 10 insertions(+), 7 deletions(-) rename Marlin/src/pins/stm32f4/{pins_TH3D_EZBOARD_LITE_V2.h => pins_TH3D_EZBOARD_V2.h} (99%) rename buildroot/share/PlatformIO/variants/{MARLIN_TH3D_EZBOARD_LITE_V2 => MARLIN_TH3D_EZBOARD_V2}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{MARLIN_TH3D_EZBOARD_LITE_V2 => MARLIN_TH3D_EZBOARD_V2}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{MARLIN_TH3D_EZBOARD_LITE_V2 => MARLIN_TH3D_EZBOARD_V2}/hal_conf_extra.h (100%) rename buildroot/share/PlatformIO/variants/{MARLIN_TH3D_EZBOARD_LITE_V2 => MARLIN_TH3D_EZBOARD_V2}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{MARLIN_TH3D_EZBOARD_LITE_V2 => MARLIN_TH3D_EZBOARD_V2}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{MARLIN_TH3D_EZBOARD_LITE_V2 => MARLIN_TH3D_EZBOARD_V2}/variant.h (100%) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 82c68f317126..6e116888bcf9 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -402,7 +402,7 @@ #define BOARD_ANET_ET4 4230 // ANET ET4 V1.x (STM32F407VGT6) #define BOARD_ANET_ET4P 4231 // ANET ET4P V1.x (STM32F407VGT6) #define BOARD_FYSETC_CHEETAH_V20 4232 // FYSETC Cheetah V2.0 -#define BOARD_TH3D_EZBOARD_LITE_V2 4233 // TH3D EZBoard Lite v2.0 +#define BOARD_TH3D_EZBOARD_V2 4233 // TH3D EZBoard v2.0 #define BOARD_INDEX_REV03 4234 // Index PnP Controller REV03 (STM32F407VET6/VGT6) #define BOARD_MKS_ROBIN_NANO_V1_3_F4 4235 // MKS Robin Nano V1.3 and MKS Robin Nano-S V1.3 (STM32F407VET6) #define BOARD_MKS_EAGLE 4236 // MKS Eagle (STM32F407VET6) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 3b83e14d62a1..1a05f55fdcd4 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -659,8 +659,8 @@ #include "stm32f4/pins_FYSETC_CHEETAH_V20.h" // STM32F4 env:FYSETC_CHEETAH_V20 #elif MB(MKS_MONSTER8) #include "stm32f4/pins_MKS_MONSTER8.h" // STM32F4 env:mks_monster8 env:mks_monster8_usb_flash_drive env:mks_monster8_usb_flash_drive_msc -#elif MB(TH3D_EZBOARD_LITE_V2) - #include "stm32f4/pins_TH3D_EZBOARD_LITE_V2.h" // STM32F4 env:TH3D_EZBoard_Lite_V2 +#elif MB(TH3D_EZBOARD_V2) + #include "stm32f4/pins_TH3D_EZBOARD_V2.h" // STM32F4 env:TH3D_EZBoard_V2 #elif MB(INDEX_REV03) #include "stm32f4/pins_INDEX_REV03.h" // STM32F4 env:Index_Mobo_Rev03 #elif MB(MKS_ROBIN_NANO_V1_3_F4) @@ -752,6 +752,7 @@ #define BOARD_RAMPS_DAGOMA -1020 #define BOARD_RAMPS_LONGER3D_LK4PRO -1021 #define BOARD_BTT_SKR_V2_0 -1022 + #define BOARD_TH3D_EZBOARD_LITE_V2 -1023 #if MB(MKS_13) #error "BOARD_MKS_13 has been renamed BOARD_MKS_GEN_13. Please update your configuration." @@ -801,6 +802,8 @@ #error "BOARD_RAMPS_LONGER3D_LK4PRO is now BOARD_LONGER3D_LKx_PRO. Please update your configuration." #elif MB(BTT_SKR_V2_0) #error "BTT_SKR_V2_0 is now BTT_SKR_V2_0_REV_A or BTT_SKR_V2_0_REV_B. See https://bit.ly/3t5d9JQ for more information. Please update your configuration." + #elif MB(BOARD_TH3D_EZBOARD_LITE_V2) + #error "BOARD_TH3D_EZBOARD_LITE_V2 is now BOARD_TH3D_EZBOARD_V2. Please update your configuration." #elif defined(MOTHERBOARD) #error "Unknown MOTHERBOARD value set in Configuration.h." #else diff --git a/Marlin/src/pins/stm32f4/pins_TH3D_EZBOARD_LITE_V2.h b/Marlin/src/pins/stm32f4/pins_TH3D_EZBOARD_V2.h similarity index 99% rename from Marlin/src/pins/stm32f4/pins_TH3D_EZBOARD_LITE_V2.h rename to Marlin/src/pins/stm32f4/pins_TH3D_EZBOARD_V2.h index bff3f5b6ee4c..6368142c3427 100644 --- a/Marlin/src/pins/stm32f4/pins_TH3D_EZBOARD_LITE_V2.h +++ b/Marlin/src/pins/stm32f4/pins_TH3D_EZBOARD_V2.h @@ -24,7 +24,7 @@ #define ALLOW_STM32DUINO #include "env_validate.h" -#define BOARD_INFO_NAME "TH3D EZBoard Lite V2" +#define BOARD_INFO_NAME "TH3D EZBoard V2" #define BOARD_WEBSITE_URL "th3dstudio.com" //#define V3_EZABL_ON_SERVO // As in TH3D Firmware Config diff --git a/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/hal_conf_extra.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/hal_conf_extra.h rename to buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/hal_conf_extra.h diff --git a/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_LITE_V2/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_TH3D_EZBOARD_V2/variant.h diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index 3e0c400a6b2b..3d7f4d2d02a7 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -521,13 +521,13 @@ build_flags = ${env:mks_monster8_usb_flash_drive.build_flags} build_unflags = -DUSBD_USE_CDC # -# TH3D EZBoard Lite v2.0 (STM32F405RGT6 ARM Cortex-M4) +# TH3D EZBoard v2.0 (STM32F405RGT6 ARM Cortex-M4) # -[env:TH3D_EZBoard_Lite_V2] +[env:TH3D_EZBoard_V2] platform = ${common_stm32.platform} extends = stm32_variant board = genericSTM32F405RG -board_build.variant = MARLIN_TH3D_EZBOARD_LITE_V2 +board_build.variant = MARLIN_TH3D_EZBOARD_V2 board_build.offset = 0xC000 board_upload.offset_address = 0x0800C000 build_flags = ${stm32_variant.build_flags} -DHSE_VALUE=12000000U -O0 From 2c8dce69e16daa08de4a62f115b06fe68c0db17d Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 29 Oct 2021 00:58:40 +0000 Subject: [PATCH 25/78] [cron] Bump distribution date (2021-10-29) --- 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 e61ec1b4e7e7..e0165a280fd3 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 "2021-10-28" +//#define STRING_DISTRIBUTION_DATE "2021-10-29" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index a1ad05bd3ab6..f61066e58fa0 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 "2021-10-28" + #define STRING_DISTRIBUTION_DATE "2021-10-29" #endif /** From 3b9bea6f80f02b76f6b71c6c1dcdb751e3611d8e Mon Sep 17 00:00:00 2001 From: tome9111991 <57866234+tome9111991@users.noreply.github.com> Date: Sat, 30 Oct 2021 00:49:12 +0200 Subject: [PATCH 26/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20E3V2=20(CrealityUI)?= =?UTF-8?q?=20Tune/Prepare=20>=20Zoffset=20(#23040)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/e3v2/creality/dwin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/e3v2/creality/dwin.cpp b/Marlin/src/lcd/e3v2/creality/dwin.cpp index 0f8a7397289c..5114e8a38a53 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -615,7 +615,7 @@ void Draw_Edit_Float3(const uint8_t row, const uint16_t value, const bool active } void Draw_Edit_Signed_Float2(const uint8_t row, const float value, const bool active=false) { - DWIN_Draw_Signed_Float(font8x16, active ? Select_Color : Color_Bg_Black, 2, UNITFDIGITS, 220 + 8 - UNITFDIGITS * 8, EBASE(row), value); + DWIN_Draw_Signed_Float(font8x16, active ? Select_Color : Color_Bg_Black, 2, UNITFDIGITS + 1, 220 + 8 - UNITFDIGITS * 8, EBASE(row), value); } void Draw_Edit_Signed_Float3(const uint8_t row, const float value, const bool active=false) { From 1d80464ba77bc576426f15af28a633bf48d769ad Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 27 Oct 2021 21:15:58 -0500 Subject: [PATCH 27/78] =?UTF-8?q?=F0=9F=8E=A8=20Define=20HAS=5FPREHEAT=20c?= =?UTF-8?q?onditional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/bedlevel/G26.cpp | 6 +- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 2 +- Marlin/src/gcode/lcd/M145.cpp | 4 +- Marlin/src/gcode/temp/M104_M109.cpp | 2 +- Marlin/src/gcode/temp/M106_M107.cpp | 4 +- Marlin/src/gcode/temp/M140_M190.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 6 +- Marlin/src/lcd/e3v2/creality/dwin.cpp | 153 ++++++++++--------- Marlin/src/lcd/e3v2/creality/dwin.h | 11 +- Marlin/src/lcd/e3v2/enhanced/dwin.cpp | 12 +- Marlin/src/lcd/e3v2/enhanced/dwin.h | 21 +-- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 6 +- Marlin/src/lcd/extui/nextion/nextion_tft.cpp | 4 +- Marlin/src/lcd/extui/ui_api.cpp | 2 +- Marlin/src/lcd/extui/ui_api.h | 2 +- Marlin/src/lcd/language/language_an.h | 2 +- Marlin/src/lcd/language/language_bg.h | 2 +- Marlin/src/lcd/language/language_ca.h | 2 +- Marlin/src/lcd/language/language_cz.h | 4 +- Marlin/src/lcd/language/language_da.h | 2 +- Marlin/src/lcd/language/language_de.h | 4 +- Marlin/src/lcd/language/language_el.h | 2 +- Marlin/src/lcd/language/language_el_gr.h | 2 +- Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/lcd/language/language_es.h | 4 +- Marlin/src/lcd/language/language_eu.h | 4 +- Marlin/src/lcd/language/language_fi.h | 2 +- Marlin/src/lcd/language/language_fr.h | 4 +- Marlin/src/lcd/language/language_gl.h | 4 +- Marlin/src/lcd/language/language_hr.h | 2 +- Marlin/src/lcd/language/language_hu.h | 2 +- Marlin/src/lcd/language/language_it.h | 4 +- Marlin/src/lcd/language/language_jp_kana.h | 2 +- Marlin/src/lcd/language/language_ko_KR.h | 2 +- Marlin/src/lcd/language/language_nl.h | 2 +- Marlin/src/lcd/language/language_pl.h | 2 +- Marlin/src/lcd/language/language_pt.h | 2 +- Marlin/src/lcd/language/language_pt_br.h | 4 +- Marlin/src/lcd/language/language_ro.h | 4 +- Marlin/src/lcd/language/language_ru.h | 2 +- Marlin/src/lcd/language/language_sk.h | 2 +- Marlin/src/lcd/language/language_sv.h | 2 +- Marlin/src/lcd/language/language_tr.h | 4 +- Marlin/src/lcd/language/language_uk.h | 2 +- Marlin/src/lcd/language/language_vi.h | 4 +- Marlin/src/lcd/language/language_zh_CN.h | 4 +- Marlin/src/lcd/language/language_zh_TW.h | 4 +- Marlin/src/lcd/marlinui.cpp | 2 +- Marlin/src/lcd/marlinui.h | 4 +- Marlin/src/lcd/menu/menu_configuration.cpp | 4 +- Marlin/src/lcd/menu/menu_filament.cpp | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 6 +- Marlin/src/lcd/menu/menu_ubl.cpp | 8 +- Marlin/src/module/settings.cpp | 10 +- 55 files changed, 183 insertions(+), 182 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index e111bcd8aa24..728771d5809d 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -520,7 +520,7 @@ void GcodeSuite::G26() { g26.keep_heaters_on = parser.boolval('K'); // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT + #if HAS_PREHEAT const uint8_t preset_index = parser.seenval('I') ? _MIN(parser.value_byte(), PREHEAT_COUNT - 1) + 1 : 0; #endif @@ -530,7 +530,7 @@ void GcodeSuite::G26() { celsius_t bedtemp = 0; // Use the 'I' index if temperature presets are defined - #if PREHEAT_COUNT + #if HAS_PREHEAT if (preset_index) bedtemp = ui.material_preset[preset_index - 1].bed_temp; #endif @@ -613,7 +613,7 @@ void GcodeSuite::G26() { celsius_t noztemp = 0; // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT + #if HAS_PREHEAT if (preset_index) noztemp = ui.material_preset[preset_index - 1].hotend_temp; #endif diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 30c7d926e02b..fb1669c1eae7 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -640,7 +640,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 120: M120(); break; // M120: Enable endstops case 121: M121(); break; // M121: Disable endstops - #if PREHEAT_COUNT + #if HAS_PREHEAT case 145: M145(); break; // M145: Set material heatup parameters #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 5ad4750fe451..8de15fc9c7f5 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -749,7 +749,7 @@ class GcodeSuite { static void M193(); #endif - #if PREHEAT_COUNT + #if HAS_PREHEAT static void M145(); static void M145_report(const bool forReplay=true); #endif diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index 2dba238d3f4e..8dbe2fb07e55 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfig.h" -#if PREHEAT_COUNT +#if HAS_PREHEAT #include "../gcode.h" #include "../../lcd/marlinui.h" @@ -79,4 +79,4 @@ void GcodeSuite::M145_report(const bool forReplay/*=true*/) { } } -#endif // PREHEAT_COUNT +#endif // HAS_PREHEAT diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index efda04def50a..baaac0210098 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -88,7 +88,7 @@ void GcodeSuite::M104_M109(const bool isM109) { celsius_t temp = 0; // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT + #if HAS_PREHEAT got_temp = parser.seenval('I'); if (got_temp) { const uint8_t index = parser.value_byte(); diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index 3f85c53d78ae..98e87c415de9 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -32,7 +32,7 @@ #include "../../module/planner.h" #endif -#if PREHEAT_COUNT +#if HAS_PREHEAT #include "../../lcd/marlinui.h" #endif @@ -75,7 +75,7 @@ void GcodeSuite::M106() { uint16_t speed = dspeed; // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT + #if HAS_PREHEAT const bool got_preset = parser.seenval('I'); if (got_preset) speed = ui.material_preset[_MIN(parser.value_byte(), PREHEAT_COUNT - 1)].fan_speed; #else diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp index edc15b9cba64..7532defccdac 100644 --- a/Marlin/src/gcode/temp/M140_M190.cpp +++ b/Marlin/src/gcode/temp/M140_M190.cpp @@ -63,7 +63,7 @@ void GcodeSuite::M140_M190(const bool isM190) { celsius_t temp = 0; // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT + #if HAS_PREHEAT got_temp = parser.seenval('I'); if (got_temp) { const uint8_t index = parser.value_byte(); diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 6a70a5ce5439..c8b6d504e294 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2876,10 +2876,14 @@ #elif defined(PREHEAT_1_LABEL) #define PREHEAT_COUNT 1 #endif + #if PREHEAT_COUNT && ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) + #define HAS_PREHEAT 1 + #endif #endif -#if !PREHEAT_COUNT +#if !HAS_PREHEAT #undef PREHEAT_SHORTCUT_MENU_ITEM + #undef DGUS_PREHEAT_UI #endif /** diff --git a/Marlin/src/lcd/e3v2/creality/dwin.cpp b/Marlin/src/lcd/e3v2/creality/dwin.cpp index 5114e8a38a53..a27762d71ed4 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -165,14 +165,9 @@ typedef struct { } select_t; select_t select_page{0}, select_file{0}, select_print{0}, select_prepare{0} - , select_control{0}, select_axis{0}, select_temp{0}, select_motion{0}, select_tune{0} - , select_advset{0}, select_PLA{0}, select_ABS{0} - , select_speed{0} - , select_acc{0} - , select_jerk{0} - , select_step{0} - , select_item{0} - ; + , select_control{0}, select_axis{0}, select_temp{0}, select_motion{0}, select_tune{0} + , select_advset{0}, select_PLA{0}, select_ABS{0} + , select_speed{0}, select_acc{0}, select_jerk{0}, select_step{0}, select_item{0}; uint8_t index_file = MROWS, index_prepare = MROWS, @@ -700,7 +695,7 @@ void Item_Prepare_Home(const uint8_t row) { #endif -#if HAS_HOTEND +#if HAS_PREHEAT void Item_Prepare_PLA(const uint8_t row) { if (HMI_IsChinese()) Item_AreaCopy(100, 89, 151, 101, row); @@ -715,22 +710,22 @@ void Item_Prepare_Home(const uint8_t row) { Draw_Menu_Line(row, ICON_PLAPreheat); } - void Item_Prepare_ABS(const uint8_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(180, 89, 233, 100, row); - else { - #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, F("Preheat " PREHEAT_2_LABEL)); - #else - Item_AreaCopy(108, 76, 155, 87, row); // "Preheat" - say_abs_en(52, row); // "ABS" - #endif + #if PREHEAT_COUNT > 1 + void Item_Prepare_ABS(const uint8_t row) { + if (HMI_IsChinese()) + Item_AreaCopy(180, 89, 233, 100, row); + else { + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(row, F("Preheat " PREHEAT_2_LABEL)); + #else + Item_AreaCopy(108, 76, 155, 87, row); // "Preheat" + say_abs_en(52, row); // "ABS" + #endif + } + Draw_Menu_Line(row, ICON_ABSPreheat); } - Draw_Menu_Line(row, ICON_ABSPreheat); - } -#endif + #endif -#if HAS_PREHEAT void Item_Prepare_Cool(const uint8_t row) { if (HMI_IsChinese()) Item_AreaCopy(1, 104, 56, 117, row); @@ -785,11 +780,11 @@ void Draw_Prepare_Menu() { #if HAS_ZOFFSET_ITEM if (PVISI(PREPARE_CASE_ZOFF)) Item_Prepare_Offset(PSCROL(PREPARE_CASE_ZOFF)); // Edit Z-Offset / Babystep / Set Home Offset #endif - #if HAS_HOTEND - if (PVISI(PREPARE_CASE_PLA)) Item_Prepare_PLA(PSCROL(PREPARE_CASE_PLA)); // Preheat PLA - if (PVISI(PREPARE_CASE_ABS)) Item_Prepare_ABS(PSCROL(PREPARE_CASE_ABS)); // Preheat ABS - #endif #if HAS_PREHEAT + if (PVISI(PREPARE_CASE_PLA)) Item_Prepare_PLA(PSCROL(PREPARE_CASE_PLA)); // Preheat PLA + #if PREHEAT_COUNT > 1 + if (PVISI(PREPARE_CASE_ABS)) Item_Prepare_ABS(PSCROL(PREPARE_CASE_ABS)); // Preheat ABS + #endif if (PVISI(PREPARE_CASE_COOL)) Item_Prepare_Cool(PSCROL(PREPARE_CASE_COOL)); // Cooldown #endif if (PVISI(PREPARE_CASE_LANG)) Item_Prepare_Lang(PSCROL(PREPARE_CASE_LANG)); // Language CN/EN @@ -1425,25 +1420,34 @@ void HMI_Move_Z() { uint8_t temp_line; switch (HMI_ValueStruct.show_mode) { case -1: temp_line = TEMP_CASE_TEMP; break; - case -2: temp_line = PREHEAT_CASE_TEMP; break; - case -3: temp_line = PREHEAT_CASE_TEMP; break; + #if HAS_PREHEAT + case -2: temp_line = PREHEAT_CASE_TEMP; break; + #if PREHEAT_COUNT > 1 + case -3: temp_line = PREHEAT_CASE_TEMP; break; + #endif + #endif default: temp_line = TUNE_CASE_TEMP + MROWS - index_tune; } if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.E_Temp)) { EncoderRate.enabled = false; - if (HMI_ValueStruct.show_mode == -2) { - checkkey = PLAPreheat; - ui.material_preset[0].hotend_temp = HMI_ValueStruct.E_Temp; - Draw_Edit_Integer3(temp_line, ui.material_preset[0].hotend_temp); - return; - } - else if (HMI_ValueStruct.show_mode == -3) { - checkkey = ABSPreheat; - ui.material_preset[1].hotend_temp = HMI_ValueStruct.E_Temp; - Draw_Edit_Integer3(temp_line, ui.material_preset[1].hotend_temp); - return; - } - else if (HMI_ValueStruct.show_mode == -1) // Temperature + #if HAS_PREHEAT + if (HMI_ValueStruct.show_mode == -2) { + checkkey = PLAPreheat; + ui.material_preset[0].hotend_temp = HMI_ValueStruct.E_Temp; + Draw_Edit_Integer3(temp_line, ui.material_preset[0].hotend_temp); + return; + } + #if PREHEAT_COUNT > 1 + if (HMI_ValueStruct.show_mode == -3) { + checkkey = ABSPreheat; + ui.material_preset[1].hotend_temp = HMI_ValueStruct.E_Temp; + Draw_Edit_Integer3(temp_line, ui.material_preset[1].hotend_temp); + return; + } + #endif + #endif + + if (HMI_ValueStruct.show_mode == -1) // Temperature checkkey = TemperatureID; else checkkey = Tune; @@ -1467,28 +1471,33 @@ void HMI_Move_Z() { uint8_t bed_line; switch (HMI_ValueStruct.show_mode) { case -1: bed_line = TEMP_CASE_BED; break; - case -2: bed_line = PREHEAT_CASE_BED; break; - case -3: bed_line = PREHEAT_CASE_BED; break; + #if HAS_PREHEAT + case -2: bed_line = PREHEAT_CASE_BED; break; + #if PREHEAT_COUNT > 1 + case -3: bed_line = PREHEAT_CASE_BED; break; + #endif + #endif default: bed_line = TUNE_CASE_BED + MROWS - index_tune; } if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Bed_Temp)) { EncoderRate.enabled = false; - if (HMI_ValueStruct.show_mode == -2) { - checkkey = PLAPreheat; - ui.material_preset[0].bed_temp = HMI_ValueStruct.Bed_Temp; - Draw_Edit_Integer3(bed_line, ui.material_preset[0].bed_temp); - return; - } - else if (HMI_ValueStruct.show_mode == -3) { - checkkey = ABSPreheat; - ui.material_preset[1].bed_temp = HMI_ValueStruct.Bed_Temp; - Draw_Edit_Integer3(bed_line, ui.material_preset[1].bed_temp); - return; - } - else if (HMI_ValueStruct.show_mode == -1) - checkkey = TemperatureID; - else - checkkey = Tune; + #if HAS_PREHEAT + if (HMI_ValueStruct.show_mode == -2) { + checkkey = PLAPreheat; + ui.material_preset[0].bed_temp = HMI_ValueStruct.Bed_Temp; + Draw_Edit_Integer3(bed_line, ui.material_preset[0].bed_temp); + return; + } + #if PREHEAT_COUNT > 1 + if (HMI_ValueStruct.show_mode == -3) { + checkkey = ABSPreheat; + ui.material_preset[1].bed_temp = HMI_ValueStruct.Bed_Temp; + Draw_Edit_Integer3(bed_line, ui.material_preset[1].bed_temp); + return; + } + #endif + #endif + checkkey = HMI_ValueStruct.show_mode == -1 ? TemperatureID : Tune; Draw_Edit_Integer3(bed_line, HMI_ValueStruct.Bed_Temp); thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp); return; @@ -1522,16 +1531,15 @@ void HMI_Move_Z() { Draw_Edit_Integer3(fan_line, ui.material_preset[0].fan_speed); return; } - else if (HMI_ValueStruct.show_mode == -3) { - checkkey = ABSPreheat; - ui.material_preset[1].fan_speed = HMI_ValueStruct.Fan_speed; - Draw_Edit_Integer3(fan_line, ui.material_preset[1].fan_speed); - return; - } - else if (HMI_ValueStruct.show_mode == -1) - checkkey = TemperatureID; - else - checkkey = Tune; + #if PREHEAT_COUNT > 1 + if (HMI_ValueStruct.show_mode == -3) { + checkkey = ABSPreheat; + ui.material_preset[1].fan_speed = HMI_ValueStruct.Fan_speed; + Draw_Edit_Integer3(fan_line, ui.material_preset[1].fan_speed); + return; + } + #endif + checkkey = HMI_ValueStruct.show_mode == -1 ? TemperatureID : Tune; Draw_Edit_Integer3(fan_line, HMI_ValueStruct.Fan_speed); thermalManager.set_fan_speed(0, HMI_ValueStruct.Fan_speed); return; @@ -3068,7 +3076,7 @@ void HMI_Temperature() { EncoderRate.enabled = true; break; #endif - #if HAS_HOTEND + #if HAS_PREHEAT case TEMP_CASE_PLA: { checkkey = PLAPreheat; select_PLA.reset(); @@ -3145,7 +3153,8 @@ void HMI_Temperature() { Draw_Menu_Line(++i, ICON_WriteEEPROM); #endif } break; - + #endif + #if PREHEAT_COUNT > 1 case TEMP_CASE_ABS: { // ABS preheat setting checkkey = ABSPreheat; select_ABS.reset(); diff --git a/Marlin/src/lcd/e3v2/creality/dwin.h b/Marlin/src/lcd/e3v2/creality/dwin.h index d9ac0aa5fa93..3122a6fcbae1 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.h +++ b/Marlin/src/lcd/e3v2/creality/dwin.h @@ -31,13 +31,6 @@ #include "../../../inc/MarlinConfigPre.h" -#if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) && PREHEAT_COUNT - #define HAS_PREHEAT 1 - #if PREHEAT_COUNT < 2 - #error "Creality DWIN requires two material preheat presets." - #endif -#endif - enum processID : uint8_t { // Process ID MainMenu, @@ -53,7 +46,9 @@ enum processID : uint8_t { Tune, #if HAS_PREHEAT PLAPreheat, - ABSPreheat, + #if PREHEAT_COUNT > 1 + ABSPreheat, + #endif #endif MaxSpeed, MaxSpeed_value, diff --git a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp index b861b0274a02..22de4d720bf5 100644 --- a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp +++ b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp @@ -3124,12 +3124,14 @@ void Draw_Prepare_Menu() { ADDMENUITEM(ICON_SetHome, GET_TEXT_F(MSG_SET_HOME_OFFSETS), onDrawHomeOffset, SetHome); #endif #endif - #if HAS_HOTEND - ADDMENUITEM(ICON_PLAPreheat, GET_TEXT_F(MSG_PREHEAT_1), onDrawPreheat1, SetPreheat0); - ADDMENUITEM(ICON_ABSPreheat, PSTR("Preheat " PREHEAT_2_LABEL), onDrawPreheat2, SetPreheat1); - ADDMENUITEM(ICON_CustomPreheat, GET_TEXT_F(MSG_PREHEAT_CUSTOM), onDrawMenuItem, SetPreheat2); - #endif #if HAS_PREHEAT + ADDMENUITEM(ICON_PLAPreheat, GET_TEXT_F(MSG_PREHEAT_1), onDrawPreheat1, SetPreheat0); + #if PREHEAT_COUNT > 1 + ADDMENUITEM(ICON_ABSPreheat, PSTR("Preheat " PREHEAT_2_LABEL), onDrawPreheat2, SetPreheat1); + #endif + #if PREHEAT_COUNT > 2 + ADDMENUITEM(ICON_CustomPreheat, GET_TEXT_F(MSG_PREHEAT_CUSTOM), onDrawMenuItem, SetPreheat2); + #endif ADDMENUITEM(ICON_Cool, GET_TEXT_F(MSG_COOLDOWN), onDrawCooldown, SetCoolDown); #endif ADDMENUITEM(ICON_Language, PSTR("UI Language"), onDrawLanguage, SetLanguage); diff --git a/Marlin/src/lcd/e3v2/enhanced/dwin.h b/Marlin/src/lcd/e3v2/enhanced/dwin.h index 090841711722..c2220c68a8c0 100644 --- a/Marlin/src/lcd/e3v2/enhanced/dwin.h +++ b/Marlin/src/lcd/e3v2/enhanced/dwin.h @@ -33,13 +33,6 @@ #include "../common/encoder.h" #include "../../../libs/BL24CXX.h" -#if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) && PREHEAT_COUNT - #define HAS_PREHEAT 1 - #if PREHEAT_COUNT < 2 - #error "Creality DWIN requires two material preheat presets." - #endif -#endif - #if ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) && DISABLED(PROBE_MANUALLY) #define HAS_ONESTEP_LEVELING 1 #endif @@ -123,12 +116,14 @@ typedef struct { uint16_t Barfill_Color = Def_Barfill_Color; uint16_t Indicator_Color = Def_Indicator_Color; uint16_t Coordinate_Color = Def_Coordinate_Color; - #if HAS_HOTEND - int16_t HotendPidT = PREHEAT_1_TEMP_HOTEND; - int16_t PidCycles = 10; - #endif - #ifdef PREHEAT_1_TEMP_BED - int16_t BedPidT = PREHEAT_1_TEMP_BED; + #if HAS_PREHEAT + #ifdef PREHEAT_1_TEMP_HOTEND + int16_t HotendPidT = PREHEAT_1_TEMP_HOTEND; + int16_t PidCycles = 10; + #endif + #ifdef PREHEAT_1_TEMP_BED + int16_t BedPidT = PREHEAT_1_TEMP_BED; + #endif #endif #if ENABLED(PREVENT_COLD_EXTRUSION) int16_t ExtMinT = EXTRUDE_MINTEMP; diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 691c03af0dfc..9cecf202b27d 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -76,10 +76,6 @@ #include "../../../module/probe.h" #endif -#if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) && PREHEAT_COUNT - #define HAS_PREHEAT 1 -#endif - #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../feature/powerloss.h" #endif @@ -1593,7 +1589,7 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ #define PREHEAT_BACK 0 #define PREHEAT_MODE (PREHEAT_BACK + 1) - #define PREHEAT_1 (PREHEAT_MODE + (PREHEAT_COUNT >= 1)) + #define PREHEAT_1 (PREHEAT_MODE + 1) #define PREHEAT_2 (PREHEAT_1 + (PREHEAT_COUNT >= 2)) #define PREHEAT_3 (PREHEAT_2 + (PREHEAT_COUNT >= 3)) #define PREHEAT_4 (PREHEAT_3 + (PREHEAT_COUNT >= 4)) diff --git a/Marlin/src/lcd/extui/nextion/nextion_tft.cpp b/Marlin/src/lcd/extui/nextion/nextion_tft.cpp index 99211a220cc9..2c1bde245c02 100644 --- a/Marlin/src/lcd/extui/nextion/nextion_tft.cpp +++ b/Marlin/src/lcd/extui/nextion/nextion_tft.cpp @@ -335,7 +335,7 @@ void NextionTFT::PanelInfo(uint8_t req) { break; case 29: // Preheat - #if PREHEAT_COUNT + #if HAS_PREHEAT if (!isPrinting()) { // Preheat PLA if (nextion_command[4] == 'P') { @@ -560,7 +560,7 @@ void NextionTFT::PanelAction(uint8_t req) { break; case 63: // Preheat // Temps defined in configuration.h - #if PREHEAT_COUNT + #if HAS_PREHEAT if (!isPrinting()) switch (nextion_command[4]) { // Preheat PLA case 'P': diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 72dab6f35e24..7358cbce2340 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -705,7 +705,7 @@ namespace ExtUI { uint8_t getIDEX_Mode() { return dual_x_carriage_mode; } #endif - #if PREHEAT_COUNT + #if HAS_PREHEAT uint16_t getMaterial_preset_E(const uint16_t index) { return ui.material_preset[index].hotend_temp; } #if HAS_HEATED_BED uint16_t getMaterial_preset_B(const uint16_t index) { return ui.material_preset[index].bed_temp; } diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 7e899221ade4..04a298ba582e 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -148,7 +148,7 @@ namespace ExtUI { uint32_t getProgress_seconds_elapsed(); - #if PREHEAT_COUNT + #if HAS_PREHEAT uint16_t getMaterial_preset_E(const uint16_t); #if HAS_HEATED_BED uint16_t getMaterial_preset_B(const uint16_t); diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index 4669f0c233fc..8e4ff0e95cfc 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -56,7 +56,7 @@ namespace Language_an { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Achustar desfases"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfase aplicau"); LSTR MSG_SET_ORIGIN = _UxGT("Establir orichen"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Precalentar ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Precalentar ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla"); diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h index 3d332ca0580d..05209f771808 100644 --- a/Marlin/src/lcd/language/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -45,7 +45,7 @@ namespace Language_bg { LSTR MSG_AUTO_HOME = _UxGT("Паркиране"); LSTR MSG_SET_HOME_OFFSETS = _UxGT("Задай Начало"); LSTR MSG_SET_ORIGIN = _UxGT("Изходна точка"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Подгряване ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Подгряване ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза"); diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index c8f0d26a32b1..6fba76a552e1 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -54,7 +54,7 @@ namespace Language_ca { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Ajusta decalatge"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Decalatge aplicat"); LSTR MSG_SET_ORIGIN = _UxGT("Estableix origen"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Preescalfa ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Preescalfa ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" End"); diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index fd064b083489..596591e0f66e 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -78,7 +78,7 @@ namespace Language_cz { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Nastavit ofsety"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofsety nastaveny"); LSTR MSG_SET_ORIGIN = _UxGT("Nastavit počátek"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Zahřát ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Zahřát ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end"); @@ -153,7 +153,7 @@ namespace Language_cz { LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Konec úprav sítě"); LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Vlastní síť"); LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Vytvořit síť"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Síť bodů $"); LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Kontrola sítě $"); #endif diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index ef11906ed6fe..e03260557868 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -48,7 +48,7 @@ namespace Language_da { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Sæt forsk. af home"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Forsk. er nu aktiv"); LSTR MSG_SET_ORIGIN = _UxGT("Sæt origin"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Forvarm ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Forvarm ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 8160ad47246f..613880caa65d 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -69,7 +69,7 @@ namespace Language_de { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Setze Homeversatz"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Homeversatz aktiv"); LSTR MSG_SET_ORIGIN = _UxGT("Setze Nullpunkte"); //"G92 X0 Y0 Z0" commented out in marlinui.cpp - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" Vorwärmen"); LSTR MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" Vorwärmen ~"); LSTR MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärmen"); @@ -144,7 +144,7 @@ namespace Language_de { LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Bearbeitung beendet"); LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Eigenes Netz erst."); LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Netz erstellen"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("$ Netz erstellen"); LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("$ Netz validieren"); #endif diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index 21f5ca6503cc..3d1a79ea922b 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -65,7 +65,7 @@ namespace Language_el { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Ορισμός μετατοπίσεων"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Εφαρμογή μετατοπίσεων"); LSTR MSG_SET_ORIGIN = _UxGT("Ορισμός προέλευσης"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End"); diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h index 5259962f02ed..53e3ee3b948b 100644 --- a/Marlin/src/lcd/language/language_el_gr.h +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -54,7 +54,7 @@ namespace Language_el_gr { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Ορισμός βασικών μετατοπίσεων"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Εφαρμόστηκαν οι μετατοπίσεις"); LSTR MSG_SET_ORIGIN = _UxGT("Ορισμός προέλευσης"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index c9413d3ceab0..8af60c1642e3 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -104,7 +104,7 @@ namespace Language_en { LSTR MSG_TRAMMING_WIZARD = _UxGT("Tramming Wizard"); LSTR MSG_SELECT_ORIGIN = _UxGT("Select Origin"); LSTR MSG_LAST_VALUE_SP = _UxGT("Last value "); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Preheat ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Preheat ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 62dd69b52627..38f21985ecc8 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -73,7 +73,7 @@ namespace Language_es { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Ajustar desfases"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfase aplicada"); LSTR MSG_SET_ORIGIN = _UxGT("Establecer origen"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Precal. ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Precal. ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor"); @@ -147,7 +147,7 @@ namespace Language_es { LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Term. edici. Mallado"); LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crear Mallado Pers."); LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Crear Mallado"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Crear Mallado ($)"); LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Valid. Mall. ($)"); #endif diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index fc8f2e0f62ca..adc812f6ffee 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -57,7 +57,7 @@ namespace Language_eu { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Etxe. offset eza."); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsetak ezarrita"); LSTR MSG_SET_ORIGIN = _UxGT("Hasiera ipini"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Berotu ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Berotu ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia"); @@ -100,7 +100,7 @@ namespace Language_eu { LSTR MSG_UBL_MESH_EDIT = _UxGT("Sarea editatu"); LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Sarea editatzea eginda"); LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Sarea sortu"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("$ sarea sortu"); LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("$ sarea balioetsi"); #endif diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index 075b5b2744c8..62f3aae807a5 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -44,7 +44,7 @@ namespace Language_fi { LSTR MSG_DISABLE_STEPPERS = _UxGT("Vapauta moottorit"); LSTR MSG_AUTO_HOME = _UxGT("Aja referenssiin"); LSTR MSG_SET_ORIGIN = _UxGT("Aseta origo"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Esilämmitä ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 77472e4fbb5a..e9c55ed4018d 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -82,7 +82,7 @@ namespace Language_fr { LSTR MSG_TRAMMING_WIZARD = _UxGT("Assistant Molettes"); LSTR MSG_SELECT_ORIGIN = _UxGT("Molette du lit"); // Not a selection of the origin LSTR MSG_LAST_VALUE_SP = _UxGT("Ecart origine "); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Préchauffage ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Préchauffage ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse"); @@ -162,7 +162,7 @@ namespace Language_fr { LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Réglage fin"); LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Terminer"); LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Créer la grille"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Créer grille $"); LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Impr. grille $"); #endif diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 0252cf30ec78..c17faa701460 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -70,7 +70,7 @@ namespace Language_gl { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Axustar Desfases"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfases aplicados"); LSTR MSG_SET_ORIGIN = _UxGT("Fixar orixe"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Prequentar ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Prequentar ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico"); @@ -144,7 +144,7 @@ namespace Language_gl { LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Fin Edición da Malla"); LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crear Malla Person."); LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Crear Malla"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Crear Malla ($)"); LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Validar Malla ($)"); #endif diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index e828b489f6ea..23be8abbb185 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -54,7 +54,7 @@ namespace Language_hr { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Postavi home offsete"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets postavljeni"); LSTR MSG_SET_ORIGIN = _UxGT("Postavi ishodište"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Predgrij ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Predgrij ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 4028ab10cda6..faa313e48af3 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -89,7 +89,7 @@ namespace Language_hu { LSTR MSG_TRAMMING_WIZARD = _UxGT("Elektromos varázsló"); LSTR MSG_SELECT_ORIGIN = _UxGT("Eredeti választása"); LSTR MSG_LAST_VALUE_SP = _UxGT("Utolsó érték "); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Fütés ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Fütés ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Fej"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 2e2529a845a6..44ae49b519af 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -95,7 +95,7 @@ namespace Language_it { LSTR MSG_TRAMMING_WIZARD = _UxGT("Wizard Tramming"); LSTR MSG_SELECT_ORIGIN = _UxGT("Selez. origine"); LSTR MSG_LAST_VALUE_SP = _UxGT("Ultimo valore "); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Preriscalda ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Preriscalda ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello"); @@ -186,7 +186,7 @@ namespace Language_it { LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Modif.Mesh fatta"); LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crea Mesh personal."); LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Crea Mesh"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Crea Mesh ($)"); LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Valida Mesh ($)"); #endif diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index 1d291ed3ad03..16e605cc25c9 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -62,7 +62,7 @@ namespace Language_jp_kana { LSTR MSG_SET_HOME_OFFSETS = _UxGT("キジュンオフセットセッテイ"); // "Set home offsets" LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("オフセットガテキヨウサレマシタ"); // "Offsets applied" LSTR MSG_SET_ORIGIN = _UxGT("キジュンセット"); // "Set origin" - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" ヨネツ"); // "Preheat " PREHEAT_1_LABEL LSTR MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" ヨネツ ~"); // "Preheat " PREHEAT_1_LABEL LSTR MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" ヨネツノズル"); // " Nozzle" diff --git a/Marlin/src/lcd/language/language_ko_KR.h b/Marlin/src/lcd/language/language_ko_KR.h index 4ecdd5bb2d00..50c73f69e9ae 100644 --- a/Marlin/src/lcd/language/language_ko_KR.h +++ b/Marlin/src/lcd/language/language_ko_KR.h @@ -54,7 +54,7 @@ namespace Language_ko_KR { LSTR MSG_LEVEL_BED_WAITING = _UxGT("누르면 시작합니다"); LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("다음 Point"); LSTR MSG_LEVEL_BED_DONE = _UxGT("레벨링 완료!"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("예열하기 - ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("예열하기 - ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐"); diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index b44d09d07ca7..42df92b88039 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -54,7 +54,7 @@ namespace Language_nl { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Zet home offsets"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("H offset toegep."); LSTR MSG_SET_ORIGIN = _UxGT("Nulpunt instellen"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" voorverwarmen"); LSTR MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" voorverw. ~"); LSTR MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" voorverw. Einde"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 2dde747378b4..9105f58bdbb0 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -83,7 +83,7 @@ namespace Language_pl { LSTR MSG_SET_ORIGIN = _UxGT("Ustaw punkt zero"); LSTR MSG_SELECT_ORIGIN = _UxGT("Wybierz punkt zero"); LSTR MSG_LAST_VALUE_SP = _UxGT("Poprzednia wartość "); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Rozgrzej ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza"); diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index 13f62f693bfb..524c2c97d859 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -53,7 +53,7 @@ namespace Language_pt { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Definir desvio"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets aplicados"); LSTR MSG_SET_ORIGIN = _UxGT("Definir origem"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index 7d97d4833670..c66f717f9d28 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -68,7 +68,7 @@ namespace Language_pt_br { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Compensar origem"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Alteração aplicada"); LSTR MSG_SET_ORIGIN = _UxGT("Ajustar Origem"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Extrusora ") PREHEAT_1_LABEL; @@ -133,7 +133,7 @@ namespace Language_pt_br { LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Fim da Edição"); LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Montar Malha Custom"); LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Montar "); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Montar $"); LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Checar $"); #endif diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index 2eb4c0b99608..fee63dc2ad90 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -69,7 +69,7 @@ namespace Language_ro { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Seteaza Offseturile Acasa"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offseturi Aplicate"); LSTR MSG_SET_ORIGIN = _UxGT("Seteaza Originea"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Preincalzeste ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Preincalzeste ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Capatul"); @@ -143,7 +143,7 @@ namespace Language_ro { LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Done Editing Mesh"); LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Build Custom Mesh"); LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Build Mesh"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Build Mesh ($)"); LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Validate Mesh ($)"); #endif diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 2de45e7d8d0b..e33018b0341c 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -106,7 +106,7 @@ namespace Language_ru { #else LSTR MSG_LAST_VALUE_SP = _UxGT("Послед. знач. "); #endif - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Преднагрев ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Нагрев ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Нагрев ") PREHEAT_1_LABEL _UxGT(" сопло"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 81fb9a3d017f..76e7f7fbd7a6 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -107,7 +107,7 @@ namespace Language_sk { LSTR MSG_TRAMMING_WIZARD = _UxGT("Spriev. vyrovn."); LSTR MSG_SELECT_ORIGIN = _UxGT("Vyberte začiatok"); LSTR MSG_LAST_VALUE_SP = _UxGT("Posl. hodnota "); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Zahriať ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Zahriať ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend"); diff --git a/Marlin/src/lcd/language/language_sv.h b/Marlin/src/lcd/language/language_sv.h index 3b4d6c24c1fd..cdb902aef069 100644 --- a/Marlin/src/lcd/language/language_sv.h +++ b/Marlin/src/lcd/language/language_sv.h @@ -78,7 +78,7 @@ namespace Language_sv { LSTR MSG_SELECT_ORIGIN = _UxGT("Välj Origo"); LSTR MSG_LAST_VALUE_SP = _UxGT("Senaste värde "); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Förvärmning ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Förvärmning ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Förvärmning ") PREHEAT_1_LABEL _UxGT(" Stoppa"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index d6f2f52a0cb6..4c2bbfa0dc00 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -73,7 +73,7 @@ namespace Language_tr { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Ofset Ayarla"); LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofset Tamam"); LSTR MSG_SET_ORIGIN = _UxGT("Sıfır Belirle"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Ön Isınma ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul"); @@ -146,7 +146,7 @@ namespace Language_tr { LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Mesh Düzenleme Tamam"); LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Özel Mesh Oluştur"); LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Mesh Oluştur"); - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Mesh Oluştur ($)"); LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Doğrulama Mesh ($)"); #endif diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 581a501b49a2..afba537008c7 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -108,7 +108,7 @@ namespace Language_uk { #else LSTR MSG_LAST_VALUE_SP = _UxGT("Останнє знач. "); #endif - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Нагрів ") PREHEAT_1_LABEL; LSTR MSG_PREHEAT_1_H = _UxGT("Нагрів ") PREHEAT_1_LABEL " ~"; LSTR MSG_PREHEAT_1_END = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" сопло"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index 9a4ef464b5c6..ae0babbf8b34 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -64,7 +64,7 @@ namespace Language_vi { LSTR MSG_SET_HOME_OFFSETS = _UxGT("Đặt bù đắp nhà"); // Set home offsets LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Bù đắp được áp dụng"); // Offsets applied LSTR MSG_SET_ORIGIN = _UxGT("Đặt nguồn gốc"); // Set origin - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước"); // Preheat LSTR MSG_PREHEAT_1_H = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước ~"); // Preheat LSTR MSG_PREHEAT_1_END = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu"); @@ -126,7 +126,7 @@ namespace Language_vi { LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Chỉnh sửa xong lưới"); // Done Editing Mesh LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Xây dựng lưới tự chọn"); // Build Custom Mesh LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Xây dựng lưới"); // Build Mesh - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Xây dựng lưới ($)"); LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Thẩm tra lưới ($)"); #endif diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index afa51689cf2d..d61634e431e1 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -68,7 +68,7 @@ namespace Language_zh_CN { LSTR MSG_SET_HOME_OFFSETS = _UxGT("设置原点偏移"); // "Set home offsets" LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已启用"); // "Offsets applied" LSTR MSG_SET_ORIGIN = _UxGT("设置原点"); // "Set origin" - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("预热 ") PREHEAT_1_LABEL; // "Preheat PREHEAT_2_LABEL" LSTR MSG_PREHEAT_1_H = _UxGT("预热 ") PREHEAT_1_LABEL " ~"; // "Preheat PREHEAT_2_LABEL" LSTR MSG_PREHEAT_1_END = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴"); //MSG_PREHEAT_1 " " @@ -142,7 +142,7 @@ namespace Language_zh_CN { LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("完成编辑网格"); // "Done Editing Mesh" LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("创设客户网格"); // "Build Custom Mesh" LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("创设网格"); // "Build Mesh" - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("创设 $ 网格"); // "Build PREHEAT_1_LABEL Mesh" LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 网格"); // "Validate PREHEAT_1_LABEL Mesh" #endif diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 01b11225e347..7680721b00e0 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -66,7 +66,7 @@ namespace Language_zh_TW { LSTR MSG_SET_HOME_OFFSETS = _UxGT("設置原點偏移"); // "Set home offsets" LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已啟用"); // "Offsets applied" LSTR MSG_SET_ORIGIN = _UxGT("設置原點"); // "Set origin" - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_PREHEAT_1 = _UxGT("預熱 ") PREHEAT_1_LABEL; // "Preheat PREHEAT_1_LABEL" LSTR MSG_PREHEAT_1_H = _UxGT("預熱 ") PREHEAT_1_LABEL " ~"; // "Preheat PREHEAT_1_LABEL" LSTR MSG_PREHEAT_1_END = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴"); //MSG_PREHEAT_1 " " @@ -139,7 +139,7 @@ namespace Language_zh_TW { LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("完成編輯網格"); // "Done Editing Mesh" LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("創設客戶網格"); // "Build Custom Mesh" LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("創設網格"); // "Build Mesh" - #if PREHEAT_COUNT + #if HAS_PREHEAT LSTR MSG_UBL_BUILD_MESH_M = _UxGT("創設 $ 網格"); // "Build PREHEAT_1_LABEL Mesh" LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 網格"); // "Validate PREHEAT_1_LABEL Mesh" #endif diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index ae169cdab6cb..2757e6d47acd 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -134,7 +134,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; } #endif -#if PREHEAT_COUNT +#if HAS_PREHEAT preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load() PGM_P MarlinUI::get_preheat_label(const uint8_t m) { #define _PDEF(N) static PGMSTR(preheat_##N##_label, PREHEAT_##N##_LABEL); diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 883850d6e0a0..63e1eb5b0def 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -116,7 +116,7 @@ }; #endif -#if PREHEAT_COUNT +#if HAS_PREHEAT typedef struct { #if HAS_HOTEND celsius_t hotend_temp; @@ -497,7 +497,7 @@ class MarlinUI { static const char * scrolled_filename(CardReader &theCard, const uint8_t maxlen, uint8_t hash, const bool doScroll); #endif - #if PREHEAT_COUNT + #if HAS_PREHEAT static preheat_t material_preset[PREHEAT_COUNT]; static PGM_P get_preheat_label(const uint8_t m); #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 0e11cd211a50..9e1f455a6443 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -310,7 +310,7 @@ void menu_advanced_settings(); #endif -#if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS) +#if HAS_PREHEAT && DISABLED(SLIM_LCD_MENUS) void _menu_configuration_preheat_settings() { #define _MINTEMP_ITEM(N) HEATER_##N##_MINTEMP, @@ -547,7 +547,7 @@ void menu_configuration() { #endif // Preheat configurations - #if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS) + #if HAS_PREHEAT && DISABLED(SLIM_LCD_MENUS) LOOP_L_N(m, PREHEAT_COUNT) SUBMENU_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M_SETTINGS, _menu_configuration_preheat_settings); #endif diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 7d0d2dc72c8a..e7365744e9a1 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -90,7 +90,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { START_MENU(); if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_DEFAULT|SS_INVERT); BACK_ITEM(MSG_BACK); - #if PREHEAT_COUNT + #if HAS_PREHEAT LOOP_L_N(m, PREHEAT_COUNT) ACTION_ITEM_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M, _change_filament_with_preset); #endif diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 3abb2e9c2032..5524793b19d6 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -69,7 +69,7 @@ void Temperature::lcd_preheat(const uint8_t e, const int8_t indh, const int8_t i ui.return_to_status(); } -#if PREHEAT_COUNT +#if HAS_PREHEAT #if HAS_TEMP_HOTEND inline void _preheat_end(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } @@ -138,7 +138,7 @@ void Temperature::lcd_preheat(const uint8_t e, const int8_t indh, const int8_t i #endif // HAS_MULTI_HOTEND || HAS_HEATED_BED -#endif // PREHEAT_COUNT +#endif // HAS_PREHEAT #if HAS_TEMP_HOTEND || HAS_HEATED_BED @@ -263,7 +263,7 @@ void menu_temperature() { #endif // HAS_FAN - #if PREHEAT_COUNT + #if HAS_PREHEAT // // Preheat for all Materials // diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 8dea7d943dc6..a08eceed7797 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -208,7 +208,7 @@ void _lcd_ubl_edit_mesh() { void _lcd_ubl_validate_mesh() { START_MENU(); BACK_ITEM(MSG_UBL_TOOLS); - #if PREHEAT_COUNT + #if HAS_PREHEAT #if HAS_HEATED_BED #define VALIDATE_MESH_GCODE_ITEM(M) \ GCODES_ITEM_N_S(M, ui.get_preheat_label(M), MSG_UBL_VALIDATE_MESH_M, PSTR("G28\nG26CPI" STRINGIFY(M))) @@ -230,7 +230,7 @@ void _lcd_ubl_edit_mesh() { #endif #endif #endif - #endif // PREHEAT_COUNT + #endif // HAS_PREHEAT ACTION_ITEM(MSG_UBL_VALIDATE_CUSTOM_MESH, _lcd_ubl_validate_custom_mesh); ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); END_MENU(); @@ -324,7 +324,7 @@ void _lcd_ubl_invalidate() { void _lcd_ubl_build_mesh() { START_MENU(); BACK_ITEM(MSG_UBL_TOOLS); - #if PREHEAT_COUNT + #if HAS_PREHEAT #if HAS_HEATED_BED #define PREHEAT_BED_GCODE(M) "M190I" STRINGIFY(M) "\n" #else @@ -352,7 +352,7 @@ void _lcd_ubl_build_mesh() { #endif #endif #endif - #endif // PREHEAT_COUNT + #endif // HAS_PREHEAT SUBMENU(MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_custom_mesh); GCODES_ITEM(MSG_UBL_BUILD_COLD_MESH, PSTR("G29NP1")); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 6b7143e82a00..c82f5aad0df4 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -317,7 +317,7 @@ typedef struct SettingsDataStruct { // // Material Presets // - #if PREHEAT_COUNT + #if HAS_PREHEAT preheat_t ui_material_preset[PREHEAT_COUNT]; // M145 S0 H B F #endif @@ -918,7 +918,7 @@ void MarlinSettings::postprocess() { // // LCD Preheat settings // - #if PREHEAT_COUNT + #if HAS_PREHEAT _FIELD_TEST(ui_material_preset); EEPROM_WRITE(ui.material_preset); #endif @@ -1786,7 +1786,7 @@ void MarlinSettings::postprocess() { // // LCD Preheat settings // - #if PREHEAT_COUNT + #if HAS_PREHEAT _FIELD_TEST(ui_material_preset); EEPROM_READ(ui.material_preset); #endif @@ -2796,7 +2796,7 @@ void MarlinSettings::reset() { // // Preheat parameters // - #if PREHEAT_COUNT + #if HAS_PREHEAT #define _PITEM(N,T) PREHEAT_##N##_##T, #if HAS_HOTEND constexpr uint16_t hpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_HOTEND) }; @@ -3181,7 +3181,7 @@ void MarlinSettings::reset() { // // LCD Preheat Settings // - #if PREHEAT_COUNT + #if HAS_PREHEAT gcode.M145_report(forReplay); #endif From b09038fcc72bc8df4ec8a7014597586e0b0390ca Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 27 Oct 2021 20:01:44 -0500 Subject: [PATCH 28/78] =?UTF-8?q?=F0=9F=8E=A8=20Standard=20material=20pres?= =?UTF-8?q?ets=20behavior?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/e3v2/creality/dwin.cpp | 211 ++++++++++-------- Marlin/src/lcd/e3v2/enhanced/dwin.cpp | 18 +- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 110 +++------ .../src/lcd/extui/dgus/DGUSScreenHandler.cpp | 54 +---- Marlin/src/lcd/extui/ui_api.cpp | 5 +- Marlin/src/lcd/marlinui.cpp | 11 + Marlin/src/lcd/marlinui.h | 8 +- 7 files changed, 178 insertions(+), 239 deletions(-) diff --git a/Marlin/src/lcd/e3v2/creality/dwin.cpp b/Marlin/src/lcd/e3v2/creality/dwin.cpp index a27762d71ed4..82623d7c7d04 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -166,8 +166,14 @@ typedef struct { select_t select_page{0}, select_file{0}, select_print{0}, select_prepare{0} , select_control{0}, select_axis{0}, select_temp{0}, select_motion{0}, select_tune{0} - , select_advset{0}, select_PLA{0}, select_ABS{0} - , select_speed{0}, select_acc{0}, select_jerk{0}, select_step{0}, select_item{0}; + , select_advset{0}, select_speed{0}, select_acc{0}, select_jerk{0}, select_step{0}, select_item{0}; + +#if HAS_PREHEAT + select_t select_PLA{0}; + #if PREHEAT_COUNT > 1 + select_t select_ABS{0}; + #endif +#endif uint8_t index_file = MROWS, index_prepare = MROWS, @@ -492,8 +498,8 @@ inline bool Apply_Encoder(const EncoderState &encoder_diffState, T &valref) { #define PREPARE_CASE_DISA 2 #define PREPARE_CASE_HOME 3 #define PREPARE_CASE_ZOFF (PREPARE_CASE_HOME + ENABLED(HAS_ZOFFSET_ITEM)) -#define PREPARE_CASE_PLA (PREPARE_CASE_ZOFF + ENABLED(HAS_HOTEND)) -#define PREPARE_CASE_ABS (PREPARE_CASE_PLA + ENABLED(HAS_HOTEND)) +#define PREPARE_CASE_PLA (PREPARE_CASE_ZOFF + ENABLED(HAS_PREHEAT)) +#define PREPARE_CASE_ABS (PREPARE_CASE_PLA + (TERN0(HAS_PREHEAT, PREHEAT_COUNT > 1))) #define PREPARE_CASE_COOL (PREPARE_CASE_ABS + EITHER(HAS_HOTEND, HAS_HEATED_BED)) #define PREPARE_CASE_LANG (PREPARE_CASE_COOL + 1) #define PREPARE_CASE_TOTAL PREPARE_CASE_LANG @@ -517,8 +523,8 @@ inline bool Apply_Encoder(const EncoderState &encoder_diffState, T &valref) { #define TEMP_CASE_TEMP (0 + ENABLED(HAS_HOTEND)) #define TEMP_CASE_BED (TEMP_CASE_TEMP + ENABLED(HAS_HEATED_BED)) #define TEMP_CASE_FAN (TEMP_CASE_BED + ENABLED(HAS_FAN)) -#define TEMP_CASE_PLA (TEMP_CASE_FAN + ENABLED(HAS_HOTEND)) -#define TEMP_CASE_ABS (TEMP_CASE_PLA + ENABLED(HAS_HOTEND)) +#define TEMP_CASE_PLA (TEMP_CASE_FAN + ENABLED(HAS_PREHEAT)) +#define TEMP_CASE_ABS (TEMP_CASE_PLA + (TERN0(HAS_PREHEAT, PREHEAT_COUNT > 1))) #define TEMP_CASE_TOTAL TEMP_CASE_ABS #define PREHEAT_CASE_TEMP (0 + ENABLED(HAS_HOTEND)) @@ -785,6 +791,8 @@ void Draw_Prepare_Menu() { #if PREHEAT_COUNT > 1 if (PVISI(PREPARE_CASE_ABS)) Item_Prepare_ABS(PSCROL(PREPARE_CASE_ABS)); // Preheat ABS #endif + #endif + #if HAS_HOTEND || HAS_HEATED_BED if (PVISI(PREPARE_CASE_COOL)) Item_Prepare_Cool(PSCROL(PREPARE_CASE_COOL)); // Cooldown #endif if (PVISI(PREPARE_CASE_LANG)) Item_Prepare_Lang(PSCROL(PREPARE_CASE_LANG)); // Language CN/EN @@ -2664,10 +2672,10 @@ void HMI_Prepare() { // Draw "More" icon for sub-menus if (index_prepare < 7) Draw_More_Icon(MROWS - index_prepare + 1); - #if HAS_HOTEND + #if PREHEAT_COUNT > 1 if (index_prepare == PREPARE_CASE_ABS) Item_Prepare_ABS(MROWS); #endif - #if HAS_PREHEAT + #if HAS_HOTEND || HAS_HEATED_BED if (index_prepare == PREPARE_CASE_COOL) Item_Prepare_Cool(MROWS); #endif if (index_prepare == PREPARE_CASE_LANG) Item_Prepare_Lang(MROWS); @@ -2743,16 +2751,13 @@ void HMI_Prepare() { break; #endif #if HAS_PREHEAT - case PREPARE_CASE_PLA: - TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0)); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(ui.material_preset[0].bed_temp)); - TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[0].fan_speed)); - break; - case PREPARE_CASE_ABS: - TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[1].hotend_temp, 0)); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(ui.material_preset[1].bed_temp)); - TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[1].fan_speed)); - break; + case PREPARE_CASE_PLA: ui.preheat_all(0); break; + #if PREHEAT_COUNT > 1 + case PREPARE_CASE_ABS: ui.preheat_all(1); break; + #endif + #endif + + #if HAS_HOTEND || HAS_HEATED_BED case PREPARE_CASE_COOL: TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); #if HAS_HOTEND || HAS_HEATED_BED @@ -2760,6 +2765,7 @@ void HMI_Prepare() { #endif break; #endif + case PREPARE_CASE_LANG: HMI_ToggleLanguage(); Draw_Prepare_Menu(); @@ -2784,9 +2790,11 @@ void Draw_Temperature_Menu() { #if HAS_FAN Item_AreaCopy(115, 134, 170, 146, TEMP_CASE_FAN); #endif - #if HAS_HOTEND + #if HAS_PREHEAT Item_AreaCopy(100, 89, 178, 101, TEMP_CASE_PLA); - Item_AreaCopy(180, 89, 260, 100, TEMP_CASE_ABS); + #if PREHEAT_COUNT > 1 + Item_AreaCopy(180, 89, 260, 100, TEMP_CASE_ABS); + #endif #endif } else { @@ -2805,30 +2813,33 @@ void Draw_Temperature_Menu() { #if HAS_FAN DWIN_Draw_Label(TEMP_CASE_FAN, GET_TEXT_F(MSG_FAN_SPEED)); #endif - #if HAS_HOTEND + #if HAS_PREHEAT DWIN_Draw_Label(TEMP_CASE_PLA, F(PREHEAT_1_LABEL " Preheat Settings")); - DWIN_Draw_Label(TEMP_CASE_ABS, F(PREHEAT_2_LABEL " Preheat Settings")); + #if PREHEAT_COUNT > 1 + DWIN_Draw_Label(TEMP_CASE_ABS, F(PREHEAT_2_LABEL " Preheat Settings")); + #endif #endif #else #if HAS_HOTEND - Item_AreaCopy(197, 104, 238, 114, TEMP_CASE_TEMP); // "Nozzle" - Item_AreaCopy(1, 89, 83, 101, TEMP_CASE_TEMP, 44); // "Temperature" + Item_AreaCopy(197, 104, 238, 114, TEMP_CASE_TEMP); // "Nozzle" + Item_AreaCopy(1, 89, 83, 101, TEMP_CASE_TEMP, 44); // "Temperature" #endif #if HAS_HEATED_BED - Item_AreaCopy(240, 104, 264, 114, TEMP_CASE_BED); // "Bed" - Item_AreaCopy(1, 89, 83, 101, TEMP_CASE_BED, 27); // "Temperature" + Item_AreaCopy(240, 104, 264, 114, TEMP_CASE_BED); // "Bed" + Item_AreaCopy(1, 89, 83, 101, TEMP_CASE_BED, 27); // "Temperature" #endif #if HAS_FAN - Item_AreaCopy( 1, 119, 61, 132, TEMP_CASE_FAN); // "Fan speed" + Item_AreaCopy( 1, 119, 61, 132, TEMP_CASE_FAN); // "Fan speed" #endif - #if HAS_HOTEND - Item_AreaCopy(107, 76, 156, 86, TEMP_CASE_PLA); // "Preheat" - say_pla_en(52, TEMP_CASE_PLA); // "PLA" - Item_AreaCopy(150, 135, 202, 148, TEMP_CASE_PLA, 79); // "Settings" - - Item_AreaCopy(107, 76, 156, 86, TEMP_CASE_ABS); // "Preheat" - say_abs_en(52, TEMP_CASE_ABS); // "ABS" - Item_AreaCopy(150, 135, 202, 148, TEMP_CASE_ABS, 81); // "Settings" + #if HAS_PREHEAT + Item_AreaCopy(107, 76, 156, 86, TEMP_CASE_PLA); // "Preheat" + say_pla_en(52, TEMP_CASE_PLA); // "PLA" + Item_AreaCopy(150, 135, 202, 148, TEMP_CASE_PLA, 79); // "Settings" + #if PREHEAT_COUNT > 1 + Item_AreaCopy(107, 76, 156, 86, TEMP_CASE_ABS); // "Preheat" + say_abs_en(52, TEMP_CASE_ABS); // "ABS" + Item_AreaCopy(150, 135, 202, 148, TEMP_CASE_ABS, 81); // "Settings" + #endif #endif #endif } @@ -2851,12 +2862,12 @@ void Draw_Temperature_Menu() { _TMENU_ICON(TEMP_CASE_FAN); Draw_Edit_Integer3(i, thermalManager.fan_speed[0]); #endif - #if HAS_HOTEND + #if HAS_PREHEAT // PLA/ABS items have submenus - _TMENU_ICON(TEMP_CASE_PLA); - Draw_More_Icon(i); - _TMENU_ICON(TEMP_CASE_ABS); - Draw_More_Icon(i); + _TMENU_ICON(TEMP_CASE_PLA); Draw_More_Icon(i); + #if PREHEAT_COUNT > 1 + _TMENU_ICON(TEMP_CASE_ABS); Draw_More_Icon(i); + #endif #endif } @@ -3076,6 +3087,7 @@ void HMI_Temperature() { EncoderRate.enabled = true; break; #endif + #if HAS_PREHEAT case TEMP_CASE_PLA: { checkkey = PLAPreheat; @@ -3153,7 +3165,8 @@ void HMI_Temperature() { Draw_Menu_Line(++i, ICON_WriteEEPROM); #endif } break; - #endif + #endif // HAS_PREHEAT + #if PREHEAT_COUNT > 1 case TEMP_CASE_ABS: { // ABS preheat setting checkkey = ABSPreheat; @@ -3236,7 +3249,7 @@ void HMI_Temperature() { } break; - #endif // HAS_HOTEND + #endif // PREHEAT_COUNT > 1 } } DWIN_UpdateLCD(); @@ -3579,14 +3592,12 @@ void HMI_AdvSet() { #if HAS_HOTEND case ADVSET_CASE_HEPID: - thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0); thermalManager.PID_autotune(ui.material_preset[0].hotend_temp, H_E0, 10, true); break; #endif #if HAS_HEATED_BED case ADVSET_CASE_BEDPID: - thermalManager.setTargetBed(ui.material_preset[0].bed_temp); thermalManager.PID_autotune(ui.material_preset[0].bed_temp, H_BED, 10, true); break; #endif @@ -3881,63 +3892,65 @@ void HMI_Tune() { DWIN_UpdateLCD(); } - // ABS Preheat - void HMI_ABSPreheatSetting() { - EncoderState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_ABS.inc(1 + PREHEAT_CASE_TOTAL)) Move_Highlight(1, select_ABS.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_ABS.dec()) Move_Highlight(-1, select_ABS.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_ABS.now) { - case CASE_BACK: - checkkey = TemperatureID; - select_temp.now = TEMP_CASE_ABS; - HMI_ValueStruct.show_mode = -1; - Draw_Temperature_Menu(); - break; - #if HAS_HOTEND - case PREHEAT_CASE_TEMP: - checkkey = ETemp; - HMI_ValueStruct.E_Temp = ui.material_preset[1].hotend_temp; - Draw_Edit_Integer3(PREHEAT_CASE_TEMP, ui.material_preset[1].hotend_temp, true); - EncoderRate.enabled = true; - break; - #endif - #if HAS_HEATED_BED - case PREHEAT_CASE_BED: - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = ui.material_preset[1].bed_temp; - Draw_Edit_Integer3(PREHEAT_CASE_BED, ui.material_preset[1].bed_temp, true); - EncoderRate.enabled = true; - break; - #endif - #if HAS_FAN - case PREHEAT_CASE_FAN: - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = ui.material_preset[1].fan_speed; - Draw_Edit_Integer3(PREHEAT_CASE_FAN, ui.material_preset[1].fan_speed, true); - EncoderRate.enabled = true; + #if PREHEAT_COUNT > 1 + // ABS Preheat + void HMI_ABSPreheatSetting() { + EncoderState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_ABS.inc(1 + PREHEAT_CASE_TOTAL)) Move_Highlight(1, select_ABS.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_ABS.dec()) Move_Highlight(-1, select_ABS.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_ABS.now) { + case CASE_BACK: + checkkey = TemperatureID; + select_temp.now = TEMP_CASE_ABS; + HMI_ValueStruct.show_mode = -1; + Draw_Temperature_Menu(); break; - #endif - #if ENABLED(EEPROM_SETTINGS) - case PREHEAT_CASE_SAVE: { - const bool success = settings.save(); - HMI_AudioFeedback(success); - } break; - #endif - default: break; + #if HAS_HOTEND + case PREHEAT_CASE_TEMP: + checkkey = ETemp; + HMI_ValueStruct.E_Temp = ui.material_preset[1].hotend_temp; + Draw_Edit_Integer3(PREHEAT_CASE_TEMP, ui.material_preset[1].hotend_temp, true); + EncoderRate.enabled = true; + break; + #endif + #if HAS_HEATED_BED + case PREHEAT_CASE_BED: + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = ui.material_preset[1].bed_temp; + Draw_Edit_Integer3(PREHEAT_CASE_BED, ui.material_preset[1].bed_temp, true); + EncoderRate.enabled = true; + break; + #endif + #if HAS_FAN + case PREHEAT_CASE_FAN: + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = ui.material_preset[1].fan_speed; + Draw_Edit_Integer3(PREHEAT_CASE_FAN, ui.material_preset[1].fan_speed, true); + EncoderRate.enabled = true; + break; + #endif + #if ENABLED(EEPROM_SETTINGS) + case PREHEAT_CASE_SAVE: { + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; + #endif + default: break; + } } + DWIN_UpdateLCD(); } - DWIN_UpdateLCD(); - } + #endif // PREHEAT_COUNT > 1 -#endif +#endif // HAS_PREHEAT // Max Speed void HMI_MaxSpeed() { @@ -4241,7 +4254,9 @@ void DWIN_HandleScreen() { case Tune: HMI_Tune(); break; #if HAS_PREHEAT case PLAPreheat: HMI_PLAPreheatSetting(); break; - case ABSPreheat: HMI_ABSPreheatSetting(); break; + #if PREHEAT_COUNT > 1 + case ABSPreheat: HMI_ABSPreheatSetting(); break; + #endif #endif case MaxSpeed: HMI_MaxSpeed(); break; case MaxAcceleration: HMI_MaxAcceleration(); break; diff --git a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp index 22de4d720bf5..3d5a56c86967 100644 --- a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp +++ b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp @@ -2116,21 +2116,15 @@ void SetHome() { #endif #if HAS_PREHEAT - void SetPreheat(const uint8_t i) { - TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[i].hotend_temp, 0)); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(ui.material_preset[i].bed_temp)); - TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[i].fan_speed)); - } - void SetPreheat0() { SetPreheat(0); } - void SetPreheat1() { SetPreheat(1); } - void SetPreheat2() { SetPreheat(2); } - void SetCoolDown() { TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); #if HAS_HOTEND || HAS_HEATED_BED thermalManager.disable_all_heaters(); #endif } + void DoPreheat0() { ui.preheat_all(0); } + void DoPreheat1() { ui.preheat_all(1); } + void DoPreheat2() { ui.preheat_all(2); } #endif void SetLanguage() { @@ -3125,12 +3119,12 @@ void Draw_Prepare_Menu() { #endif #endif #if HAS_PREHEAT - ADDMENUITEM(ICON_PLAPreheat, GET_TEXT_F(MSG_PREHEAT_1), onDrawPreheat1, SetPreheat0); + ADDMENUITEM(ICON_PLAPreheat, GET_TEXT_F(MSG_PREHEAT_1), onDrawPreheat1, DoPreheat0); #if PREHEAT_COUNT > 1 - ADDMENUITEM(ICON_ABSPreheat, PSTR("Preheat " PREHEAT_2_LABEL), onDrawPreheat2, SetPreheat1); + ADDMENUITEM(ICON_ABSPreheat, PSTR("Preheat " PREHEAT_2_LABEL), onDrawPreheat2, DoPreheat1); #endif #if PREHEAT_COUNT > 2 - ADDMENUITEM(ICON_CustomPreheat, GET_TEXT_F(MSG_PREHEAT_CUSTOM), onDrawMenuItem, SetPreheat2); + ADDMENUITEM(ICON_CustomPreheat, GET_TEXT_F(MSG_PREHEAT_CUSTOM), onDrawMenuItem, DoPreheat2); #endif ADDMENUITEM(ICON_Cool, GET_TEXT_F(MSG_COOLDOWN), onDrawCooldown, SetCoolDown); #endif diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 9cecf202b27d..54266e717b65 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -1584,9 +1584,9 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ } break; #endif - #if HAS_PREHEAT - case Preheat: + #if HAS_PREHEAT + case Preheat: { #define PREHEAT_BACK 0 #define PREHEAT_MODE (PREHEAT_BACK + 1) #define PREHEAT_1 (PREHEAT_MODE + 1) @@ -1596,6 +1596,13 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ #define PREHEAT_5 (PREHEAT_4 + (PREHEAT_COUNT >= 5)) #define PREHEAT_TOTAL PREHEAT_5 + auto do_preheat = [](const uint8_t m) { + thermalManager.disable_all_heaters(); + TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); + if (preheatmode == 0 || preheatmode == 1) { ui.preheat_hotend_and_fan(m); } + if (preheatmode == 0 || preheatmode == 2) ui.preheat_bed(m); + }; + switch (item) { case PREHEAT_BACK: if (draw) @@ -1616,17 +1623,8 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ case PREHEAT_1: if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_1_LABEL)); - else { - thermalManager.disable_all_heaters(); - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - if (preheatmode == 0 || preheatmode == 1) { - TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0)); - TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[0].fan_speed)); - } - #if HAS_HEATED_BED - if (preheatmode == 0 || preheatmode == 2) thermalManager.setTargetBed(ui.material_preset[0].bed_temp); - #endif - } + else + do_preheat(0); break; #endif @@ -1634,17 +1632,8 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ case PREHEAT_2: if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_2_LABEL)); - else { - thermalManager.disable_all_heaters(); - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - if (preheatmode == 0 || preheatmode == 1) { - TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[1].hotend_temp, 0)); - TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[1].fan_speed)); - } - #if HAS_HEATED_BED - if (preheatmode == 0 || preheatmode == 2) thermalManager.setTargetBed(ui.material_preset[1].bed_temp); - #endif - } + else + do_preheat(1); break; #endif @@ -1652,17 +1641,8 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ case PREHEAT_3: if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_3_LABEL)); - else { - thermalManager.disable_all_heaters(); - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - if (preheatmode == 0 || preheatmode == 1) { - TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[2].hotend_temp, 0)); - TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[2].fan_speed)); - } - #if HAS_HEATED_BED - if (preheatmode == 0 || preheatmode == 2) thermalManager.setTargetBed(ui.material_preset[2].bed_temp); - #endif - } + else + do_preheat(2); break; #endif @@ -1670,17 +1650,8 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ case PREHEAT_4: if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_4_LABEL)); - else { - thermalManager.disable_all_heaters(); - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - if (preheatmode == 0 || preheatmode == 1) { - TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[3].hotend_temp, 0)); - TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[3].fan_speed)); - } - #if HAS_HEATED_BED - if (preheatmode == 0 || preheatmode == 2) thermalManager.setTargetBed(ui.material_preset[3].bed_temp); - #endif - } + else + do_preheat(3); break; #endif @@ -1688,22 +1659,13 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ case PREHEAT_5: if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_5_LABEL)); - else { - thermalManager.disable_all_heaters(); - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - if (preheatmode == 0 || preheatmode == 1) { - TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[4].hotend_temp, 0)); - TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[4].fan_speed)); - } - #if HAS_HEATED_BED - if (preheatmode == 0 || preheatmode == 2) thermalManager.setTargetBed(ui.material_preset[4].bed_temp); - #endif - } + else + do_preheat(4); break; #endif } - break; - #endif + } break; + #endif // HAS_PREHEAT #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) case ChangeFilament: @@ -3964,50 +3926,40 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ case PREHEATHOTEND_1: if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_1_LABEL)); - else { - thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0); - thermalManager.set_fan_speed(0, ui.material_preset[0].fan_speed); - } + else + ui.preheat_hotend_and_fan(0); break; #endif #if PREHEAT_COUNT >= 2 case PREHEATHOTEND_2: if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_2_LABEL)); - else { - thermalManager.setTargetHotend(ui.material_preset[1].hotend_temp, 0); - thermalManager.set_fan_speed(0, ui.material_preset[1].fan_speed); - } + else + ui.preheat_hotend_and_fan(1); break; #endif #if PREHEAT_COUNT >= 3 case PREHEATHOTEND_3: if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_3_LABEL)); - else { - thermalManager.setTargetHotend(ui.material_preset[2].hotend_temp, 0); - thermalManager.set_fan_speed(0, ui.material_preset[2].fan_speed); - } + else + ui.preheat_hotend_and_fan(2); break; #endif #if PREHEAT_COUNT >= 4 case PREHEATHOTEND_4: if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_4_LABEL)); - else { - thermalManager.setTargetHotend(ui.material_preset[3].hotend_temp, 0); - thermalManager.set_fan_speed(0, ui.material_preset[3].fan_speed); - } + else + ui.preheat_hotend_and_fan(3); break; #endif #if PREHEAT_COUNT >= 5 case PREHEATHOTEND_5: if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_5_LABEL)); - else { - thermalManager.setTargetHotend(ui.material_preset[4].hotend_temp, 0); - thermalManager.set_fan_speed(0, ui.material_preset[4].fan_speed); - } + else + ui.preheat_hotend_and_fan(4); break; #endif case PREHEATHOTEND_CUSTOM: diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp index be08b074ff53..be00b9c73a70 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp @@ -621,55 +621,19 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr void DGUSScreenHandler::HandlePreheat(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandlePreheat"); - uint8_t e_temp = 0; - #if HAS_HEATED_BED - uint8_t bed_temp = 0; - #endif const uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); switch (preheat_option) { default: - case 0: // Preheat PLA - #if defined(PREHEAT_1_TEMP_HOTEND) && defined(PREHEAT_1_TEMP_BED) - e_temp = PREHEAT_1_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_1_TEMP_BED); - #endif - break; - case 1: // Preheat ABS - #if defined(PREHEAT_2_TEMP_HOTEND) && defined(PREHEAT_2_TEMP_BED) - e_temp = PREHEAT_2_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_2_TEMP_BED); - #endif - break; - case 2: // Preheat PET - #if defined(PREHEAT_3_TEMP_HOTEND) && defined(PREHEAT_3_TEMP_BED) - e_temp = PREHEAT_3_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_3_TEMP_BED); - #endif - break; - case 3: // Preheat FLEX - #if defined(PREHEAT_4_TEMP_HOTEND) && defined(PREHEAT_4_TEMP_BED) - e_temp = PREHEAT_4_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_4_TEMP_BED); - #endif - break; + switch (var.VP) { + default: return; + case VP_E0_BED_PREHEAT: TERN_(HAS_HOTEND, ui.preheat_all(0)); break; + case VP_E1_BED_PREHEAT: TERN_(HAS_MULTI_HOTEND, ui.preheat_all(1)); break; + } case 7: break; // Custom preheat - case 9: break; // Cool down - } - - switch (var.VP) { - default: return; - #if HAS_HOTEND - case VP_E0_BED_PREHEAT: - thermalManager.setTargetHotend(e_temp, 0); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); - break; - #endif - #if HOTENDS >= 2 - case VP_E1_BED_PREHEAT: - thermalManager.setTargetHotend(e_temp, 1); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); - break; - #endif + case 9: // Cool down + thermalManager.zero_fan_speeds(); + thermalManager.disable_all_heaters(); + break; } // Go to the preheat screen to show the heating progress diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 7358cbce2340..7ce89c922a3e 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -1035,10 +1035,7 @@ namespace ExtUI { void setFeedrate_percent(const_float_t value) { feedrate_percentage = constrain(value, 10, 500); } void coolDown() { - #if HAS_HOTEND - HOTEND_LOOP() thermalManager.setTargetHotend(0, e); - #endif - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(0)); + thermalManager.disable_all_heaters(); TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); } diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 2757e6d47acd..925e1c1618d3 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -135,7 +135,10 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #endif #if HAS_PREHEAT + #include "../module/temperature.h" + preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load() + PGM_P MarlinUI::get_preheat_label(const uint8_t m) { #define _PDEF(N) static PGMSTR(preheat_##N##_label, PREHEAT_##N##_LABEL); #define _PLBL(N) preheat_##N##_label, @@ -143,6 +146,14 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; static PGM_P const preheat_labels[PREHEAT_COUNT] PROGMEM = { REPEAT_1(PREHEAT_COUNT, _PLBL) }; return (PGM_P)pgm_read_ptr(&preheat_labels[m]); } + + 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, PM_HOTEND)) thermalManager.setTargetHotend(pre.hotend_temp, e)); + TERN_(HAS_HEATED_BED, if (TEST(pmask, PM_BED)) thermalManager.setTargetBed(pre.bed_temp)); + //TERN_(HAS_HEATED_CHAMBER, if (TEST(pmask, PM_CHAMBER)) thermalManager.setTargetBed(pre.chamber_temp)); + TERN_(HAS_FAN, if (TEST(pmask, PM_FAN)) thermalManager.set_fan_speed(0, pre.fan_speed)); + } #endif #if EITHER(HAS_LCD_MENU, EXTENSIBLE_UI) diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 63e1eb5b0def..4f797d899d83 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -56,7 +56,6 @@ #if ENABLED(ADVANCED_PAUSE_FEATURE) && ANY(HAS_LCD_MENU, EXTENSIBLE_UI, HAS_DWIN_E3V2) #include "../feature/pause.h" - #include "../module/motion.h" // for active_extruder #endif #if ENABLED(DWIN_CREALITY_LCD) @@ -498,8 +497,15 @@ class MarlinUI { #endif #if HAS_PREHEAT + enum PreheatMask : uint8_t { PM_HOTEND = _BV(0), PM_BED = _BV(1), PM_FAN = _BV(2), PM_CHAMBER = _BV(3) }; static preheat_t material_preset[PREHEAT_COUNT]; static PGM_P get_preheat_label(const uint8_t m); + static void apply_preheat(const uint8_t m, const uint8_t pmask, const uint8_t e=active_extruder); + static inline void preheat_set_fan(const uint8_t m) { TERN_(HAS_FAN, apply_preheat(m, PM_FAN)); } + static inline void preheat_hotend(const uint8_t m, const uint8_t e=active_extruder) { TERN_(HAS_HOTEND, apply_preheat(m, PM_HOTEND)); } + static inline void preheat_hotend_and_fan(const uint8_t m, const uint8_t e=active_extruder) { preheat_hotend(m, e); preheat_set_fan(m); } + static inline void preheat_bed(const uint8_t m) { TERN_(HAS_HEATED_BED, apply_preheat(m, PM_BED)); } + static inline void preheat_all(const uint8_t m) { apply_preheat(m, 0xFF); } #endif #if SCREENS_CAN_TIME_OUT From 70e31bff45165dd07375cd6140fc0a72468e0894 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 27 Oct 2021 21:36:06 -0500 Subject: [PATCH 29/78] =?UTF-8?q?=F0=9F=8E=A8=20Standard=20'cooldown'=20me?= =?UTF-8?q?thod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/control/M80_M81.cpp | 3 +-- Marlin/src/lcd/e3v2/creality/dwin.cpp | 10 ++++---- Marlin/src/lcd/e3v2/enhanced/dwin.cpp | 13 ++++------- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 23 ++++++++----------- .../src/lcd/extui/dgus/DGUSScreenHandler.cpp | 7 ++---- Marlin/src/lcd/extui/ui_api.cpp | 5 +--- Marlin/src/lcd/menu/menu_temperature.cpp | 3 +-- Marlin/src/module/temperature.h | 8 +++++++ 8 files changed, 31 insertions(+), 41 deletions(-) diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 2a1b3b34b9ae..b8be9daa4015 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -74,13 +74,12 @@ * This code should ALWAYS be available for FULL SHUTDOWN! */ void GcodeSuite::M81() { - thermalManager.disable_all_heaters(); planner.finish_and_disable(); + thermalManager.cooldown(); print_job_timer.stop(); #if HAS_FAN - thermalManager.zero_fan_speeds(); #if ENABLED(PROBING_FANS_OFF) thermalManager.fans_paused = false; ZERO(thermalManager.saved_fan_speed); diff --git a/Marlin/src/lcd/e3v2/creality/dwin.cpp b/Marlin/src/lcd/e3v2/creality/dwin.cpp index 82623d7c7d04..adf8f3771f3d 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -2735,6 +2735,7 @@ void HMI_Prepare() { queue.inject_P(G28_STR); // G28 will set home_flag Popup_Window_Home(); break; + #if HAS_ZOFFSET_ITEM case PREPARE_CASE_ZOFF: #if EITHER(HAS_BED_PROBE, BABYSTEPPING) @@ -2750,6 +2751,7 @@ void HMI_Prepare() { #endif break; #endif + #if HAS_PREHEAT case PREPARE_CASE_PLA: ui.preheat_all(0); break; #if PREHEAT_COUNT > 1 @@ -2758,18 +2760,14 @@ void HMI_Prepare() { #endif #if HAS_HOTEND || HAS_HEATED_BED - case PREPARE_CASE_COOL: - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - #if HAS_HOTEND || HAS_HEATED_BED - thermalManager.disable_all_heaters(); - #endif - break; + case PREPARE_CASE_COOL: thermalManager.cooldown(); break; #endif case PREPARE_CASE_LANG: HMI_ToggleLanguage(); Draw_Prepare_Menu(); break; + default: break; } } diff --git a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp index 3d5a56c86967..787cf717eb16 100644 --- a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp +++ b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp @@ -1787,8 +1787,7 @@ void DWIN_Print_Started(const bool sd) { // Ended print job void DWIN_Print_Finished() { if (checkkey == PrintProcess || printingIsActive()) { - thermalManager.disable_all_heaters(); - thermalManager.zero_fan_speeds(); + thermalManager.cooldown(); HMI_flag.print_finish = true; } } @@ -2116,17 +2115,13 @@ void SetHome() { #endif #if HAS_PREHEAT - void SetCoolDown() { - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - #if HAS_HOTEND || HAS_HEATED_BED - thermalManager.disable_all_heaters(); - #endif - } void DoPreheat0() { ui.preheat_all(0); } void DoPreheat1() { ui.preheat_all(1); } void DoPreheat2() { ui.preheat_all(2); } #endif +void DoCoolDown() { thermalManager.cooldown(); } + void SetLanguage() { HMI_ToggleLanguage(); CurrentMenu = nullptr; // Invalidate menu to full redraw @@ -3126,8 +3121,8 @@ void Draw_Prepare_Menu() { #if PREHEAT_COUNT > 2 ADDMENUITEM(ICON_CustomPreheat, GET_TEXT_F(MSG_PREHEAT_CUSTOM), onDrawMenuItem, DoPreheat2); #endif - ADDMENUITEM(ICON_Cool, GET_TEXT_F(MSG_COOLDOWN), onDrawCooldown, SetCoolDown); #endif + ADDMENUITEM(ICON_Cool, GET_TEXT_F(MSG_COOLDOWN), onDrawCooldown, DoCoolDown); ADDMENUITEM(ICON_Language, PSTR("UI Language"), onDrawLanguage, SetLanguage); } CurrentMenu->draw(); diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 54266e717b65..80ef88d0b214 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -1030,7 +1030,7 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ #define PREPARE_MANUALLEVEL (PREPARE_HOME + 1) #define PREPARE_ZOFFSET (PREPARE_MANUALLEVEL + ENABLED(HAS_ZOFFSET_ITEM)) #define PREPARE_PREHEAT (PREPARE_ZOFFSET + ENABLED(HAS_PREHEAT)) - #define PREPARE_COOLDOWN (PREPARE_PREHEAT + ENABLED(HAS_PREHEAT)) + #define PREPARE_COOLDOWN (PREPARE_PREHEAT + EITHER(HAS_HOTEND, HAS_HEATED_BED)) #define PREPARE_CHANGEFIL (PREPARE_COOLDOWN + ENABLED(ADVANCED_PAUSE_FEATURE)) #define PREPARE_TOTAL PREPARE_CHANGEFIL @@ -1096,13 +1096,14 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ else Draw_Menu(Preheat); break; + #endif + + #if HAS_HOTEND || HAS_HEATED_BED case PREPARE_COOLDOWN: if (draw) Draw_Menu_Item(row, ICON_Cool, F("Cooldown")); - else { - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - thermalManager.disable_all_heaters(); - } + else + thermalManager.cooldown(); break; #endif @@ -1597,8 +1598,7 @@ void CrealityDWINClass::Menu_Item_Handler(uint8_t menu, uint8_t item, bool draw/ #define PREHEAT_TOTAL PREHEAT_5 auto do_preheat = [](const uint8_t m) { - thermalManager.disable_all_heaters(); - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); + thermalManager.cooldown(); if (preheatmode == 0 || preheatmode == 1) { ui.preheat_hotend_and_fan(m); } if (preheatmode == 0 || preheatmode == 2) ui.preheat_bed(m); }; @@ -4496,8 +4496,7 @@ void CrealityDWINClass::Popup_Control() { TERN_(HAS_HOTEND, pausetemp = thermalManager.temp_hotend[0].target); TERN_(HAS_HEATED_BED, pausebed = thermalManager.temp_bed.target); TERN_(HAS_FAN, pausefan = thermalManager.fan_speed[0]); - thermalManager.disable_all_heaters(); - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); + thermalManager.cooldown(); #endif } else { @@ -4510,8 +4509,7 @@ void CrealityDWINClass::Popup_Control() { if (selection == 0) { if (sdprint) { ui.abort_print(); - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - thermalManager.disable_all_heaters(); + thermalManager.cooldown(); } else { TERN_(HOST_ACTION_COMMANDS, hostui.cancel()); @@ -4741,8 +4739,7 @@ void CrealityDWINClass::Start_Print(bool sd) { void CrealityDWINClass::Stop_Print() { printing = false; sdprint = false; - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - thermalManager.disable_all_heaters(); + thermalManager.cooldown(); TERN_(LCD_SET_PROGRESS_MANUALLY, ui.set_progress(100 * (PROGRESS_SCALE))); TERN_(USE_M73_REMAINING_TIME, ui.set_remaining_time(0)); Draw_Print_confirm(); diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp index be00b9c73a70..2b00fd16f8e2 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp @@ -626,14 +626,11 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr default: switch (var.VP) { default: return; - case VP_E0_BED_PREHEAT: TERN_(HAS_HOTEND, ui.preheat_all(0)); break; + case VP_E0_BED_PREHEAT: TERN_(HAS_HOTEND, ui.preheat_all(0)); break; case VP_E1_BED_PREHEAT: TERN_(HAS_MULTI_HOTEND, ui.preheat_all(1)); break; } case 7: break; // Custom preheat - case 9: // Cool down - thermalManager.zero_fan_speeds(); - thermalManager.disable_all_heaters(); - break; + case 9: thermalManager.cooldown(); break; // Cool down } // Go to the preheat screen to show the heating progress diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 7ce89c922a3e..54e7db55c290 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -1034,10 +1034,7 @@ namespace ExtUI { void setFeedrate_percent(const_float_t value) { feedrate_percentage = constrain(value, 10, 500); } - void coolDown() { - thermalManager.disable_all_heaters(); - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - } + void coolDown() { thermalManager.cooldown(); } bool awaitingUserConfirm() { return TERN0(HAS_RESUME_CONTINUE, wait_for_user) || getHostKeepaliveIsPaused(); diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 5524793b19d6..0e3688485804 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -143,8 +143,7 @@ void Temperature::lcd_preheat(const uint8_t e, const int8_t indh, const int8_t i #if HAS_TEMP_HOTEND || HAS_HEATED_BED void lcd_cooldown() { - thermalManager.zero_fan_speeds(); - thermalManager.disable_all_heaters(); + thermalManager.cooldown(); ui.return_to_status(); } diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 5579f711722b..0e66f2311012 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -848,6 +848,14 @@ class Temperature { */ static void disable_all_heaters(); + /** + * Cooldown, as from the LCD. Disables all heaters and fans. + */ + static inline void cooldown() { + zero_fan_speeds(); + disable_all_heaters(); + } + #if ENABLED(PRINTJOB_TIMER_AUTOSTART) /** * Methods to check if heaters are enabled, indicating an active job From 67b075fd39e530c5d7e8a09ee6b3dba81d8548d0 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 30 Oct 2021 00:58:37 +0000 Subject: [PATCH 30/78] [cron] Bump distribution date (2021-10-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 e0165a280fd3..d1bff6ba10aa 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 "2021-10-29" +//#define STRING_DISTRIBUTION_DATE "2021-10-30" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index f61066e58fa0..9a90feeb8812 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 "2021-10-29" + #define STRING_DISTRIBUTION_DATE "2021-10-30" #endif /** From 18a924d4e26539c270dc08677d4319e5b012c723 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 29 Oct 2021 20:42:52 -0500 Subject: [PATCH 31/78] =?UTF-8?q?=F0=9F=94=A7=20Configuration=20version=20?= =?UTF-8?q?02000903?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 2 +- Marlin/Configuration_adv.h | 2 +- Marlin/src/inc/Version.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d8ced232b461..0a51019b67cf 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -35,7 +35,7 @@ * * Advanced settings can be found in Configuration_adv.h */ -#define CONFIGURATION_H_VERSION 02000902 +#define CONFIGURATION_H_VERSION 02000903 //=========================================================================== //============================= Getting Started ============================= diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d6217ba94061..b713371a608c 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -30,7 +30,7 @@ * * Basic settings can be found in Configuration.h */ -#define CONFIGURATION_ADV_H_VERSION 02000902 +#define CONFIGURATION_ADV_H_VERSION 02000903 //=========================================================================== //============================= Thermal Settings ============================ diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 9a90feeb8812..9e87e765d550 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -52,7 +52,7 @@ * to alert users to major changes. */ -#define MARLIN_HEX_VERSION 02000902 +#define MARLIN_HEX_VERSION 02000903 #ifndef REQUIRED_CONFIGURATION_H_VERSION #define REQUIRED_CONFIGURATION_H_VERSION MARLIN_HEX_VERSION #endif From aa4e32555dd247c391356a2e1449dd9820beeab6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 29 Oct 2021 20:46:55 -0500 Subject: [PATCH 32/78] =?UTF-8?q?=E2=9C=A8=20"Rutilea"=20ESP32=20board=20(?= =?UTF-8?q?#22880)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/ESP32/i2s.cpp | 30 ++++---- Marlin/src/core/boards.h | 7 +- Marlin/src/pins/esp32/pins_ESPA_common.h | 89 ++++++++++++++++++++++ Marlin/src/pins/esp32/pins_FYSETC_E4.h | 57 +------------- Marlin/src/pins/esp32/pins_MRR_ESPA.h | 53 +------------ Marlin/src/pins/esp32/pins_MRR_ESPE.h | 1 - Marlin/src/pins/esp32/pins_RESP32_CUSTOM.h | 37 +++++++++ Marlin/src/pins/pins.h | 2 + 8 files changed, 148 insertions(+), 128 deletions(-) create mode 100644 Marlin/src/pins/esp32/pins_ESPA_common.h create mode 100644 Marlin/src/pins/esp32/pins_RESP32_CUSTOM.h diff --git a/Marlin/src/HAL/ESP32/i2s.cpp b/Marlin/src/HAL/ESP32/i2s.cpp index 557ea319e671..3e77b658360b 100644 --- a/Marlin/src/HAL/ESP32/i2s.cpp +++ b/Marlin/src/HAL/ESP32/i2s.cpp @@ -64,12 +64,9 @@ uint32_t i2s_port_data = 0; #define I2S_EXIT_CRITICAL() portEXIT_CRITICAL(&i2s_spinlock[i2s_num]) static inline void gpio_matrix_out_check(uint32_t gpio, uint32_t signal_idx, bool out_inv, bool oen_inv) { - //if pin = -1, do not need to configure - if (gpio != -1) { - PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio], PIN_FUNC_GPIO); - gpio_set_direction((gpio_num_t)gpio, (gpio_mode_t)GPIO_MODE_DEF_OUTPUT); - gpio_matrix_out(gpio, signal_idx, out_inv, oen_inv); - } + PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio], PIN_FUNC_GPIO); + gpio_set_direction((gpio_num_t)gpio, (gpio_mode_t)GPIO_MODE_DEF_OUTPUT); + gpio_matrix_out(gpio, signal_idx, out_inv, oen_inv); } static esp_err_t i2s_reset_fifo(i2s_port_t i2s_num) { @@ -256,13 +253,7 @@ int i2s_init() { I2S0.fifo_conf.dscr_en = 0; - I2S0.conf_chan.tx_chan_mod = ( - #if ENABLED(I2S_STEPPER_SPLIT_STREAM) - 4 - #else - 0 - #endif - ); + I2S0.conf_chan.tx_chan_mod = TERN(I2S_STEPPER_SPLIT_STREAM, 4, 0); I2S0.fifo_conf.tx_fifo_mod = 0; I2S0.conf.tx_mono = 0; @@ -313,9 +304,16 @@ int i2s_init() { xTaskCreatePinnedToCore(stepperTask, "StepperTask", 10000, nullptr, 1, nullptr, CONFIG_ARDUINO_RUNNING_CORE); // run I2S stepper task on same core as rest of Marlin // Route the i2s pins to the appropriate GPIO - gpio_matrix_out_check(I2S_DATA, I2S0O_DATA_OUT23_IDX, 0, 0); - gpio_matrix_out_check(I2S_BCK, I2S0O_BCK_OUT_IDX, 0, 0); - gpio_matrix_out_check(I2S_WS, I2S0O_WS_OUT_IDX, 0, 0); + // If a pin is not defined, no need to configure + #if defined(I2S_DATA) && I2S_DATA >= 0 + gpio_matrix_out_check(I2S_DATA, I2S0O_DATA_OUT23_IDX, 0, 0); + #endif + #if defined(I2S_BCK) && I2S_BCK >= 0 + gpio_matrix_out_check(I2S_BCK, I2S0O_BCK_OUT_IDX, 0, 0); + #endif + #if defined(I2S_WS) && I2S_WS >= 0 + gpio_matrix_out_check(I2S_WS, I2S0O_WS_OUT_IDX, 0, 0); + #endif // Start the I2S peripheral return i2s_start(I2S_NUM_0); diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 6e116888bcf9..2341e6577b60 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -425,9 +425,10 @@ #define BOARD_MRR_ESPA 6001 // MRR ESPA based on ESP32 (native pins only) #define BOARD_MRR_ESPE 6002 // MRR ESPE based on ESP32 (with I2S stepper stream) #define BOARD_E4D_BOX 6003 // E4d@BOX -#define BOARD_FYSETC_E4 6004 // FYSETC E4 -#define BOARD_PANDA_ZHU 6005 // Panda_ZHU -#define BOARD_PANDA_M4 6006 // Panda_M4 +#define BOARD_RESP32_CUSTOM 6004 // Rutilea ESP32 custom board +#define BOARD_FYSETC_E4 6005 // FYSETC E4 +#define BOARD_PANDA_ZHU 6006 // Panda_ZHU +#define BOARD_PANDA_M4 6007 // Panda_M4 // // SAMD51 ARM Cortex M4 diff --git a/Marlin/src/pins/esp32/pins_ESPA_common.h b/Marlin/src/pins/esp32/pins_ESPA_common.h new file mode 100644 index 000000000000..2fcacb3002b4 --- /dev/null +++ b/Marlin/src/pins/esp32/pins_ESPA_common.h @@ -0,0 +1,89 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +/** + * ESPA-like pin assignments + * Supports 4 stepper drivers, heated bed, single hotend. + */ + +#include "env_validate.h" + +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#endif + +// +// Disable I2S stepper stream, by default +// +#undef I2S_STEPPER_STREAM +#undef I2S_WS +#undef I2S_BCK +#undef I2S_DATA + +// +// Limit Switches +// +#define X_STOP_PIN 34 +#define Y_STOP_PIN 35 +#define Z_STOP_PIN 15 + +// +// Steppers +// +#define X_STEP_PIN 27 +#define X_DIR_PIN 26 +#define X_ENABLE_PIN 25 + +#define Y_STEP_PIN 33 +#define Y_DIR_PIN 32 +#define Y_ENABLE_PIN X_ENABLE_PIN + +#define Z_STEP_PIN 14 +#define Z_DIR_PIN 12 +#define Z_ENABLE_PIN X_ENABLE_PIN + +#define E0_STEP_PIN 16 +#define E0_DIR_PIN 17 +#define E0_ENABLE_PIN X_ENABLE_PIN + +// +// Temperature Sensors +// +#define TEMP_0_PIN 36 // Analog Input +#define TEMP_BED_PIN 39 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define FAN_PIN 13 +#define HEATER_BED_PIN 4 + +// +// MicroSD card +// +#define SD_MOSI_PIN 23 +#define SD_MISO_PIN 19 +#define SD_SCK_PIN 18 +#define SDSS 5 +#define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers diff --git a/Marlin/src/pins/esp32/pins_FYSETC_E4.h b/Marlin/src/pins/esp32/pins_FYSETC_E4.h index 4e71a66a221b..e75b6ece2820 100644 --- a/Marlin/src/pins/esp32/pins_FYSETC_E4.h +++ b/Marlin/src/pins/esp32/pins_FYSETC_E4.h @@ -37,41 +37,8 @@ #endif #define BOARD_INFO_NAME "FYSETC_E4" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -// -// Disable I2S stepper stream -// -#undef I2S_STEPPER_STREAM -#define I2S_WS -1 -#define I2S_BCK -1 -#define I2S_DATA -1 - -// -// Limit Switches -// -#define X_STOP_PIN 34 -#define Y_STOP_PIN 35 -#define Z_STOP_PIN 15 - -// -// Steppers -// -#define X_STEP_PIN 27 -#define X_DIR_PIN 26 -#define X_ENABLE_PIN 25 - -#define Y_STEP_PIN 33 -#define Y_DIR_PIN 32 -#define Y_ENABLE_PIN X_ENABLE_PIN - -#define Z_STEP_PIN 14 -#define Z_DIR_PIN 12 -#define Z_ENABLE_PIN X_ENABLE_PIN - -#define E0_STEP_PIN 16 -#define E0_DIR_PIN 17 -#define E0_ENABLE_PIN X_ENABLE_PIN +#include "pins_ESPA_common.h" #if HAS_TMC_UART // @@ -89,28 +56,6 @@ #define TMC_BAUD_RATE 115200 #endif -// -// Temperature Sensors -// -#define TEMP_0_PIN 36 // Analog Input -#define TEMP_BED_PIN 39 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define FAN_PIN 13 -#define HEATER_BED_PIN 4 - -// -// MicroSD card -// -#define SD_MOSI_PIN 23 -#define SD_MISO_PIN 19 -#define SD_SCK_PIN 18 -#define SDSS 5 -#define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers - /** * Hardware serial pins * diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h index a5f70e81592b..cc67bc025cec 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPA.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPA.h @@ -38,68 +38,17 @@ #define BOARD_INFO_NAME "MRR ESPA" #define BOARD_WEBSITE_URL "github.com/maplerainresearch/MRR_ESPA" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -// -// Disable I2S stepper stream -// -#undef I2S_STEPPER_STREAM -#undef I2S_WS -#undef I2S_BCK -#undef I2S_DATA - -// -// Limit Switches -// -#define X_STOP_PIN 34 -#define Y_STOP_PIN 35 -#define Z_STOP_PIN 15 +#include "pins_ESPA_common.h" // // Steppers // -#define X_STEP_PIN 27 -#define X_DIR_PIN 26 -#define X_ENABLE_PIN 25 //#define X_CS_PIN 21 - -#define Y_STEP_PIN 33 -#define Y_DIR_PIN 32 -#define Y_ENABLE_PIN X_ENABLE_PIN //#define Y_CS_PIN 22 - -#define Z_STEP_PIN 14 -#define Z_DIR_PIN 12 -#define Z_ENABLE_PIN X_ENABLE_PIN //#define Z_CS_PIN 5 // SS_PIN - -#define E0_STEP_PIN 16 -#define E0_DIR_PIN 17 -#define E0_ENABLE_PIN X_ENABLE_PIN //#define E0_CS_PIN 21 -// -// Temperature Sensors -// -#define TEMP_0_PIN 36 // Analog Input -#define TEMP_BED_PIN 39 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define FAN_PIN 13 -#define HEATER_BED_PIN 4 - -// -// MicroSD card -// -#define SD_MOSI_PIN 23 -#define SD_MISO_PIN 19 -#define SD_SCK_PIN 18 -#define SDSS 5 -#define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers - // Hardware serial pins // Add the following to Configuration.h or Configuration_adv.h to assign // specific pins to hardware Serial1. diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index ae4f0c6e36be..60c8405dfe2d 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -51,7 +51,6 @@ // // Enable I2S stepper stream // -#undef I2S_STEPPER_STREAM #define I2S_STEPPER_STREAM #define I2S_WS 26 #define I2S_BCK 25 diff --git a/Marlin/src/pins/esp32/pins_RESP32_CUSTOM.h b/Marlin/src/pins/esp32/pins_RESP32_CUSTOM.h new file mode 100644 index 000000000000..5d3f75574d89 --- /dev/null +++ b/Marlin/src/pins/esp32/pins_RESP32_CUSTOM.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +/** + * Rutilea ESP32 (Tensilica Xtensa LX6) pin assignments + */ + +#include "env_validate.h" + +#define BOARD_INFO_NAME "Rutilea ESP32" + +#include "pins_ESPA_common.h" + +// +// I2S (steppers & other output-only pins) +// +#define I2S_STEPPER_STREAM diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 1a05f55fdcd4..49d06590e9c0 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -695,6 +695,8 @@ #include "esp32/pins_MRR_ESPE.h" // ESP32 env:esp32 #elif MB(E4D_BOX) #include "esp32/pins_E4D.h" // ESP32 env:esp32 +#elif MB(RESP32_CUSTOM) + #include "esp32/pins_RESP32_CUSTOM.h" // ESP32 env:esp32 #elif MB(FYSETC_E4) #include "esp32/pins_FYSETC_E4.h" // ESP32 env:FYSETC_E4 #elif MB(PANDA_ZHU) From 75e0b7f8ff668217889b770a83990c532998ca95 Mon Sep 17 00:00:00 2001 From: aalku Date: Sat, 30 Oct 2021 07:17:20 +0200 Subject: [PATCH 33/78] =?UTF-8?q?=E2=9C=A8=20Shutdown=20Host=20Action=20(#?= =?UTF-8?q?22908)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 3 ++- Marlin/src/feature/host_actions.cpp | 4 ++++ Marlin/src/feature/host_actions.h | 3 +++ Marlin/src/inc/Conditionals_adv.h | 3 +++ Marlin/src/lcd/language/language_en.h | 2 ++ Marlin/src/lcd/menu/menu_bed_corners.cpp | 2 +- Marlin/src/lcd/menu/menu_cancelobject.cpp | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 11 +++------ Marlin/src/lcd/menu/menu_main.cpp | 27 ++++++++++++++-------- Marlin/src/lcd/menu/menu_media.cpp | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/lcd/menu/menu_tramming.cpp | 2 +- 12 files changed, 40 insertions(+), 23 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b713371a608c..4efab8193c7b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3844,7 +3844,8 @@ #if ENABLED(HOST_ACTION_COMMANDS) //#define HOST_PAUSE_M76 //#define HOST_PROMPT_SUPPORT - //#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start + //#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start + //#define HOST_SHUTDOWN_MENU_ITEM // Add a menu item that tells the host to shut down #endif /** diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index 6a1faf81c07f..be7b055b55f7 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -80,6 +80,10 @@ void HostUI::action(FSTR_P const fstr, const bool eol) { #endif #endif +#ifdef SHUTDOWN_ACTION + void HostUI::shutdown() { action(F(SHUTDOWN_ACTION)); } +#endif + #if ENABLED(HOST_PROMPT_SUPPORT) PromptReason HostUI::host_prompt_reason = PROMPT_NOT_DEFINED; diff --git a/Marlin/src/feature/host_actions.h b/Marlin/src/feature/host_actions.h index 667107213910..45379afc29ec 100644 --- a/Marlin/src/feature/host_actions.h +++ b/Marlin/src/feature/host_actions.h @@ -71,6 +71,9 @@ class HostUI { #ifdef ACTION_ON_START static void start(); #endif + #ifdef SHUTDOWN_ACTION + static void shutdown(); + #endif #if ENABLED(G29_RETRY_AND_RECOVER) #ifdef ACTION_ON_G29_RECOVER diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index dd2d6ed74815..efb9db420db8 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -701,6 +701,9 @@ #ifndef ACTION_ON_KILL #define ACTION_ON_KILL "poweroff" #endif + #ifndef SHUTDOWN_ACTION + #define SHUTDOWN_ACTION "shutdown" + #endif #if HAS_FILAMENT_SENSOR #ifndef ACTION_ON_FILAMENT_RUNOUT #define ACTION_ON_FILAMENT_RUNOUT "filament_runout" diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 8af60c1642e3..9a92a7e268fb 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -745,6 +745,8 @@ namespace Language_en { LSTR MSG_SD_CARD = _UxGT("SD Card"); LSTR MSG_USB_DISK = _UxGT("USB Disk"); + LSTR MSG_HOST_SHUTDOWN = _UxGT("Host Shutdown"); + // These strings can be the same in all languages LSTR MSG_MARLIN = _UxGT("Marlin"); LSTR MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 79193fbef370..872b9b3840d8 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -213,7 +213,7 @@ static void _lcd_level_bed_corners_get_next_position() { if (!ui.should_draw()) return; MenuItem_confirm::confirm_screen( []{ queue.inject(TERN(HAS_LEVELING, F("G29N"), FPSTR(G28_STR))); ui.return_to_status(); } - , []{ ui.goto_previous_screen_no_defer(); } + , ui.goto_previous_screen_no_defer , GET_TEXT(MSG_BED_TRAMMING_IN_RANGE) , (const char*)nullptr, PSTR("?") ); diff --git a/Marlin/src/lcd/menu/menu_cancelobject.cpp b/Marlin/src/lcd/menu/menu_cancelobject.cpp index a8ced05759bd..f2a06ecf6a4a 100644 --- a/Marlin/src/lcd/menu/menu_cancelobject.cpp +++ b/Marlin/src/lcd/menu/menu_cancelobject.cpp @@ -47,7 +47,7 @@ static void lcd_cancel_object_confirm() { ui.completion_feedback(); ui.goto_previous_screen(); }, - ui.goto_previous_screen, + nullptr, GET_TEXT(MSG_CANCEL_OBJECT), item_num, PSTR("?") ); } diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 9e1f455a6443..6d6b0228fb40 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -64,9 +64,7 @@ void menu_advanced_settings(); static int8_t bar_percent = 0; if (ui.use_click()) { ui.goto_previous_screen(); - #if HAS_MARLINUI_HD44780 - ui.set_custom_characters(CHARSET_MENU); - #endif + TERN_(HAS_MARLINUI_HD44780, ui.set_custom_characters(CHARSET_MENU)); return; } bar_percent += (int8_t)ui.encoderPosition; @@ -79,9 +77,7 @@ void menu_advanced_settings(); void _progress_bar_test() { ui.goto_screen(progress_bar_test); - #if HAS_MARLINUI_HD44780 - ui.set_custom_characters(CHARSET_INFO); - #endif + TERN_(HAS_MARLINUI_HD44780, ui.set_custom_characters(CHARSET_INFO)); } #endif // LCD_PROGRESS_BAR_TEST @@ -363,8 +359,7 @@ void menu_advanced_settings(); #define _CUSTOM_ITEM_CONF_CONFIRM(N) \ SUBMENU_P(PSTR(CONFIG_MENU_ITEM_##N##_DESC), []{ \ MenuItem_confirm::confirm_screen( \ - GCODE_LAMBDA_CONF(N), \ - ui.goto_previous_screen, \ + GCODE_LAMBDA_CONF(N), nullptr, \ PSTR(CONFIG_MENU_ITEM_##N##_DESC "?") \ ); \ }) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 172f9daf7afc..aca10edc6a0c 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -58,7 +58,7 @@ #include "../../feature/password/password.h" #endif -#if ENABLED(HOST_START_MENU_ITEM) && defined(ACTION_ON_START) +#if (ENABLED(HOST_START_MENU_ITEM) && defined(ACTION_ON_START)) || (ENABLED(HOST_SHUTDOWN_MENU_ITEM) && defined(SHUTDOWN_ACTION)) #include "../../feature/host_actions.h" #endif @@ -128,8 +128,7 @@ void menu_configuration(); #define _CUSTOM_ITEM_MAIN_CONFIRM(N) \ SUBMENU_P(PSTR(MAIN_MENU_ITEM_##N##_DESC), []{ \ MenuItem_confirm::confirm_screen( \ - GCODE_LAMBDA_MAIN(N), \ - ui.goto_previous_screen, \ + GCODE_LAMBDA_MAIN(N), nullptr, \ PSTR(MAIN_MENU_ITEM_##N##_DESC "?") \ ); \ }) @@ -274,7 +273,7 @@ void menu_main() { SUBMENU(MSG_STOP_PRINT, []{ MenuItem_confirm::select_screen( GET_TEXT(MSG_BUTTON_STOP), GET_TEXT(MSG_BACK), - ui.abort_print, ui.goto_previous_screen, + ui.abort_print, nullptr, GET_TEXT(MSG_STOP_PRINT), (const char *)nullptr, PSTR("?") ); }); @@ -346,7 +345,7 @@ void menu_main() { #if ENABLED(ADVANCED_PAUSE_FEATURE) #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES) YESNO_ITEM(MSG_FILAMENTCHANGE, - menu_change_filament, ui.goto_previous_screen, + menu_change_filament, nullptr, GET_TEXT(MSG_FILAMENTCHANGE), (const char *)nullptr, PSTR("?") ); #else @@ -370,7 +369,7 @@ void menu_main() { #if ENABLED(PS_OFF_CONFIRM) CONFIRM_ITEM(MSG_SWITCH_PS_OFF, MSG_YES, MSG_NO, - ui.poweroff, ui.goto_previous_screen, + ui.poweroff, nullptr, GET_TEXT(MSG_SWITCH_PS_OFF), (const char *)nullptr, PSTR("?") ); #else @@ -394,21 +393,21 @@ void menu_main() { #if SERVICE_INTERVAL_1 > 0 CONFIRM_ITEM_P(PSTR(SERVICE_NAME_1), MSG_BUTTON_RESET, MSG_BUTTON_CANCEL, - []{ _service_reset(1); }, ui.goto_previous_screen, + []{ _service_reset(1); }, nullptr, GET_TEXT(MSG_SERVICE_RESET), F(SERVICE_NAME_1), PSTR("?") ); #endif #if SERVICE_INTERVAL_2 > 0 CONFIRM_ITEM_P(PSTR(SERVICE_NAME_2), MSG_BUTTON_RESET, MSG_BUTTON_CANCEL, - []{ _service_reset(2); }, ui.goto_previous_screen, + []{ _service_reset(2); }, nullptr, GET_TEXT(MSG_SERVICE_RESET), F(SERVICE_NAME_2), PSTR("?") ); #endif #if SERVICE_INTERVAL_3 > 0 CONFIRM_ITEM_P(PSTR(SERVICE_NAME_3), MSG_BUTTON_RESET, MSG_BUTTON_CANCEL, - []{ _service_reset(3); }, ui.goto_previous_screen, + []{ _service_reset(3); }, nullptr, GET_TEXT(MSG_SERVICE_RESET), F(SERVICE_NAME_3), PSTR("?") ); #endif @@ -442,6 +441,16 @@ void menu_main() { SUBMENU(LANGUAGE, menu_language); #endif + #if ENABLED(HOST_SHUTDOWN_MENU_ITEM) && defined(SHUTDOWN_ACTION) + SUBMENU(MSG_HOST_SHUTDOWN, []{ + MenuItem_confirm::select_screen( + GET_TEXT(MSG_BUTTON_PROCEED), GET_TEXT(MSG_BUTTON_CANCEL), + []{ ui.return_to_status(); hostui.shutdown(); }, nullptr, + GET_TEXT(MSG_HOST_SHUTDOWN), (const char *)nullptr, PSTR("?") + ); + }); + #endif + END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp index 213ad257b849..4ce0a396d4e4 100644 --- a/Marlin/src/lcd/menu/menu_media.cpp +++ b/Marlin/src/lcd/menu/menu_media.cpp @@ -79,7 +79,7 @@ class MenuItem_sdfile : public MenuItem_sdbase { strcpy(buffer + 1, longest); MenuItem_confirm::select_screen( GET_TEXT(MSG_BUTTON_PRINT), GET_TEXT(MSG_BUTTON_CANCEL), - sdcard_start_selected_file, ui.goto_previous_screen, + sdcard_start_selected_file, nullptr, GET_TEXT(MSG_START_PRINT), buffer, PSTR("?") ); }); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 7191e637d131..cddb7ede744d 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -210,7 +210,7 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int ui.goto_screen([]{ MenuItem_confirm::select_screen( GET_TEXT(MSG_BUTTON_PROCEED), GET_TEXT(MSG_BACK), - _goto_menu_move_distance_e, ui.goto_previous_screen, + _goto_menu_move_distance_e, nullptr, GET_TEXT(MSG_HOTEND_TOO_COLD), (const char *)nullptr, PSTR("!") ); }); diff --git a/Marlin/src/lcd/menu/menu_tramming.cpp b/Marlin/src/lcd/menu/menu_tramming.cpp index 5cdcf75c1e4b..8e9d4b3942b6 100644 --- a/Marlin/src/lcd/menu/menu_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_tramming.cpp @@ -66,7 +66,7 @@ static void _menu_single_probe() { STATIC_ITEM(MSG_BED_TRAMMING, SS_LEFT); STATIC_ITEM(MSG_LAST_VALUE_SP, SS_LEFT, z_isvalid[tram_index] ? ftostr42_52(z_measured[reference_index] - z_measured[tram_index]) : "---"); ACTION_ITEM(MSG_UBL_BC_INSERT2, []{ if (probe_single_point()) ui.refresh(); }); - ACTION_ITEM(MSG_BUTTON_DONE, []{ ui.goto_previous_screen(); }); + ACTION_ITEM(MSG_BUTTON_DONE, ui.goto_previous_screen); END_MENU(); } From be412e3e2b07664f95eec21dc8a63a66f25d26a6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 30 Oct 2021 01:39:33 -0500 Subject: [PATCH 34/78] =?UTF-8?q?=F0=9F=8E=A8=20Adjust=20Ender-3=20V2=20DW?= =?UTF-8?q?IN=20options?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 0a51019b67cf..8ab3929c4114 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2770,23 +2770,11 @@ // // Ender-3 v2 OEM display. A DWIN display with Rotary Encoder. // -//#define DWIN_CREALITY_LCD - -// -// Ender-3 v2 OEM display, enhanced. -// -//#define DWIN_CREALITY_LCD_ENHANCED - -// -// Ender-3 v2 OEM display with enhancements by Jacob Myers -// -//#define DWIN_CREALITY_LCD_JYERSUI - -// -// MarlinUI for Creality's DWIN display (and others) -// -//#define DWIN_MARLINUI_PORTRAIT -//#define DWIN_MARLINUI_LANDSCAPE +//#define DWIN_CREALITY_LCD // Creality UI +//#define DWIN_CREALITY_LCD_ENHANCED // Enhanced UI +//#define DWIN_CREALITY_LCD_JYERSUI // Jyers UI by Jacob Myers +//#define DWIN_MARLINUI_PORTRAIT // MarlinUI (portrait orientation) +//#define DWIN_MARLINUI_LANDSCAPE // MarlinUI (landscape orientation) // // Touch Screen Settings From 4dd1f0928688c68c6c334e1fb1a8e13be2dc351a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 30 Oct 2021 04:16:37 -0500 Subject: [PATCH 35/78] =?UTF-8?q?=F0=9F=92=9A=20Update=20Ender-3=20V2=20co?= =?UTF-8?q?nfig=20path?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MarlinFirmware/Configurations#600 --- buildroot/tests/STM32F103RET6_creality | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/buildroot/tests/STM32F103RET6_creality b/buildroot/tests/STM32F103RET6_creality index d530f7b85186..ca7573cf16c3 100755 --- a/buildroot/tests/STM32F103RET6_creality +++ b/buildroot/tests/STM32F103RET6_creality @@ -9,21 +9,21 @@ set -e # # Build with configs included in the PR # -use_example_configs "Creality/Ender-3 V2/CrealityUI" +use_example_configs "Creality/Ender-3 V2/CrealityV422/CrealityUI" opt_enable MARLIN_DEV_MODE BUFFER_MONITORING BLTOUCH AUTO_BED_LEVELING_BILINEAR Z_SAFE_HOMING exec_test $1 $2 "Ender 3 v2 with CrealityUI" "$3" -use_example_configs "Creality/Ender-3 V2/CrealityUI" +use_example_configs "Creality/Ender-3 V2/CrealityV422/CrealityUI" opt_disable DWIN_CREALITY_LCD opt_enable DWIN_CREALITY_LCD_ENHANCED BLTOUCH AUTO_BED_LEVELING_UBL Z_SAFE_HOMING exec_test $1 $2 "Ender 3 v2 with Enhanced UI" "$3" -use_example_configs "Creality/Ender-3 V2/CrealityUI" +use_example_configs "Creality/Ender-3 V2/CrealityV422/CrealityUI" opt_disable DWIN_CREALITY_LCD opt_enable DWIN_CREALITY_LCD_JYERSUI AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY exec_test $1 $2 "Ender 3 v2 with JyersUI" "$3" -use_example_configs "Creality/Ender-3 V2/MarlinUI" +use_example_configs "Creality/Ender-3 V2/CrealityV422/MarlinUI" opt_add SDCARD_EEPROM_EMULATION AUTO_BED_LEVELING_BILINEAR Z_SAFE_HOMING exec_test $1 $2 "Ender 3 v2 with MarlinUI" "$3" From b88612f9761601e985f8ec8db5d3b91214c39555 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 31 Oct 2021 01:03:08 +0000 Subject: [PATCH 36/78] [cron] Bump distribution date (2021-10-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 d1bff6ba10aa..a638379ef481 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 "2021-10-30" +//#define STRING_DISTRIBUTION_DATE "2021-10-31" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 9e87e765d550..a086f1797ec8 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 "2021-10-30" + #define STRING_DISTRIBUTION_DATE "2021-10-31" #endif /** From ba0b772d84bad99604b0131e2142366544370646 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 30 Oct 2021 22:43:02 -0500 Subject: [PATCH 37/78] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20linker=20error=20(tr?= =?UTF-8?q?ansfer=5Fport=5Findex)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/sd/cardreader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 1ab6dcc7c62e..513d682de68b 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -72,8 +72,8 @@ char CardReader::filename[FILENAME_LENGTH], CardReader::longFilename[LONG_FILENA IF_DISABLED(NO_SD_AUTOSTART, uint8_t CardReader::autofile_index); // = 0 -#if BOTH(HAS_MULTI_SERIAL, BINARY_FILE_TRANSFER) - serial_index_t CardReader::transfer_port_index; +#if ENABLED(BINARY_FILE_TRANSFER) + serial_index_t IF_DISABLED(HAS_MULTI_SERIAL, constexpr) CardReader::transfer_port_index; #endif // private: From efe2e79ac8e6d35e80a7d29bfd266685a82dc546 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 30 Oct 2021 23:43:19 -0500 Subject: [PATCH 38/78] =?UTF-8?q?=F0=9F=94=A8=20Help=20for=20GDB=20remote?= =?UTF-8?q?=20debugging?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 +-- Marlin/src/pins/pins.h | 4 +- .../share/PlatformIO/debugging/launch.json | 48 +++++++++++++++++++ ini/native.ini | 18 +------ ini/stm32f1-maple.ini | 2 +- ini/stm32f4.ini | 7 +++ 6 files changed, 60 insertions(+), 25 deletions(-) create mode 100644 buildroot/share/PlatformIO/debugging/launch.json diff --git a/.gitignore b/.gitignore index bc603ba38b0d..a83bfa4265a6 100755 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,7 @@ bdf2u8g # OS # applet/ -*.DS_Store +.DS_Store # # Misc @@ -167,7 +167,3 @@ __pycache__ # IOLogger logs *_log.csv - -# Simulation / Native -eeprom.dat -imgui.ini diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 49d06590e9c0..40bbe6b41bee 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -620,9 +620,9 @@ #elif MB(BTT_E3_RRF) #include "stm32f4/pins_BTT_E3_RRF.h" // STM32F4 env:BIGTREE_E3_RRF #elif MB(BTT_SKR_V2_0_REV_A) - #include "stm32f4/pins_BTT_SKR_V2_0_REV_A.h" // STM32F4 env:BIGTREE_SKR_2 env:BIGTREE_SKR_2_USB + #include "stm32f4/pins_BTT_SKR_V2_0_REV_A.h" // STM32F4 env:BIGTREE_SKR_2 env:BIGTREE_SKR_2_USB env:BIGTREE_SKR_2_USB_debug #elif MB(BTT_SKR_V2_0_REV_B) - #include "stm32f4/pins_BTT_SKR_V2_0_REV_B.h" // STM32F4 env:BIGTREE_SKR_2 env:BIGTREE_SKR_2_USB + #include "stm32f4/pins_BTT_SKR_V2_0_REV_B.h" // STM32F4 env:BIGTREE_SKR_2 env:BIGTREE_SKR_2_USB env:BIGTREE_SKR_2_USB_debug #elif MB(BTT_OCTOPUS_V1_0) #include "stm32f4/pins_BTT_OCTOPUS_V1_0.h" // STM32F4 env:BIGTREE_OCTOPUS_V1 env:BIGTREE_OCTOPUS_V1_USB #elif MB(BTT_OCTOPUS_V1_1) diff --git a/buildroot/share/PlatformIO/debugging/launch.json b/buildroot/share/PlatformIO/debugging/launch.json new file mode 100644 index 000000000000..335c4c663e89 --- /dev/null +++ b/buildroot/share/PlatformIO/debugging/launch.json @@ -0,0 +1,48 @@ +/** + * Remote debugging on STM32 using the "Cortex Debug" extension. + * + * Copy one or more of the configurations items below into .vscode/launch.json + * to add those debug options to the PlatformIO IDE "Run & Debug" panel. + * + * Examples for BigTreeTech SKR 2 (USB) and Native Simulator. Modify for your own build. + * + * NOTE: The PlatformIO extension will remove items when regenerating launch.json. + */ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug STM32 (launch)", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "cwd": "${workspaceRoot}", + "showDevDebugOutput": false, + "configFiles": [ "interface/stlink.cfg", "target/stm32f4x.cfg" ], + "device": "STM32F407", + "executable": ".pio/build/BIGTREE_SKR_2_USB_debug/firmware.elf", + }, + { + "name": "Debug STM32 (attach)", + "request": "attach", + "type": "cortex-debug", + "servertype": "openocd", + "cwd": "${workspaceRoot}", + "showDevDebugOutput": false, + "configFiles": [ "interface/stlink.cfg", "target/stm32f4x.cfg" ], + "device": "STM32F407", + "executable": ".pio/build/BIGTREE_SKR_2_USB_debug/firmware.elf", + }, + { + "name": "Debug Sim", + "request": "launch", + "type": "cppdbg", + "cwd": "${workspaceRoot}", + //"program": ".pio/build/simulator_linux_debug/MarlinSimulator", + //"program": ".pio/build/simulator_windows/MarlinSimulator", + "program": ".pio/build/simulator_macos_debug/MarlinSimulator", + "miDebuggerPath": "/opt/local/bin/ggdb", + "MIMode": "gdb" + } + ] +} diff --git a/ini/native.ini b/ini/native.ini index 981e93f996cf..fe5fe3a5d05a 100644 --- a/ini/native.ini +++ b/ini/native.ini @@ -29,10 +29,7 @@ src_filter = ${common.default_src_filter} + # # Tested with Linux (Mint 20) : gcc [9.3.0, 10.2.0]: libsdl2-dev[2.0.10], libsdl2-net-dev[2.0.1], libglm-dev[0.9.9.7, 0.9.9.8] # -# Debugging with gdb in vscode is as easy as adding the launch task as usual, but platformio -# will randomly remove your task when it recreates its tasks from a template. Add your gdb -# launch task to '~/.platformio/penv/lib/python{PYTHON_VERSION}/site-packages/platformio/ide/tpls/vscode/.vscode' -# to avoid this until platformio updates. +# For VSCode debugging see buildroot/share/PlatformIO/debugging/launch.json # [simulator_common] platform = native @@ -43,7 +40,6 @@ release_flags = -g0 -O3 -flto debug_build_flags = -fstack-protector-strong -g -g3 -ggdb lib_compat_mode = off src_filter = ${common.default_src_filter} + - lib_deps = ${common.lib_deps} MarlinSimUI=https://github.com/p3p/MarlinSimUI/archive/master.zip Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/marlin_sim_native.zip @@ -51,7 +47,6 @@ lib_deps = ${common.lib_deps} extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/simulator.py - [simulator_linux] extends = simulator_common build_flags = ${simulator_common.build_flags} -ldl -lpthread -lSDL2 -lSDL2_net -lGL @@ -84,17 +79,6 @@ build_flags = ${simulator_linux.build_flags} ${simulator_linux.release_flags} # Use 'sudo port install mesa' to get a if no Xcode is installed. # If Xcode is installed be sure to run `xcode-select --install` first. # -# For VSCode debugging paste the block below near the top of launch.json. -# NOTE: The PlatformIO VSCode extension will remove it when regenerating launch.json. -# -# { "name": "Debug Sim", -# "type": "cppdbg", -# "request": "launch", -# "program": "${workspaceFolder}/.pio/build/simulator_macos/MarlinSimulator", -# "miDebuggerPath": "/opt/local/bin/ggdb", -# "MIMode": "gdb", -# "cwd": "${workspaceFolder}/.pio/build/simulator_macos" }, -# [simulator_macos] build_unflags = -lGL custom_verbose = 0 diff --git a/ini/stm32f1-maple.ini b/ini/stm32f1-maple.ini index f86bf98ebdc5..e0b4ad711a37 100644 --- a/ini/stm32f1-maple.ini +++ b/ini/stm32f1-maple.ini @@ -410,7 +410,7 @@ extends = common_stm32f1 board = genericSTM32F103VE build_flags = ${common_stm32f1.build_flags} -ffunction-sections -fdata-sections -nostdlib -MMD - -DMCU_STM32F103VE -DARDUINO_GENERIC_STM32F103V -DARDUINO_ARCH_STM32F1 -O0 + -DMCU_STM32F103VE -DARDUINO_GENERIC_STM32F103V -DARDUINO_ARCH_STM32F1 -DDEBUG_LEVEL=DEBUG_NONE -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSS_TIMER=4 board_build.variant = MARLIN_F103Vx diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index 3d7f4d2d02a7..850807585ff3 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -220,6 +220,7 @@ build_flags = ${stm_flash_drive.build_flags} -DUSBD_IRQ_PRIO=5 -DUSBD_IRQ_SUBPRIO=6 -DHSE_VALUE=8000000U -DHAL_SD_MODULE_ENABLED -DPIN_SERIAL3_RX=PD_9 -DPIN_SERIAL3_TX=PD_8 +upload_protocol = stlink # # BigTreeTech SKR V2.0 (STM32F407VGT6 ARM Cortex-M4) with USB Media Share Support @@ -230,6 +231,12 @@ extends = env:BIGTREE_SKR_2 build_flags = ${env:BIGTREE_SKR_2.build_flags} -DUSBD_USE_CDC_MSC build_unflags = ${env:BIGTREE_SKR_2.build_unflags} -DUSBD_USE_CDC +[env:BIGTREE_SKR_2_USB_debug] +platform = ${common_stm32.platform} +extends = env:BIGTREE_SKR_2_USB +build_flags = ${env:BIGTREE_SKR_2_USB.build_flags} -O0 +build_unflags = ${env:BIGTREE_SKR_2_USB.build_unflags} -Os -NDEBUG + # # BigTreeTech Octopus V1.0/1.1 / Octopus Pro V1.0 (STM32F446ZET6 ARM Cortex-M4) # From 9176dcea6ee1e449aee8f4972739268d4e97f034 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 8 Jul 2021 01:17:16 -0500 Subject: [PATCH 39/78] =?UTF-8?q?=F0=9F=93=9D=20Tweak=20EXP=20comments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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 d3b59e03b862..50330932cf87 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 @@ -294,14 +294,14 @@ #endif /** - * ----- ----- - * NC | 1 2 | GND 5V | 1 2 | GND - * RESET | 3 4 | PC4 (SD_DETECT) (LCD_D7) PE13 | 3 4 | PE12 (LCD_D6) - * (MOSI) PA7 | 5 6 PB2 (BTN_EN2) (LCD_D5) PE11 | 5 6 PE10 (LCD_D4) - * (SD_SS) PA4 | 7 8 | PE7 (BTN_EN1) (LCD_RS) PE9 | 7 8 | PB1 (LCD_EN) - * (SCK) PA5 | 9 10| PA6 (MISO) (BTN_ENC) PB0 | 9 10| PC5 (BEEPER) - * ----- ----- - * EXP2 EXP1 + * ------ ------ + * NC | 1 2 | GND 5V | 1 2 | GND + * RESET | 3 4 | PC4 (SD_DETECT) (LCD_D7) PE13 | 3 4 | PE12 (LCD_D6) + * (MOSI) PA7 | 5 6 PB2 (BTN_EN2) (LCD_D5) PE11 | 5 6 PE10 (LCD_D4) + * (SD_SS) PA4 | 7 8 | PE7 (BTN_EN1) (LCD_RS) PE9 | 7 8 | PB1 (LCD_EN) + * (SCK) PA5 | 9 10 | PA6 (MISO) (BTN_ENC) PB0 | 9 10 | PC5 (BEEPER) + * ------ ------ + * EXP2 EXP1 */ #define EXP1_03_PIN PE13 #define EXP1_04_PIN PE12 From 5e9b5bb4482bdc4e600c2d0302faca29d6487b42 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 1 Nov 2021 01:03:28 +0000 Subject: [PATCH 40/78] [cron] Bump distribution date (2021-11-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 a638379ef481..1eb431186e8f 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 "2021-10-31" +//#define STRING_DISTRIBUTION_DATE "2021-11-01" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index a086f1797ec8..aef8d8b60b53 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 "2021-10-31" + #define STRING_DISTRIBUTION_DATE "2021-11-01" #endif /** From 296a6137cd06ce06f062767ab1b59f99ee95a094 Mon Sep 17 00:00:00 2001 From: tombrazier <68918209+tombrazier@users.noreply.github.com> Date: Mon, 1 Nov 2021 23:03:50 +0000 Subject: [PATCH 41/78] =?UTF-8?q?=F0=9F=9A=B8=20More=20flexible=20Probe=20?= =?UTF-8?q?Temperature=20Compensation=20(#23033)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 100 +++--- Marlin/src/feature/probe_temp_comp.cpp | 86 ++--- Marlin/src/feature/probe_temp_comp.h | 118 ++---- Marlin/src/gcode/bedlevel/abl/G29.cpp | 10 +- Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 358 ------------------- Marlin/src/gcode/calibrate/G76_M871.cpp | 337 +++++++++++++++++ Marlin/src/gcode/gcode.cpp | 9 +- Marlin/src/gcode/gcode.h | 57 ++- Marlin/src/gcode/temp/M192.cpp | 56 +++ Marlin/src/inc/Conditionals_adv.h | 14 + Marlin/src/inc/SanityCheck.h | 78 ++-- Marlin/src/module/settings.cpp | 54 ++- buildroot/tests/rambo | 8 +- ini/features.ini | 9 +- platformio.ini | 3 +- 15 files changed, 673 insertions(+), 624 deletions(-) delete mode 100644 Marlin/src/gcode/calibrate/G76_M192_M871.cpp create mode 100644 Marlin/src/gcode/calibrate/G76_M871.cpp create mode 100644 Marlin/src/gcode/temp/M192.cpp diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 4efab8193c7b..aa6fffd44ec9 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1988,65 +1988,69 @@ /** * Thermal Probe Compensation - * Probe measurements are adjusted to compensate for temperature distortion. - * Use G76 to calibrate this feature. Use M871 to set values manually. - * For a more detailed explanation of the process see G76_M871.cpp. + * + * Adjust probe measurements to compensate for distortion associated with the temperature + * of the probe, bed, and/or hotend. + * Use G76 to automatically calibrate this feature for probe and bed temperatures. + * (Extruder temperature/offset values must be calibrated manually.) + * Use M871 to set temperature/offset values manually. + * For more details see https://marlinfw.org/docs/features/probe_temp_compensation.html */ -#if HAS_BED_PROBE && TEMP_SENSOR_PROBE && TEMP_SENSOR_BED - // Enable thermal first layer compensation using bed and probe temperatures - #define PROBE_TEMP_COMPENSATION +//#define PTC_PROBE // Compensate based on probe temperature +//#define PTC_BED // Compensate based on bed temperature +//#define PTC_HOTEND // Compensate based on hotend temperature + +#if ANY(PTC_PROBE, PTC_BED, PTC_HOTEND) + /** + * If the probe is outside the defined range, use linear extrapolation with the closest + * point and the point with index PTC_LINEAR_EXTRAPOLATION. e.g., If set to 4 it will use the + * linear extrapolation between data[0] and data[4] for values below PTC_PROBE_START. + */ + //#define PTC_LINEAR_EXTRAPOLATION 4 + + #if ENABLED(PTC_PROBE) + // Probe temperature calibration generates a table of values starting at PTC_PROBE_START + // (e.g., 30), in steps of PTC_PROBE_RES (e.g., 5) with PTC_PROBE_COUNT (e.g., 10) samples. + #define PTC_PROBE_START 30 // (°C) + #define PTC_PROBE_RES 5 // (°C) + #define PTC_PROBE_COUNT 10 + #define PTC_PROBE_ZOFFS { 0 } // (µm) Z adjustments per sample + #endif + + #if ENABLED(PTC_BED) + // Bed temperature calibration builds a similar table. + #define PTC_BED_START 60 // (°C) + #define PTC_BED_RES 5 // (°C) + #define PTC_BED_COUNT 10 + #define PTC_BED_ZOFFS { 0 } // (µm) Z adjustments per sample + #endif + + #if ENABLED(PTC_HOTEND) + // Note: There is no automatic calibration for the hotend. Use M871. + #define PTC_HOTEND_START 180 // (°C) + #define PTC_HOTEND_RES 5 // (°C) + #define PTC_HOTEND_COUNT 20 + #define PTC_HOTEND_ZOFFS { 0 } // (µm) Z adjustments per sample + #endif - // Add additional compensation depending on hotend temperature - // Note: this values cannot be calibrated and have to be set manually - #if ENABLED(PROBE_TEMP_COMPENSATION) + // G76 options + #if BOTH(PTC_PROBE, PTC_BED) // Park position to wait for probe cooldown #define PTC_PARK_POS { 0, 0, 100 } // Probe position to probe and wait for probe to reach target temperature + //#define PTC_PROBE_POS { 12.0f, 7.3f } // Example: MK52 magnetic heatbed #define PTC_PROBE_POS { 90, 100 } - // Enable additional compensation using hotend temperature - // Note: this values cannot be calibrated automatically but have to be set manually via M871. - //#define USE_TEMP_EXT_COMPENSATION - - // Probe temperature calibration generates a table of values starting at PTC_SAMPLE_START - // (e.g., 30), in steps of PTC_SAMPLE_RES (e.g., 5) with PTC_SAMPLE_COUNT (e.g., 10) samples. - - //#define PTC_SAMPLE_START 30 // (°C) - //#define PTC_SAMPLE_RES 5 // (°C) - //#define PTC_SAMPLE_COUNT 10 - - // Bed temperature calibration builds a similar table. - - //#define BTC_SAMPLE_START 60 // (°C) - //#define BTC_SAMPLE_RES 5 // (°C) - //#define BTC_SAMPLE_COUNT 10 - - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - //#define ETC_SAMPLE_START 180 // (°C) - //#define ETC_SAMPLE_RES 5 // (°C) - //#define ETC_SAMPLE_COUNT 20 - #endif - - // The temperature the probe should be at while taking measurements during bed temperature - // calibration. - //#define BTC_PROBE_TEMP 30 // (°C) + // The temperature the probe should be at while taking measurements during + // bed temperature calibration. + #define PTC_PROBE_TEMP 30 // (°C) // Height above Z=0.0 to raise the nozzle. Lowering this can help the probe to heat faster. - // Note: the Z=0.0 offset is determined by the probe offset which can be set using M851. - //#define PTC_PROBE_HEATING_OFFSET 0.5 - - // Height to raise the Z-probe between heating and taking the next measurement. Some probes - // may fail to untrigger if they have been triggered for a long time, which can be solved by - // increasing the height the probe is raised to. - //#define PTC_PROBE_RAISE 15 - - // If the probe is outside of the defined range, use linear extrapolation using the closest - // point and the PTC_LINEAR_EXTRAPOLATION'th next point. E.g. if set to 4 it will use data[0] - // and data[4] to perform linear extrapolation for values below PTC_SAMPLE_START. - //#define PTC_LINEAR_EXTRAPOLATION 4 + // Note: The Z=0.0 offset is determined by the probe Z offset (e.g., as set with M851 Z). + #define PTC_PROBE_HEATING_OFFSET 0.5 #endif -#endif +#endif // PTC_PROBE || PTC_BED || PTC_HOTEND // @section extras diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp index 5f3bc985e63d..9a975d6763fa 100644 --- a/Marlin/src/feature/probe_temp_comp.cpp +++ b/Marlin/src/feature/probe_temp_comp.cpp @@ -22,39 +22,53 @@ #include "../inc/MarlinConfigPre.h" -#if ENABLED(PROBE_TEMP_COMPENSATION) +#if HAS_PTC //#define DEBUG_PTC // Print extra debug output with 'M871' #include "probe_temp_comp.h" #include -ProbeTempComp temp_comp; +ProbeTempComp ptc; -int16_t ProbeTempComp::z_offsets_probe[cali_info_init[TSI_PROBE].measurements], // = {0} - ProbeTempComp::z_offsets_bed[cali_info_init[TSI_BED].measurements]; // = {0} +#if ENABLED(PTC_PROBE) + constexpr int16_t z_offsets_probe_default[PTC_PROBE_COUNT] = PTC_PROBE_ZOFFS; + int16_t ProbeTempComp::z_offsets_probe[PTC_PROBE_COUNT] = PTC_PROBE_ZOFFS; +#endif -#if ENABLED(USE_TEMP_EXT_COMPENSATION) - int16_t ProbeTempComp::z_offsets_ext[cali_info_init[TSI_EXT].measurements]; // = {0} +#if ENABLED(PTC_BED) + constexpr int16_t z_offsets_bed_default[PTC_BED_COUNT] = PTC_BED_ZOFFS; + int16_t ProbeTempComp::z_offsets_bed[PTC_BED_COUNT] = PTC_BED_ZOFFS; #endif -int16_t *ProbeTempComp::sensor_z_offsets[TSI_COUNT] = { - ProbeTempComp::z_offsets_probe, ProbeTempComp::z_offsets_bed - OPTARG(USE_TEMP_EXT_COMPENSATION, ProbeTempComp::z_offsets_ext) -}; +#if ENABLED(PTC_HOTEND) + constexpr int16_t z_offsets_hotend_default[PTC_HOTEND_COUNT] = PTC_HOTEND_ZOFFS; + int16_t ProbeTempComp::z_offsets_hotend[PTC_HOTEND_COUNT] = PTC_HOTEND_ZOFFS; +#endif -const temp_calib_t ProbeTempComp::cali_info[TSI_COUNT] = { - cali_info_init[TSI_PROBE], cali_info_init[TSI_BED] - OPTARG(USE_TEMP_EXT_COMPENSATION, cali_info_init[TSI_EXT]) +int16_t *ProbeTempComp::sensor_z_offsets[TSI_COUNT] = { + #if ENABLED(PTC_PROBE) + ProbeTempComp::z_offsets_probe, + #endif + #if ENABLED(PTC_BED) + ProbeTempComp::z_offsets_bed, + #endif + #if ENABLED(PTC_HOTEND) + ProbeTempComp::z_offsets_hotend, + #endif }; -constexpr xyz_pos_t ProbeTempComp::park_point; -constexpr xy_pos_t ProbeTempComp::measure_point; -constexpr celsius_t ProbeTempComp::probe_calib_bed_temp; +constexpr temp_calib_t ProbeTempComp::cali_info[TSI_COUNT]; uint8_t ProbeTempComp::calib_idx; // = 0 float ProbeTempComp::init_measurement; // = 0.0 +void ProbeTempComp::reset() { + TERN_(PTC_PROBE, LOOP_L_N(i, PTC_PROBE_COUNT) z_offsets_probe[i] = z_offsets_probe_default[i]); + TERN_(PTC_BED, LOOP_L_N(i, PTC_BED_COUNT) z_offsets_bed[i] = z_offsets_bed_default[i]); + TERN_(PTC_HOTEND, LOOP_L_N(i, PTC_HOTEND_COUNT) z_offsets_hotend[i] = z_offsets_hotend_default[i]); +} + void ProbeTempComp::clear_offsets(const TempSensorID tsi) { LOOP_L_N(i, cali_info[tsi].measurements) sensor_z_offsets[tsi][i] = 0; @@ -71,10 +85,9 @@ void ProbeTempComp::print_offsets() { LOOP_L_N(s, TSI_COUNT) { celsius_t temp = cali_info[s].start_temp; for (int16_t i = -1; i < cali_info[s].measurements; ++i) { - SERIAL_ECHOF(s == TSI_BED ? F("Bed") : - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - s == TSI_EXT ? F("Extruder") : - #endif + SERIAL_ECHOF( + TERN_(PTC_BED, s == TSI_BED ? F("Bed") :) + TERN_(PTC_HOTEND, s == TSI_EXT ? F("Extruder") :) F("Probe") ); SERIAL_ECHOLNPGM( @@ -100,21 +113,13 @@ void ProbeTempComp::prepare_new_calibration(const_float_t init_meas_z) { } void ProbeTempComp::push_back_new_measurement(const TempSensorID tsi, const_float_t meas_z) { - switch (tsi) { - case TSI_PROBE: - case TSI_BED: - //case TSI_EXT: - if (calib_idx >= cali_info[tsi].measurements) return; - sensor_z_offsets[tsi][calib_idx++] = static_cast(meas_z * 1000.0f - init_measurement * 1000.0f); - default: break; - } + if (calib_idx >= cali_info[tsi].measurements) return; + sensor_z_offsets[tsi][calib_idx++] = static_cast((meas_z - init_measurement) * 1000.0f); } bool ProbeTempComp::finish_calibration(const TempSensorID tsi) { - if (tsi != TSI_PROBE && tsi != TSI_BED) return false; - - if (calib_idx < 3) { - SERIAL_ECHOLNPGM("!Insufficient measurements (min. 3)."); + if (!calib_idx) { + SERIAL_ECHOLNPGM("!No measurements."); clear_offsets(tsi); return false; } @@ -130,16 +135,15 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) { SERIAL_ECHOLNPGM("Got ", calib_idx, " measurements. "); if (linear_regression(tsi, k, d)) { SERIAL_ECHOPGM("Applying linear extrapolation"); - calib_idx--; for (; calib_idx < measurements; ++calib_idx) { - const celsius_float_t temp = start_temp + float(calib_idx) * res_temp; + const celsius_float_t temp = start_temp + float(calib_idx + 1) * res_temp; data[calib_idx] = static_cast(k * temp + d); } } else { // Simply use the last measured value for higher temperatures SERIAL_ECHOPGM("Failed to extrapolate"); - const int16_t last_val = data[calib_idx]; + const int16_t last_val = data[calib_idx-1]; for (; calib_idx < measurements; ++calib_idx) data[calib_idx] = last_val; } @@ -157,7 +161,7 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) { // Restrict the max. offset difference between two probings if (calib_idx > 0 && ABS(data[calib_idx - 1] - data[calib_idx]) > 800) { SERIAL_ECHOLNPGM("!Invalid Z-offset between two probings detected (0-0.8)."); - clear_offsets(TSI_PROBE); + clear_offsets(tsi); return false; } } @@ -168,8 +172,8 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) { void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const celsius_t temp, float &meas_z) { const uint8_t measurements = cali_info[tsi].measurements; const celsius_t start_temp = cali_info[tsi].start_temp, - end_temp = cali_info[tsi].end_temp, - res_temp = cali_info[tsi].temp_resolution; + res_temp = cali_info[tsi].temp_resolution, + end_temp = start_temp + measurements * res_temp; const int16_t * const data = sensor_z_offsets[tsi]; // Given a data index, return { celsius, zoffset } in the form { x, y } @@ -208,9 +212,7 @@ void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const celsius } bool ProbeTempComp::linear_regression(const TempSensorID tsi, float &k, float &d) { - if (tsi != TSI_PROBE && tsi != TSI_BED) return false; - - if (!WITHIN(calib_idx, 2, cali_info[tsi].measurements)) return false; + if (!WITHIN(calib_idx, 1, cali_info[tsi].measurements)) return false; const celsius_t start_temp = cali_info[tsi].start_temp, res_temp = cali_info[tsi].temp_resolution; @@ -243,4 +245,4 @@ bool ProbeTempComp::linear_regression(const TempSensorID tsi, float &k, float &d return true; } -#endif // PROBE_TEMP_COMPENSATION +#endif // HAS_PTC diff --git a/Marlin/src/feature/probe_temp_comp.h b/Marlin/src/feature/probe_temp_comp.h index e5d459b8e8e4..4579f2187cd4 100644 --- a/Marlin/src/feature/probe_temp_comp.h +++ b/Marlin/src/feature/probe_temp_comp.h @@ -24,9 +24,13 @@ #include "../inc/MarlinConfig.h" enum TempSensorID : uint8_t { - TSI_PROBE, - TSI_BED, - #if ENABLED(USE_TEMP_EXT_COMPENSATION) + #if ENABLED(PTC_PROBE) + TSI_PROBE, + #endif + #if ENABLED(PTC_BED) + TSI_BED, + #endif + #if ENABLED(PTC_HOTEND) TSI_EXT, #endif TSI_COUNT @@ -35,8 +39,7 @@ enum TempSensorID : uint8_t { typedef struct { uint8_t measurements; // Max. number of measurements to be stored (35 - 80°C) celsius_t temp_resolution, // Resolution in °C between measurements - start_temp, // Base measurement; z-offset == 0 - end_temp; + start_temp; // Base measurement; z-offset == 0 } temp_calib_t; /** @@ -45,93 +48,40 @@ typedef struct { * measurement errors/shifts due to changed temperature. */ -// Probe temperature calibration constants -#ifndef PTC_SAMPLE_COUNT - #define PTC_SAMPLE_COUNT 10 -#endif -#ifndef PTC_SAMPLE_RES - #define PTC_SAMPLE_RES 5 -#endif -#ifndef PTC_SAMPLE_START - #define PTC_SAMPLE_START 30 -#endif -#define PTC_SAMPLE_END (PTC_SAMPLE_START + (PTC_SAMPLE_COUNT) * PTC_SAMPLE_RES) - -// Bed temperature calibration constants -#ifndef BTC_PROBE_TEMP - #define BTC_PROBE_TEMP 30 -#endif -#ifndef BTC_SAMPLE_COUNT - #define BTC_SAMPLE_COUNT 10 -#endif -#ifndef BTC_SAMPLE_RES - #define BTC_SAMPLE_RES 5 -#endif -#ifndef BTC_SAMPLE_START - #define BTC_SAMPLE_START 60 -#endif -#define BTC_SAMPLE_END (BTC_SAMPLE_START + (BTC_SAMPLE_COUNT) * BTC_SAMPLE_RES) - -// Extruder temperature calibration constants -#if ENABLED(USE_TEMP_EXT_COMPENSATION) - #ifndef ETC_SAMPLE_COUNT - #define ETC_SAMPLE_COUNT 20 - #endif - #ifndef ETC_SAMPLE_RES - #define ETC_SAMPLE_RES 5 - #endif - #ifndef ETC_SAMPLE_START - #define ETC_SAMPLE_START 180 - #endif - #define ETC_SAMPLE_END (ETC_SAMPLE_START + (ETC_SAMPLE_COUNT) * ETC_SAMPLE_RES) -#endif - -#ifndef PTC_PROBE_HEATING_OFFSET - #define PTC_PROBE_HEATING_OFFSET 0.5f -#endif - -#ifndef PTC_PROBE_RAISE - #define PTC_PROBE_RAISE 10 -#endif - -static constexpr temp_calib_t cali_info_init[TSI_COUNT] = { - { PTC_SAMPLE_COUNT, PTC_SAMPLE_RES, PTC_SAMPLE_START, PTC_SAMPLE_END }, // Probe - { BTC_SAMPLE_COUNT, BTC_SAMPLE_RES, BTC_SAMPLE_START, BTC_SAMPLE_END }, // Bed - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - { ETC_SAMPLE_COUNT, ETC_SAMPLE_RES, ETC_SAMPLE_START, ETC_SAMPLE_END }, // Extruder - #endif -}; - class ProbeTempComp { public: - static const temp_calib_t cali_info[TSI_COUNT]; - - // Where to park nozzle to wait for probe cooldown - static constexpr xyz_pos_t park_point = PTC_PARK_POS; - - // XY coordinates of nozzle for probing the bed - static constexpr xy_pos_t measure_point = PTC_PROBE_POS; // Coordinates to probe - //measure_point = { 12.0f, 7.3f }; // Coordinates for the MK52 magnetic heatbed - - static constexpr celsius_t probe_calib_bed_temp = BED_MAX_TARGET, // Bed temperature while calibrating probe - bed_calib_probe_temp = BTC_PROBE_TEMP; // Probe temperature while calibrating bed - - static int16_t *sensor_z_offsets[TSI_COUNT], - z_offsets_probe[cali_info_init[TSI_PROBE].measurements], // (µm) - z_offsets_bed[cali_info_init[TSI_BED].measurements]; // (µm) - - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - static int16_t z_offsets_ext[cali_info_init[TSI_EXT].measurements]; // (µm) + static constexpr temp_calib_t cali_info[TSI_COUNT] = { + #if ENABLED(PTC_PROBE) + { PTC_PROBE_COUNT, PTC_PROBE_RES, PTC_PROBE_START }, // Probe + #endif + #if ENABLED(PTC_BED) + { PTC_BED_COUNT, PTC_BED_RES, PTC_BED_START }, // Bed + #endif + #if ENABLED(PTC_HOTEND) + { PTC_HOTEND_COUNT, PTC_HOTEND_RES, PTC_HOTEND_START }, // Extruder + #endif + }; + + static int16_t *sensor_z_offsets[TSI_COUNT]; + #if ENABLED(PTC_PROBE) + static int16_t z_offsets_probe[PTC_PROBE_COUNT]; // (µm) + #endif + #if ENABLED(PTC_BED) + static int16_t z_offsets_bed[PTC_BED_COUNT]; // (µm) + #endif + #if ENABLED(PTC_HOTEND) + static int16_t z_offsets_hotend[PTC_HOTEND_COUNT]; // (µm) #endif static inline void reset_index() { calib_idx = 0; }; static inline uint8_t get_index() { return calib_idx; } + static void reset(); static void clear_offsets(const TempSensorID tsi); static inline void clear_all_offsets() { - clear_offsets(TSI_BED); - clear_offsets(TSI_PROBE); - TERN_(USE_TEMP_EXT_COMPENSATION, clear_offsets(TSI_EXT)); + TERN_(PTC_PROBE, clear_offsets(TSI_PROBE)); + TERN_(PTC_BED, clear_offsets(TSI_BED)); + TERN_(PTC_HOTEND, clear_offsets(TSI_EXT)); } static bool set_offset(const TempSensorID tsi, const uint8_t idx, const int16_t offset); static void print_offsets(); @@ -156,4 +106,4 @@ class ProbeTempComp { static bool linear_regression(const TempSensorID tsi, float &k, float &d); }; -extern ProbeTempComp temp_comp; +extern ProbeTempComp ptc; diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 5d94797f16a1..14da38c8fe2b 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -36,7 +36,7 @@ #include "../../../module/probe.h" #include "../../queue.h" -#if ENABLED(PROBE_TEMP_COMPENSATION) +#if HAS_PTC #include "../../../feature/probe_temp_comp.h" #include "../../../module/temperature.h" #endif @@ -645,11 +645,9 @@ G29_TYPE GcodeSuite::G29() { break; // Breaks out of both loops } - #if ENABLED(PROBE_TEMP_COMPENSATION) - temp_comp.compensate_measurement(TSI_BED, thermalManager.degBed(), abl.measured_z); - temp_comp.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), abl.measured_z); - TERN_(USE_TEMP_EXT_COMPENSATION, temp_comp.compensate_measurement(TSI_EXT, thermalManager.degHotend(0), abl.measured_z)); - #endif + TERN_(PTC_BED, ptc.compensate_measurement(TSI_BED, thermalManager.degBed(), abl.measured_z)); + TERN_(PTC_PROBE, ptc.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), abl.measured_z)); + TERN_(PTC_HOTEND, ptc.compensate_measurement(TSI_EXT, thermalManager.degHotend(0), abl.measured_z)); #if ENABLED(AUTO_BED_LEVELING_LINEAR) diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp deleted file mode 100644 index 0fc41ed92909..000000000000 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ /dev/null @@ -1,358 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 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 . - * - */ - -/** - * G76_M871.cpp - Temperature calibration/compensation for z-probing - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(PROBE_TEMP_COMPENSATION) - -#include "../gcode.h" -#include "../../module/motion.h" -#include "../../module/planner.h" -#include "../../module/probe.h" -#include "../../feature/bedlevel/bedlevel.h" -#include "../../module/temperature.h" -#include "../../module/probe.h" -#include "../../feature/probe_temp_comp.h" -#include "../../lcd/marlinui.h" - -/** - * G76: calibrate probe and/or bed temperature offsets - * Notes: - * - When calibrating probe, bed temperature is held constant. - * Compensation values are deltas to first probe measurement at probe temp. = 30°C. - * - When calibrating bed, probe temperature is held constant. - * Compensation values are deltas to first probe measurement at bed temp. = 60°C. - * - The hotend will not be heated at any time. - * - On my Průša MK3S clone I put a piece of paper between the probe and the hotend - * so the hotend fan would not cool my probe constantly. Alternatively you could just - * make sure the fan is not running while running the calibration process. - * - * Probe calibration: - * - Moves probe to cooldown point. - * - Heats up bed to 100°C. - * - Moves probe to probing point (1mm above heatbed). - * - Waits until probe reaches target temperature (30°C). - * - Does a z-probing (=base value) and increases target temperature by 5°C. - * - Waits until probe reaches increased target temperature. - * - Does a z-probing (delta to base value will be a compensation value) and increases target temperature by 5°C. - * - Repeats last two steps until max. temperature reached or timeout (i.e. probe does not heat up any further). - * - Compensation values of higher temperatures will be extrapolated (using linear regression first). - * While this is not exact by any means it is still better than simply using the last compensation value. - * - * Bed calibration: - * - Moves probe to cooldown point. - * - Heats up bed to 60°C. - * - Moves probe to probing point (1mm above heatbed). - * - Waits until probe reaches target temperature (30°C). - * - Does a z-probing (=base value) and increases bed temperature by 5°C. - * - Moves probe to cooldown point. - * - Waits until probe is below 30°C and bed has reached target temperature. - * - Moves probe to probing point and waits until it reaches target temperature (30°C). - * - Does a z-probing (delta to base value will be a compensation value) and increases bed temperature by 5°C. - * - Repeats last four points until max. bed temperature reached (110°C) or timeout. - * - Compensation values of higher temperatures will be extrapolated (using linear regression first). - * While this is not exact by any means it is still better than simply using the last compensation value. - * - * G76 [B | P] - * - no flag - Both calibration procedures will be run. - * - `B` - Run bed temperature calibration. - * - `P` - Run probe temperature calibration. - */ - -static void say_waiting_for() { SERIAL_ECHOPGM("Waiting for "); } -static void say_waiting_for_probe_heating() { say_waiting_for(); SERIAL_ECHOLNPGM("probe heating."); } -static void say_successfully_calibrated() { SERIAL_ECHOPGM("Successfully calibrated"); } -static void say_failed_to_calibrate() { SERIAL_ECHOPGM("!Failed to calibrate"); } - -void GcodeSuite::G76() { - // Check if heated bed is available and z-homing is done with probe - #if TEMP_SENSOR_BED == 0 || !(HOMING_Z_WITH_PROBE) - return; - #endif - - auto report_temps = [](millis_t &ntr, millis_t timeout=0) { - idle_no_sleep(); - const millis_t ms = millis(); - if (ELAPSED(ms, ntr)) { - ntr = ms + 1000; - thermalManager.print_heater_states(active_extruder); - } - return (timeout && ELAPSED(ms, timeout)); - }; - - auto wait_for_temps = [&](const celsius_t tb, const celsius_t tp, millis_t &ntr, const millis_t timeout=0) { - say_waiting_for(); SERIAL_ECHOLNPGM("bed and probe temperature."); - while (thermalManager.wholeDegBed() != tb || thermalManager.wholeDegProbe() > tp) - if (report_temps(ntr, timeout)) return true; - return false; - }; - - auto g76_probe = [](const TempSensorID sid, celsius_t &targ, const xy_pos_t &nozpos) { - do_z_clearance(5.0); // Raise nozzle before probing - const float measured_z = probe.probe_at_point(nozpos, PROBE_PT_STOW, 0, false); // verbose=0, probe_relative=false - if (isnan(measured_z)) - SERIAL_ECHOLNPGM("!Received NAN. Aborting."); - else { - SERIAL_ECHOLNPAIR_F("Measured: ", measured_z); - if (targ == cali_info_init[sid].start_temp) - temp_comp.prepare_new_calibration(measured_z); - else - temp_comp.push_back_new_measurement(sid, measured_z); - targ += cali_info_init[sid].temp_resolution; - } - return measured_z; - }; - - #if ENABLED(BLTOUCH) - // Make sure any BLTouch error condition is cleared - bltouch_command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY); - set_bltouch_deployed(false); - #endif - - bool do_bed_cal = parser.boolval('B'), do_probe_cal = parser.boolval('P'); - if (!do_bed_cal && !do_probe_cal) do_bed_cal = do_probe_cal = true; - - // Synchronize with planner - planner.synchronize(); - - const xyz_pos_t parkpos = temp_comp.park_point, - probe_pos_xyz = xyz_pos_t(temp_comp.measure_point) + xyz_pos_t({ 0.0f, 0.0f, PTC_PROBE_HEATING_OFFSET }), - noz_pos_xyz = probe_pos_xyz - probe.offset_xy; // Nozzle position based on probe position - - if (do_bed_cal || do_probe_cal) { - // Ensure park position is reachable - bool reachable = position_is_reachable(parkpos) || WITHIN(parkpos.z, Z_MIN_POS - fslop, Z_MAX_POS + fslop); - if (!reachable) - SERIAL_ECHOLNPGM("!Park"); - else { - // Ensure probe position is reachable - reachable = probe.can_reach(probe_pos_xyz); - if (!reachable) SERIAL_ECHOLNPGM("!Probe"); - } - - if (!reachable) { - SERIAL_ECHOLNPGM(" position unreachable - aborting."); - return; - } - - process_subcommands_now(FPSTR(G28_STR)); - } - - remember_feedrate_scaling_off(); - - /****************************************** - * Calibrate bed temperature offsets - ******************************************/ - - // Report temperatures every second and handle heating timeouts - millis_t next_temp_report = millis() + 1000; - - auto report_targets = [&](const celsius_t tb, const celsius_t tp) { - SERIAL_ECHOLNPGM("Target Bed:", tb, " Probe:", tp); - }; - - if (do_bed_cal) { - - celsius_t target_bed = cali_info_init[TSI_BED].start_temp, - target_probe = temp_comp.bed_calib_probe_temp; - - say_waiting_for(); SERIAL_ECHOLNPGM(" cooling."); - while (thermalManager.wholeDegBed() > target_bed || thermalManager.wholeDegProbe() > target_probe) - report_temps(next_temp_report); - - // Disable leveling so it won't mess with us - TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); - - for (;;) { - thermalManager.setTargetBed(target_bed); - - report_targets(target_bed, target_probe); - - // Park nozzle - do_blocking_move_to(parkpos); - - // Wait for heatbed to reach target temp and probe to cool below target temp - if (wait_for_temps(target_bed, target_probe, next_temp_report, millis() + MIN_TO_MS(15))) { - SERIAL_ECHOLNPGM("!Bed heating timeout."); - break; - } - - // Move the nozzle to the probing point and wait for the probe to reach target temp - do_blocking_move_to(noz_pos_xyz); - say_waiting_for_probe_heating(); - SERIAL_EOL(); - while (thermalManager.wholeDegProbe() < target_probe) - report_temps(next_temp_report); - - const float measured_z = g76_probe(TSI_BED, target_bed, noz_pos_xyz); - if (isnan(measured_z) || target_bed > (BED_MAX_TARGET)) break; - } - - SERIAL_ECHOLNPGM("Retrieved measurements: ", temp_comp.get_index()); - if (temp_comp.finish_calibration(TSI_BED)) { - say_successfully_calibrated(); - SERIAL_ECHOLNPGM(" bed."); - } - else { - say_failed_to_calibrate(); - SERIAL_ECHOLNPGM(" bed. Values reset."); - } - - // Cleanup - thermalManager.setTargetBed(0); - TERN_(HAS_LEVELING, set_bed_leveling_enabled(true)); - } // do_bed_cal - - /******************************************** - * Calibrate probe temperature offsets - ********************************************/ - - if (do_probe_cal) { - - // Park nozzle - do_blocking_move_to(parkpos); - - // Initialize temperatures - const celsius_t target_bed = temp_comp.probe_calib_bed_temp; - thermalManager.setTargetBed(target_bed); - - celsius_t target_probe = cali_info_init[TSI_PROBE].start_temp; - - report_targets(target_bed, target_probe); - - // Wait for heatbed to reach target temp and probe to cool below target temp - wait_for_temps(target_bed, target_probe, next_temp_report); - - // Disable leveling so it won't mess with us - TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); - - bool timeout = false; - for (;;) { - // Move probe to probing point and wait for it to reach target temperature - do_blocking_move_to(noz_pos_xyz); - - say_waiting_for_probe_heating(); - SERIAL_ECHOLNPGM(" Bed:", target_bed, " Probe:", target_probe); - const millis_t probe_timeout_ms = millis() + SEC_TO_MS(900UL); - while (thermalManager.degProbe() < target_probe) { - if (report_temps(next_temp_report, probe_timeout_ms)) { - SERIAL_ECHOLNPGM("!Probe heating timed out."); - timeout = true; - break; - } - } - if (timeout) break; - - const float measured_z = g76_probe(TSI_PROBE, target_probe, noz_pos_xyz); - if (isnan(measured_z) || target_probe > cali_info_init[TSI_PROBE].end_temp) break; - } - - SERIAL_ECHOLNPGM("Retrieved measurements: ", temp_comp.get_index()); - if (temp_comp.finish_calibration(TSI_PROBE)) - say_successfully_calibrated(); - else - say_failed_to_calibrate(); - SERIAL_ECHOLNPGM(" probe."); - - // Cleanup - thermalManager.setTargetBed(0); - TERN_(HAS_LEVELING, set_bed_leveling_enabled(true)); - - SERIAL_ECHOLNPGM("Final compensation values:"); - temp_comp.print_offsets(); - } // do_probe_cal - - restore_feedrate_and_scaling(); -} - -/** - * M871: Report / reset temperature compensation offsets. - * Note: This does not affect values in EEPROM until M500. - * - * M871 [ R | B | P | E ] - * - * No Parameters - Print current offset values. - * - * Select only one of these flags: - * R - Reset all offsets to zero (i.e., disable compensation). - * B - Manually set offset for bed - * P - Manually set offset for probe - * E - Manually set offset for extruder - * - * With B, P, or E: - * I[index] - Index in the array - * V[value] - Adjustment in µm - */ -void GcodeSuite::M871() { - - if (parser.seen('R')) { - // Reset z-probe offsets to factory defaults - temp_comp.clear_all_offsets(); - SERIAL_ECHOLNPGM("Offsets reset to default."); - } - else if (parser.seen("BPE")) { - if (!parser.seenval('V')) return; - const int16_t offset_val = parser.value_int(); - if (!parser.seenval('I')) return; - const int16_t idx = parser.value_int(); - const TempSensorID mod = (parser.seen('B') ? TSI_BED : - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - parser.seen('E') ? TSI_EXT : - #endif - TSI_PROBE - ); - if (idx > 0 && temp_comp.set_offset(mod, idx - 1, offset_val)) - SERIAL_ECHOLNPGM("Set value: ", offset_val); - else - SERIAL_ECHOLNPGM("!Invalid index. Failed to set value (note: value at index 0 is constant)."); - - } - else // Print current Z-probe adjustments. Note: Values in EEPROM might differ. - temp_comp.print_offsets(); -} - -/** - * M192: Wait for probe temperature sensor to reach a target - * - * Select only one of these flags: - * R - Wait for heating or cooling - * S - Wait only for heating - */ -void GcodeSuite::M192() { - if (DEBUGGING(DRYRUN)) return; - - const bool no_wait_for_cooling = parser.seenval('S'); - if (!no_wait_for_cooling && ! parser.seenval('R')) { - SERIAL_ERROR_MSG("No target temperature set."); - return; - } - - const celsius_t target_temp = parser.value_celsius(); - ui.set_status(thermalManager.isProbeBelowTemp(target_temp) ? GET_TEXT_F(MSG_PROBE_HEATING) : GET_TEXT_F(MSG_PROBE_COOLING)); - thermalManager.wait_for_probe(target_temp, no_wait_for_cooling); -} - -#endif // PROBE_TEMP_COMPENSATION diff --git a/Marlin/src/gcode/calibrate/G76_M871.cpp b/Marlin/src/gcode/calibrate/G76_M871.cpp new file mode 100644 index 000000000000..21bb2c759006 --- /dev/null +++ b/Marlin/src/gcode/calibrate/G76_M871.cpp @@ -0,0 +1,337 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 . + * + */ + +/** + * G76_M871.cpp - Temperature calibration/compensation for z-probing + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_PTC + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../module/probe.h" +#include "../../feature/bedlevel/bedlevel.h" +#include "../../module/temperature.h" +#include "../../module/probe.h" +#include "../../feature/probe_temp_comp.h" +#include "../../lcd/marlinui.h" + +/** + * G76: calibrate probe and/or bed temperature offsets + * Notes: + * - When calibrating probe, bed temperature is held constant. + * Compensation values are deltas to first probe measurement at probe temp. = 30°C. + * - When calibrating bed, probe temperature is held constant. + * Compensation values are deltas to first probe measurement at bed temp. = 60°C. + * - The hotend will not be heated at any time. + * - On my Průša MK3S clone I put a piece of paper between the probe and the hotend + * so the hotend fan would not cool my probe constantly. Alternatively you could just + * make sure the fan is not running while running the calibration process. + * + * Probe calibration: + * - Moves probe to cooldown point. + * - Heats up bed to 100°C. + * - Moves probe to probing point (1mm above heatbed). + * - Waits until probe reaches target temperature (30°C). + * - Does a z-probing (=base value) and increases target temperature by 5°C. + * - Waits until probe reaches increased target temperature. + * - Does a z-probing (delta to base value will be a compensation value) and increases target temperature by 5°C. + * - Repeats last two steps until max. temperature reached or timeout (i.e. probe does not heat up any further). + * - Compensation values of higher temperatures will be extrapolated (using linear regression first). + * While this is not exact by any means it is still better than simply using the last compensation value. + * + * Bed calibration: + * - Moves probe to cooldown point. + * - Heats up bed to 60°C. + * - Moves probe to probing point (1mm above heatbed). + * - Waits until probe reaches target temperature (30°C). + * - Does a z-probing (=base value) and increases bed temperature by 5°C. + * - Moves probe to cooldown point. + * - Waits until probe is below 30°C and bed has reached target temperature. + * - Moves probe to probing point and waits until it reaches target temperature (30°C). + * - Does a z-probing (delta to base value will be a compensation value) and increases bed temperature by 5°C. + * - Repeats last four points until max. bed temperature reached (110°C) or timeout. + * - Compensation values of higher temperatures will be extrapolated (using linear regression first). + * While this is not exact by any means it is still better than simply using the last compensation value. + * + * G76 [B | P] + * - no flag - Both calibration procedures will be run. + * - `B` - Run bed temperature calibration. + * - `P` - Run probe temperature calibration. + */ + +static void say_waiting_for() { SERIAL_ECHOPGM("Waiting for "); } +static void say_waiting_for_probe_heating() { say_waiting_for(); SERIAL_ECHOLNPGM("probe heating."); } +static void say_successfully_calibrated() { SERIAL_ECHOPGM("Successfully calibrated"); } +static void say_failed_to_calibrate() { SERIAL_ECHOPGM("!Failed to calibrate"); } + +#if BOTH(PTC_PROBE, PTC_BED) + + void GcodeSuite::G76() { + auto report_temps = [](millis_t &ntr, millis_t timeout=0) { + idle_no_sleep(); + const millis_t ms = millis(); + if (ELAPSED(ms, ntr)) { + ntr = ms + 1000; + thermalManager.print_heater_states(active_extruder); + } + return (timeout && ELAPSED(ms, timeout)); + }; + + auto wait_for_temps = [&](const celsius_t tb, const celsius_t tp, millis_t &ntr, const millis_t timeout=0) { + say_waiting_for(); SERIAL_ECHOLNPGM("bed and probe temperature."); + while (thermalManager.wholeDegBed() != tb || thermalManager.wholeDegProbe() > tp) + if (report_temps(ntr, timeout)) return true; + return false; + }; + + auto g76_probe = [](const TempSensorID sid, celsius_t &targ, const xy_pos_t &nozpos) { + do_z_clearance(5.0); // Raise nozzle before probing + const float measured_z = probe.probe_at_point(nozpos, PROBE_PT_STOW, 0, false); // verbose=0, probe_relative=false + if (isnan(measured_z)) + SERIAL_ECHOLNPGM("!Received NAN. Aborting."); + else { + SERIAL_ECHOLNPAIR_F("Measured: ", measured_z); + if (targ == ProbeTempComp::cali_info[sid].start_temp) + ptc.prepare_new_calibration(measured_z); + else + ptc.push_back_new_measurement(sid, measured_z); + targ += ProbeTempComp::cali_info[sid].temp_resolution; + } + return measured_z; + }; + + #if ENABLED(BLTOUCH) + // Make sure any BLTouch error condition is cleared + bltouch_command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY); + set_bltouch_deployed(false); + #endif + + bool do_bed_cal = parser.boolval('B'), do_probe_cal = parser.boolval('P'); + if (!do_bed_cal && !do_probe_cal) do_bed_cal = do_probe_cal = true; + + // Synchronize with planner + planner.synchronize(); + + #ifndef PTC_PROBE_HEATING_OFFSET + #define PTC_PROBE_HEATING_OFFSET 0 + #endif + const xyz_pos_t parkpos = PTC_PARK_POS, + probe_pos_xyz = xyz_pos_t(PTC_PROBE_POS) + xyz_pos_t({ 0.0f, 0.0f, PTC_PROBE_HEATING_OFFSET }), + noz_pos_xyz = probe_pos_xyz - probe.offset_xy; // Nozzle position based on probe position + + if (do_bed_cal || do_probe_cal) { + // Ensure park position is reachable + bool reachable = position_is_reachable(parkpos) || WITHIN(parkpos.z, Z_MIN_POS - fslop, Z_MAX_POS + fslop); + if (!reachable) + SERIAL_ECHOLNPGM("!Park"); + else { + // Ensure probe position is reachable + reachable = probe.can_reach(probe_pos_xyz); + if (!reachable) SERIAL_ECHOLNPGM("!Probe"); + } + + if (!reachable) { + SERIAL_ECHOLNPGM(" position unreachable - aborting."); + return; + } + + process_subcommands_now(FPSTR(G28_STR)); + } + + remember_feedrate_scaling_off(); + + /****************************************** + * Calibrate bed temperature offsets + ******************************************/ + + // Report temperatures every second and handle heating timeouts + millis_t next_temp_report = millis() + 1000; + + auto report_targets = [&](const celsius_t tb, const celsius_t tp) { + SERIAL_ECHOLNPGM("Target Bed:", tb, " Probe:", tp); + }; + + if (do_bed_cal) { + + celsius_t target_bed = PTC_BED_START, + target_probe = PTC_PROBE_TEMP; + + say_waiting_for(); SERIAL_ECHOLNPGM(" cooling."); + while (thermalManager.wholeDegBed() > target_bed || thermalManager.wholeDegProbe() > target_probe) + report_temps(next_temp_report); + + // Disable leveling so it won't mess with us + TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); + + for (uint8_t idx = 0; idx <= PTC_BED_COUNT; idx++) { + thermalManager.setTargetBed(target_bed); + + report_targets(target_bed, target_probe); + + // Park nozzle + do_blocking_move_to(parkpos); + + // Wait for heatbed to reach target temp and probe to cool below target temp + if (wait_for_temps(target_bed, target_probe, next_temp_report, millis() + MIN_TO_MS(15))) { + SERIAL_ECHOLNPGM("!Bed heating timeout."); + break; + } + + // Move the nozzle to the probing point and wait for the probe to reach target temp + do_blocking_move_to(noz_pos_xyz); + say_waiting_for_probe_heating(); + SERIAL_EOL(); + while (thermalManager.wholeDegProbe() < target_probe) + report_temps(next_temp_report); + + const float measured_z = g76_probe(TSI_BED, target_bed, noz_pos_xyz); + if (isnan(measured_z) || target_bed > (BED_MAX_TARGET)) break; + } + + SERIAL_ECHOLNPGM("Retrieved measurements: ", ptc.get_index()); + if (ptc.finish_calibration(TSI_BED)) { + say_successfully_calibrated(); + SERIAL_ECHOLNPGM(" bed."); + } + else { + say_failed_to_calibrate(); + SERIAL_ECHOLNPGM(" bed. Values reset."); + } + + // Cleanup + thermalManager.setTargetBed(0); + TERN_(HAS_LEVELING, set_bed_leveling_enabled(true)); + } // do_bed_cal + + /******************************************** + * Calibrate probe temperature offsets + ********************************************/ + + if (do_probe_cal) { + + // Park nozzle + do_blocking_move_to(parkpos); + + // Initialize temperatures + const celsius_t target_bed = BED_MAX_TARGET; + thermalManager.setTargetBed(target_bed); + + celsius_t target_probe = PTC_PROBE_START; + + report_targets(target_bed, target_probe); + + // Wait for heatbed to reach target temp and probe to cool below target temp + wait_for_temps(target_bed, target_probe, next_temp_report); + + // Disable leveling so it won't mess with us + TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); + + bool timeout = false; + for (uint8_t idx = 0; idx <= PTC_PROBE_COUNT; idx++) { + // Move probe to probing point and wait for it to reach target temperature + do_blocking_move_to(noz_pos_xyz); + + say_waiting_for_probe_heating(); + SERIAL_ECHOLNPGM(" Bed:", target_bed, " Probe:", target_probe); + const millis_t probe_timeout_ms = millis() + SEC_TO_MS(900UL); + while (thermalManager.degProbe() < target_probe) { + if (report_temps(next_temp_report, probe_timeout_ms)) { + SERIAL_ECHOLNPGM("!Probe heating timed out."); + timeout = true; + break; + } + } + if (timeout) break; + + const float measured_z = g76_probe(TSI_PROBE, target_probe, noz_pos_xyz); + if (isnan(measured_z)) break; + } + + SERIAL_ECHOLNPGM("Retrieved measurements: ", ptc.get_index()); + if (ptc.finish_calibration(TSI_PROBE)) + say_successfully_calibrated(); + else + say_failed_to_calibrate(); + SERIAL_ECHOLNPGM(" probe."); + + // Cleanup + thermalManager.setTargetBed(0); + TERN_(HAS_LEVELING, set_bed_leveling_enabled(true)); + + SERIAL_ECHOLNPGM("Final compensation values:"); + ptc.print_offsets(); + } // do_probe_cal + + restore_feedrate_and_scaling(); + } + +#endif // PTC_PROBE && PTC_BED + +/** + * M871: Report / reset temperature compensation offsets. + * Note: This does not affect values in EEPROM until M500. + * + * M871 [ R | B | P | E ] + * + * No Parameters - Print current offset values. + * + * Select only one of these flags: + * R - Reset all offsets to zero (i.e., disable compensation). + * B - Manually set offset for bed + * P - Manually set offset for probe + * E - Manually set offset for extruder + * + * With B, P, or E: + * I[index] - Index in the array + * V[value] - Adjustment in µm + */ +void GcodeSuite::M871() { + + if (parser.seen('R')) { + // Reset z-probe offsets to factory defaults + ptc.clear_all_offsets(); + SERIAL_ECHOLNPGM("Offsets reset to default."); + } + else if (parser.seen("BPE")) { + if (!parser.seenval('V')) return; + const int16_t offset_val = parser.value_int(); + if (!parser.seenval('I')) return; + const int16_t idx = parser.value_int(); + const TempSensorID mod = TERN_(PTC_BED, parser.seen_test('B') ? TSI_BED :) + TERN_(PTC_HOTEND, parser.seen_test('E') ? TSI_EXT :) + TERN_(PTC_PROBE, parser.seen_test('P') ? TSI_PROBE :) TSI_COUNT; + if (mod == TSI_COUNT) + SERIAL_ECHOLNPGM("!Invalid sensor."); + else if (idx > 0 && ptc.set_offset(mod, idx - 1, offset_val)) + SERIAL_ECHOLNPGM("Set value: ", offset_val); + else + SERIAL_ECHOLNPGM("!Invalid index. Failed to set value (note: value at index 0 is constant)."); + } + else // Print current Z-probe adjustments. Note: Values in EEPROM might differ. + ptc.print_offsets(); +} + +#endif // HAS_PTC diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index fb1669c1eae7..b2cb26122fcf 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -424,7 +424,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 61: G61(); break; // G61: Apply/restore saved coordinates. #endif - #if ENABLED(PROBE_TEMP_COMPENSATION) + #if BOTH(PTC_PROBE, PTC_BED) case 76: G76(); break; // G76: Calibrate first layer compensation values #endif @@ -587,6 +587,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 191: M191(); break; // M191: Wait for chamber temperature to reach target #endif + #if HAS_TEMP_PROBE + case 192: M192(); break; // M192: Wait for probe temp + #endif + #if HAS_COOLER case 143: M143(); break; // M143: Set cooler temperature case 193: M193(); break; // M193: Wait for cooler temperature to reach target @@ -921,8 +925,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 852: M852(); break; // M852: Set Skew factors #endif - #if ENABLED(PROBE_TEMP_COMPENSATION) - case 192: M192(); break; // M192: Wait for probe temp + #if HAS_PTC case 871: M871(); break; // M871: Print/reset/clear first layer temperature offset values #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 8de15fc9c7f5..09dd53d6f65c 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -66,7 +66,7 @@ * G42 - Coordinated move to a mesh point (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BLINEAR, or AUTO_BED_LEVELING_UBL) * G60 - Save current position. (Requires SAVED_POSITIONS) * G61 - Apply/restore saved coordinates. (Requires SAVED_POSITIONS) - * G76 - Calibrate first layer temperature offsets. (Requires PROBE_TEMP_COMPENSATION) + * G76 - Calibrate first layer temperature offsets. (Requires PTC_PROBE and PTC_BED) * G80 - Cancel current motion mode (Requires GCODE_MOTION_MODES) * G90 - Use Absolute Coordinates * G91 - Use Relative Coordinates @@ -88,6 +88,8 @@ * M16 - Expected printer check. (Requires EXPECTED_PRINTER_CHECK) * M17 - Enable/Power all stepper motors * M18 - Disable all stepper motors; same as M84 + * + *** Print from Media (SDSUPPORT) *** * M20 - List SD card. (Requires SDSUPPORT) * M21 - Init SD card. (Requires SDSUPPORT) * M22 - Release SD card. (Requires SDSUPPORT) @@ -100,30 +102,36 @@ * OR, with 'C' get the current filename. * M28 - Start SD write: "M28 /path/file.gco". (Requires SDSUPPORT) * M29 - Stop SD write. (Requires SDSUPPORT) - * M30 - Delete file from SD: "M30 /path/file.gco" + * M30 - Delete file from SD: "M30 /path/file.gco" (Requires SDSUPPORT) * M31 - Report time since last M109 or SD card start to serial. * M32 - Select file and start SD print: "M32 [S] !/path/file.gco#". (Requires SDSUPPORT) * Use P to run other files as sub-programs: "M32 P !filename#" * The '#' is necessary when calling from within sd files, as it stops buffer prereading * M33 - Get the longname version of a path. (Requires LONG_FILENAME_HOST_SUPPORT) * M34 - Set SD Card sorting options. (Requires SDCARD_SORT_ALPHA) + * * M42 - Change pin status via gcode: M42 P S. LED pin assumed if P is omitted. (Requires DIRECT_PIN_CONTROL) - * M43 - Display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + * M43 - Display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins (Requires PINS_DEBUGGING) * M48 - Measure Z Probe repeatability: M48 P X Y V E L S. (Requires Z_MIN_PROBE_REPEATABILITY_TEST) + * * M73 - Set the progress percentage. (Requires LCD_SET_PROGRESS_MANUALLY) * M75 - Start the print job timer. * M76 - Pause the print job timer. * M77 - Stop the print job timer. * M78 - Show statistical information about the print jobs. (Requires PRINTCOUNTER) + * * M80 - Turn on Power Supply. (Requires PSU_CONTROL) * M81 - Turn off Power Supply. (Requires PSU_CONTROL) + * * M82 - Set E codes absolute (default). * M83 - Set E codes relative while in Absolute (G90) mode. * M84 - Disable steppers until next move, or use S to specify an idle * duration after which steppers should turn off. S0 disables the timeout. * M85 - Set inactivity shutdown timer with parameter S. To disable set zero (default) * M92 - Set planner.settings.axis_steps_per_mm for one or more axes. + * * M100 - Watch Free Memory (for debugging) (Requires M100_FREE_MEMORY_WATCHER) + * * M104 - Set extruder target temp. * M105 - Report current temperatures. * M106 - Set print fan speed. @@ -132,23 +140,29 @@ * M109 - S Wait for extruder current temp to reach target temp. ** Wait only when heating! ** * R Wait for extruder current temp to reach target temp. ** Wait for heating or cooling. ** * If AUTOTEMP is enabled, S B F. Exit autotemp by any M109 without F + * * M110 - Set the current line number. (Used by host printing) * M111 - Set debug flags: "M111 S". See flag bits defined in enum.h. * M112 - Full Shutdown. + * * M113 - Get or set the timeout interval for Host Keepalive "busy" messages. (Requires HOST_KEEPALIVE_FEATURE) * M114 - Report current position. * M115 - Report capabilities. (Extended capabilities requires EXTENDED_CAPABILITIES_REPORT) * M117 - Display a message on the controller screen. (Requires an LCD) * M118 - Display a message in the host console. + * * M119 - Report endstops status. * 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 or L6470) * M125 - Save current position and move to filament change position. (Requires PARK_HEAD_ON_PAUSE) + * * M126 - Solenoid Air Valve Open. (Requires BARICUDA) * M127 - Solenoid Air Valve Closed. (Requires BARICUDA) * M128 - EtoP Open. (Requires BARICUDA) * M129 - EtoP Closed. (Requires BARICUDA) + * * M140 - Set bed target temp. S * M141 - Set heated chamber target temp. S (Requires a chamber heater) * M143 - Set cooler target temp. S (Requires a laser cooling device) @@ -161,9 +175,9 @@ * M164 - Commit the mix and save to a virtual tool (current, or as specified by 'S'). (Requires MIXING_EXTRUDER) * M165 - Set the mix for the mixing extruder (and current virtual tool) with parameters ABCDHI. (Requires MIXING_EXTRUDER and DIRECT_MIXING_IN_G1) * M166 - Set the Gradient Mix for the mixing extruder. (Requires GRADIENT_MIX) - * M190 - S Wait for bed current temp to reach target temp. ** Wait only when heating! ** - * R Wait for bed current temp to reach target temp. ** Wait for heating or cooling. ** - * M193 - R Wait for cooler temp to reach target temp. ** Wait for cooling. ** + * M190 - Set bed target temperature and wait. R Set target temperature and wait. S Set, but only wait when heating. (Requires TEMP_SENSOR_BED) + * M192 - Wait for probe to reach target temperature. (Requires TEMP_SENSOR_PROBE) + * M193 - R Wait for cooler to reach target temp. ** Wait for cooling. ** * M200 - Set filament diameter, D, setting E axis units to cubic. (Use S0 to revert to linear units.) * M201 - Set max acceleration in units/s^2 for print moves: "M201 X Y Z E" * M202 - Set max acceleration in units/s^2 for travel moves: "M202 X Y Z E" ** UNUSED IN MARLIN! ** @@ -183,7 +197,7 @@ * M218 - Set/get a tool offset: "M218 T X Y". (Requires 2 or more extruders) * M220 - Set Feedrate Percentage: "M220 S" (i.e., "FR" on the LCD) * Use "M220 B" to back up the Feedrate Percentage and "M220 R" to restore it. (Requires an MMU_MODEL version 2 or 2S) - * M221 - Set Flow Percentage: "M221 S" + * M221 - Set Flow Percentage: "M221 S" (Requires an extruder) * M226 - Wait until a pin is in a given state: "M226 P S" (Requires DIRECT_PIN_CONTROL) * M240 - Trigger a camera to take a photograph. (Requires PHOTO_GCODE) * M250 - Set LCD contrast: "M250 C" (0-63). (Requires LCD support) @@ -230,9 +244,9 @@ * M502 - Revert to the default "factory settings". ** Does not write them to EEPROM! ** * M503 - Print the current settings (in memory): "M503 S". S0 specifies compact output. * M504 - Validate EEPROM contents. (Requires EEPROM_SETTINGS) - * M510 - Lock Printer - * M511 - Unlock Printer - * M512 - Set/Change/Remove Password + * M510 - Lock Printer (Requires PASSWORD_FEATURE) + * M511 - Unlock Printer (Requires PASSWORD_UNLOCK_GCODE) + * M512 - Set/Change/Remove Password (Requires PASSWORD_CHANGE_GCODE) * M524 - Abort the current SD print job started with M24. (Requires SDSUPPORT) * M540 - Enable/disable SD card abort on endstop hit: "M540 S". (Requires SD_ABORT_ON_ENDSTOP_HIT) * M552 - Get or set IP address. Enable/disable network interface. (Requires enabled Ethernet port) @@ -252,7 +266,9 @@ * M808 - Set or Goto a Repeat Marker (Requires GCODE_REPEAT_MARKERS) * M810-M819 - Define/execute a G-code macro (Requires GCODE_MACROS) * M851 - Set Z probe's XYZ offsets in current units. (Negative values: X=left, Y=front, Z=below) - * M852 - Set skew factors: "M852 [I] [J] [K]". (Requires SKEW_CORRECTION_GCODE, and SKEW_CORRECTION_FOR_Z for IJ) + * M852 - Set skew factors: "M852 [I] [J] [K]". (Requires SKEW_CORRECTION_GCODE, plus SKEW_CORRECTION_FOR_Z for IJ) + * + *** I2C_POSITION_ENCODERS *** * M860 - Report the position of position encoder modules. * M861 - Report the status of position encoder modules. * M862 - Perform an axis continuity test for position encoder modules. @@ -263,8 +279,8 @@ * M867 - Enable/disable or toggle error correction for position encoder modules. * M868 - Report or set position encoder module error correction threshold. * M869 - Report position encoder module error. - * M871 - Print/reset/clear first layer temperature offset values. (Requires PROBE_TEMP_COMPENSATION) - * M192 - Wait for probe temp (Requires PROBE_TEMP_COMPENSATION) + * + * 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 X, Y, Z, E. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470) @@ -282,13 +298,14 @@ * M951 - Set Magnetic Parking Extruder parameters. (Requires MAGNETIC_PARKING_EXTRUDER) * M7219 - Control Max7219 Matrix LEDs. (Requires MAX7219_GCODE) * + *** SCARA *** * M360 - SCARA calibration: Move to cal-position ThetaA (0 deg calibration) * M361 - SCARA calibration: Move to cal-position ThetaB (90 deg calibration - steps per degree) * M362 - SCARA calibration: Move to cal-position PsiA (0 deg calibration) * M363 - SCARA calibration: Move to cal-position PsiB (90 deg calibration - steps per degree) * M364 - SCARA calibration: Move to cal-position PSIC (90 deg to Theta calibration position) * - * ************ Custom codes - This can change to suit future G-code regulations + *** Custom codes (can be changed to suit future G-code standards) *** * G425 - Calibrate using a conductive object. (Requires CALIBRATION_GCODE) * M928 - Start SD logging: "M928 filename.gco". Stop with M29. (Requires SDSUPPORT) * M993 - Backup SPI Flash to SD @@ -296,10 +313,11 @@ * M995 - Touch screen calibration for TFT display * M997 - Perform in-application firmware update * M999 - Restart after being stopped by error + * * D... - Custom Development G-code. Add hooks to 'gcode_D.cpp' for developers to test features. (Requires MARLIN_DEV_MODE) * D576 - Set buffer monitoring options. (Requires BUFFER_MONITORING) * - * "T" Codes + *** "T" Codes *** * * T0-T3 - Select an extruder (tool) by index: "T F" */ @@ -551,7 +569,7 @@ class GcodeSuite { static void G59(); #endif - #if ENABLED(PROBE_TEMP_COMPENSATION) + #if BOTH(PTC_PROBE, PTC_BED) static void G76(); #endif @@ -744,6 +762,10 @@ class GcodeSuite { static void M191(); #endif + #if HAS_TEMP_PROBE + static void M192(); + #endif + #if HAS_COOLER static void M143(); static void M193(); @@ -1087,8 +1109,7 @@ class GcodeSuite { FORCE_INLINE static void M869() { I2CPEM.M869(); } #endif - #if ENABLED(PROBE_TEMP_COMPENSATION) - static void M192(); + #if HAS_PTC static void M871(); #endif diff --git a/Marlin/src/gcode/temp/M192.cpp b/Marlin/src/gcode/temp/M192.cpp new file mode 100644 index 000000000000..a96e2d34a4bf --- /dev/null +++ b/Marlin/src/gcode/temp/M192.cpp @@ -0,0 +1,56 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 . + * + */ + +/** + * M192.cpp - Wait for probe to reach temperature + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_TEMP_PROBE + +#include "../gcode.h" +#include "../../module/temperature.h" +#include "../../lcd/marlinui.h" + +/** + * M192: Wait for probe temperature sensor to reach a target + * + * Select only one of these flags: + * R - Wait for heating or cooling + * S - Wait only for heating + */ +void GcodeSuite::M192() { + if (DEBUGGING(DRYRUN)) return; + + const bool no_wait_for_cooling = parser.seenval('S'); + if (!no_wait_for_cooling && !parser.seenval('R')) { + SERIAL_ERROR_MSG("No target temperature set."); + return; + } + + const celsius_t target_temp = parser.value_celsius(); + ui.set_status(thermalManager.isProbeBelowTemp(target_temp) ? GET_TEXT_F(MSG_PROBE_HEATING) : GET_TEXT_F(MSG_PROBE_COOLING)); + thermalManager.wait_for_probe(target_temp, no_wait_for_cooling); +} + +#endif // HAS_TEMP_PROBE diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index efb9db420db8..49067a560676 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -550,6 +550,20 @@ #endif #endif +// Probe Temperature Compensation +#if !TEMP_SENSOR_PROBE + #undef PTC_PROBE +#endif +#if !TEMP_SENSOR_BED + #undef PTC_BED +#endif +#if !HAS_EXTRUDERS + #undef PTC_HOTEND +#endif +#if ANY(PTC_PROBE, PTC_BED, PTC_HOTEND) + #define HAS_PTC 1 +#endif + // Let SD_FINISHED_RELEASECOMMAND stand in for SD_FINISHED_STEPPERRELEASE #if ENABLED(SD_FINISHED_STEPPERRELEASE) #ifndef SD_FINISHED_RELEASECOMMAND diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 60238e6c8025..c8d30a27188a 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -597,6 +597,10 @@ #error "SPINDLE_LASER_PWM (true) is now set with SPINDLE_LASER_USE_PWM (enabled)." #elif ANY(IS_RAMPS_EEB, IS_RAMPS_EEF, IS_RAMPS_EFB, IS_RAMPS_EFF, IS_RAMPS_SF) #error "The IS_RAMPS_* conditionals (for heater/fan/bed pins) are now called FET_ORDER_*." +#elif defined(PROBE_TEMP_COMPENSATION) + #error "PROBE_TEMP_COMPENSATION is now set using the PTC_PROBE, PTC_BED, PTC_HOTEND options." +#elif defined(BTC_PROBE_TEMP) + #error "BTC_PROBE_TEMP is now PTC_PROBE_TEMP." #endif #if MB(DUE3DOM_MINI) && PIN_EXISTS(TEMP_2) && DISABLED(TEMP_SENSOR_BOARD) @@ -611,60 +615,60 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Probe temp compensation requirements */ - -#if ENABLED(PROBE_TEMP_COMPENSATION) - #if defined(PTC_PARK_POS_X) || defined(PTC_PARK_POS_Y) || defined(PTC_PARK_POS_Z) - #error "PTC_PARK_POS_[XYZ] is now PTC_PARK_POS (array)." - #elif !defined(PTC_PARK_POS) - #error "PROBE_TEMP_COMPENSATION requires PTC_PARK_POS." - #elif defined(PTC_PROBE_POS_X) || defined(PTC_PROBE_POS_Y) - #error "PTC_PROBE_POS_[XY] is now PTC_PROBE_POS (array)." - #elif !defined(PTC_PROBE_POS) - #error "PROBE_TEMP_COMPENSATION requires PTC_PROBE_POS." +#if HAS_PTC + #if TEMP_SENSOR_PROBE && TEMP_SENSOR_BED + #if defined(PTC_PARK_POS_X) || defined(PTC_PARK_POS_Y) || defined(PTC_PARK_POS_Z) + #error "PTC_PARK_POS_[XYZ] is now PTC_PARK_POS (array)." + #elif !defined(PTC_PARK_POS) + #error "PTC_PARK_POS is required for Probe Temperature Compensation." + #elif defined(PTC_PROBE_POS_X) || defined(PTC_PROBE_POS_Y) + #error "PTC_PROBE_POS_[XY] is now PTC_PROBE_POS (array)." + #elif !defined(PTC_PROBE_POS) + #error "PTC_PROBE_POS is required for Probe Temperature Compensation." + #endif #endif - #ifdef PTC_SAMPLE_START - constexpr auto _ptc_sample_start = PTC_SAMPLE_START; + #ifdef PTC_PROBE_START + constexpr auto _ptc_sample_start = PTC_PROBE_START; constexpr decltype(_ptc_sample_start) _test_ptc_sample_start = 12.3f; - static_assert(_test_ptc_sample_start != 12.3f, "PTC_SAMPLE_START must be a whole number."); + static_assert(_test_ptc_sample_start != 12.3f, "PTC_PROBE_START must be a whole number."); #endif - #ifdef PTC_SAMPLE_RES - constexpr auto _ptc_sample_res = PTC_SAMPLE_RES; + #ifdef PTC_PROBE_RES + constexpr auto _ptc_sample_res = PTC_PROBE_RES; constexpr decltype(_ptc_sample_res) _test_ptc_sample_res = 12.3f; - static_assert(_test_ptc_sample_res != 12.3f, "PTC_SAMPLE_RES must be a whole number."); + static_assert(_test_ptc_sample_res != 12.3f, "PTC_PROBE_RES must be a whole number."); #endif - #ifdef BTC_SAMPLE_START - constexpr auto _btc_sample_start = BTC_SAMPLE_START; + #ifdef PTC_BED_START + constexpr auto _btc_sample_start = PTC_BED_START; constexpr decltype(_btc_sample_start) _test_btc_sample_start = 12.3f; - static_assert(_test_btc_sample_start != 12.3f, "BTC_SAMPLE_START must be a whole number."); + static_assert(_test_btc_sample_start != 12.3f, "PTC_BED_START must be a whole number."); #endif - #ifdef BTC_SAMPLE_RES - constexpr auto _btc_sample_res = BTC_SAMPLE_RES; + #ifdef PTC_BED_RES + constexpr auto _btc_sample_res = PTC_BED_RES; constexpr decltype(_btc_sample_res) _test_btc_sample_res = 12.3f; - static_assert(_test_btc_sample_res != 12.3f, "BTC_SAMPLE_RES must be a whole number."); + static_assert(_test_btc_sample_res != 12.3f, "PTC_BED_RES must be a whole number."); #endif - #ifdef BTC_PROBE_TEMP - constexpr auto _btc_probe_temp = BTC_PROBE_TEMP; + #ifdef PTC_PROBE_TEMP + constexpr auto _btc_probe_temp = PTC_PROBE_TEMP; constexpr decltype(_btc_probe_temp) _test_btc_probe_temp = 12.3f; - static_assert(_test_btc_probe_temp != 12.3f, "BTC_PROBE_TEMP must be a whole number."); + static_assert(_test_btc_probe_temp != 12.3f, "PTC_PROBE_TEMP must be a whole number."); #endif - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - #ifdef ETC_SAMPLE_START - constexpr auto _etc_sample_start = ETC_SAMPLE_START; + #if ENABLED(PTC_HOTEND) + #if EXTRUDERS != 1 + #error "PTC_HOTEND only works with a single extruder." + #endif + #ifdef PTC_HOTEND_START + constexpr auto _etc_sample_start = PTC_HOTEND_START; constexpr decltype(_etc_sample_start) _test_etc_sample_start = 12.3f; - static_assert(_test_etc_sample_start != 12.3f, "ETC_SAMPLE_START must be a whole number."); + static_assert(_test_etc_sample_start != 12.3f, "PTC_HOTEND_START must be a whole number."); #endif - #ifdef ETC_SAMPLE_RES - constexpr auto _etc_sample_res = ETC_SAMPLE_RES; + #ifdef PTC_HOTEND_RES + constexpr auto _etc_sample_res = PTC_HOTEND_RES; constexpr decltype(_etc_sample_res) _test_etc_sample_res = 12.3f; - static_assert(_test_etc_sample_res != 12.3f, "ETC_SAMPLE_RES must be a whole number."); + static_assert(_test_etc_sample_res != 12.3f, "PTC_HOTEND_RES must be a whole number."); #endif #endif - - #if ENABLED(USE_TEMP_EXT_COMPENSATION) && EXTRUDERS != 1 - #error "USE_TEMP_EXT_COMPENSATION only works with a single extruder." - #endif -#endif +#endif // HAS_PTC /** * Marlin release, version and default string diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index c82f5aad0df4..01a5c47fd54e 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -128,7 +128,7 @@ #include "../feature/tmc_util.h" #endif -#if ENABLED(PROBE_TEMP_COMPENSATION) +#if HAS_PTC #include "../feature/probe_temp_comp.h" #endif @@ -264,13 +264,16 @@ typedef struct SettingsDataStruct { // // Temperature first layer compensation values // - #if ENABLED(PROBE_TEMP_COMPENSATION) - int16_t z_offsets_probe[COUNT(temp_comp.z_offsets_probe)], // M871 P I V - z_offsets_bed[COUNT(temp_comp.z_offsets_bed)] // M871 B I V - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - , z_offsets_ext[COUNT(temp_comp.z_offsets_ext)] // M871 E I V - #endif - ; + #if HAS_PTC + #if ENABLED(PTC_PROBE) + int16_t z_offsets_probe[COUNT(ptc.z_offsets_probe)]; // M871 P I V + #endif + #if ENABLED(PTC_BED) + int16_t z_offsets_bed[COUNT(ptc.z_offsets_bed)]; // M871 B I V + #endif + #if ENABLED(PTC_HOTEND) + int16_t z_offsets_hotend[COUNT(ptc.z_offsets_hotend)]; // M871 E I V + #endif #endif // @@ -844,11 +847,15 @@ void MarlinSettings::postprocess() { // // Thermal first layer compensation values // - #if ENABLED(PROBE_TEMP_COMPENSATION) - EEPROM_WRITE(temp_comp.z_offsets_probe); - EEPROM_WRITE(temp_comp.z_offsets_bed); - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - EEPROM_WRITE(temp_comp.z_offsets_ext); + #if HAS_PTC + #if ENABLED(PTC_PROBE) + EEPROM_WRITE(ptc.z_offsets_probe); + #endif + #if ENABLED(PTC_BED) + EEPROM_WRITE(ptc.z_offsets_bed); + #endif + #if ENABLED(PTC_HOTEND) + EEPROM_WRITE(ptc.z_offsets_hotend); #endif #else // No placeholder data for this feature @@ -1710,13 +1717,17 @@ void MarlinSettings::postprocess() { // // Thermal first layer compensation values // - #if ENABLED(PROBE_TEMP_COMPENSATION) - EEPROM_READ(temp_comp.z_offsets_probe); - EEPROM_READ(temp_comp.z_offsets_bed); - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - EEPROM_READ(temp_comp.z_offsets_ext); + #if HAS_PTC + #if ENABLED(PTC_PROBE) + EEPROM_READ(ptc.z_offsets_probe); #endif - temp_comp.reset_index(); + # if ENABLED(PTC_BED) + EEPROM_READ(ptc.z_offsets_bed); + #endif + #if ENABLED(PTC_HOTEND) + EEPROM_READ(ptc.z_offsets_hotend); + #endif + ptc.reset_index(); #else // No placeholder data for this feature #endif @@ -2728,6 +2739,11 @@ void MarlinSettings::reset() { // TERN_(EDITABLE_SERVO_ANGLES, COPY(servo_angles, base_servo_angles)); // When not editable only one copy of servo angles exists + // + // Probe Temperature Compensation + // + TERN_(HAS_PTC, ptc.reset()); + // // BLTOUCH // diff --git a/buildroot/tests/rambo b/buildroot/tests/rambo index a563bd4ed375..b7136e445ed6 100755 --- a/buildroot/tests/rambo +++ b/buildroot/tests/rambo @@ -18,7 +18,7 @@ opt_set MOTHERBOARD BOARD_RAMBO \ FANMUX0_PIN 53 opt_disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN USE_WATCHDOG opt_enable USE_ZMAX_PLUG REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ - FIX_MOUNTED_PROBE CODEPENDENT_XY_HOMING PIDTEMPBED PROBE_TEMP_COMPENSATION \ + FIX_MOUNTED_PROBE CODEPENDENT_XY_HOMING PIDTEMPBED PTC_PROBE PTC_BED \ PREHEAT_BEFORE_PROBING PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF WAIT_FOR_BED_HEATER \ EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \ BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ @@ -61,16 +61,16 @@ opt_disable MIN_SOFTWARE_ENDSTOP_Z MAX_SOFTWARE_ENDSTOPS exec_test $1 $2 "Rambo CNC Configuration" "$3" # -# Rambo heated bed only +# Rambo heated bed and probe temp sensor # restore_configs -opt_set MOTHERBOARD BOARD_RAMBO EXTRUDERS 0 TEMP_SENSOR_BED 1 \ +opt_set MOTHERBOARD BOARD_RAMBO EXTRUDERS 0 TEMP_SENSOR_BED 1 TEMP_SENSOR_PROBE 1 TEMP_PROBE_PIN 12 \ DEFAULT_AXIS_STEPS_PER_UNIT '{ 80, 80, 4000 }' \ DEFAULT_MAX_FEEDRATE '{ 300, 300, 5 }' \ DEFAULT_MAX_ACCELERATION '{ 3000, 3000, 100 }' \ MANUAL_FEEDRATE '{ 50*60, 50*60, 4*60 }' \ AXIS_RELATIVE_MODES '{ false, false, false }' -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER FIX_MOUNTED_PROBE Z_SAFE_HOMING exec_test $1 $2 "Rambo heated bed only" "$3" # diff --git a/ini/features.ini b/ini/features.ini index f54b645f85bb..4c146512989f 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -136,20 +136,20 @@ ADVANCED_PAUSE_FEATURE = src_filter=+ + HAS_POWER_MONITOR = src_filter=+ + POWER_LOSS_RECOVERY = src_filter=+ + -PROBE_TEMP_COMPENSATION = src_filter=+ + +HAS_PTC = src_filter=+ + HAS_FILAMENT_SENSOR = src_filter=+ + (EXT|MANUAL)_SOLENOID.* = src_filter=+ + MK2_MULTIPLEXER = src_filter=+ HAS_CUTTER = src_filter=+ + HAS_DRIVER_SAFE_POWER_PROTECT = src_filter=+ EXPERIMENTAL_I2CBUS = src_filter=+ + -MECHANICAL_GANTRY_CAL.+ = src_filter=+ -Z_MULTI_ENDSTOPS = src_filter=+ -Z_STEPPER_AUTO_ALIGN = src_filter=+ + G26_MESH_VALIDATION = src_filter=+ ASSISTED_TRAMMING = src_filter=+ + HAS_MESH = src_filter=+ HAS_LEVELING = src_filter=+ + +MECHANICAL_GANTRY_CAL.+ = src_filter=+ +Z_MULTI_ENDSTOPS|Z_STEPPER_AUTO_ALIGN = src_filter=+ +Z_STEPPER_AUTO_ALIGN = src_filter=+ DELTA_AUTO_CALIBRATION = src_filter=+ CALIBRATION_GCODE = src_filter=+ Z_MIN_PROBE_REPEATABILITY_TEST = src_filter=+ @@ -209,6 +209,7 @@ SDSUPPORT = src_filter=+ + GCODE_REPEAT_MARKERS = src_filter=+ + HAS_EXTRUDERS = src_filter=+ + + +HAS_TEMP_PROBE = src_filter=+ HAS_COOLER = src_filter=+ HAS_COOLER|LASER_COOLANT_FLOW_METER = src_filter=+ AUTO_REPORT_TEMPERATURES = src_filter=+ diff --git a/platformio.ini b/platformio.ini index 106e454d105f..a364e8920f75 100644 --- a/platformio.ini +++ b/platformio.ini @@ -152,7 +152,7 @@ default_src_filter = + - - + - - - - - + - - - - @@ -229,6 +229,7 @@ default_src_filter = + - - + - - - + - - - - From 36e475b8beccd7bcc74335cbab69c5aa6ecbf61c Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Tue, 2 Nov 2021 12:34:53 +1300 Subject: [PATCH 42/78] =?UTF-8?q?=F0=9F=A9=B9=20Fill=20gaps=20in=20pinsDeb?= =?UTF-8?q?ug=5Flist=20(#23051)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/pinsDebug_list.h | 98 ++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index f07b1cf025f7..05756d600420 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -74,6 +74,16 @@ REPORT_NAME_ANALOG(__LINE__, MAIN_VOLTAGE_MEASURE_PIN) #endif #endif +#if PIN_EXISTS(POWER_MONITOR_CURRENT) + #if ANALOG_OK(POWER_MONITOR_CURRENT_PIN) + REPORT_NAME_ANALOG(__LINE__, POWER_MONITOR_CURRENT_PIN) + #endif +#endif +#if PIN_EXISTS(POWER_MONITOR_VOLTAGE) + #if ANALOG_OK(POWER_MONITOR_VOLTAGE_PIN) + REPORT_NAME_ANALOG(__LINE__, POWER_MONITOR_VOLTAGE_PIN) + #endif +#endif #if !defined(ARDUINO_ARCH_SAM) && !defined(ARDUINO_ARCH_SAMD) // TC1 & TC2 are macros in the SAM/SAMD tool chain #if _EXISTS(TC1) #if ANALOG_OK(TC1) @@ -131,6 +141,11 @@ REPORT_NAME_ANALOG(__LINE__, TEMP_BED_PIN) #endif #endif +#if PIN_EXISTS(TEMP_BOARD) + #if ANALOG_OK(TEMP_BOARD_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_BOARD_PIN) + #endif +#endif #if PIN_EXISTS(TEMP_CHAMBER) #if ANALOG_OK(TEMP_CHAMBER_PIN) REPORT_NAME_ANALOG(__LINE__, TEMP_CHAMBER_PIN) @@ -141,6 +156,11 @@ REPORT_NAME_ANALOG(__LINE__, TEMP_COOLER_PIN) #endif #endif +#if PIN_EXISTS(TEMP_PROBE) + #if ANALOG_OK(TEMP_PROBE_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_PROBE_PIN) + #endif +#endif #if PIN_EXISTS(ADC_KEYPAD) #if ANALOG_OK(ADC_KEYPAD_PIN) REPORT_NAME_ANALOG(__LINE__, ADC_KEYPAD_PIN) @@ -370,6 +390,9 @@ #if PIN_EXISTS(DIGIPOTSS) REPORT_NAME_DIGITAL(__LINE__, DIGIPOTSS_PIN) #endif +#if PIN_EXISTS(LCD_RESET) + REPORT_NAME_DIGITAL(__LINE__, LCD_RESET_PIN) +#endif #if _EXISTS(DOGLCD_A0) REPORT_NAME_DIGITAL(__LINE__, DOGLCD_A0) #endif @@ -433,6 +456,9 @@ #if PIN_EXISTS(E0_STEP) REPORT_NAME_DIGITAL(__LINE__, E0_STEP_PIN) #endif +#if PIN_EXISTS(E0_STDBY) + REPORT_NAME_DIGITAL(__LINE__, E0_STDBY_PIN) +#endif #if PIN_EXISTS(E1_AUTO_FAN) REPORT_NAME_DIGITAL(__LINE__, E1_AUTO_FAN_PIN) #endif @@ -457,6 +483,9 @@ #if PIN_EXISTS(E1_STEP) REPORT_NAME_DIGITAL(__LINE__, E1_STEP_PIN) #endif +#if PIN_EXISTS(E1_STDBY) + REPORT_NAME_DIGITAL(__LINE__, E1_STDBY_PIN) +#endif #if PIN_EXISTS(E2_AUTO_FAN) REPORT_NAME_DIGITAL(__LINE__, E2_AUTO_FAN_PIN) #endif @@ -481,6 +510,9 @@ #if PIN_EXISTS(E2_STEP) REPORT_NAME_DIGITAL(__LINE__, E2_STEP_PIN) #endif +#if PIN_EXISTS(E2_STDBY) + REPORT_NAME_DIGITAL(__LINE__, E2_STDBY_PIN) +#endif #if PIN_EXISTS(E3_AUTO_FAN) REPORT_NAME_DIGITAL(__LINE__, E3_AUTO_FAN_PIN) #endif @@ -505,6 +537,9 @@ #if PIN_EXISTS(E3_STEP) REPORT_NAME_DIGITAL(__LINE__, E3_STEP_PIN) #endif +#if PIN_EXISTS(E3_STDBY) + REPORT_NAME_DIGITAL(__LINE__, E3_STDBY_PIN) +#endif #if PIN_EXISTS(E4_AUTO_FAN) REPORT_NAME_DIGITAL(__LINE__, E4_AUTO_FAN_PIN) #endif @@ -529,6 +564,9 @@ #if PIN_EXISTS(E4_STEP) REPORT_NAME_DIGITAL(__LINE__, E4_STEP_PIN) #endif +#if PIN_EXISTS(E4_STDBY) + REPORT_NAME_DIGITAL(__LINE__, E4_STDBY_PIN) +#endif #if PIN_EXISTS(E5_AUTO_FAN) REPORT_NAME_DIGITAL(__LINE__, E5_AUTO_FAN_PIN) #endif @@ -553,6 +591,9 @@ #if PIN_EXISTS(E5_STEP) REPORT_NAME_DIGITAL(__LINE__, E5_STEP_PIN) #endif +#if PIN_EXISTS(E5_STDBY) + REPORT_NAME_DIGITAL(__LINE__, E5_STDBY_PIN) +#endif #if PIN_EXISTS(E6_AUTO_FAN) REPORT_NAME_DIGITAL(__LINE__, E6_AUTO_FAN_PIN) #endif @@ -577,6 +618,9 @@ #if PIN_EXISTS(E6_STEP) REPORT_NAME_DIGITAL(__LINE__, E6_STEP_PIN) #endif +#if PIN_EXISTS(E6_STDBY) + REPORT_NAME_DIGITAL(__LINE__, E6_STDBY_PIN) +#endif #if PIN_EXISTS(E7_AUTO_FAN) REPORT_NAME_DIGITAL(__LINE__, E7_AUTO_FAN_PIN) #endif @@ -601,6 +645,9 @@ #if PIN_EXISTS(E7_STEP) REPORT_NAME_DIGITAL(__LINE__, E7_STEP_PIN) #endif +#if PIN_EXISTS(E7_STDBY) + REPORT_NAME_DIGITAL(__LINE__, E7_STDBY_PIN) +#endif #if _EXISTS(ENET_CRS) REPORT_NAME_DIGITAL(__LINE__, ENET_CRS) #endif @@ -704,6 +751,9 @@ #if PIN_EXISTS(POWER_LOSS) REPORT_NAME_DIGITAL(__LINE__, POWER_LOSS_PIN) #endif +#if PIN_EXISTS(SAFE_POWER) + REPORT_NAME_DIGITAL(__LINE__, SAFE_POWER_PIN) +#endif #if PIN_EXISTS(FIL_RUNOUT) REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT_PIN) #endif @@ -806,6 +856,15 @@ #if PIN_EXISTS(LED) REPORT_NAME_DIGITAL(__LINE__, LED_PIN) #endif +#if PIN_EXISTS(LED2) + REPORT_NAME_DIGITAL(__LINE__, LED2_PIN) +#endif +#if PIN_EXISTS(LED3) + REPORT_NAME_DIGITAL(__LINE__, LED3_PIN) +#endif +#if PIN_EXISTS(LED4) + REPORT_NAME_DIGITAL(__LINE__, LED4_PIN) +#endif #if PIN_EXISTS(LED_RED) REPORT_NAME_DIGITAL(__LINE__, LED_RED_PIN) #endif @@ -870,6 +929,12 @@ #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_E_PIN) #endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_E0) + REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_E0_PIN) +#endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_E1) + REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_E1_PIN) +#endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_X) REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_X_PIN) #endif @@ -1146,6 +1211,9 @@ #if PIN_EXISTS(X_STEP) REPORT_NAME_DIGITAL(__LINE__, X_STEP_PIN) #endif +#if PIN_EXISTS(X_STDBY) + REPORT_NAME_DIGITAL(__LINE__, X_STDBY_PIN) +#endif #if PIN_EXISTS(X_STOP) REPORT_NAME_DIGITAL(__LINE__, X_STOP_PIN) #endif @@ -1209,6 +1277,9 @@ #if PIN_EXISTS(Y_STEP) REPORT_NAME_DIGITAL(__LINE__, Y_STEP_PIN) #endif +#if PIN_EXISTS(Y_STDBY) + REPORT_NAME_DIGITAL(__LINE__, Y_STDBY_PIN) +#endif #if PIN_EXISTS(Y_STOP) REPORT_NAME_DIGITAL(__LINE__, Y_STOP_PIN) #endif @@ -1272,6 +1343,9 @@ #if PIN_EXISTS(Z_STEP) REPORT_NAME_DIGITAL(__LINE__, Z_STEP_PIN) #endif +#if PIN_EXISTS(Z_STDBY) + REPORT_NAME_DIGITAL(__LINE__, Z_STDBY_PIN) +#endif #if PIN_EXISTS(Z_STOP) REPORT_NAME_DIGITAL(__LINE__, Z_STOP_PIN) #endif @@ -1290,6 +1364,9 @@ #if PIN_EXISTS(Z2_MIN) REPORT_NAME_DIGITAL(__LINE__, Z2_MIN_PIN) #endif +#if PIN_EXISTS(Z2_DIAG) + REPORT_NAME_DIGITAL(__LINE__, Z2_DIAG_PIN) +#endif #if PIN_EXISTS(Z2_MS1) REPORT_NAME_DIGITAL(__LINE__, Z2_MS1_PIN) #endif @@ -1302,6 +1379,9 @@ #if PIN_EXISTS(Z2_STEP) REPORT_NAME_DIGITAL(__LINE__, Z2_STEP_PIN) #endif +#if PIN_EXISTS(Z2_STOP) + REPORT_NAME_DIGITAL(__LINE__, Z2_STOP_PIN) +#endif #if PIN_EXISTS(Z3_CS) REPORT_NAME_DIGITAL(__LINE__, Z3_CS_PIN) #endif @@ -1584,6 +1664,24 @@ #if PIN_EXISTS(E7_SERIAL_RX) REPORT_NAME_DIGITAL(__LINE__, E7_SERIAL_RX_PIN) #endif +#if PIN_EXISTS(I_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, I_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(I_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, I_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(J_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, J_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(J_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, J_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(K_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, K_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(K_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, K_SERIAL_RX_PIN) +#endif #if PIN_EXISTS(L6470_CHAIN_SCK) REPORT_NAME_DIGITAL(__LINE__, L6470_CHAIN_SCK_PIN) #endif From 40477e031f16c2ecde535bc4ddae65c986060c9a Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Tue, 2 Nov 2021 12:36:22 +1300 Subject: [PATCH 43/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20Y=5FSERIAL=5FRX=5FPI?= =?UTF-8?q?N=20for=20FYSETC=20S6=20(#23055)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index e2454b578dd0..37a48cab7fdc 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -128,7 +128,7 @@ #define Y_SERIAL_TX_PIN PE14 #endif #ifndef Y_SERIAL_RX_PIN - #define Y_SERIAL_RX_PIN PE13 + #define Y_SERIAL_RX_PIN PC4 #endif #ifndef Z_SERIAL_TX_PIN #define Z_SERIAL_TX_PIN PD11 From 6af344c19329b51307d38463c4912651ac1dcdaa Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 2 Nov 2021 01:02:55 +0000 Subject: [PATCH 44/78] [cron] Bump distribution date (2021-11-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 1eb431186e8f..607561a87dd4 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 "2021-11-01" +//#define STRING_DISTRIBUTION_DATE "2021-11-02" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index aef8d8b60b53..c0dbd45fa2dd 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 "2021-11-01" + #define STRING_DISTRIBUTION_DATE "2021-11-02" #endif /** From 7942f71d26b58630a841f2de2d4f2abaa4120395 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Mon, 1 Nov 2021 20:23:24 -0700 Subject: [PATCH 45/78] =?UTF-8?q?=E2=9C=A8=20Artillery=20Ruby=20(STM32F401?= =?UTF-8?q?RCT6)=20(#23029)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/STM32/HAL.cpp | 2 +- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h | 182 +++++++ .../boards/marlin_Artillery_Ruby.json | 60 +++ .../scripts/STM32F103RC_MEEB_3DP.py | 18 - .../PlatformIO/scripts/STM32F103RC_fysetc.py | 1 - .../MARLIN_ARTILLERY_RUBY/PeripheralPins.c | 247 +++++++++ .../MARLIN_ARTILLERY_RUBY/PinNamesVar.h | 33 ++ .../MARLIN_ARTILLERY_RUBY/hal_conf_custom.h | 496 ++++++++++++++++++ .../MARLIN_ARTILLERY_RUBY/ldscript.ld | 196 +++++++ .../MARLIN_ARTILLERY_RUBY/variant.cpp | 172 ++++++ .../variants/MARLIN_ARTILLERY_RUBY/variant.h | 148 ++++++ ini/stm32f4.ini | 14 + 14 files changed, 1552 insertions(+), 20 deletions(-) create mode 100644 Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h create mode 100644 buildroot/share/PlatformIO/boards/marlin_Artillery_Ruby.json create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/hal_conf_custom.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/ldscript.ld create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/variant.h diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index a04a24c1123c..0920a72ec1bc 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -154,7 +154,7 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRe uint16_t HAL_adc_get_result() { return HAL_adc_result; } // Reset the system to initiate a firmware flash -void flashFirmware(const int16_t) { HAL_reboot(); } +WEAK void flashFirmware(const int16_t) { HAL_reboot(); } // Maple Compatibility volatile uint32_t systick_uptime_millis = 0; diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 2341e6577b60..789512c4ef71 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -406,6 +406,7 @@ #define BOARD_INDEX_REV03 4234 // Index PnP Controller REV03 (STM32F407VET6/VGT6) #define BOARD_MKS_ROBIN_NANO_V1_3_F4 4235 // MKS Robin Nano V1.3 and MKS Robin Nano-S V1.3 (STM32F407VET6) #define BOARD_MKS_EAGLE 4236 // MKS Eagle (STM32F407VET6) +#define BOARD_ARTILLERY_RUBY 4237 // Artillery Ruby (STM32F401RCT6) // // ARM Cortex M7 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 40bbe6b41bee..369a78be7add 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -667,6 +667,8 @@ #include "stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h" // STM32F4 env:mks_robin_nano_v1_3_f4 #elif MB(MKS_EAGLE) #include "stm32f4/pins_MKS_EAGLE.h" // STM32F4 env:mks_eagle +#elif MB(ARTILLERY_RUBY) + #include "stm32f4/pins_ARTILLERY_RUBY.h" // STM32F4 env:Artillery_Ruby // // ARM Cortex M7 diff --git a/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h b/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h new file mode 100644 index 000000000000..4cf9768fbe80 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h @@ -0,0 +1,182 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "Artillery Ruby supports up to 1 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "Artillery Ruby" + +#define FLASH_EEPROM_EMULATION +//#define I2C_EEPROM +//#define E2END 0xFFF // 4KB + +#define HAL_TIMER_RATE F_CPU + +// +// Limit Switches +// +#if (X_HOME_DIR == 1) + #define X_MIN_PIN -1 + #define X_MAX_PIN PA2 +#else + #define X_MIN_PIN PA2 + #define X_MAX_PIN -1 +#endif +#if (Y_HOME_DIR == 1) + #define Y_MIN_PIN -1 + #define Y_MAX_PIN PA1 +#else + #define Y_MIN_PIN PA1 + #define Y_MAX_PIN -1 +#endif +#if (Z_HOME_DIR == 1) + #define Z_MIN_PIN PC2 + #define Z_MAX_PIN PA0 +#else + #define Z_MIN_PIN PA0 + #define Z_MAX_PIN PC2 +#endif + +// +// Steppers +// +#define X_STEP_PIN PB14 +#define X_DIR_PIN PB13 +#define X_ENABLE_PIN PB15 + +#define Y_STEP_PIN PB10 +#define Y_DIR_PIN PB2 +#define Y_ENABLE_PIN PB12 + +#define Z_STEP_PIN PB0 +#define Z_DIR_PIN PC5 +#define Z_ENABLE_PIN PB1 + +#define E0_STEP_PIN PA7 +#define E0_DIR_PIN PA6 +#define E0_ENABLE_PIN PC4 + +#define E1_STEP_PIN PA4 +#define E1_DIR_PIN PA3 +#define E1_ENABLE_PIN PA5 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC0 +#define TEMP_BED_PIN PC1 + +// +// Heaters / Fans +// +#ifndef HEATER_0_PIN + #define HEATER_0_PIN PC9 // Heater0 +#endif +#ifndef HEATER_BED_PIN + #define HEATER_BED_PIN PA8 // Hotbed +#endif +#ifndef FAN_PIN + #define FAN_PIN PC8 // Fan0 +#endif +#ifndef FAN1_PIN + #define FAN1_PIN PC7 // Fan1 +#endif +#ifndef FAN2_PIN + #define FAN2_PIN PC6 // Fan2 +#endif + +// +// Servos +// +#define SERVO0_PIN PC3 + +// +// SPI +// +#define SCK_PIN PC10 +#define MISO_PIN PC11 +#define MOSI_PIN PC12 + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #define LCD_PINS_DC PB8 // Set as output on init + #define LCD_PINS_RS PB9 // Pull low for 1s to init + // DOGM SPI LCD Support + #define DOGLCD_CS PC15 + #define DOGLCD_MOSI PB6 + #define DOGLCD_SCK PB5 + #define DOGLCD_A0 LCD_PINS_DC + #elif ENABLED(FYSETC_MINI_12864) + #define DOGLCD_CS PB6 + #define DOGLCD_A0 PC15 + + //#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems + // results in LCD soft SPI mode 3, SD soft SPI mode 0 + + #define LCD_RESET_PIN PB5 // Must be high or open for LCD to operate normally. + + #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN PB9 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PB8 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PB7 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN PB9 + #endif + + #define DEFAULT_LCD_CONTRAST 255 + #else + #define LCD_PINS_RS PC15 + #define LCD_PINS_ENABLE PB6 + #define LCD_PINS_D4 PB5 + #define LCD_PINS_D5 PB9 + #define LCD_PINS_D6 PB8 + #endif + + #define LCD_PINS_D7 PB7 + + // + // Beeper, SD Card, Encoder + // + #define BEEPER_PIN PC13 + + #if ENABLED(SDSUPPORT) + #define SDSS PA15 + #define SD_DETECT_PIN PD2 + #endif + + #define BTN_EN1 PB4 + #define BTN_EN2 PB3 + #define BTN_ENC PC14 +#endif diff --git a/buildroot/share/PlatformIO/boards/marlin_Artillery_Ruby.json b/buildroot/share/PlatformIO/boards/marlin_Artillery_Ruby.json new file mode 100644 index 000000000000..e1c8333800cd --- /dev/null +++ b/buildroot/share/PlatformIO/boards/marlin_Artillery_Ruby.json @@ -0,0 +1,60 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F401xx", + "f_cpu": "84000000L", + "hwids": [ + [ + "0x0483", + "0xDF11" + ] + ], + "mcu": "stm32f401rct6", + "variant": "MARLIN_ARTILLERY_RUBY" + }, + "debug": { + "jlink_device": "STM32F401RC", + "openocd_target": "stm32f4x", + "svd_path": "STM32F40x.svd", + "tools": { + "stlink": { + "server": { + "arguments": [ + "-f", + "scripts/interface/stlink.cfg", + "-c", + "transport select hla_swd", + "-f", + "scripts/target/stm32f4x.cfg", + "-c", + "reset_config none" + ], + "executable": "bin/openocd", + "package": "tool-openocd" + } + } + } + }, + "frameworks": [ + "arduino", + "stm32cube" + ], + "name": "STM32F401RC (64k RAM. 256k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 65536, + "maximum_size": 262144, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "https://www.st.com/en/evaluation-tools/steval-3dp001v1.html", + "vendor": "Generic" +} diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py index 03e121c435d3..e059d445789c 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py @@ -8,37 +8,19 @@ import os Import("env", "projenv") -# access to global build environment -print(env) -# access to project build environment (is used source files in "src" folder) -print(projenv) config = configparser.ConfigParser() config.read("platformio.ini") -#com_port = config.get("env:STM32F103RC_meeb", "upload_port") -#print('Use the {0:s} to reboot the board to dfu mode.'.format(com_port)) - # # Upload actions # - def before_upload(source, target, env): - print("before_upload") - # do some actions - # use com_port - # env.Execute("pwd") def after_upload(source, target, env): - print("after_upload") - # do some actions - # - # env.Execute("pwd") -print("Current build targets", map(str, BUILD_TARGETS)) - env.AddPreAction("upload", before_upload) env.AddPostAction("upload", after_upload) diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py index 668475dc010a..07f6548b18d9 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py @@ -1,7 +1,6 @@ # # buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py # -import os from os.path import join from os.path import expandvars Import("env") diff --git a/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/PeripheralPins.c new file mode 100644 index 000000000000..b2783d8c314e --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/PeripheralPins.c @@ -0,0 +1,247 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + * Automatically generated from STM32F401R(B-C)Tx.xml + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Note: Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + {NC, NP, 0} +}; +#endif + +//*** No DAC *** + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)}, + {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)}, + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SCL[] = { + {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +WEAK const PinMap PinMap_PWM[] = { + {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_TX[] = { + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PA_11, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PA_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {NC, NP, 0} +}; +#endif + +//*** No CAN *** + +//*** No ETHERNET *** + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB_OTG_FS[] = { + {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID + {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM + {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP + {NC, NP, 0} +}; +#endif + +//*** No USB_OTG_HS *** + +//*** SD *** + +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 + {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/PinNamesVar.h new file mode 100644 index 000000000000..3082f8842ab3 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/PinNamesVar.h @@ -0,0 +1,33 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 +SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 +SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 +SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 +SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 +SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 +SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 +SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 +SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON +USB_OTG_FS_SOF = PA_8, +USB_OTG_FS_VBUS = PA_9, +USB_OTG_FS_ID = PA_10, +USB_OTG_FS_DM = PA_11, +USB_OTG_FS_DP = PA_12, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/hal_conf_custom.h new file mode 100644 index 000000000000..9fa98807d68e --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/hal_conf_custom.h @@ -0,0 +1,496 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_CUSTOM +#define __STM32F4xx_HAL_CONF_CUSTOM + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ + /** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +/* #define HAL_CAN_MODULE_ENABLED */ +/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +//#define HAL_DAC_MODULE_ENABLED +/* #define HAL_DCMI_MODULE_ENABLED */ +#define HAL_DMA_MODULE_ENABLED +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +#define HAL_FLASH_MODULE_ENABLED +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +#define HAL_PWR_MODULE_ENABLED +/* #define HAL_QSPI_MODULE_ENABLED */ +#define HAL_RCC_MODULE_ENABLED +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SAI_MODULE_ENABLED */ +/* #define HAL_SD_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +/* #define HAL_UART_MODULE_ENABLED */ +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +#define HAL_CORTEX_MODULE_ENABLED +#ifndef HAL_PCD_MODULE_ENABLED + #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) +#endif +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_MMC_MODULE_ENABLED */ + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#ifndef HSE_VALUE +#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#ifndef HSE_STARTUP_TIMEOUT +#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#ifndef HSI_VALUE +#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#ifndef LSI_VALUE +#define LSI_VALUE 32000U /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz +The real value may vary depending on the variations +in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#ifndef LSE_VALUE +#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#ifndef LSE_STARTUP_TIMEOUT +#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#ifndef EXTERNAL_CLOCK_VALUE +#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#if !defined (VDD_VALUE) +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#endif +#if !defined (TICK_INT_PRIORITY) +#define TICK_INT_PRIORITY 0x00U /*!< tick interrupt priority */ +#endif +#if !defined (USE_RTOS) +#define USE_RTOS 0U +#endif +#if !defined (PREFETCH_ENABLE) +#define PREFETCH_ENABLE 1U +#endif +#if !defined (INSTRUCTION_CACHE_ENABLE) +#define INSTRUCTION_CACHE_ENABLE 1U +#endif +#if !defined (DATA_CACHE_ENABLE) +#define DATA_CACHE_ENABLE 1U +#endif + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY 0x000000FFU +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY 0x00000FFFU + +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ +#ifndef USE_SPI_CRC +#define USE_SPI_CRC 0U +#endif + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED +#include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED +#include "stm32f4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED +#include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED +#include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED +#include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED +#include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED +#include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED +#include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED +#include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED +#include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED +#include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED +#include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_CUSTOM_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/ldscript.ld new file mode 100644 index 000000000000..57c01c8df8fc --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/ldscript.ld @@ -0,0 +1,196 @@ +/* +***************************************************************************** +** +** File : ldscript.ld +** +** Abstract : Linker script for STM32F401RETx Device with +** 512KByte FLASH, 96KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2014 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +BOOT (rx) : ORIGIN = 0x08000000, LENGTH = 16K +EMULATED_EEPROM (rx) : ORIGIN = 0x08004000, LENGTH = 16K +FLASH (rx) : ORIGIN = 0x08008000, LENGTH = 256K - 16K * 2 +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >BOOT + + .boot : + { + . = ALIGN(4); + *(.text.Reset_Handler) + . = ALIGN(4); + } >BOOT + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM + + + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + + diff --git a/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/variant.cpp new file mode 100644 index 000000000000..8f24d68e2f9a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/variant.cpp @@ -0,0 +1,172 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library 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 2.1 of the License, or (at your option) any later version. + + This library 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 library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Pin number +const PinName digitalPin[] = { + PA_0, //D0 + PA_1, //D1 + PA_2, //D2 + PA_3, //D3 + PA_4, //D4 + PA_5, //D5 + PA_6, //D6 + PA_7, //D7 + PA_8, //D8 + PA_9, //D9 + PA_10, //D10 + PA_11, //D11 + PA_12, //D12 + PA_13, //D13 + PA_14, //D14 + PA_15, //D15 + PB_0, //D16 + PB_1, //D17 + PB_2, //D18 + PB_3, //D19 + PB_4, //D20 + PB_5, //D21 + PB_6, //D22 + PB_7, //D23 + PB_8, //D24 + PB_9, //D25 + PB_10, //D26 + PB_12, //D27 + PB_13, //D28 + PB_14, //D29 + PB_15, //D30 + PC_0, //D31 + PC_1, //D32 + PC_2, //D33 + PC_3, //D34 + PC_4, //D35 + PC_5, //D36 + PC_6, //D37 + PC_7, //D38 + PC_8, //D39 + PC_9, //D40 + PC_10, //D41 + PC_11, //D42 + PC_12, //D43 + PC_13, //D44 + PC_14, //D45 + PC_15, //D46 + PD_2, //D47 + PH_0, //D48 + PH_1, //D49 + + //Duplicated ADC Pins + PA_0, //D50/A0 + PA_1, //D51/A1 + PA_2, //D52/A2 + PA_3, //D53/A3 + PA_4, //D54/A4 + PA_5, //D55/A5 + PA_6, //D56/A6 + PA_7, //D57/A7 + PB_0, //D58/A8 + PB_1, //D59/A9 + PC_0, //D60/A10 + PC_1, //D61/A11 + PC_2, //D62/A12 + PC_3, //D63/A13 + PC_4, //D64/A14 + PC_5 //D65/A15 +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @brief System Clock Configuration + * The system Clock is configured as follow : + * System Clock source = PLL (HSE) + * SYSCLK(Hz) = 84000000 + * HCLK(Hz) = 84000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 2 + * APB2 Prescaler = 1 + * HSE Frequency(Hz) = 8000000 + * PLL_M = 8 + * PLL_N = 336 + * PLL_P = 4 + * PLL_Q = 7 + * VDD(V) = 3.3 + * Main regulator output voltage = Scale2 mode + * Flash Latency(WS) = 2 + * @param None + * @retval None + */ +WEAK void SystemClock_Config(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + + /* Enable Power Control clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); + + /* Enable HSI Oscillator and activate PLL with HSI as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + /* Initialization Error */ + while (1); + } + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 + clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { + /* Initialization Error */ + while (1); + } +} + +#ifdef __cplusplus +} +#endif + +void flashFirmware(const int16_t) { + *((unsigned long *)0x2000FFF0) = 0xDEADBEEF; // End of RAM + NVIC_SystemReset(); +} diff --git a/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/variant.h new file mode 100644 index 000000000000..0c66ae89b88a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_ARTILLERY_RUBY/variant.h @@ -0,0 +1,148 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library 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 2.1 of the License, or (at your option) any later version. + + This library 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 library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + + +#define PA0 0 //D0 +#define PA1 1 //D1 +#define PA2 2 //D2 +#define PA3 3 //D3 +#define PA4 4 //D4 +#define PA5 5 //D5 +#define PA6 6 //D6 +#define PA7 7 //D7 +#define PA8 8 //D8 +#define PA9 9 //D9 +#define PA10 10 //D10 +#define PA11 11 //D11 +#define PA12 12 //D12 +#define PA13 13 //D13 +#define PA14 14 //D14 +#define PA15 15 //D15 +#define PB0 16 //D16 +#define PB1 17 //D17 +#define PB2 18 //D18 +#define PB3 19 //D19 +#define PB4 20 //D20 +#define PB5 21 //D21 +#define PB6 22 //D22 +#define PB7 23 //D23 +#define PB8 24 //D24 +#define PB9 25 //D25 +#define PB10 26 //D26 +#define PB12 27 //D27 +#define PB13 28 //D28 +#define PB14 29 //D29 +#define PB15 30 //D30 +#define PC0 31 //D31 +#define PC1 32 //D32 +#define PC2 33 //D33 +#define PC3 34 //D34 +#define PC4 35 //D35 +#define PC5 36 //D36 +#define PC6 37 //D37 +#define PC7 38 //D38 +#define PC8 39 //D39 +#define PC9 40 //D40 +#define PC10 41 //D41 +#define PC11 42 //D42 +#define PC12 43 //D43 +#define PC13 44 //D44 +#define PC14 45 //D45 +#define PC15 46 //D46 +#define PD2 47 //D47 +#define PH0 48 //D48 +#define PH1 49 //D49 + +// This must be a literal +#define NUM_DIGITAL_PINS 66 +// This must be a literal with a value less than or equal to to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 16 +#define NUM_ANALOG_FIRST 50 + +/* +// PWM resolution +#define PWM_RESOLUTION 8 +#define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans +#define PWM_MAX_DUTY_CYCLE 255 +*/ + +// SPI Definitions +#define PIN_SPI_MOSI PC12 +#define PIN_SPI_MISO PC11 +#define PIN_SPI_SCK PC10 +#define PIN_SPI_SS PA15 + +// Timer Definitions +// TIM1 - Hardware PWM (HB) +// TIM2 - TIMER_SERVO +// TIM3 - Hardware PWM (FAN0/1/2, HE0) +// TIM4 - Hardware PWM (LED_R/G/B) +// TIM5 - TIMER_TONE +// TIM9 - STEP_TIMER +// TIM10 - TEMP_TIMER +// TIM11 - +#define TIMER_SERVO TIM2 +#define TIMER_TONE TIM5 + +// UART Definitions +#define SERIAL_UART_INSTANCE 1 + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_HARDWARE Serial +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index 850807585ff3..0e9b507c8b22 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -564,3 +564,17 @@ build_unflags = ${stm32_variant.build_unflags} -DUSBCON -DUSBD_USE_CDC debug_tool = jlink upload_protocol = jlink + +# +# Artillery Ruby +# +[env:Artillery_Ruby] +platform = ${common_stm32.platform} +extends = common_stm32 +board = marlin_Artillery_Ruby +build_flags = ${common_stm32.build_flags} + -DSTM32F401xC -DTARGET_STM32F4 -DDISABLE_GENERIC_SERIALUSB -DARDUINO_ARCH_STM32 + -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS + -DUSB_PRODUCT=\"Artillery_3D_Printer\" +extra_scripts = ${common_stm32.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py From 498937967482faf7b299c2119c258c8ce7090ce9 Mon Sep 17 00:00:00 2001 From: Robby Candra Date: Tue, 2 Nov 2021 10:29:23 +0700 Subject: [PATCH 46/78] =?UTF-8?q?=F0=9F=8E=A8=20Fix=20redefine=20warnings?= =?UTF-8?q?=20(#23061)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/pins_postprocess.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/pins_postprocess.h b/Marlin/src/pins/pins_postprocess.h index a2fe2b9af3a4..d1047db0d7ce 100644 --- a/Marlin/src/pins/pins_postprocess.h +++ b/Marlin/src/pins/pins_postprocess.h @@ -1260,22 +1260,22 @@ // Disable unused endstop / probe pins // #define _STOP_IN_USE(N) (X2_USE_ENDSTOP == N || Y2_USE_ENDSTOP == N || Z2_USE_ENDSTOP == N || Z3_USE_ENDSTOP == N || Z4_USE_ENDSTOP == N) -#if _STOP_IN_USE(_XMAX_) +#if !defined(USE_XMAX_PLUG) && _STOP_IN_USE(_XMAX_) #define USE_XMAX_PLUG #endif -#if _STOP_IN_USE(_YMAX_) +#if !defined(USE_YMAX_PLUG) && _STOP_IN_USE(_YMAX_) #define USE_YMAX_PLUG #endif -#if _STOP_IN_USE(_ZMAX_) +#if !defined(USE_ZMAX_PLUG) && _STOP_IN_USE(_ZMAX_) #define USE_ZMAX_PLUG #endif -#if _STOP_IN_USE(_XMIN_) +#if !defined(USE_XMIN_PLUG) && _STOP_IN_USE(_XMIN_) #define USE_XMIN_PLUG #endif -#if _STOP_IN_USE(_YMIN_) +#if !defined(USE_YMIN_PLUG) && _STOP_IN_USE(_YMIN_) #define USE_YMIN_PLUG #endif -#if _STOP_IN_USE(_ZMIN_) +#if !defined(USE_ZMIN_PLUG) && _STOP_IN_USE(_ZMIN_) #define USE_ZMIN_PLUG #endif #undef _STOP_IN_USE From a57355ee06e59fb3d89ab56f8749eb5549efbee3 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Mon, 1 Nov 2021 21:23:54 -0700 Subject: [PATCH 47/78] =?UTF-8?q?=E2=9C=A8=20Allow=20Low=20EJERK=20with=20?= =?UTF-8?q?LA,=20optional=20(#23054)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 1 + Marlin/src/inc/SanityCheck.h | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index aa6fffd44ec9..934ceceafd20 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1913,6 +1913,7 @@ #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed //#define LA_DEBUG // If enabled, this will generate debug information output over USB. //#define EXPERIMENTAL_SCURVE // Enable this option to permit S-Curve Acceleration + //#define ALLOW_LOW_EJERK // Allow a DEFAULT_EJERK value of <10. Recommended for direct drive hotends. #endif // @section leveling diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index c8d30a27188a..b4eaf242b707 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1246,8 +1246,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "LIN_ADVANCE and S_CURVE_ACCELERATION may not play well together! Enable EXPERIMENTAL_SCURVE to continue." #elif ENABLED(DIRECT_STEPPING) #error "DIRECT_STEPPING is incompatible with LIN_ADVANCE. Enable in external planner if possible." - #elif !HAS_JUNCTION_DEVIATION && defined(DEFAULT_EJERK) - static_assert(DEFAULT_EJERK >= 10, "It is strongly recommended to set DEFAULT_EJERK >= 10 when using LIN_ADVANCE."); + #elif NONE(HAS_JUNCTION_DEVIATION, ALLOW_LOW_EJERK) && defined(DEFAULT_EJERK) + static_assert(DEFAULT_EJERK >= 10, "It is strongly recommended to set DEFAULT_EJERK >= 10 when using LIN_ADVANCE. Enable ALLOW_LOW_EJERK to bypass this alert (e.g., for direct drive)."); #endif #endif From 767a15d468ab6859eec19600541ad21dff757d1a Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Mon, 1 Nov 2021 22:43:40 -0700 Subject: [PATCH 48/78] =?UTF-8?q?=F0=9F=94=A7=20Endstop=20/=20DIAG=20homin?= =?UTF-8?q?g=20conflict=20warning=20(#23050)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/gcode.h | 2 +- Marlin/src/inc/Warnings.cpp | 9 +++++++++ Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 4 +++- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 2 ++ Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 2 ++ Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 2 ++ Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 2 ++ Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h | 2 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 5 +++-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 1 + Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 8 +++++--- Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h | 2 ++ Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 9 ++++----- Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h | 6 +++--- Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h | 5 +++-- Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h | 3 +-- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 3 +-- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 3 +-- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 3 +-- Marlin/src/pins/stm32f4/pins_MKS_MONSTER8.h | 4 ++-- Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 6 ++---- Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3_common.h | 3 +-- Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 3 +-- Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX.h | 3 +-- 24 files changed, 55 insertions(+), 37 deletions(-) diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 09dd53d6f65c..d7bacaef32a8 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -1130,7 +1130,7 @@ class GcodeSuite { static void M913(); static void M913_report(const bool forReplay=true); #endif - #if ENABLED(USE_SENSORLESS) + #if USE_SENSORLESS static void M914(); static void M914_report(const bool forReplay=true); #endif diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index d258aefd82f7..251094901051 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -488,3 +488,12 @@ #if HOMING_Z_WITH_PROBE && IS_CARTESIAN && DISABLED(Z_SAFE_HOMING) #error "Z_SAFE_HOMING is recommended when homing with a probe. Enable Z_SAFE_HOMING or comment out this line to continue." #endif + +// +// Warn users of potential endstop/DIAG pin conflicts to prevent homing issues when not using sensorless homing +// +#if !USE_SENSORLESS && ENABLED(USES_DIAG_JUMPERS) + #warning "Motherboard DIAG jumpers must be removed when SENSORLESS_HOMING is disabled." +#elif !USE_SENSORLESS && ENABLED(USES_DIAG_PINS) + #warning "Driver DIAG pins must be physically removed unless SENSORLESS_HOMING is enabled. (See https://bit.ly/2ZPRlt0)" +#endif diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index ec8f31b854d8..97d78c0d2434 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -26,7 +26,9 @@ */ #define BOARD_INFO_NAME "BTT SKR V1.3" -#define LPC1768_IS_SKRV1_3 1 + +#define LPC1768_IS_SKRV1_3 +#define USES_DIAG_JUMPERS // // Trinamic Stallguard pins diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index a072242adc74..b9dc845c5b77 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -35,6 +35,8 @@ #define BOARD_CUSTOM_BUILD_FLAGS -DLPC_PINCFG_UART3_P4_28 #endif +#define USES_DIAG_PINS + // // EEPROM // diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index d6b1eeab4670..15afe7e23837 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -30,6 +30,8 @@ #define BOARD_INFO_NAME "MKS SGen-L" #define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-SGEN_L" +#define USES_DIAG_JUMPERS + // // Servos // diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index 9c514f8ca318..bdc49fc23648 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -31,6 +31,8 @@ #define BOARD_INFO_NAME "BTT SKR E3 Turbo" #endif +#define USES_DIAG_JUMPERS + // Onboard I2C EEPROM #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x1000 // 4KB (AT24C32) diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index bb39009f094f..8107f11937cd 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -30,6 +30,8 @@ #define BOARD_INFO_NAME "MKS SGEN_L V2" #define BOARD_WEBSITE_URL "github.com/makerbase-mks" +#define USES_DIAG_JUMPERS + // // EEPROM, MKS SGEN_L V2.0 hardware has 4K EEPROM on the board // diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index 48d38e22136d..c132691c2090 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -26,6 +26,8 @@ // Release PB3/PB4 (E0 STP/DIR) from JTAG pins #define DISABLE_JTAG +#define USES_DIAG_JUMPERS + // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index a221ce94c532..a34099120ebf 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -27,10 +27,11 @@ #include "env_validate.h" -#define BOARD_NO_NATIVE_USB - #define BOARD_WEBSITE_URL "github.com/makerbase-mks" +#define BOARD_NO_NATIVE_USB +#define USES_DIAG_JUMPERS + //#define DISABLE_DEBUG #define DISABLE_JTAG diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 3df6727d0342..1cdee92b088d 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -36,6 +36,7 @@ #define BOARD_INFO_NAME "MKS Robin nano V2.0" #define BOARD_NO_NATIVE_USB +#define USES_DIAG_PINS // Avoid conflict with TIMER_SERVO when using the STM32 HAL #define TEMP_TIMER 5 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index 44485b0776c3..b7ffcce4a86c 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -29,6 +29,11 @@ #define BOARD_INFO_NAME "BTT BTT002 V1.0" +#define USES_DIAG_PINS + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + // Use one of these or SDCard-based Emulation will be used #if NO_EEPROM_SELECTED //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation @@ -41,9 +46,6 @@ #define FLASH_EEPROM_LEVELING #endif -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - // // Limit Switches // diff --git a/Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h b/Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h index bd483ecf0ae8..d1f38f5c8098 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h @@ -29,6 +29,8 @@ #define BOARD_INFO_NAME "BTT E3 RRF" #endif +#define USES_DIAG_JUMPERS + // Add-on board for IDEX conversion //#define BTT_E3_RRF_IDEX_BOARD diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index 95f74efe8498..dfa9d8a7b9dd 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -31,15 +31,14 @@ #define BOARD_INFO_NAME "BTT GTR V1.0" +#define USES_DIAG_JUMPERS +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support +#define M5_EXTENDER // The M5 extender is attached + // Onboard I2C EEPROM #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24C64 ... 64Kb = 8KB) -// USB Flash Drive support -#define HAS_OTG_USB_HOST_SUPPORT - -#define M5_EXTENDER // The M5 extender is attached - // // Servos // diff --git a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h index 655e65da47a3..6dc90bf910ef 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h @@ -23,15 +23,15 @@ #include "env_validate.h" +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support +#define USES_DIAG_JUMPERS + // Onboard I2C EEPROM #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x8000 // 32KB (24C32A) #define I2C_SCL_PIN PB8 #define I2C_SDA_PIN PB9 -// USB Flash Drive support -#define HAS_OTG_USB_HOST_SUPPORT - // Avoid conflict with TIMER_TONE #define STEP_TIMER 10 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 3314d0154da1..ac049baa2122 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -23,6 +23,8 @@ #include "env_validate.h" +#define USES_DIAG_JUMPERS + // If you have the BigTreeTech driver expansion module, enable BTT_MOTOR_EXPANSION // https://github.com/bigtreetech/BTT-Expansion-module/tree/master/BTT%20EXP-MOT //#define BTT_MOTOR_EXPANSION @@ -47,8 +49,7 @@ #define FLASH_EEPROM_LEVELING #endif -// USB Flash Drive support -#define HAS_OTG_USB_HOST_SUPPORT +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support // // Servos 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 50330932cf87..9a280eac1643 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 @@ -47,8 +47,7 @@ #define FLASH_EEPROM_LEVELING #endif -// USB Flash Drive support -#define HAS_OTG_USB_HOST_SUPPORT +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support // Avoid conflict with TIMER_TONE #define STEP_TIMER 10 diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 6ad3849d11bd..099b3b79a497 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -40,8 +40,7 @@ #define MARLIN_EEPROM_SIZE 0x10000 #endif -// USB Flash Drive support -#define HAS_OTG_USB_HOST_SUPPORT +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support // // Servos diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index 68e563695503..c686e19ccb29 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -34,8 +34,7 @@ #define STEP_TIMER 4 #define TEMP_TIMER 2 -// USB Flash Drive support -#define HAS_OTG_USB_HOST_SUPPORT +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support // // Servos diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 7f35c0f5dd7f..93526db4425c 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -39,8 +39,7 @@ #define I2C_SDA_PIN PB9 #define MARLIN_EEPROM_SIZE 0x10000 // FM24CL64 F-RAM 64K (8Kx8) -// USB Flash Drive support -#define HAS_OTG_USB_HOST_SUPPORT +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support // // Servos diff --git a/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8.h b/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8.h index 8fa211dc9502..a7f853185e1d 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8.h @@ -32,8 +32,8 @@ #define BOARD_INFO_NAME "MKS Monster8 V1.x" -// USB Flash Drive support -#define HAS_OTG_USB_HOST_SUPPORT +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support +#define USES_DIAG_JUMPERS //#define DISABLE_DEBUG diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index 4dc73e031270..02140865f96a 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -32,22 +32,20 @@ #define BOARD_INFO_NAME "MKS Robin Nano V3" +#define USES_DIAG_JUMPERS + #ifndef X_CS_PIN #define X_CS_PIN PD5 #endif - #ifndef Y_CS_PIN #define Y_CS_PIN PD7 #endif - #ifndef Z_CS_PIN #define Z_CS_PIN PD4 #endif - #ifndef E0_CS_PIN #define E0_CS_PIN PD9 #endif - #ifndef E1_CS_PIN #define E1_CS_PIN PD8 #endif diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3_common.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3_common.h index c3e3963b551f..256439e654dc 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3_common.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3_common.h @@ -26,8 +26,7 @@ // MKS Robin Nano V3, MKS Eagle pinmap // -// USB Flash Drive support -#define HAS_OTG_USB_HOST_SUPPORT +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support // Avoid conflict with TIMER_TONE #define STEP_TIMER 10 diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h index 46dec71c11c1..68b238525477 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -39,8 +39,7 @@ #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -// USB Flash Drive support -#define HAS_OTG_USB_HOST_SUPPORT +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role diff --git a/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX.h b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX.h index 991c611a89f6..9eb0acf1448d 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX.h @@ -32,8 +32,7 @@ #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x1000 // 4KB (24C32 ... 32Kb = 4KB) -// USB Flash Drive support -#define HAS_OTG_USB_HOST_SUPPORT +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support // // Limit Switches From da830e6ced7f7c7e509e748104245064d1c1b265 Mon Sep 17 00:00:00 2001 From: Andrei M <22990561+andrei-moraru@users.noreply.github.com> Date: Tue, 2 Nov 2021 01:47:16 -0400 Subject: [PATCH 49/78] =?UTF-8?q?=E2=9A=97=EF=B8=8F=20Use=20pwm=5Fset=5Fdu?= =?UTF-8?q?ty=20over=20analogWrite=20to=20set=20PWM=20(#23048)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/src/HAL/AVR/HAL.h | 2 +- Marlin/src/HAL/AVR/fast_pwm.cpp | 62 +++++++++++++-------------- Marlin/src/HAL/DUE/HAL.h | 5 +++ Marlin/src/HAL/ESP32/HAL.h | 4 ++ Marlin/src/HAL/LINUX/HAL.h | 3 ++ Marlin/src/HAL/LPC1768/fast_pwm.cpp | 16 +++---- Marlin/src/HAL/NATIVE_SIM/HAL.h | 3 ++ Marlin/src/HAL/SAMD51/HAL.h | 5 +++ Marlin/src/HAL/STM32/fast_pwm.cpp | 37 ++++++++-------- Marlin/src/HAL/STM32F1/HAL.cpp | 3 +- Marlin/src/HAL/STM32F1/fast_pwm.cpp | 60 +++++++++++++------------- Marlin/src/HAL/TEENSY31_32/HAL.h | 6 +++ Marlin/src/HAL/TEENSY35_36/HAL.h | 6 +++ Marlin/src/HAL/TEENSY40_41/HAL.cpp | 10 ++--- Marlin/src/HAL/TEENSY40_41/HAL.h | 8 +++- Marlin/src/feature/caselight.cpp | 2 +- Marlin/src/feature/controllerfan.cpp | 7 +-- Marlin/src/feature/leds/leds.cpp | 10 ++--- Marlin/src/feature/spindle_laser.cpp | 6 +-- Marlin/src/gcode/control/M42.cpp | 4 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- Marlin/src/lcd/tft/ui_common.cpp | 2 +- Marlin/src/module/endstops.cpp | 2 +- Marlin/src/module/planner.cpp | 6 +-- Marlin/src/module/stepper.cpp | 2 +- Marlin/src/module/temperature.cpp | 10 ++--- 26 files changed, 158 insertions(+), 125 deletions(-) diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index ecb566ed46bd..ad1f47a4e685 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -221,7 +221,7 @@ void set_pwm_frequency(const pin_t pin, int f_desired); /** * set_pwm_duty - * Sets the PWM duty cycle of the provided pin to the provided value + * Set the PWM duty cycle of the provided pin to the provided value * Optionally allows inverting the duty cycle [default = false] * Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255] */ diff --git a/Marlin/src/HAL/AVR/fast_pwm.cpp b/Marlin/src/HAL/AVR/fast_pwm.cpp index 238c1124adeb..2556fa044121 100644 --- a/Marlin/src/HAL/AVR/fast_pwm.cpp +++ b/Marlin/src/HAL/AVR/fast_pwm.cpp @@ -22,11 +22,10 @@ #ifdef __AVR__ #include "../../inc/MarlinConfigPre.h" +#include "HAL.h" #if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM -#include "HAL.h" - struct Timer { volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer volatile uint16_t* OCRnQ[3]; // max 3 OCR registers per timer @@ -153,7 +152,7 @@ Timer get_pwm_timer(const pin_t pin) { void set_pwm_frequency(const pin_t pin, int f_desired) { Timer timer = get_pwm_timer(pin); - if (timer.n == 0) return; // Don't proceed if protected timer or not recognised + if (timer.n == 0) return; // Don't proceed if protected timer or not recognized uint16_t size; if (timer.n == 2) size = 255; else size = 65535; @@ -243,40 +242,39 @@ void set_pwm_frequency(const pin_t pin, int f_desired) { _SET_ICRn(timer.ICRn, res); // Set ICRn value (TOP) = res } +#endif // NEEDS_HARDWARE_PWM + void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { - // If v is 0 or v_size (max), digitalWrite to LOW or HIGH. - // Note that digitalWrite also disables pwm output for us (sets COM bit to 0) - if (v == 0) - digitalWrite(pin, invert); - else if (v == v_size) - digitalWrite(pin, !invert); - else { - Timer timer = get_pwm_timer(pin); - if (timer.n == 0) return; // Don't proceed if protected timer or not recognised - // Set compare output mode to CLEAR -> SET or SET -> CLEAR (if inverted) - _SET_COMnQ(timer.TCCRnQ, (timer.q - #ifdef TCCR2 - + (timer.q == 2) // COM20 is on bit 4 of TCCR2, thus requires q + 1 in the macro - #endif - ), COM_CLEAR_SET + invert - ); + #if NEEDS_HARDWARE_PWM - uint16_t top; - if (timer.n == 2) { // if TIMER2 - top = ( - #if ENABLED(USE_OCR2A_AS_TOP) - *timer.OCRnQ[0] // top = OCR2A - #else - 255 // top = 0xFF (max) - #endif + // If v is 0 or v_size (max), digitalWrite to LOW or HIGH. + // Note that digitalWrite also disables pwm output for us (sets COM bit to 0) + if (v == 0) + digitalWrite(pin, invert); + else if (v == v_size) + digitalWrite(pin, !invert); + else { + Timer timer = get_pwm_timer(pin); + if (timer.n == 0) return; // Don't proceed if protected timer or not recognized + // Set compare output mode to CLEAR -> SET or SET -> CLEAR (if inverted) + _SET_COMnQ(timer.TCCRnQ, (timer.q + #ifdef TCCR2 + + (timer.q == 2) // COM20 is on bit 4 of TCCR2, thus requires q + 1 in the macro + #endif + ), COM_CLEAR_SET + invert ); + + uint16_t top = (timer.n == 2) ? TERN(USE_OCR2A_AS_TOP, *timer.OCRnQ[0], 255) : *timer.ICRn; + _SET_OCRnQ(timer.OCRnQ, timer.q, (v * top + v_size / 2) / v_size); // Scale 8/16-bit v to top value } - else - top = *timer.ICRn; // top = ICRn - _SET_OCRnQ(timer.OCRnQ, timer.q, v * float(top) / float(v_size)); // Scale 8/16-bit v to top value - } + #else + + analogWrite(pin, v); + UNUSED(v_size); + UNUSED(invert); + + #endif } -#endif // NEEDS_HARDWARE_PWM #endif // __AVR__ diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index fb90c40aa7ea..96ab5d9808ac 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -144,6 +144,11 @@ inline void HAL_adc_init() {}//todo void HAL_adc_start_conversion(const uint8_t ch); uint16_t HAL_adc_get_result(); +// +// PWM +// +inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); } + // // Pin Map // diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index 8a8f6df6404c..8473e3c4e469 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -129,6 +129,10 @@ void HAL_adc_init(); void HAL_adc_start_conversion(const uint8_t adc_pin); +// PWM +inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); } + +// Pin Map #define GET_PIN_MAP_PIN(index) index #define GET_PIN_MAP_INDEX(pin) pin #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h index b80fe210f8bb..d7d3a92b73b9 100644 --- a/Marlin/src/HAL/LINUX/HAL.h +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -101,6 +101,9 @@ void HAL_adc_enable_channel(const uint8_t ch); void HAL_adc_start_conversion(const uint8_t ch); uint16_t HAL_adc_get_result(); +// PWM +inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); } + // Reset source inline void HAL_clear_reset_source(void) {} inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } diff --git a/Marlin/src/HAL/LPC1768/fast_pwm.cpp b/Marlin/src/HAL/LPC1768/fast_pwm.cpp index dd440b5e7730..70fc0e333d11 100644 --- a/Marlin/src/HAL/LPC1768/fast_pwm.cpp +++ b/Marlin/src/HAL/LPC1768/fast_pwm.cpp @@ -22,18 +22,18 @@ #ifdef TARGET_LPC1768 #include "../../inc/MarlinConfigPre.h" - -#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM - #include -void set_pwm_frequency(const pin_t pin, int f_desired) { - LPC176x::pwm_set_frequency(pin, f_desired); -} - void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { LPC176x::pwm_write_ratio(pin, invert ? 1.0f - (float)v / v_size : (float)v / v_size); } -#endif // NEEDS_HARDWARE_PWM +#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM + + void set_pwm_frequency(const pin_t pin, int f_desired) { + LPC176x::pwm_set_frequency(pin, f_desired); + } + +#endif + #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/NATIVE_SIM/HAL.h b/Marlin/src/HAL/NATIVE_SIM/HAL.h index 235c24808cb4..915339468b2c 100644 --- a/Marlin/src/HAL/NATIVE_SIM/HAL.h +++ b/Marlin/src/HAL/NATIVE_SIM/HAL.h @@ -133,6 +133,9 @@ void HAL_adc_enable_channel(const uint8_t ch); void HAL_adc_start_conversion(const uint8_t ch); uint16_t HAL_adc_get_result(); +// PWM +inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); } + // Reset source inline void HAL_clear_reset_source(void) {} inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index 775a9240e1f4..c262752a8d66 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -127,6 +127,11 @@ void HAL_adc_init(); void HAL_adc_start_conversion(const uint8_t adc_pin); +// +// PWM +// +inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); } + // // Pin Map // diff --git a/Marlin/src/HAL/STM32/fast_pwm.cpp b/Marlin/src/HAL/STM32/fast_pwm.cpp index 917e12615f1d..d4d695b969b5 100644 --- a/Marlin/src/HAL/STM32/fast_pwm.cpp +++ b/Marlin/src/HAL/STM32/fast_pwm.cpp @@ -24,26 +24,9 @@ #ifdef HAL_STM32 -#include "../../inc/MarlinConfigPre.h" - -#if NEEDS_HARDWARE_PWM - -#include "HAL.h" +#include "../../inc/MarlinConfig.h" #include "timers.h" -void set_pwm_frequency(const pin_t pin, int f_desired) { - if (!PWM_PIN(pin)) return; // Don't proceed if no hardware timer - - PinName pin_name = digitalPinToPinName(pin); - TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(pin_name, PinMap_PWM); // Get HAL timer instance - - LOOP_S_L_N(i, 0, NUM_HARDWARE_TIMERS) // Protect used timers - if (timer_instance[i] && timer_instance[i]->getHandle()->Instance == Instance) - return; - - pwm_start(pin_name, f_desired, 0, RESOLUTION_8B_COMPARE_FORMAT); -} - void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { PinName pin_name = digitalPinToPinName(pin); TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(pin_name, PinMap_PWM); @@ -58,5 +41,21 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255 } } -#endif // NEEDS_HARDWARE_PWM +#if NEEDS_HARDWARE_PWM + + void set_pwm_frequency(const pin_t pin, int f_desired) { + if (!PWM_PIN(pin)) return; // Don't proceed if no hardware timer + + PinName pin_name = digitalPinToPinName(pin); + TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(pin_name, PinMap_PWM); // Get HAL timer instance + + LOOP_S_L_N(i, 0, NUM_HARDWARE_TIMERS) // Protect used timers + if (timer_instance[i] && timer_instance[i]->getHandle()->Instance == Instance) + return; + + pwm_start(pin_name, f_desired, 0, RESOLUTION_8B_COMPARE_FORMAT); + } + +#endif + #endif // HAL_STM32 diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index df1ba33d4ade..f29b30536146 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -449,8 +449,7 @@ uint16_t analogRead(pin_t pin) { // Wrapper to maple unprotected analogWrite void analogWrite(pin_t pin, int pwm_val8) { - if (PWM_PIN(pin)) - analogWrite(uint8_t(pin), pwm_val8); + if (PWM_PIN(pin)) analogWrite(uint8_t(pin), pwm_val8); } void HAL_reboot() { nvic_sys_reset(); } diff --git a/Marlin/src/HAL/STM32F1/fast_pwm.cpp b/Marlin/src/HAL/STM32F1/fast_pwm.cpp index 884d482af5f1..6a9d7e8a1947 100644 --- a/Marlin/src/HAL/STM32F1/fast_pwm.cpp +++ b/Marlin/src/HAL/STM32F1/fast_pwm.cpp @@ -23,40 +23,10 @@ #include "../../inc/MarlinConfigPre.h" -#if NEEDS_HARDWARE_PWM - #include #include "HAL.h" #include "timers.h" -void set_pwm_frequency(const pin_t pin, int f_desired) { - if (!PWM_PIN(pin)) return; // Don't proceed if no hardware timer - - timer_dev *timer = PIN_MAP[pin].timer_device; - uint8_t channel = PIN_MAP[pin].timer_channel; - - // Protect used timers - if (timer == get_timer_dev(TEMP_TIMER_NUM)) return; - if (timer == get_timer_dev(STEP_TIMER_NUM)) return; - #if PULSE_TIMER_NUM != STEP_TIMER_NUM - if (timer == get_timer_dev(PULSE_TIMER_NUM)) return; - #endif - - if (!(timer->regs.bas->SR & TIMER_CR1_CEN)) // Ensure the timer is enabled - timer_init(timer); - - timer_set_mode(timer, channel, TIMER_PWM); - uint16_t preload = 255; // Lock 255 PWM resolution for high frequencies - int32_t prescaler = (HAL_TIMER_RATE) / (preload + 1) / f_desired - 1; - if (prescaler > 65535) { // For low frequencies increase prescaler - prescaler = 65535; - preload = (HAL_TIMER_RATE) / (prescaler + 1) / f_desired - 1; - } - if (prescaler < 0) return; // Too high frequency - timer_set_reload(timer, preload); - timer_set_prescaler(timer, prescaler); -} - void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { timer_dev *timer = PIN_MAP[pin].timer_device; uint16_t max_val = timer->regs.bas->ARR * v / v_size; @@ -64,5 +34,35 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255 pwmWrite(pin, max_val); } +#if NEEDS_HARDWARE_PWM + + void set_pwm_frequency(const pin_t pin, int f_desired) { + if (!PWM_PIN(pin)) return; // Don't proceed if no hardware timer + + timer_dev *timer = PIN_MAP[pin].timer_device; + uint8_t channel = PIN_MAP[pin].timer_channel; + + // Protect used timers + if (timer == get_timer_dev(TEMP_TIMER_NUM)) return; + if (timer == get_timer_dev(STEP_TIMER_NUM)) return; + #if PULSE_TIMER_NUM != STEP_TIMER_NUM + if (timer == get_timer_dev(PULSE_TIMER_NUM)) return; + #endif + + if (!(timer->regs.bas->SR & TIMER_CR1_CEN)) // Ensure the timer is enabled + timer_init(timer); + + timer_set_mode(timer, channel, TIMER_PWM); + uint16_t preload = 255; // Lock 255 PWM resolution for high frequencies + int32_t prescaler = (HAL_TIMER_RATE) / (preload + 1) / f_desired - 1; + if (prescaler > 65535) { // For low frequencies increase prescaler + prescaler = 65535; + preload = (HAL_TIMER_RATE) / (prescaler + 1) / f_desired - 1; + } + if (prescaler < 0) return; // Too high frequency + timer_set_reload(timer, preload); + timer_set_prescaler(timer, prescaler); + } + #endif // NEEDS_HARDWARE_PWM #endif // __STM32F1__ diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index 7235f5ef0e87..61d8b34604c5 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -122,6 +122,12 @@ void HAL_adc_init(); void HAL_adc_start_conversion(const uint8_t adc_pin); uint16_t HAL_adc_get_result(); +// PWM + +inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); } + +// Pin Map + #define GET_PIN_MAP_PIN(index) index #define GET_PIN_MAP_INDEX(pin) pin #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 8892ffec45e7..892eb2d3c5b8 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -129,6 +129,12 @@ void HAL_adc_init(); void HAL_adc_start_conversion(const uint8_t adc_pin); uint16_t HAL_adc_get_result(); +// PWM + +inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); } + +// Pin Map + #define GET_PIN_MAP_PIN(index) index #define GET_PIN_MAP_INDEX(pin) pin #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp index ccc8c2659c65..270bee0dc9d4 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp @@ -106,17 +106,17 @@ void HAL_adc_init() { void HAL_clear_reset_source() { uint32_t reset_source = SRC_SRSR; SRC_SRSR = reset_source; - } +} uint8_t HAL_get_reset_source() { switch (SRC_SRSR & 0xFF) { case 1: return RST_POWER_ON; break; case 2: return RST_SOFTWARE; break; case 4: return RST_EXTERNAL; break; - // case 8: return RST_BROWN_OUT; break; + //case 8: return RST_BROWN_OUT; break; case 16: return RST_WATCHDOG; break; - case 64: return RST_JTAG; break; - // case 128: return RST_OVERTEMP; break; + case 64: return RST_JTAG; break; + //case 128: return RST_OVERTEMP; break; } return 0; } @@ -168,7 +168,7 @@ uint16_t HAL_adc_get_result() { return 0; } -bool is_output(uint8_t pin) { +bool is_output(pin_t pin) { const struct digital_pin_bitband_and_config_table_struct *p; p = digital_pin_to_info_PGM + pin; return (*(p->reg + 1) & p->mask); diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index c9716eacde69..2b730768a802 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -150,8 +150,14 @@ void HAL_adc_init(); void HAL_adc_start_conversion(const uint8_t adc_pin); uint16_t HAL_adc_get_result(); +// PWM + +inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); } + +// Pin Map + #define GET_PIN_MAP_PIN(index) index #define GET_PIN_MAP_INDEX(pin) pin #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) -bool is_output(uint8_t pin); +bool is_output(pin_t pin); diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp index 1baef6d46845..7c4755d0b585 100644 --- a/Marlin/src/feature/caselight.cpp +++ b/Marlin/src/feature/caselight.cpp @@ -70,7 +70,7 @@ void CaseLight::update(const bool sflag) { #if CASELIGHT_USES_BRIGHTNESS if (pin_is_pwm()) - analogWrite(pin_t(CASE_LIGHT_PIN), ( + set_pwm_duty(pin_t(CASE_LIGHT_PIN), ( #if CASE_LIGHT_MAX_PWM == 255 n10ct #else diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp index 03ef31e414a0..330f3914f6c0 100644 --- a/Marlin/src/feature/controllerfan.cpp +++ b/Marlin/src/feature/controllerfan.cpp @@ -72,9 +72,10 @@ void ControllerFan::update() { ? settings.active_speed : settings.idle_speed ); - // Allow digital or PWM fan output (see M42 handling) - WRITE(CONTROLLER_FAN_PIN, speed); - analogWrite(pin_t(CONTROLLER_FAN_PIN), speed); + if (PWM_PIN(CONTROLLER_FAN_PIN)) + set_pwm_duty(pin_t(CONTROLLER_FAN_PIN), speed); + else + WRITE(CONTROLLER_FAN_PIN, speed); } } diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index 328daa626d46..a371637f0050 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -121,11 +121,11 @@ void LEDLights::set_color(const LEDColor &incol // This variant uses 3-4 separate pins for the RGB(W) components. // If the pins can do PWM then their intensity will be set. - #define _UPDATE_RGBW(C,c) do { \ - if (PWM_PIN(RGB_LED_##C##_PIN)) \ - analogWrite(pin_t(RGB_LED_##C##_PIN), c); \ - else \ - WRITE(RGB_LED_##C##_PIN, c ? HIGH : LOW); \ + #define _UPDATE_RGBW(C,c) do { \ + if (PWM_PIN(RGB_LED_##C##_PIN)) \ + set_pwm_duty(pin_t(RGB_LED_##C##_PIN), c); \ + else \ + WRITE(RGB_LED_##C##_PIN, c ? HIGH : LOW); \ }while(0) #define UPDATE_RGBW(C,c) _UPDATE_RGBW(C, TERN1(CASE_LIGHT_USE_RGB_LED, caselight.on) ? incol.c : 0) UPDATE_RGBW(R,r); UPDATE_RGBW(G,g); UPDATE_RGBW(B,b); diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index ea6fc4990e95..9297e9b95c8a 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -66,7 +66,7 @@ void SpindleLaser::init() { #endif #if ENABLED(SPINDLE_LASER_USE_PWM) SET_PWM(SPINDLE_LASER_PWM_PIN); - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed + set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed #endif #if ENABLED(HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_FREQUENCY); @@ -92,10 +92,8 @@ void SpindleLaser::init() { void SpindleLaser::_set_ocr(const uint8_t ocr) { #if NEEDS_HARDWARE_PWM && SPINDLE_LASER_FREQUENCY set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), TERN(MARLIN_DEV_MODE, frequency, SPINDLE_LASER_FREQUENCY)); - set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); - #else - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); #endif + set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); } void SpindleLaser::set_ocr(const uint8_t ocr) { diff --git a/Marlin/src/gcode/control/M42.cpp b/Marlin/src/gcode/control/M42.cpp index eead971a012c..77c0ccc49b0f 100644 --- a/Marlin/src/gcode/control/M42.cpp +++ b/Marlin/src/gcode/control/M42.cpp @@ -126,10 +126,10 @@ void GcodeSuite::M42() { extDigitalWrite(pin, pin_status); #ifdef ARDUINO_ARCH_STM32 - // A simple I/O will be set to 0 by analogWrite() + // A simple I/O will be set to 0 by set_pwm_duty() if (pin_status <= 1 && !PWM_PIN(pin)) return; #endif - analogWrite(pin, pin_status); + set_pwm_duty(pin, pin_status); } #endif // DIRECT_PIN_CONTROL diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 5d4c30bbb476..f339cad70614 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -342,7 +342,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop void MarlinUI::_set_brightness() { #if PIN_EXISTS(TFT_BACKLIGHT) if (PWM_PIN(TFT_BACKLIGHT_PIN)) - analogWrite(pin_t(TFT_BACKLIGHT_PIN), brightness); + set_pwm_duty(pin_t(TFT_BACKLIGHT_PIN), brightness); #endif } #endif diff --git a/Marlin/src/lcd/tft/ui_common.cpp b/Marlin/src/lcd/tft/ui_common.cpp index 8c503d2c9eea..85ae21e867fa 100644 --- a/Marlin/src/lcd/tft/ui_common.cpp +++ b/Marlin/src/lcd/tft/ui_common.cpp @@ -213,7 +213,7 @@ void MarlinUI::clear_lcd() { void MarlinUI::_set_brightness() { #if PIN_EXISTS(TFT_BACKLIGHT) if (PWM_PIN(TFT_BACKLIGHT_PIN)) - analogWrite(pin_t(TFT_BACKLIGHT_PIN), brightness); + set_pwm_duty(pin_t(TFT_BACKLIGHT_PIN), brightness); #endif } #endif diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 332becfb73a4..04f20ca3a4e2 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -1342,7 +1342,7 @@ void Endstops::update() { ES_REPORT_CHANGE(K_MAX); #endif SERIAL_ECHOLNPGM("\n"); - analogWrite(pin_t(LED_PIN), local_LED_status); + set_pwm_duty(pin_t(LED_PIN), local_LED_status); local_LED_status ^= 255; old_live_state_local = live_state_local; } diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 2552efc69a26..11460fa67a24 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1270,7 +1270,7 @@ void Planner::recalculate() { #elif ENABLED(FAST_PWM_FAN) #define _FAN_SET(F) set_pwm_duty(FAN##F##_PIN, CALC_FAN_SPEED(F)); #else - #define _FAN_SET(F) analogWrite(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(F)); + #define _FAN_SET(F) set_pwm_duty(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(F)); #endif #define FAN_SET(F) do{ kickstart_fan(fan_speed, ms, F); _FAN_SET(F); }while(0) @@ -1393,8 +1393,8 @@ void Planner::check_axes_activity() { TERN_(AUTOTEMP, autotemp_task()); #if ENABLED(BARICUDA) - TERN_(HAS_HEATER_1, analogWrite(pin_t(HEATER_1_PIN), tail_valve_pressure)); - TERN_(HAS_HEATER_2, analogWrite(pin_t(HEATER_2_PIN), tail_e_to_p_pressure)); + TERN_(HAS_HEATER_1, set_pwm_duty(pin_t(HEATER_1_PIN), tail_valve_pressure)); + TERN_(HAS_HEATER_2, set_pwm_duty(pin_t(HEATER_2_PIN), tail_e_to_p_pressure)); #endif } diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index a54bf53c4906..2c8933266fa3 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -3253,7 +3253,7 @@ void Stepper::report_positions() { #elif HAS_MOTOR_CURRENT_PWM - #define _WRITE_CURRENT_PWM(P) analogWrite(pin_t(MOTOR_CURRENT_PWM_## P ##_PIN), 255L * current / (MOTOR_CURRENT_PWM_RANGE)) + #define _WRITE_CURRENT_PWM(P) set_pwm_duty(pin_t(MOTOR_CURRENT_PWM_## P ##_PIN), 255L * current / (MOTOR_CURRENT_PWM_RANGE)) switch (driver) { case 0: #if PIN_EXISTS(MOTOR_CURRENT_PWM_X) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 5e8f4c9d9595..cef348c5f985 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -887,11 +887,11 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { SBI(fanState, pgm_read_byte(&fanBit[COOLER_FAN_INDEX])); #endif - #define _UPDATE_AUTO_FAN(P,D,A) do{ \ - if (PWM_PIN(P##_AUTO_FAN_PIN) && A < 255) \ - analogWrite(pin_t(P##_AUTO_FAN_PIN), D ? A : 0); \ - else \ - WRITE(P##_AUTO_FAN_PIN, D); \ + #define _UPDATE_AUTO_FAN(P,D,A) do{ \ + if (PWM_PIN(P##_AUTO_FAN_PIN) && A < 255) \ + set_pwm_duty(pin_t(P##_AUTO_FAN_PIN), D ? A : 0); \ + else \ + WRITE(P##_AUTO_FAN_PIN, D); \ }while(0) uint8_t fanDone = 0; From 95357c33fb0d3ce6d84e59bd16e8354836997015 Mon Sep 17 00:00:00 2001 From: Sebastien BLAISOT Date: Tue, 2 Nov 2021 06:49:21 +0100 Subject: [PATCH 50/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20NEOPIXEL2=5FSEPARATE?= =?UTF-8?q?=20default=20color=20(#23057)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/feature/leds/leds.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index a371637f0050..17d790b8cc9a 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -170,9 +170,9 @@ void LEDLights::set_color(const LEDColor &incol #if ENABLED(NEO2_COLOR_PRESETS) const LEDColor LEDLights2::defaultLEDColor = LEDColor( - LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE - OPTARG(HAS_WHITE_LED2, LED_USER_PRESET_WHITE) - OPTARG(NEOPIXEL_LED, LED_USER_PRESET_BRIGHTNESS) + NEO2_USER_PRESET_RED, NEO2_USER_PRESET_GREEN, NEO2_USER_PRESET_BLUE + OPTARG(HAS_WHITE_LED2, NEO2_USER_PRESET_WHITE) + OPTARG(NEOPIXEL_LED, NEO2_USER_PRESET_BRIGHTNESS) ); #endif From 0db9f9a828c43f978e37b5140f7b9bb6ca630667 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Mon, 1 Nov 2021 23:15:29 -0700 Subject: [PATCH 51/78] =?UTF-8?q?=F0=9F=93=8C=20Default=20NeoPixel=20pin?= =?UTF-8?q?=20for=20MKS=20Robin=20E3/E3D=20(#23060)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index a34099120ebf..025c65a38b24 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -64,6 +64,11 @@ #define Z_MIN_PROBE_PIN PB1 #endif +// LED driving pin +#ifndef NEOPIXEL_PIN + #define NEOPIXEL_PIN PA2 +#endif + // // Steppers // From f632b72e8c58ea4c54676ca17e9b9c9ee4584be0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 2 Nov 2021 01:28:00 -0500 Subject: [PATCH 52/78] =?UTF-8?q?=F0=9F=94=A8=20Support=20ABM=20in=20mf=20?= =?UTF-8?q?scripts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildroot/share/git/mfinfo | 1 + 1 file changed, 1 insertion(+) diff --git a/buildroot/share/git/mfinfo b/buildroot/share/git/mfinfo index e17138e45626..0f5d79a002b3 100755 --- a/buildroot/share/git/mfinfo +++ b/buildroot/share/git/mfinfo @@ -52,6 +52,7 @@ case "$REPO" in Marlin ) TARG=bugfix-2.0.x ; [[ $INDEX == 1 ]] && TARG=bugfix-1.1.x ; [[ $INDEX == 3 ]] && TARG=dev-2.1.x ;; Configurations ) TARG=import-2.0.x ;; MarlinDocumentation ) TARG=master ;; + AutoBuildMarlin ) TARG=master ;; esac [[ $BRANCH =~ ^[123]$ ]] && USAGE=1 From 627b67e27aa4de50c172e0ffc4a13fe3fb2d35f8 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 3 Nov 2021 01:00:15 +0000 Subject: [PATCH 53/78] [cron] Bump distribution date (2021-11-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 607561a87dd4..68c7d052990c 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 "2021-11-02" +//#define STRING_DISTRIBUTION_DATE "2021-11-03" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index c0dbd45fa2dd..1e1977671b5b 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 "2021-11-02" + #define STRING_DISTRIBUTION_DATE "2021-11-03" #endif /** From 1695f7a42f2d6398a5fc17bc8691d667c200c0d8 Mon Sep 17 00:00:00 2001 From: Jyers Date: Tue, 2 Nov 2021 21:45:12 -0400 Subject: [PATCH 54/78] Scrolling Text Fix --- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 31 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 89daa73aacc6..22a73992c66d 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -95,6 +95,7 @@ #define DWIN_FONT_HEAD font10x20 #define MENU_CHAR_LIMIT 24 +#define STATUS_CHAR_LIMIT 30 #define STATUS_Y 352 #define MAX_PRINT_SPEED 500 @@ -737,22 +738,22 @@ void CrealityDWINClass::Draw_Print_Filename(const bool reset/*=false*/) { if (process == Print) { size_t len = strlen(filename); int8_t pos = len; - if (pos > 30) { + if (pos > STATUS_CHAR_LIMIT) { pos -= namescrl; - len = _MIN(pos, 30); + len = _MIN((size_t)pos, STATUS_CHAR_LIMIT); char dispname[len + 1]; if (pos >= 0) { LOOP_L_N(i, len) dispname[i] = filename[i + namescrl]; } else { - LOOP_L_N(i, 30 + pos) dispname[i] = ' '; - LOOP_S_L_N(i, 30 + pos, 30) dispname[i] = filename[i - (30 + pos)]; + LOOP_L_N(i, STATUS_CHAR_LIMIT + pos) dispname[i] = ' '; + LOOP_S_L_N(i, STATUS_CHAR_LIMIT + pos, STATUS_CHAR_LIMIT) dispname[i] = filename[i - (STATUS_CHAR_LIMIT + pos)]; } dispname[len] = '\0'; DWIN_Draw_Rectangle(1, Color_Bg_Black, 8, 50, DWIN_WIDTH - 8, 80); - const int8_t npos = (DWIN_WIDTH - 30 * MENU_CHR_W) / 2; + const int8_t npos = (DWIN_WIDTH - STATUS_CHAR_LIMIT * MENU_CHR_W) / 2; DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, npos, 60, dispname); - if (-pos >= 30) namescrl = 0; + if (-pos >= STATUS_CHAR_LIMIT) namescrl = 0; namescrl++; } else { @@ -1026,31 +1027,29 @@ void CrealityDWINClass::Update_Status_Bar(bool refresh/*=false*/) { } size_t len = strlen(statusmsg); int8_t pos = len; - if (pos > 30) { + if (pos > STATUS_CHAR_LIMIT) { pos -= msgscrl; - len = pos; - if (len > 30) - len = 30; + len = _MIN((size_t)pos, STATUS_CHAR_LIMIT); char dispmsg[len + 1]; if (pos >= 0) { LOOP_L_N(i, len) dispmsg[i] = statusmsg[i + msgscrl]; } else { - LOOP_L_N(i, 30 + pos) dispmsg[i] = ' '; - LOOP_S_L_N(i, 30 + pos, 30) dispmsg[i] = statusmsg[i - (30 + pos)]; + LOOP_L_N(i, STATUS_CHAR_LIMIT + pos) dispmsg[i] = ' '; + LOOP_S_L_N(i, STATUS_CHAR_LIMIT + pos, STATUS_CHAR_LIMIT) dispmsg[i] = statusmsg[i - (STATUS_CHAR_LIMIT + pos)]; } dispmsg[len] = '\0'; if (process == Print) { DWIN_Draw_Rectangle(1, Color_Grey, 8, 214, DWIN_WIDTH - 8, 238); - const int8_t npos = (DWIN_WIDTH - 30 * MENU_CHR_W) / 2; + const int8_t npos = (DWIN_WIDTH - STATUS_CHAR_LIMIT * MENU_CHR_W) / 2; DWIN_Draw_String(false, DWIN_FONT_MENU, GetColor(eeprom_settings.status_bar_text, Color_White), Color_Bg_Black, npos, 219, dispmsg); } else { DWIN_Draw_Rectangle(1, Color_Bg_Black, 8, 352, DWIN_WIDTH - 8, 376); - const int8_t npos = (DWIN_WIDTH - 30 * MENU_CHR_W) / 2; + const int8_t npos = (DWIN_WIDTH - STATUS_CHAR_LIMIT * MENU_CHR_W) / 2; DWIN_Draw_String(false, DWIN_FONT_MENU, GetColor(eeprom_settings.status_bar_text, Color_White), Color_Bg_Black, npos, 357, dispmsg); } - if (-pos >= 30) msgscrl = 0; + if (-pos >= STATUS_CHAR_LIMIT) msgscrl = 0; msgscrl++; } else { @@ -4713,7 +4712,7 @@ void CrealityDWINClass::File_Control() { if (PENDING(millis(), time)) return; time = millis() + 200; pos -= filescrl; - len = _MIN(pos, MENU_CHAR_LIMIT); + len = _MIN((size_t)pos, MENU_CHAR_LIMIT); char name[len + 1]; if (pos >= 0) { LOOP_L_N(i, len) name[i] = filename[i + filescrl]; From 7f7a16e8cd592a935c09b939e7be6242d66634dd Mon Sep 17 00:00:00 2001 From: Jyers Date: Tue, 2 Nov 2021 22:05:42 -0400 Subject: [PATCH 55/78] Display Off Fix --- Marlin/src/lcd/e3v2/common/encoder.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Marlin/src/lcd/e3v2/common/encoder.cpp b/Marlin/src/lcd/e3v2/common/encoder.cpp index edfaf60aae1e..22c0a90d8c94 100644 --- a/Marlin/src/lcd/e3v2/common/encoder.cpp +++ b/Marlin/src/lcd/e3v2/common/encoder.cpp @@ -94,9 +94,7 @@ EncoderState Encoder_ReceiveAnalyze() { //LED_Action(); #endif if (!ui.backlight) ui.refresh_brightness(); - const bool was_waiting = wait_for_user; - wait_for_user = false; - return was_waiting ? ENCODER_DIFF_NO : ENCODER_DIFF_ENTER; + else return ENCODER_DIFF_ENTER; } else return ENCODER_DIFF_NO; } From ff55620fd82009ee792bcc635740af933df9c369 Mon Sep 17 00:00:00 2001 From: Jyers Date: Tue, 2 Nov 2021 22:44:47 -0400 Subject: [PATCH 56/78] Filament Load/Unload Fix --- Marlin/src/feature/pause.cpp | 2 +- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index d97ac2a0ac6e..cf3fc1b2bda6 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -278,7 +278,7 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load // Show "Purge More" / "Resume" menu and wait for reply KEEPALIVE_STATE(PAUSED_FOR_USER); wait_for_user = false; - #if EITHER(HAS_LCD_MENU, DWIN_CREALITY_LCD_ENHANCED) + #if ANY(HAS_LCD_MENU, DWIN_CREALITY_LCD_ENHANCED, DWIN_CREALITY_LCD_JYERSUI) ui.pause_show_message(PAUSE_MESSAGE_OPTION); // Also sets PAUSE_RESPONSE_WAIT_FOR #else pause_menu_response = PAUSE_RESPONSE_WAIT_FOR; diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 22a73992c66d..d55573111102 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -740,7 +740,7 @@ void CrealityDWINClass::Draw_Print_Filename(const bool reset/*=false*/) { int8_t pos = len; if (pos > STATUS_CHAR_LIMIT) { pos -= namescrl; - len = _MIN((size_t)pos, STATUS_CHAR_LIMIT); + len = _MIN((size_t)pos, (size_t)STATUS_CHAR_LIMIT); char dispname[len + 1]; if (pos >= 0) { LOOP_L_N(i, len) dispname[i] = filename[i + namescrl]; @@ -1029,7 +1029,7 @@ void CrealityDWINClass::Update_Status_Bar(bool refresh/*=false*/) { int8_t pos = len; if (pos > STATUS_CHAR_LIMIT) { pos -= msgscrl; - len = _MIN((size_t)pos, STATUS_CHAR_LIMIT); + len = _MIN((size_t)pos, (size_t)STATUS_CHAR_LIMIT); char dispmsg[len + 1]; if (pos >= 0) { LOOP_L_N(i, len) dispmsg[i] = statusmsg[i + msgscrl]; @@ -4712,7 +4712,7 @@ void CrealityDWINClass::File_Control() { if (PENDING(millis(), time)) return; time = millis() + 200; pos -= filescrl; - len = _MIN((size_t)pos, MENU_CHAR_LIMIT); + len = _MIN((size_t)pos, (size_t)MENU_CHAR_LIMIT); char name[len + 1]; if (pos >= 0) { LOOP_L_N(i, len) name[i] = filename[i + filescrl]; @@ -5516,7 +5516,10 @@ void MarlinUI::init() { void MarlinUI::pause_show_message(const PauseMessage message, const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/) { switch (message) { case PAUSE_MESSAGE_INSERT: CrealityDWIN.Confirm_Handler(FilInsert); break; - case PAUSE_MESSAGE_OPTION: CrealityDWIN.Popup_Handler(PurgeMore); break; + case PAUSE_MESSAGE_OPTION: + pause_menu_response = PAUSE_RESPONSE_WAIT_FOR; + CrealityDWIN.Popup_Handler(PurgeMore); + break; case PAUSE_MESSAGE_HEAT: CrealityDWIN.Confirm_Handler(HeaterTime); break; case PAUSE_MESSAGE_WAITING: CrealityDWIN.Draw_Print_Screen(); break; default: break; From cb9adaabbc99a5f008957ed2d7369aec1a11e825 Mon Sep 17 00:00:00 2001 From: Jyers Date: Tue, 2 Nov 2021 22:50:24 -0400 Subject: [PATCH 57/78] Added SOUND_MENU_ITEM Define to Configs --- .../E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h | 2 +- .../E3V2 Templates/BLTouch-3x3/Configuration_adv.h | 2 +- .../E3V2 Templates/Default-NoProbe/Configuration_adv.h | 2 +- .../E3V2 Templates/ManualMesh-3x3/Configuration_adv.h | 2 +- .../E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h | 2 +- .../E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h | 2 +- Configuration Files/Jyers's Config/Configuration_adv.h | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h b/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h index f97ce2c2738f..f00dbd11562e 100644 --- a/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h @@ -1248,7 +1248,7 @@ //#define TURBO_BACK_MENU_ITEM // Add a mute option to the LCD menu - //#define SOUND_MENU_ITEM + #define SOUND_MENU_ITEM /** * LED Control Menu diff --git a/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h b/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h index b23f0f758558..e8b60936311f 100644 --- a/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h @@ -1248,7 +1248,7 @@ //#define TURBO_BACK_MENU_ITEM // Add a mute option to the LCD menu - //#define SOUND_MENU_ITEM + #define SOUND_MENU_ITEM /** * LED Control Menu diff --git a/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h b/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h index b23f0f758558..e8b60936311f 100644 --- a/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h @@ -1248,7 +1248,7 @@ //#define TURBO_BACK_MENU_ITEM // Add a mute option to the LCD menu - //#define SOUND_MENU_ITEM + #define SOUND_MENU_ITEM /** * LED Control Menu diff --git a/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h b/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h index b23f0f758558..e8b60936311f 100644 --- a/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h @@ -1248,7 +1248,7 @@ //#define TURBO_BACK_MENU_ITEM // Add a mute option to the LCD menu - //#define SOUND_MENU_ITEM + #define SOUND_MENU_ITEM /** * LED Control Menu diff --git a/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h b/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h index b23f0f758558..e8b60936311f 100644 --- a/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h @@ -1248,7 +1248,7 @@ //#define TURBO_BACK_MENU_ITEM // Add a mute option to the LCD menu - //#define SOUND_MENU_ITEM + #define SOUND_MENU_ITEM /** * LED Control Menu diff --git a/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h b/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h index b23f0f758558..e8b60936311f 100644 --- a/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h @@ -1248,7 +1248,7 @@ //#define TURBO_BACK_MENU_ITEM // Add a mute option to the LCD menu - //#define SOUND_MENU_ITEM + #define SOUND_MENU_ITEM /** * LED Control Menu diff --git a/Configuration Files/Jyers's Config/Configuration_adv.h b/Configuration Files/Jyers's Config/Configuration_adv.h index 53f827d92267..6e010cc3c677 100644 --- a/Configuration Files/Jyers's Config/Configuration_adv.h +++ b/Configuration Files/Jyers's Config/Configuration_adv.h @@ -1248,7 +1248,7 @@ //#define TURBO_BACK_MENU_ITEM // Add a mute option to the LCD menu - //#define SOUND_MENU_ITEM + #define SOUND_MENU_ITEM /** * LED Control Menu From 158d2680ae696d42a1c0fb566e66c05bb2d8a920 Mon Sep 17 00:00:00 2001 From: Jyers Date: Tue, 2 Nov 2021 22:56:45 -0400 Subject: [PATCH 58/78] Re-Added Images for Wiki --- Images/Advanced Options.jpg | Bin 0 -> 51901 bytes Images/Configuration_adv.jpg | Bin 0 -> 26407 bytes Images/Configuration_adv2.jpg | Bin 0 -> 36783 bytes Images/Display Config.jpg | Bin 0 -> 17317 bytes Images/ExtUI.jpg | Bin 0 -> 55761 bytes Images/Filament Change.jpg | Bin 0 -> 50837 bytes Images/Main Menu.jpg | Bin 0 -> 61773 bytes Images/Manual Leveling.jpg | Bin 0 -> 54839 bytes Images/Mesh Leveling.jpg | Bin 0 -> 51446 bytes Images/OctoPrint.jpg | Bin 0 -> 106929 bytes Images/OctoPrint_Behavior.jpg | Bin 0 -> 68319 bytes Images/Preheat Constants.jpg | Bin 0 -> 43184 bytes Images/Preheat Menu.jpg | Bin 0 -> 49510 bytes Images/Preprare Menu.jpg | Bin 0 -> 54896 bytes Images/UBL Manual Tuning.jpg | Bin 0 -> 39431 bytes Images/UBL Mesh Viewer 15x15.jpg | Bin 0 -> 87415 bytes Images/UBL Mesh Viewer 3x3.jpg | Bin 0 -> 44664 bytes Images/Z Offset.jpg | Bin 0 -> 49999 bytes 18 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Images/Advanced Options.jpg create mode 100644 Images/Configuration_adv.jpg create mode 100644 Images/Configuration_adv2.jpg create mode 100644 Images/Display Config.jpg create mode 100644 Images/ExtUI.jpg create mode 100644 Images/Filament Change.jpg create mode 100644 Images/Main Menu.jpg create mode 100644 Images/Manual Leveling.jpg create mode 100644 Images/Mesh Leveling.jpg create mode 100644 Images/OctoPrint.jpg create mode 100644 Images/OctoPrint_Behavior.jpg create mode 100644 Images/Preheat Constants.jpg create mode 100644 Images/Preheat Menu.jpg create mode 100644 Images/Preprare Menu.jpg create mode 100644 Images/UBL Manual Tuning.jpg create mode 100644 Images/UBL Mesh Viewer 15x15.jpg create mode 100644 Images/UBL Mesh Viewer 3x3.jpg create mode 100644 Images/Z Offset.jpg diff --git a/Images/Advanced Options.jpg b/Images/Advanced Options.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69223af73c3cfaf502382077ee808c37efb2fb5b GIT binary patch literal 51901 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 literal 0 HcmV?d00001 diff --git a/Images/Configuration_adv.jpg b/Images/Configuration_adv.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9fdf21658ff674736ddcc3479aa785902de4647 GIT binary patch literal 26407 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 literal 0 HcmV?d00001 diff --git a/Images/Configuration_adv2.jpg b/Images/Configuration_adv2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14a7121cc7ddf3f2f1235d659f5880d28f69cd05 GIT binary patch literal 36783 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 AtpET3 literal 0 HcmV?d00001 diff --git a/Images/Filament Change.jpg b/Images/Filament Change.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8ba0c4cd21bd3573a9d8b7660dea3d2b19a6ffc GIT binary patch literal 50837 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 agtmu0aQizB5cqf%0G>;NwE)n+)BgiYj~1=~ literal 0 HcmV?d00001 diff --git a/Images/Manual Leveling.jpg b/Images/Manual Leveling.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64be2f155b19ed049ef32cd6d003ee727ce09698 GIT binary patch literal 54839 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

f;IED^;+?zPHx#tKJL0Kh1a$bP}rp9`V%3py&)6 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 literal 0 HcmV?d00001 diff --git a/Images/Mesh Leveling.jpg b/Images/Mesh Leveling.jpg new file mode 100644 index 0000000000000000000000000000000000000000..095a186363cdf3e4d3e54412378501c6c131305e GIT binary patch literal 51446 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

apY%q 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%0D8nS zC9$nEUIFfs%_!smK4#2K;S=j#O4Tc|ySaXhUCFBkIiJ!vQ{KCG;gKhlEq9J-Z$C-c zIyrT})(Ym|_gS&-=z=l`PA2mE108d$6M{wW@wYHOuJk70^X56MB~7O-@#v_OZj1j+l>9wx?;E1kw?$-t zmn{QWeR12xRq7ZJ7wU`(nX2GGBT3Uo#Xy_ux|vJEsi5Ewn?DNZk+ zjn=pJ_?f6ibmml(3>}&plYC`NWCt@=8!pB2(H7^TSS*pF%lpe@PTs9uCs&y*p8me1 z({jG0O0?JP@62ME<#1CLcAmAHN41KE{Y(EY8S{9Ts>($zc!>BJrKza9nS{MFnYo5q zwVh^Dq43Y1f?$MuTfy1dRKeXGm5% z(yYTLJV-tZ)|GGA_bwNEh@i)ubg-az+@zvrGK|Ub73i>9|`3 z+DTq6?fYbY3n4#!UQ-Hh-fa!ErWv>^cI#x%CvEwnF!V+F;dhefq<#cy!`uljUtIJ{ zh3H)!S1dc~rN~{e8RPtV@3$&^E}mV5+;IR_rJC7o+-DqhDJBM%_T>0*SidfwW96R~ zlzb@Bb=$P2FBkU^sj-RyTuZ1wtlT6*M19)D#)=IQaK)A*kK|Vn!yi6Ue4kP698igS z1zc^NE#A@gt6YMCv20SyeDXCu3xe?XDIYt7U_?P9v}T6ENA zlqH`BISKmMB6`^B?l4h4Mvb|a=DS6OLmFaDf##=?O7Aljo5i}>Hu<^5XRajq`s11BPF9K^vkT9!79JUx01kE+9dK>;b9Zwl#8%~b z`&rO&MoS&XgCl?~NnHV5U<0*H1aCaDX||`TWvf(~slsX*4EOc=kg%kJtrDB9A36Pe zXkXw}LA+h58c=V|j1~icO?4*rcP=H= z2@Uuy^7lz`k8|>Ry%X=1s8PHd)6*JoXz^ap`}P?wTG*be^QRH#d*!E1A~YJTnbu~l z(~I=6e7{O~@6jv5{gyK|Vy2cti8fnXt>4-Y*(Vy^{_?ezOHKjJkfM;kb7Z*fEj5$E zzX3h~0M>K`Dy8SA@Tq6Iht5zk%bTfjY~61?xlourl8MQ4*Ns=~x+X!1OW*+M^2g~W zpETrcI2&dzQwp0#Pd+2?>;eGX)#&y^HCT_ya4QB2=S|c~_XBdadfMVK0xqVC8@73| zH5HCN)rrZl^I~G}smdq;uaTMJG%{pQF3=@piJP|uVI}N#Gy_o5kT}mfY$!6edhBcSEd`+ z?}EQK+WMXQ9_@{bp2nQMoSC~secxPa7Ha1R^X)OuxN?{VW1$UY(zh)Mea!$B?~_~brK#h903AuzooF?iM>Dhot+!WzW}@GolL2aHO0ogHWW#98 z-88cmU?Ib+Kim+Lm$61B+-A6`bCUxtLRvoC95hPLJwPYdm zMQ@qy=PH!nRL&I%(nlZD2E6g`x3R&ZQIv#)32fbHF>=s@uI`qAE)0?TfjO+}QFsWI zKPUxe7h3c_8AI}?>JajkWm7fBYe}^~j%wDFZgr~OL?kT3dFiBf!mVtTXx00zW5$6OVlI_e1wW&OkMgg+XV($PL! z|3AtX*>sBITzI{<^V z)77PFyjGHI&hlKxZ@Lj2l(`pNX)qaf-?`0L=|YQd+aN#41nl8OtcBiu@FMkJhM()4 z8>uXCFeN`JAnFO35ZMn!Y~vov7gcw5eL1`%26aye(36VsJyk_f`1Wsv8dbl@a;_cC zPm81gH<4+g96>bUy0t2>~wwQL-l_wb9kZsVcKBTOeV^v}_00EBg!?OX5_QTa!31 zJ#_KchEMOOz}2>sZ)Z5JB(73{;xW{Dy!uP2!yCfXcx*n1bzn&s%%dgNo564)i^U44 zK>&$RKK?|wDuVI(LU>oq<8Ch6TrW!r#3DI*2aFSp>AiO0*}KNhHz7XjTTGDDfL#}mgkbbuyCnKki;~ynZ{*WEd({dZrQiJ)Unrxo5KD2 zx+^yjN%3&Nr*~?WR)tE8spSh@HA5gE>wuu74XPZ5moJ!UaJVUU9gTm{JXUF)3d~*k zOdxl^1qMCblGE>qg}CHG(M0{8!BwhE`JGfVn=k7-nwkSu->8zx`J?9~{KfwL3QKL4 zDX(utr8Ay);@;7nazuimDE_YU}#`^2w8BXp# zZjbK!;UqEv9@!4`IA6|^pfyfQ*j`pq0+*7n&G_(2R^vIL_fyI>8R5l(QGHqhN5U?T zzP7pq`*9e3iaJ%~pmXMI_f4|9XY_i)m9UO_%7Bq^f2IR^b}C~c;iAM3R+{M2Wz*e* zeEYlSkCT3fNEgoS%xUSBJ)&2|77-Ti5m@<~XQ&cV7f#V$z}PmJwq@D0yC+TH&nWt9 zoC*_RT?TgwDb`h3PF|mg0GnSk2k+hbxguz`2BXd(y?qf}2YI7M-*S9)8kY^jis+KT ziaI(rJNmuS8)(Cnos8X8)ckidvUev@8BRw)Zz^tIQB*f62?55J!T$jS8MOQZ5E@&E zN3`GnM8*JyPR%3iPP%6c|JvER(!cI^0ge*Y3co*1QLbZve(l8sJ3f)jcxhkh-~9tf ztr~dcq2zMqZ2A1e$G_6x=%wd10GZi8>(X?evGMeG1{ElP5J$D~iAQzvS-e8crd3LG z&dK<1a7aGg3OIEGG{6|q{AZ?lZ*nDmb)BWjEXr;?|9h|beD=okIV}0Hpv*Bn#TY!+ zMH>tOP0I29T@(5<@Z^TQE1Op$5<;aQa8yB)c2yLJm&%;%0qfAuU>H>w93)TOHp6Bg za391HVEhO0n&WfIlVy>a`1Lini4w(P^IM zk7$fJ1!r=*P=26@h_(4n$7AIWnG}1u&~}q-d%jO52*(-ltS~h;HR&{WF`XQ${btS% z#KNjzw5ui0$GREpqm)lu6YCto(RjZuMWFV%cDvJxL|b+>MKqy1_+X-{_!KL4bI#cX zsOtHF`0hvgI>UQ@djrD6OUv&&HHV>%%k3TiNA-(X{@XQk|3l{afB&xkz5Bp6^Yl9C zUGq(1*}f2&Q8vunI?ei-aG%T2L}-bBL@@5XfFs-|r_kwpxw)}XQ#xVVYvqb0;=8;6 zfPm{lmD)^`)5!e82X6*r>9cS4#OTdRmshoD^^K{TP+)cbd#3g@E7=_Y9|5LDnZVV= zcX6eHUlHD))U0|Js<(7?+hvtlq*p0#KtphxUA)3ZfwG_CYv^ciRL`4|_zh_=a{jw?8NiS{Fa#2I2VIrULxaMG~FdbUev%Tw*y!Chy^J*a$sceDtdGn zTbPL4*Z)iK-wo=EnuRXYGWgzIGpK5PotbBE|Z) zj$bp$49)R2IokUaj0u9m`aD&jm%;8azwAza831wgpv_htZZp+#t6@zZ%4_YqetpNW z42+~^OKg=rr^iu=-@EjKpYMX$kZ-91Rr~1AOElZn^%J5}zi92#vYZTz4aRx5T~6&B z+*u8{mSs6~4Q;|ZlMycCFHb%Y1lJE?r5Qu0y@r|51%TB|+Q0ws)@~(nhqx+-4@D&7 zP_wuxT~tkYFvm|T=#Fqs%k)y8g(`m+%#D&0*7;%12mN|T6kIe!$eQ}Kmwcy8LTp;@ z^SRht`K%wSTR%MaCUo>RxoPBCpF?ek-x)idHlaPPI4VZeb%FHT!#h~+bz{0R<;m^bHi!z?s=$>)LNE$s#a?KTn`)Gj( zi|QO+&@Ew=*qC15etlT+^S!S9IQ^ioc5ttOW$I|uJ6(D*LXtZ-lnmd}ZLNqaOdBC= ziey{KoTb+AOrJsB`#jyc)~<$`;-@xZRBhoVPexKSj zk~Xlhljo%K*(JL%n)HzpK)=}7?^rh7^u*@jTK;)G)Eg%YYM&F|F~;MyE9ruNvfaLd za}%Xfe_Gnf^f-c;-@lskiS>)_@7vC<&XQhAz>>)g&>`gih2skL>cq+V4p*vWcd1ns z45t9`NBltF_U|<{5Eju^-1~|kI{ux@P(K4d+fna#uLiO^h`aL3YP6X#S?%Rr{m>6C z^(*>wM;CR0kDyk~;CFBRBPGQQW|C+7pCmO*3eL))KQ?U6eP4sVkox~7D&Z={fD z%BVSqF6~wrD7LhCdRg`A9pw+1<6Zl7O` z4@Am_V~I~A$ZANU_qNs%5QRe_!itXnh)c zEpaX?4Z9{(jT>@X?cmWxtT0+*2_SAhK%Qu)5BXV8HhWg2Kf(KfGvPt(z5Bvh%m`1bSlREd+44gbx>M7OFGEFP;uz&lCv6uPp?L<447(I1ZI*SJ z2h}6l^1IBHQ|3OPdEamsnn#_(q`5hPmRx;WhHUWpuQVy%%Thlny&21sYgC6$`}$t& z-snYFR*S-Ch40ruimjn->g2E504`eeDv*ke)6z(fl3&P z=&8+u9!`sXN(axys#A>fsqke?HI<{*>i-Aeo+)n;oBKN{xH4@b@{$doP@!<&4P1ig z;ABdE7B=7KIzG+qnZ2>xZLN3nWetH4LsDtXR&U^2+ig0M-C5>hrV!{B`N4%4=r_4_ zmb+F4D2KXF1*(x%oV6s`S|3yUELxHy%zPBc(YGk*iHP%Lq{%K5BPnO2z6;RsX>gnM zT4+ifEcRho^axgwraIO$Q(-SnZe(s9d&PfHhcQmqI&Z~1iHMiBvZXK014MTi$PbcZ zP;D;~zt}#>cdf9d{!?PT@BS476}?`tnV<9ivhTkCPIR-3?*mk9Y**9R4N?Z>ksfx* z*$}r1QU?BxF#-C+=!tvqRacYnTim6|ug&qhRBWwYJM2PKiksfDwSDFpMJYQNU+#=B zOAW?=%p;%PMT(VW!p8XxLadZ?(0x7b8vF^WR5QUQj%1JsYC0Nq?z*biTZK}HPtZ2Qmb8mk`PhpO}W9IZ{Txxy#`lu2>GF@Y1w(tj@e4W2cYqZz4qmx23Ufe$x!3?6Oy9h)kiOhgI9nq%)p;{4-&)Ai6tTN)-qsob}>@En0?^#e#z)YR8h075bMcPtFDe8?Jl>VS=K;KLuea5U_Yd?O$JiKNEn8;IzRNv7w*K zit4m?Rt}+a4emfh8Z!0(+gTNdF^B!N&cSkKDvc>als>Mp zj74pYUXGQCx>gBl@&MH0TK*Vww2dl0^vwym_qvNaUma5cou$&l1AxFH>J!gFrnOo; znRPK5Jz+|%as;CXLY^Av#rr%c?sF13?TdUokC@BPH|`}4JzSrJe2EPCuj&>$Uu2Ik zwBx<_{J!_2D`Z7=Co_#-f=8V95JuXd++o(R>||WJJ~duI6(*vUO*kWN6(*h%a}Xqg zna&&*q$6<|tKsTfDOmtRHTZ}2 z+_(bvE8lcvs%-SlRh|f*KFk-p}{9ASEpI^`g-}EKwl4p#<4K*+(^0Y4Bpz!t4`-cYh@; zA789Qm))&MV7Da~bCOd>rQuwF2`a!r(~KsSMVIzEg4ty(gC3R9y3a zCR%#5KQq7o1$I`kA$A|?%|eqg3q0+-h3X7o0C8ATN4yq2<1QIa_Kp(+BKXI@Tkhcg z0{}bQ`g1+5z>C@hT{KD^RDCNwlf`%_uBs4+)3U1cs`uf%STNHYdJ@k47q?kQup zPR$p|c?ZZRu3erO&Izm_DX90&tqrQT6d_ArMu>(M6a0<`)tg)WSAkT0dmeY+(&thJ ztKa3hZVppBHLn|z%=1dRQ6*2_>r&8q$_1E5KfKA`%`C_>3fwE|f#$-OoJYC+wMx;& z&}gSUa2e(IW~wkMZqA zL%LVlP=`a+fVAZfP~k<#Ll{IuEi2|rUb-)H_EjZi8A_(auV!{F6L_;Zb(BH@I{WA@ zDn^3Wsp~`YH$nc$duexEMbOJb{pFD!fNIGb4`2H)_ zj6h!Tjk<)w`l~yPbafDHX1rm%QiyzgQ3<_N(Yz1E3;J2uZP#}v6y+UH*SDe42trIi zkE}CQio^Zu>iE#w2Ak8v-1NiM#VC8zdyTwuNmL$L1#p$d8pP9EQv297RTqD5h2irG z0D{k!Z;;Z|OeBlTHyX0BsI%Y6cf?3}yoJiEXUI&!R(~og)U;IC-y(6Ev23r3{FA7t zX5*@IuL^ILgscij3C-;hTMog1C-Oa33Jvky>$&8Ct6rOL9x^TC$EyhdK zvX`x8mIyrg2k>#W1_&C|B=yS~80d5awKjCUjCklj3)#C>eDj5ZA$6G!`@`xz0&&cs z1}$MNH5Kdg=jVM7G>OzFd_7VXgg5-4{O0MXY@r&j`C+pBGVn`coopm7_-+j zc`)!aIKIx53C!;=Q=B}Ntr;6X3Sxt`=VSt#AivKPnGpA|mqHticIf$g(_!K*F&D<6 zQJJ0&NsihYe9|4NWT_volMv}3eVdm|NzdhOJ;yiZ?F7dBiWFwNfa-Jil1LY@U4%^v z`SIIaMXDnCX@wumap739!v7+$F7ZiF!LPk?M|dOL1mSS!-CY@+GHozb3i^a$aqB0I z#fY@h5Vs>4^vn9tghKQXmW{YGfeM^R7T?O@vOC^VsdH0&!7Ak&R7TN$x^X_8(B`?W zsp)7X%<0b5uxnE=sL8IsX52+KfxbxlwPR5*(&-q$pXW5!e!YwjI9lQ~WQ_TXk&OPF zD+Ptyd__!vjfJt({4dC<>gMamX#pA&2Y6`I@u-g;_g~T>gbeu#xz)Kz(+3NH(8^NV z1>1BXw2L|aCRFuQuA-&Ai}iUN>^$SG{~MyZHAPwMagR@7edq~I|H7Y3Q5j#f(!tV+ z;42Ajh_MJq&Rb{=yVd_XNeu!h|^Hg9Lk@79kC zZ)o|x{6*a~>&tw6!NN`{JU`jL=Y4dDfJXl0Vc#qJ0yX*N5poJUE+Jf~rSx60UM-5c zy~L-|*_m>5@JXu*2giZE#>(JtlM1~R!i0!d2C$lpO5i+~3lOYdUBTVsbDHkhZ!p?T zK|K@Rh>t_ULtQ-WWV#yD|TtEvYZ4saG(N3Be?jbfP zeqSy?{4VA|oTk{=@#J7zb|}fpG4 zCr5!5$pgzer92ai*Ds7L2bcP-?cB$Y2H_pQNd26o zWA)~m{W&;+7mrehlN>qO^$?p(Md&6S*Nc4bTZ2@TGIE<=ZztwL1^8O0l``l|&CcI} zW~==t+S{VI2xm9NK`mI_?thsfz5>i?_V)^>JUl&IF8Ko=zrWOi(nPtF~Kw;yrMM5!7CKkQ1l7A$po%t@(?)zU*d`wCLjS?0$HzVPZ zFhAO~LytI0fpBvjKJ{ze=CS0wh;Df`&aH22r_4Nn_*s=1neJcmn1!6YHFs)N`59t?*l4`m^!B*MdbLswM-=?q-f7CUQJUr5r zeqxAkLr-AC(VnSkidPQAmFIf5zjUQSyNb{#m7#wk(F+r0>9Q7{sYcfFgZVU5Anzh! z+ec)+-|^)js|lEXc;FcQ)3p98!ViI{8c#a6F_nR<3%y+$!wx!CSA)D8wyd0$!GejS z{)wTX!nTQtBExqfwD#}6Da7$1MY-4)WdROz8E=aPv2Tmgf#+mH% ziJ%0wtimwSy&xY~@QOy)RMR~FeHFB`+gNcEpA~Ccgx442vw`)fv~4#xG!GP0gBJ3Zuwx2r@n{+eIg4X!@da%tkX!m~3~!YyHAg!UPcCM#hf_{r82<%Lz(HTfw{#z^KE@OoMhw;B z_!@2v3{N9LNg-&{L^f7;hWx^93>vjZl zoC|I{xs3+KB~8byC}0mP?pbaGUqA?y{5Ub1AG6*Xs{L;DW2=?K&2v|VM4>N)sq3Vr zO+bxT_*H?Sc>9kAg1%C|T*>Y#TGZ_;JUyzX4&dc(O~0pItFh#a;^hIZNWK`t$hM|Y z6TZ3sB*@{gX?P2C^>tB)j3d(Vc8vtvBU93pnP#1w>81OE&*013D_ZeHx>=!r zbz9k3^)Lv6JtSmmqCT94W}MIVYbLHDMkPe@qRCIRg?VOVP>9ez|^~+kX9Nz8ayN{WHN~GrOqrc9eR%$5fyR=2I zPmOvEV7BKJ_o!rD3R$%k9+=2u{x^kS3TOhz!l#l3SWh=w-FzuukZ7Aa^m^oc;bOFf zL|S`NAB{9c;TorCYCN3z!jV=nm~qvL*H)y$ia6XRx4po@O%k>=BFgil6Oe)8Nu>`Ky-zx`0iV zd_2&~pixfqRi0Op5!uWkULFCC$1m3P4x2I0Is16DWUGqQ#ya+gR3v~SDvUBo+jV!mEDVrW%%TE-##9G{p4b5 zXz7E>r9h4&+}lpTAs`2oydI0owze>{+0+Q-Qm^5ZYhLsq`9uhy<|Wy2 zgYXS8)5nZ=oz_&9OP?1i>Haj;=cGqtZvu>HYl!9)_@|0n)G$fB5!X-ctTF; z3cCN*ymhXKAmXnAlVF>$Fh&(A1$xZrY?oohL4c}{XsQCYN(JZWmd4McN6&GdK>%7z ze_@#5#RTz+gQ(OzhjkQ=Pix(HZ`aT}t+0_uz$t{BP{(nZr(>4?K32Gzo&TnmnT#yd zIv%>C%Jp@vqPAH9UJGVUA}&Qf_7u^~XeMkPeCOz2 zXPUL6`sZNF?4bnk==@IqWgj_hYo_n)ZHzf(jMfqdsCVO#{w6;7b4P#!Ts_SWFHbz3 zQ0|onlItxoaG;p+WRUuF&@!e7E3Srv-H45bORcFR@PqC3$;UlD`G6BT+jU`%R^M(< z)Z?Y$xlwiS9d~Nx0y;~s(D{j=zKw||^7dz8D>{26b_LVTmyl@+4lktO@K#sC*&cY^ z{i=ciIP#0rO~^9>&a39}LlaBKa^q3wf3$a|?`&Xg7>`|%p~}!E7`3#6l2}4WDXMr) zE82=B8cUU6FcG14r5IZbb!ms9nxwUcR>YE`Qf(}Q7G=aTCYfF;k=SZ&>BM|`zr5e( zj#&<@OFC;vbXlKr*K zL|_8Zp407_E=LoR(N7=eGQzvhM@)PC`uwAbk%9f|uV)0}{QUPJr-_?1MMCNjQr}h%0c? zU19s4G}H~0cB~J`l2j7S146s6Ya#LAw3+gt8A`r4$bx8pg2}S7vt7x2n=Qll%Tf`W z8eUiQD8F2?%#QE@X$MW&`emr)dOu%M>@dCeN?K;C5qRzDsY<3x87vOUQZLk|<%g%+ zl(>f2uDI^hniw;s+fvt!q9pjlFL%0>)hM2k55RR$IMUhcrq&~sg5yP?ss zcJPC}-t)(3C-ESw*c-e?(L($yN{306Vu;M8O zJx7+?-qgJ#mK8@5r-H2bqly$;E(caeAP^8!)(MtKdwGL5y!t>J5@RQ>;lP{5V;jqL)@>@2g`xDafgVRaRcH*~2x$0vQx?6+Pm^{GLJA_mGBUW-5 zj>*|qJne4b$`k^NGvEU|4flI2CZoyI7;L2dG@_R#xU>fY7gk$p5s%6tEVf8_j1o3| zDwZBsUU+xIs44O`)iW4FlrwFy;!z6mh8o;0EVzS+uZsK&vgAVz*o|?-k~`TDaTnZo28#-}^ZB@O}&t-8tIiBG$pk&2V=6)MCyO%OiFmT64d{L;6vGG|sD?H@iQGUJY$aok&Z68)I8 znIqEG^UrFP6QLqRi_urWa+PRWorxd5oCvMuDPw+@Z37zow%~uKj-7y?aZxDn7vL-< z_Gabu z%=R80S6$;&2)+W=SF4Qx|hbB z)u6AwStLy$yef8ye+pCe9F6v|6Hy9l32P}e`Zx72`Q!m4G|2%0OF9+_|P6UQT?Lq%gI; zlqS8Pqnv%Unn|uzA8R@??SE2b@L+UEPmM7xBojjyU-Be42e59^aKxZo;swypI(Oz! zR|o56eGpxd*^GpS!jNcz>a(tm5dMQ?!8OB@MMjZmrfmRA~S0=BQZN=q)$_4Nsl>Xg(5n)fx5OeXKsf%)!>9 zKx!2J4;hq}45Lk+YkYCuU_RUn=4IN6{jtpI$3;+HOJ}l{#n^CGfTERjCD|VnHjR;+ zI2V$X8_$XiZx_LLsPTufIdhuv^1`{g#z)V^> z?vEYVQq_Z1KebnNf6>=9yAi2S*gg+Z>hC4$uz5*ON zBKnJ4w@J@lnx-YEXG;E6^riwEh2md<x-0MD`zDH(#na0?I&k9k)lCV)|z#A^AVZc(`#Qs4zEYHlB=Qz z{D>DTpkoWmRqr{aNEzzfU_C!o=BSvR)7Klnn;i*N<741b)$r!CU9FwZ pst3E<%h)$+=s#qEB!j`4{dnZNe?M3HKU2pZ|KIDs?ndkD%-?;-bBh1~ literal 0 HcmV?d00001 diff --git a/Images/Preheat Constants.jpg b/Images/Preheat Constants.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b945b2920dd5a5d2b4368c0dcf914c32d965bac7 GIT binary patch literal 43184 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 *+_Z#*q~ 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

p#fp7KxkdC+C;WxbqV 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 K5n;!F-u(|?0y^0M literal 0 HcmV?d00001 diff --git a/Images/UBL Manual Tuning.jpg b/Images/UBL Manual Tuning.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b231c32d54a70fe95eac5f157f27df8a67cc128 GIT binary patch literal 39431 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

Pq$($D5+`=V&ptwns~LqCzR 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

wSFC2)`IW;XXPJj1*~ZZ&sR9t>Y#C`lAy z(dA&($mZqSCc5;EgFJ>_DV^LvJ#5DI>2(Pz9Vh}>ocnAX;#C7r2q)&kLI{4qT(*@} zo#|cbjR>kA2qGz*(02`S7gg$9-VTl%gZQfa2)@8jnizz7Fm4lrZ>|g5$isv$l!<0P2gZkj8UGEs>~7 zwb97uJUEbUN!?TKwBp}1)H;@&M&crEz*5`cvbEcz${CM!WM)&7e7Us0TQ5^o^4z9( zk!xEyRp5dn103kuNeW%w3)_U%=<>AtJl-_dNc0jlq&cq*BVrA#o1|;*T>QlDORiU! zcZ2TQq$%Me=-Q&2sm<~xC+wYacT~>GkM**-X3)-a8 z?D>tWd>;1##2XRJAjJWDR4k{I@-Ab?n(%G!k3M->UGU zV;vbTXgc#=+&K9$tAohm_-C>ZPARm8Wo7+v51K+)$N8Fhpt3Rb2lwqyBRMd8lvx`4 zG~s_pl^n4)SxJx$bT_y2Uj5<_K9q0Q^;M~(XBttJr={1ajy;1Ke1hdEQ{kPUt~{iA zcZfdqr_BDT3W|IED@V0MD+knXxiJ_Tn8&$iZ|v7U(cwJtI;2_Pw=J%bo*QaGQXqGs z=#05~FHE4D1_DnY7ey^nqmxb9;wOgNfIO1pLwn!bW$HzV1)z8quSUTk+83Mt;=9wk zCZ#FmjJ>uxYkd+DM{f@$>0T^a3vA)OmQ_Hxuoowi>kf}LM%1YG5=J)sk}|OW0Q89| zriGx(6W9*L&9&2plA@p!3^GUt<*mBauI$Fosv_xInU=ne2SBX%sI<}F2~_fy%FsoP z{mSdMT<1r8O|-~&mVKA|k=|SOUG848(@z6f>0)~W#oAmgb?F5KWlVYDr;+U1;ApXH zv!$|>)eUq`8C)(cve9K=F*oKW*nMBsRKzJNDI>K+Pmbe2;kwZdv`q3`b5$d@3vKdO z?_cmHKF`$#sGs~a+V~IZuCj`jrh9>LvAF8Aswt>ozwmceAdT@c$<|m*Y|?) zj(Lqt_NTcvxXcBXwN@KjM9}(}OB&-~ZVJtelT}bWza>}S1{=Dj25N)<0EZgw>7Y$e zfAHhuS1BnfE2iO7H#3MQrpZ=PPen0?c4d>^pIsK!*2PgZPuw?O-&FA@NashyU}3i- zb-Zwj=Fy776{2v>d+I%l6BQnuXTYwQ*X_~6Jd?)h*-5Fp)ILcCCwhm;de53uQVA5= zvQSMV_f!E-l3b9W1R)9mq*2Kh)d~r0nMj}#NCxFK3JE55Mydg!B-H{W=0*mjg{^D8K=Tsf|FAEMIiq?2K= zT=V|`6Vve>Oz3FnDBXcoR5{I(aLa-BdaT+yNo#6Z1Wg6*J9G<22VNNP`mS!CH_2N&BVlunTLz1hqUV+>Eu?Sb&B`gsod;&(s%d>xAOcAQ02P!JWk~0Sa-18NvgQW`EcNYeTfL)|E! zOed1Dq=`r#is!Lp!%# z5mD3;7J=;#w;^+|S`sny_Fj>(Fv#Z42@TYMF1&kO=9-3Bi}0KImC{(^qrt-*MI(bKDXvYoN zqt(LRsIu}xDaG17*<|;PGM)!fOwuXjpcN85{<#3yC)!8TvY^2QJ0dZ+S2n{n!k=Xi z`$^-hf6OepgY&a%bD7(pA2qj28gyYryw9GD>VNR;*OKYyrlD_Uc$C0B*@fgITk~A) zEj;hT#O;a3CTQo|K)N_-r#+Q)d?#lwxNWr}>sZovW^+lcX_yhfHPH_}uWL4D<5xp3&cdr_B?j#Yg<&*OnqfPu9@eXNybsA_7s@<9up$hC1Cmrf#eRs)0x0g=(j z*Elrn2J5s^Ym><~)8O!ygAJwaQz4%1V}Nr-v@a)RL$%Sz9x(RCz|a~t3qu!;)m^Wq z?&FAK$miRT2b!>{q&L$J8Uf17 znZju*D%$o_$DFs)I_$b$%0V!Su0t8h_SvVY7rNm|$=U3js}iPSQg>m9FjeN@<~PbO zuO-t?8CgS8D(J;5aqAH##pADn=OLnWxSMGvkW;vmcRQCg&_>#-dOFtPlku7~h3~ea z%W;ff6m!icnrWP!IQi*FIXv?K{(H=uXd#u3&>oHLb02jzkQL@*-aO#M0+ep^_&+CwSgJsDol{9*? zNoe_^o-jwtQX35(Ie9Ld6Ppu(*{EsYd?C8#-`Kg%(NjqdB|iYa^^} zd+I27Zo8iQf=JUv*(Gm-%aQ)Ec5)b`kD7BNqS86Uk!x9B?43MQ;-`wh{E@lszb6Y= zuMA<$ti?|VgTSX2W8$9Pq8uo)pOX$L|{0?SG*@XX|ua*MOnoJ#}5WU7sY z)bhQNmWx;cr?q?GZIk5s6Na`i1)6Guo2k%dw>#{r)v#fBCLs+|+9au!&x{Rj2-EUj z_;k`#QsLDUGcl~EYgto$$N*ehs_5XV(l~7Tv!Cr32;&EU+@j+8TIG1tO4w>6k?{#y z!UU0Y)4a2DM8ZySz z7^@m??C!H|eJ#~$x#;D0kH50NXoeyPZXo_8hoImr3IQB8`2}mW)zH+K;fchUg`KB6 z1kDLJQ!6;}>TSath35GYlWT+B@h24rd>suYAS&?~1rczgV^0~mY}T7-v!baHV|7r# zVT?@cHdCfcbXsqvg|uRthO!tVBUfA(JI!HH(opxxidxApA@pLD8#FDyt_~2@sdK@j zjTbivhB=?dkUQzX(cAM}r7+7%E_ZSK%IPsVp{By&!{d-j<{Rd2$90W`QO8q<&i7Qd zC&zNuAFrugvqiR&N2lXSLN?7>O6ez|q@kb^GO9OvWx4{}-0G)|S2mj-j-s5z>o+O5 zxYt8&k+(aE`8Sjj4SM zF0_iS{KxBYYecyA>r+wx04|=z(n$I&GY_ePmY`G$lW~{od8|A(7;3R8qp6>P86Lg4 z+d#9LEv4+~@!E~QqV64DVxg#_V;*Onz{d9dQ?j*=%;+fSA$!5Aryn_UavU}Gr-4gD zO4^4@P{^tSva&}D`Zm`^OB05YIbxnF!&`SOsC<$MyVO2Naw-(tvPrjMvQSM$K1c?1LJ*(?Aqo@`$pth5w?u*lsh}aSLS!P# zAQ9|Ekf}j5xmg^LgF+C1NudY<2_aAjLJ$DmK&g$?N~8g@_KVf_uO{rhqV-Rj)O!qN zZeZ1t)8X?+6|&8CKH~a#EHbok_>1XoCVNI>qg2ZETphkVRHaPaq{eF~;A}9K1~*+> zbw%!Uk8|FAClcaSa|4I@^8N|;a!2@yJ>hw!k;<)}_~VRQX?9(GRMJtyOz)zK<)99$ z!w##Oj}(?@2oDVa5-)3o;wjDSDkb-?DBvcpR`F!ftv9}EPuUimdgoz&O++3d}xXsE+*^H4& z501?NidKr*D#X7%Ah9_{-byuf^)=Z$%(?Pj+5u~_1J`^hi-OP`h1S=+@MPg3nAbxjkT zX{9X9zJQO#R;rQmHb=6=PWG|IOciN?IX!1sj=fpxh2WH-zpzT z3V+@uc7{H$?haL-_juS{Z&rv-@TXP{Zx%BGLj!DHv507#o9{E)i)~S zl_gzEaNg=AA{U#MXswK65o-iut-+SdYYmnpF?`VU-Zj`cOhi8M{{Ry7smXnwO(NGZ zEs=e1ub=9@r>dHyw9P4bYjU>s&@Ao{`)|MTCLsrRKjK+U)mgVzogPuw)l!OxV42L0 zT^5g7P+*ux*-1mSPp8jXwH1o054=_(mrIMn`gB>ZA~pfo(Y`EU3<80RI4#6 z%HYveQ2BE0b>U!<0arH6=!^JOMD*=@pqbGZ45ulz!nX}|Wiv8ERV-}1?AK{^iqLry zJ*rkcPrY-wE}7^~6;39UuXN9I<#BtRsU+%DrmLu^Ygs)*bW=VGnI9B}H;tUrVy#D2Q4VeuM2yUC?5`r_WKu@Qmxl|LVbt*ttN4}4 z$;HxVqA5-`(QZkfESy;-E`IrowfCt$s##f*N{Jrb?B|jd69ivj0vNu)Q+azeq<_Sj zd1YH%$K)Vf5Nty9?-B>PK|90U>o`1ueX5({V5qiTESZWguoje@R}8~SS7@~)#!DF{ zFC&|sbsjMd$R;7Y+nY~vufmSrpg@j0`hit8o!DtrP^%o%lFkRocscHn=6l@Z)SH#* zD_YXf8V8bDMYdfbCYNWMBzBdNbKLu9d!22rZjdFutBCR|(=CUpi(g^*EqPydW5@MJ zkT!cyinYXTfVr?yrf==AY4yV28G1MSvhrs64;;8X-y7qp#kOH_8`SDD_Z6br%5E6>*6KCUUZ^9w$)MS0u--PDqfyaM zE6K=Myl#;``Azqu+>xxN``h~p0~}iCHZohxhUkz5#?5WXWvyZuXGPVIU&T(~|K^iLZ(oYBm zSY(VHvo_1XgjkdNGX6~0(WL6?Zbjb;UHYG^y~>Of^3NtnV|0$S?9p>%=BJVemP;F$ z;ka`Mbn(pQnD3z0;WI&0AQPH-1VmgvE`?Si%EuZ`(=(Gi z@k(8g_}~H^m$o@XyJ~vD~IoYC7k~N#Pobm=5$zY5Zbybin(OU*0I?GPPZLZJT{e; zScDMBTpIUSkgs-hk}H8f_;+Zi;qyKWLJ1>`$nfEngL1Lsg~$6l?>D;iXw}nTkTPaR zQ!%KF5E_2aSP|)4F27N$rs6}3!&w}(ZKjr;rb0)oUC^#&x>rB{04#oMIbfsG7$)WX zpC--+hBFeVJXht3mdpXv-=d`~A(hUA6Oc$*es;Z;zRn-^)jiKM`6|`qvl5!xku$$E zP>n^J-hN3&{*8*dEDDC8Lp;+qOrVi+bSsv`!%O1GPF%*<-pj9!vDNkM!|U+o#OYb9 z$@H@LE>jm{VxJ>@R!ZiJ^b4bcjFltL3CdAwPmy5wam1@z24K-_$IGJ9tHS7NC}pU^ zobTDrSp%=B&{%s)^6Z|NACFf=bbG&9}%yA0DDOvj%52E;|LMj^WhQ4W$rVx$Qa4?hU!Dhi$fnZsYC!iw?Kl zk@+q$j9f45_GFZnNUPv5JSLW|l3I$F<~BK49b(&GRnE>nY5MYA4`rM4)qOZt{MH2E zh~5uGlwy)-kd&O{nQ|j|qX5_tIqbJFTq>H22##po#F)GXJUc^stSJ70hQ`*m+H+gg zK>q;Q8gK@@Ku(@(j3XH*XKd4yTxswuCl8|-d+PBv5W;-|U2BhGr;Ni(1!hVsaLWO( zb@f{@Pg4hGsimcXlR1L!Yxy@_RXky=sKTjhoe*V2nm9CATE|N+vc(l1J3R2sCzGCz zN-K!HrF4zLsM*=+Dsu^Dupz+uyJ)%iSo0BZV~bi%$QlLFVa##twO9>0y5mjuT7+XO zvgMSbl@xF+Iy(B7nUBrFGZy`&YQBz!d^6r~YPrQ=hKIh~Vp zTnkSW=zP~jjx}cqTY&vqDH<4Y1pAu934F z%ijkU7fFLs(Nf^=#VexYv>drDdup&Cf?9``K@+5K7a^khE{>ij%h;)+jivGzn>C{6 zbfqpCw%S}4-GNh#Vi}tdbu*cr@tvA2qVUIChJ2P?OH3k@J%^!Vy67S<a%IzTUAe87Bdqq5cCLTfzYU+tj6;8ar8sdev72+#WfW3$Z9gaU=CQ^E-lq_^f5_1 z?}`Y^+;(e4*Fo8MB^acI(KrS%&2`4dqTc( zVqKi4mRuu?c>SXO3um)2QO$`4)e>L+TL`#zhWA-bib?Ak94#+*lb# zK?IG(9$wPc$ZXPi@>=m>(_s`vv~=&Nta$XLFE;Nf)mWD(Q0L0sksJo?Qp0_9h9 zPNTrFCRJKDOEa9nPT-9S^z6L#j>Dss<|$&1Y?ptm#*1_CruaWM`bMywmS)+=gjkOJ} zn~4rUA}>G7+`K86Ydb&PsqE=Pj%ME0^sc)o#kDFt*3xSDvZrb(HEcxmUwCxS2}r*)$zTMHY7Yvj6$8WT;1v4!vT=6kG9iqFAI zn9M?kXO8zF&=bCf=Ihv$U2uHcbm@x~c&xzbYo=pGM4OiTR~Sd6eAi=&0ZW5Y(8}iV z;`N#h`mS=544Sf*rlvB$$Pc6m)T2p04JZ0?Zs7Ao?#ouTI5=;N0QYa4>#EP}wLDcg zxNNKr0yj8cksB4OfnoByv(-(!VATNTdR(k`Sr`RGcy2dpmj;Zkj^j~tvfWywju+o1 zuXvLa!LcXShREu9GRAFU7a-y3F0y6}BMPsEs#X`($(lTd>z~7DU5VBh86zV(ORn?L zYD$&Ri~2S2M;cDe*Ve!TYGaTF$!$O&XslvEwJgCZCSzSKMpG-T>uNVu@NAReRoFn8 zjHr?Mo1EFC4fRGXR|PBZs#i&!^f^SOx{V0g6h5fV-1ciSX&;W)VXrN96i~U$h>aRW zt@*AZrrc*(Sa>ec?}DDTry6xkZlIZcoqEHfI_lsh@S+QQxY*mk8^fI=v3Z_!UJD&q4%+k@D z>XJ8Du2*p3F^&8;F{3uQhl05sBd!H=rgV5_EZjZ^L@8M#oK9zxVn;<$^>6RatAsWu zW-e%M%~Xpjt@N?{DP*a)(=$)qUU!wc>x0~}MK-zUw%$s^l5j@TOy_ALqB>QRQt{29_wPZA{y4KT;|9 zWsEY~!gK2nC54DQwb00YCvh_y>vbU=N#3A*E5f=t17puNe@jnB%WET)m7L{@FoV^0 zS*pe=XT%#@7;F+Xp`bIMUX|G0O=Jy)tz--a?%`-%=lQI@8@}J*m}9=*;Jr&NBf{{f z^le4jYS`dpZ;ly@Hhh4S{phjkCz7I5B+@zZIE%Qb`tOe?P1GBg-bKu(3f)WfF9ljYU2kJsUFcrg6+mb@5kW?FD=^?SY&ujTY6KtcrS0 zBw38F-0ZzY7|?N~T~=!2{{X{_`08A=P8x}zoKF*rUwirauWH;*s}L>k4i;|BV6gL5 zyPJOX>9&cc-#GMH-Bp$Rbmg@kRCujUAKoLUEdpU@W^L`{rH5lRxNBU>ceJ(NRpQ`z zEcsiKXS5rDcStW(B}n=6innE#R#ck4^k#P&_sxIrMPm@gYjFtL%7?crc`#+an$Nmd zTHTn|CA>cosl%mwl+J5Q+m+dc#h0ZHDOW=?<$_x|`nuxap0-ruXm##X_+zTVogF-T zBFD-#efU<1h?sNbxfa9tKoT0QEkYHJ8}OvXapiC&`_#F{KC zr30nHq+pN7-j@P1$otjvFz_a-h}2CZrxLnCWWH?I*8NdERP{3nryAl7P+>Wun>J`5K>G{Njl#SO2*XSsKIr2A(D zi7t{6osZSi2ODX3U1o>5u69=t4u;2dsvwBp=GpG^Snd{kheEqyn{B(~^8A?6N{O~d zw0bXa@-|BMz0K57s`NRx+dOss47i=iHtJMCA=dyA=O^-V$m6s-Q=Jtlnsz~ zOl($72{4jj0Q?c{LKFam9gu|%eGr893IP-$9FP$RPnt_51kz0ab4KVw08DI>6$AF6 z8*GFCkwO(9keN|J0Nq6Hraff>s3#u9d&RL{5p!Pg^Hx2NpesiTHi}SW1_`x|yvC{r4ojO+nImCZ8 z(>=IuH!V*BDI%(|mC`$HIazZ~AGWt&^3Ud(F{p5i;K?cf048Z+xOBLcK#DV!t<~=P zA$Zo)cUsA5^Jd86+}5?#oDuJ4D+^fnHLiV~W4`(&j%kb48-JKqRygXJ(d3_z$NDeH zfYL%E6&RaibK9E5pkK*zxU(9^1~KABHc}ekEpgR!-R}>@XM&!3Ie6}mhRGeJv^uVL z8mI2FJ^<{(IkJOo*GXegYLVuKNzFATR-&YmwyBixftlTUEo#gP80n>wj;K#07c(&1 z&;xbh*|ThRp5MH*=vo82LSZ*qC)7dXK+XMB^C zWRmEqh2c?DQ^{9bHwKlO7x=FnYYY@2uZj8Tg#OPM@Ldy0J&?PJ zCyC7XuQXt#c6)NpQPzsME*DK)%84po<~AXJM&36&C}L3IQPYD#Qt4$T#2u~fQo$=` zq-{?Qk<~0MyTf@6cUEyo>1uG8aTs9~?|I9SwzakVS5F*uv~iY6thC<;IZLD;^A*s; zf<^KqwX;ZgnRBo-=m(1Dpmm}m{{UF?{Z~nZ>)E_RU9b5Ch($@eI_8|C6yjr2Qq5U7 zh8E^0pC*o_Y2z4V7;JRhCppe|ImtQ|KF&!41leQ_t9T#@4V#sEc8)U@EfWiahy)T2 zhh?u4QMPh<+sdN4II5j$Wb<3NP7^@fHMRJo&k8~s%(u|q+Sy^$`c*Pm6VE`pHw*S6 zpP$b+Px+UoDM=*H9!Aui9yL9lV==g?M9pMUjNdshD=8haWw2Dxm$aW6@vgSBsHX- zfL(NyzL#R_8M(~s0ncTfRGl-clTcJD><&MaDPyLPGCHqR9c`u6xo~_kp_LTWq0FeJ z1Bl~(VM8CQeH(C^s6cb$Zh-#)2wK$q107tw-biXCj5}9BAj{nZt0nHL@@px;>{7P1^7dX6t0MzQWa0q2?IRjrC+U66O7W%p!*C{2vGuWj3R*wv32;s!!iUwt6 zzzrTNYKH`;r^DwpZETeRw@JqRqHib!C4z`C?r7I+#ZIG-h6fjvva8ET=ot{{ZagaZwm`K!{~vy@jo1hY$oX z6Km*v7ggG3M%`E%99ijEb8MrjG_lTNaE0e6dDyQyj-n#YS70MWbceoB{TVyS*N zB(p~Av94@{jhsfy+T)Iw2g_2OOOrbhYgu1V)&SOr9S0@O5qTZvx?ElvVZF6qIBATKYi=l}6ZobMwl-buaym2~8P6iK!(8$VWOzP6m^8MOQnlE~6KAM-c z(m=?Am|=6Q;eA(|;eBomgo;tc;JKz;r_`~zy7R>^SK6W}tD8>l8MJ`j{{Xr?*QG)& zbbS4t_IYDig=BQnK~aRqPRR|L@H!RDx0>su?{xSLYMLm5( zp`~VbhL;h0XcARcx-_}q-RyXzbd$C56H~)+X*#zhzdNjYXjxH;!xP7#`9N?QX?3;P z3OW1a^Ki~V8{@z4bXjbP)EMj{s0i{(((9c7y2?tO3ux$pj-tA+29laFO-&JV9MNZb zJ6!u$6+1&@A-gWyg7|TI{65aonPR%1_T6v-s{CY^T zM%M>5uGZF69BO{ygZ^}8ssrew_?HKhgp%m?tWi>Ox5>~+jKP)j!%dR5X4*+UslNIw zNSzZgSRFG9;|(Rv9L3j`YOlJF;$AOxK&y`Nvo=RqU00K5(UpoYTwf;rEo~J(B`r^N zcMA83gX*t5Uaku2ku(rGGC|Hx?kgyovwxe5-k)(AA2$B5)dEel@YILfP z3xr#?%_=NJ(o$8^i1T-bFFQcP?QLs7# zcfR_`;I7tV(bZ6zVMN9YS&q$oyK8HBEH=kEYi#yf$PAzDvdf>5E-4+J8>Z~i!?9P< zHPOB%PXqUj+5%UWC5Xvf>$$CtHVa1^c5hWnhcDhY+>@i2G~Pz-(LA=Ocv6*jp<=wu0ZPo?4UsbA8{c<>jZ+ zJNRQHuFV`j5t|Q{&WwjK`aOh?Nly^OIjqhdLH__e`-+<) zoS&yY;-bjut2Xh)wCkcYc)XZhO;$)*CmFd;eo0|??N%JuFg23Kc4PKw@LBZ%!lB{D zD&LFLz_OgQ%NH#AuD9C@mIn9%_#SeWI5HeWJDH=E>kyRC-WUOHW+M z;cyZ&(gcgGR^v7CRmoDvut^{R*JZ|=ELh=g|Ip6Uw2gt`c%F{lV#LEcAnmRc#3aOzHNg;DbUHKBZ^WQHUwVFnc~g&&-bH?FW$f6T)cU%_B|e4HCmh1QodNFd&w>#QDs$6ab+o$ z+!pE>c`UhPlt%BKkpBS8SEqMoQF8wPh^;~s$8EmJERe~RfXg3SPu?mpQ^fc~oZFsvTE~&axi)jnk94Ay9#qxURGEb|?}$6r z4K@XMm$<(5o)RC)gZ6_x5MYHF?CCw#ef&TnNJYKdv& z;z1*r`&#Wb(OD2he^Ej>V=_n_(O_&5=WW?P8LkM$SyKpbilRuvjmT@Qa=fLQNuFOT z-1nW_<8oD#3`0zTE);)cDD$?dkHu*5bxiJrMCqPm8!)>;>|O+`f;j%jUKI=tb8?Gm zsywcIGcOK`&oGDm8@!MaC(*mf3>41kjfzDvvdN)tnAr#j2V^6X6aa*CN0IgaStCCbCdBC`U9P1kz0aAq5Bl1qB6A2tr6eDHO^|hAqm8-ApLEa;XW!&3mwF zSBx8#?#;?B%k(EJ*iQ0~B}u_t!u@G{hvueV;?Cb2{{SL3XsD;eX5qlyd6S?Ez()5< zA^>JC%k90Ew`J;OW+ccM;3Jb)3vXbv9PE{OiMClU_^vAw{dw&6d1bVtT^fh8HNy9N zBHz5QWgoXg{4UvbHBnJx6>=IX*P5q~MVBGEZn=3{MQkAM1A@6Rs2uR+mPPv(>FK4c zoI?vqbB|4jUnEx3Nkvm7G=vwh>O%IyDkXyuh{Wur?hJR4E8DbMV>LJXL-JWz)~TId zNqKepJ)`X9OW|akcp4tuz!Gn&#m3-uIFc7Rt}KuOTd`deroypE=-`%lTRR!UXkoUe zs^{^#S5fh4nutQ9%$y2)Rc_KA(En2#S2U1d9VR%)%I?pnv~4RTQl3M z<7m~RTc2f>YyjIDr6cWsCD2j}V;!LvH!XF&#dr;lN5!)hAXo?RTR zFJL>gUqE`RC~Mt_&9_7&1cm`}O@JONO1lS^f`S@}Wb~wUjCS>T?z38QhLLbZh+FuK zl1S>JN8Jtmdo&2p~4+oG?`p2X!p?g z-D6V!0E3Uobdbv=os*cz^5Pxolc&?r(>9NXL zX0qzv2R}?L6aN5=t;$>t(&2K}%_j^7=8d3U{%Z~ZIBy@mf4!GYfs*_Zy{>T~tsnw) z8Z1HzP1(~l~?zbFKakGr_&19>jakWGCm+57%gkX?QMr&~i z_%!6%q#J8~Ya*-sORl;mi}n!T??3+lCFqJxB+n*R)SVS-yE`K>SgB%ra!d=D=O3y! zR_gmZM*3M!A5dR3A4nYQf#AKnR}|7#Va=vv(_RDqZc00V1zD;#lb#$1^dQOZgSYFrO37QbiknDHr|>7Vm#(6Ad4ZGUpfdyA?G z=2pjLhx=*15xV~6DK|#vDJZszHFV5oB>HIIm7Gk0&N>ZwtsHX)r^E309~+CMb+bD9 z6`zZXVl@Nz%Gbu5ZqMQ1Yi2j{Th=ymbC)04%|<_I9!qBfppOx*;m;sz8)931U*xgb z{v*cATLNvdx@&`Wzulo+nod;DLv3Si5XNbuq{L)~3x*3=Uh7v6?EFokmRjI=wzyz* zjC=3msp5`>ouDtPYm6Ea8@}3pE20i;@YPPrh@}pVpayc?Z^WDak2Ld1MJ3t5R*PGr z_Q5dmiC2hR?5%4{+&Q=nz+N@C^nBK@WLWs|rwJNZcn>ykw?(B@M9SKBTdTq_>dGl( z!x-q_1e`Ymd%4{;_A5|fSS(RT4NP{aF=lpWo%xS_)bNm5O^94t_27&1*;vG@YazxU zr!dX6B8+JbE`9`7F+_lhujbT^n7ZprxZ_KX+za!&80q31ApAD&&rO zy9gX?#uN0Neagpb+T%}1S`C8-v(XCn4^>4~-5E_gVG+2IOnqzHU4ImK?Qzl1%OxM| z<+0czg0f~n+^iO`zR3ZjK{o1oFJ9390K6yLlJm&^7g1}9qKUY$@ns}c03z)|_tkuK|fTl>Ot_}Qoxh_tEih_mM1oamaO>4OA!#x&m z4M58J{tSeMHKpWrw7MDu`G`VPC?GU>jYmPG|b^p(tX1Lqua7M^!Icq^nDMpUQ! zD>bSq=qvEq>M3CE#+msD`$cnYZJ#fi>}v#Y;Wg2=lv21zGXQQLdfjqV@k>!rBO+s- z>)y>5(#qtDinL4U#aMITGmQ*zDsKg_J`CBA`w;Zlkw`HP# ze4W`{ltT8CZ7~rPlud z?Q#`>2`n~U)hpa%bd%A?9JA6H9Z=U_Ip}&GYlW;oIqY2=QdW)%ZKj(%0#bb&ypsr% z=-uR@lA2>;kxXn>O#)#>Fo0;fIUzs@-3U;jvMvyW0EAfOq}@d|SxA*8!Cx3@LqCw~3e_VWwMNuFw8ae?5A>3#H8SvG5q4960MyX4=2*mO9% zpPpXo&q;@!$LfrBrjD|uvr`wBzWht*JS?%e(;Hfu-w;cUE|#Wu#1>rEw2`kL@3Ut^ zO<#vTC?8V^j(TBe%wyK^D;FH9eOQ*Ezz0b1Y&kC;EaZ>bj=#LTt6wvztmtx#!&}{N z$+Jq1Zxmvjtg$U!6)i;_MjIRR#@omqbS_#m>zv`s_J0(_ za($8SUbT`bRUQY4zRi3)6r*hial~o!#K&i2m^Cif`l`6jBylRB{JCR{WQ-m1-RH0;_k(Ht_KHp1~z9eE#rS-lpeUN48uhWAM6q!|az-)6eo zu520dHqo?;bx!l&=-cmHcZ#*C>v*o4Y}&zbDqJF+&y}DLadt z!rw?=LRT+K-VHl4HH31%v3d^lNV8*D@+A63-W4RRvr7xaB*SVR<}f-r1)ke(7rr5h zwxSl(Qot$c!MSIO#Z#zTs$|s7nbKXYar&!I z4#wc3p%mtbJdtO+F!Yx-0h|ZrEcK1osWl^a#dT>47)RZ}&rxju(0 z9!lM2G2UU|)4|}-IAfiqr+?JA2ll~GqWho z$x92zUqZ*jEDfHVo3=Bvby<^#8i!{$Jyb&%uN;zHA3H2IlQe2^y1B6iRk7I&dNI6! z<`t^`(@RxMVu}X9=lbty^_DJQ6tXU!Pw404G_V@p<5cPRO_xI4uH}AfQiB|Q3#BZi ziQGq*Z)?*$tPk5^uH_2Knh8sKzcd?AMnPd+{dMHYPF6Amtk?uk9?d2M19> z=?fEmebmKS;8K9d=r!tbGSlIl+QR@LLEgS_tQrzGn5=nY9vVjc9z|t}{8CEVxav$XvCOfs)E#fCvsKzk znz~a?`gmH>EC{}fIMAE@E0XR%@mz~MeImb#_#sI<>9Gi=U$bX}=|nEisCA0VA$PyDX!rV)hcbwkn3!(eH5%XZSWmuFcM`6MU66e1@8-Eq zZ96++j9(Sew*JuK5=7{vbY-p-moK{%AW*_{OkSe&KU0yIo>=j zuaZseW^{`EXxgX7@fuiL404Ve22cwD(NT2L8Ti+3Sv?I@veUmKjo5U(!Bs?GzW)GvgCq3c>AOR13a=!a zwr5DCsz#+YEnP;(GM;kAx!I0@>bxpyC99d!Ozh8b)T)Lt_TTSIhCbW9=;qp{6cTok zeq2VjYGzYOQ0GF+0NV~rHmB(al97yG)_1*mN&{VBNz?DV@_BBvTtKngk&`padXng#aN4Py&3-l0p;{ABspoBq1D@N;D$qKnMsz08Jzy z8c61gssRWoApoRPDkV@H(thPMpSq+c2d=EQ)>Wzfb!EP?i?aO#mAok0c?a(Q05ws{ z))s9${{V;ireEUDzaReqA~j-x^;0q!T3+{P08w*Y8;f2Da5f~|Ceu@-S zlh?}TK*I6`&CQi8L;NA@m|xzzd^w_p^z=+w$D>T+ z9R6LG(klSx9H0_O&;_GD30nmqse4*jY;4nVFW|gzlWba;{{X}brKWSwX|Yy0?ky3L z){~(0SE4xfS7)0hX9r0f<{yRB;w9V=(ANED=ns;wh*C{P`5~RQb8aul_=UBHhgbG> z*nKR*I-wwbrq&lHbauIgf{~8hunM)v`dKl{E4QpQO zWInLnQD%%~jkE=HRkO=g*_b7r*LjlHx0>Y`Y@4&wJdQ3YeVI6R8$KmJ3J?QE?;}8~ zPZOb*NS$oVC8pbHqSx%TM6AUd171XLxp21REc*Wd@zpy20GRL194RMaIUAdcJgATC zY$uiN_$@}^6(1%(xz>%1u?=w4jWt? z44*SC%Vh(S^~O6r4j)2lBdRix>k(kOc(RAEy}5&FL9pFohS1|wburV$Eir)Rc4Bw- zl~g{?K1OnJk4UY2BMBAFeACJyre=lyDe$d+!)+D1mb}s60guSy_5kZ%-ip&_c6~)$agiNs z8aR)(u5Tpqqo0;X4MxJssTy}06}yAsXA_;l&dU=$VmH4)u^|?$n)=x4w|g|=F^Iq< z0@qx1(RpVS@>4#Fl$HyLMzWN{h&q-xXY}&4oiEXB4$r}pf@)8G49$~EfAq7lAWl5s z)0CNpqn4|w%}?K-Oyg>?9mJN^&Hn)HYB-|XIc3i{sM9zq=-m}yjpNd7+HKWa!SLUd zs{~GXWNop3TX-)FP-Vnk9CHxkbJta41OEVgQV>tl4V6(>t2#|oH361=gV0mto9=QbTPk+>FJ8*{yt6Bowj7@8ZD-)^g? zi=XK8OFWcSc6|P&mX(9Vt2k{ReynT(;ehH%Jcj<&UZ?3>=2xvJ__%CH`NsZgQo3hZ zH%+4VXfWt->c+GTWd3W*2bx+Q z1a%Y{nN=%zQ#fkd>2dk3C`Rb>xz9w=os7_&KB&N494~gC1zwf|Q&AKRb6R8}q0Tk~ z&1v?kJ{~4Pd!45~TC96|I`m3QgGx=SHu3x(pACis3!Gf=GZJro6!1(68rmspr;_5w zBUtT02FB~(wBzV?ZHR(kM0&D=u-f{zDe+)VS|S2fpZ@>DR!VUFSqLGm@%0fD;}r7-^hx>V=) zkLIa%ayaD1qil>08C+~d`6}TRMil1ZCf_Lb$LKKn03v|N#@yyN(R1+q2==W!YFQ-2 zX5u)zD~KLTG7VxHZF{MaMm!^UoSIHYK}myCzXO)GSu@F&>LBB1ow=eU zu4#hKlU{3kwN7(!M??*xjCu?kH_2efb0n4oo9q>ujCey6lUE~iv-nLtc$!*=g4n}= zj5@@dUj9ohjfItM6J{{x8S?LCt=U2QbmyOUcv$m&Aq7oit&?eP(>eoBfV&KmvL;Me z9m4>fb6cY2Ds9B{cCzU^LO4{k435lWplh7bpeL&4XFiznTXBq1q;gJ8HrW7)K8@Z; z2}$&B@~XAqY^TOOk0`=m7{viU9;5A!MMMNC*Zu zLTEq;LJ$cFq<~4G3Xq9ONkpv>5_ajN zYwXhV$X!r!_rv57&f?%m%g9}7bzGapd#XCTA{ZgXoMozwt*3q3Zu-kI0fq9+`qklXiHl+#{%f18s>eVtB;ESt32ByqHXiwS z01o2Yov&qMv@%l9Qp%cYfg_)0xufdX4ORym{tUkgTvre+1g77*o5enmRK>QAsPNkPPy$>0&>!wVjJ$@ku@*3*7pumgRIOX6a?hXLl&vq#p6F3Cq;7 zMJl7mEL%Hl*TCkXhIzaFgI^w2n`~E}H(tuewXp(Xfrd7??%~yD=YQQ586N%{hX{eL zw?~mU)p9&ZOKUY6D85LHhe_V^`a_moR?PL-OR#}O9Fmg2T-`pltC@_=!fm0rw)vC! z`~468<;hM8)qmO9;*_b`v4K`mP}DklqW&X&OAC(`TNaj;r@fjOW2nAHluRGqf65@}w&<}ODjYAmNXbZ$eBkO=FG$*h zOx%$)i=EuPa@7(o3qB&SvPLhj`#L->XBl6OM~5tKPm`fL&u7 zuB4g7n0hRFXrD9PmB3k9G?I_=8}3}Zk&ERXg@w%*u?%WzsiAZY5Jv$HiM$uyk*PA7P(kOwKhLI-*Pg~%4YkNS(Vl4-&KuPS#nuraxSJlFcvM3uU|n2P=6jZ=Cyof;~UBwZA0@S=4hHs6!uvrk8Bf4%EK&=STy!T}>ai~F zs3qN1*1HF=J!R$So0wyX2Np7-O(GgZb}ugz{{4TJ4~5V{KCHht&&) zT#7E*Jyr>6!zrs$KAe zzE3*-(C-ZbujEClBKXcN@!9E!*U5-gI(b?e=W+@dWqa`I*=CK5c_6aR7q$7N@_zpS zv^(4vlvG)zouX$9j<(zAo@lqRJQ7JpjSN2@sl#KDki!eJyD=_qzFtbDWn=3qUpv~? zx#v*Pph(aG{(G(D5!^!l({qI-*0GM`OKNHnE?D~Fh z^&BYiY*Luaq9>Tf?hVmYsQP+an|$W}#n^{U9c>joJY%@a7&5dr?YZ9n0D|SQc-bB# z#s^OnA+U*)7+&aC58DVW21LAk#34~Gq#qlIb9QF4L+;6 ztNp1Y;*2|9CX%_VcMYuXEUjcvqJ=#*MM!ai7swlI*+$BqB1xc=u9|y7>FM24Fq}N$ z&GfTcY=c{Ay2|Xz1!|o>@&9dw{v* zysIFVn9B_9Eqg%(6}d|z;Ow15useq-B%CwE8-h(TcY)h+J}q6VFvn6KZ(>0EhannzpJ+&dRb`13}^er-j#=IQF+^ zvUyxJOYFy@!|JgN{oSDC^{(qF*5P$@5s4}q(AONI&c3SmXX;>%p0XLI5b+ye>+Qaw zc;eJj#SC*tR_dx(n>EflhibZbQjW~!=ab2ymp}-kZO1eDtqAb?nJAxD)`1H-ozB}V z>Mbb1@jSd&Pe)TFM`mi;^Q2A4+jP-zj1=2DoB^S z0M|;^xsLkG)DJxsj?6jYzFdq182utmtQL)YBA)_yr;*b{_Xig}*CSQ9;7&JZDg2p7 zDu>a;kEfp8pZu1U786rjO)TsIvBn9zzPEr``Wa^aE}jdf?Bw#l53GgGym7{Ij+X^) z5K?0fe{60rWNG4MuzNB(njwI7|a?6@@{yt<73lh=!&$Fpy!QixP)NJ#?LvmE#jJhn$XKCA^7TB^4>O&w7)F8%A7|@;0#2v(uA4L2hMhKeKYS zpED;9oC}zTC7Fml%*3X12@ety2_- zj22frHNg$B3s(!nrNrtB80@TWuYXU)X1?PQlQGv@`_{*2BzrN4n%5B5-!Q)V6~)Cl z(>)GySe%hcwwTgaI+@Y~mDbLB9&2Hpn}O_fjl@Hm-N}#UKPH) zdMh|9ogOPnSV$&TgJZb9%Wz5XOs-1b*s*E>hgLcPCU6DrMyll41E9gpWYStq@^Z3W zr`HyJ_pnzQ=fAP8E_0ki+%-I|7hf8>v(EBLlR0TUW-C-wvR2f#2(6jdI-6)WRphZP z^Ioty%$_$f#jeaX9%@p2Gj7st7xBy~xLreHY^Fd(?n3va?E9s{A6+b&G|a|}8;fpN zzify5LNnE+dSGsIyE$Ic;zL{j1ne@aqTyM|&RW^a%j)}4PXp>_jtGV1k-@DUN+tDu zs>Td|+cYQsJ3ln9p(pliyR$JE9N22J)vmQQ{4#SJ?20!a7x#Y`#E_Tm5$*K!yFE5(L7y_JFAU# zqGgXDu6EYKnusyiU|_N8GKHQ9;IiLjYwlh@lN!|eUj|mB&DeWCnkF`SksVXPEsH{_ z(qS`CS1dC)M94ms``e<_qmpNsv0O#MCPLdr+gQJmSxv5N*tE4A86>B1E|HDCqs2Tp z=@L1zy^%ae3+|Azq6xUv?$AHSRgFe%Mm!1AuBCMNo0%>L1hm72PF!-uZMR&#D}bgN zb9d%fJh;?4JN$f-nzy15&sN+-BV6~2-hq}hc0QOtgE0m8(>J9JdkI82)IKgmh21!f#8u)e^ z+PI{tshfjK8OmhbmvT|WFsUi(VPp>C$53qxiMDSwEG?CFut`G^4W%y6E8H}1x37X& z)pT_Zf|`>vn@-*v9yfPFwH#1zvl7XXWTMNkNK8+Tp09~n6LU)+CiPslC4Mt*E$G>H zIArlp9ZfuR#*(5aK6U3;KfvF`arl`$X5W0PqQ@At;&FK=C^aIOM4v`{kP#=*71Z*T zRL81R6o;x-O#)#g4Ui9#5QPAcj%o8ypoArT5CRaNk^%{YuXJ-+DA0n014#%#385qd zLJ`SO1tikugc3?cMNkNG5amcXjhwxjeI?-^ti9T9t0Raz11CN89^j?*9q^88h2)QrJ)0-y+^bZ<{VNu`rmaER|(Y24Yb!)<#LXctokYv@^0EXoDuJf4P?TswXw=fk&-N1;JN%- zR?UbuNX^>nl0oV6=mNdkcv|UVs${Hqb3|pJ>MhN4o$d?Yh;B64qrJnSFFGHxRyK-@icIOGoYb7U zH~T)&>UxkWj1t|seJcaz7Jq4~W2=2cv0pA$je3g(KvhF=V(ou)s8&=)`Y9SS+}n1M z(QW0~DAA7!jHNq03R1Au;IUh>gp{?E5vgJh00D3RC z@SsWu)P4E-E6}9`n&k4hNwn{ye+;Omp9`N2sGGa-9h^vZ(~|S;1#DBYDtKL;wDFc_ z8#~2f@dq|Z@TB<(jl+ihzRIs6aqE*S6;Es6*oFu`MQukP=fi_|R^`=iJLK<>yO^y6 zx90)2x7S6AVi|glk9G+ z;+0g)pob2md6qcNZYRG*fa%?@%t}1KPmb@nlki28^wx^;Cq1mu!l0#-37Sc!Et!|$ zv<(W~!=}R`!W~T|K?ZSo2QYjWAw@gIFaig<&OJJ>b5QN=BF6GjmsYKU$L)* zR>z0eJ;Y{>{*C$z?yXkVQbRy!=$z>pA>Viyw>^zq{`$s58#H8Nwf1z*0 zta7FFNnuiHw#P{&1bCy)B*#e(O8`2n7*;Jw1QXCz#OF~+;zhULn#ZdT?+(t;51R7< zda<~u@{bN^wMdokyt7gtKSxsF~CW0cz5$O}nN^C{4;IPpK9P#tz&0+V7gY_BiM|h|Q)MvR(owk=| zw1p+l1gad!s;S=i^Rcc4%|BRQWuYD|K^8CG*+Xc9Mplh7y8GE<%;~0)34cr6wexC>fbPKDLf^T&sQ8yZ8|)Z0&T$et+}0da2WW`BZ3 z$GWj7zMD6(tZJVVga*=QaM~C-U(2`s|Hv^-Nx|Ppne}W62;J37I_?-0O ztes?yk?(YD$inM}^a|A2lpWTKy3&YhX~-r(HzV`8S??|_*2)^Fnoj7FSH+zpyHL&p zpB*S=Ynheu?|baauo;z>$RlyZW zx6Z}zl|vA0jh&)LHODUCS!y|4RC%cnRb-$O zOOkw$0uY4&j_Bru)F_ae5CSct5=~5rul=RKG&H%lHuQ$dCZZh z^`jd4A4FTI3&N~48ht;`9K6?9$r(r7DI$r68peYrVRLh#T<$pwDXaJ_xMM0nXgwC5 zCkl3AIo3;5D}kW_I~LnBNF0d^-w)s#_(f0#67Nd;S#3UHh|^ccGaBfrnoJJ@*S9;Y zLky=Ktm&6J$0Vrd*c{{NG`igd*M=dk9WR4_m|YYTyAHuAYAKr0B+?ehNWJyZXZErP z;F6)SGbnUzaRY0e)}9v%m7LeeQ*Jb3gJJ#nFGCyH*17BX~pW#@Qp0g|BEJ zf;C$BU2`b#x!VPWd!9ICHs!$EMeEvT-jXrx$UL(Rp2AKL^&3&ny#Q!_ES4zY+y(mW{ouFxW^vW&hyKrs=F}Y zrl_lP+fNIm%f3;z=%}ZfmRyw)x;I+(Jr_lSKq0}5@XFYwoR+!L9W=eHsdkDghe-_b z7D*mVoJMVZR-P9a?Poarow8~4VbB{=@AaL}#axb>d0>*EjB$!TS=~PsN{HH)*ZS`K z{MS{7)S8aXRj{?7M8eT-Yn*ZJ-zRLD9yqE;I}nmrwl)G@@&IT*su|KDhN>(EtX7=Q&vxA3ON%Y6Hyy0yKa%5i*7YHOJz;AUpTF5`PDG5s{+-(UGIqq9{qzJ{ip*fKT}I^5kz!*|)NxgI!LFliu` zvZ0VbF86J7WooYqtDuRp&er87-ixlT_FgEDdY(^3@w8=s*&NrtBN45`pWSOkNQv3r z2m;Gfrs9ttXH#Z2A%@L|&BK^~3x>|}UXHFCC zBSH8qiVY=r@Le}$>Lq3+!E3D?fR{JK1?HS~n@7-$+%W8nx6;Vk-s)|{FUjG5a@IYT zscrLAL875sAd4MzuFItzLfea(X&bE#5Dy>5dRkr=C{$rddOBYm4Itnt@%HBHgh zQgMTlDOS=xj;Yk|AYN_1YO7BKl`}RdSYIQy0bItY%?(4KbMx5f?xA~jV@!6J#F6+Fw78^6$^QT*de(Ms zYHDLFamEg;B%Z4lRLF(TbKq zH7kK}e?Lf@1-~EmdHk%w#HePVoWn4&8y=xnV;v*f#sXa9UpzD-lvdXDSF6EMw|<`L@;0;=JdB>01*yPE`THZnhK-8|P$!I!pk>TGEo zZT|o=&7hJB$}B?)eC>i)&i9AEKn8j`dy!g=oUyAdA7H z`73>~XA2FWj66ItFf$Hz7P_Mm9o{eDAIW&WRB1%|e*#ytHL37AndyYZ?TnpR$9l(Q z<3oi{Sv1jRY%YWh`S~q68i{MCg1%;mY3Unc@3w7g1!z>#KMRtoUL#|cR|4qtaTn%` z<3*)RlKELLI){XWq1>0MyvqtIh zDr$N*wXBAe=6uBHIqJ4!uBNDVAzA6s!HfkH?Ic4D)39IU^>Sfr;TVVbMn; zreuNSftQlUhw17~kFGx@(bh#zUxmI}DP`f(n-U02RXs*iWcZ)e!%qeMMf1o74cJCI85xZ$;rd2mK`lkRV(ngB57=|&gcD+ z)UEnTnt3Zk0PzJKDQ^&SwY3Xy!x={Jla61Jk`iV;b_V(iXHVW)E>~qOXxVc3r}&1S z-Cc+jc%?l=G>@o_(Ss}auDC0Y#K9A^9m7{o62~=1H8IJx#BA+ zjT)e*^;S&@F|tXZ1R)!!1e!?dp+N}ro88HnEe?d?}FxGNh^q#PP3?AEt1y}4i7v0YMg@jJ(- zwrtv@`nSEAA5u$Q$h~=^I7T#^K8&%>Q&MdmD2dg7CREeqd~~g}y851>yN8iP}z-_ueOgi}h(lN{$H z+ebl57s@y+6twSW78!H6INL=-wUaWT(>gK@q76O-ZnK$H6lc+>V@iMnQUW~H>rEeN18c=fvyKrr?1&(RY@dt!$>k-F*C29CDg?U&fxM zI)_ZsZo{>fIjDp00Yj=G;kXGo9!j}KT2@aRSsa^GXwuT=!CP1*XP`q2e_PFTf|5V` zIB7*(Md#;1zqZScr>cZfMhl1`qTFCVl`ahs*2iY_zG>SkL=2SeIu(_darKqEt^#b=~;BHD^VWMLuB57?Wn7UKA8 z9BX2Pva!s{=7DDa07cC4Ci|cL$!DMLfA=V|MKBAjmIxe~_ZX*Wi`IaNnjP$#4h zyS;qM^f=uEvQ`y;Qe*B zdgC>Yt(4A1i8=-CE+IupQ%O^WMCQpD^uzg^Tl%c(t}uvaji6tVULZg0k9z9~ruJyz zlO2Amqoto6qK+BgLlebCNCI5^?fsQY0mLY%qN<9vBJnY41P!fqk!Ssp??{LJk?&nM zk5$3P#m8mrZxePWRAwy=13}^t`m8=W3P)2!;awYpq;WbD4gUb5&VGESMIi*XzEST{ z&Npor#_EyNf7&`L8qo{JBIxou{;s>M%o`G?rNm~Qwmj^Wjv5QtlCwBc{gLlT#V6Sw z^?Z@)iQhABCTXtLAlp^ zu6s2|{{X|Y{-TZQY%NaD`iqa9e~aXWWNaj)JO2Q$XQKAO+1jn}An7d(Yf6{-TNRH~JP|{{S&lDIria6klX>KpPmM}q~lia&DE!s()`#AAkcWsKhD{P`>OEvCe9>Z#+WZ9C~5Z$oG6 zt=ED$=P2xttCKV#J!rrX!LQ9T+`MZciLo$aVMVgtD_up8*>Ya_2 zFKB65MO7pWB(;*V#O|xdI8$a8Xk@sgc<`bF=-KWGHIZLP*}m2a)f`dHT@-U1u{pp# z#?}jc@zYm#$}oLbUM`U!#nmFW>M=}`@x1i5(P_1J-jMigEpiax6 zqI7tE3fktv$z+mDjt|sxwUsW@(#K3C5Q5gp4-(hdoAB~bxQP&m*Pf)^T18aaeE%>CC#yrW-N;0Uw z!9)B3dsx`I$1c~li^7xq3_WrM(@i8Y_Dq;z;fB4SjqZ7s!9mL3qtPsj8j7yW7Payc z7{@sC4HwZjMI!(&iR}kVmfQI&cs)g2HJmCU-1B-qkkd<*q1sCGBbiFq0?;n;Z9|3D zmMf0dW?7oar5HGNl)v-1ZR6ywM-;PPhZCP|%UgSX3Y`b|UcQ^R9xJA#t!z|Ou~31> zbN+Rqx{=JTaK!RS@^#6T z0Bfn(dPDMEPi3kzQdHB3+6x+7UN<*egg0kAxgI#$M?C~`Pb*@Dh3|IF3dHmkbc_;I zLipNEfjw4_WvSzmrg_P;;U0k}L4EG6;_R!R4tQj-R5h>8?jG$6r-jwFaepSVD5P-p z{{Z62@J@<`qP}hwG-gNI_Ciwqi?$ z)k9d?N5n+VAO`hUAK9EytaFV%jUQ+&n)!f(0jQb6<;^d7@?O}bHAQTbO@`u`-E7ZkRUmfu)pXsLs(e_N z0ib1?_dN6q$&x!{t3H-FxL~x5sUw+_m>kk1&6KyrUYi8ODdKdpMBJ?xHhs#sPYiV( ztC6!eGeL8#dX1K)NOe%Cf}XvS%Jz}MAZcXqe`Y80nrS15dyjpN{{UpGbnwenJ0XRo z&vCVtY1rtiTE~k$pn^PBuV<=cr^RApEon$&t~qY8uFWISDY(JO6soD^q@B>r&>r4H zRebh)5fNuBWrK5DHmcoZOrN!}M>9j%;sI&rp<2^9ud0#=aR4TBayAkMi)#typUIM{ zI7x{WF!_+Jv9Fp@98D$8HfRgRz6mMonG}Q4Ylt>h@al;vaR{V_!Nu7%9EsI)*4js> zW}@VUT}M3x!YRW;h`6!1vh||Et1DtNM8<{#rekZXovtL}3?I4t)}1E39E(t(lbeTTx=W45-7zW}%>Q1;vf+=87yXs=6sy9?{>3an8{Q7a;erO$D&3!}#BC8_M~ z4D%3QCaxo{so;>B3IJQ|l+TmMU*o%%akqo_XE*uD2G2)Yvp|vBqeN!?>&nZMq|%+=#^62c88N6T zM_d_RM4L1yu-dBp=AD4Go4LlpSCXDqPGT%M?_dDm$!XG5OIt@xhf>B`_}pCQ-on@B zubQDz+L+%+*2-GK&Flu6m9_EHjiz&#$(&@=t*~H@BM0fZBSE2dqCO z*i^tE!YZ9jA*haHndRqJ>#z%ti|Oh%zH#{}lM=?bE)35vEWJZRQHV-ePSK#bbB%!T zx`kCF^plumW!-%Xc6XOmZi1>=XdQ+@33QW5oID-2{5)2bWk5KN83ZM=&rVvx39u*6 zqOriG8@^1>1qX?1l6L3uA3{O+1l`Z_lSc_>mRxSiK`DNWrV%gE73n-hWije_uRdyjR4kM^CIU#h zfDz3;NgxCw=uiS_a?uD;CXJ9(2c6ThUPw?40V}2opm(wo*mXxF1K!9<8Xy`HPecHY zNalq=a!8>F0BnP@3J%JUif#3Wnn}0T9%v78y{Lc2#r#XeuWAEo=uhu+T_^laV*Y69 z>G0}_@d)W23@?7ScTMiJ@itFQNMNO6s~&#zqS@*VF); z@fyiubaGU^%y6*;?!1tcBN|NlQ^%5XP1PGbH`QUdR{^F@3$G?!a(S$t);+JUnapr= zOXD{O$#~P%&rNXz&Wt;JuH93vH>Mz)3SE%vcVfYpSo>$r~em1A9|tBcT_#S@6#I9hxa}5;qRA@~wV) zY25dRIn5^bxg{l*GL0_6z~d(-_~d}3owQI?xxX_h%Ew=Fx(q^sqAtzSvCP(<=1p&4 zd9GoTlT66?zJRlXb7^(y-y|Tg)VnDbAiqm4(a|Qa{*Dri8(^B&AT09ao4aauEOH}|eej;1!y#=|>Xc7W#Q z{MV?hV{{cD0k@{O#lkK2cARH4xm+3;2?H6Yaj+SVr%pvIX2%z)x7#Z;Ra3O-GY3O- z&1E@pah;@{$v0SX{WUu1yqn+Aa|on;O$5>~un3&z5aX%T?7B=UnUUe5T6rQB5{+E< zYTqTt&{e?7a??0%-0O?-y7%w!3x3c&*LogK9b{TaB_gXN-_Uh558P zuU^r``&()oBOKR&+XJYw=llIW=6!vr@AT%^n*Q{Z;^NmOjy9&G+TflYL*MJ_<1?}> zws0@zY`1$e6mda3vQ$RXAS}vGqs4MUt`So^xQ4~T)(4`Oe20^r@Rhu75#`y(EM+v- z$4P`sPlw_aR8j7~bMJekvTbaa^AeGqL07PTEOlYvng;K&FBSdB{bH6q_ZE}9(|JB{qo(ZMHz>EXk<~+uQ{d>kNi`K< zZ1nXR<@HNI^k+Noazlw=kL{d<2U&3A`i{5-n&1b2sC;+|h{TUk<-(T9OJ zD7VpXv=yzbozu0p7XS{bGeLznx#X&lhue;A>S?XLs+Cm4!>kfFQLBJe!_B^p%W-j+ zGDkd-)}t15*!^Z3TS*y$rO%cohPAnE(L=NKcx4?V!ltFnmT{HM%WwcXS#z91exs7k ze#4hrh4juEJ!;Qt@d%bi)3~}IeG++vaK}P0*d%PvHBNWVGTJm>`Yfp)O9;y0;=M$K z52AkCu5Vkmjt%{+AI_3*a7&K;KV+NmT)fFuN3ZPczB;CyyEiLqDWjle4I|ww zVcGbP-u)I%6CE?@r*%xOVQF^^GJ@N{NW_f;@e3mvC+E>?93dg;%UjByU+d!-F zr8`qU-WQBBN@bt+cN3diIBBA@$-B0=5yu>AlR8Wywt|+DXy<&9%_GmwM%$9km*}g{ zH60~wJyslE{u#{SA>97}MUlmuoin~5jx^utou}^v@}(L}{>O!EA0FFpP075z-`_ur0ZjMM$Nk1eg4>Wn9E=UGYgdhac zOz&WT5o7|3^gswf*$RM6B!GYrnn*w>J15B_vY?6^>jWTffUs1lnjKXWU9oTlM5)sM z0E>(G!s$Qa%a8e^Y4nf{*nQk1r_v?e2$CY*As~F7_51w(xeIgW z&fJ;%x-<73=bUK)z^Ogezhjy+kSy`pY zDPCe&TFM5W@r`G?$2i`CW78l>(Y6wU)27=+ravW|E+^NT zMs{v=+%!yMeaf~Hgl^{a#iixtMPV$;#`Wu)=F&B`p+;nmiyJDYY9x@DKpR}wkSDyb zQEheYbq8j)C~8$kKl3(s;rV6#3$9otrTqS_PMdAY3|S>|ZlV4_L=h>Y)AISH`Nf1m z*3@{?XfI2yy#Up6kb8F>!j`J8#N&=rS;iw{pHd~ZS3y!%U4+K#AccO*iN4^`*zl!@ z^A4vnFI%TXBblP}k5k2>MB%?b0{1%z#|Kq-gFO`SelhO4P`Xeo9`iYzA(q0XzVsTD#*Kz52!45F1KchXp_e|~~@qeYfSXtA{asRcve zxICgS8A(Q^5Duxe^R+(1JP;Q;r&Qah07u?$Qe6?91zvS`e`;XM&if7f{Y89nCxjz} zlk5S%R$tM?6EChFQzF#yi|MkM@`NDqmN}cUEe38kpL@oq9epI^MSu1kja%L6hlMfS z^W`HDioF%dAFg_%JG6?64zMM92!jQAd^#ki)nf@YPp==Aw!oxwEolBiXeOB-A&cvav1TbR_$7;~tXd$t3M z;i)(Lkzsjn?hbeVsKmYL5375P7riM>o@QAb^ab?W3zYUD#*hNLd!{LfF5J>pGwdFp4i@$-k}W&1Fm8n*y;t{F%!G`HGc@CCJnR`xz$%MqQ~ ztw960JYAy2-NWa50^Y5oH5WY735&DYfaP1AH|^agf%Y6N9l%;0POpQ7ho7o<8{;WO z8J6yPgGn6?LvC+g=0f{gP&G%paO(P$Njupd*v#q6o{in7%@~_D2cJY$P6yuckROoQ zAtnc7m+dI^PpXQR9>*-euehdp9Ht&prOD`+AEOYQTFKm7t{5UrP z^<>W1aqZ`mo0|&Z*%Qsvt4)v_2h@PWY3#>5psU~nLeY6`HK@`^(i_q_N#Mn6F%oZD zvdT(Vc>lUK+AhKCjHHZKx6!kdKMfZBSt81mZ&p?AY-jOKH_FgL0{a~4Zw>_UC+nB_J~j(xIadIA3HTGmKh#gNAeyzpSUtoD zB2`{S5EFq0a^nw5y7MCVkD6&q?nv6W0V~C$!3Ga?R!P%h>Z?P8j&A!WSU;rKK{~6t zdiyy{KJ^jIT|B?Vh4I>u)ZqbC-Rkg15s*Mq!*3r6Djv*Iqh6bMaME&;A{JSjXb!0H z)LoT!4E(~N=X-EQP1D=OS#8xFx;KtutGC?BNgEAFzn{rT^5dfR7H%o`SKH5j0RIej z5dFqy-kMCC(#i_Ae0-uH&*%>YhRaK%EOu_{c{^`sx)-15-qD*;zZY$?lL){lIy_7-l=qlu^NaC04?a42`T}>;#Fi2VRDcQ_xjm{sC3qLC) z4^SBQ4}QJoN^Waba$W*FD=t6C<+>2jGxXjuX1yZm`U2-$V#{~bZ#TERb;+*BzxbgX zqh*P>a9p_Dl7WI9(duC|)^E7B)Xt@4k_G=~>H%q=&$ zIk^m;FAmK}O`9gaWid9_X{M#5Y0P=nC>DhYvh};UytThlf`XT=ey`OFSYNRGQ8?R; zxzJmjqAe>#tVw^CCvUCaYs1(6tKAUriGemvV@v9ckKI8ot|zgK%;7<>n?1T#O#cB+ zJO2#tEo4j41kg=GhzWpW>(QO&*Hqfl& zW_KuVpP@RIu*`EgrNRv?bI=gJ^|oso4@YW1ouqw$2YbW{2pE=D=B3uT6Y&yJyo)ug zYLtN)w?S09r(pAlAziEQ)h`m)dXkNmI7rfHYWOQWj)Hl+0y&jQKaeDpIzyI$3SLyL@NV{jszWA!eXZX^C%vX-%DnEbx}%)RhBHo$m-FgFW%j!BZx&zT z>$$7$Ng3C<0^PPEBWWHbI_~}=a*j|_Kk`)>j#22WgpW2D)!E- zNLa(`eQ=jv4Y`)`Ai1|+o4x~AiZt~3jI!nWI|mwZG9(}z>%S~x`?cdGQG~OTZdD^8 zR1GU}4g1FFLKE8I=yl-7U!ooQQ@n}^d+8&O=0Zth-*fy8CX@wDY4cT@@ku4I?N4l8 z4e|U=f^~4Iy-r(k{e*3qd-~#4SlI#mHwRm4o13kBmdWkP#6;nh5leMtTw%j}cY!lv=7_6WISp0KB-Zu zuMyKqI1}V^>@&Qrre)y{)JVzM0u|kt)}*}zbACZ@B^t9VGv841YMLHd-J3MO z@^W^TVY0~@^$sb==(o!i(xcn&32Y-&x&uw}@tS|VB^hQFA6vr8rNh7Z6Qkknzz29e zDZ1Ml!mG)6M*3o?c|su4vgU85Fq<7Wn|D^t>VRagj3nj)KE0OtaEVK&ghOH(OjGx3 zlzrgK;>0`R9!zEPZok5eEAJ6l~>j5}9h^GZ`ll^FL;`HTHxoA>q zk;8iN1G*};qWo8p%s~hU7L#b5V5*;S-Hb^rAMlQIu;X%ItpPqr23XwqCyFr5bdh-U z8eScR94!P6*0xNEhWNVB$w;#b8z8A~q+0#aeKgD-q~(q458rDrn>J8Y1*Joj9Gj;) z2OnxV+UO=`@-@efypQt#1C$e(mMhE{Cr~t;yiFaN4D2_YetYehO)CZ3Le1Cnd%r}R z$*#oXo|DCpZmwY1udfj?$q;`ru6a@xa#42SS^@^cRnMPi5eSgkpM1YSnjabP{nC<> zK`l;l3(o{jzGUf%DWzd*SeQ&uIOjXK&9n0zc_~CDi#6)#R;go!#xS8_!rM7@Z*bM@ z@7P>f{}1h?L7FN?9`LMF&u7c7C23XzOy?2Erqu(vkg-<8#9!RKW-rIAm2$I6uGgWC zsxB8D?s8hAc7&8}1S5z>9x_r}9ozav<=G9*i}uw{?Ovbt)BLjt)Xb3bue0G80j4Zr zLLd8G!biR)%_AB~NL7k0p7?6UKMm742!}mWit2vpc@P{YbgjUNZBhRfF!|YG-^~S# zywdl5Yoo>~l-CaE|5QP&#ZvJJ&YqFjPVE^wqohx6#Q-98qfzH&qU4il+e7{J_)DZ_ z;4iM^FVVk>=g?;1QvXS9TyI@pBrBCu+9ZjBup*@K9ezNmLU7c;`(VZj4e zb-()l+dN7Pt6`E_NkNY~S5Cyly%_ z(h;6Sv6q#F%#17$!A&eO#}TR5JgJ7nlKH;MWh~zxGg{S4kubNIBz--{->$BO@Bw=W z4tnC4G*g3CJf#xYe*m2FcuaK|Wv3dxY=xY_rnueEZmw%&69-7`i zbL$#5)A{ohQ`vjZEe&cNP~(>zZojuKk1G8%@z32w+@Z_D>V&Oce|2fXz@cZo^sZ0u zULozIvmD;gZK!naZ&EzwcYNRmXa0=ufX5{{-uQdl7p-Whud+BVuV7p}w!W>o#P!Or zs6v2C*GqE)_adq%E497Wua}Q~!8F@1aC?8AOaQL;`n$lqMjs-6NPk`p8#?gf$nEWG zt`tp7(!>@cHCH=c#x9pi6D(w!qUnDCT$LB4Ey&U1F3v-A9Yeia)*fGH9lBIHJ4WHA z>9Gg8FV;K7WYE*#lP(&F7Wv_!w27`A6qN|Pwz+*8ACpqftxM^YEjda+&&k;k*i?8m zRH=ISD%ja&f6qPboXcu^_Iz!aU&+Xn^ZZyX4-Ru$5czaEQTSEq^CeVF1jm2E)T#_v4CeNfgwz zB_#_&_s;#7ov6XEy#|Oa@1#4`g z^s1KMU+ie!)%{5w%sgYb;9zSgy7n67w{Jr{?K}ft0-1+YNcJG4O8ddA$0-o)u6JF< zQu#q=NHq=DZqnco`gc#Qp-M0F!aKVU*zFhI(~K`SAL=hv-j&;Pt4@A5yWuni;i$Tg ztd6coGI0{*BP4X8{|W}}Pc~uXC8DnHHwj6bR-Ty))yly!qXMZ z(bJJhsrGX^BnX}oNP&@3nnL8igAR*5vQ@c%f9k3hf`F(9X9W~sNi@290w)s+nJJQu zJxw7U!@jyCx+oQSX$%Jm!btDmWyi1=k){B)FFN=f+SlO=uL@-=63LO~1F4BHO(C`p z;mGd4`9dQ9N3jnJ2&R*+l~U;Cg`=G16o?}w%10TKZ2{V&ILNq12Qd;f*jIo{GD^!u|9EsziD3n* znn*Musy*WiQWS3F0XYDe>c8(dg+S2%YJr4N6`&9#f!-^=NL6hvp29cL#|ezg(IW`8 z6k=Gg_8U$zHU%393QQFpMqDT_oQ92q@msc{8#Vg5yjdByS2)TI z^8;-PlARAH8f6q)1;`Piiy#@{K*9bR#TR+C%mkc{jAr`RFWSVvdmyer?^Bf%^o&kJ z05pyxQw{#5el$%P1hb_{%kRRjSpd;&k)+6hkSav3^>>ONuA&&NF0**l-u7%ZPAC$8 zvo9&%8I&>I4793-CgH2m)c`qF3<6GwS!7HqFxLDy0FO?Gf zXP>d);(nm7{{e8mHhuxQY>9&gUIJ&oGnU(o9jLYu?h@S?+aF(R#q34(yl#gHdBb?r zgQ1yRVbpcUzmHouUJ01SjGK&=IVF`&Mkgsj`n_$8(crFd4Bl4~=1i0r>qJW3(bIaf zy4%tl#Ne8#k4DWcyr_q_J>S>giz9f{;IbUk#=a23SPpsG$okxlltcg=&ir! z%i`2d>8|+26B)0x`aT?#Y5c{NRf2ig_H+MdsXb;p+W^F3j#=oJ9}g0~Iqrh0i(-pD z^;h!PE<8aHFdGg{5wG0|Ek?x^6v!<3C1{7AzFeLrK4Jmbg#Pr!Zx{J(EdT z%uutiEnT4MHjURYTSTGjAC7O0ozN!~Q`81BMIb^B>^pKY*?0 z3PXzbe%`7}1M?UHAV78dPW{>hdM$(`|9SZX+P@a6uzEs=p=2e^6eZ-e?8EDLzix5D z3T(__i!1Fi7Gq>xwOTiF<^J>aj<w&qns5+FiQ!~z+DXEmtG;F}Uoj|J(lI!1wA4?p1ZwoA4hZ@dV`uo^EuHhlc` zwtX?@O1Da3Kl}VOjybCcooRr(!l_;CSZK1yq&D7W`Y?;S1z|x~?=z-|#lS1{*IWSH$RXJd9N+U1{l&#`dM z7pwhodU3YLo%}3iNHx?;%;y5&Yq7Ixw!MUkEy`G%*6`YB5s%^g_mzo=?TsMAPfmEk zPNB!Gu_Y!$%yfUW5Xm4NchQ$$N%f~vizvpwED>rqd{Qgm}+Pe+Wc$h3&7mi0brFp;3NLsBED?R=)9KA z2X~dC!Oq~~S`CJCVWW>MIk>dXDP^w!h@2~HQD%PJvzn{x$L`F|^&X684YuccV8y#p zdWOB&&}CnRak=s!+2g(^5nz5>x3ia~IBwG0A}7&KnnM(^qYgEx`-PXSQ`A@lvC1%L zS{<^j8aWc927Hy=fTaJqs8X1H)=o|b6MpB!g$^E7+!*6~AJ zQwm*qjSnK%>walq(m4>r+OgfvJKQOb$HKX9tZx}LE89etUY#xirR3XMotS&uqKQr- z$=F~24KuRC!@$#8wUxnXN-#ava*&)CUAibEQl4CqHF0z>0Br7y=3w|GgMosH4qZG{ zP~;4sRJtd%eGLp>RGDR)mOw3Pegr9z6LJDyZE)-vDU?$4q^yeo=5WxbKjMKA*tP*mjhgWSofG*Pe&(DgL2@icBwT?L+~^sQoMkUI^sJ{$5p2Vq)cYS$K3J%LQR zT&w2Ej22sH!%E}JiQ$4J0ZRU_d{v^!47CMi?qrBvyMPA3VKE47G$Z4}i8PCHvu>$L zcRR&bt5k$n-ziTy!P!cVPeRil#)hM4GVXprI4|78Yo_9<>D+Z3GdC{l=pQ$4>mJA%H3L!= zFU$G>5$R~7A+&r^J^ne+FkPs-E0|%x*`=-Zk{dUHxS}v+RFk_ntj4*JEwJd z*S6MnrIxgQv7d9JTpHnYSizBPC{*l6=cW6@(!O3~wq9zbBvL!7)i7ZZnKH(jdlu_H zTk#S8yS7Wr@zx7g96|bxfxw)le}!kdy&#U)Te>jh7GgAK(-h>k@jl+?ow@EF?r8Z? z1Fo|27_ht{Qt=InZ7d!R6ZzgY;igF7ml`50U zYlh-mMB-uYR;j5dEF9P)f0rhu+z~rNNbbA_C1W9~#a{%3(_H8f5Zi8zRaa}oxntcS z_zHc%I`*#PL(EX${?w#M`EPB7;A(2PYoakld1(OJs{{IVOa&A=BL_ZqV-O`FZkDab znPbN&D9%V-pZ2U0I+eWO6Ikfb$DghKOu)7@V@KWR(C6f?C!PGAKd_F6fgqgIg0nca zI#BPZ?S=5A6}gDtf~?eKkAg79(4p|vs5S?Ly&X)u>TV=rJ?wSQ+q2)AXp`J`_=hNj z-Xo;h?0C>$SUft%*KEa3;Il9K6*pH=ky#erUh0(3-i~iqZ4)G+>{!zI(7E2FLI6n~ zrOQI2j29^maP;XGtJY6-PBpB_ESEe zHRyr1KCi$#ToobFd(Dgh?F11Izc*Ekrwe+D*`g{WA*Sw|-8|J)0&4J8wDhGI@Z*J>pEo{*Yk4>66cKGO9)?M zU+gv3<1-iae1f~Wma7202;3FrPWXL28+I!~YY6<}(A=O@Wub3=`2bE)H}GQk?}es3 z==g+Q^`C#TIrcsy#alS~l8NW1cf2PMZ)l)Dqina?hv}=RRE!1R143tM+8{-vw8MKY z4Thr;3`HCrjg2Sz4MGGeBss0YNoe-rX(Lb57yagvy zI}bNZ63~7hGtCwTj|tDXY=2QdJcm&`8q8tMsW_$aW&2u4miUB+q<960E~w6V2jDhi zo;fBykNTVTbG?*Ll;^3vZ!7Ig2$=S_#AJ$Ak6lzZ#$*AJ>C;ZQ{hB8tA8B970quE~ zjOO*e4ODGDDQbEwE^@yX*OCOWu)$1<+EORQu50XUWdseqm1O^ zAeIs_pLRuu5Ty?@mc`erY}Lo!CKXIW_IbG9mYHpmdCsm!B_An5$zHWKolKbHnbHib zOinJnZU4!VaJ4aen7!+F44QW@o~d2YOKn`O%o62h+4lCsX=8!)b9tpsp$T-i=veH{ zg;FP#j<7-8SgBpmr}6o@k`4F`f9W2^ywu$$ey8fJ&y5)~A)KazUlKiyN_Y^Wf1y)2 z3Y-GgMuxkv_$FNKMP6NM%e}x5j3y$p{GVL{P$2O~1JR&c0{pZNn2v@Xe!Ks9z7kYs^I+3N`s&<38&!T6ygGr28e*O$3`r;GVG<5;%iRv6~MwX96%5 z_hO@<{BP(;n$z7%G#Juc(*P!=V4os~VETD~exB(;L}cCHCIPnGTR-B;6riM;_;z*U zi5%P^h4uT@fhpsCXRg;oU_S=i@zvir@!<~{Z{IEp~*CT@nBI*%&QG1c2pq+wNI$7otP zODW^^)#U3AX{wT6=*!d5Jh{r0g`bp%R_JIx(ly3TR|WB64{)#0W@Tf`ir*$1mo6zL zzZSdoB_#7mO3M0<(&_Bsvxm6t!NOwHsonA?8aT?<>ch-RnrNb_aS@ltR=Xda*D!sIdf;D3&3HyviX?3+leZ$$6++Xdv*kbt7s6$E-&OX;B{rkIh)nFL6 zV}!m3v?~NZ8MoS9K-J#GSxhn}q)~Vcg^!)lPlK0@W`9Lk4DSV^V8LKi0Nu$ape}@~ zIHEb>K??byf&xTZj{xX_IyzJY{}abLOHPpb0? zeGTlJPg{}a*lepm$EUYG(P~}>&->XM`v*^blw^OAp**(H=xzCjr(C#cIe~#Zgs?V@ zwiTHAoeo-Ug{g_g&5Slj$>?vI$7-%vteaEF>uAR$a`NUadFs22_UXOre$6;~x2f^{ zn~3&ZDvxkA)uq1CfZ*_-z)VOLIRfm$oi-JN2{5 zZClQ})FcYr?SF+RRd@M}ENzrt_6f*~@Ye)gC861(wfRCf8@(XMWpYtVwqp3%TySw`=A&G+ z@43213IT-zae=U$9Jb`O4rZmbrao5xn|4NOB$q{noIKi~KqUxUJtL0H&EDDo4TMzv z!`1|}{QE}N_2)wRa8Sxpv>~Xhz%gP9Mw!pe@A<{06}l+{Wh$hEnQrvWCr$SrRiWuw6IM`M|RO_?F7lk5$Rt>?!B- zC8sL?@_Vf!W1@jNjz>+s<>G`7=Or>Byt}QyZTQlE z07v~+|1s%|SXrVv@6`ISwRXqAEa|Sy?4skHJ*G+cw!|X)E9PI?fD|J=+Z2lCG=u!? zL>E810u$-k0u2+EAn!oS_UdNBGK#4`83OL2?{Pkp^r_}w`?eZ&1@S!cWj3KJM(gNy zeUKtRRkqeGs$7A|T*bZ|ZFKqkVz8CyTzBJn4QB8lEbv=jXVYNWKln-a(zE38|QD(T34qsF$I=+B$`#)Dcoh=qoqMsl|A!r4&k=wxfN> z>79|Yxf=y>yI*BT9kkxUo4K{VBC(C-l6c8c4CrgZ>h>1W)S~7>@bSZVonYtRh}|jK zQO$4P{e0ET0vfDAC6OvCSH!O!WaBrv&+jYNVRCqc1H|1cNrr;abE4LAmk2PfcBb~gc39*y}N!Y=s z_G_QX+jQGb0RvbOQue+yMNl+TdgvR9uW@Sg%CQwVtN3|W45_#=4s(Pw{`tJu(RSb( zaU4|s3N*N#ugLke-51etKAxdW(Oqto>R^x-7Vkob<$-l_LEjLwvpjWork&;69^dCv zEtpUIp)PdS!C&{m2!#hXbyW%x!$ItJ$YH%9W{cH?f+9QC>O$a)+NtQLgBI zB(R1tTph|C(oA0DnxX%yd1kJa(OaxL17#fukG3pOAVxT=x~c!9p7HfZ!3eQAbL0B( zuDpdU#u_Oi6$AGx zHCal7{gM{_q+Dt7shnP}#U`bxGKKD}2{U1%0GR-Mh{WVaBKGItXZ1Amr|bc{w;542 zJ0H0{h$G;`c@C~z8|bN@rb_7Tt}OXIl8$Wu1B|&|7xy029}X?f8_mwEkdMYh?H-Kq zSU5H;1Zer?SfEIN#O5HWTG_52U1ybDiDN!0;;J#JGSYP!CxKQ%Ft&7$h*%lq=@tD) zm+U{4Vg-CuR8Yc3IvQ{VijrK{tQSrT*C{XOQ}AJ+y{Cj&tHXxSg-*}^i2jeU7D@T?RL4y2Lzv@_xM zA7J&ns{5a3Kz*u1GnXMK%Lmb41q{=N^Fz-hkS~SStyy{VmskoS@M23fh7FV0HcUgD z?Y+9tUP_M&rFe}izR#aP!Uq$WI7BMt`JW#$7u)QJjKtZzzp@d(vm&U$*jT!zzWc8Oku zp3zLqsc8vK)Xf^Vl~oz#9H~nL6nMRoOr{ePKY+GHm84Pc=EfLaGX7x|uFLv$280yb zSJy$zj;@7`TbDU|g*I~`L)%OBYs3YS^|^xCEKP>Uc_L*WKpb)bE3#(CwttHss$GFx zO=+Po6Uo%m#i2^17RwHP)Tf%F`qhJ6+*B`l>b&VR7tpzXK?%rLIClN@u#hbZuaS&8 z=lIt2_Rftcen5BP7U1Tjg~S();aVo0@%#8Cjm|^Sk7GWa{1BN&vN@F)1YqtckR3yz zn&r;)x!VfkFT#$-Mpy7^HLgY=sZg>GatH#V(_Uq=s8~Jf0_uy3HGYRJ-Qv%XY~IKwkhXex}3&cTK>13<$6qB4O0{UCTEUua?@Ef)aOzfurjRuc$_PD2J~kZ<#J zB*`ce@5)3WC!7)ufVeQp17~$mm4s7JmDGld-f+nSjVsHc^)33O1D-1b&c>;FbNfx$ zN-466JJQN0S66gvhcl02}TNF!#*5z&pIlH0VKPVqf|WvtI9ETV3w5d2QZ4X%b`0% zT+jj0Oi1}9WYj53jxid2;oqIVN?DKr`N|Ql1IJW}-iM9dT9G|MZ32>&O`vP^m0MK;uKi%aKUlO1YL}}5oOmkRUW*FcdjSoSJhHsQ#`ZY-`|AVyY50IIK}Z~+ zlvQdo3GvGIUtN%J5R|i|k|M>Kf8l*j$WHOMe7uL_y)?X^9jVubnC!{K?_)M8qaQfS zYLE#_OzQPp0doT@wxy{TZ5HALxYzfTFE-jI&TCo?4D@f+qSTz)YrmWMo+?-IE)Q`m zk`8}ysT4Dv*$`4~J!A`$rc*Ls8w;{zf$=FSk4=rVWj;vskXJ6>wJ*n*$6e>*O3UDLQl8!NbQ;E^?v8-5sqVU5wWJ9k5qQ!e>s`~;LIf*7+8LlSNgRY2{q&m+m<=1!-_Cc4Oh350^t6}^`?A~e7TkK7w#3xh4U-!YvzA6`{?Rk9= z4Zm9(7q=Rsqs1gzf1J~0agyCI2X1(0-}z9WT4>sTkYy|b0^(ErH7cfLSA{_0TeQ*$ z@?5rw;+2OkaRS@-Hb} zlD^p1JR5{M0e7-;VTPL7_mSNc^lXAL8!a3<^o#FPreH$6DV6H_HNnbxt*R}0Jj?Wa z23C!j6_B+k%Zlk9Y$du~DUzB`VTmz-i(@o`c{PmU{4ZM_F`@9q9{w5xYp>hQ`}HbE zbefW5-rJ834PeRLYSC<>50j$Tf3oQUbdS5u;k)?+S(8$MYchAuQF#(>EgR>W3k$Tr zq@|!jEgaeJ#D9#s(U03Ql4kH?Jg4yT5W={yFR1srr(TKorytAHRC6?d3Twbczj~7= zO~d|@*daxNZ;RTEaZHt+t?|M3NMxv1K@D~Il(B){yH5=tI#y}}a>5c+n$wS8=r5uk z%?nF49rHCG=54KpzO3;tf=rAjJg&N~TXP~&Jd@|8| zR5y%HlvPUWxRf^OLm>jofnvp{c0IswHBgd(p78Gy&&d)P#M&nl|ANGx91`bg^9MUG zwOItpTME{+HWn8~W6Bc~CKW@63N-`$*BO6V1{&5J z|8*}G5e`r&O%(M({lcm@!rEudFb4n}L)jTCGHrLw&>u&^=hC*l=)g zBPh%ysrC>?QscZ3q9Gu6C|y}yuK#Px6&E*x_MtTv0c-b;Sz;^bebw=nrM4!u8SvgC z5p`zQP{Ruo9M5sc`O^|T>Ug3Zw_7zJkdHBGaT}CQI`+%$w#cYo9s~2N+&O8uEA`mU(|<6xt5L!i~^3sXkR&i z8ywIPC2j0dCg@aDUsLW`sFulu%SiFBE+a9Jv$*;<~x_#9LL+Vzgh9~A~UbwQtgj8OIimw zbi@4vc-(bGnrfIQyxR#5BF+MKR*n@o8deS+u1&cuus#6!-vv6{e|X#DxAV;r1At#!}84dw4Urw$cwkMbQ?TR$bZ!SH>z;Jni;XkhD` z#gHSM(e!-An$yf>!OZ_QbwQGO97FU`)@qgOeFLxLUffpu<T^-JSx3(*rk;_2Q+MWkasCI%?|2psbirG{FJ*0$@d&f^5j`v3#3N;5EM&lPe9^z z-37i3npS^m$w~~GmRhc2-BEX5r6_qUqAH{s!k}jk!y57>@pz~;IPKukLg3;H+Xzo? zAHh_9Za-uA#f!T=nd&!?7f1C_d{o9J?v0IGu9>Fo^uvS^S%Gr8GvsvO&{6 zVBc|EZpRR#mnmv28TG?^Rhu7UVnLCf1r12(=FmL9Q#*LDyj<*GT8&cBwBPCQadqW) z^kS3UyvRwdUzpTNi?^70TXiF@XzWOXR|)@EuMs$RuW$i6>ll7(C}5TcEI{gHEA-2C zDDcXUDck=|Q~$}>zlb?xsHJ&jk){oQW=S}nC?rwvje z#ABnoOnlR$v2vM9$!(3s3C}0<6E$jjn7}Qc;>ZaTDmY2)Jm@(8anBV7W;nTxK>Nz- z3aQN}@6A>*mbA@dxlZ;NrA^<4B%}5J-ZW?_0;%%)ncL3FKB~MtsfidB1$SS*pILjm zyo^lSNZxJ7!aJC73ydHm6FCzh^eg;Ad~_0C>Y^h5N#25Mh?&+df|Q*|(ZjuZzIMAB z4vJvoTa4&LlB)d8cvcI`8E|z|XUY@p5qD?MQ7IX^T$-@8`|>%wCS=8j3Mgz1U07p= zXA||h+Hd=?RbYIQH0Nzua4Gu_@Wv^=#be19KR%vTPKCBEPm6@lWAH;g)7wAxytuA+vj7e~f1ROm!ss|v^8~AYp4sLdXh7pOhqeHC#>xGZ^d1D$5B`Mh z$?(r?%v!nGAwBbC56(j9p8vGB)iky{yPw;G`JH zU^N4Oy1kftXwbLRKgg38Btu6>&x(>RUlMHTA!Srdv2?VOF&p?GElEeZ4J)ga&p;zd zlsdNT&S2H2<9!28DxE+-#7yw)BrW?)6d;0bL1pDf5|T5z`Q_SR*&tmzVUBfJ`k{C@ z&CD`JeEo^GS1*ckUTt~X#c$0WpjEh19?}8zLK{$i8QW4gbAhSXM-)F)(_sli`aO@` z%a3ma_;@qgPa2b#4>x`XK$B({Tf|-A2_D??=&yId#%6Ux-gjN?%MOxpdnblG5oDfB z>NI9UuT%=$f-z?7(v77fo^$5Y9G<5?SVqqo&UM$u)Zn+z>4+F~vfvd}rIGlcQU_*q z)~pE|)`$9B>r%Veft|yv>?sMj)~&=@%l%lu9A;sTL%i7&!oDsW7^_fYHY))}NQZ(% zHk|2&RQGP0KgOiidbZ^Y!}6Ok1i8zTZ~X)_!8$g!DTk%79}+UioD_&tIw1$RQ6BYE znkHI}_EjE1L1FRE9V3p^x<#n|h664*pE;zWFh@}62ar`ziA5K%F(Jf}q#zk*6lNIq zf)21xf)O2{r%{oPRn4GU!`1X3K$X0CR{EtaqFvpRmnYcP$75oYcHzx8OR^lxVqR3b_A!(5q&v;jv27 zaKnC}rse(i1gVXf|1>nxG`6!#z~&WYF=SV}!=of8W6mj_BjmhgwZ(0BDN0S1YK?n) z&+o z4#tX-ojC&b zm+f_VgrkbM2^5`e5MXs zg25USqO+q+2CIP|jY94!WoA_8M}q5s@f#W8-wzm6>ftFgQC;+YFSMm~QccrK`Bn_{ z_Ei*07I09YOj2mWvT!8HK>SzueixSXbLZKXxv49a!LKa+!fx=j&eFU}V zYNY9^7>jN7zdugXQ5#iw#wnn82~mh48l}*{WA%>2#WG+(XT&?${oqS-qa%!s(V#T9 zW^oEZK__#uO`1koNBZ6U^i(}z0P3QVe<_q#3Yc+c2s1WZfP%%G9GZdO3}wR%+JylM zNGL2`2}NA91b5NHIFAm^mD?_9H!?V81|Ku;L7ji=iPBj?(;MuYqrcnV0a>F$mks0X zipm@ze!A}2Y%Y1Cx>Q+-A~pZYsCakz7!|>&_*|qN&6aj8m3sTO(DUy{Y@`q`=sfya zF5yWdA6t`sKbYybPhssImH$RB6or9t@EOVY2he2Q?@@ge&}r#WNO;nJ1|+8x|1vm> zWJ6qQ1H-Ku`=usdIv2u@7Y=!ieHr}Z3vi%2u%VHhE#;1SE zeD~)~PWka%@s|NEqv-X2js5H7PAOw}MDss@K{(NZ?Elq3Ha5!O$ffSK%Vz!;gzP0W zdg?}HlVL$5vvBuw<4ZiJUGe__3zEnZEVSe&^&S9Befm;yB{7q=`4VW290EEmA^#2k zAB7I>>C66=c*u|Y7YzUYw`S`1x|jn zw~wO{7@_*tQq#9Kg&v92u!j!Ihsw|-&D+wu=eX@rqykyUtJ+lVkX=`EFaCkdQL_9C z8P-qLN-Y}WuKMUvf*VK?q5fT$zMEI(#k}KDgU*Ghs$UyPNAXhcWj&rqXq5!`D#G@ny7)YTb72u z@ORwQI^|(&XAMB6+UmNEjODPeZhQAydn7K#-_p~&Lb)Z5qL8-mj(vNVKllBs+Jrwf zeTPh~cw6!riDAhxvJ`fc-Bj;1J>JFZHhA@c?=(c;JugI1TMcJF2n6hhjf|Zk!p7}- z=8|&4$w{rT^iTCK@|&clW}wgw`^Pl=@O#Tsv#@7|pLZOv{SFD0i~j)klw(h1f}lIk zJFZ6II9ggBuL(EU@&h^4;QT&kYr=OFgM2-giS6-?$*kFLlmgwJ7X74qTR#;MjBoqG zzWaJIF838kP{qC`AWa=Qs{=Tf*IH62P_%c>g~(CNj;vtIG3RX|-E`)REN@)w8Sgk0 zWXS-K_el3@G$XaKf@>r;!ki6b8U-ZC13~rf{tm5mK}rS2R#!6Yb^dI8c@z`Do9Q0R zN)F2TP4=kLRtJCl9WoyiX1pQ!v&s~&E}y-TUi^VKw9xRb_O48Tx~>~3VXi+rp?9Q2 zlk@tA_WQ0^T;tYz&#a;M(qG(O9M@eY8J-Qj>y}N2_uTxv!G&?f>t8jb$V|`kqrk(J zwH-`0A9xeBs?IFWw12&>>-Md*H?6)8%$tI<9ZGNv+a>kN+nXB28 z0{?*f{AM_wJ|TkB;OMGW{TEl&6ALs@`JMqHnkjyXd*p3)$^VUkO80M8T_YjYl2hiG zq3rv!_bMcnt+Sm!3w4!r)xzI1Z+I+4g}-@%nOyWFu#;4Noo(k&cMZQ8YgdhlU|~o6 zDcoR*CuB-l0KGaDiM{BOCbv(&I!o5xJBNi$=Slc zipm}3$l0?JmDj%%4B?NLNw&JzMLwL;pNBHY8UJO^p3mN}lU%&iJ#T(Mccv?%f0g?4 z2G2S5Uv=cO1iCst4u{O1k%qN~%=0At|Jp@i+g>eU2R^?ZoqiTYU)kSUvg~J4Yd0Z_ ztZ$RM)v#GB(||nu@1hnG8ZX-;M_<_-WZW8$ryVq=|B9!}qE&f9ZrT3g+h3e;yFzU zXexoEaw2BhCRJQbc@3sEIGto{(t0UN4!9Hw66IlJ9AANKdNhm##Qq>`tdJ5l(%(fW zY+z?OCWM436Czv{GZkB&13mf_N#eMaqUs6$02oCNDhMh7;1Z*fjH2M;_-V3q5W5@~ zH)sdQr6Bc@oT{Z3lQP`i;b{<{uHhq)@KRE#lSG0^IFLI?{Ui6XCF0s9K7H1S2jcV5 zc`dIDpDn9l2s6a@{{=P<$?;WO>~Ov;u}C<&v(g%>Som?QZGp-_vgd*Aep~KBSnL}{eg3JFg}{0@W?$T8x^hD zT{}p@%hFYG!T#2$AH1iIF@LW?Huz?7(Qe?_WCD!hb=GtYHfuMz@$gtgE~1xS#7a6y zRdG^WlG^C=si36AsUK5^Mj)0J-SLl9f&AAtMTrZh?2fcpkpBRN7dI!;JIzfL8&T+6 zeURpY6GfE*L~L}jHI2Q=Ooe9&u*74%h&Nlu4W&jhOIWsTwa{SHg1{G%?>;K5n1(5u zA|REbePX*kZzWG3bDdTN{TmA|pR@IitHRpph22an)8rSYBY4;PX@AM&#|X)7KeIZY z5p$$8mGKrye55!mj9!Vfv*wI^+qJhv=ZaRzRf)cHqqA9P;?8Nq;wRQ1eoDM*YW~Om zDXQt1K{Aj+@gCr^MM}uB0z8%c8xA;~aDYE34K8u#VbM@4cd?)Ezx_9UN;PSg>yu5h zVUpB*lih%4sMpwLzlmJ-FNZq~t$YQ+;2j87BR1_+Jvig@Uj41N%Mt{5;TLgK6O-Zc zV4arNXK=WyIMr1rG*tGyW9t=+S4-Jze36P@php!Y$hM0xOGnxhEhC|9Qn97Xds+p8 z^$&=U?55WXcd_5^*{pxcddI}a?el*UX%yRvpquHHEP|Ry1$__!bAv|Y*dVFX zxHhUHb`A@0j?zeybelILdoaoolmPNC?YHQPDhxvyXLyEaSl2j!9{UsQRWY|0GBO9F zWwF^TGFH)={a*dzXF?A(?9VS6)*K!z5K>#qlRl@uV3kdZrR;lN0lQsw3}Plv18O7J zP3_5fc9J^LR1I8iW&K@mszOd+wmaN8~7{{U7r`Toh0I!Q`AGY}?_-94AjYMJj5 zUi1brh*Ozu!x94P?Q5?EV-AUvVpP#cF2~5w;nZDZ9gZYAl=1pfh??iV{_J9TjbPhY5~ny4i?(hRYB1RBkV3Vy=_25V76*e4~pC0gcD%o~shJhN6aE9YlE@ z=XJZ-`5D8mgD?|J&=}M8mXcCdC202S^=#D`{FJjlG%stM=ADg(iq#t#4F)GX3~ME9 z*#m&q*4a|PDCVQaC#|YzjtJUXT;t5`ZmQNDJXJV;Ax#s(nevy0oiy2P)c*i~Mn8}0 zcy?BzN{3g)DKCkUmj=6A8}7NhM&0rD0Bgx~m>o2jRXt?&fJP=67}M($*4-B`TJa@A zoZYUoC$ihwsPO3V3PD6B7c*qHRiEn>WmbQzR#-qbLI%juLWo<~p2JkSBK~$zqUMBJ z=s+>5N5L?J01;$`?xoEDx}%~Le9#W&+ar>QH%tql8WS2McR&dyk`NKi3G9GLlXQ@P zXxSmnGKB;oBp}KVg+P#mAO`xuYB$v$ODt}+qqhydOK>wGSthu#!NWon?4m;J892R> zhOJXC&r=;$C=WJ~x`pI%N}?hLR~{FsuF9boMpfv`@;0XxOyvwpJQrfCbyaAdt>w>X z(5T`SW~NIIR4RZe2CaTV@#>c&#ry0HYM2OUQUQ4mzy^sBq=i8XEBHlw=qGcVV%LnX z2Vyy@NLDVH8ndTmP8EkbO6q2lQzoJ_rw;q&_pclhqJpXQRT!*Hk?wG@EnM@7cIN17 zoX|iz6l)t=*985$zE4`#!rHk7IlM&OzDrXE#8}E>LsG!{c?r1aPc?~al_rwYaBNXh zF3lZkP;DFBYDqD6hOHcrY&FTTk5n~R2m}6tnpasECEYldc}-SS<=pHC(sBdM4e+noTio(GA)51fr16qXNR z*!ZmH66X?iB}8acO-1myG}W$7vTFJqJ}0{mgt7A*xz4ryod&CxneLKDImYCj({zq- z0Gp^3be6GHh?DJ!D=7q7WYGc?O7yac3Z~Pv3yrC4w7fZY14SA4=&4&y#>5!jtOn_S+6svAKKC1%9OmUdh}mH$WZU{fL|(k34%I>gF{uHtBSFiw)KLp;sIG@538bE zC&?v{2u|81%?cg}O$Y+opbMi^4G;yrsq?ZA#^~mRARhXn$O&Im13^LPg+P#V7JPke)_0 zMgIVl2iW{m`9OV-#b^1Z74k8vFMOar$_;+Lr{bvD7V%Fb8lvZZA7k-PzYnqas#ZV= z}rdB@coq&SboS}7S}|GP1vHxdw1ChcgKB@ya3TFChSpXy}Rs$ zyW6@2;bgt3yDb(w+qwk1+qwnfkyCal9{uV52^yF9FCS_M3A+@JUh@9{1iQoh7nrg+ zrtDGa-XGN*clG=iove!u({?EIbmM zoz~o_C#92S1|III=66z%we>~9TLR2)x-N9pB84oYxlG+5x?{xvjnS%P^hBo(&T_SCuEaQp>AkLBm@Csj(#civM<#DT?cfz=$Qj#0^ITlvR-MD zpb|V28r>J>fRBeX5!F6k2@`cl9Ik=pl4ADV09i7ZB*w@C$t3(rJ%|Abc_U;f(n1gd zJdlJS(@RtXbwDJgqE_7iB%dT85-p+=*#MB5NC5~!00`uS$BF?VJul#o z6orwYR1xz{JvOos5waAnklg^229SUA30Wg;|`Jfrl-uDVAqSp!lLGTFOAbO!jd=Yyf zUg+Os1HI2B5_L?Z0s(|_-&7;|pagqRjnn`UeMQl_Xb4}TL?!_|iY#>9QUN;zU#95R z`yhfjdk_znsNVfi>_)v15$9yUN19=$P0#@z8lw86R9eGb5D0jux-3s5SoA*R0w@XC z^hn$tPz)3e5S@_+9LV%5sosU9`9)$pq znFL)HJJ|q&e9>dkJ6LQ`5ltCSAW#FZpeO`@owP-?Ko`=;PRF7wdMXI14N6uw*rqq; zfH|nC5o3E4fISKUC&@gf+aLpdiUEzaOPXLFh_UE^NC>eTgup!t0OpY@c0Cdxjz|dG z!&F~ID;|kucSG(#2W?Sw@|$c@vFT(2C;>7JwkQGC*q{p_?PV;dp-6+%Zb$@qBIJ}1 zdLqu~eaHvkqC%CAM2I~K0R#)C0qA|mvDV;(0r;iKNCVLJ5o6+j0!e^+6!MaE1pyG9iY$48ot@CxKp>vz0G>&ZdLMEDa!YQB zo8Hz)4uezz_WRRDQ@UVyAQ3`krU!n(+ zb~8#fN0r9?m)Q9wWtghg6HI;1;SU|}VtL%KnwTN=6sqqlXV4aWgVKVG-gL6?w%gC?FvZSCx1TlMxV9x6^T^nl8=AH!NmeF0Za%3fI$MmB!S#@0o34B z!5T38e+hztiG_`G4{0fCe<)@ipyCEJRl>d zVBpal#o^WZT*D}3^8VXPKI!<})k7w2=VzuL#>`yum|x52e5?ieJqE}5m;T>Sz(0Oi z*dU3A1Oi|{z%d|L|8h*Q2?T=#law2a?5PHiBsl}Grg0zzqmxNoPL0$G_UOUgEI@z> z_94L}0mOlG$>67JVbT(Z&q)LEzXpK4e*^@;C01Fq$)*i|7j)8>>TcrDD{YcZYtu25 zq{uUUg-Z-M(a0#0w=ZK$VbjC7*kxa1Q+zOq2zZTAfM*iK|DaO{Fh+#_IQps($c5?Q z0>xs*Exn&Afgv1D{Ag8z!U%|7#yC`5WdWYyFaj9aiMaL8iJ>z3KLZM+@<#&YF`5=B zmP0?Y;%n-bL$sJ=01^2*w(PeO1AP*2^8u(-fR%b!;vN$xF8NE0l*DBdGjjJ&p#uSM z<&RQLZ!w9>&21A=T>Qz!r&iNwOE1Ov*76ughf!L?%3#xH~4Zy^CRUq}T8V58_eSRhUq zL8{9V;e$#|@mw7wa99vtK$ZhADX7mewg}3T~=Qo9B+2In(s>0{(AZH^C9XIF2q-$nGh1H zs^8BmL5<4q^nO2A@pM^jW>+>&%KkP|KogO~$~pKFg1n?I;e4k#hDfq}OeX$wq3ngV zloe%UZ-KpIM;+sb2jvr-k7K0m^M$un#BmG|mJS>Wi`kVe`(u)v5uh^HD#>!K*@mo+r5><|hp=WBxK zJ|cTt{A-><;@9h9j8QV4YV2MH?S^I+04SA;#bD#SsAZ^Rw9c` zeKW+B&p7u6caZ`sy%$+O2WOIWZfW34KevuUj0bbPh5Vw|+gjSvEf6d1wh?lAD55f< z%7vfIjg>)rTBGw#O#;Pwl{cR^2DkaGeaALjro8^l+c@mZx0QOS{QbLeN-eM=J<{T< zIDD>tjQ)?xKh|62G+UJC+tzZUIIPzCG0U;s&EfmUEa%*&)u|X~=p8`zXTGh~OTb_* zee%Up(7i0ON4B4N6ETmww#zQE1WuWZZu6QDvRB@grv{>8+eBhdXKYWeieI@4OnzNb zpDXm09k>)wYYZ{3Te@O-7` z&`D6Z>xa?JjqhVteDELoX96S&kzJ3I#44CLTa&JZlPB|GXmH>`ykO^xO4UQ zXczr_IrI8n=*#h7sF5*&>aJH3o5Jx&p0V;;x^s2UL)r@P7OOHgP8K+-v~Y7hVI^*` z(N_J8w2^a1&qKyKy#;@B@G&mcZn7SiJE}U$Hst*Jwl8vp9qd~>MV^S|8YDnL*1V2X z8;Pd6Q4^ghzXL*u#MVy@#8)~;TDG?Ao(RZwW$>?bo9<=FAIbh}S@N&vz(Gl$X4=Zbnl$z#Z%vNyUCY@3wsa`ZB8t3h-*h#gl*UCg{02NNRid)HYvqS z<}D0)eRUa3{iR%N;Zka!{5(6xWJ46opY<1k+lss34Y@ztGj$n4Xvq7Q`Z|5XC82M= zv~*&7Fs93N4|SWUbC?PRkQ?Lu1Udup;shX8VZ1pW@gC$60bg|w*p@}4ZRuIMqH_Zt z9tFT5H~^kxmjw_6a2Jz9NM9(Vy?7JP)5~)Cm{Kph^+qSzRHWL-hv3<${6}nb9(3IJ zuW6{y*6;ahsAE~u>tF4ErkYi+z0ROKrL%lZr)U*>k*n~wHpE2B!3#T>RdmnObVnXXUQ7pf(jL{=SZLRb6| zIjmmDB4efMt!aF@nj?QnKZS~9H}2fRC&E}wF1r+obOUFG(=qrt?&w{U$@g2+Vvo=W zDcl{k5Wgo;PL5mC1ANHbOR7~ExS**?D}RMZEl@M(Z=;#l(pHnP9qfKr^WCJ@$(cBd z3aPh@HXFa0Eb^13q9}GTim}g{&D!)L9(ezJdO57(onxHieUruMI;*}!ts($W_>hoB{hKtJE2RC%m%DtOqGyFUWmCK148`deezxQA% zr%p<>PA=DC`kl)AwN(DtG0HkCi(fMd2jAb#%pCO6Kxvq|DNed+^zZ3Ecx4e>p(`XL z;zhfgF52{Zx@cV2r7#OwSz777aZQ9NCA77}W*sv|TF0w*RAn)l^UlC-e507QEM=@f zfR>_mkf-1BeIBezm@q@wI)hhnD3~=y7q`K9vNaqTjcP#5K9hD|kiKNpULbp%;E{aY zCQNd$H63Q(>u$n_SlF80izmvvdSw+p{w^c$i`LVyA{y>ro0@NowUQ1Z+FR5EvEv9KY70uFM1w#nX-T^ZnYpK|6 zGUOW41Q7|UB~%kJ<7=BCLDUgO?AApFKcb!(XE^SP5Y4R_+@ZVhFNUhWQ?ztYz9Sc(cDDe1oyVYSOs;N z=nl;lLE1N7Ma3+R7sk;QQ_j|FJ)``awq6#3Z=D(9`IQZBkvz)h%YOHk>y2| zeO2R_F=KKwaGSm%Si{DqB$r+LgXq%AAH z!=4?NbdntXdAnm~226T<%Nl}tVV%^KHy>C(GgJ?K7qhPWmxG9b|%)Gjb5v8+^|Wb{tLG#1NL0AX4A0eWe)|il!{KW zidC(p{OV}fmOQ?f#FvyTe348J%71B7(-&;&`pX4I>*{cPB8u;qo@HOF7%$551ut6k z-J9mTpNRg>*u<1nYX9H!fjNVH;+KCJm?i1bB zGt@jebihoM@=)o-7ljm_0u4co=c%cQcv2~Gx@$58^HCcSYUuNnrU!By@4u2nTc}|< z+HsjPbY;T>0Ugkk0Zi!uJo*Db9Y<1@3#$yu0)gO31%d{WLJA(B6Q&X2p0W|S+SSWV zled|VnwE$!82rIhR$()Fqio*z`5z=p@(vvy5kndExTU#D(m%qy9 zF6?fupBI6Nt+(zRB59YEn#hu+ru>ao8%C-e%MED<&+o~>`4ijD_t9*qs`qRLg?oh@ zXUV)a-e+s`ofJzgslmAj70Vi?zxI#uTq-OXPEa1zEqg)@=ELKEyOyDw$&y{;;9-hROb{SUaH#9gtt~>bR4|Zlhlt_-bY;1XTCvYKWx0cpQx`VTqpIKLZjx3Be5~?o^MX{i^rK%AI`xFbRF%3N0 z>H`@B{dO$cRwI#={YVY_?d0-o@zA7?;Uk*}}1a~*7)XdkH50~aEPs36E&erm& zn|7od`MDEeGKypMV(F?|k4#22Pno`Flz7RvUH-gq+et(DzeoOpPfc|FVm5iVdGu>v ztW(Oec{j#j;@5_>P_lQ4d0?5^ zY)*)bpmuXsW%pJ*a-mXnZ9O-vKE7h=8ACYBXO+erZG*^e2CkIkalyCazg|Iqln5!~ z;TDY5JWCRI@%WRQFh^LeidzF&7PsKrKtpojeYqclsWeS*7{V!ohI458MmLL6_h}?t2eD*yY*|%H_pq-nWjD+Hbzl<1Os3%8M3c zi!QVN8Wm??$1Snq{O9G7Q|;dImrOXi;VaBvBlBQ8d{o~PjeXUx&Mv=6eZXj;gGup} z+yfqIz)Jh*aU4|kF+u$c1Qy!2H(+#UUo6SXbtSMIk_*(q)+8w5qetH=Zn z@(6}j+p(PN!aQQLHOT|Di6N4B03gu~iNoVzW`ZaOJXL3b$l@@D-jlM>!~%$jgQU7K z$`zj>NO)yDQWZmtY}stGuN1r;TNOhB`AX5EmM++Ztd7m_mj#ny3{`b*<*UgTar^s| zzxM|F4xq}pX~rI(PVGz2TXxFPsF@9Z_7 z7~$@J-`7oTm~vgXduJ~y>0~QcFI6*Lh^BPu={w4GXjA`i_l0+I3&N^)F+-5&;@ER= z?>@EZ`h5G(_-h|za*NtO!lQRnEjFks=j2%))Y&U{+R?;XF~i>XnZrpZ+p3jkQ_YpP zZ9fo}gEMql#3zxhD|A^T3q=ikbK|8=rc*84KQcxCQ7=r7S4H#KrxsHGbh%sYg5)Zi z%QI$9Dvz^QzIpfh|LaV2X8PPMbE?Tfwe0VHZ}ak!*dN9*E}ys<%Wp@oh3o$!*|#Rw zrdnA2gb&fq-ctB&ef@j5V)B<{NHrU9rW};D`zxa$V;2k8E+FmqHQ_b=U-b)7buc0bvtnTcoM+ zyVZ@$Eme*3XJ!pYLzQG}`xNPn$^tfRC#)#x7>=YENj~N<3~LolN$S?=N>00ZiAwc6 zpiLu6eelynuc;+?Nc06A4`V9PP*@6FiCHmzO!}C^%&D`f^AR)EpMTB%_gt7pkB7m{Fw+SEX;<>f7Tce43WX+;ftTyglSjcHyi9 z0YO6n&;Vi#iZ#bIf_ymMZf5cy&{hP@wXOplg+O~mXA@bg1SG1#V zPE;GdsBS}{_j!h+j4PWv?H{7qhc^+z=1V1SqY=2H(IqKD!dy9)W-K@_o7MXuQP>2< zEE-YRc$x%Oj)iMbd%#rXdwOKCKE)e#^?{Eap*_Qd06w-P^9HWR?0l{}Zqhd2 z>c%!SgTFShawP@&*~Tk}{ff-EmO@l}DQB5f9`J7))h=~Z*9@*o;<<#V2k|5`zp5yH z>h!YA@ez4~)#&^;33c#>pcv$H3Pv+clZ90WtG{v5!_9f%nhOjnq8k9{c9dpyY>6v= zs?t=g@`2S!&_wlNtyy39=Un7vK%w+g!{39%>|L}B$SE$&E~mHmoqTX!#fEzj0X!J? zv=FDqKsOLToE;OO(-#E6_~)JkXz2l50P+@mfDEy~0g#Pjk{y5_$cxEPPN4A_qx^x^ zExDa6Qto?mY9{Xb02;SEgn6R>QSLI(%$?D}s!j#6;H4)}42Eff zR43N=4vX4a*Qzi2Y>%0t-!QG~o6qV$>KnYi+-;sG96|T8E@1Ip=v>dt<;BOF#&4F7 ztt8Vl&^TAv=svJEmrJ!nC_L=)^oi_u8i>$+x#ID&Hh<{LQeIHEvZXKO?6k4^3=Q#s z{!g85R`05h(`KuQ*)M8ygSE+uegwU4m^4;z6>*#RF_YBP`MqX1M$Vw%N3=3`^AlIo z3QoC-zlHkIOVG!fE2^xHtrAU6uTC=K>a6fz7SCtNSqDQk_4BE|ZqJ`M^0XNt(5?F#biUH(6xM3H> zkszRt0ta)E2lyuo|4Y&gpb6ppRDwL{H8}(0GaUIz@fFz#>#PF?HLUj=9s#3-DwP&* zQWEewy0D+fz6~VTJ)-2w2C(tsxF{eU+2jB{Mouh%Nlz{!&vIX1oxa+XI52^kS=~qG z(N`tTedATRF!P&T5ha>B5plW1Ge>_YKh$LQc-5Howg-RedmY*qR0M`ahH|Vxg`x9r z80cs(%s!^kD=|*=wY97HK#o`=qo=VV{NkSS!ac1DgxKrI}QA^!=J~!}2Z9 zV<*|g7t+*kc)jz2-ITUoUO%)-!WYPG>`SG{#Afd#&~b9)inpxYN*5umh^LPeQ&ca` zjnJheBp+_{xk@F|=GNfzV%|QmOGa7NZuS|b^<(G4wcz$FMa4IL#x^*ACuxIPeTbB% zD@b1^rhdbioD4U0{C?`k78C2t;1R;Zo-bOz;RVFf5Um1`{HsnVJ9*ku~k$fnYvb#!M-u=?E~>mc%ioCkL>2 z08nxQT>s#Pu?%K79bmKvfXL(alTcupMd`)_I`NlM?a^VZDy*0$vpv=0dBxw75Sk6| zd}@uI!@|j;U4RP@#Rj<$;NB0=3;?phh+izeZv@r+KF8?Cs1iUrFB#^CMx~ z?n{cui!XGR{w)?$);E$g?au(0koS399T@Q)unJ^4k{?S*^ac6Z z(*wO<0Ig6PClQ=CE)dBi%#Kgw4^R>v0UiV$#M!u-7yvm$F#x~-IIu7SB=9~!w*|M@E{* zvFZT1x#AJP0^q!61@c*x!LTL^K>$ktId&IzGwvZS1wAA{8~C9Ib${M+SC)V!TVruWrRG90_cdiKk<6aRLSuLa^kN4t(UIl*aEb`yDe z4$JPH7!_9IHQj%M=`LT)Rs901WTFuScqK4B%40~b%Yc0UvvMT;jM(f-Rgo(<9r zu9|P=T_B$Rmxb{XNM_~4towxg%YvT`adlCP68N({&q+OMm+49kuC_fP6O#o!!EDUW zhWI|d%T7J2*<|)9H&O1?!dZg-|4J|hYG168#287Qln1pIR3G^-@2B72WaeC;Hg|qt zgxN8-$v7>F<&87L`#_BpZ0gSnmhLwycOpLEj7Zad+ccf#?@zIzb>#PAX(St!skV#f z`o8zkDl0eQ?TLo%qj;`w_i9o>8j%bMH?#4FWr7PU@6V{Dj{Wy}2zXS>? zQje`)^F0D*PT$}0mrRrWQ&*}Kr7rtNUCsngp47myhdq2I(|zVPU&(aYBQ2m&pJLct8xj{z4!wtGpJd$&p7wBmi9Xa3CKSJG2Wz z`&5X>!t5#Sytw7d@IWRWeFZIa4iCceWz6cgTWxXaAq3vC^l0k)8Cb>M4a4N|Q~x`l zlrAUoM!=z7;Y5qEoKH0^Og9rJe8G8V9tOTA!nOP74Q3|=O@9#URXL(X_7|Yjh3b;5 zx9a_r_n&!Goa?ndXMM$z_$B2}Z`q||RA2iiHUCWWDwUhT3rg{aA@z25K9c{XOfk^bl7<+j3 zX&MEk{CsPA#No#da<~J!V~%q6@cmbNFElu(@BNp959 z`oHQ3x^?NhzgyGr&2jjz746Ta+n4@{WW?eOw4`@8ap6 z@Vm8k`L$xOmLE1=V+9sb17ZJa{R?OkF_Hcj1DCE>s#E7nThg;`sGd7O@fF)wZFh$~ zH`sX9tS+h>kwmh`X5g_lmW#0iDbUC!K_19x}z+lLxGh_i( zXYMOx6kETS3_?M24`1q9{3z#=rfc#4c4MczLaa;K1&`Z?W0NLBqff6`R55qW`8HQZ z7WCW%w@+b(w07P-N!&ykrxA#ifjfYmY<%_(z=K^_UfMLe?6S1$kDvR`I$iI4T}r$I zlr}_7CeL|LgVMj)#RJ){>wU$_#i7@zJ?4CI2Jk|c;d-5QiQwIN82MZA4tSASCw{xA zcJXd}Tl(DQ-M8D(&6VEK&KmEm|5{dEA~<)*?tr~@Kgk_l=emLGknu|vTGAX8ku%Xr zTz}xwW)A9{>kd%x7wTP?JM`%-SH1%p6EEJJf&knr@YD6>jmHFM3!V!2SbakL4*K7p z>p8kay6$7zOwKDSpOlj;+p!DYtuLt#*DT`CP3a`rUa8xiD_wl9nUpIUz64(vD#HAe z!P`Yb+e*_WrOk^Y`d16sP%YjWH!J9| zcNEVB(Ypr#9>D-HIYdNK_N@e-Bxp>5_do&21^y+S)m+v=;2k2v4tKBaYjDcl`&w37 z6XAYLD^|3%vLhI*v+}cvJ^G`5#460;4sa~JNSvFx15Eo4o^wbtWf2HdG&DFPGvWQLb><(~6T#N6KBcR~v0r4?8xg_E0O_t0z=v@j; z1c$)2pnrY^?9BaIRE!LdGZEqUBs}?`qS=k5l!`NW*N-;qzEy*0vl|z3ed*xjT!!>! zo)dgwa8$IOy9tQrM6pI0a(D458{Yw{;#-W`1N93rQk9PpzUQXiUA=nW4}YZm87ke) z9HRRfLp|P;DeQ>zz+rX1Y9uwf!QVTiZNAFYp+&bjt}P~LBa%s1EeIhpLZnc?SJM!P z7JyTu@Y??bq-rg^st+?V zGl~2FYFMm5c>+7AwMpte{Ty@%;5}ds!voBSApj1j3=wSOVK7SwsN=j!ByNWMYNzNR zrCxzUmbS8*ybN0L?2r4*+B3pH1kf;{^}!MdlJDuQZsfKMa?h3iFQ*a&kVd`lWnP`Dc=ng}SRR%`_{sBqLO&E#i3D&!-cCdmm zRj?Nk;iuf0Ke7K&!4VR{NQKhDCdvPy{%h>v`5POAS#Tu?HI=!8T~_5*H{A9AqD2L4?B2tC9a}W`B;F*WpVPdsf?9$*AWuaC6gNagEppSxnu&aK8hZ@mAIN{BBoE zRwu7Hm>ZTTMEvJzlr~`dXf8@|T8uxR=caA^9|~W^>k03mXj2jtUyRL#C}ThDI_|8o zE}3d%)Tc7r@+U5b3tlzb_hwHTkQE)Q{T!$+UA_Z~t)TN60&JJ$rZRQzoiS3H*8)DG zjvS?G*sjyA9SLtnZO^@ybx0SYz>tv_9q`Z+qb!QGsT8n10VTe>@24^7=-fy4V z&#sL_qPsTear0>xktfe~>{4ARR4+x^L^+3l`~w&@N$L2(cdzFmWB(lAOb02+XM}e6 zWQ-JHu{r=Y6o6=?m|{TifB=986N8Ez10o^Kh5c0G<6F>!!-5_52$Nlf-Q5bcxYRI#%B190F1kfjCm1 zksS_CeZ1m(izUKtWWFOiG_#5e01yCY<-cs}eOHSATYm|N9v(y@2!M#-0Uj8{n*Vuw zfX6&6^xgk0w^Iw_TAkeVHy74tXqe&jk*l~Gk>1ISzOlZ!zvIG`&bSR)akp{@d9M}u z@Oj+vuzAC7Z!_!cUiqjmKX zTDiCDA{;Wi941tU_(ElgOJkM@!GHLSSuz|MQ$G_k1R{y3+$)r>K51%9^oOLmJ)Abfv1w{!2P%!2>=8@KEOlq z6#xP-fdJ*9#J;XR#zMLvN0ty!tZZGH&zH$`AvEd5Eb-}O3UvhS^OWOu*VfPTFL`VM#I1yEIv&tr`KImg#Q zmqWkdjrXU2fk{x~U1_`V4qu2dS{Cs-WAwg0rnu#3>vlgyL%{ma$V-stRI@{f*a~UW z8ftjGDlHs5)AO$zO=H9cuO|OURsI1VW4Ysz!8$!q9zcu-nrWbc8UO%*B`8Sn`Xq*( z#0GGEyXD^_7w!P7!_xC)vfY)SXC;I%Z`7WMuiAL$FJF!dao2?qvTtJ?jWaQx`!+g@TLy>UcDoMP_mH+d=rZBWqf-|Ye~OB3 zRWO+?a~Z7j{$?hf?5p?5XSkq3^s1hMI7d4lq76t4iIe^Wo;p2(KPBRmau8d>YB|RM28YO$o}m8 zbso$FX6yzJ5)XPm7`N_ol=U6Ofk;TWr8`-_P*NGRc>JE}p<|`qduRf3rI#8tYbp~F z61B9)PWFcF5Lv?t*F;exu_?})t>C^(e?!`-7xuxCEvl3+|=R(%#7*6I3 z8oL`SZ6=gg1}R7lh-GPLNub* zW$3ZVgSv_FaEZadMn1bdD0pK21IZK!5(v@vW^xcDdk8!f{Rg9MgTOz@tvKP$q{#%h zEDwx`H3Nu%kJR@iCf{#ja@?P%UfQo*^GAHYhZcwcIhrgGVq7n}Tk-9Z{9=5w<_cS{z*imk!HpuKShnZnyKL z`BKv;fqlk;(*j<`@aEAyRP(RdoyKdgpeMWq=W*k%PKShSRXz?QsS)8e8AYUE8hGPOOK>)@lQc6fDP~1dJo(l|MQU8EVK#g3%hAmo|EqiBpSfGBX^> zfPV`QCSpB=Kj+2Nwr_j{mCX0sKRx|d7l#~2Z&cYrRu zr;+jwDB~Q`q44*<(epFbac{dVM{#d>aHUNlC@*WTyX^NPV%l!k*lpT5#Qq{u5(~Lu z4sEx~T|<~XEobqi>zH|OEK!JHk7@KXdP4iKfQ}1so>eik<<)*SnD22 z%tGjFaY^LwDvr?H9Wa^2qq}Q)gt|A>I-;j>I+EffLasd{H(&a_@)Df&%GdG2!GmqX zcU~HfsAfCl_=>+{@#26M+tCKw_Y~8lA;mcl;aU`j1>g7E7Tc~uQl#NDSSxLvywrFN z|bEGI<4Z3lzS$f6iuNXBiW1Se;Oyb*+Y!je041N z_W%GJ3nLqN6zB?3@6*ku2YBdNu-<~mnv518f073#d{+g?3E#AptfCt2)Ot@oJdr zvX&!B&N5wkkic6KV2IpVU+lPJ!mi%O4<|m~@n|j;4_8+kL;yCp3jo@n#Q|go(G%xm zzM`8o_ZPZRtNn$dvdu&L*kxU5XZ;B|73&s&d#w*0p3-#wasB$ec)zz2gu`u%Geg+I zNM}mfZTr2{<0-uY?@sEglpQ|(c7Zc?eb{=G{7&YZL^-lyWK9{GMopkMhU>IyAxc3m z%^iLoMD1-fcodWq2nIU zy;>t`bg13OnpUI)9;yXlYG|%UQ@TA6T5)c3{7r5L&SO)KOzj8F0bv>Yx%nUlqGrK+ zr7t@-SEoH?>g_Mj^U1Z^LV*HUA{r?WF**8zyF>?Wbb7X@vR2y^*JQ9i=jZLzg@EY< z{XoiGOi_u6YX%uE!T+v>E$eSra8FUyEupFqCC7iO_PD34mK6Sph#oSTsxy_JX?Fgt z|E+irqBT-E6L;gMS)@kn8*O6TaB`ps6tvmkV>Ur!5)Xu`gLW(~CO!DTfw#aA77i!b zGm}Fe$tOIwXj&ZQ9#}{7W7^`C5L-Gdf!`5-NF~o44_Ln&Z7${hR^TnOHCaY)O3Gm=q@O? zeO*MLHJxltv|@QFK8sE31c~;4RvhzYf_}rfP=wS$J1;oh-9+~B>L+cI_zWZUt(NeS z)XnGzLdL<9(|l$6ok7!1^SD%nZ-j)Aq{&82##v8gD<{A23X?{o9t`D$%(b#z+wtFq;Zsk}yOT_=$Fv2*Kejiq?RVDje)E|&?_-74_$(2^tM88*2c4Vu#n80da={}F zXN>oar*juGw!E8=NSrkH{8J~SLm*cLtkWC3a)wZOHyJl|l-64}=oI|ey}%Pq5ry-v zheebk-yuUxO248)2rkIqSZ}$a_oNHdXk`jhFui4^SY8#0_ikJ~K@PP0)NxaHq%y)pgdd05^oVy!fevh{S); z02d`d0(6ftLUFf~&n){>2CwSPyz+t#YeAS`zal>$Q_zgS4=Gn(==;N$T*zk=@<#4? zx$uM$h+miXLsuz?+>p;EyP!T|Cg!!tLX}X*7shE zgj6Ws(n{M_xmA8a(@o+3KTC=oX#(XMhK# z-o4Wr4}B6LGi&vUE`!KizftKsit5Sim9S9e7gq{l+VBS3 z+g?r+PcjD^mj0{phEBoI-&~idp1*JZF?{n13U$5W_=R$NkVQp1*nnF2c$_m|RafV) zsu-T(H`s7p?dKwzY<=pXz^ozIWcVkANQx(ZO?E zU=E$ZYa1{A>K(DaXLS5Vb`r)^S@rIx&8(Gcnyz>h(H)>QT*1w|va;Q(;;SS(u-+c^ z;^9(AwN-gFYGv1XN8hsKU1H2yC-`ZHjeh0Lr}VO0p*vvP$tMF+P3m98@B-IuZ=SK$v$%RNPT)$X3%0qE|NXGYEQh`Km^FhC=92Y{}7 zwQcbT(*icQ1CuUa?;=-0&E&Rx?;*n_NvBQ4fqV~&=FJhUXw{{^#|DnqE(h>OlXlP+@lY&`vK9BRwdHYAr zDH(Ksi}+H+CW3aP0~{1Oy6%pYT0|q)xh5K}YaNSv!INdtQ?DD$#uCnRFDbcquL<+c z8_TYJ$N&8CJ#pXI7wvvfnp`62v%l%VYhBp=Z~u24+d6&uP9T!!)2Q`%GNuo61gxw1 zNl}Q0bE+*jkLM#D874fcAPIYRPKE^RK5VIMKpW#HuC@dYfKmI;Tn8Wl;5!fCl9*t5 zB$6azxeQ#@TbQ!m{vcxpUwe{R5lIQa48kTA065YU13*4K8AAX)7}&;(RL_6wzNzmu zG2EJr`1;poU!&VkwdGjE4*#a~-I2f6jD5^%_xLK>=f*#M#|71dufIa-&55Sg>DGd_ z|JGne`>djMr$(YFB3imP*$AN=Ezaz^0tmlX&P-Yr421*T$vpfE1AI-ZgDDRjJQqu% zY?8UP%eLArU1ZuD*yTE)Y_x&iJTWqxcLbkm`` zllCW>N5@b$IU43bQPv7hj7hV=WC<+c3K@M-T!;C=hg?6a-m;3VJ26GVEsr*2$5bop zdv1jX*md^x45My_;7a^u2AjtlvXfJXs1|CS-b$bET&j&_oNc$z5qGkgvO-bs%$MS` zyG>PJ_0X%{4g}ygQza+AvgV%Hlo&a**hJiZbq}8sI#2mM=8#2}p8KnzJyW#Xq5Bvu zyJK*UHwo`}{;}*>>Umqxnje}vtTiV2Et^ZvEoAA&o|z4A4_Ooa0NJb+y&9QT=C3Lo zx{`;oSE`|E*6` zW9En|`&@DE(vi8Ht6DbKbt7qknij**@HI1!G;0*pgDvQd%qq7A`hOzz@Ug_fnZ<* z;h)SIF;P;mUu#8u-modUi9;98zs;af%=}fRb7tt+S$S_{>Y}|$>B^DGpp4YR^Q&m) z={X`qvp_k+=+6mx`}UE)bi`QlS7?%sr}Lw-^tovGK%x<6iC|OX_DVH|Yk`6G(tKip z_1yARssqZ7lZhoARq{FvwdmmAHm@Ua$bZl)W?t~Ly)tFh6f`7@C6ULTx=pYYCtF|d zq$bVE%5B6@^4L!8k7cHTrnQDMM%NMHDzte-Ytvpu54-p9N}3Gbu7mw6XKn}n#rgLe zI^J(SBeUK{8u3*)x16zgOs>QjuGuY8Ds!)A6-IB7%_mqiVt=%zl?+vVhI) zN0*CwyNBsdOfXQj9xePy;e{sBO%P2)K*{9yEIjoN=$8uHU7zj=gBlLjSSKC9GxmS{ zq zIUk3x6P5X!?NPhlCx3o)AGSX)D!TIU8YxsyV;84dcK9@Eb$@1F*H>^5LbJTmW%4q#O&c?|*QFfTvV2=;0qQA7VnDXo~GQ@mi2_Cazj| zvmFLAMLd8G;35A6hVlYHTNn%n#3e)$?&06mvLEoy`iLnc- z%qLvjj=%WiXoB-FRA13-nfC)F1_lutx>@T&bqB z5a$6@H+@U>8%e22*~)Zum~JAd@On{fOc!s3(gx3riqvf4DD(vnvZ_2&+bs9`7yeot%^n{G_RLpEm-(_<@Ggp zM-=GmtWuUDeC|taBs!%1#%OC}S4lU6b1s!1e&mTp24+`MHvNB0eRW(EZP@Nof=EiY zf^>rj($d{aEG6CD4Jt?@QUcN)%hKH~-JOeccjFn}?>pyr<_~6voo8lP?!BKouIqXf zN;(f@mPaW)FPS_nw!YcrE?;{!Q%mf=YFT@5TJhb#$-vt&f8aDp7p5QChI_jTuV7W} z{(cdmyy8i={_#-6Yt7r@`xjEx*l@0)&f@O=9+GSxL`h`yLKPgQBrZA?lISxrgC#&l^T^vgn}qBUugwb2EX& zsDC{7*#FzmGCv2R4M?Hd2ixfy7xa(1=)9Yr_ApsGxnRz#W&dl@P+HsaYjf!K?jMME zdN;r>E{xv*)&zj|`5J`R1qmR~xy>QIT4Cjeo?Wt#Bvmc4lRd&R){^6w`NhW$BV#K> z$9X0tU9rk@iJF#X%XC8)m)Pf zgx{IPIA?z-Ycce2A(95W^OY;g*lw#7K-5Et(1 zHBTjI=rtuYbI#v6(0G9ln3-w+f%XrsYkajGg+h&Td7Qwf8_lP=hPf;^um~*F+C}i{ z(st1hzm;FED$~;4HRp`3p)lFdZ#@Oi*{u`3JZv*@nx4)Un1)A6H-0Yk%LD@(H8ny?X*O} zFiqi-4N!9pyC$RI-=%t;#oR)mA{OQLOvy({kU;YE>_l<6OR|~I- zl-^ljNedMm3u66JvH^^iGHiW4Bq1!WI|7eo=zU>fh)k4NWWUC)r^;ty07$q3GG}-} z9Ej3^gMo&i^K5r$Kq(opSHvw4akHprV04Md@=bD;e#X%%o{5m_O&8uEdH*T11Viu} zz+TY;kpNI;I4}%75ZH+#n{k>_ED%fp$wqAYrd4J9osPsRaIgcQ$mcVXFf1YPY4+e23?Q}xP(gY^?g(Qe-%j9tr6LEaC*|HKh# zC4s)$X(lXB^_Zl#CK232C-y!op_ibv7xvaMr;ol0(~`fz5ZrX4*t^g$qkeo#U9?WL zzfJw;;)+iqR2CX0^6 z8mr$$Qwn~wp@paN9q%ZpYrr*+v_;4xb=^GZTkGQ~*cG)LR2HnJnVP*rPM}OcV0-*d zduFd$->J{@)81C%$~!yz-UefRn+mOs0B6ky?~@gkVCZyTFPvV|jcuh4h2XU;w0_(D z6hbRi*7-oimCctx!IoXGSEBrC<^6pOHMG1tg6Ye#6v&olDh2Z8X;nRl8e`6*U82W zJnBBdTP27dmY}vKSIYPggyPV7A6A*JBK7felb+O7nIQUVS}#xbqqRn&rr|LoPs?7n zkJ5FBn?;OCz$GKNWv?e}f1m&6_vOcsi~3l*#*m3bL zEb6A$O<1{hhyK>&x|FMXs^q#vuWpX%YA&Bz1{R?o@pRGId6DJTzYCVFND~q~dO8q| zd(FwuB7P0uTY7Nbk~)H2ZZyXTTK%%81uO9#qg6=O%-TJ8{MzTAXm&WFWc3;XKC3-d z?lK>n46f;ApA)a;=A_!@7501z?)pN8v{k77$l>1^E4>@lYxL%8LHi~4eDb8vm^Jzk zXwrK0*(|B2!BL+VnXC10hWaC}9O!D!YJK6fmBZN3la~DI)a`}O71ZGqFT303+zIa9 z7~D{#bc@WW9q5rBNGs3-HqsJ$Y){E&qn&JST){om*V4@X6 zC%~!yCZ(DN&w_-DYW^>W0Z7P!jpnT}0tI0}(CG(maK>6hSVelHuTkzd)i z)ua)#dr!;`nM2Q1g6C|&j)w7~>}#0F>zQ9ITda*HA!~zX(XEq-71n4m#$~PaQ6|L` zYX3k#Y39nv96#cWsD;qJjzm{``lR4?7 zw0XQ%tvy~$dYuUr8Vt~S>q@yi9hWF-{pC(XAHKs>k~kC| z-ukYrjM#BWj<4wGNXv0aGQ7)N_p3(%*l!TCol)z{iT+o`wS>#Ta{DIsHJOwMv&(=Y zNgG|{BA>2k_{PuPdUu+Wk~Y>&jWX@&HQeHY1|Gjw>jHKFsEWWb?Yw@*j)uvXu2=nw zC#?G&8olq%JUy7?&7vk{MQcA1?Rnp=oNeAw3Ps!xVECinrB}IS!&0LmzZCv z$2#tdBeOMnk>;xvwJKZuQx|EFP{2! zvfA6|QapBrHBN7|MW20GwqCwpdE6{1X<5~~IcBJ7xu08&p;#AWUyZ?BuT6I=o4v%D z-E!-rBx|3v4Y-pHFIivg@`8)`xQ`yVus<$0^QOO}FA@JfviGDi|9@?4`sJX&F*V%1 z>JP@-?*3lD+PJ2exTKizsNWMI>S+LM8LhxJPEmX$kc67OS#$W6Y9W5`|5xQf;vk@Y ztAoUP#u2(Otm#Yrp=w$=lAA%S5?>VI2arJn7KRWGLa-M53m6;98(bit4&NIWSxh>s zTD04`xh;ZQW*iRO`IKJG)IgS_0Vj9nC!BQE=kc&T6n(Jzb@W$BPTP~LmTu~DG(AzS zt5VT&!s8#^1d1h}@NIv%FiWAnf``D_79}gM-0_k8ZknJYx$X)Azux|60~r95T3gtX zYi2aW`KpuuK;^vY(iY<+Egf+>6jfVx0y=B0KCe!`9{knJyX_?5>%1fF?RnhXU{1RI zO9FaN)*XY*w*-c)?CnWao$H228W3sp!0+6+t&5M52y6Lo&1B7tVbxg${U>nm>K3m# zFHQDihJe_~V=YsUN13N!w1Yvg8WUhHM07#oep%R%d0JTGZV zl~KibHJ+LkC>RxCR;r2k4I3AniZvN2ulM7YA7Aztmci@@M{j6Kioxfq)0LmoN&bOU zn2Vp%JW#aUF3;&u?y(kAc(TsI_#Ev5L~X$;pg9KKB2uE zB|C*Z;4;JXe8+mXqdvN$&FvM#Hv60$hK2P!i1}>`zEkvgu1}VevGx<^RD*veS&Rb zmj8}x<*QHo@!Q28*x8Oc=Wz^%e&|_#4LhF3Q{2w%-ew}^Q7HCXxd%= zLP^h%`L7VUR~HctH*=UVMtuE~Oarzw)gTeIX?Mj7fE5(`%nJI+Ch-S&w}m|5o!_@7U)%1u(y$4I;_N ziPENkf{=Ct#jl>sGaA$AFU3QmU5y=C2U`KhVAGY62>oKV^}? zS$0H^*I%jH+a2L^qK| zL#-ixjC*lyOq3yh|3G)Li;q*>NaP&EHPwUT%Kt#sX}79E0FG$JV^f?X(xJn^c={-v zLNQt~hneMgfIL(pemO9bbLAwW89U#fuwWHen)g}+%5-tCM*u#GFCOVM215F$J zo!zOPJ3T+h+mZiY-j7bsiW0ApB>XfBfHp(2|V--g(# zU}=A$OmSs*r&x^fPoq|+iTz6hHG5YXXY-EcB)kgTD{=<~+(h`UPovL6qpUK5EDN4K za3lw7ERO~@CcDs82LwI86Dvuz1`!$bAbMeBKk|EELHoA5%Ygm~Gv}dJ(G%#2jX&uU zD~=5xpNAQIbmh2+^~d-JI-AGuZ$l5bb=cD*%c?P$Y)mJM%(POAa$T~#h&i$N2THtl z;8ITk=pfJMaM*vVo1EInnOCxid%3$vw?A)U5N+LglWFB&kcuwEFDOW%u{HdICfuR- zCT%Py+ydCyo^=sBF~052Ck>X8kX$1L==`E84S_hUXg!FbAS4hM1;hgLm0gv4mvZM`Zr83^|SCJapR@cI4C+O z_-XD3s5ULe=q5D$y)s0yMVhmoG=2U|+HDW+wK-h?nY*ph9oXxX)m=nzh&iPw@qW)M zJyB<4``0rPRuj)_>dR)-lSlZ*_TA6N%{EW;71;SuLW@E3O=8^^`wEiXlUH0)#_P>w z3Y%Yqu+fJ&7653w!Zm~%W3VA8?kmNDXbMZ0Y)@!Mf})?d4X?LsLP6Ux_q{;0xfoE) zj|WRfeQ)0=r@8BJDRs3{+}J9Jsf_cZS=$bLyCAnUaP8F{UY0W>)y%m%0#f@Ac%J=fDmx{ULV zk{y>+N{ai+HVBuwyF6u!^(R9%2vh&8HdSPe=IUzl?X55i9o#OBW=_bKymQkjt!wEE z^tm&PY}L{~3vv9-EeyEb6LQ=K<*?nVF61{q;OdxSIRM&-Komj4^o0>dAqf4gI|AaX z<^)z5)ja$+;q8EF{I_ueQn&bMr<~>rL1eb8_H&v`xdNe0b`8!qT z)stpgQa5DD5zd!Z51(nLncohNk)bzV&~+o>Q<97J;BcE31^l(Btl)x@u zqx}3b)N?Ed)ZUIEF6kNj&D9ci%pj7G{={oISh4oM2j@9nRJ_HHed9n4GM+I{PJI-K z)xvLCfS9gMqr{KN%OFt)P@Mzs*O`!&#A@y#`0~566HHb_drW*OaU}6{J&v zU?VX<-24&|l20u{6?AyYW2!N%1Pq11u{GnwMJlN}?;i*b9207}uGcS}zI>Hv-0VA* zY&2QH=+bj~x@4w9@6UE-3-vl7*&Zwh>v+{?YYlrk5H!F<3QtV!@-kGI^H-WZe%6eR za{3+bH}i&~Lt80z@U*<Ne8pasF>kVf^&LR!a58R`6_aTAu5B2>79yG8LR$ z5qLOJGXY^Iyri~(oamZ^5PtxnS?l2a&9b;x_Tc@~i!0-$7DxcGRP#B>_l&eW>vOEo z3d(>_k|~q{Vu`;6tu1nZjn`{gk;U=v$wJ z2GZs(k0^9|E@>~cFW=P69c?Vxu(tR_R{0LrQD(}m%3U5osuLc4f;XlN68%JN^nnky zxEf{vaASCgwlY)*biJ=%E<-Ml2*CD!Vm=uvq_YMO=h$`tuK)fn5f-3A&_-5&O`rvM zsPM+^Df+%b^kTEEJUguh!Hp%L#jwAG1xzB%X4A07fMQ-2u5)n-J18w1j70fTcldVO zK#(^zBljyyIWbs&D+f|SCD`S;4RkjWI6H%wXMlJhNbi{$fDOak6sL7QUt`OA@`s ztUDIP?8!!bb`L}#Lmv)pzKcC5P!jm6Y@yVSXXEhdns|EJ;O=OJeLet-?91A%lc=P~ANE^oDFc`_HMg z-!<9LVp54RT%h?BYwvsGF^lJI^EO+cw&BLu=T6srVM|k@he+5du?d{pDu`0piDY#% zAz}}i99;>G+7UBq2jq*Usc?+;TNLAEGKo$E+U~gFiV9#_1N=>m?t-jD{;^+gb&dq} zt;TL!l#hgC6z^^8)Q%{^>%IQUr;h~jX};g_T1fz?W3*{N60A8rrteOH#+658-}Pm8 zE*e1a2QM}vSYD}jRajNH9+QKMI4{@6Ceuqa_7|k%Q1)22B>?M)pVR481KsO zFqC{bUwaW+TpizRc#yFd9dUiO<|3_ZCExTwe+TWoGxAU(i&CECfHqo8eYn0{Q7Ds7 zG9tqI?SZRVLq!NK8KRi@ z^OVRv&{@;?j%bFLhaFZR&=QJOwVVjKVjTja;{YYp&=?1~$!RUB9na9~i&dh5eSf=% zbqfq>hoe?heC_lIK^5_2v5s#>^%|xUDp|5#qNsrKfjUkg;^|vaQ#O(VWYSk&IPbRr z0U`9yNLfTU0O;<2Y|dDv@RXCwoQ0dUHX!PRAInFiZ_Sl54G54{O>eT-q9X&cM$Ld1 zZR$BJoZS9EcofcSID5(F?-5xKE28vw|GiAaQ3?Bv!u^V1+X#OHPTF*d#v^w`O+%6Z zwDtwWyV1nHA@?UIy*VzF=;0!I62*zE_XI^6yx)`d(jk_5BzoLHJ*!$?HfR}rCHW8J z+3`?%?VyZ0b-VmO)@Pj#2GUq)8_da{=n~&m`%-Z96VMugIoH)(9?8!Rfg#&dC;;8a zNw;EuN%i=AP3Z8+7gWrA>U$r4;O7&uuVpBVP*@4e0KL40Iq5(8#I59G!^Wy32n^ap zS>2m%uBm1ACFpoHJ8-6hOCcn6WK0$tQPKuOHW-|bmt_9X;< zwzyQI1!UW8q^()Yeh~DnD3}!x!FQjpMC~OR&IXMFEaxKmk^t9#AaL`}OcT*o>hS0! z=M`9OPraSr@Vg?s8sMtXI`jgDk*rSC7pT#M{eFqtQ_IZfXI%k!G~_IJk>4E~)kCQp z_Nwk08#R!`d>>m$AWZ%U5Vw^~vuto6(t5)Ln>Zp1jninlyn9v4mRg76+<8RKi$G!J z<{fdRo_?xe+31c{R`0w~pSd6H{|>xxx-hW59DUTmvI{^aBGvO4R`nOVpqzV8IV@cB zU5=iDHi~KC@07`Q!+VZbG>#hpx>abHapA4d{g)n9*8^0nB!}s&VJ-X3=2IgfD664H zNS)y$F1*v{&f)9d%eD^zjW^`16sz?&r;)Dw)p!Tv0UyRhe*r1;SN{oap{+hf4q1VR{;S1lRJj`MH{P zZ&yAjJw$)y-Q1hFi4>DT1kZkl3Up z00ZVUVav-CFO-0bRf1?=J)$6TdRD&Il)`O$HnuLqg!E_OtFY|dLt@=qox^3lMk;}# z=eVrRPOWXP=|!SVfswX{E5X_=rA2PuEL&PIFPnbwA9zWRpWJSZ>)kgAScmh0R)gz- zd@2-><18NdJv;SE;#5A#Sk+dq33;NiB;_s~x->h5*m|Z{;PcE;TIjAqBf+?NBPj32_24z^!5uxJ$CVcFt%g`> z;WOKV72(-~7p#lTQ{h0YKY;z9d@1#iFglFo+18v_%-$FPL-N)ZC<4%xF5TQzHqvcH z)Ws!jWoK%K=@bzP{=Yp)z^ye;rM-70tHNXh(>DN7ycjm^|0)Fj1^7CUE&>KhITEu2 zY2=ZfLR)Ct@AI_NYICfC0TDf<1y+cs!*4Wfzan2{lX8~;9tYp%pMlp6S_Wt}WnDh4 zte`jZCRRfMiS1?wz#U3tm+2$+Avf5wIshsbTIiD*m}?R{C6XcCQpIVEe;k$|lP?;s zu~=#vPghi2p#Y4;f30w#f%%GcF$~f;tv+(rdD3F$=jnj-75JW+e~%vSKg|+~;(ScO z1{~r^hIsysu(Hm%ZNw3L&9SPMy(uE7d*sS<{bxJM$ydzI92&egSu$!Mr0z@*VjwOk z2B(v$IuQLYpzy)K^_(Vxa1a9}-^$Uv)d|C`m0t0rpno6Je8R7+nbebPU)d;4gp}j* z@t}>YY;@0cqkH()+qIRkg=ln-(b287fYD9luk8>zu0jYB>n%ns61zZGGt7c5*OFTO zht?4z8{(U>4LGF{j@k*s8KO$6Ld8=c4WaQ+GF2#9wc&N72+;nh_pdqfOkuz8rP>V0 zI&3`N^F1oKrUL$|XX<0?wn0k|ub@Zbb+FdgJ4%l{ragcSS2t7RI&T2KGa7$H*+)M+ zzyYssEHUL}2*dBoe49|fQ6BnpL0X&FFI!+4jwO2hB3TY)*l~9VObY;Zk7++(f9c&7 z&-z@o&#gP6jSz578fnh{Qnk7tK61KEM;Uu{se45M7t77#RM+uTH|c;h-^-R3PX``B zG3f<;`Jyp?Lpj$KuHJN^et7l`@XwaiJJA;oqOI`CUr%SwaMrp>Qe13jqYwb#rH%(o zDS29A`cXt;5z>Bmn|+S?SohcNGjDu20n2;!I+g_AxZiY0Tj~#$XLMYO^a@Sx#jdYT;y&++FsdS! z&GSyl++lDs@01YnYv@P$LjA9OoXPldo639`!R$)ecQ~YTNX-Z+jLDvGIXko%PaAvM zEh${IS#BmRL{EIKN3=o3Z$`w8xXJqJM2=(^7T4e2-x>nVcYrz-LnK9eh~{z)94e(Y zQt<+wZw&B!V0S=Sq(r09ow|)`hk%z&I&BBSnkGQFRVH`19O>-o@(IwIxC@2=@o?Xm zDoX<2b09dmX8=gxhU!;1AG}^_a3@%4^pkYxalH#{@?h&Z0ph%(Qs6gWuC3Ng2-6ZE zXPiAhSq{B*F;oRNWdgB}00AIJkl?T08u-*R9QSK3SHNI5LlsU%bpl|LW>Uv*K4mIiT-RUhu}nBly^EKc zwlCmm^P(a!M54QHxp445)sHE;i#Ks|(mGi(an3H@v4HRdXf=67**B5e1*p7Jx?d;= zIcuc%(KsQnFOKOrU17J6s)IjeDq*@Vz3ou@Jr17J8s<$f0s|?D;4;s(BkSm;V5qX8 zqA!P*$)hqI-p<7;YX827lex&eWc!8y-Q$!Vmf*;Y*V~`%7(t2CB)Iqtpf{O;=pe)| zAcn%`Ac!P_s@^zCm<+BcNRBA9 z_jRNRj1OA?JlewlTpvS(Viq>i@5V@U!lYyk-N1arB)#1=6w^_}V=ay7Wc_5sZ*ap~ zdX>QXwz2p*RfZ5fc@3qvuM8Cu`3o?E?Wi1)=C^In zR;V?-a+mRc&5&8|?wZL}17`3SXcDM3PNGhox6lTJoga}c++DNkbMLXwH1G_CCIDU% zI=9i*;E<0U1%KEhV6M5*YOub#JYsL7%zk|MLT$ILOu62?r0?@BWpT>TZ?zEp7<%uM zqyuP>C9O;AU$X9{wMPLI^!1j@(<62t#}zW4yFfd;{Uxw|fWfAl@{>&J+3Hl*-RTh} z31F{U%D^)~05AMC(dIt$y5D&w)mR#QYo2Mnt->|ouAOx94r{SAKWW#UL@ zyatdKN9t;1=aWSyP~z`4V+$w>WCCgx>VKq5@&laAl=r+W?}T_ePVYvSWZPVD``t$F z^PSDzs|GPD(b^g%jA~_aC4t3dKx+7a(=%uOK_H4EbN(4q6tO%Pr5i0-RxB52iGlD% z)j-_c?L!#GK+^HXg67zWe?(Tq2OF>a!pc{>$}II*kYrlIX&~$qg}#+S)KeAvO~b41 z%~iQ^g0qF-UYO2TQ@!t{9hJ<{o=N(bS4(W~?}l1pQLK_GsR0U(q1{yD5omf}ZU38u z`!CL1u<0T|cv-9{p*pj^EELwh!<+fswjBE3ne)p(*296(R4n?arCn#;9|k;_59>x~ zxV1_<&U%_aha4iy5t;vucX?X`d2?&L^&L2`XBe~60aiN`dY6)xO%;2AHIChXn^mjc zU}(FF$WuPMJ8e^VhdXLWLuR^aXx~EixQ>0+Hg;vec9a&AQ3=V6wNj@Js*cl8q&SwB z30UhH_QQVBnsDgbEwn6LL;Wk+o7LX82^~PiZu>x#*ZP#0ca&}9^6*0&U|C%iMZ2qQ z1&6yvNlHDVfb-^FIBP>>v)K`X(VtL14DJY!rbjRd?fK7cf%UR_+0F4wD`{b3E=8 z0+bfDv`^2MK&}0sOQD*mkFQQ%T|5x6b+C>mnG9WZm;3`6JzxCL%kcldi2~Q|TofQ3 zb1np9KB3-f{rbNT3viaAuYiY4$D9O+>LyD_jQtG&?k6vpCniL& zgfqn4VY@z4R~I&fPi?ANdWO80g4=mOh409gBn`Eu6j0h4`C1ns?Vi3o ztpO-wEG$01t1HAPn}#$o;}?5D(R2q$WgpLI0HV~iK#=V6eWBJbjvpn@cAqf~)&42^ zP^bw!NZHc6Alx!SWj((ur$9MfbpYIS_4%eQZh#Ip(+WEba~r#c<(_6osK`P`dd&TB z=V)@V@}gOAOWz{F3P|gmgcvQX<72WkRCFRoU~H;O!Nu%NR55DX2zN<3i`OU);P)IXE(2W^~W0>J>RqW?`k3Mi5=Jt2%_j54f5^C9q}k6ktCuj91WtN zjvp$BpZh_?dYOz&9Ht-)5;PSKGZ1pe4+9)xE}YEI1E3dpZ$O_1(D5;zN0=de;xJ`J z5$!aU`GZSBoui*~)U2f8wjg}m{rBT);`$E>Ca#Gx+M!_dU{EM}AU^nIpo$4jIWl5w zJSG@K@C_)Kpn%jsjOd`?H!5@G9NcKVEEpK@_Ku+6u;%Y!b0draq;U82C^q79v9Gz6 zAdDbM5C~(c_Uui2z7i4U@ay3Az-n4DP*7@6CrqIm0P9an@#>aKZ`=B#;FL77LS1mi1aGkisychaz)d*fEXu1cC5@g(qHp zHpYMlbw+}4@>SYbM2*FHk(9oUw|pZ;qJO1>DJ?gKA!><$@KZ6NeK(L8aZCm6l_HyxGkqOX?LEI7xBtT|BVu@5pL{MYFAo;CL%n`x9p{KMFf*s`~5Phe|`5EMz zC>AJ+kAjrl!J~8Ns5GToPocrdoVwyCl`v7(VI9i^4j(4U1(t|%o*vGiX9gHklDX7L zxhyjT#VtbVs2Fzig}c5=^=oB3wRF@@uQ#o_TRjdbQowOC4bJMao!R+UUXC)+wBT2N z-4_iQuJH((_gyEsmDS~8f#XkQq7(4&zept4YA1! zvs|qs_r}NjOlt zEzC>j9Ut9aakls#ZGOV4fZ zzWgx|T*F3g95yaiwX9yCsB1R*MKW;|Usbm1)6SHq4HQZmuI3pnJeU0I-uuI#t@mrm zpWtwXB;qG)1vj-_B^WoX?S&!OtP4&YLeiKM4?HT z>S#2B`fS<2x(na?!*GSrcM#jBgC+&apTv|LtO-NQS2ZH`fbMUAIIGCxa(2=`P-Iwb zeWY0Th#|kYsS2Ny6eD=aXp%)){gXDWt{tB7?|rsW_K6iRh1yS@ijvp3%%eCorw zeu9e(|^AacZw?&3NsORiccZUM``8$V<_)YK7iL~`*A$Rg+ z>uxKWXG?j91ZM)B1PADREy>rP~i{cN=DyZ3o|_3MF^YvC1$rewb*V zy~<{ENr;|jGR#S~OxmTkYMknllyzrVpP1?Y%|^IXPsvTaT6r)S4q!cnlSd=ByWD?_ zbJ>Yl=INM;Nbj26$)vX4fq!Dsn?;XRTNLM+gcUiim!;X4YLtLE?nOQ>2v2?D+{&?r zp-4Mz|1rG$BOoLw0!UiBt8s78*@@VZ8h4ix-qyNN*5>3{i3iin-K#!cTLS`BUTEFD zv@=z|26tQ~LRm<;%zvh_p?)l$uQ^s_p{`#gOiIXoPg_PZCX-~TDqezt!=U?}Hwais zD8Tf>KhN0FhOfvUdV9cGVd+O@InFjuP-)A_?#!pb6#k)ny}8MTc-VzaC;6QFd)VGN z>5Ph`f{heKiuHHh@gBv-(mPnyo#wbztWB)7oNcO5`VL32mfB$-xuF%^P=aNp@^zl# zcTL?cRkI7+0FRl|cO`m*OyL@wcOM<;QmwE3Cr2kpvC-rZwnGaNb&sYrid zu)aQiH-!kI(GmDK3N@nn-Rnt^ z-Wf*9k<=P(JJtU1!4EcRh-xX;5$b!scXpqd_SN(3v_n{RlKlu%YUk_-n}o6zoEm;u z7fx!uE6+;HW+lj_YXVog?z(KzLXjK!v_$wac(l~^Ia5rCGw$>MTwN|V{-Kf8*_!*C z$2R;mk22T75buzB=`KqqM!WKy|{gX!vvOX z$P#HW*;UQ}Qdn5`Xb7AW!MYy}CNF7)YU(5xO~575cRUz@R_ok-P_295{*qIET#1)_ zG~BjFCd-g%X%rQ4x>+eTCpm`2_US?Bk<50y(p7MWl}khOS51xaR2iRvCoX??mwkLu zSlHqvri6kEdv2xfdy}z=(yA@xI5NZ93l5n7wOk6cs#*|A#3dP}5bdg381M2HY`}1$ z>m##h_DI=w7OQKK)RePj8G50>#d&BhS9{B9QRx@jLKv9;t<)KH0?!+e1t`aNMLS6ykEj2Rqo2b^pxwH!CTzTkP`Wx_=T z_o7q9WWs7E{_d-)^xQ&D?&Luy;z%LCSGlJB3Bo-#s@^sEDdV3`#b!{=DrZfqEdL}5 zpyoQ~x43ULP05Eyk7$&Am?q;Tf^k!7rznhu`5A=QTH3It3u#$7jV2UvRrm2zvi(Xj zP2wjmg&e6Hw(jkD71NcQIrR{-#J%qeJqI#8&2hn&eaau@i|>6?DdR${FMaav=n^y^ zxA?_`s8E9D54ci700i>80lq0+=F0D1HPckx(rqiOT{r<@h?nm(icao$a^IWB#j)-( zy2RhA?9nnYiAx4Wx~CDbjhiLy&}iylLx?l;n*zGe+p^B5y)eyB>GpupPl|De7ZB^| z&$WxRka%wLI-l zamC-znE{URKiL})ng!MiI>#XD_V(em&j`LU$9#kgM*_Qk6`x-yj6@bGOAThRa&Hzc zs!a|6D!f@Oe(C9e{zuS_BZL+dSQ;59 zZrY$a9R5QL?(@26qS~xVvlYsHRteWmlbcO;GRKU2*T+VW;aG3bTWDi!g4x}D5|}xV z$?#cJBN+6JE7LkqjNk_opd|sYny0fuJ5Aq;YJhS9Fd$+OI<6%$C1T*0|2L@+kYAN* zA*Bh7JnK}DUwqU}l39n%5#@FZE^Pg2O<=rzg1TW9?~gbw z()b$If~p$}1=5xoVX%sMNz6PcTmySYF7I>m&@OO(71 z79Qm%lL+6dU)RW)^E_0|kj~7}Orx-^9Dz)1%7;5EGn9day^XKuQVvfCG$#ei&F=|P zn8Dd3j_av&QP|1*J9#^$c!xN}-TSEG-mc5G+)yv5FYiKu?6`A$GLAU8YfBBp^}Tpr z&Lv&(Bb_d%U_CsXuLRF->i(lQzXp|AO1PQ}KHJ0M4BR8lG8bO4-ud1pW_qx7r%ozHS-NU4PugJaRW3z>;nL-Aex?+|lNwu+B|=6az7*z%(NNy2kegO^6d zx_e%w0}As$EyTIht>5nzx=!{Uvw0_^Y8q3SS(X3EU>={q-*rdr8~Lhct77XaTqn`z zFp=oSrGO(YpBl}OU_e5%JrkW_T|JyfSZc?gcC7uY+xctM2D zE%D?OZKc~x*bL6f_iS*0Fg}0)**a0Tok9HJw{}V9@$0J65We!p^TqE{JAC=C+ii{baOk-WO*h$a2uk=1{IImk3T z+6Hi>q?&a5TD|q8g#S%LTtm6q@m->zOm0vh$W;R27YZT~PP-jG2-6H1K;~uwi=sWN zod<#te)AENbgGgyhLEIEw|8;8T?Rxz$?08*Ienhes>`B|pEfY_0eY zME4rX3ZT#*as&Q$dW22)vI6Xqra|xB1?O8EjeW&hn`q+*=bY>{7d}0)8gHizQV3jCN{S(l!YCQpAo8=j<)*)97`0FZO=e7NZH`L30Rj+pN^0r(=6h0NS ziG2d?L*}T@R_W4Q%$BaotxiY;0-W$aZwH<=viE*B;_9TwhAQR)ajlkd|6kK<&k|KluC~$Kg`)Jh}mVM=`qoNU3S|3xgsJrAv_gK zL~I8F*;OuE#jlQH@A-&We-7K_JABE@WOGeDz@)e1snVjE(qrIr<>U9$FIuC-wSae= zRhy9#Mtazi8a`Zd=jBojcM+trSPKWo$SD7+p_P6+7{cr91lIG!qiP;Cl(l+EnP2Mu zQAsa}uvxaJbP?`31fiqB8<-v1#I_L|_Rq77Lm}7d^K++Ur^)USn%^!=dQn@PI`(Th z%mUI>+-Y8y8=<4dw32-3aEL+K>%2r&-Q`X{x+`z{;X8T=no+jmIExad`!ustiGrq+ z<$xxub@$0A1X#o=3mn$tEM&*{fx*=_nX_1ufF|!Ai-OELWb^|)K2CSxsXU&3<0L`8 zPuNnWJaUw#`-Gi{?Lw8E%xTx}0kR>iVG@FLGRS3-!B2ydYquglHo=PI3~Y%Z2`}$E ztAL63KnW1`sDz2Y^%COTN8TULQIu2{yT4E!5}9HCMZK~%chGV0F`qbt4Su~>)>^pK z-QBy>m1a&SD1^yFZ3}(NJ0ZG06W0BIn)=SLCYq@2fWU+F5_*v$5Wt`$7r7!KfRb-L;r%JeRs4!5T*uzgy%=I1+q88@W`Y>_EV{C&@5%4S+wQ_&; zZRMZx@{=c-(2->8^UBC}WPhdW!5~uHwRgI}uL#F)JkA!h_2<*?`Q!lveKdCDITCui z_Wd0G^u?#4Db5DlWVsqTTYfK6>`oV6?x4l_om`mJ*Il2Gnw~zS-UY729yM)a?zM66QNds8o>vE%ni>~3b^irL(y|3~))cv9My@w)s+XZG z4)_s-d-qVKSxV5^AH$qX0{ z1CvrD09-0w3G9AVUl~o;gIZ3(wLoKW& z^!GgrqWlXsp)t+FYM9wIzx9^OgM;U=%cQ5E&u{l&dvLJ% zR&*t2eM|)wyTPjK%xc}CV@DB$0Wf_E*?M3}e5e_SJeYo+S{Mu}y_E+tjI))9;UqMH zDL@n!{6nU zzTNE56!!>eXitcJ8+PZSI$S`m&4nBzs`L`C+R5skEi)`o>0&H(cWAb(qNhSGX?XG~ z&cxnwZ>f1)>2Q0H`Dzs^yNF@W4VeZ33vMd#qo8-2(V_TOYjMpO_m?=SX7A?Fu$sV+ z3GKsh*5M=)LsHojhyZW-f;$5`U8-87d@K%|xG{j7fTuW^Drx6O@x*AD5>?yUVWaL7 z<_Bq(__1N-LJvfG~-`hpH2njLo%O_RYfvlUpCjgm3rv3OO0zfKivz?oD(=t_Y^}G6QnxR4?8HL_!tZgwB(7c;1k!! zI1SRrx2{y*GfTWxT$wzn)+TItQp-E{IqaJDID?b9Bu_5(me$9|9=r69ih`Uhpv-0U z&E=#XHPvvu#!gK<*SfctXHuW+-AJU9($MHxTfn;#eio&-MdS$=S3!ZYAP{XSc^TC- zMjWgWaj+1IcO2L5vA{oO7|c8*2fnpGJ7Jj0Kbhd)l4kT1CG z607H#SzRo6^cdG0>*C^i1E%Xamo!-sxTJO_N^7{?KAQNJJ?Utdu9-pWDKneYhQ=3Y zkG@bm6=nODp+U;ksF(`c3MQ)R>OSfRIbBo{F|yRcb|4B3R&T0%u+l_2V6Idf4~$aH z?%`D*JWu1Qk27mgliC)0;(q#fsVXBi+h%7vrg~KZt8bjf{xQeB)bbvl9x5c~G9fBm z_Ln`tz9BoP#O+?&w>;QdSsrhloQcAugpQ{l5L&hE57s&nA6d_4@gb2IF7Nb*GCyi& z4yV*G+Kx3iKB8P1roCozuC+v!z24}+gAwUURth;*$SW2aiUU&K_kLrWhlzlzSt7%e zCTXUmT^G&R_`8&Ji_e@bSB9@N)|qZ0;(?Fh2%^KhEMO3WE`Y&Bp$N#d+X4{F>NZ)^FWw7W4Mm72;#*c zKLteSE&8XdcL+HPRh6fqoqd2Bkgt-Qf7&SrOmfN@3v<)IzI4mF?NH|3;BF$ioZ zP|*Tpr#1o#nY{(ylZ;%{)abU+_eRf@`5z3Y(DGVZbrycTG&^B>C)mME2M|>ok#e|i z{JMUOP)YoD0_ChxLRfaX6>d`6xW|^ypOk;kPVwXY#WaY;i(r%=9(W+Nr?#R~vWobz zrV3DFOJv$b`wU?uaOo^Bk07ExGJaR7KiG3*Fx@+|VnfdZ4G|6NJgHgV<&)#|(E>mh zoOR`|28Lk@en%_KbC{bpE%hgVCgjShfN9d~pur)EU`q<7N1mOEh@!(i9FwskRs7P&!2scd%2m!3FO zG1Vh#2-@rM=iRer*_io*VZ`&R=X&ZkNaGfIuc`z29v7!SDpzpj`?ddq2nLUPuIv~Q zF`uq%^!>`+Kh38lW|#4#y29e4bdOu3#?b?b*2Zkwnzc#LeS3o&>dK-&wpW zztlhd4&kGw=TUc`^!qd;x9v_>3p}2mwIBNU$e%k|Y?WDtz*Pm+xj`%U}Cj-4KQhjPC*$d5)^wsrxY$XTb) zz9dhtmc(@|Y?}F*>SzgSzc|^8SGQ!pko06U+W5Q$d&sY{WZ_`aI)=QSH>y~0aO0JP z4t+mdOXa~&gO84&1_~aV>BY4($0zZ=vX7RgvK9mJdWNB$v{(fiMp3A-lv&6vz^=AE90m}y-J0B0X9V@NRh^Xi3 zZn^9P@Q!OwD_bXTeNFF~(xk(-`Xo#^jRH z+6&;JB*vHU=aPpSO&-l>cW(Lo!)JpCgSi!+2WE$|Udw#=_8%?6XZ4yD|})W7Tl`mej+@jGguS zvHQDx)Gyxi=2Bf;t5bPhn$0khejHS(X!Odz7MD*nG~OwJSLj5HiJ_Ns8>;H(eB?&> zU#q}o^pO_)Of{WV4{~01Le=PXihZ*w<8FQJ*Ry=sVIhK1MZHJO`sCqE_Z+er_A3TN z0)JP1-rToG=})#pcQ$#kN^bg!$;!B>mSUX@?FX+d+t_v+U{X@6o)`&!WAV=`zRPaK z`*VpNnoAh^H6O2x}dV)xJF+IW<%fFkh$8QWN3-#L? zMfs_ll9Dti0$@`h&`SUre8($|xSV5EW>Ril@LL)KwQn#z(HrHfSSrt^kLL=kP9*wa zdl6&7%%KKn;z@;{f_?}21Zb{3w^M-MWiCX|iJujCm|%j9C6K&#*8^EOQpH>%vXqFS zW%P2t!!tc(ZhaW_a&m8$_WqKjS|sfJAkmpPq~8ejV0^F=a`9*`BX-0eExq|gCF*9o zTg}UsJ-Ry>3T6@q5z{c5 z={W7(x0Q(J4~LH|Wk0oaJgVaJYwxgE^j>NYeQ$RxlT|_f(o|mAP6@TLxMy zRKHM6FT^(9!4jC{JP-9sczP!l2NPz!{CJe2F@p^3S6e-rKM!8$U=|)8q|6G$zn6K~ zdK=$w#?j>(e|1H&JfpITqp)ui(?@o3J~`LY?)59#-IpDDVi{2N)v%m!{na#n%b;;* zI8w>D)=xs&`s9<1yv1OyFII+{E}XZ@1QX&9X>{-RQ7#J_gQ|(0n0oJavP*G+Nj@2; z4rZNBq4(TT=}ga>#!6s{W=H{5u=)C2*;}!hpKXZ5ik3CWJsk)@j)u(?~cHu{jja0m~)070O?cwl1=UjQQ?V4iY$_ zGuE@mu-Q7;dBjVtdyQT?u#i{FO=A3l$#ZCxpC!`lb*O~{*+Hnr^3a3uP+J9Y@0 zD`nXgxp-uwV}nC#@!4!;7C_D5d{CepEV2~>D2X`z`Ox^->0ItK!zyLIM(Xm*%1m#6 ziL6k2f*G_S{szh&+4O(F0yJ>?PF7D$5j1$-xJ zD8Vs(n65z#dH zEm}K5nUWVxtL7`n;d>*_q(!;-=TCb5u`ma7zJPwZI<%U^_#i?uYc5naUV_2OIB903 z`8;qfZ#pma;N+0pY)gD-?ZY1|@&xi*yd&%;=Sb@nMKuq6-ujZB8X`YXiJPahE|Cz9 zoO215N}7DqJ=V&<%rE{vyMep=VYaZ7dYGO}R{^hosXf)@eYOY#5$6 z1FM~h)Y8I$ekKUQ8lZIz#KHlFzbAu@UI>2;6LKGTltRfTUt5l+}p)5ZNiaX&JBCvH+ zS=@Cv4yHry9>~S;z|4W#A^<&hDWEauU`ko3QDOTG$)F)e$*;xoMQGI7!XCl9 zc&m6WzR_-b(Iq9wZ}09`^G|&q?m52tjSlB&v)i4=>!TY9 zO;`WOjlWA(pZ9ol)nR0>`3;+ltAA=UZ`bmlq0Ar65yJautBc)|Y<|Hu4Lc|14I9vwuvhOGz}j|J7FJS9|@}LZBsVU5D&D`L`BrJJ`qnX*C9rpiUU0WB~cEA6h$<`ywfb;#Yeb4hw7e4}aty+u8PX1rr z^n0fbe^p0`*n9$ZtEY>nKh}XK5;p$VV(F93`!@?mZ+Ja6wHA)*zBfOXQcw*7j=>@~ zKK}{~<_l2;ZszNmN(0a?tUG9@=kgf}0!^W63NM%ReE+xQ?zVTWq&99oy0&sVO3-HA zXrn8kU@x;Pj9lERy!~)E`I3J_D}F!1@?y9n7w8){AIZmgN2IcdCLbMQ(dhN{ z2M523Tk96Sv^&Y}T=Q<#S1IyrY1&gQe~tfTL%P3l8qJaN%0QyLN#dd~Ri?qSZprwp zw34A$E69mVZL z`*SM*(i9r7lno1uISOQPqZSiH*(BQfT8j=V!qtF5vcX9Gr*F33YTmuMe zAZ`F?WB5$|2K)vJ#Zb-}YWpp5Q>k9P%e%1IUjWK}N!(>@%z%N_Fj?%yyAJb0_pyV?=V#Bgza4u* zEM_NiB;hz9hzRw1;Av^hoY!1}KjiPIqSv17I7bIp?4I(YUusbev14f0ECcXSuT@eD zQW$NQ7W(|r{WuYqa3Ak=IkyS#>e_*4L+`S5vM&`NxH(-!P=S}>iR9*VRDmbD##ABu zzL!JFEDmbSd(pA@(UYh@X&vrv5T}?NZDiyXrld{BS%ia>R(R(gLedG zdk;=GoY`!7w9~xMX*GXP_2@LpwlNWY3Jh(5Q%lb?+a|z&EsujPU%3n~PJ9@5=eIn~Iy%f^--5tv?B2yvzcJ2GdR28}Zq4B=9 zP9rw&Ul2WeNu}HeD|+;YwoALG_#Jw=TqzFl?t~U!a_y}0t`XT~TA`lZv*CJfz(jxf zPRMM=IILgd_K;(;3E|$mI{5YycL@oNUQ4E?&*QelQ%lEq)ZjKWNd$KPc>XK8A$alQ z#Ne5(cbhLpaRheU942GV%BrRv6E74!uVctn#rZtcJN2ClAdm&eGP? zSG5ae<;b6RjRa0e;w#V*ezay%3e&EJDRnNDg=jpj6@c~@D^SjfpW>*hG5Hlw0N3HK z0iJH;m6`Lp5Q3!gZ6N==lPwufxT$5rn494eF(&-ni9Jb8f8Ld7#~VK>uIRTy%4Tw% zowktZ=f8n;#_*&$eBQGd!3CyvknG42U>OPRI*XS1GQT+p*c#15>&R7QF?n%QoLS3{ z_@IjsIMbEho1isXEr>0UMV_yQFwBEkJ|Ie!!}tHuL! z4%A~WvjzMU#I!RebMy1OtKs+kZ(8mXa6cf>1%MZW*3m9&c8olV?};4Eb6geXuKIU_ z2=)T6gW-SJ+kUHAib~dIiWqpM9Lv0{HoRzIDfsUHO_8BkS6ok=OxcN9p)G&qXig2{ zrlRl)ltBo$Sa+2!;pI>5s(G!)-pR_mmk>4k<_93>FsU->7@m`DT@=jpn(PKZHOZq>9 zCZD}86rtxI%=!f@V4dF`cGE}Ph&m!t^@5NAKU`aSn}Id=u4NQSq}jIXp~`H1A6d15 z7@0Go!Z{4*tiNv6lYkyC6FGTsd6L|-Hgx2Q<&S*X8Z@*=MDBUSYvb#fJiV-&**#0B z_u#BHd^SxLwr2V92^kN^91~q@kvw9=`lnWaI>dwArhh>jdZN!3MO-tLc%E~_x@Hv% zs&e>R5C*S0aFBsQwF~@d16J=p)qnS7oN71Y9##!mQIonJ=lXuZI?ZkmMgI%xTi|gk%8nr&ngyrp~JUa(-sw60BboCK2zp zNMC)|z4P8M8@(RkJ^e|hp=tQS+~W^7usAwg{Kk)q{X@&Hr1@1nnL%+LS)+?V`WG$7 zZ@VD1UsuG%MNfmQgB9b!;13>kX}Chf%%O*FlDB}UWPeasN3xmL%N{Eot6)7N6`fDl zR^WCCr~)%pVZPAv?sEZVzd%pL%(5=U%e|KtwNoh##rQ-rz$jQ;dX9#(Z4xQ*YW>=P+;{zh z(NE`|x~6r*S`9kq9DWINVl^2%z{+U)r{j~aa8^Ob;+#L9CLjMO`5bP*ms(3i?z8*8 z)K3|ve`3j~L0VoYmO*2Nszy)IbiOiILbZ1dM*TWWm_kVbUoPyN?12Oa4D&=j+dOQf z3@RJR7@_YHd2pA(^7T32NoUKTZ?j>FH0%UJg-b=A>hmjcew499x7Z!66^JX4NPPHp z$w%Vq7eLW1 z@PY%Y+@1vwuQBym@N6M*DXw<@N8NA3v7(=eiP?m8^|fQ7TEYSBcXGnNp!wJkwdhZl zQA_YUBUqHRk6X3G$deQfzV1eL+4BhRV>CLuRf2iZPq1jLae4jWo=x$KoGI3&^$Ig< zV2bu!R|Trz!jKPsHNfYbJ=oxqtb?mEh_k-wG;@TMUm(cZZK>yo>89EkB`@SckzW#Y zV;dv4GED~s%btD=n<9n_4ldats@>$W1RMT&%~bEzevP>V6O`$DlJUZx;Q;ZY>Rr$Z zBhK58IItB6msJSy)Z1|zPf?G<>;EWr*tTnwdq5^O*q9n1Uy@?qehrnM(Kb&vAx)!~ z5m}|UYzS7B1j&&GQN z*^lRw7A0)A+JaYS&`RbcRc<-rBCjT&_N$d9W4h_@b|d%$$5!>JSENFlE^$A@i19dl zRiB~i^=4Krj?~+BYd+IPrmuwkv-L>`Pd=3qfwEa|V(-poKb1M|g^Yw={OI=BP!T_R zf*eZ%%hZ(5wCtjD+PuhEa3J1b)LJA^(LlRzOl_qQgX|jD6VWm=&P71V6O`n`*y*YA zh>xC@h)>=|jidD#6f3f?FN{+T`xUtpC8x>*`bqGz#R^xVJSWkp!`^)~__g{P;{Ezs z;T}w)qnj|BE*MtEqv3zL>~(_ z10KN0hg#pF!5`|H?YqyR+Jlhk@_#>%f8MAF7(&I(3tHRX#cv9kb7Sc(D9umPvqs zB?|VMA36Wslt{&Hi`R7=AQ3BV@}8%|Z*CMJ$*$tVk#cl3vw~qSjD9A(Fj_J?z1wtB z80dE+{$+cW*3)_M1Ho3=E#>Sp-&`Ens21T;TV$aS?T?xQG}g-7oKVA&jD3gB2wYj1 zugbq5WC0NfT zZqaCf7(hvyy=-MFx@Liwzlhspfk3rXytG09)|#@KT9ekL*AgPtD13|ck~A2k38Z2& z)CB0SioK1)NrrrLoX)K4Y;2%q_WO zHH2U|Pz+HVL=h}bMftLJKu#I4vRQZR$<44;toWAahy@$5r9mAj-8w zhzOWM8tn-I7JhW8LxrtYX=tfTh3RBLoZbCi8p1vXiEdQRAIxtCP!s7K3^9;Ss(6sp zZX%(-Ei;e;A;l)CO)YXeHoQHS>mCbAa9a~>*4M_)b_qwX&lW=;M~j(Yja{{*;-QR% z(4#>hcz2AUzI-f2Ff>T$nLC9}fOlN=H(D%}<1I7lScZ4!tU|RfffnFlcuQFd_>mBr z5D=YCghqd>Cdy$)mqk!Cz&l3DQsW6!qxw}X0P9qt1htyxnU{jVAQd2eIc}(ogQb*Z zRf8HtO|1c_4OY^+fo^59P*_vq{z)_y4z$zeNnXA5K_Bbp!b0x2gS}n3?r1updCtPc zayh3$q)%Epaq;d3-d3}fGbWCU&Fzx5Io)_68%;ie?A@8vc8l$`fi5~~ zi2iQuDzD2)jPwFoY8|PXL`ze*@RROl8jC-4Pgt)p7EXPqBhM>F`2GT9MFUj6(9bsn zdCRE!k)Zj9(P{xvcE1{EC8Ee-`) z}!qZ_l)1qKuDEoF;JcKVl)=moXlTUx=R$$ghpSK3(4RA{6;p`3@~% zgd$bx5Q@^JdY9*Uzwh3E@8Or-Ju`D==G2`tbC$o~|NaEs(Nfn`2VJ@Z0$l?BK!2w| zY9NZMSFc^YLUHZdwd>a@D5uHAp6Pfa6k?UC>R_D?P?r-UjzvFz&*m!z73jb{=C_hUm_ueslJJm4pB|0L=g;@&U@?bosn>M5OaHjtiq zfepd88PQr#zo)CZ-A-Ech=r^mU`B&KI9hD3jtnWb} zKr)D$Iuvy2l?pjOhz}GB0xth0YO;$v1qd_*ViE_mB>NfqhK~;fK!FPxbvQo=pr!;! zU}V%EFG&AQ)MOVdK_GSz4M;UzM$$&_;j`}cB?(w6SC*C4hpRhVaGX zjKp|qQz`z+Bc>j4uSkhX?kJNiM=FukNlBtp#EyY2zujOl4Q--q&n@0(gu8gk_iqe5 zoeV=_94<9hh$lI>>uFAdsF?n(1?Z9r2&4xB-64Ao)CVMRp~T0JAQce%W%dh|LqmtI za8z(VDtQi4egE+e9XW_Bl){Sa-&&Hr2kOaph5ZUS$5TCk2au?NF1on01HUVvaB@(O z1mYz2*>7kmkJD?c4cN=7ZYBAcahkt#4Jj4vX~7WK9c23{L!FsP`c}-V-cEXr>zS6a z{_h>QKli%(xMCfA-C+~} z%1a?}N3ONJlV>*cXjvZO@H@nO1I-ziOmH#tZ=>hx& zQ%04KLy5rsVu%1tsJZO64*i`a?Vfa=mXl7VZg2IrkCedQN`RITU0MLYT8 zs;;9#C*IZlmTcKXL_d^l*`MJd$h?=&?%O3Vh1?{N_Kox%&XrF&!sE1o+boz?&JS_79z}nq$BugD@ zn`IE89+kv0(u}8n_V8-Z$mxeI?EbUX_P$HF87QgT7rtYAgYE*+_yG{mK}&TB1@Mr^ z1sMT+?lBy~j*H|x|35UC{bv>uI{s^*EC&bHO?&WC%@80|NIW!WzZcuD(jEH8wCWa zWxqN<0q^zl)BYt5c2V`NwJ8gWSJ#5(rpDqBwhte}$o?55i@yW3XecmfKp^@{uane!BADG;8SzHlUXzzQsm5$ol2<)zx~_+R?~n&6pfn9ttsFEkow8QDC_oo! zf7C3cE4;d8s6gJ^3)|*FLRP5vZn)KjaFCcnr2m5WmKtL`Elty+ys*;?mSL`QCzN}F zFL(*1X^o4GedU&xX*Q0~x(?y1Q@M&yT;lI1^Z0Z04sS>R)U=T=POssFU!`}Kr1NNq zYJVO;dByH?*SrUQNwPxwSGus@>ngT9nlV+K8i@g^<17r_QaUlwK@l%bvV3vHjUV>G zHKWoS>4b0T)F*UOLH&`q&5DgwIdEgW2G8lQrp(PAx%Pnl5*y5I2ie~qh?Y8ZiqjD0 znpCVhl4~P#(qg&4 zU%;Lqfh=mwIge&aVSi2PTwSTKW=Hnwj@OiiYHCw)Yvc{@+&%2C#ox`-taU^TMV+KI z#9ccZK9XE(_A}Vw-f%$>eC_QEU2eTCEQA?4?XR>w={XF}nV&@s7FJvtJsF?q+R-a* z8%?E-EAM;V;HYA%NL%-$f-Y~+Dr0ERC~D#$Q%&a+o*0%!d8~`v?j{DRPSVy}d07q% zh!p*~cRZcBba*d2m=&XQ{aQLrR7H1cg1UAx6IW%1*sGs}kJY7)2X}{r@fL6h64Bw> z9b|`^eyNCdy>U|zVtlZz_bu6LPUuh2x7c7-r1-F4pZ>Rr1=gaP9kG4;+dN+0dncK1 z<&p~^dh6d3(57Qm{H6vc58rSUpZ+!I6aD5&fbZ^$BCA$TDGc#B3F6JS6>w=ZR7~ z0O(%ZYorRYdOBM{Yd?tnUb{3saeU>0Jf-EXpN;(x7U09AVXO0X0xn&e8}@LOxM2tY z>~(U&bY|YSgudZf zW(70z44;n(k82a7lEY*Z_qDD?hN`;t1J;1g(Qy%dKiv=w=EnP+K_d{l5 zK90tgKa2C%+*vu`?2;aPhsbrYe5a0OfozGmw8@bCl-OisrOvS%aaA@8n4;89csI%7 zU90#A(vmBOpP2Y3pCA+jRoe(NKs(m0PmCqTV}|DPr`Guz7nYL7J9!1}mGM{RXG%(6 zT^O-$EVO`?%G8=;8U2^`Of`c#3*1aoC6Pg_#fRj4qrW)$yS@G1SyiwhzF2N>d(e{AS#rKW<@NRO)Att#Q)O{t_w2B|2WbzkiPN3PcaGZd%;{7@d9Yy!P`}9^o zY>-rTil}xmrME+wZq1t`KUQg|mtOM^BcC)RU7_&$DEdh=g5REZxAQA&Sd+Kuaol)i zu9h++#<>6S?=uO_Vw{V?#`83P5uUME4>ChO|G1=eD=Y8EG1zh|0HtMAOGK<0I2#sI zOw^Wa>CS=UtUP|6tXTOTr&#a|m(pgsn$*AAO}D*yDwk7MylPnDLz9z9e$pek*15#Y zrffMiFuCRJxaY`FTlSlze}oBa*}|0ij1uySq_$G9Yn26BSu)Ii@I${~BHkzJ%VX2hjSPD|IHNC1t{5@?3leHa< zJd$xnIOBUG1OAaPZ4oQ~!4uO`{msB?#lTNMa}%sEH>G2Nza<6E?e-+wW( z=nCY=@_!%2$Q!5Yc7Ez1D3_tX1gh4T7uS_=U|SX271SE7a>k8!73s>|J72JvCM#k+ z^trdO%q+KqHf3G^3>Nbj6qY0Sk$&2!{+t|IF|4IWbH2k=jGMP6eYHI=At8Ta&y2%N ztgHK-gPT+FhcM<3FLIMOK2+P6$0UT&_L&cMGckz0=ygai6C-zEP!qE*w`-H6@-(vX zdXe{Ha(dtDvS)vBr-45{h-aa$a{KZ(Rtfb_{B)}6QhJvF>;B*Q57_xOfVKKxBIl>P zrfw_h)V(hjq^0hncQEfe$(9)THMlMJ;<-n3+v5-C<|!wFO*wAWWij?cK70cu)5}4B zl;YiW)t^VlD-W7}0~B3daFGYnDX62>Cxhu%%B&<6sLXi$A5x`X z|JJCk$M31$=lOO~HGOf@Og?bhRaxtelfa(KTtUr7x8E85fD>ou$jT$23g(Q^TCLw3 z+(%9+wsm-aU+6?N?kd9diwm8N>8h5OV3pIemL7}EZ4P<1-@LG@*}Q&&bju;|7gElX zGlmuQ7^JEjO+mlGo3t<}e}?dfYNT+yLGF~|o-3}k1O-7-!;=4$rOp2ZAx4U%OL7qn zEfj)a%f|A;Cp)k>v3Q?{sPD*_9kF>CjYu?8LA$e=bc18T>_Ml$udU^*6!lsUM)r}e z_Jpfa$mdl#)(SJVabcvEcAPiwH-M)sIHGxEqQm3<+cGrddWTrKeFbSs(K4vYq9+SY zn)F8$t#q<|+o`W|Hp0oJa4pGJFY%66BkJh4?_~>kpNHGz9aj?!$~H3&#-Y_UIBQ7W z8Z3r+x~@AfHJFIq+WZmNfTS?0Gp9!I;9wS7f)>zLykRy1FLnkg@Z0&OFAf%V4boqHkJW z@O{%v;??ZNNyb17jf?Xs36?gdIfp&SRGg~+qy3q_;EXcPa|-*Q=U==bjy1O1d97?j$^ zn(Aklc=Z}#h#&TwM5T9R#FBmxMr1q(WeH}m!_%-)Ts}%Up_T57*XZ?LmE|*c=#TNP zoEmIzY1f>}N+Dh9Km7r-ISRp+^G!AktLGY&*A(@D!YDK1TnGLBH;JLsIQlm$g||$v ziC4W9y|%+!JhyMvH8-T8sMpwd%Yrl%Ow~>rYC9I1S6OksWr?y)4XCtwS{^VFWaROf zSKa_1G9JT|KJOdm#LP#At~jTqMcO6@eCjOkUWao}b*Cthem;&Mg?qy2Twc3(N~L|AL^0;sL&Onauz68!+fgmz*e( z`!+AwCnPD1sxCdA4REZ@N#Anl6Ze8Mct{7Q^?uxI@u=wblr0SJjjG>k@#3tvR3B&0 z>gzC-hOAFRH7$2vbU|$Fzr+&q9>|9;x_*_7ilG?)H6*{Qa$m`o41BT&Ib!7E@qYIY z;|z&~B>5<7jf!s+srTz{Ue{Yvm$iB+1KMPXfe{(NyuvdClbU5$`nU+!_vXK=lflQ% z&QGaA32gMquUxn>9s)KESxhM4<{=|1e@MkWlEa+_^UDzLe}+^)W1>f@A4ycP<|QQB zbLdZZKcaLBziyu*)W}?ti5{=V>lP@nawlQrJPS7B44pf&JT$Y67=K?wyIABHV67p? zKLkXtm#{)hf1eD5BVFWZ?5{s*Z=cIYqHgoyx8j&ZS+w6;aY_}@6y4cn{c;VSG$a`? zIl53)V}ff-en;bLBW>>$bIrMWf-yU=@Sx|NAwSnS-%q!_^>^|a$%61?`)dTjUxHze z;W`tSc`|In)639z9vZWGP})$cT)nLEeDI)Yxk{rEef!hw{Z8|c9&ptrD&*7DaH&z| zOO#QXPR5r_FPYH|WT+#bi~=}<<2uCSjgdX?o5qPu#)sF0i=Ctcz@}oQ5KV*E$(C|0 zYzghPpXZ4W5Faj!uxdO{B{oNlM^vsglb-o?DoBqXT%m14xFNp)%=Vv&A<)9q-|WO0 z__}}@M|R;hxDyJvSIDo30Ismm3%5mR9xyYhiTELg4~DBTO|PX01-J26pE`?#KUjtH zd;tMomx~SKdukBSIT(Nmuy=g;@X}M&51-W-ki1bQ3i@b8T_+KzS+xCa1k(sIkIN4B zASdjKfS67<&7Eb*Ac5lj8EW*09&OQ0MS_c~px@xT!em(M+5j{S>T8ugBrj$p?Nfy? z%Cfdh9ycb0FYfmX%*R%5q8;+G8B_m)qWzb?WuEn;w9vg6=fKI8C7GV`d705R!c(k! zT{nr*m45AEO*UmtJoI*&G@JiY=B@)Q!-pdLqSJnV1crT^XF|MMz7=SMCA&OY{|iF>JSv}mht)5#WsWVImfmMF zWAUo3)c45d8-T^5z$bAz{T>fvc%4x0Z;DasU}2XOr2LAVaYE&fG4B;!NOq5R9x5_A zL^3WSZgawd&NvuBv>FL>6Y{v3WZX=R25aJ}S0Qj`MYf^N8C1ej;Grg_ z)E)YWxW)&^YD6@mnZe*3t6Pzu1Ca5hiq}h*nkG~ILZs)BH=9&bI-Qszn@%xuWm#|w z+lXfKzQI(c?mZ0#MHm#fC`WKG4Nv`0$`4Q4T8d6^`P5@_RFR6APz)I1FcL!z=VORy zg4(3;ues9WPH6FqwIP!?jwn~Z7LVpZXGnge1F3PuV8rfpa`DGBw?(^i6__o3Lh*LW zzG8YvzRSoS>9apxrX#CtRQWH6*A+eSWYh)8%fQ>S6Dl`w}T8%XZn-YGk;t>;_l)feSTseMwoPD#9 zzfA4!A#;mMMoL_E#Yv48C20wxF2Z^}f1vccW7D;W_^l)8u%XJDi>-?mfmW7+5$B@ zf_G)4afYRU$#|DiQim!xujyCSVfxJ)HTQHOGDkT>B?FD#ENT&VlTV@wUhcNd1!=?l zcq67V8l2DKV_fu77+&^UX9)dp)^aAjau@IZ>?jw-Z^HVv0Ut`?C8?(ZqWX8GVh6mX zDqS4FG6eXCFWiD46)FL5iHEqs-tPrdO6YH;c#b3 zqJ9o!>_C^^Q&5>a{qiskCQ{I&4s3W+UDPJk_nBk@pU$G2?mhiTy=6xu4pQ@QK^hIu z)2#Nl<}o5lJvNVT%~ed-2Qj`cp0?6&LulW7Q!yG?SJA3p?CxPYR*qNA!;L`s+kYOs zJXMYFRg6#D7LCw|iAKyNPM~y*#;P)^cQB?00?Ff482W-<*5!JZ`+i%|jF5DBCaq{+ zWSUgnf}+_8*8n!81#hw0W0aijY+U96FDQ$sTVeAc^1=*xmSnYH!NNIFBbXlpZB`4-}t*_XF?IuUB8H@gTBv(~V})o&tMSMECnW{ zdiy7EU7Wh)FK(LtrN-0dcM8UDJ!oWv)ACnn)Gh3SlmjQnhRZ8zOC4Y0jWoOA(QTQF zEh|4=CC|qWW>`cuAq%gOTq%8wA<=H)uBX(Wo2ib9H9sw;VqB~b86`=HRI zOx18R%5Kt#OY6(9`0|mumc)~RU_w2agbddGv;vETN7_uSUP=r2eid z#*)PCmvA#D+B197M)SXfZ077$Sw`-yN#&iVO=ifcKb;V_?^$uupe);(`EZa>BWZ!w zYJ(MSZmnsyK8y2P$ijt?I={O%Jlzz0+%g5#9<*ZKvdh-0?IhFnJb~WRv8&B}rRj2< zwUd1~SiDPsk2gH{kwH5-{L2-Is0SNb%E9#s%yy~9-{+eh;}`25xSUV1@G@&_*scZ1 zSLtSJNmpWC{=}NPK-9@T`3oYsY$%0v zb(`ZF@a`l}1G|>ZjrdnH*?1?$lEHJxsII1An1TJ(&&fphCAP*5pBel{fDvV~NY?X( zG-yMxAa5VTB7`Hrr>gQyJ4tw(we#b_yHDSJFgRx#52$9TmH}c!j{u=XO|>0nC;1+H z{n+VdF*GCqXil2a~ z_-|ro2Yu`UQBta?i0g#H0Ixn5KS<0$5SR3TMm+?Hs6PUVfml>PA3>n5ZhG#}=YR>q4hjc_l3hxq1MHdScm6eKK88LgqY4Eq z8vxDm6xb%;38!ag2ZBsgfU67uUeXZ=#f0SG@{RM4j$%PS-d51?iyTXPr-_J;*^Mv(-I&eg4`nB1*ME#m^Oy4N@1$4ihLTe=&hhvR$F z&_@m0+1EXPf3*zrMRoNq{rXxNaDe9?I4JE?3^52zN{En7-EjwrLVQpk7&uQ54bsLvcM*&p^`^y$bgC>eK(kn2Q#)Sq;tvq^`3iq;=(B>imQHn$^e08RPC5d$k^h<4HF# zBjc0*iX7XMR?4pfL|#LipNF5u;>WPuAs_F?d4u({9sp3VeQ#{Nkzn~ zzo22qUDk@`^NRntG)FWH;WL-N#QZ$EWY%Z$ClLd z1D)12yq~hNAC)vFjT+>NkGTw-W~g2E3jx;%hUcni>XqRwl)d2<^4Ez9Md*N7n1*e@1&IYwEs_t zzH0*BoiA)XN%aOezmR64p#u_6ciNU8vsy z@kcjhiOFo>Fr9I{C+VvQHR|2A!#~RfpD;Tc-p17*lMb{rPk4FYuA)wz-+C;GV&V)1 z_0;cjbuuoq1My!V_723$K%lECAF1in@7xLJP~mt*p+}*{NqZ?K#&(mTt3zo>b7UO5 ziS~=dh`KUW2Jme-JOQ!9gi?a8JZ+btOaXr~k z&}Co;^&W_N0|EdO=OUb!$IAT`2tEUz{)^o&5D5S014 zrOus?fOP{byDC(U8|n9gyHjsgHlgqHBmZChFN`IC@5RatxLodh48L-f8(0@XS9uMqB+cfg=u9dk)zOmT8pM6xU2T;ZL}Bxt8hXZPZ2Q?dvyYD${d%WIH%p*S zE=s#hXnh zD3GBUhiDOAZC5wgvKBy6r$sP97m}TCn57qN-Y;}9b31w5oL%*eNju9SjsL-BQ-hfY zsib4pg~RA_SpZz?+g zUd&b6k@=bAXJy?xxZz;v>esLyw;PF?FRzGK7E1T7pB{5oaKC&_zSd`S_Q!~`$&AMR zFh3WxrQ`KD2X5LLsfK{|%ff38aHw-Eu$%RtKo)$_(YcG4#vC1{0u$Z5J>@v0$ z*FQJWW(>KNl3?a=eA`}H6?I+EirJ>4yK3BKj4L{QhFgJqexkNRwI?;;(1N|Gz3u>b;sx)K=s`za%O6y{X zB1zQO%$#YyM@`@YOgjVbt|XdSiyX%u#xZl%N z_TN{3=PoQ-A!{=52IHYR=3#EIofa9NuqgM-;n3S>16i^I%QQD+pL>&5_a})mWq2)@ z({!M3_iDs#O_cqiAc8oG8}P*Qb-?oHdT*n67rN1@!wpP$FM9~4-T6IU1_!2mrD<>P zC6VGfL6qW+|JhAU)U4{>Q>0YPGB)c8P{4?62{z8hc>a-iv%T%K7xZHy=-t%8`8zts z>b)%Mwp-0IA#R$fNfiNQ8TD*(w&~2K^1=O6cgGL2t5ft#t}gKl?dzL#PJ7MZUi1o= z`nqi2#&l>AWbZ*W3pYm_&^dd85puxvyp%9niim)vq>mHYmT z)#x6_SMCAN#3i<Ztzf zWa}(l>*j1lbZM`n-$XG~uJBlqVK?IE)S-L`EIXxB_KA?D2sEKhGQjcTWk+Q#+4|mzp*dB+h$84iOr7JY5?^JgbIQj##(GlR7NHIgyd+)x8nR`1#8Pzc)4fmF@)dxG%sFuOr8_<$*>kH*L2RD z#_U0Rs$1yc8__S3QTWTZY`9Ws0IX;Qjh)Ub=(w95EU#Th zusUfivp;qNc~(~eW@&>Mu03jl5IjCyfZHKstZa9u*Dyy0D5KRrW zUj#_nx54z=a?DbLUmU&jf1=?T{~5_-AgV9qd{;PBcqjoQ{0?wfiM}^CCI~I- z{V=|gqCWtzlAR_2E4e`Fb5<(e&fHz&1S?B)86n^IK+#aCCg46r@-T~=$Bl4jRe zYp5#&d=9*cIB-T{4|ML=wj7%cwJZ3h6e;{Ep%D##7kz)XL%fl#r89lw9V9Q6#`G_! z$hY|0PyN@cuOOUrjs2Rs`$lKCWv7@lR|A{r?uGplTG%aAo*wFUE-QN)@^nmaWhI z@qfAZyL-0ps9yVadK3;=?p_cd9xDFaQ|c@hF#17TwGhWBTxWlj-{QaWc5^0st2YQ+ zhnSfiLb~$QI&+WRZq@z?G&J}YRt{IY8jyyNS3i8|_NOP6Q(f;3w?a{=bXe&@5N1ml z+b9UfP&D|zB-X&3$>7Nw9!GVofo>P!KOP{Y%L3LBwIZ8L4`dH{YQ0 z&4X#BWamyL*1hcm&LV>m1AEr&p=B=!N%};>e<~=&-`r%D81^%ql|f7Cws3Zuoy%wq z)-g>|WFG6UervK2dJ8+Wc-DVTEOcib^O>!yb}tr280<|9&!PE=i#hs(figeb9o?>v zHF#x*_xXuX`&W*c+og4GIVy+>tC|(ZVxxD=f+HK<6dk6Z_?kWE;^QZy{nFHbLEtAv z*xjd_;Hn$ivK_ISGL@=vPtJxyil7x%IKC|On+#A-cNMh2LGIeps&|zYAM2dBqxpHZL1`ITcAug zOnr`7zYznI###za-pcN;>c~f3-23oSTH{Oz@nq?uCKh}M|*p4^-HFhAY`%mq! z8lG=W0dH()Cx^Xd8XeyTLTB3>w~zx}oX`}lt;|nNrxJ5kp0YRoAToJfNc*(~`WRSN z7U#7%{@=~ov;I)WGyH^8DjlOyl`6af$zpn6TS2($L)FsgB3It@$NK!1u8;*wEcO|! zxn`qy%2GryGeGOQf8IFdku^)}8w@O#!A$OD-th6gcZ4S7qTkr!CR(#`>Nq?uT|Lja zO4qE0nWsFfVkt%XvVr!%J<79JIY7jGh~Z_#~bb{InOj?EO>7T zX2U82oA*m75lc_F-^A+@1FeTi8zCyAuJ*#P*_k1<2rFNI!Mu2|Nf2ZV=1~s4efYgR zOuxB4`?gIJEcNs=KHqkDPF4XbjLOS8} z?sRiE6Sg6V7;y3n6bfd}cqJxtPHSf6iYti8quG?tj$LkcH;2^P7`bDE^QSFs z&d~%Ed`zAkBkS(GpKL|`VuemLFxlheHh1@0P_p}`paVfK4yW$k{4+)1y$PZyzj=R0 zVH;xnbW?xAe1C@1&AfTUy{hhvQIZ&A6tKd7OJE06H0_X(=!J{dD8@w)Q`C3*D*G;uRIn5A?b!=!y8!Vwc#)< zoq$&uRA#xUGyEWaGBv(-&)y}^tlt<1o*lt4gRcQmV#&pk?us;8R_ku`nr1F^0iB659>m;&cw%EF6b6vH{Zmn)WLEvtX z>0zqDRAzwlVcmTnZHoq$r1C(yO1>?|-3b11Je}@Q9)|Esu47_Iz~rD80V7ebFb*_5 zjXoC3qvs{P#B38rO6)um0prrM#{$ytu?ncH#%2v7I|j7Zc9xZ_Ui9 zKIBrmUWb$I#!d|$1T_>mAIG5zMn-Y^uVXTDXZ$)@d3()9vGrhPg>$8l$^#a)n%H|% z#y-bE;m8d7kJAS5%mJ^(dWkQkZlu{6gW959xkS$pT4yMgJ}W$6rL)FitHpXk1QT=qF%8Le*L zD5=C_)$``Qf@5%^0rJvk58Vz>JFDlpgP!KuhUzITtug~KTw6mwe!P%xk=>gNxpg^u z{N&O2p-3j_Olz4&_|F2IQU+1<7j(aHF}>SDW9{Iv0YBC|dLrtnr##tWD0MGaH-(CM zM3>5qghVp3Mfy-G;LtS%TqvXZ(3jTtZmEkYhOul-Ml-*es6r!^J;bPMl6lhP2ye;5 zS^Stb#^#7HCb>GI6oN{ZUwEq0!jr3#xUA{%PoDL1^@w#nbgELP=a8I<79NaCX3Jp#mITC$sFjccAlrN_&#S zaU?=bB3?C7krMd)fsztLZqE)hDByYM0ZyW8&a1$Hv*P~7s^>}_GB z2{DLwo52pmy44;i{$Z|yv?-yy-h92~{@Z6$GMlkiQ7Q8D==RsCB71#2krWsy3@`Iq zJCsqsV4QrO*V zupt2m3-u%b&O^Y!F-%zXwfcl2m0uKE^_BU=Trnil@&x=B6rMDac7Z7aikJhKa%L>f ztwlq0)OMss`G0VU-0Ar)&v^B^jzHWwo)=eQwFf^lf>;8osnvB{PTU8ad@ILA0XZvs zUH}}ZO!lo6`diwgbQc`T13oSM3%A5tXWm+2zNIlL&Cuzq3>+cR?eLg^?mt^9^bvU> zpXGmnVMAY(C|oE72yB5CcWA5Y412$C*tv>5E>aX&*fUf%jQfuh>&=tl_4BxpLa5<% za2%GDlm?Ki)qTGD7c`3e3wi?I*C^al25y=c&0#zJ{c;eg=Pw9QDc;EVj0QRibXt2~ zq}TJChj^FsXe=o*f81&ax+oiv9bp%kdB;7-%xce2No{nr<%x2_|DX?;#<62(%;%5y zgY3_kn;$Qcd_(}^hwh4GHLKVi-j7BARP92O$CHIm1)h}t~*2z;)+zq9Cp37j)i{<3~$2@ZWNB@p@;KCSshdPgs z9r*s@Zm6Crb?6(E8pXZ@s@$5*DK9WHT4_>ReJuLeX(lH_Su>rCnnfp*WIBe`O6DiF zl+r)45re-Gt6*AT|M&&!4P*UZP@|i&#nIw|`Za(ei3b%e ztK7!t+LBzM}Is!^G8y}>%Km0#v-ai^eLN@0$>vy*lEp~nP zQ5_oe*ZYljY%kP?wkldF6V`*vXctC_1nd~$Fiz-}8z55>kQsc}c|EbY__$B89p4;` zGTV<63d<~B>`j8UGh^pyOJf3p+{dilSS&(-G2!6xJZr|CNBrNqJ{TQ74>8-1`lE)o zJ=(Ybodlev0=SCkDpPw}y|1(Hk_Bim!Xgb!frIG2sl#}-K=BZ zSysEZ-m*@k{4DNZZNC(fw&C260aOVH4J29Z5sxxd(nl3Ow6S(nmN;vn$TNb0H`(LM zS$Ru%0nHcWO{texpXX0n4n-v&fA~N(VsZCr{R80Ds{*`kFJ_E7B}f8v2aS7bSwIGa z@47(bzd4dtZ76J&A|8_LMeRCRv>^G*@zt?Im1w|=9N=`uV_yqm(Mi5j@R7@$sYzFF)5wP7WwAkf=`{ z;E&;59V zA#=tD8G%eaJG94Ra;_T>DkHI0e3wm1&r(>7C_JO3^EOj@if z(MDy;&Q85>B)Lj0?O?Sf7tc0BzVth_-pA4(XDiXp3Aky_RF@v36m^4mY#fz5{Z?)K za#nskmUV4FA{?yw+oHz=o06 z5ZthPyCPpn5aMQU8l0_k6>z6q?yX)t8C^On1k^rl#H4%4Wa1qyXF zpV)UdYagJ%>&fmp7)#8iY=`G7-G1xFR58sS?L8TI)3E!<60^Dm_?VuoM9wDI zB!6z-*b=CDr*><&x~jSYJ?Ro)$Tj*HvlsBP(e@x~pna-3GsIbbJyX-LB-N3kQ~2~I zBdpl*`-mf5o9XK}pYrN8brqg(n7Wa&$GUOFJ>BZwb7`ugC1Qhp+do^Y#yU8Kk(*wG z6P2o}@ft{qd%k`Q?odBF_)5P6G-=0A#8_n9;vqUknMG za}ngvpst2s)}2fYbNPA&6&i0B$a zr9^BnT}s68v*4TH6CHS}tjXi)m2fw2i_r<_Qn~L>M4CodWDSTce(nl+BX&0 zj1R)NKFt{I^)k0+B2+y*gBOzqAlvz+4yfGS4b~(eKR0ms~)eiAqHCxiG z_%@l2B3!$s{UZ(L^WBb8Jh8R`2TPXWuT!Ggl0R=9uemZiTR(BETV&5vSc0zI&d)H{ z-n#qx+i1T*@@EUq@4xnLR@GMC$e4sxw_mX;MoHFX9uJ6FB zx?rn#1(82ZhzNt>;4G%m1Gn=FoC4iumk^SCL*ahJd4oSje!=F1oCa2mPlM)Xqw+Ug zx%wjuCJ<&(!TBJLH92N!az5YWCPyU^imJ3M`=39FW>#(yBy9^Q?d;Tj;$ikp39U~l zrt8tKl=^62E}o{Tp*GnZ*BEd0hsz5(eN~HOu3Hj9Zp)v?=f8BRug1Y88vW2TIa)HX z))U>Ehq(shl5`sJ|2%Pkb-eU3gcnl}NTpi*1vQ{J46SrCgchp;?GYiSk@u3`Wc0|4 z`I9=SG8D^vjoCqqP8Vyn>O&_eE(+MaU6!!y;g4R8d8-Fv2LjXlz{lU@z#IBf0kB;E zn^r*%JUZX*Bpv8*jPwL|#{l2j=(e)~`!-jn6Q>z8QDaSl9VC~2g+rBt;A*BFcxIE* z)OS*=TZ+wkS@GSeV>!G24Kl-1OU9&gboc9=T+mrZW}y1kq^2Q;n{UZpIa*%%jMIhr zFDPjObG~_GOXxZtk%{)#5}y1q+qrTs{CkTtsvuk5Y-H~w+L&g3LD2@q@4>HjeMypd z(!8J%G-Kg%Vq+jux+*jEXv8DT1kbmEs$1X%j;jw#m8NC7NHu!t{spmlp#58_v46Wnu>oklDev)6546>&j*J-~j zN#4{-O)55>HP`=DK+Hh0qof)=e#v}(+B2}2SYNi!0wMZg99F0_s($5+>`hkW<{>1}X4)}x@=+RT zfoz|CH=+!7d@~jQfQ>8pv=Zx;)y3IlSQ&|4Nb zjY^<>bbdyp@SHI=dWCbJ*sNQ8}2>&!P(?n+>>r?p*xW0**%)P9PAw zfZw)tOCUQq>X24l6Qy#%Qs87HueDs<-e1*pQlD%ukf`-+E>7+YO9WQ;49v(45zPFhTE%6iD{R>$`-BSu}YW=~E#-7e{Pv~2}g#7Iw)UCKi zbB;}8taI_rs-zyPzTY_Gz)(k%huH=iMl-t=c}i$I=BYBB07tHTgK3d*v&-m;quxgaL}Oye}#t%xiL}l%DE#LSi1~nGVe>`H$x*d@r-g zpR)(%E}Zb@m9WGSo6_*(004UfkhkamL<2Pr;P%u0N65f9`$p#tr7~HivmmSR@BV)& z;r({~;;-<&w~ryNLJ*$k^0R0E`vwvO%-PtVLqL`Q#a{tR`46-Hz$wQAVPga66UuhV zmw$jxc_R(j(r5oU>%hE}22NdxfXIW3=_!C>dj^mla4fbf^?v^-Z~Q`4F72VBIT>X0 z{N4XuL2jbvO9)VaA(uZxKwy#MkZRB-JghVxHEW3cWGbNAF&b)7Em|TV zs1kn1Ihi2mxwS28EhAf-+CAp?cc#YBmB_O&DQoCd_Y3)V_Rji1YU6P_t5U{v>iWL- zFw5G2!^{M>_2|c;+23*xgy0*~&nva_js1gUZ%h%Zu8}44Xsr_WepvDBgs&3vh|=>| zws8ZaKX-taG(DDq235bBIt~=zC_G9u&0c$SDCzTgg^vV)QBh%=19u~|-@SG@ekM~e z3%yzrVpg3(q5%639Y{}U{5sYg?OH0AFZp~~)UHiEWGWgrX!J4C0cQW))bYisnEVCn z!-b?`nQd};)4$E8&A#0nJy|EZTU;sqrtu^tfwGv~@Ez0ZJMR#X{jjWoM>bg2uBo|j z_SnWl1P92ju3fmf=<1iv^-GJGKkF>$Nyv{qk35B_U7s{Nc#Ym7-tkFBBs5|sg%&+e zAsjRanth4zXXxGMtJa=O?c-7rtKwRZ5L_SGo8`&W zI^{|--0>FhV+m)Syt7(sbi&Yl3L(iL{M%C&j$@h0h28pP;+RWd9C61FYTB*G+ssZO zLE#(s%8ZvWTi*9$k@K6Rb9_PDduHU)K|5Z_PkR?;oq&r@HxW!>`eq&F;Tu<6O->;? zg{P3End3{*Pcg$GuGOFqK|v*ZC`XLveqtD%MZ2^yu^hECn;v*~Qdj)S~+lb)tk5kB5iw%-r=bP-A zHOHE!>L5o!j)>#CHKuX4v>ko)Z|^EIyI@LBuu8m|H9P103RUA~~tBIqF2Nid#F znwxdY0B-`41(%*d_TwH$b0#4BFb`C+vyUkW1Vy&m=0; z{T`EjySp`$5x(z8qS$R-SKpF2g}8%zGeKj2*QmFQ^b&k^x0sub<0^Jb);w|H1P)e% zalh|=zc^V~+fIVLl0vU5p+VlAmn@93?t9LzDy9#-pr-@w2-MN{hdo<}*C5lxObJw@ zBmEVreH;qY8#~ZOurD*#VTBBX)<}&DA}1^v{buA6Z+EW%{9rQD*qo{awc z2GG`IRI)ty06}?<4f0q%B*dS5a0UWW=FTnFlMVR=TmTYI#{rbXGv3@c{xy}HMhCVt znU^2G1AlJ-r1m)=QSY;J^|Z*o$mnTdej=3+&l;t;F-&f4P*!-~8^a%k^uo7OzCq6O zDnUz2yT+$$La%tJ2Fc9LI*P@(=B1~q@YgvmCq*ucN!z?co8=e|q&n)imL~+7VKB`e zKHVFsG6Fgk3uu!^9`@+ML2rh-zTydWl*T}aj-{HwyX`AgR)#o78#=k}{#~1Ed@5+~ zOf|*c`^{WTTYfWh#v@is#IEraR3BPaNL%hxqGJd--XdZq_1m7RIr^Qv3V+fwdR+SC zM(0%#Y>_mVg9V)m>}Ih2r~+=CIkr_jyDE3JghAaUYfJ6kfoTo&4Bco%42^So3qA+Q z>vTw0DQuKz0{eZZttZtXgOS(fk!O=Gw0ye;@qDB-DOGQ%;S;+(H_GvWQ^<%1=EKI} zS9MY5?_Y3^x|aTxPB1EdsAu3qjKylOLhp`BjOvTBPc}yK>KWHRs5u{D*ip6y)A{a- zi5cQkG!aw1qBxwTv;BV`zj-O_SaYikWJN9}dc_fg;p^10m&>WBEQ zNL8h_H+lpYGBICl4SR;Os_%AlO+7!L&T)kflz26+fnBrXYE=9*Klnk>)g`;i$9-Uz zXCdQOi*i87^P$@pJ$kFe23$jLm7)}pSJ@I&Ox7&*s<1W&gDw{8MpiR)n*tYJyqj^L zg5fHIE_$r;ZkS0<-E;9?dZI2?Vr0=Kdh4}CQ<(UB8IGuh}ACQ~c$t6QE(J3~xv8DSv<@r`9c!ZTGw+n(RJdO~C-S4g~ZCsHnhCg_{E!90aVxu{-^I#P%PwU_~e*o80 zbFH7>5zosg+Zm~0xDk@k(w8*?4|*V%9eGodQJeK=lqT=_sn;7wJ zjn2Th%FBj`)<7Ss(k_4_Fv%hGCq&JUMEX6z${BkB&W-QHT9$+im4}g43QD#sn=_tE zr;rJ$2ur6G{I*Kb*g#Rg9Ze1A=H)(9MWOveAD^pzh(}pyf=2ULv)AEQ^ z+{d(DR9smo<`*hWl0}zCOX;{8?s#n@6fCzb_qJawM!G}{EU&+LQ?pT2Y;5nF;G040 zjs{51=r<@Ei49!#ojyC6!zqj1jd{1Dqmvr5GW2qp*yx=#UWYKbsG_NmU8xup3ucEP zR;pQBn3$K9DW78yW#tSLYMdL)mcE0QMWYvQ^zkmc$##kEm?BuOmyN&GFwmDa9W>*0 ztLv-@V+?vSmQeO0H+7$83I20gS7SqM=6bUz=KBzObam{_Ddc63Z6-Fli@|8CHn@Gm zPhwMs@y+^WMl+wRJdMC49rXZx)rM#CZ=L~ZXHotTW*Ez<-wY%VQGg-z{P zH27UqY`25m-R1Q#?d;}zyP72a;&)BvYX4Xl;}ngm2R~xr8j9tqzYTi^7ih#*frXAjSSSlmy#%H%A7gUPt*=g&Erm<0Z zWOJqU;_Zx)#h1NyHY($Z?}l+`m9z=P$&KNrQ8@llzB77oke{#>t=~d>soEKgkNjAU z?;|>;#6WCi$WojKjJ<1A>x-XdC2a~X8@xjFN zX-6C6IT40O6fP2%{8}={s*-buI6y$JALNZ*gpwAM^GiL~a>t?%cTOQk<{sh}-dP>i z>kPVHA010_)wL`&9&A{oCz$9fRhilu7nH7w%9>-u6n90hJEIFnD^tCE67hqxzFQ)Fq#Y}xmlZs=5_?wR{ z;iJ1_J+EZzZ{UJph;saG&Lv#5DaHAPX z%zq30yeesPk{v>k9rn#X&Xw44YQtgAJj+ck2VIU&Wi&c_?!RRojW14=7R~GQkIpx> znOh>mJL44Dj0@AgN5)n=LdCZq{uSUFjZxGWWZXswLsW|mIphRAC5rlgTn&M}Hn)ga z7=Lxi&5!}G95NmzEvT(}yIRHH=jV;~5>8b~KwZ+xh~wT-m0Q35LF$g88c%KIk7$Vw zXE;h0f0LXPLVE|K;4lAA&am0r+4r z^8((&GvMeaAnhaT)n`hPnyj~Zj-HX<5%kSHA-_()3!G~Hpgj2+u$_r}e&(miGiC@M z=VPF1Qxb3Fr<}QJ(esU~_d|0mU$nk=HUz3;v03X?hR|S7plG*!6 z+05WWr~ilpaQ|Tl1>{daa4N)NtczrGNVR6F9rD1K?i;2G*>6@A8>4tfAmmIeMQt|I zEpP{m%17)-is~SD!K@bY38ee|!<jCp$?6)FX#e2e&vHj-YbBBC^gesw+UNEcetw6|gOF&*IaetP)e+EfWiw64-3&+S* zfxa5`f_Gp4-wnV$e&|*HkN5D_79H4S2ek(Q7QukvU$5vLgd83P#DJ=~A2qZEM9j0b zDTLj5@t{nREsy`)gP-9kPZ#AAJa->$J~;U$kWOjcG4$n2RLzecaUziOY~beuEE2%? zKxsKi2^cufb3X&V<}>s+&7Xnr@27B0o}EYGK!>vF17?Kc0Kj3j0R+~)3l8*Df$EL6 zRlFkxnq|8>ahm_#Z}!4T%GH@-{WJ^#p#ELC!706-NjG)%Co*0!U`qi7$V&Z zh6lD{1-Ch)+su+^=fWQym~U;TEWsp6Uyf=>Gdbq8321=6nnSxuL#JXz#sku3WCop% zx980cjG3H!T*|Q9_otAn-rc27x_}#+y#v1DW?40fg+1vb`YIoqEz{Uvwt?; zP9bYje*{G}i9!6ZvMo1615sap1aE4Z4V5{0lRKqw{}iI@QWoL?n>b0${^qPLE7usC zF>(lQ>`G<2>#a6ha7fZ4PQ3H399tmeE!E0OW8C*@COiiq^I2ZLL4vTdDp1z8?i5ny zGI0tSUO?vV-IC55Hj{Q&_t?iRoIz?!RxIckA^8VHsc+2a$G8-ty+ z8nb&=CL`Z$;Z7mBN#PsGSed<(V2pON<|)MCn6tPWadD*rVV5CiIxaQ&Gyy$KZYXhh zsP0m(upqI{0(0a%cM8e$yETlq-09q;om95 zC0hjU4m9^)G5-Z#H;{XzNh)=_Six`D(eoZj;zb^Xm`s;8n*1tUIH^pm+hu|<&8c^+ z1b1LbrOq7=cyxu=*N*G;?di}X0PnB~AiXJE+RZ|&NeF!6lGMb4f{n!CZqkhraiqqu zUkU7_$@|0DDP%OpR1&;FiHGV=85zS=CaeS9R?9oAYIoXvi@@18yLc$UTa-A_H1(fk zdot48=ra>0Kl2oVUWo;)9ygcqFw!C@*ng}}N9B~CF?{tiQ`Nvy-BA_>y!K75JfP@i zt;)ekTsJOtYwsN0o&7Uc<9dD90tv>=jor)zQdiN5?y)-er+EU=_q)?8r{oG#!V#<= z(Ue?v3Yp}GY6J5%gkqj>3W3u_iR6};3EGiq)`ll5!J0L6ws1pT-V28 zctxO%Tsc{OU&9HEZ0gqejt{gsJ6=>!I_w;}z04F_~_;y+p^-&@fLbe0amChwY8CDFy4)p6N_=0ZqZhB%F0+Xg&d~X}q@2-lzBKk( zrO0!g&meD61JVk?X^kv?`EwkMzDjA?aQwOF0$VC14Tz?z05S29Ql9o4$d|PE?*sKG z;VIq>u1V1gKZG3L{a|}^o(^P(Q~RfZ=^v;8AdUd+MF?2rwh8M4bzx1Y|W6`Te7_= z=eODjy_+7$uZl^!SKa}{Sn7Z)Uy@u*EIcm-9`!!aFEI<68t4;Sv$`@talJX7uDc57aUyHnkcC=L)cebVxc+Ddx%2FQ2s#)^xh@m}jEZ@vTB&)$^ zN^IOYuwrWt*DOb)@v+l8e%g;KRzs0@ZBWiO%7F07O>HiiX|_Pdo8f%M3^l~@GpH3? zR8m}4Xl7~n&p|V91DdHuc^@i4zAs6P&MUq}>FfN0&r|g^Q=IQ*p9r`dZkbxG%QzZc zt94X`+HT1D#uz>lnkot zJXC8*L<$%?xme?{53KE-TchcfEw9g-=gty2eb0G%4%h4k<5qbzK41w710|C$lb(yk za@Ur3`!$wm^@+)dFc=&c6RB6cYehyM&LXQiJK&-DcWB<#gaZbY6CDmkrzP4gxlg!a z=AsIBfgq*F88-0oTyaNd2Ds{`qfMmAb)yE~V&EZf6EA{&F-d|B+bP5%Zntg6i1|vS*83#bd*jtB@s--enRs}{ab7}jdn}c~{+7)2;PW2$4C`A(g+Ui$ z>D;S%C1$K1P%oAYtYc=v)6FRwq&ok)S z1Fp`5I!_}k1>=_7PoixNM+~!NSy1;8Pkgy~;~WlByN<4%LWmy$pF%A9i0UL|-1y~c z<=S|tGB52dG(!&|Ey~c;>*<9&<&`|=sPPAK8K2jfFU%<5c=1M019R>NhS3{p*~kda z`YOO|tnh)`gQB@6p}a9stnMtETOm_S#XV2TaK4q`b2V?RPq(6ukD#}b|y1ymYZE)wip<)0^T1ur) zS(JvlLeBDxp$fjZ%r-AvRw%MOTV6A$$B2&w@zzg?yGw=0d|yVaPIGob0X;>#C9a|X)9vi@((^tAcmlz zEpC=lNb@5x4oB_Z_83C_6JTfk$+1PU&JOs;f%omQQcnn@=g~7DN$D;C-p7qc!m+b6 z8xMuvrIE=gAOD{;W!F$Kiu(MMmW_N&q)X-M`F!pY&>w*k`A@euh$Y)#Q9!pJ{O^B8 z*!QR)IK-bq()hYbb&ueTtBqVTj#ZhXd~A*1)Q2!Y$_w@OTZ`e7r!mDg+SV$2_%(KG z{Iz1J=?+F*snUPrh~er@_obr!(s(c9UU7 zT*}cg-e+qY`5#V%)KhZp;)`0WfR$FRE004~G}p?O%{37aabrqP!Mhe02S{^^dW#g% z`Z+pb6RNJ`E=839sK#8J~zdZ3~R~PkVN2`)sFNb9yrv zvt(Bo;#d|;@l#WKHPPkH2y*XoqmDMZW!CQCmxyXrhOUjImlq)J9{1J%8!RoMu?= z?x>VHkyT#@``}KBsb=|Dnfi!OE}xgXt%B0EE#-xXhj<;G%I=;49?fVyy>S!mXxTP;nI+UU?%GIc63~`Y3xwMdPx& z>DVeIG-2266k=ILt5u51R4mSyh?d}L8Xa{EGnQf%H5znXZcnS$5A}{OqhTVbwX4m| z#q)m=iH@wObgF4h?HKOeUgL&a-|?%aXe~9lKA{pGoY7O}A~yj@(P(T+8vLDUg0rFlG=|gR-`c z&Sh*@NphKLX=OlY^Q(-JmzMNS`XH7ACQ z=gXFKjYQlrtgj-}NZsZ%6x{QD{o5Uto>8=u6^jq8s!m+62LKqsuQEnF`Et~8gJQJ> zmgU}hxLsZ%iY`}Gr95U4^O>St; zYggrR?iF|ACtbc=_hte%U|iq#>a+0#M*Nb2R_OC5+>*_6VwIEI-Qx4xn~$9Av#EZK zxfPfxr{^hk`ZG~Y`h%<`a}@A`fQ_D;hfGBT+#oNBkiVL?(03qW=kbF*SFo*h^3_`q z%)I{Jm&j-2qT~(8Re;n8;JJ)^2>{sIWN!&M zHOGs`m(v__QS;t;00#?TcT%iB?@zAgs{iE+j~|}_8ABHopHPCtBnafa5X30t8#&HM z{+GtL7f}#8w)1Qh+-wv;OrN=|N|xt813(jA!m0lW_yB-E3+f3F!|r{qjPdK0d2wUF zX43&!2+Aa0)^oSOsto_`^$&qYCM9p9i#q%3+fVS|6!zbq>`tnEbP@jTo_(B$|s+R4?$^H_hsQKP^_(?aLWV)$V!MpRKy6p5c4H39IjM z#M;@q5u{*LcOmlt0TUEIg+O1gY2EGL zy5qZCvkmLm@SUxFMC-f|$NZNB=mpo1tIVkzkqU@Y$ormUqLt^up3@`4UAKIVem5|bk{n#vE$gMVjFWzS$5}ZYEWtBLf2qyXu|&*`}<*c$HCK7hbh}i$?f&Ix$uL?jUYvJy%8@(E5Xk@$oT9&M3sBF0~wWAg;u-yS{)~ z7kK8=>ufoB5>^?>vFIjfy2Jz}C8i+dh<>K5#dV(;pr?@1MZsfWTHpN6Dk4lSSrPcK zyP3Z}O}xXl$Mg_Oy5~ju27KBX+=x)<^o!4jDG8eON6hZ$uC81$>5DMkbqhMcF6@6_ z#_IyNO71D71-VIoWBaLC#>YJ=5?!O@e%_L&-pCFu>HXo!?CyMA_|e&*gCY_~Y*0Ks zxi8Osc%8VPFVeYyyK@Se#vJ@0uB&bKEF!)@rzJf+f6Zg+kC^D{yJcbR{5WR3+bz| zD%3oxGG5Uud1~nFDMW76^~=4g}Gw}!G=UW99WV3Pe` zEz;Ul3m8aed=^ULZZD1>^}1T|6mqCC!m$7R?swwh*QZ33dB|d#Q^;80VV= zO_iC$64N#4kafH+YgZQV=aCxEd$Zmq80}sO-;X#+?@H);dU(=$)aHkM>)qS+{>jHA zd_2vy=KK+>{&ku(8)XG8M~rwc3p&f~yp>d;)rZmsYP^0`n)Y*ZSl|MXvAlYxQB* z4JubOU!pSFYZ%*Itx?gifb@x&>yK)&YYzl0?HyHKqAv!2J93O1Jj8FFLJANitWQ{hEQ|y*gyeYL9<+w_u}6&ekMNi8Mge(7 zE_fB!%;c93lkE4MP6F@Dd9zZRZr9|W>>sJ+f2pV=d7B=s?1J;mW`N0 z)#Q$+&IfeMM!7Ra@bAKviKo5Nuia&d^D#*LUZ{<`1-iSNID8-8=hXgbvkkSr5gW13 z#7`O;C=*-nbE%nfmXG2dDN(}`1*+d19_Dc!g^eJFlVjcU!OzX2i|>lTqfh1h$xQK{ zYS8cbnQJGvI*N}NrS@^ZCi9hb#FnH*;!mmC_zLI}>SAf2NAUu2opbh)xdPGx%oB zQ)W|kI%Z z!WYYm&$~P+?#JzQM-_gJMkC`}1?2$#C^+=m4ooo$``eWh6K{JHvL_a_tILOrePNzm z@2yA1bV_m=aJ=nF&#Tc2i7V~{Q=y{Q)zt0>#A|E;__Aw3WVOWCZ#pmLG=oqYDHw`%?)ipsdcr>BIc2|^VY!Jo5;F@uM zj{en1ET`6N5|)Z*v6G;kq+fxHLUHxC&Bed^WLu-3ZTO0gEPlZ7=Ggh z^(PSUCBMsmU-BP*-URfEAc#zT_8U0Iqw*L;DUTH8I5qb|UfdYh@+?jbrx+Z!?Xp6M zqBao4y+T(0m(QGe3@Z5d^?&Q4a09}_7c)J7x@95vh38_Kg7)Is*C%F=j@MtF zLR{*s)-69EA}6+!lur6iGHU+GVO!UWp<+NyEkv%oUBp}4GicA8Ld>8;ow*(S;a>$= z?5yh~g{`}qv0crubz!>=@9zNx0K5)4&jx0BFo-BM!XDqC4xj)7G4L7C2`C}#4iNUs zat(SnXy;+S_0rD&si%~u2iie7Cne>T|NP-#D4z|vapUYHwSOuF#6ZZ?JquwHj_-n+VjVKvy@4u6sF z4lsWaEIEq@9Q3SlNvYv)Ekv1h=@)hY=HBNLZ-RKhbTT^8sWUZXW@_Hm-{|1ruG1+b zE-48&oaK{A2!l?9SB-57`W8w0acC`LHo?kPp3Fv94-Nz!J4lxM(lRzHxB**NaV#`6 zJQ5R>e2FhKF|{27$3U0NX6uR;B6Da${uR#W+Lu;JTWK19;40(cCnbj%+j_W@iwrpa zsL`#vv$=#hf}YFyX4zU#W$X#9815g(w8}y?eCl8<<)rmES;2Rxa9z`rk{M9xrc{rB z*Tz$JayjF*-s!n?YdTD5lb7XD?Ne-NI2QpB`d$S~-I*TwT{LJFdS#hUEkx_SFU^`^ zt5vsBH9A9V*aCGL@AVstWRGs2LX=HR#}1O-U)`Pl@~x__VwjoKztLwebqdkfUp|@O zpv|;>ztv|~F%z362wgkAIrw-U%F9%_Mp}5Sdt_lIrPi@T`hE(5>|QGhKe`K|o|*eT zRFxMW9lo3!1h=IwxmFY#$}+`yh~Qq@r>l8t3qqa(P-6H2v+p-&Xf$nXI4E^JM{MG9 z_jgn1aqIC_+1F(t&|7FzcML?@pUK}Zs4Tbgf6vW~opd`+tnOn~a!JtRb9E!@>CyU# zg}O-xg+KEM-XmIecZ73-JMm&*wC*wD;5w}5(J9128*{XOOm!XNEZFQDC=XgKvR=%2 zXyr;vawc7nOZw#uT#j0&5c*Tdxxhbv=8<3jSI-akNzUD;ORsRG z^PQt0*M2n`JceQ4PM+ysE)w6Pog_h~91G-r&dkFnT~L}m0Ts|ht|ckcT^?|eu4_61 z9(#~8{ns+yk8i~YHI|4>vr4`Lx(66ykTsD}ry>y6?Ud+ICwEc1@$lb$qJ2QxDWvHX z;=f+JenlCWmf+FCDE{>jkGm!N#L@xDMsO24sif10-0}pr+WRMx$oAUi4&&k4_4huu z3&fe40#ZJ7^V&DzPCxBE0fRMr?~(f_6sHiQq&Z{&J*lARf@e6mqMl$kYD?gpinkTC z*lsIneMlwBiRx>K_|1J$_$?46u-m-Jy+D)@ZL0liODgHFyEGC?5*?Ol_EfEFZu3!q z8(({jyIO0?1oOSiw!3MqhH8Mctr?m$(yX9tp@NKs3ZYvDExDfkAi#cZW02nw)gSQ&(ydsn^a z7xj9W#N)`BBH+U>QChPsDS9VumAQ>8z-Z9-;~KA9QMS~;nq!y;$AhvpnL#+##;Qy> z#pG7#bJalQ9A~){d~#f7gJE)BnZf)(v872sD9_vzi)o>4E2q}D?eS9x&Lp?0gt1>m z3ysStQ*$un0mz*HiAW9HQp&vD@ z(2l*{8>_BHn(445s6@Zh`UIAIjJKLf_tmtQI>J02VF*h?t4Fa*RCditsy~`Xj@+rm z3h5Npd`GwC-jabi>}h1L5(lEJRcHufZ4Dtj&Q3O2lArf3Io`r?35yMJHY%Do!{M`o_f6YdqxXkHUwI?124)|&m9 zHdb6mlw2rXi9Ll#BjpHq1z%nQs>Va*c80*6w1Q6j&~QIaaCK$z-m)&5!9i`;$-}gG z?If3=QyF+r6P=jKtK2N9)I4RrSZo-o*Uq1wtZ8x~QM*s7K`+&L06&K;z2t7mKsB<2_v&KiEU9=8f~< z$J}H1x8G6RxJopw+6;z&_rQEXRR=rhERd>ZZ08|PIVJZog#;UTnew$V2W1-cOHW^_ zG+}6Njx<||&Ew^>v3Vg?Vj79Lj=4bn3+o$}r_7@IksBVZ^8J&pq{#O*>7W8WHO42o znTDn+Rlmy9kYB~5VFlraOCqjn>W2oJ`Cobibu8`_#%ceaUQ`k(mKv`b7APqb`ApEo zrY(u?M2pALu1j6hbLdK4;TtPrtVysfTb|g@4yxMuQe9ytaZv5o*uE>!yvo0SEhdRs znR|@qtrH<$zZHLXdd99YPP23&@Z0*>&lSCugujMaW5>J?S}f&l;+Wn?uDPnoeufCW zJOljMWP=^3VUV*zQ4skAFCgTiP2V-uUmHREwK~=>6UCDh)V2X8$Lgo~2+wn)4*(eo zfqVjLBIE){BskCZmu&lMJ%(Ix+GWMe5M(*L}CQ(nSxKi&2w$30xtf+~+? zN8_aZj^CiTSZEp+i`ES=5E;D6tT%_6ESe3qMtv31t=gxenotj_8_gWCAFGo`J>Sf} z+@o)^B-(g_OY5URB<{xvrzaBnbH#I`tZNL(&59b1rLlJr~? zbCsYZG(WPum*nocHult=K)votOSP3GwRl+%0X+H8WHiFTf>pWD4+T%dAXC z+~cb!^2;UH=1@xsF`Mnv7$3<;g=26TH6V*iF$Y#AmvsqGOo3wgOY1M>OVlI=h!0xoh z;-Ryo(um1YQg*6T6zYeAijmC31IztnS9n^MS~rZpx;j!T!EXJHCcHVT@UBOMT;htR zW_xO7sZE_SBoNIy5-K(|)i?jw*!Aei?dr1wEDyY%zj&4{N zl5feYYb`wcC2l2K%3X`A^-?~R=?M9>4uK6@@HG}JV7|}fRB2^c(cl>IH8h{dZ0Ws7 zBQ`!+QBaYWZN%fKqU?$h&IjxKb&c^-|C)oR;qJx;+fz>1@%ybi+0c|o4^$D$yQQ4; zB=DkHh64fCnht1n6^$qp2AkApk$Pp)^)eR+bj8KJO>J#$zT(nTEY+iHMsK&={t%35 z&_lfbvwY;o0JD+e{EfVJrE*D9^%Boij^LNs%6uEcj|RP#>BjB10-i;sSBMSDB=CC| zC)qnJi4BPNQzu>G$;ysOP|a^D_ykf-Ee1{@74wbarx4Ah8YTFs)^4~`0oDpvY{#RU z(4fDJ{I6vZ?#|fgz&EF^>$3E6DuAb2g)cPEL?jzX|^utZT4WSFVvc=M4oT>>|#f2q(&)lqEmk+n0lzp%kQ> ziIiH&$uIG1+wo#}R=$>MtIn%6w^IBY7^^aQzU9mP?^F^~t^;DU&dJgVtIGM2ov&{F z&b9`r=rOtPk%V5e^Ax%Fy(coQozyq|TC44@79%oJ_={Jqx&=QxTui{!#r|-y;N#!zCsqAu4j|+Z1t+KNcT~d$#NVdaD(;DJTWzXU zY8lNzI^= zdlhWg9uz)Q1k2q(&j0-jxy>H<83Jj46g3Xk_JybpHL{HnD_5U}j%ZD7Pl;`P3~q{q zjqBcd-Yql?(gSX^{hBq0z{M_HpoILTW8-|xcK&bMOUe?v zCKr2t#xN37r+qA{Z<=IKAHBw6t%kG-)xHZ*lyxcNzG~&V3-Nm@rE83lr$Swjmd`1~ zRlej(MMJJQ{U-ER@0#q7-l~-1wIyS`lt`95JV5tztwt=qyZjfn_Nx66J@UP% zcWs|pMT;6`NGAhRk!nSd|NB|{{I{(;QB zSm<{xujz`F2;M?mJpNdI|Ph!4!7Ac(UEvY9kmoDiL-FBVJ!mp>nwJlEO#}TjR z&;0^vw5iS+R=XwA1f7`8X|%?ab1UBaeC=qDn_}E$JW67)Dx$+_%EM3jbw=-T_r*dR zUdMby7EXWXT?>83YqwE}Ga>uK#d^0IEfBfCZhwWl=hgG%Twie*L z&!w?d7d|l0RKTT(f3eA48X^q3mGBF2DW(}&UJQ&&3FqkX*1&Su=W5oZ7ciE)hkBTA z?;Iwp;BXcxd*yN*KmNbE&O5A$tZn%0T0s;$O106O(p!SU0s;~wfq+yI5kqL9cWlTi zO=_e@2qA<}q=e7{0z#yh5K3s$Yv{f0H|+Dg@AdxkohvgrXXa!wGs&ECm*0)$O6_w=lqg4C(Hd4cVjJVJ1w?`r06&tnl;C8v=k5)(!sZZ3ue&k@~J6EWAFCXKG{Gs z&&MLZUbQ)XHqX@btNKk zHoQ>mOQy)Xd)LjmMKgbqZ)N3L~`(`Ly(b?`L+aF_Fih*3Vr>hYjC6;?rUCch@h+O<19Nb(s7 z)60Bl^>C~dN8V&L4EVj+Sg$uWnr_s({5*~ZL!@ah#um_rJ^p<{#_ zxlNjC*mZ5Q4H+lVK*Paz6BCdW#Hw`3zD(wOXdZaU8LXAKZVw<<12dPiS#H<~Kg>M! zc!NpmuO{Ws8IjmXHcpV7R$DbBpO5mZuJ7qN&WCsE<`mS&mr|8Kd7|8OFps=q3wj4j zWhI!3-?BB;rBoR@HmM@rp7#={T=Y~>d%KjD+`!opGW)-;-yqV#Ie+ z74$ziI9$E0NJF_lGZv`lC+*x_09wt*SR0qK2!_!e0yWOTPErp`mG!fQ8^w25*hhWB zK}y`_dG9PBU#ooF8Z^V#4~y$&1YlZ1X6k`ie(6qCoE19#DFHIVS_gaD=vJOt;kyp1 z@ACL1?kAsmjkX5Z=)8@>&WWM1h~Qkx(fGQ4;Desso@!o*3`NIMB6>B|6mm^~>k|Rr zA&B`jQ2Ed!_yQ?JU3LPZaQU-Q+KcZ87fRf{tMLP26=m9&6QY@USn09IRKo#lmc#t5loGf-j}5r54Rit{1p?X#-Zln1o)7ehL;XG^Bik%pcn z$)S-*5G|mH(ikTYqM7GG+fY&x;?9e#|6Zvz#5J-+qPa{G%`FtzzQhFp!s8RzExfIh zE#rE+dT$DX29bIPJ`c!Nedj&Bv+4&EJeN0+e$HF>e{!<5w5vr8`7o;sG~8U~l|NFz zT$~Dq@m^_HZR4siZ(W51FuMU7JoXMkcgA z+-8L}81uMCf7L=&#?Ul$GwoEx+&lfvO9(lR6t=yVYfcmTuUvgC#%tb2y)d(EOeK>j zTGOE6b2u)Kp>jKFnA+j5F%<=-6odr8e)bM;7-JumKXnU8a;j1zrDSa~rF1?ri1^tr z5pw2APgi^wwr?6`bw?fg@7;*kK~S2 zv0Zpwn<(1QE8&0wcdE*xJg(#x=x<-$lE`f2@DOBv8s`w>7B^!4 z>TNp_nh=_wV(~nd2Dgp_e$f=fvd^ce@sv zWPv|5mM}2Jt%eHXm>-_f6ml_skr64=HMYK!_BManU$nwv3<>+}ZpFtN_-o%n;1oPb z&lx`zB%vLN;Xb2NrR?afxU6!%DO(qtch>lWE1?C=ktPka>!rWxj?9vzX3twY*e1a= z0}S3DssJTIoF!^bI~dcKh#DU~@AXms?j1w4=n*|6tp8zAonK|E${KaoI&$!iH=CVo zE3_zD`xW3vqbf+w%-`mD@R;R-_<(Lj^vQ=_=M&B3_xm)7N{yF7n1WN1VRMpr(iQ+& z$vfK{B0pynsOmNwuza1SuPQUEk72+^d$$_$F=cZFx+U*2))#vKxAp*EchFVyn&$it zsf&5*ph%74bKDU!MPW61?=y*gseaBD#b<709!>kmPbVc5yY@i@{pGhu_l!YoT+UI# zIfftaUft8&;XCj7thYdfoKlsXovN&_=hgIRB2A!>{QTPrUnk3LeM(SP(uy2%Q#K&{ z;^eKGHWZ?uxhe1$gKJ}Sx8~+i^xFRU6M~};fv~E_n)Nrwecc~#S!5p`X8_keuCM{w zHsi%_MhHEEi8`=6)G$MT%83xQ5+wYm-_!X$iOruk{H(iGp<@%M&}4h&2CPa{mtRk* z`4YM(-_6CU2cr;Zt<+K4YE=%1v@Hwv7AInF)4+K5V*+^GjA(4!jF5=V6q#OpQ6tt{ znNv_#-^1s@DM-D$g5X|}(EG~?iwR<}0bj=vQ#amvi8~k*p(R6rWx4^;Meyrw?&>iy z7C^J~hErfX$nlNE`+F=`**`u6tngUMZ%M-h1S{lul2;#`suT!o2#x+Z8g`5GMZ+)m z*aboL%ZsG|weDooL*XX0uej}}-#@s*r+B{>K7ITJtx3XXr>9lftrJ>l#uOq%bl z@~7@!DwTH05I(jY`vZt{dwg4EYajosj0a>1ALLB_LU0i?PHDwe#9y}5t@x9xCqUm; z9sMcS4{<0cQ2qqVs=v}8fAIZrZW?u9y8nCWpywvB*_B|1Y5>b-#?-GMcKMP#QaU)e z8?{655yWC@Wx0s!#GEfHEmg#|T|!OJU+~AE7k8)?oz%SXoB$&VLEe9^GXV1{1#qa0 z^u@Vs8&CQB>86TjXJ?`{Lp$e`6{YeUg;yiAi;bnIGz5`p-SISE>G?0zcqsHN;#>+9(>&m~C z?&bgT0D==rs$3tE?6yQawPyt0P_8w@cu8yNb=0*hmvlIia(wu0jc|<@XkU`QDOSa>_9q zf`pis^}I*L1hIF@8on_~_E`mSIC|Op2M61M)MG<%4uK0ly8|Qw`PF!QxWai#RS&eU zKt7=K)4bn3-&W@R(oe&Aj_AU&X-2E!HWO$ezF?UQAX1%k=~A-#Jaoc67W&TMf%41h z$eEa^hS$akye9J=&+UXuR{Esxp-549_e<}qog!O2+o&&=ZS*S09+qZq=$ZX!nq;03 zFpaWjHk2GT!Yj`uJF@cver#KoIWFgvMrya^3F9(oNui}(uKkvxRBeZ6bxW}2Y%mmM zc{4?Ki&Hx#oVV}gmM6hQnS^us?6pw@AT$)q-S*qvJ-ieMOs1sCYBmuTs+7I{qkY7q3TgP0XcvoZ2Nwryav9_F`TjI!np2ZMZ;FVe6HI+nJss(l9;M! z1?Ktd0hJPU^As}izHj34smHvdNH3cL=hvboua%7~u03wY3*6g#-qLAB)j5-~1Znb& zAluBv7s6wK`G$kls4 zaA=ZJ?l!fZYVG>ky|ZBcnenq!g;1&c--Z_-5c|g-xoVtlqqu9=a&4aueRp5W1#xfj z-tJ7*!WOr?ySfW~{kW79&K< zf0}OfFTJ>~q^t<3E2bM7wwH&R+(4nl=eyMNF`(1y>wV|tM}S#owd3lf7bPNnbbjz7 zLp}%fG$w8uT~y>>hPb!V@+x5TlVODJg*|gyddbEXm<;cR{==eRttUI3T<4-_&GUTj zFv}5#4^DHej>o+!>PzmZ9P(=K@*z1e;2|&KmawvuV;v#F>rMr`lXeWyl!VNS&aR<& zB>6_2jyqKdz0H@%Kt*i(18~2U9Ym{Lx&BD!cDJ<-J{8l|~tr@)ZJgs;Im<{x+KWMOPm`iz`ZjOv;E@L;Bz z8_3>q$RU9eF;}1&=3SgWah6Klb8}hJj@il>WO4#kP}_V_B(fKtta1nE4}%!u*<$fd z&srEQldG%a);5kq#$=j%c#>gXfB({X^AeDPdU;tjETr;1UdcZRrTS>oX%igJP|3o- zHn%k^re_mGWy{LC8+}y+lEAJ7r?``%qcr8eIO~@+GrZ(9H3Nk=E>O3yecN^_Ii2VX z)A8I&zIQ#HtxB@H`SktOH2HQ zR7omwBR<+ToeE(WJR1G&Bp>C#6~3K{BMr^NOY_Vt#@y$A?!flDY8H#am-dB*dV650 zX0b`(CRQF@Gu$$|l@+5&P84P7cwKMTlo-paFO!4swMU~&V*#V0(1fQ{vFcD+LwQwqBMkpn%V6g3ROF*N@dPJ_wx_#UYJF5R@Oys7Sk54z@D2OssyHEs-q$6LXV z_f<`jKZt6Sn6qv2kK0+rLIag_UhWw^kAop`|FF2P2Uso~Xb9rF(L);xhf$ukNca?z zweJJZ#F-|Ye4od^<=e+ghZ#=(dJJ7$+u4#DQqy{)NeoEHdjO>Is60Zrwp|t{+z|%M z|2R%A7BNU5udU5$t_OJ001FDf1G^&=bslbvAS-wuaPOecX{9RZiiiog!0^iwg8AtD zzHnx0m8eepMc+wG0$_24k*W5=LScO(cxy`NIh3^tMkAePCwnYA&?VF;9&-J10+V0M zOQ3SuGXk9d$*qUbZ#>(?f(B8eT?3#bgja&7(a>xoPD#Wa<`cU+mF(Ohw_Q`3 zPsTbpz~beoBRVs2XsOt+-Q*xTbKY{xGkxf36t5x_kLE+BTq<7VhLo3<^e)fSP-NoS z?hlLw;VBZp&$wA(ydGmu-;<{a?a$g3#W zlsE%}6y<5QOUJffp6mtp0Ar7vBVGyyWtJ28l$HIgE}B0pO|o~XqDMf7=m%fJDUq6V z_2vFyVKg(0GAo8-Qc!XVvtCQBC4g6N`wA_+4fdN#2~_2KpGlkOEZGk$!I{N#IOB~a zE!MaA_`NG!yk?N(%Y~TBhuQn~H_vQu_0hg6q>X;zXv1dmN2?7n*`hZBU-*cp9af$D-Z^^r>Q-w>)v& zln(oIIZ%QlF6nEBK%^yT2OLT;(5@tZ5Q7uzBT*qD_l^uf7BcnRl>=K~4yrxW=k=r4 zn=S`@cISi4FbFOIMe?xrQ*6i>6Pv;u3zopH9Gwv{aGLcXzl!zNz5GGMLPW{6CFfZr zFpjwAwC_QVaPV*zK2+d?Qr~u0t-=j(iL*QIAOAACmfLahd*>!ETsk!#r`r`)?;7cw zJm;7flwyI)>eCgInk_Efa%bocl$t0z`73)OjEEzR`hoWt_13^R;$Yu}W`7!Idph%b zADgNwMF+`kz6s7O3zuwDD_kEo_lpy#hf7MY+0#g5(Qbd?F6TUlMi|@(-Gv4l>hVOS zD)2I^vAKPfrTF2x+>|nzxau=ri!+D??)-2OlLB}`n7V$sLQB0!V1w?(cwA?^5&mQ^ z8sv?b=ZYkKFDQ`1eYFr0R0S%9)N^4S`bXq?Ek8 zyFd1;s!tw(s2!YMea3j@_LRxkJ*b|dgr^ zP(Fcn3!Vpv0O`cvkjwA)bg+Z_r@O~=sj$A(28bwhiT7-k;P=er^;Oj-zRxu}?TBQe zCw+KBJU(;AVSc3t8ivqN9qlhqaY5{BMW&Zaq-U9vt){KRjj$;b#9iLf(UQD7ewz~V zUh^_USh=xCJ=WzM=I5l7FtnST*G;JiJ@4;1o1Z0f9V45(Ivw?-P{hixxb)Ymx~|A` zKWjqE>kWwwm%lpmGN&Mnt`%}5LJ@}vmYK1lzo=motMbA8g-Ehw^BdNiofoYdzWE4d z#ac4Bu%!KEi%LeA!#Cq^HWHJ6c2Cu{dwd@;v@~Q$j7ZymlKZG3viV9VV#&WN9o0Fw za~Fl`>|Bx7a?Wnp6VM)Om|2oFEGHiulrC(^I6m(KJd#d52aMx^VF+O8%ypbSmYJ%* zQRhlKok;l279nq>-IJXum%Z_dfYZjxMd_<$)(=g2G2b5Wqp_A3? zIYq|_uMaM|1O{;B`26OYzp0jOrK-;CImxIItG5c;W!PhpGJD4E0 zOG$gV9TIl(i}8KioqI7V{(2EV^RK5>&Uq3>s)e>D(cCVND+nVNh`9NV1*5cpAfXoP z(7~`nJM(EI~>VH^fClszC>RsnA;!d%l%2I53 zW2ywpYFuUF&~3sV3#m6HO-qRogMEEeqOd9y7tw{Zre{ z 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 Z8-a5LNG?zR{;VE%l120+3;v&h{|6PwkZ=G1 literal 0 HcmV?d00001 From cac42e24a581915176816c680a61396855660b19 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Nov 2021 07:02:21 -0500 Subject: [PATCH 59/78] =?UTF-8?q?=F0=9F=94=A8=20Update=20git=20helper=20sc?= =?UTF-8?q?ripts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildroot/share/git/mffp | 14 +++++++++----- buildroot/share/git/mfinfo | 28 ++++++++++++++++------------ buildroot/share/git/mfnew | 6 +++--- buildroot/share/git/mfpr | 6 +++--- buildroot/share/git/mfqp | 4 ++-- buildroot/share/git/mfrb | 4 ++-- 6 files changed, 35 insertions(+), 27 deletions(-) diff --git a/buildroot/share/git/mffp b/buildroot/share/git/mffp index 2663a4a1374e..0680b3dba562 100755 --- a/buildroot/share/git/mffp +++ b/buildroot/share/git/mffp @@ -1,19 +1,23 @@ #!/usr/bin/env bash # -# mffp [1|2|3] [commit-id] +# mffp [1|2] [ref] # # Push the given commit (or HEAD) upstream immediately. -# By default: `git push upstream HEAD:bugfix-1.1.x` +# By default: `git push upstream HEAD:bugfix-2.0.x` # -[[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { echo "usage: `basename $0` [1|2|3] [commit-id]" 1>&2 ; exit 1; } +usage() { echo "usage: `basename $0` [1|2] [ref]" 1>&2 } -if [[ $1 == '1' || $1 == '2' || $1 == '3' ]]; then +[[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { usage ; exit 1; } + +if [[ $1 == '1' || $1 == '2' ]]; then MFINFO=$(mfinfo "$1") || exit 1 REF=${2:-HEAD} -else +elif [[ $# == 1 ]]; then MFINFO=$(mfinfo) || exit 1 REF=${1:-HEAD} +else + usage fi IFS=' ' read -a INFO <<< "$MFINFO" diff --git a/buildroot/share/git/mfinfo b/buildroot/share/git/mfinfo index 0f5d79a002b3..0c2113d92293 100755 --- a/buildroot/share/git/mfinfo +++ b/buildroot/share/git/mfinfo @@ -2,15 +2,19 @@ # # mfinfo # -# Provide the following info about the working directory: +# Print the following info about the working copy: # # - Remote (upstream) Org name (MarlinFirmware) # - Remote (origin) Org name (your Github username) # - Repo Name (Marlin, MarlinDocumentation) -# - PR Target branch (bugfix-1.1.x, bugfix-2.0.x, dev-2.1.x, etc.) +# - PR Target branch (e.g., bugfix-2.0.x) # - Branch Arg (the branch argument or current branch) # - Current Branch # +# Example output +# > mfinfo -q ongoing +# MarlinFirmware john.doe Marlin bugfix-2.0.x ongoing bugfix-2.0.x -q +# CURR=$(git branch 2>/dev/null | grep ^* | sed 's/\* //g') [[ -z $CURR ]] && { echo "No git repository here!" 1>&2 ; exit 1; } @@ -26,37 +30,37 @@ FORK=$(git remote get-url origin 2>/dev/null | sed -E 's/.*[\/:](.*)\/.*$/\1/') # Defaults if no arguments given BRANCH=$CURR -INDEX=1 +MORE="" +INDEX=2 +# Loop through arguments while [[ $# -gt 0 ]]; do + # Get an arg and maybe a val to go with it opt="$1" ; shift ; val="$1" + # Split up an arg containing = IFS='=' read -a PARTS <<<"$opt" [[ "${PARTS[1]}" != "" ]] && { EQUALS=1 ; opt="${PARTS[0]}" ; val="${PARTS[1]}" ; } - GOODVAL=1 if [[ "$val" =~ ^-{1,2}.* || ! "$opt" =~ ^-{1,2}.* ]]; then - GOODVAL=0 val="" fi case "$opt" in - -*|--*) MORE="$MORE$opt " ; [[ $EQUALS == 1 ]] && MORE="$MORE=$val" ;; - 1|2|3) INDEX=$opt ;; + -*|--*) MORE=" $MORE$opt" ; ((EQUALS)) && MORE="$MORE=$val" ;; + 1|2) INDEX=$opt ;; *) BRANCH="$opt" ;; esac done case "$REPO" in - Marlin ) TARG=bugfix-2.0.x ; [[ $INDEX == 1 ]] && TARG=bugfix-1.1.x ; [[ $INDEX == 3 ]] && TARG=dev-2.1.x ;; + Marlin ) TARG=bugfix-2.0.x ; ((INDEX == 1)) && TARG=bugfix-1.1.x ; [[ $BRANCH =~ ^[12]$ ]] && USAGE=1 ;; Configurations ) TARG=import-2.0.x ;; MarlinDocumentation ) TARG=master ;; AutoBuildMarlin ) TARG=master ;; esac -[[ $BRANCH =~ ^[123]$ ]] && USAGE=1 - -[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3] [branch]" 1>&2 ; exit 1 ; } +[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2] [branch]" 1>&2 ; exit 1 ; } -echo "$ORG $FORK $REPO $TARG $BRANCH $CURR $MORE" +echo "$ORG $FORK $REPO $TARG $BRANCH $CURR$MORE" diff --git a/buildroot/share/git/mfnew b/buildroot/share/git/mfnew index e491fea19103..6d067a7f08e6 100755 --- a/buildroot/share/git/mfnew +++ b/buildroot/share/git/mfnew @@ -6,7 +6,7 @@ # usage() { - echo "usage: `basename $0` [1|2|3] [name]" 1>&2 + echo "usage: `basename $0` [1|2] [name]" 1>&2 } [[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { usage; exit 1; } @@ -19,12 +19,12 @@ BRANCH=pr_for_$TARG-$(date +"%G-%m-%d_%H.%M.%S") # BRANCH can be given as the last argument case "$#" in 1 ) case "$1" in - 1|2|3) ;; + 1|2) ;; *) BRANCH=$1 ;; esac ;; 2 ) case "$1" in - 1|2|3) BRANCH=$2 ;; + 1|2) BRANCH=$2 ;; *) usage ; exit 1 ;; esac ;; diff --git a/buildroot/share/git/mfpr b/buildroot/share/git/mfpr index b853c6929e44..230bd2886cf4 100755 --- a/buildroot/share/git/mfpr +++ b/buildroot/share/git/mfpr @@ -1,11 +1,11 @@ #!/usr/bin/env bash # -# mfpr [1|2|3] +# mfpr [1|2] # -# Make a PR against bugfix-1.1.x or bugfix-2.0.x +# Make a PR targeted to MarlinFirmware/[repo] # -[[ $# < 2 && $1 != "-h" && $1 != "--help" ]] || { echo "usage: `basename $0` [1|2|3] [branch]" 1>&2 ; exit 1; } +[[ $# < 2 && $1 != "-h" && $1 != "--help" ]] || { echo "usage: `basename $0` [1|2] [branch]" 1>&2 ; exit 1; } MFINFO=$(mfinfo "$@") || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" diff --git a/buildroot/share/git/mfqp b/buildroot/share/git/mfqp index f0c4446a211e..6e36e6113a1a 100755 --- a/buildroot/share/git/mfqp +++ b/buildroot/share/git/mfqp @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# mfqp [1|2|3] +# mfqp [1|2] # # - git add . # - git commit --amend @@ -24,7 +24,7 @@ while [ $IND -lt ${#INFO[@]} ]; do let IND+=1 done -[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3]" 1>&2 ; exit 1 ; } +[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2]" 1>&2 ; exit 1 ; } [[ $FORCE != 1 && $CURR == $TARG && $REPO != "MarlinDocumentation" ]] && { echo "Don't alter the PR Target branch."; exit 1 ; } diff --git a/buildroot/share/git/mfrb b/buildroot/share/git/mfrb index 071b0b3d5989..b55a34e0100d 100755 --- a/buildroot/share/git/mfrb +++ b/buildroot/share/git/mfrb @@ -2,7 +2,7 @@ # # mfrb # -# Do "git rebase -i" against the "target" branch (bugfix-1.1.x, bugfix-2.0.x, dev-2.1.x, or master) +# Do "git rebase -i" against the repo's "target" branch # MFINFO=$(mfinfo "$@") || exit 1 @@ -21,7 +21,7 @@ while [ $IND -lt ${#INFO[@]} ]; do let IND+=1 done -[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3]" 1>&2 ; exit 1 ; } +[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2]" 1>&2 ; exit 1 ; } [[ $QUICK ]] || git fetch upstream git rebase upstream/$TARG && git rebase -i upstream/$TARG From 02b6fb8025ef82c2d1290cdc1a98bc0c54f502c9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Nov 2021 07:06:31 -0500 Subject: [PATCH 60/78] =?UTF-8?q?=F0=9F=94=A8=20Script=20'mfprep'=20finds?= =?UTF-8?q?=20pending=20commits?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildroot/share/git/mfprep | 64 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 buildroot/share/git/mfprep diff --git a/buildroot/share/git/mfprep b/buildroot/share/git/mfprep new file mode 100755 index 000000000000..7a8e05ee317c --- /dev/null +++ b/buildroot/share/git/mfprep @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# +# mfprep tag1 [tag2] +# +# Find commits in bugfix-2.0.x not yet in 2.0.x +# + +SED=$(which gsed sed | head -n1) +SELF=`basename "$0"` + +[[ $# < 1 || $# > 2 ]] && { echo "Usage $SELF tag1 [tag2]" ; exit 1 ; } + +TAG1=$1 +TAG2=${2:-"HEAD"} + +# Validate that the required tags exist + +MTAG=`git tag | grep -e "^bf-$TAG1\$"` +[[ -n $MTAG ]] || { echo "Can't find tag bf-$TAG1" ; exit 1 ; } +MTAG=`git tag | grep -e "^$TAG1\$"` +[[ -n $MTAG ]] || { echo "Can't find tag $TAG1" ; exit 1 ; } + +# Generate log of recent commits for bugfix-2.0.x and 2.0.x + +TMPDIR=`mktemp -d` +LOGB="$TMPDIR/log-bf.txt" +LOG2="$TMPDIR/log-20x.txt" +TMPF="$TMPDIR/tmp.txt" +SCRF="$TMPDIR/update-20x.sh" + +git checkout bugfix-2.0.x +git log --pretty="[%h] %s" bf-$TAG1..$TAG2 | grep -v '\[cron\]' | $SED '1!G;h;$!d' >"$LOGB" + +git checkout 2.0.x +git log --pretty="[%h] %s" $TAG1..$TAG2 | $SED '1!G;h;$!d' >"$LOG2" || { echo "Can't find tag bf-$TAG1" ; exit 1 ; } + +# Go through commit text from 2.0.x removing all matches from the bugfix log + +cat "$LOG2" | while read line; do + #echo "... $line" + if [[ $line =~ (\(#[0-9]{5}\))$ ]]; then + PATT=${BASH_REMATCH[1]} + #echo "... $PATT" + else + PATT=$( $SED -E 's/^\[[0-9a-f]{10}\]( . )?(.+)$/\2/' <<<"$line" ) + fi + [[ -n $PATT ]] && { grep -v "$PATT" "$LOGB" >"$TMPF" ; cp "$TMPF" "$LOGB" ; } +done + +# Convert remaining commits into git commands + +echo -e "#!/usr/bin/env bash\nset -e\ngit checkout 2.0.x\n" >"$TMPF" +cat "$LOGB" | while read line; do + if [[ $line =~ ^\[([0-9a-f]{10})\]\ *(.*)$ ]]; then + CID=${BASH_REMATCH[1]} + REST=${BASH_REMATCH[2]} + echo "git cherry-pick $CID ;# $REST" >>"$TMPF" + else + echo ";# $line" >>"$TMPF" + fi +done +mv "$TMPF" "$SCRF" + +open "$TMPDIR" From fef96bb556f19bf1e132368ec0675d1d2b12634d Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 4 Nov 2021 01:00:55 +0000 Subject: [PATCH 61/78] [cron] Bump distribution date (2021-11-04) --- 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 68c7d052990c..e562730ae3f6 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 "2021-11-03" +//#define STRING_DISTRIBUTION_DATE "2021-11-04" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 1e1977671b5b..f695d0a1b24a 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 "2021-11-03" + #define STRING_DISTRIBUTION_DATE "2021-11-04" #endif /** From 399faa91b99dab0f8565396efd32f277965c93b2 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Thu, 4 Nov 2021 14:04:06 +1300 Subject: [PATCH 62/78] =?UTF-8?q?=F0=9F=93=8C=20'STOP'=20auto-assign,=20so?= =?UTF-8?q?me=20Chitu=20V9=20pins=20(#22889)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/src/core/macros.h | 6 ++ Marlin/src/inc/Conditionals_post.h | 70 +++++++++++++++++++++-- Marlin/src/inc/Warnings.cpp | 48 ++++++++++++++++ Marlin/src/pins/pins_postprocess.h | 23 +++++++- Marlin/src/pins/stm32f1/pins_CHITU3D_V9.h | 4 ++ 5 files changed, 143 insertions(+), 8 deletions(-) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index d8a15b910df7..62675d131972 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -33,6 +33,12 @@ #define _AXIS(A) (A##_AXIS) +#define _XSTOP_ 0x01 +#define _YSTOP_ 0x02 +#define _ZSTOP_ 0x03 +#define _ISTOP_ 0x04 +#define _JSTOP_ 0x05 +#define _KSTOP_ 0x06 #define _XMIN_ 0x11 #define _YMIN_ 0x12 #define _ZMIN_ 0x13 diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index c8b6d504e294..8008461547ce 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -769,19 +769,25 @@ #define X2_MAX_ENDSTOP_INVERTING false #endif #endif - #ifndef X2_MAX_PIN + #if !defined(X2_MAX_PIN) && !defined(X2_STOP_PIN) #if X2_USE_ENDSTOP == _XMIN_ #define X2_MAX_PIN X_MIN_PIN #elif X2_USE_ENDSTOP == _XMAX_ #define X2_MAX_PIN X_MAX_PIN + #elif X2_USE_ENDSTOP == _XSTOP_ + #define X2_MAX_PIN X_STOP_PIN #elif X2_USE_ENDSTOP == _YMIN_ #define X2_MAX_PIN Y_MIN_PIN #elif X2_USE_ENDSTOP == _YMAX_ #define X2_MAX_PIN Y_MAX_PIN + #elif X2_USE_ENDSTOP == _YSTOP_ + #define X2_MAX_PIN Y_STOP_PIN #elif X2_USE_ENDSTOP == _ZMIN_ #define X2_MAX_PIN Z_MIN_PIN #elif X2_USE_ENDSTOP == _ZMAX_ #define X2_MAX_PIN Z_MAX_PIN + #elif X2_USE_ENDSTOP == _ZSTOP_ + #define X2_MAX_PIN Z_STOP_PIN #elif X2_USE_ENDSTOP == _XDIAG_ #define X2_MAX_PIN X_DIAG_PIN #elif X2_USE_ENDSTOP == _YDIAG_ @@ -827,19 +833,25 @@ #define X2_MIN_ENDSTOP_INVERTING false #endif #endif - #ifndef X2_MIN_PIN + #if !defined(X2_MIN_PIN) && !defined(X2_STOP_PIN) #if X2_USE_ENDSTOP == _XMIN_ #define X2_MIN_PIN X_MIN_PIN #elif X2_USE_ENDSTOP == _XMAX_ #define X2_MIN_PIN X_MAX_PIN + #elif X2_USE_ENDSTOP == _XSTOP_ + #define X2_MIN_PIN X_STOP_PIN #elif X2_USE_ENDSTOP == _YMIN_ #define X2_MIN_PIN Y_MIN_PIN #elif X2_USE_ENDSTOP == _YMAX_ #define X2_MIN_PIN Y_MAX_PIN + #elif X2_USE_ENDSTOP == _YSTOP_ + #define X2_MIN_PIN Y_STOP_PIN #elif X2_USE_ENDSTOP == _ZMIN_ #define X2_MIN_PIN Z_MIN_PIN #elif X2_USE_ENDSTOP == _ZMAX_ #define X2_MIN_PIN Z_MAX_PIN + #elif X2_USE_ENDSTOP == _ZSTOP_ + #define X2_MIN_PIN Z_STOP_PIN #elif X2_USE_ENDSTOP == _XDIAG_ #define X2_MIN_PIN X_DIAG_PIN #elif X2_USE_ENDSTOP == _YDIAG_ @@ -892,19 +904,25 @@ #define Y2_MAX_ENDSTOP_INVERTING false #endif #endif - #ifndef Y2_MAX_PIN + #if !defined(Y2_MAX_PIN) && !defined(Y2_STOP_PIN) #if Y2_USE_ENDSTOP == _XMIN_ #define Y2_MAX_PIN X_MIN_PIN #elif Y2_USE_ENDSTOP == _XMAX_ #define Y2_MAX_PIN X_MAX_PIN + #elif Y2_USE_ENDSTOP == _XSTOP_ + #define Y2_MAX_PIN X_STOP_PIN #elif Y2_USE_ENDSTOP == _YMIN_ #define Y2_MAX_PIN Y_MIN_PIN #elif Y2_USE_ENDSTOP == _YMAX_ #define Y2_MAX_PIN Y_MAX_PIN + #elif Y2_USE_ENDSTOP == _YSTOP_ + #define Y2_MAX_PIN Y_STOP_PIN #elif Y2_USE_ENDSTOP == _ZMIN_ #define Y2_MAX_PIN Z_MIN_PIN #elif Y2_USE_ENDSTOP == _ZMAX_ #define Y2_MAX_PIN Z_MAX_PIN + #elif Y2_USE_ENDSTOP == _ZSTOP_ + #define Y2_MAX_PIN Z_STOP_PIN #elif Y2_USE_ENDSTOP == _XDIAG_ #define Y2_MAX_PIN X_DIAG_PIN #elif Y2_USE_ENDSTOP == _YDIAG_ @@ -950,19 +968,25 @@ #define Y2_MIN_ENDSTOP_INVERTING false #endif #endif - #ifndef Y2_MIN_PIN + #if !defined(Y2_MIN_PIN) && !defined(Y2_STOP_PIN) #if Y2_USE_ENDSTOP == _XMIN_ #define Y2_MIN_PIN X_MIN_PIN #elif Y2_USE_ENDSTOP == _XMAX_ #define Y2_MIN_PIN X_MAX_PIN + #elif Y2_USE_ENDSTOP == _XSTOP_ + #define Y2_MIN_PIN X_STOP_PIN #elif Y2_USE_ENDSTOP == _YMIN_ #define Y2_MIN_PIN Y_MIN_PIN #elif Y2_USE_ENDSTOP == _YMAX_ #define Y2_MIN_PIN Y_MAX_PIN + #elif Y2_USE_ENDSTOP == _YSTOP_ + #define Y2_MIN_PIN Y_STOP_PIN #elif Y2_USE_ENDSTOP == _ZMIN_ #define Y2_MIN_PIN Z_MIN_PIN #elif Y2_USE_ENDSTOP == _ZMAX_ #define Y2_MIN_PIN Z_MAX_PIN + #elif Y2_USE_ENDSTOP == _ZSTOP_ + #define Y2_MIN_PIN Z_STOP_PIN #elif Y2_USE_ENDSTOP == _XDIAG_ #define Y2_MIN_PIN X_DIAG_PIN #elif Y2_USE_ENDSTOP == _YDIAG_ @@ -1016,19 +1040,25 @@ #define Z2_MAX_ENDSTOP_INVERTING false #endif #endif - #ifndef Z2_MAX_PIN + #if !defined(Z2_MAX_PIN) && !defined(Z2_STOP_PIN) #if Z2_USE_ENDSTOP == _XMIN_ #define Z2_MAX_PIN X_MIN_PIN #elif Z2_USE_ENDSTOP == _XMAX_ #define Z2_MAX_PIN X_MAX_PIN + #elif Z2_USE_ENDSTOP == _XSTOP_ + #define Z2_MAX_PIN X_STOP_PIN #elif Z2_USE_ENDSTOP == _YMIN_ #define Z2_MAX_PIN Y_MIN_PIN #elif Z2_USE_ENDSTOP == _YMAX_ #define Z2_MAX_PIN Y_MAX_PIN + #elif Z2_USE_ENDSTOP == _YSTOP_ + #define Z2_MAX_PIN Y_STOP_PIN #elif Z2_USE_ENDSTOP == _ZMIN_ #define Z2_MAX_PIN Z_MIN_PIN #elif Z2_USE_ENDSTOP == _ZMAX_ #define Z2_MAX_PIN Z_MAX_PIN + #elif Z2_USE_ENDSTOP == _ZSTOP_ + #define Z2_MAX_PIN Z_STOP_PIN #elif Z2_USE_ENDSTOP == _XDIAG_ #define Z2_MAX_PIN X_DIAG_PIN #elif Z2_USE_ENDSTOP == _YDIAG_ @@ -1079,14 +1109,20 @@ #define Z2_MIN_PIN X_MIN_PIN #elif Z2_USE_ENDSTOP == _XMAX_ #define Z2_MIN_PIN X_MAX_PIN + #elif Z2_USE_ENDSTOP == _XSTOP_ + #define Z2_MIN_PIN X_STOP_PIN #elif Z2_USE_ENDSTOP == _YMIN_ #define Z2_MIN_PIN Y_MIN_PIN #elif Z2_USE_ENDSTOP == _YMAX_ #define Z2_MIN_PIN Y_MAX_PIN + #elif Z2_USE_ENDSTOP == _YSTOP_ + #define Z2_MIN_PIN Y_STOP_PIN #elif Z2_USE_ENDSTOP == _ZMIN_ #define Z2_MIN_PIN Z_MIN_PIN #elif Z2_USE_ENDSTOP == _ZMAX_ #define Z2_MIN_PIN Z_MAX_PIN + #elif Z2_USE_ENDSTOP == _ZSTOP_ + #define Z2_MIN_PIN Z_STOP_PIN #elif Z2_USE_ENDSTOP == _XDIAG_ #define Z2_MIN_PIN X_DIAG_PIN #elif Z2_USE_ENDSTOP == _YDIAG_ @@ -1140,14 +1176,20 @@ #define Z3_MAX_PIN X_MIN_PIN #elif Z3_USE_ENDSTOP == _XMAX_ #define Z3_MAX_PIN X_MAX_PIN + #elif Z3_USE_ENDSTOP == _XSTOP_ + #define Z3_MAX_PIN X_STOP_PIN #elif Z3_USE_ENDSTOP == _YMIN_ #define Z3_MAX_PIN Y_MIN_PIN #elif Z3_USE_ENDSTOP == _YMAX_ #define Z3_MAX_PIN Y_MAX_PIN + #elif Z3_USE_ENDSTOP == _YSTOP_ + #define Z3_MAX_PIN Y_STOP_PIN #elif Z3_USE_ENDSTOP == _ZMIN_ #define Z3_MAX_PIN Z_MIN_PIN #elif Z3_USE_ENDSTOP == _ZMAX_ #define Z3_MAX_PIN Z_MAX_PIN + #elif Z3_USE_ENDSTOP == _ZSTOP_ + #define Z3_MAX_PIN Z_STOP_PIN #elif Z3_USE_ENDSTOP == _XDIAG_ #define Z3_MAX_PIN X_DIAG_PIN #elif Z3_USE_ENDSTOP == _YDIAG_ @@ -1198,14 +1240,20 @@ #define Z3_MIN_PIN X_MIN_PIN #elif Z3_USE_ENDSTOP == _XMAX_ #define Z3_MIN_PIN X_MAX_PIN + #elif Z3_USE_ENDSTOP == _XSTOP_ + #define Z3_MIN_PIN X_STOP_PIN #elif Z3_USE_ENDSTOP == _YMIN_ #define Z3_MIN_PIN Y_MIN_PIN #elif Z3_USE_ENDSTOP == _YMAX_ #define Z3_MIN_PIN Y_MAX_PIN + #elif Z3_USE_ENDSTOP == _YSTOP_ + #define Z3_MIN_PIN Y_STOP_PIN #elif Z3_USE_ENDSTOP == _ZMIN_ #define Z3_MIN_PIN Z_MIN_PIN #elif Z3_USE_ENDSTOP == _ZMAX_ #define Z3_MIN_PIN Z_MAX_PIN + #elif Z3_USE_ENDSTOP == _ZSTOP_ + #define Z3_MIN_PIN Z_STOP_PIN #elif Z3_USE_ENDSTOP == _XDIAG_ #define Z3_MIN_PIN X_DIAG_PIN #elif Z3_USE_ENDSTOP == _YDIAG_ @@ -1260,14 +1308,20 @@ #define Z4_MAX_PIN X_MIN_PIN #elif Z4_USE_ENDSTOP == _XMAX_ #define Z4_MAX_PIN X_MAX_PIN + #elif Z4_USE_ENDSTOP == _XSTOP_ + #define Z4_MAX_PIN X_STOP_PIN #elif Z4_USE_ENDSTOP == _YMIN_ #define Z4_MAX_PIN Y_MIN_PIN #elif Z4_USE_ENDSTOP == _YMAX_ #define Z4_MAX_PIN Y_MAX_PIN + #elif Z4_USE_ENDSTOP == _YSTOP_ + #define Z4_MAX_PIN Y_STOP_PIN #elif Z4_USE_ENDSTOP == _ZMIN_ #define Z4_MAX_PIN Z_MIN_PIN #elif Z4_USE_ENDSTOP == _ZMAX_ #define Z4_MAX_PIN Z_MAX_PIN + #elif Z4_USE_ENDSTOP == _ZSTOP_ + #define Z4_MAX_PIN Z_STOP_PIN #elif Z4_USE_ENDSTOP == _XDIAG_ #define Z4_MAX_PIN X_DIAG_PIN #elif Z4_USE_ENDSTOP == _YDIAG_ @@ -1318,14 +1372,20 @@ #define Z4_MIN_PIN X_MIN_PIN #elif Z4_USE_ENDSTOP == _XMAX_ #define Z4_MIN_PIN X_MAX_PIN + #elif Z4_USE_ENDSTOP == _XSTOP_ + #define Z4_MIN_PIN X_STOP_PIN #elif Z4_USE_ENDSTOP == _YMIN_ #define Z4_MIN_PIN Y_MIN_PIN #elif Z4_USE_ENDSTOP == _YMAX_ #define Z4_MIN_PIN Y_MAX_PIN + #elif Z4_USE_ENDSTOP == _YSTOP_ + #define Z4_MIN_PIN Y_STOP_PIN #elif Z4_USE_ENDSTOP == _ZMIN_ #define Z4_MIN_PIN Z_MIN_PIN #elif Z4_USE_ENDSTOP == _ZMAX_ #define Z4_MIN_PIN Z_MAX_PIN + #elif Z4_USE_ENDSTOP == _ZSTOP_ + #define Z4_MIN_PIN Z_STOP_PIN #elif Z4_USE_ENDSTOP == _XDIAG_ #define Z4_MIN_PIN X_DIAG_PIN #elif Z4_USE_ENDSTOP == _YDIAG_ diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index 251094901051..1976c0958160 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -79,14 +79,20 @@ #warning "Auto-assigned X2_DIAG_PIN to X_MIN_PIN." #elif X2_USE_ENDSTOP == _XMAX_ #warning "Auto-assigned X2_DIAG_PIN to X_MAX_PIN." + #elif X2_USE_ENDSTOP == _XSTOP_ + #warning "Auto-assigned X2_DIAG_PIN to X_STOP_PIN." #elif X2_USE_ENDSTOP == _YMIN_ #warning "Auto-assigned X2_DIAG_PIN to Y_MIN_PIN." #elif X2_USE_ENDSTOP == _YMAX_ #warning "Auto-assigned X2_DIAG_PIN to Y_MAX_PIN." + #elif X2_USE_ENDSTOP == _YSTOP_ + #warning "Auto-assigned X2_DIAG_PIN to Y_STOP_PIN." #elif X2_USE_ENDSTOP == _ZMIN_ #warning "Auto-assigned X2_DIAG_PIN to Z_MIN_PIN." #elif X2_USE_ENDSTOP == _ZMAX_ #warning "Auto-assigned X2_DIAG_PIN to Z_MAX_PIN." + #elif X2_USE_ENDSTOP == _ZSTOP_ + #warning "Auto-assigned X2_DIAG_PIN to Z_STOP_PIN." #elif X2_USE_ENDSTOP == _XDIAG_ #warning "Auto-assigned X2_DIAG_PIN to X_DIAG_PIN." #elif X2_USE_ENDSTOP == _YDIAG_ @@ -131,14 +137,20 @@ #warning "Auto-assigned Y2_DIAG_PIN to X_MIN_PIN." #elif Y2_USE_ENDSTOP == _XMAX_ #warning "Auto-assigned Y2_DIAG_PIN to X_MAX_PIN." + #elif Y2_USE_ENDSTOP == _XSTOP_ + #warning "Auto-assigned Y2_DIAG_PIN to X_STOP_PIN." #elif Y2_USE_ENDSTOP == _YMIN_ #warning "Auto-assigned Y2_DIAG_PIN to Y_MIN_PIN." #elif Y2_USE_ENDSTOP == _YMAX_ #warning "Auto-assigned Y2_DIAG_PIN to Y_MAX_PIN." + #elif Y2_USE_ENDSTOP == _YSTOP_ + #warning "Auto-assigned Y2_DIAG_PIN to Y_STOP_PIN." #elif Y2_USE_ENDSTOP == _ZMIN_ #warning "Auto-assigned Y2_DIAG_PIN to Z_MIN_PIN." #elif Y2_USE_ENDSTOP == _ZMAX_ #warning "Auto-assigned Y2_DIAG_PIN to Z_MAX_PIN." + #elif Y2_USE_ENDSTOP == _ZSTOP_ + #warning "Auto-assigned Y2_DIAG_PIN to Z_STOP_PIN." #elif Y2_USE_ENDSTOP == _XDIAG_ #warning "Auto-assigned Y2_DIAG_PIN to X_DIAG_PIN." #elif Y2_USE_ENDSTOP == _YDIAG_ @@ -183,14 +195,20 @@ #warning "Auto-assigned Z2_DIAG_PIN to X_MIN_PIN." #elif Z2_USE_ENDSTOP == _XMAX_ #warning "Auto-assigned Z2_DIAG_PIN to X_MAX_PIN." + #elif Z2_USE_ENDSTOP == _XSTOP_ + #warning "Auto-assigned Z2_DIAG_PIN to X_STOP_PIN." #elif Z2_USE_ENDSTOP == _YMIN_ #warning "Auto-assigned Z2_DIAG_PIN to Y_MIN_PIN." #elif Z2_USE_ENDSTOP == _YMAX_ #warning "Auto-assigned Z2_DIAG_PIN to Y_MAX_PIN." + #elif Z2_USE_ENDSTOP == _YSTOP_ + #warning "Auto-assigned Z2_DIAG_PIN to Y_STOP_PIN." #elif Z2_USE_ENDSTOP == _ZMIN_ #warning "Auto-assigned Z2_DIAG_PIN to Z_MIN_PIN." #elif Z2_USE_ENDSTOP == _ZMAX_ #warning "Auto-assigned Z2_DIAG_PIN to Z_MAX_PIN." + #elif Z2_USE_ENDSTOP == _ZSTOP_ + #warning "Auto-assigned Z2_DIAG_PIN to Z_STOP_PIN." #elif Z2_USE_ENDSTOP == _XDIAG_ #warning "Auto-assigned Z2_DIAG_PIN to X_DIAG_PIN." #elif Z2_USE_ENDSTOP == _YDIAG_ @@ -235,14 +253,20 @@ #warning "Auto-assigned Z3_DIAG_PIN to X_MIN_PIN." #elif Z3_USE_ENDSTOP == _XMAX_ #warning "Auto-assigned Z3_DIAG_PIN to X_MAX_PIN." + #elif Z3_USE_ENDSTOP == _XSTOP_ + #warning "Auto-assigned Z3_DIAG_PIN to X_STOP_PIN." #elif Z3_USE_ENDSTOP == _YMIN_ #warning "Auto-assigned Z3_DIAG_PIN to Y_MIN_PIN." #elif Z3_USE_ENDSTOP == _YMAX_ #warning "Auto-assigned Z3_DIAG_PIN to Y_MAX_PIN." + #elif Z3_USE_ENDSTOP == _YSTOP_ + #warning "Auto-assigned Z3_DIAG_PIN to Y_STOP_PIN." #elif Z3_USE_ENDSTOP == _ZMIN_ #warning "Auto-assigned Z3_DIAG_PIN to Z_MIN_PIN." #elif Z3_USE_ENDSTOP == _ZMAX_ #warning "Auto-assigned Z3_DIAG_PIN to Z_MAX_PIN." + #elif Z3_USE_ENDSTOP == _ZSTOP_ + #warning "Auto-assigned Z3_DIAG_PIN to Z_STOP_PIN." #elif Z3_USE_ENDSTOP == _XDIAG_ #warning "Auto-assigned Z3_DIAG_PIN to X_DIAG_PIN." #elif Z3_USE_ENDSTOP == _YDIAG_ @@ -287,14 +311,20 @@ #warning "Auto-assigned Z4_DIAG_PIN to X_MIN_PIN." #elif Z4_USE_ENDSTOP == _XMAX_ #warning "Auto-assigned Z4_DIAG_PIN to X_MAX_PIN." + #elif Z4_USE_ENDSTOP == _XSTOP_ + #warning "Auto-assigned Z4_DIAG_PIN to X_STOP_PIN." #elif Z4_USE_ENDSTOP == _YMIN_ #warning "Auto-assigned Z4_DIAG_PIN to Y_MIN_PIN." #elif Z4_USE_ENDSTOP == _YMAX_ #warning "Auto-assigned Z4_DIAG_PIN to Y_MAX_PIN." + #elif Z4_USE_ENDSTOP == _YSTOP_ + #warning "Auto-assigned Z4_DIAG_PIN to Y_STOP_PIN." #elif Z4_USE_ENDSTOP == _ZMIN_ #warning "Auto-assigned Z4_DIAG_PIN to Z_MIN_PIN." #elif Z4_USE_ENDSTOP == _ZMAX_ #warning "Auto-assigned Z4_DIAG_PIN to Z_MAX_PIN." + #elif Z4_USE_ENDSTOP == _ZSTOP_ + #warning "Auto-assigned Z4_DIAG_PIN to Z_STOP_PIN." #elif Z4_USE_ENDSTOP == _XDIAG_ #warning "Auto-assigned Z4_DIAG_PIN to X_DIAG_PIN." #elif Z4_USE_ENDSTOP == _YDIAG_ @@ -339,14 +369,20 @@ #warning "Auto-assigned I_DIAG_PIN to X_MIN_PIN." #elif I_USE_ENDSTOP == _XMAX_ #warning "Auto-assigned I_DIAG_PIN to X_MAX_PIN." + #elif I_USE_ENDSTOP == _XSTOP_ + #warning "Auto-assigned I_DIAG_PIN to X_STOP_PIN." #elif I_USE_ENDSTOP == _YMIN_ #warning "Auto-assigned I_DIAG_PIN to Y_MIN_PIN." #elif I_USE_ENDSTOP == _YMAX_ #warning "Auto-assigned I_DIAG_PIN to Y_MAX_PIN." + #elif I_USE_ENDSTOP == _YSTOP_ + #warning "Auto-assigned I_DIAG_PIN to Y_STOP_PIN." #elif I_USE_ENDSTOP == _ZMIN_ #warning "Auto-assigned I_DIAG_PIN to Z_MIN_PIN." #elif I_USE_ENDSTOP == _ZMAX_ #warning "Auto-assigned I_DIAG_PIN to Z_MAX_PIN." + #elif I_USE_ENDSTOP == _ZSTOP_ + #warning "Auto-assigned I_DIAG_PIN to Z_STOP_PIN." #elif I_USE_ENDSTOP == _XDIAG_ #warning "Auto-assigned I_DIAG_PIN to X_DIAG_PIN." #elif I_USE_ENDSTOP == _YDIAG_ @@ -391,14 +427,20 @@ #warning "Auto-assigned J_DIAG_PIN to X_MIN_PIN." #elif J_USE_ENDSTOP == _XMAX_ #warning "Auto-assigned J_DIAG_PIN to X_MAX_PIN." + #elif J_USE_ENDSTOP == _XSTOP_ + #warning "Auto-assigned J_DIAG_PIN to X_STOP_PIN." #elif J_USE_ENDSTOP == _YMIN_ #warning "Auto-assigned J_DIAG_PIN to Y_MIN_PIN." #elif J_USE_ENDSTOP == _YMAX_ #warning "Auto-assigned J_DIAG_PIN to Y_MAX_PIN." + #elif J_USE_ENDSTOP == _YSTOP_ + #warning "Auto-assigned J_DIAG_PIN to Y_STOP_PIN." #elif J_USE_ENDSTOP == _ZMIN_ #warning "Auto-assigned J_DIAG_PIN to Z_MIN_PIN." #elif J_USE_ENDSTOP == _ZMAX_ #warning "Auto-assigned J_DIAG_PIN to Z_MAX_PIN." + #elif J_USE_ENDSTOP == _ZSTOP_ + #warning "Auto-assigned J_DIAG_PIN to Z_STOP_PIN." #elif J_USE_ENDSTOP == _XDIAG_ #warning "Auto-assigned J_DIAG_PIN to X_DIAG_PIN." #elif J_USE_ENDSTOP == _YDIAG_ @@ -443,14 +485,20 @@ #warning "Auto-assigned K_DIAG_PIN to X_MIN_PIN." #elif K_USE_ENDSTOP == _XMAX_ #warning "Auto-assigned K_DIAG_PIN to X_MAX_PIN." + #elif K_USE_ENDSTOP == _XSTOP_ + #warning "Auto-assigned K_DIAG_PIN to X_STOP_PIN." #elif K_USE_ENDSTOP == _YMIN_ #warning "Auto-assigned K_DIAG_PIN to Y_MIN_PIN." #elif K_USE_ENDSTOP == _YMAX_ #warning "Auto-assigned K_DIAG_PIN to Y_MAX_PIN." + #elif K_USE_ENDSTOP == _YSTOP_ + #warning "Auto-assigned K_DIAG_PIN to Y_STOP_PIN." #elif K_USE_ENDSTOP == _ZMIN_ #warning "Auto-assigned K_DIAG_PIN to Z_MIN_PIN." #elif K_USE_ENDSTOP == _ZMAX_ #warning "Auto-assigned K_DIAG_PIN to Z_MAX_PIN." + #elif K_USE_ENDSTOP == _ZSTOP_ + #warning "Auto-assigned K_DIAG_PIN to Z_STOP_PIN." #elif K_USE_ENDSTOP == _XDIAG_ #warning "Auto-assigned K_DIAG_PIN to X_DIAG_PIN." #elif K_USE_ENDSTOP == _YDIAG_ diff --git a/Marlin/src/pins/pins_postprocess.h b/Marlin/src/pins/pins_postprocess.h index d1047db0d7ce..1e6703fd4a3a 100644 --- a/Marlin/src/pins/pins_postprocess.h +++ b/Marlin/src/pins/pins_postprocess.h @@ -419,6 +419,9 @@ #else #define X_STOP_PIN X_MAX_PIN #endif +#if !defined(X2_USE_ENDSTOP) && ENABLED(X_DUAL_ENDSTOPS) && PIN_EXISTS(X_STOP) + #define X2_USE_ENDSTOP _XSTOP_ +#endif #if HAS_Y_AXIS #ifdef Y_STOP_PIN @@ -438,6 +441,9 @@ #else #define Y_STOP_PIN Y_MAX_PIN #endif + #if !defined(Y2_USE_ENDSTOP) && ENABLED(Y_DUAL_ENDSTOPS) && PIN_EXISTS(Y_STOP) + #define Y2_USE_ENDSTOP _YSTOP_ + #endif #endif #if HAS_Z_AXIS @@ -458,6 +464,17 @@ #else #define Z_STOP_PIN Z_MAX_PIN #endif + #if ENABLED(Z_MULTI_ENDSTOPS) && PIN_EXISTS(Z_STOP) + #ifndef Z2_USE_ENDSTOP + #define Z2_USE_ENDSTOP _ZSTOP_ + #endif + #if NUM_Z_STEPPER_DRIVERS >= 3 && !defined(Z3_USE_ENDSTOP) + #define Z3_USE_ENDSTOP _ZSTOP_ + #endif + #if NUM_Z_STEPPER_DRIVERS >= 4 && !defined(Z4_USE_ENDSTOP) + #define Z4_USE_ENDSTOP _ZSTOP_ + #endif + #endif #endif #if LINEAR_AXES >= 4 @@ -801,7 +818,7 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(Z2_DIAG_PIN) && !defined(Z2_USE_ENDSTOP) && defined(Z2_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 2 && _PEXI(Z2_E_INDEX, DIAG) + #if !defined(Z2_DIAG_PIN) && !defined(Z2_USE_ENDSTOP) && defined(Z2_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && _PEXI(Z2_E_INDEX, DIAG) #define Z2_DIAG_PIN _EPIN(Z2_E_INDEX, DIAG) #if DIAG_REMAPPED(Z2, X_MIN) #define Z2_USE_ENDSTOP _XMIN_ @@ -886,7 +903,7 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(Z3_DIAG_PIN) && !defined(Z3_USE_ENDSTOP) && defined(Z3_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 && _PEXI(Z3_E_INDEX, DIAG) + #if !defined(Z3_DIAG_PIN) && !defined(Z3_USE_ENDSTOP) && defined(Z3_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && _PEXI(Z3_E_INDEX, DIAG) #define Z3_DIAG_PIN _EPIN(Z3_E_INDEX, DIAG) #if DIAG_REMAPPED(Z3, X_MIN) #define Z3_USE_ENDSTOP _XMIN_ @@ -971,7 +988,7 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(Z4_DIAG_PIN) && !defined(Z4_USE_ENDSTOP) && defined(Z4_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 && _PEXI(Z4_E_INDEX, DIAG) + #if !defined(Z4_DIAG_PIN) && !defined(Z4_USE_ENDSTOP) && defined(Z4_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && _PEXI(Z4_E_INDEX, DIAG) #define Z4_DIAG_PIN _EPIN(Z4_E_INDEX, DIAG) #if DIAG_REMAPPED(Z4, X_MIN) #define Z4_USE_ENDSTOP _XMIN_ diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V9.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V9.h index eb7f91deab96..0d02e1d5d901 100755 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V9.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V9.h @@ -28,7 +28,11 @@ #define Z2_ENABLE_PIN PF3 #define Z2_STEP_PIN PF5 #define Z2_DIR_PIN PF1 +#define Z2_STOP_PIN PA13 +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PG9 +#endif #ifndef FIL_RUNOUT2_PIN #define FIL_RUNOUT2_PIN PF13 #endif From 4483b8aaf023576ea1c8ecfa84e7093ec26ad75a Mon Sep 17 00:00:00 2001 From: Robby Candra Date: Thu, 4 Nov 2021 17:28:42 +0700 Subject: [PATCH 63/78] =?UTF-8?q?=F0=9F=94=A8=20Fix=20IntelliSense=20/=20P?= =?UTF-8?q?IO=20conflicts=20(#23058)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/src/HAL/DUE/upload_extra_script.py | 19 +- Marlin/src/HAL/LPC1768/upload_extra_script.py | 198 +++--- Marlin/src/HAL/STM32F1/build_flags.py | 30 +- .../scripts/SAMD51_grandcentral_m4.py | 24 +- .../scripts/STM32F103RC_MEEB_3DP.py | 61 +- .../PlatformIO/scripts/STM32F103RC_fysetc.py | 43 +- .../scripts/STM32F1_create_variant.py | 40 +- .../share/PlatformIO/scripts/add_nanolib.py | 1 + .../share/PlatformIO/scripts/chitu_crypt.py | 167 ++--- .../PlatformIO/scripts/common-cxxflags.py | 60 +- .../scripts/common-dependencies-post.py | 22 +- .../PlatformIO/scripts/common-dependencies.py | 603 +++++++++--------- .../share/PlatformIO/scripts/custom_board.py | 20 +- .../PlatformIO/scripts/download_mks_assets.py | 84 ++- .../scripts/fix_framework_weakness.py | 47 +- .../scripts/generic_create_variant.py | 96 +-- .../jgaurora_a5s_a1_with_bootloader.py | 67 +- buildroot/share/PlatformIO/scripts/lerdge.py | 70 +- buildroot/share/PlatformIO/scripts/marlin.py | 16 +- .../share/PlatformIO/scripts/mks_robin.py | 2 +- .../share/PlatformIO/scripts/mks_robin_e3.py | 2 +- .../share/PlatformIO/scripts/mks_robin_e3p.py | 2 +- .../PlatformIO/scripts/mks_robin_lite.py | 2 +- .../PlatformIO/scripts/mks_robin_lite3.py | 2 +- .../PlatformIO/scripts/mks_robin_mini.py | 2 +- .../PlatformIO/scripts/mks_robin_nano.py | 2 +- .../PlatformIO/scripts/mks_robin_nano35.py | 2 +- .../share/PlatformIO/scripts/mks_robin_pro.py | 2 +- .../PlatformIO/scripts/offset_and_rename.py | 104 +-- buildroot/share/PlatformIO/scripts/openblt.py | 28 +- buildroot/share/PlatformIO/scripts/pioutil.py | 8 +- .../PlatformIO/scripts/preflight-checks.py | 163 +++-- .../share/PlatformIO/scripts/random-bin.py | 10 +- buildroot/share/PlatformIO/scripts/robin.py | 16 +- .../share/PlatformIO/scripts/simulator.py | 68 +- .../PlatformIO/scripts/stm32_serialbuffer.py | 114 ++-- ini/stm32f1-maple.ini | 1 - 37 files changed, 1116 insertions(+), 1082 deletions(-) diff --git a/Marlin/src/HAL/DUE/upload_extra_script.py b/Marlin/src/HAL/DUE/upload_extra_script.py index d52a0a3642b4..4f7a494512b2 100644 --- a/Marlin/src/HAL/DUE/upload_extra_script.py +++ b/Marlin/src/HAL/DUE/upload_extra_script.py @@ -4,15 +4,16 @@ # Windows: bossac.exe # Other: leave unchanged # +import pioutil +if pioutil.is_pio_build(): + import platform + current_OS = platform.system() -import platform -current_OS = platform.system() + if current_OS == 'Windows': -if current_OS == 'Windows': + Import("env") - Import("env") - - # Use bossac.exe on Windows - env.Replace( - UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE" - ) + # Use bossac.exe on Windows + env.Replace( + UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE" + ) diff --git a/Marlin/src/HAL/LPC1768/upload_extra_script.py b/Marlin/src/HAL/LPC1768/upload_extra_script.py index fb3aaef7cd38..7975f151f712 100755 --- a/Marlin/src/HAL/LPC1768/upload_extra_script.py +++ b/Marlin/src/HAL/LPC1768/upload_extra_script.py @@ -1,123 +1,127 @@ # -# sets output_port +# upload_extra_script.py +# set the output_port # if target_filename is found then that drive is used # else if target_drive is found then that drive is used # from __future__ import print_function -target_filename = "FIRMWARE.CUR" -target_drive = "REARM" +import pioutil +if pioutil.is_pio_build(): -import os,getpass,platform + target_filename = "FIRMWARE.CUR" + target_drive = "REARM" -current_OS = platform.system() -Import("env") + import os,getpass,platform -def print_error(e): - print('\nUnable to find destination disk (%s)\n' \ - 'Please select it in platformio.ini using the upload_port keyword ' \ - '(https://docs.platformio.org/en/latest/projectconf/section_env_upload.html) ' \ - 'or copy the firmware (.pio/build/%s/firmware.bin) manually to the appropriate disk\n' \ - %(e, env.get('PIOENV'))) + current_OS = platform.system() + Import("env") -def before_upload(source, target, env): - try: - # - # Find a disk for upload - # - upload_disk = 'Disk not found' - target_file_found = False - target_drive_found = False - if current_OS == 'Windows': + def print_error(e): + print('\nUnable to find destination disk (%s)\n' \ + 'Please select it in platformio.ini using the upload_port keyword ' \ + '(https://docs.platformio.org/en/latest/projectconf/section_env_upload.html) ' \ + 'or copy the firmware (.pio/build/%s/firmware.bin) manually to the appropriate disk\n' \ + %(e, env.get('PIOENV'))) + + def before_upload(source, target, env): + try: + # + # Find a disk for upload # - # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:' - # Windows - doesn't care about the disk's name, only cares about the drive letter - import subprocess,string - from ctypes import windll + upload_disk = 'Disk not found' + target_file_found = False + target_drive_found = False + if current_OS == 'Windows': + # + # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:' + # Windows - doesn't care about the disk's name, only cares about the drive letter + import subprocess,string + from ctypes import windll - # getting list of drives - # https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python - drives = [] - bitmask = windll.kernel32.GetLogicalDrives() - for letter in string.ascii_uppercase: - if bitmask & 1: - drives.append(letter) - bitmask >>= 1 + # getting list of drives + # https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python + drives = [] + bitmask = windll.kernel32.GetLogicalDrives() + for letter in string.ascii_uppercase: + if bitmask & 1: + drives.append(letter) + bitmask >>= 1 - for drive in drives: - final_drive_name = drive + ':\\' - # print ('disc check: {}'.format(final_drive_name)) - try: - volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT)) - except Exception as e: - print ('error:{}'.format(e)) - continue - else: - if target_drive in volume_info and not target_file_found: # set upload if not found target file yet - target_drive_found = True - upload_disk = final_drive_name - if target_filename in volume_info: - if not target_file_found: + for drive in drives: + final_drive_name = drive + ':\\' + # print ('disc check: {}'.format(final_drive_name)) + try: + volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT)) + except Exception as e: + print ('error:{}'.format(e)) + continue + else: + if target_drive in volume_info and not target_file_found: # set upload if not found target file yet + target_drive_found = True upload_disk = final_drive_name - target_file_found = True + if target_filename in volume_info: + if not target_file_found: + upload_disk = final_drive_name + target_file_found = True - elif current_OS == 'Linux': - # - # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive' - # - drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser())) - if target_drive in drives: # If target drive is found, use it. - target_drive_found = True - upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), target_drive) + os.sep - else: + elif current_OS == 'Linux': + # + # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive' + # + drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser())) + if target_drive in drives: # If target drive is found, use it. + target_drive_found = True + upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), target_drive) + os.sep + else: + for drive in drives: + try: + files = os.listdir(os.path.join(os.sep, 'media', getpass.getuser(), drive)) + except: + continue + else: + if target_filename in files: + upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), drive) + os.sep + target_file_found = True + break + # + # set upload_port to drive if found + # + + if target_file_found or target_drive_found: + env.Replace( + UPLOAD_FLAGS="-P$UPLOAD_PORT" + ) + + elif current_OS == 'Darwin': # MAC + # + # platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive' + # + drives = os.listdir('/Volumes') # human readable names + if target_drive in drives and not target_file_found: # set upload if not found target file yet + target_drive_found = True + upload_disk = '/Volumes/' + target_drive + '/' for drive in drives: try: - files = os.listdir(os.path.join(os.sep, 'media', getpass.getuser(), drive)) + filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected except: continue else: - if target_filename in files: - upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), drive) + os.sep + if target_filename in filenames: + if not target_file_found: + upload_disk = '/Volumes/' + drive + '/' target_file_found = True - break - # - # set upload_port to drive if found - # - if target_file_found or target_drive_found: - env.Replace( - UPLOAD_FLAGS="-P$UPLOAD_PORT" - ) - - elif current_OS == 'Darwin': # MAC # - # platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive' + # Set upload_port to drive if found # - drives = os.listdir('/Volumes') # human readable names - if target_drive in drives and not target_file_found: # set upload if not found target file yet - target_drive_found = True - upload_disk = '/Volumes/' + target_drive + '/' - for drive in drives: - try: - filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected - except: - continue - else: - if target_filename in filenames: - if not target_file_found: - upload_disk = '/Volumes/' + drive + '/' - target_file_found = True - - # - # Set upload_port to drive if found - # - if target_file_found or target_drive_found: - env.Replace(UPLOAD_PORT=upload_disk) - print('\nUpload disk: ', upload_disk, '\n') - else: - print_error('Autodetect Error') + if target_file_found or target_drive_found: + env.Replace(UPLOAD_PORT=upload_disk) + print('\nUpload disk: ', upload_disk, '\n') + else: + print_error('Autodetect Error') - except Exception as e: - print_error(str(e)) + except Exception as e: + print_error(str(e)) -env.AddPreAction("upload", before_upload) + env.AddPreAction("upload", before_upload) diff --git a/Marlin/src/HAL/STM32F1/build_flags.py b/Marlin/src/HAL/STM32F1/build_flags.py index d0848d1c6438..970ca8b767f9 100755 --- a/Marlin/src/HAL/STM32F1/build_flags.py +++ b/Marlin/src/HAL/STM32F1/build_flags.py @@ -30,25 +30,27 @@ # extra script for linker options else: - from SCons.Script import DefaultEnvironment - env = DefaultEnvironment() - env.Append( + import pioutil + if pioutil.is_pio_build(): + from SCons.Script import DefaultEnvironment + env = DefaultEnvironment() + env.Append( ARFLAGS=["rcs"], ASFLAGS=["-x", "assembler-with-cpp"], CXXFLAGS=[ - "-fabi-version=0", - "-fno-use-cxa-atexit", - "-fno-threadsafe-statics" + "-fabi-version=0", + "-fno-use-cxa-atexit", + "-fno-threadsafe-statics" ], LINKFLAGS=[ - "-Os", - "-mcpu=cortex-m3", - "-ffreestanding", - "-mthumb", - "--specs=nano.specs", - "--specs=nosys.specs", - "-u_printf_float", + "-Os", + "-mcpu=cortex-m3", + "-ffreestanding", + "-mthumb", + "--specs=nano.specs", + "--specs=nosys.specs", + "-u_printf_float", ], - ) + ) diff --git a/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py b/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py index 9e37024d118f..be2c87266acc 100644 --- a/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py +++ b/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py @@ -2,18 +2,20 @@ # SAMD51_grandcentral_m4.py # Customizations for env:SAMD51_grandcentral_m4 # -from os.path import join, isfile -import shutil -from pprint import pprint +import pioutil +if pioutil.is_pio_build(): + from os.path import join, isfile + import shutil + from pprint import pprint -Import("env") + Import("env") -mf = env["MARLIN_FEATURES"] -rxBuf = mf["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in mf else "0" -txBuf = mf["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in mf else "0" + mf = env["MARLIN_FEATURES"] + rxBuf = mf["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in mf else "0" + txBuf = mf["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in mf else "0" -serialBuf = str(max(int(rxBuf), int(txBuf), 350)) + serialBuf = str(max(int(rxBuf), int(txBuf), 350)) -build_flags = env.get('BUILD_FLAGS') -build_flags.append("-DSERIAL_BUFFER_SIZE=" + serialBuf) -env.Replace(BUILD_FLAGS=build_flags) + build_flags = env.get('BUILD_FLAGS') + build_flags.append("-DSERIAL_BUFFER_SIZE=" + serialBuf) + env.Replace(BUILD_FLAGS=build_flags) diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py index e059d445789c..eccee7606804 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py @@ -1,40 +1,43 @@ # -# buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py +# STM32F103RC_MEEB_3DP.py # -try: - import configparser -except ImportError: - import ConfigParser as configparser +import pioutil +if pioutil.is_pio_build(): -import os -Import("env", "projenv") + try: + import configparser + except ImportError: + import ConfigParser as configparser -config = configparser.ConfigParser() -config.read("platformio.ini") + import os + Import("env", "projenv") -# -# Upload actions -# -def before_upload(source, target, env): - env.Execute("pwd") + config = configparser.ConfigParser() + config.read("platformio.ini") + + # + # Upload actions + # + def before_upload(source, target, env): + env.Execute("pwd") -def after_upload(source, target, env): - env.Execute("pwd") + def after_upload(source, target, env): + env.Execute("pwd") -env.AddPreAction("upload", before_upload) -env.AddPostAction("upload", after_upload) + env.AddPreAction("upload", before_upload) + env.AddPostAction("upload", after_upload) -flash_size = 0 -vect_tab_addr = 0 + flash_size = 0 + vect_tab_addr = 0 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - vect_tab_addr = define[1] - if define[0] == "STM32_FLASH_SIZE": - flash_size = define[1] + for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + vect_tab_addr = define[1] + if define[0] == "STM32_FLASH_SIZE": + flash_size = define[1] -print('Use the {0:s} address as the marlin app entry point.'.format(vect_tab_addr)) -print('Use the {0:d}KB flash version of stm32f103rct6 chip.'.format(flash_size)) + print('Use the {0:s} address as the marlin app entry point.'.format(vect_tab_addr)) + print('Use the {0:d}KB flash version of stm32f103rct6 chip.'.format(flash_size)) -import marlin -marlin.custom_ld_script("STM32F103RC_MEEB_3DP.ld") + import marlin + marlin.custom_ld_script("STM32F103RC_MEEB_3DP.ld") diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py index 07f6548b18d9..c9794702c34a 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py @@ -1,25 +1,28 @@ # -# buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +# STM32F103RC_fysetc.py # -from os.path import join -from os.path import expandvars -Import("env") +import pioutil +if pioutil.is_pio_build(): + import os + from os.path import join + from os.path import expandvars + Import("env") -# Custom HEX from ELF -env.AddPostAction( - join("$BUILD_DIR", "${PROGNAME}.elf"), - env.VerboseAction(" ".join([ - "$OBJCOPY", "-O ihex", "$TARGET", - "\"" + join("$BUILD_DIR", "${PROGNAME}.hex") + "\"", # Note: $BUILD_DIR is a full path - ]), "Building $TARGET")) + # Custom HEX from ELF + env.AddPostAction( + join("$BUILD_DIR", "${PROGNAME}.elf"), + env.VerboseAction(" ".join([ + "$OBJCOPY", "-O ihex", "$TARGET", + "\"" + join("$BUILD_DIR", "${PROGNAME}.hex") + "\"", # Note: $BUILD_DIR is a full path + ]), "Building $TARGET")) -# In-line command with arguments -UPLOAD_TOOL="stm32flash" -platform = env.PioPlatform() -if platform.get_package_dir("tool-stm32duino") != None: - UPLOAD_TOOL=expandvars("\"" + join(platform.get_package_dir("tool-stm32duino"),"stm32flash","stm32flash") + "\"") + # In-line command with arguments + UPLOAD_TOOL="stm32flash" + platform = env.PioPlatform() + if platform.get_package_dir("tool-stm32duino") != None: + UPLOAD_TOOL=expandvars("\"" + join(platform.get_package_dir("tool-stm32duino"),"stm32flash","stm32flash") + "\"") -env.Replace( - UPLOADER=UPLOAD_TOOL, - UPLOADCMD=expandvars(UPLOAD_TOOL + " -v -i rts,-dtr,dtr -R -b 115200 -g 0x8000000 -w \"" + join("$BUILD_DIR","${PROGNAME}.hex")+"\"" + " $UPLOAD_PORT") -) + env.Replace( + UPLOADER=UPLOAD_TOOL, + UPLOADCMD=expandvars(UPLOAD_TOOL + " -v -i rts,-dtr,dtr -R -b 115200 -g 0x8000000 -w \"" + join("$BUILD_DIR","${PROGNAME}.hex")+"\"" + " $UPLOAD_PORT") + ) diff --git a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py index 0a38e1ceee9d..592fa50e5e68 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py +++ b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py @@ -1,30 +1,32 @@ # # STM32F1_create_variant.py # -import os,shutil,marlin -from SCons.Script import DefaultEnvironment -from platformio import util +import pioutil +if pioutil.is_pio_build(): + import os,shutil,marlin + from SCons.Script import DefaultEnvironment + from platformio import util -env = DefaultEnvironment() -platform = env.PioPlatform() -board = env.BoardConfig() + env = DefaultEnvironment() + platform = env.PioPlatform() + board = env.BoardConfig() -FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32-maple") -assert os.path.isdir(FRAMEWORK_DIR) + FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32-maple") + assert os.path.isdir(FRAMEWORK_DIR) -source_root = os.path.join("buildroot", "share", "PlatformIO", "variants") -assert os.path.isdir(source_root) + source_root = os.path.join("buildroot", "share", "PlatformIO", "variants") + assert os.path.isdir(source_root) -variant = board.get("build.variant") -variant_dir = os.path.join(FRAMEWORK_DIR, "STM32F1", "variants", variant) + variant = board.get("build.variant") + variant_dir = os.path.join(FRAMEWORK_DIR, "STM32F1", "variants", variant) -source_dir = os.path.join(source_root, variant) -assert os.path.isdir(source_dir) + source_dir = os.path.join(source_root, variant) + assert os.path.isdir(source_dir) -if os.path.isdir(variant_dir): - shutil.rmtree(variant_dir) + if os.path.isdir(variant_dir): + shutil.rmtree(variant_dir) -if not os.path.isdir(variant_dir): - os.mkdir(variant_dir) + if not os.path.isdir(variant_dir): + os.mkdir(variant_dir) -marlin.copytree(source_dir, variant_dir) + marlin.copytree(source_dir, variant_dir) diff --git a/buildroot/share/PlatformIO/scripts/add_nanolib.py b/buildroot/share/PlatformIO/scripts/add_nanolib.py index 3b74b0d2714d..f5166d7d84c7 100644 --- a/buildroot/share/PlatformIO/scripts/add_nanolib.py +++ b/buildroot/share/PlatformIO/scripts/add_nanolib.py @@ -2,4 +2,5 @@ # add_nanolib.py # Import("env") + env.Append(LINKFLAGS=["--specs=nano.specs"]) diff --git a/buildroot/share/PlatformIO/scripts/chitu_crypt.py b/buildroot/share/PlatformIO/scripts/chitu_crypt.py index 23d81c1721f9..b28156bfb9f1 100644 --- a/buildroot/share/PlatformIO/scripts/chitu_crypt.py +++ b/buildroot/share/PlatformIO/scripts/chitu_crypt.py @@ -1,116 +1,117 @@ # -# buildroot/share/PlatformIO/scripts/chitu_crypt.py +# chitu_crypt.py # Customizations for Chitu boards # -import os,random,struct,uuid,marlin +import pioutil +if pioutil.is_pio_build(): + import os,random,struct,uuid,marlin + # Relocate firmware from 0x08000000 to 0x08008800 + marlin.relocate_firmware("0x08008800") -# Relocate firmware from 0x08000000 to 0x08008800 -marlin.relocate_firmware("0x08008800") + def calculate_crc(contents, seed): + accumulating_xor_value = seed; -def calculate_crc(contents, seed): - accumulating_xor_value = seed; + for i in range(0, len(contents), 4): + value = struct.unpack('> ip - # shift the xor_seed left by the bits in IP. - xor_seed = xor_seed >> ip + # load a byte into IP + ip = r0[loop_counter] - # load a byte into IP - ip = r0[loop_counter] + # XOR the seed with r7 + xor_seed = xor_seed ^ r7 - # XOR the seed with r7 - xor_seed = xor_seed ^ r7 + # and then with IP + xor_seed = xor_seed ^ ip - # and then with IP - xor_seed = xor_seed ^ ip + #Now store the byte back + r1[loop_counter] = xor_seed & 0xFF - #Now store the byte back - r1[loop_counter] = xor_seed & 0xFF + #increment the loop_counter + loop_counter = loop_counter + 1 - #increment the loop_counter - loop_counter = loop_counter + 1 + def encrypt_file(input, output_file, file_length): + input_file = bytearray(input.read()) + block_size = 0x800 + key_length = 0x18 -def encrypt_file(input, output_file, file_length): - input_file = bytearray(input.read()) - block_size = 0x800 - key_length = 0x18 + uid_value = uuid.uuid4() + file_key = int(uid_value.hex[0:8], 16) - uid_value = uuid.uuid4() - file_key = int(uid_value.hex[0:8], 16) + xor_crc = 0xEF3D4323; - xor_crc = 0xEF3D4323; + # the input file is exepcted to be in chunks of 0x800 + # so round the size + while len(input_file) % block_size != 0: + input_file.extend(b'0x0') - # the input file is exepcted to be in chunks of 0x800 - # so round the size - while len(input_file) % block_size != 0: - input_file.extend(b'0x0') + # write the file header + output_file.write(struct.pack(">I", 0x443D2D3F)) + # encrypt the contents using a known file header key - # write the file header - output_file.write(struct.pack(">I", 0x443D2D3F)) - # encrypt the contents using a known file header key + # write the file_key + output_file.write(struct.pack("= level: - print("[deps] %s" % str) - -FEATURE_CONFIG = {} +import pioutil +if pioutil.is_pio_build(): -def add_to_feat_cnf(feature, flines): + import subprocess,os,re + Import("env") - try: - feat = FEATURE_CONFIG[feature] - except: - FEATURE_CONFIG[feature] = {} - - # Get a reference to the FEATURE_CONFIG under construction - feat = FEATURE_CONFIG[feature] - - # Split up passed lines on commas or newlines and iterate - # Add common options to the features config under construction - # For lib_deps replace a previous instance of the same library - atoms = re.sub(r',\\s*', '\n', flines).strip().split('\n') - for line in atoms: - parts = line.split('=') - name = parts.pop(0) - if name in ['build_flags', 'extra_scripts', 'src_filter', 'lib_ignore']: - feat[name] = '='.join(parts) - blab("[%s] %s=%s" % (feature, name, feat[name]), 3) - else: - for dep in re.split(r",\s*", line): - lib_name = re.sub(r'@([~^]|[<>]=?)?[\d.]+', '', dep.strip()).split('=').pop(0) - lib_re = re.compile('(?!^' + lib_name + '\\b)') - feat['lib_deps'] = list(filter(lib_re.match, feat['lib_deps'])) + [dep] - blab("[%s] lib_deps = %s" % (feature, dep), 3) - -def load_config(): - blab("========== Gather [features] entries...") - items = ProjectConfig().items('features') - for key in items: - feature = key[0].upper() - if not feature in FEATURE_CONFIG: - FEATURE_CONFIG[feature] = { 'lib_deps': [] } - add_to_feat_cnf(feature, key[1]) - - # Add options matching custom_marlin.MY_OPTION to the pile - blab("========== Gather custom_marlin entries...") - all_opts = env.GetProjectOptions() - for n in all_opts: - key = n[0] - mat = re.match(r'custom_marlin\.(.+)', key) - if mat: - try: - val = env.GetProjectOption(key) - except: - val = None - if val: - opt = mat.group(1).upper() - blab("%s.custom_marlin.%s = '%s'" % ( env['PIOENV'], opt, val )) - add_to_feat_cnf(opt, val) - -def get_all_known_libs(): - known_libs = [] - for feature in FEATURE_CONFIG: - feat = FEATURE_CONFIG[feature] - if not 'lib_deps' in feat: - continue - for dep in feat['lib_deps']: - known_libs.append(PackageSpec(dep).name) - return known_libs - -def get_all_env_libs(): - env_libs = [] - lib_deps = env.GetProjectOption('lib_deps') - for dep in lib_deps: - env_libs.append(PackageSpec(dep).name) - return env_libs - -def set_env_field(field, value): - proj = env.GetProjectConfig() - proj.set("env:" + env['PIOENV'], field, value) - -# All unused libs should be ignored so that if a library -# exists in .pio/lib_deps it will not break compilation. -def force_ignore_unused_libs(): - env_libs = get_all_env_libs() - known_libs = get_all_known_libs() - diff = (list(set(known_libs) - set(env_libs))) - lib_ignore = env.GetProjectOption('lib_ignore') + diff - blab("Ignore libraries: %s" % lib_ignore) - set_env_field('lib_ignore', lib_ignore) - -def apply_features_config(): - load_config() - blab("========== Apply enabled features...") - for feature in FEATURE_CONFIG: - if not env.MarlinFeatureIsEnabled(feature): - continue + from platformio.package.meta import PackageSpec + from platformio.project.config import ProjectConfig + verbose = 0 + FEATURE_CONFIG = {} + + def validate_pio(): + PIO_VERSION_MIN = (5, 0, 3) + try: + from platformio import VERSION as PIO_VERSION + weights = (1000, 100, 1) + version_min = sum([x[0] * float(re.sub(r'[^0-9]', '.', str(x[1]))) for x in zip(weights, PIO_VERSION_MIN)]) + version_cur = sum([x[0] * float(re.sub(r'[^0-9]', '.', str(x[1]))) for x in zip(weights, PIO_VERSION)]) + if version_cur < version_min: + print() + print("**************************************************") + print("****** An update to PlatformIO is ******") + print("****** required to build Marlin Firmware. ******") + print("****** ******") + print("****** Minimum version: ", PIO_VERSION_MIN, " ******") + print("****** Current Version: ", PIO_VERSION, " ******") + print("****** ******") + print("****** Update PlatformIO and try again. ******") + print("**************************************************") + print() + exit(1) + except SystemExit: + exit(1) + except: + print("Can't detect PlatformIO Version") + + def blab(str,level=1): + if verbose >= level: + print("[deps] %s" % str) + + def add_to_feat_cnf(feature, flines): + + try: + feat = FEATURE_CONFIG[feature] + except: + FEATURE_CONFIG[feature] = {} + + # Get a reference to the FEATURE_CONFIG under construction feat = FEATURE_CONFIG[feature] - if 'lib_deps' in feat and len(feat['lib_deps']): - blab("========== Adding lib_deps for %s... " % feature, 2) - - # feat to add - deps_to_add = {} + # Split up passed lines on commas or newlines and iterate + # Add common options to the features config under construction + # For lib_deps replace a previous instance of the same library + atoms = re.sub(r',\\s*', '\n', flines).strip().split('\n') + for line in atoms: + parts = line.split('=') + name = parts.pop(0) + if name in ['build_flags', 'extra_scripts', 'src_filter', 'lib_ignore']: + feat[name] = '='.join(parts) + blab("[%s] %s=%s" % (feature, name, feat[name]), 3) + else: + for dep in re.split(r",\s*", line): + lib_name = re.sub(r'@([~^]|[<>]=?)?[\d.]+', '', dep.strip()).split('=').pop(0) + lib_re = re.compile('(?!^' + lib_name + '\\b)') + feat['lib_deps'] = list(filter(lib_re.match, feat['lib_deps'])) + [dep] + blab("[%s] lib_deps = %s" % (feature, dep), 3) + + def load_config(): + blab("========== Gather [features] entries...") + items = ProjectConfig().items('features') + for key in items: + feature = key[0].upper() + if not feature in FEATURE_CONFIG: + FEATURE_CONFIG[feature] = { 'lib_deps': [] } + add_to_feat_cnf(feature, key[1]) + + # Add options matching custom_marlin.MY_OPTION to the pile + blab("========== Gather custom_marlin entries...") + all_opts = env.GetProjectOptions() + for n in all_opts: + key = n[0] + mat = re.match(r'custom_marlin\.(.+)', key) + if mat: + try: + val = env.GetProjectOption(key) + except: + val = None + if val: + opt = mat.group(1).upper() + blab("%s.custom_marlin.%s = '%s'" % ( env['PIOENV'], opt, val )) + add_to_feat_cnf(opt, val) + + def get_all_known_libs(): + known_libs = [] + for feature in FEATURE_CONFIG: + feat = FEATURE_CONFIG[feature] + if not 'lib_deps' in feat: + continue for dep in feat['lib_deps']: - deps_to_add[PackageSpec(dep).name] = dep - blab("==================== %s... " % dep, 2) - - # Does the env already have the dependency? - deps = env.GetProjectOption('lib_deps') - for dep in deps: - name = PackageSpec(dep).name - if name in deps_to_add: - del deps_to_add[name] - - # Are there any libraries that should be ignored? - lib_ignore = env.GetProjectOption('lib_ignore') - for dep in deps: - name = PackageSpec(dep).name - if name in deps_to_add: - del deps_to_add[name] - - # Is there anything left? - if len(deps_to_add) > 0: - # Only add the missing dependencies - set_env_field('lib_deps', deps + list(deps_to_add.values())) - - if 'build_flags' in feat: - f = feat['build_flags'] - blab("========== Adding build_flags for %s: %s" % (feature, f), 2) - new_flags = env.GetProjectOption('build_flags') + [ f ] - env.Replace(BUILD_FLAGS=new_flags) - - if 'extra_scripts' in feat: - blab("Running extra_scripts for %s... " % feature, 2) - env.SConscript(feat['extra_scripts'], exports="env") - - if 'src_filter' in feat: - blab("========== Adding src_filter for %s... " % feature, 2) - src_filter = ' '.join(env.GetProjectOption('src_filter')) - # first we need to remove the references to the same folder - my_srcs = re.findall(r'[+-](<.*?>)', feat['src_filter']) - cur_srcs = re.findall(r'[+-](<.*?>)', src_filter) - for d in my_srcs: - if d in cur_srcs: - src_filter = re.sub(r'[+-]' + d, '', src_filter) - - src_filter = feat['src_filter'] + ' ' + src_filter - set_env_field('src_filter', [src_filter]) - env.Replace(SRC_FILTER=src_filter) - - if 'lib_ignore' in feat: - blab("========== Adding lib_ignore for %s... " % feature, 2) - lib_ignore = env.GetProjectOption('lib_ignore') + [feat['lib_ignore']] - set_env_field('lib_ignore', lib_ignore) - -# -# Find a compiler, considering the OS -# -ENV_BUILD_PATH = os.path.join(env.Dictionary('PROJECT_BUILD_DIR'), env['PIOENV']) -GCC_PATH_CACHE = os.path.join(ENV_BUILD_PATH, ".gcc_path") -def search_compiler(): - try: - filepath = env.GetProjectOption('custom_gcc') - blab("Getting compiler from env") - return filepath - except: - pass - - if os.path.exists(GCC_PATH_CACHE): - with open(GCC_PATH_CACHE, 'r') as f: - return f.read() - - # Find the current platform compiler by searching the $PATH - # which will be in a platformio toolchain bin folder - path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) - - # See if the environment provides a default compiler - try: - gcc = env.GetProjectOption('custom_deps_gcc') - except: - gcc = "g++" - - if env['PLATFORM'] == 'win32': - path_separator = ';' - path_regex += r'.*\\bin' - gcc += ".exe" - else: - path_separator = ':' - path_regex += r'/.+/bin' - - # Search for the compiler - for pathdir in env['ENV']['PATH'].split(path_separator): - if not re.search(path_regex, pathdir, re.IGNORECASE): - continue - for filepath in os.listdir(pathdir): - if not filepath.endswith(gcc): + known_libs.append(PackageSpec(dep).name) + return known_libs + + def get_all_env_libs(): + env_libs = [] + lib_deps = env.GetProjectOption('lib_deps') + for dep in lib_deps: + env_libs.append(PackageSpec(dep).name) + return env_libs + + def set_env_field(field, value): + proj = env.GetProjectConfig() + proj.set("env:" + env['PIOENV'], field, value) + + # All unused libs should be ignored so that if a library + # exists in .pio/lib_deps it will not break compilation. + def force_ignore_unused_libs(): + env_libs = get_all_env_libs() + known_libs = get_all_known_libs() + diff = (list(set(known_libs) - set(env_libs))) + lib_ignore = env.GetProjectOption('lib_ignore') + diff + blab("Ignore libraries: %s" % lib_ignore) + set_env_field('lib_ignore', lib_ignore) + + def apply_features_config(): + load_config() + blab("========== Apply enabled features...") + for feature in FEATURE_CONFIG: + if not env.MarlinFeatureIsEnabled(feature): continue - # Use entire path to not rely on env PATH - filepath = os.path.sep.join([pathdir, filepath]) - # Cache the g++ path to no search always - if os.path.exists(ENV_BUILD_PATH): - with open(GCC_PATH_CACHE, 'w+') as f: - f.write(filepath) + feat = FEATURE_CONFIG[feature] + + if 'lib_deps' in feat and len(feat['lib_deps']): + blab("========== Adding lib_deps for %s... " % feature, 2) + + # feat to add + deps_to_add = {} + for dep in feat['lib_deps']: + deps_to_add[PackageSpec(dep).name] = dep + blab("==================== %s... " % dep, 2) + + # Does the env already have the dependency? + deps = env.GetProjectOption('lib_deps') + for dep in deps: + name = PackageSpec(dep).name + if name in deps_to_add: + del deps_to_add[name] + + # Are there any libraries that should be ignored? + lib_ignore = env.GetProjectOption('lib_ignore') + for dep in deps: + name = PackageSpec(dep).name + if name in deps_to_add: + del deps_to_add[name] + + # Is there anything left? + if len(deps_to_add) > 0: + # Only add the missing dependencies + set_env_field('lib_deps', deps + list(deps_to_add.values())) + + if 'build_flags' in feat: + f = feat['build_flags'] + blab("========== Adding build_flags for %s: %s" % (feature, f), 2) + new_flags = env.GetProjectOption('build_flags') + [ f ] + env.Replace(BUILD_FLAGS=new_flags) + + if 'extra_scripts' in feat: + blab("Running extra_scripts for %s... " % feature, 2) + env.SConscript(feat['extra_scripts'], exports="env") + + if 'src_filter' in feat: + blab("========== Adding src_filter for %s... " % feature, 2) + src_filter = ' '.join(env.GetProjectOption('src_filter')) + # first we need to remove the references to the same folder + my_srcs = re.findall(r'[+-](<.*?>)', feat['src_filter']) + cur_srcs = re.findall(r'[+-](<.*?>)', src_filter) + for d in my_srcs: + if d in cur_srcs: + src_filter = re.sub(r'[+-]' + d, '', src_filter) + + src_filter = feat['src_filter'] + ' ' + src_filter + set_env_field('src_filter', [src_filter]) + env.Replace(SRC_FILTER=src_filter) + + if 'lib_ignore' in feat: + blab("========== Adding lib_ignore for %s... " % feature, 2) + lib_ignore = env.GetProjectOption('lib_ignore') + [feat['lib_ignore']] + set_env_field('lib_ignore', lib_ignore) + + # + # Find a compiler, considering the OS + # + ENV_BUILD_PATH = os.path.join(env.Dictionary('PROJECT_BUILD_DIR'), env['PIOENV']) + GCC_PATH_CACHE = os.path.join(ENV_BUILD_PATH, ".gcc_path") + def search_compiler(): + try: + filepath = env.GetProjectOption('custom_gcc') + blab("Getting compiler from env") return filepath + except: + pass + + if os.path.exists(GCC_PATH_CACHE): + with open(GCC_PATH_CACHE, 'r') as f: + return f.read() + + # Find the current platform compiler by searching the $PATH + # which will be in a platformio toolchain bin folder + path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) + + # See if the environment provides a default compiler + try: + gcc = env.GetProjectOption('custom_deps_gcc') + except: + gcc = "g++" + + if env['PLATFORM'] == 'win32': + path_separator = ';' + path_regex += r'.*\\bin' + gcc += ".exe" + else: + path_separator = ':' + path_regex += r'/.+/bin' - filepath = env.get('CXX') - if filepath == 'CC': - filepath = gcc - blab("Couldn't find a compiler! Fallback to %s" % filepath) - return filepath + # Search for the compiler + for pathdir in env['ENV']['PATH'].split(path_separator): + if not re.search(path_regex, pathdir, re.IGNORECASE): + continue + for filepath in os.listdir(pathdir): + if not filepath.endswith(gcc): + continue + # Use entire path to not rely on env PATH + filepath = os.path.sep.join([pathdir, filepath]) + # Cache the g++ path to no search always + if os.path.exists(ENV_BUILD_PATH): + with open(GCC_PATH_CACHE, 'w+') as f: + f.write(filepath) + + return filepath + + filepath = env.get('CXX') + if filepath == 'CC': + filepath = gcc + blab("Couldn't find a compiler! Fallback to %s" % filepath) + return filepath -# -# Use the compiler to get a list of all enabled features -# -def load_marlin_features(): - if 'MARLIN_FEATURES' in env: - return - - # Process defines - build_flags = env.get('BUILD_FLAGS') - build_flags = env.ParseFlagsExtended(build_flags) - - cxx = search_compiler() - cmd = ['"' + cxx + '"'] - - # Build flags from board.json - #if 'BOARD' in env: - # cmd += [env.BoardConfig().get("build.extra_flags")] - for s in build_flags['CPPDEFINES']: - if isinstance(s, tuple): - cmd += ['-D' + s[0] + '=' + str(s[1])] - else: - cmd += ['-D' + s] - - cmd += ['-D__MARLIN_DEPS__ -w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] - cmd = ' '.join(cmd) - blab(cmd, 4) - define_list = subprocess.check_output(cmd, shell=True).splitlines() - marlin_features = {} - for define in define_list: - feature = define[8:].strip().decode().split(' ') - feature, definition = feature[0], ' '.join(feature[1:]) - marlin_features[feature] = definition - env['MARLIN_FEATURES'] = marlin_features + # + # Use the compiler to get a list of all enabled features + # + def load_marlin_features(): + if 'MARLIN_FEATURES' in env: + return + + # Process defines + build_flags = env.get('BUILD_FLAGS') + build_flags = env.ParseFlagsExtended(build_flags) + + cxx = search_compiler() + cmd = ['"' + cxx + '"'] + + # Build flags from board.json + #if 'BOARD' in env: + # cmd += [env.BoardConfig().get("build.extra_flags")] + for s in build_flags['CPPDEFINES']: + if isinstance(s, tuple): + cmd += ['-D' + s[0] + '=' + str(s[1])] + else: + cmd += ['-D' + s] + + cmd += ['-D__MARLIN_DEPS__ -w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] + cmd = ' '.join(cmd) + blab(cmd, 4) + define_list = subprocess.check_output(cmd, shell=True).splitlines() + marlin_features = {} + for define in define_list: + feature = define[8:].strip().decode().split(' ') + feature, definition = feature[0], ' '.join(feature[1:]) + marlin_features[feature] = definition + env['MARLIN_FEATURES'] = marlin_features + + # + # Return True if a matching feature is enabled + # + def MarlinFeatureIsEnabled(env, feature): + load_marlin_features() + r = re.compile('^' + feature + '$') + found = list(filter(r.match, env['MARLIN_FEATURES'])) + + # Defines could still be 'false' or '0', so check + some_on = False + if len(found): + for f in found: + val = env['MARLIN_FEATURES'][f] + if val in [ '', '1', 'true' ]: + some_on = True + elif val in env['MARLIN_FEATURES']: + some_on = env.MarlinFeatureIsEnabled(val) + + return some_on + + validate_pio() -# -# Return True if a matching feature is enabled -# -def MarlinFeatureIsEnabled(env, feature): - load_marlin_features() - r = re.compile('^' + feature + '$') - found = list(filter(r.match, env['MARLIN_FEATURES'])) - - # Defines could still be 'false' or '0', so check - some_on = False - if len(found): - for f in found: - val = env['MARLIN_FEATURES'][f] - if val in [ '', '1', 'true' ]: - some_on = True - elif val in env['MARLIN_FEATURES']: - some_on = env.MarlinFeatureIsEnabled(val) - - return some_on + try: + verbose = int(env.GetProjectOption('custom_verbose')) + except: + pass -# -# Add a method for other PIO scripts to query enabled features -# -env.AddMethod(MarlinFeatureIsEnabled) + # Add a method for other PIO scripts to query enabled features + env.AddMethod(MarlinFeatureIsEnabled) -# -# Add dependencies for enabled Marlin features -# -apply_features_config() -force_ignore_unused_libs() + # Add dependencies for enabled Marlin features + apply_features_config() + force_ignore_unused_libs() diff --git a/buildroot/share/PlatformIO/scripts/custom_board.py b/buildroot/share/PlatformIO/scripts/custom_board.py index e462738190dd..da3bdca0bbe7 100644 --- a/buildroot/share/PlatformIO/scripts/custom_board.py +++ b/buildroot/share/PlatformIO/scripts/custom_board.py @@ -1,16 +1,18 @@ # -# buildroot/share/PlatformIO/scripts/custom_board.py +# custom_board.py # # - For build.address replace VECT_TAB_ADDR to relocate the firmware # - For build.ldscript use one of the linker scripts in buildroot/share/PlatformIO/ldscripts # -import marlin -board = marlin.env.BoardConfig() +import pioutil +if pioutil.is_pio_build(): + import marlin + board = marlin.env.BoardConfig() -address = board.get("build.address", "") -if address: - marlin.relocate_firmware(address) + address = board.get("build.address", "") + if address: + marlin.relocate_firmware(address) -ldscript = board.get("build.ldscript", "") -if ldscript: - marlin.custom_ld_script(ldscript) + ldscript = board.get("build.ldscript", "") + if ldscript: + marlin.custom_ld_script(ldscript) diff --git a/buildroot/share/PlatformIO/scripts/download_mks_assets.py b/buildroot/share/PlatformIO/scripts/download_mks_assets.py index 251a74a4ccb5..199040022282 100644 --- a/buildroot/share/PlatformIO/scripts/download_mks_assets.py +++ b/buildroot/share/PlatformIO/scripts/download_mks_assets.py @@ -1,51 +1,49 @@ # -# buildroot/share/PlatformIO/scripts/download_mks_assets.py +# download_mks_assets.py # Added by HAS_TFT_LVGL_UI to download assets from Makerbase repo # -Import("env") -import os,requests,zipfile,tempfile,shutil,pioutil +import pioutil +if pioutil.is_pio_build(): + Import("env") + import os,requests,zipfile,tempfile,shutil -# Detect that 'vscode init' is running -if pioutil.is_vscode_init(): - env.Exit(0) + url = "https://github.com/makerbase-mks/Mks-Robin-Nano-Marlin2.0-Firmware/archive/0263cdaccf.zip" + deps_path = env.Dictionary("PROJECT_LIBDEPS_DIR") + zip_path = os.path.join(deps_path, "mks-assets.zip") + assets_path = os.path.join(env.Dictionary("PROJECT_BUILD_DIR"), env.Dictionary("PIOENV"), "assets") -url = "https://github.com/makerbase-mks/Mks-Robin-Nano-Marlin2.0-Firmware/archive/0263cdaccf.zip" -deps_path = env.Dictionary("PROJECT_LIBDEPS_DIR") -zip_path = os.path.join(deps_path, "mks-assets.zip") -assets_path = os.path.join(env.Dictionary("PROJECT_BUILD_DIR"), env.Dictionary("PIOENV"), "assets") + def download_mks_assets(): + print("Downloading MKS Assets") + r = requests.get(url, stream=True) + # the user may have a very clean workspace, + # so create the PROJECT_LIBDEPS_DIR directory if not exits + if os.path.exists(deps_path) == False: + os.mkdir(deps_path) + with open(zip_path, 'wb') as fd: + for chunk in r.iter_content(chunk_size=128): + fd.write(chunk) -def download_mks_assets(): - print("Downloading MKS Assets") - r = requests.get(url, stream=True) - # the user may have a very clean workspace, - # so create the PROJECT_LIBDEPS_DIR directory if not exits - if os.path.exists(deps_path) == False: - os.mkdir(deps_path) - with open(zip_path, 'wb') as fd: - for chunk in r.iter_content(chunk_size=128): - fd.write(chunk) + def copy_mks_assets(): + print("Copying MKS Assets") + output_path = tempfile.mkdtemp() + zip_obj = zipfile.ZipFile(zip_path, 'r') + zip_obj.extractall(output_path) + zip_obj.close() + if os.path.exists(assets_path) == True and os.path.isdir(assets_path) == False: + os.unlink(assets_path) + if os.path.exists(assets_path) == False: + os.mkdir(assets_path) + base_path = '' + for filename in os.listdir(output_path): + base_path = filename + for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_font')): + shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_font', filename), assets_path) + for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_pic')): + shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_pic', filename), assets_path) + shutil.rmtree(output_path, ignore_errors=True) -def copy_mks_assets(): - print("Copying MKS Assets") - output_path = tempfile.mkdtemp() - zip_obj = zipfile.ZipFile(zip_path, 'r') - zip_obj.extractall(output_path) - zip_obj.close() - if os.path.exists(assets_path) == True and os.path.isdir(assets_path) == False: - os.unlink(assets_path) - if os.path.exists(assets_path) == False: - os.mkdir(assets_path) - base_path = '' - for filename in os.listdir(output_path): - base_path = filename - for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_font')): - shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_font', filename), assets_path) - for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_pic')): - shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_pic', filename), assets_path) - shutil.rmtree(output_path, ignore_errors=True) - -if os.path.exists(zip_path) == False: - download_mks_assets() + if os.path.exists(zip_path) == False: + download_mks_assets() -if os.path.exists(assets_path) == False: - copy_mks_assets() + if os.path.exists(assets_path) == False: + copy_mks_assets() diff --git a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py index fa91b7bb7041..663e7c76d96a 100644 --- a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py +++ b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py @@ -1,32 +1,35 @@ # # fix_framework_weakness.py # -from os.path import join, isfile -import shutil -from pprint import pprint +import pioutil +if pioutil.is_pio_build(): -Import("env") + import shutil + from os.path import join, isfile + from pprint import pprint -if env.MarlinFeatureIsEnabled("POSTMORTEM_DEBUGGING"): - FRAMEWORK_DIR = env.PioPlatform().get_package_dir("framework-arduinoststm32-maple") - patchflag_path = join(FRAMEWORK_DIR, ".exc-patching-done") + Import("env") - # patch file only if we didn't do it before - if not isfile(patchflag_path): - print("Patching libmaple exception handlers") - original_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S") - backup_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S.bak") - src_file = join("buildroot", "share", "PlatformIO", "scripts", "exc.S") + if env.MarlinFeatureIsEnabled("POSTMORTEM_DEBUGGING"): + FRAMEWORK_DIR = env.PioPlatform().get_package_dir("framework-arduinoststm32-maple") + patchflag_path = join(FRAMEWORK_DIR, ".exc-patching-done") - assert isfile(original_file) and isfile(src_file) - shutil.copyfile(original_file, backup_file) - shutil.copyfile(src_file, original_file); + # patch file only if we didn't do it before + if not isfile(patchflag_path): + print("Patching libmaple exception handlers") + original_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S") + backup_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S.bak") + src_file = join("buildroot", "share", "PlatformIO", "scripts", "exc.S") - def _touch(path): - with open(path, "w") as fp: - fp.write("") + assert isfile(original_file) and isfile(src_file) + shutil.copyfile(original_file, backup_file) + shutil.copyfile(src_file, original_file); - env.Execute(lambda *args, **kwargs: _touch(patchflag_path)) - print("Done patching exception handler") + def _touch(path): + with open(path, "w") as fp: + fp.write("") - print("Libmaple modified and ready for post mortem debugging") + env.Execute(lambda *args, **kwargs: _touch(patchflag_path)) + print("Done patching exception handler") + + print("Libmaple modified and ready for post mortem debugging") diff --git a/buildroot/share/PlatformIO/scripts/generic_create_variant.py b/buildroot/share/PlatformIO/scripts/generic_create_variant.py index 7f76ef94262c..52473c752ac6 100644 --- a/buildroot/share/PlatformIO/scripts/generic_create_variant.py +++ b/buildroot/share/PlatformIO/scripts/generic_create_variant.py @@ -5,50 +5,52 @@ # the appropriate framework variants folder, so that its contents # will be picked up by PlatformIO just like any other variant. # -import os,shutil,marlin -from SCons.Script import DefaultEnvironment -from platformio import util - -env = DefaultEnvironment() - -# -# Get the platform name from the 'platform_packages' option, -# or look it up by the platform.class.name. -# -platform = env.PioPlatform() - -from platformio.package.meta import PackageSpec -platform_packages = env.GetProjectOption('platform_packages') -if len(platform_packages) == 0: - framewords = { - "Ststm32Platform": "framework-arduinoststm32", - "AtmelavrPlatform": "framework-arduino-avr" - } - platform_name = framewords[platform.__class__.__name__] -else: - platform_name = PackageSpec(platform_packages[0]).name - -if platform_name in [ "usb-host-msc", "usb-host-msc-cdc-msc", "usb-host-msc-cdc-msc-2", "usb-host-msc-cdc-msc-3", "tool-stm32duino" ]: - platform_name = "framework-arduinoststm32" - -FRAMEWORK_DIR = platform.get_package_dir(platform_name) -assert os.path.isdir(FRAMEWORK_DIR) - -board = env.BoardConfig() - -#mcu_type = board.get("build.mcu")[:-2] -variant = board.get("build.variant") -#series = mcu_type[:7].upper() + "xx" - -# Prepare a new empty folder at the destination -variant_dir = os.path.join(FRAMEWORK_DIR, "variants", variant) -if os.path.isdir(variant_dir): - shutil.rmtree(variant_dir) -if not os.path.isdir(variant_dir): - os.mkdir(variant_dir) - -# Source dir is a local variant sub-folder -source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) -assert os.path.isdir(source_dir) - -marlin.copytree(source_dir, variant_dir) +import pioutil +if pioutil.is_pio_build(): + import os,shutil,marlin + from SCons.Script import DefaultEnvironment + from platformio import util + + env = DefaultEnvironment() + + # + # Get the platform name from the 'platform_packages' option, + # or look it up by the platform.class.name. + # + platform = env.PioPlatform() + + from platformio.package.meta import PackageSpec + platform_packages = env.GetProjectOption('platform_packages') + if len(platform_packages) == 0: + framewords = { + "Ststm32Platform": "framework-arduinoststm32", + "AtmelavrPlatform": "framework-arduino-avr" + } + platform_name = framewords[platform.__class__.__name__] + else: + platform_name = PackageSpec(platform_packages[0]).name + + if platform_name in [ "usb-host-msc", "usb-host-msc-cdc-msc", "usb-host-msc-cdc-msc-2", "usb-host-msc-cdc-msc-3", "tool-stm32duino" ]: + platform_name = "framework-arduinoststm32" + + FRAMEWORK_DIR = platform.get_package_dir(platform_name) + assert os.path.isdir(FRAMEWORK_DIR) + + board = env.BoardConfig() + + #mcu_type = board.get("build.mcu")[:-2] + variant = board.get("build.variant") + #series = mcu_type[:7].upper() + "xx" + + # Prepare a new empty folder at the destination + variant_dir = os.path.join(FRAMEWORK_DIR, "variants", variant) + if os.path.isdir(variant_dir): + shutil.rmtree(variant_dir) + if not os.path.isdir(variant_dir): + os.mkdir(variant_dir) + + # Source dir is a local variant sub-folder + source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) + assert os.path.isdir(source_dir) + + marlin.copytree(source_dir, variant_dir) diff --git a/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py b/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py index a4001a240ca1..0af9c1046d1e 100644 --- a/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py +++ b/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py @@ -1,39 +1,40 @@ # -# buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py +# jgaurora_a5s_a1_with_bootloader.py # Customizations for env:jgaurora_a5s_a1 # -import os,marlin +import pioutil +if pioutil.is_pio_build(): + import os,marlin + # Append ${PROGNAME}.bin firmware after bootloader and save it as 'jgaurora_firmware.bin' + def addboot(source, target, env): + firmware = open(target[0].path, "rb") + lengthfirmware = os.path.getsize(target[0].path) + bootloader_bin = "buildroot/share/PlatformIO/scripts/" + "jgaurora_bootloader.bin" + bootloader = open(bootloader_bin, "rb") + lengthbootloader = os.path.getsize(bootloader_bin) -# Append ${PROGNAME}.bin firmware after bootloader and save it as 'jgaurora_firmware.bin' -def addboot(source, target, env): - firmware = open(target[0].path, "rb") - lengthfirmware = os.path.getsize(target[0].path) - bootloader_bin = "buildroot/share/PlatformIO/scripts/" + "jgaurora_bootloader.bin" - bootloader = open(bootloader_bin, "rb") - lengthbootloader = os.path.getsize(bootloader_bin) + firmware_with_boothloader_bin = target[0].dir.path + '/firmware_with_bootloader.bin' + if os.path.exists(firmware_with_boothloader_bin): + os.remove(firmware_with_boothloader_bin) + firmwareimage = open(firmware_with_boothloader_bin, "wb") + position = 0 + while position < lengthbootloader: + byte = bootloader.read(1) + firmwareimage.write(byte) + position += 1 + position = 0 + while position < lengthfirmware: + byte = firmware.read(1) + firmwareimage.write(byte) + position += 1 + bootloader.close() + firmware.close() + firmwareimage.close() - firmware_with_boothloader_bin = target[0].dir.path + '/firmware_with_bootloader.bin' - if os.path.exists(firmware_with_boothloader_bin): - os.remove(firmware_with_boothloader_bin) - firmwareimage = open(firmware_with_boothloader_bin, "wb") - position = 0 - while position < lengthbootloader: - byte = bootloader.read(1) - firmwareimage.write(byte) - position += 1 - position = 0 - while position < lengthfirmware: - byte = firmware.read(1) - firmwareimage.write(byte) - position += 1 - bootloader.close() - firmware.close() - firmwareimage.close() + firmware_without_bootloader_bin = target[0].dir.path + '/firmware_for_sd_upload.bin' + if os.path.exists(firmware_without_bootloader_bin): + os.remove(firmware_without_bootloader_bin) + os.rename(target[0].path, firmware_without_bootloader_bin) + #os.rename(target[0].dir.path+'/firmware_with_bootloader.bin', target[0].dir.path+'/firmware.bin') - firmware_without_bootloader_bin = target[0].dir.path + '/firmware_for_sd_upload.bin' - if os.path.exists(firmware_without_bootloader_bin): - os.remove(firmware_without_bootloader_bin) - os.rename(target[0].path, firmware_without_bootloader_bin) - #os.rename(target[0].dir.path+'/firmware_with_bootloader.bin', target[0].dir.path+'/firmware.bin') - -marlin.add_post_action(addboot); + marlin.add_post_action(addboot); diff --git a/buildroot/share/PlatformIO/scripts/lerdge.py b/buildroot/share/PlatformIO/scripts/lerdge.py index 144ab64a9a23..505a935560a9 100644 --- a/buildroot/share/PlatformIO/scripts/lerdge.py +++ b/buildroot/share/PlatformIO/scripts/lerdge.py @@ -1,47 +1,49 @@ # -# buildroot/share/PlatformIO/scripts/lerdge.py +# lerdge.py # Customizations for Lerdge build environments: # env:LERDGEX env:LERDGEX_usb_flash_drive # env:LERDGES env:LERDGES_usb_flash_drive # env:LERDGEK env:LERDGEK_usb_flash_drive # -import os,marlin -Import("env") +import pioutil +if pioutil.is_pio_build(): + import os,marlin + Import("env") -from SCons.Script import DefaultEnvironment -board = DefaultEnvironment().BoardConfig() + from SCons.Script import DefaultEnvironment + board = DefaultEnvironment().BoardConfig() -def encryptByte(byte): - byte = 0xFF & ((byte << 6) | (byte >> 2)) - i = 0x58 + byte - j = 0x05 + byte + (i >> 8) - byte = (0xF8 & i) | (0x07 & j) - return byte + def encryptByte(byte): + byte = 0xFF & ((byte << 6) | (byte >> 2)) + i = 0x58 + byte + j = 0x05 + byte + (i >> 8) + byte = (0xF8 & i) | (0x07 & j) + return byte -def encrypt_file(input, output_file, file_length): - input_file = bytearray(input.read()) - for i in range(len(input_file)): - input_file[i] = encryptByte(input_file[i]) - output_file.write(input_file) + def encrypt_file(input, output_file, file_length): + input_file = bytearray(input.read()) + for i in range(len(input_file)): + input_file[i] = encryptByte(input_file[i]) + output_file.write(input_file) -# Encrypt ${PROGNAME}.bin and save it with the name given in build.encrypt -def encrypt(source, target, env): - fwpath = target[0].path - enname = board.get("build.encrypt") - print("Encrypting %s to %s" % (fwpath, enname)) - fwfile = open(fwpath, "rb") - enfile = open(target[0].dir.path + "/" + enname, "wb") - length = os.path.getsize(fwpath) + # Encrypt ${PROGNAME}.bin and save it with the name given in build.encrypt + def encrypt(source, target, env): + fwpath = target[0].path + enname = board.get("build.encrypt") + print("Encrypting %s to %s" % (fwpath, enname)) + fwfile = open(fwpath, "rb") + enfile = open(target[0].dir.path + "/" + enname, "wb") + length = os.path.getsize(fwpath) - encrypt_file(fwfile, enfile, length) + encrypt_file(fwfile, enfile, length) - fwfile.close() - enfile.close() - os.remove(fwpath) + fwfile.close() + enfile.close() + os.remove(fwpath) -if 'encrypt' in board.get("build").keys(): - if board.get("build.encrypt") != "": - marlin.add_post_action(encrypt) -else: - print("LERDGE builds require output file via board_build.encrypt = 'filename' parameter") - exit(1) + if 'encrypt' in board.get("build").keys(): + if board.get("build.encrypt") != "": + marlin.add_post_action(encrypt) + else: + print("LERDGE builds require output file via board_build.encrypt = 'filename' parameter") + exit(1) diff --git a/buildroot/share/PlatformIO/scripts/marlin.py b/buildroot/share/PlatformIO/scripts/marlin.py index caa0c89749c1..b8a6283cedf1 100644 --- a/buildroot/share/PlatformIO/scripts/marlin.py +++ b/buildroot/share/PlatformIO/scripts/marlin.py @@ -1,5 +1,5 @@ # -# buildroot/share/PlatformIO/scripts/marlin.py +# marlin.py # Helper module with some commonly-used functions # import os,shutil @@ -10,13 +10,13 @@ from os.path import join def copytree(src, dst, symlinks=False, ignore=None): - for item in os.listdir(src): - s = join(src, item) - d = join(dst, item) - if os.path.isdir(s): - shutil.copytree(s, d, symlinks, ignore) - else: - shutil.copy2(s, d) + for item in os.listdir(src): + s = join(src, item) + d = join(dst, item) + if os.path.isdir(s): + shutil.copytree(s, d, symlinks, ignore) + else: + shutil.copy2(s, d) def replace_define(field, value): for define in env['CPPDEFINES']: diff --git a/buildroot/share/PlatformIO/scripts/mks_robin.py b/buildroot/share/PlatformIO/scripts/mks_robin.py index 2dea7c615f79..7b423bedabc7 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin.py @@ -1,5 +1,5 @@ # -# buildroot/share/PlatformIO/scripts/mks_robin.py +# mks_robin.py # import robin robin.prepare("0x08007000", "mks_robin.ld", "Robin.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_e3.py b/buildroot/share/PlatformIO/scripts/mks_robin_e3.py index 6ddeccbf80f4..645230c625c2 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_e3.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_e3.py @@ -1,5 +1,5 @@ # -# buildroot/share/PlatformIO/scripts/mks_robin_e3.py +# mks_robin_e3.py # import robin robin.prepare("0x08005000", "mks_robin_e3.ld", "Robin_e3.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py b/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py index 5eeb93c09663..bb15cb5a70f2 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py @@ -1,5 +1,5 @@ # -# buildroot/share/PlatformIO/scripts/mks_robin_e3p.py +# mks_robin_e3p.py # import robin robin.prepare("0x08007000", "mks_robin_e3p.ld", "Robin_e3p.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_lite.py b/buildroot/share/PlatformIO/scripts/mks_robin_lite.py index c2018336fd1f..123b043f7cfb 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_lite.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_lite.py @@ -1,5 +1,5 @@ # -# buildroot/share/PlatformIO/scripts/mks_robin_lite.py +# mks_robin_lite.py # import robin robin.prepare("0x08005000", "mks_robin_lite.ld", "mksLite.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py b/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py index 42c8fb18b691..092231eae81f 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py @@ -1,5 +1,5 @@ # -# buildroot/share/PlatformIO/scripts/mks_robin_lite3.py +# mks_robin_lite3.py # import robin robin.prepare("0x08005000", "mks_robin_lite.ld", "mksLite3.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_mini.py b/buildroot/share/PlatformIO/scripts/mks_robin_mini.py index b0d83886533a..d1d175dd1c17 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_mini.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_mini.py @@ -1,5 +1,5 @@ # -# buildroot/share/PlatformIO/scripts/mks_robin_mini.py +# mks_robin_mini.py # import robin robin.prepare("0x08007000", "mks_robin_mini.ld", "Robin_mini.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py index 35e99830c4df..32d1af23662c 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py @@ -1,5 +1,5 @@ # -# buildroot/share/PlatformIO/scripts/mks_robin_nano.py +# mks_robin_nano.py # import robin robin.prepare("0x08007000", "mks_robin_nano.ld", "Robin_nano.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py index 4a5726ad5b98..7e635bd6ecf7 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py @@ -1,5 +1,5 @@ # -# buildroot/share/PlatformIO/scripts/mks_robin_nano35.py +# mks_robin_nano35.py # import robin robin.prepare("0x08007000", "mks_robin_nano.ld", "Robin_nano35.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_pro.py b/buildroot/share/PlatformIO/scripts/mks_robin_pro.py index 60e2482bb030..54526aeaef57 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_pro.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_pro.py @@ -1,5 +1,5 @@ # -# buildroot/share/PlatformIO/scripts/mks_robin_pro.py +# mks_robin_pro.py # import robin robin.prepare("0x08007000", "mks_robin_pro.ld", "Robin_pro.bin") diff --git a/buildroot/share/PlatformIO/scripts/offset_and_rename.py b/buildroot/share/PlatformIO/scripts/offset_and_rename.py index 9caed298e434..00803b722eff 100644 --- a/buildroot/share/PlatformIO/scripts/offset_and_rename.py +++ b/buildroot/share/PlatformIO/scripts/offset_and_rename.py @@ -8,54 +8,56 @@ # # - For 'board_build.rename' add a post-action to rename the firmware file. # -import os,sys,marlin -Import("env") - -from SCons.Script import DefaultEnvironment -board = DefaultEnvironment().BoardConfig() - -board_keys = board.get("build").keys() - -# -# For build.offset define LD_FLASH_OFFSET, used by ldscript.ld -# -if 'offset' in board_keys: - LD_FLASH_OFFSET = board.get("build.offset") - marlin.relocate_vtab(LD_FLASH_OFFSET) - - # Flash size - maximum_flash_size = int(board.get("upload.maximum_size") / 1024) - marlin.replace_define('STM32_FLASH_SIZE', maximum_flash_size) - - # Get upload.maximum_ram_size (defined by /buildroot/share/PlatformIO/boards/VARIOUS.json) - maximum_ram_size = board.get("upload.maximum_ram_size") - - for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,--defsym=LD_FLASH_OFFSET" in flag: - env["LINKFLAGS"][i] = "-Wl,--defsym=LD_FLASH_OFFSET=" + LD_FLASH_OFFSET - if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag: - env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40) - -# -# For build.encrypt rename and encode the firmware file. -# -if 'encrypt' in board_keys: - - # Encrypt ${PROGNAME}.bin and save it with the name given in build.encrypt - def encrypt(source, target, env): - marlin.encrypt_mks(source, target, env, board.get("build.encrypt")) - - if board.get("build.encrypt") != "": - marlin.add_post_action(encrypt) - -# -# For build.rename simply rename the firmware file. -# -if 'rename' in board_keys: - - def rename_target(source, target, env): - firmware = os.path.join(target[0].dir.path, board.get("build.rename")) - import shutil - shutil.copy(target[0].path, firmware) - - marlin.add_post_action(rename_target) +import pioutil +if pioutil.is_pio_build(): + import os,sys,marlin + Import("env") + + from SCons.Script import DefaultEnvironment + board = DefaultEnvironment().BoardConfig() + + board_keys = board.get("build").keys() + + # + # For build.offset define LD_FLASH_OFFSET, used by ldscript.ld + # + if 'offset' in board_keys: + LD_FLASH_OFFSET = board.get("build.offset") + marlin.relocate_vtab(LD_FLASH_OFFSET) + + # Flash size + maximum_flash_size = int(board.get("upload.maximum_size") / 1024) + marlin.replace_define('STM32_FLASH_SIZE', maximum_flash_size) + + # Get upload.maximum_ram_size (defined by /buildroot/share/PlatformIO/boards/VARIOUS.json) + maximum_ram_size = board.get("upload.maximum_ram_size") + + for i, flag in enumerate(env["LINKFLAGS"]): + if "-Wl,--defsym=LD_FLASH_OFFSET" in flag: + env["LINKFLAGS"][i] = "-Wl,--defsym=LD_FLASH_OFFSET=" + LD_FLASH_OFFSET + if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag: + env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40) + + # + # For build.encrypt rename and encode the firmware file. + # + if 'encrypt' in board_keys: + + # Encrypt ${PROGNAME}.bin and save it with the name given in build.encrypt + def encrypt(source, target, env): + marlin.encrypt_mks(source, target, env, board.get("build.encrypt")) + + if board.get("build.encrypt") != "": + marlin.add_post_action(encrypt) + + # + # For build.rename simply rename the firmware file. + # + if 'rename' in board_keys: + + def rename_target(source, target, env): + firmware = os.path.join(target[0].dir.path, board.get("build.rename")) + import shutil + shutil.copy(target[0].path, firmware) + + marlin.add_post_action(rename_target) diff --git a/buildroot/share/PlatformIO/scripts/openblt.py b/buildroot/share/PlatformIO/scripts/openblt.py index 6e71ca9eb812..61b38a5e87f7 100644 --- a/buildroot/share/PlatformIO/scripts/openblt.py +++ b/buildroot/share/PlatformIO/scripts/openblt.py @@ -1,18 +1,20 @@ # # Convert the ELF to an SREC file suitable for some bootloaders # -import os,sys -from os.path import join +import pioutil +if pioutil.is_pio_build(): + import os,sys + from os.path import join -Import("env") + Import("env") -board = env.BoardConfig() -board_keys = board.get("build").keys() -if 'encrypt' in board_keys: - env.AddPostAction( - join("$BUILD_DIR", "${PROGNAME}.bin"), - env.VerboseAction(" ".join([ - "$OBJCOPY", "-O", "srec", - "\"$BUILD_DIR/${PROGNAME}.elf\"", "\"" + join("$BUILD_DIR", board.get("build.encrypt")) + "\"" - ]), "Building $TARGET") - ) + board = env.BoardConfig() + board_keys = board.get("build").keys() + if 'encrypt' in board_keys: + env.AddPostAction( + join("$BUILD_DIR", "${PROGNAME}.bin"), + env.VerboseAction(" ".join([ + "$OBJCOPY", "-O", "srec", + "\"$BUILD_DIR/${PROGNAME}.elf\"", "\"" + join("$BUILD_DIR", board.get("build.encrypt")) + "\"" + ]), "Building $TARGET") + ) diff --git a/buildroot/share/PlatformIO/scripts/pioutil.py b/buildroot/share/PlatformIO/scripts/pioutil.py index f0c021fca73e..b8c1e9cfca6c 100644 --- a/buildroot/share/PlatformIO/scripts/pioutil.py +++ b/buildroot/share/PlatformIO/scripts/pioutil.py @@ -1,8 +1,8 @@ # -# buildroot/share/PlatformIO/scripts/pioutil.py +# pioutil.py # -# Detect that 'vscode init' is running -def is_vscode_init(): +# Make sure 'vscode init' is not the current command +def is_pio_build(): from SCons.Script import COMMAND_LINE_TARGETS - return "idedata" in COMMAND_LINE_TARGETS or "_idedata" in COMMAND_LINE_TARGETS + return "idedata" not in COMMAND_LINE_TARGETS and "_idedata" not in COMMAND_LINE_TARGETS diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 0dab3e4b1fbd..1837a7580d24 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -2,100 +2,99 @@ # preflight-checks.py # Check for common issues prior to compiling # -import os,re,sys,pioutil -Import("env") +import pioutil +if pioutil.is_pio_build(): -# Detect that 'vscode init' is running -if pioutil.is_vscode_init(): - env.Exit(0) + import os,re,sys + Import("env") -def get_envs_for_board(board): - with open(os.path.join("Marlin", "src", "pins", "pins.h"), "r") as file: + def get_envs_for_board(board): + with open(os.path.join("Marlin", "src", "pins", "pins.h"), "r") as file: - if sys.platform == 'win32': - envregex = r"(?:env|win):" - elif sys.platform == 'darwin': - envregex = r"(?:env|mac|uni):" - elif sys.platform == 'linux': - envregex = r"(?:env|lin|uni):" - else: - envregex = r"(?:env):" + if sys.platform == 'win32': + envregex = r"(?:env|win):" + elif sys.platform == 'darwin': + envregex = r"(?:env|mac|uni):" + elif sys.platform == 'linux': + envregex = r"(?:env|lin|uni):" + else: + envregex = r"(?:env):" - r = re.compile(r"if\s+MB\((.+)\)") - if board.startswith("BOARD_"): - board = board[6:] + r = re.compile(r"if\s+MB\((.+)\)") + if board.startswith("BOARD_"): + board = board[6:] - for line in file: - mbs = r.findall(line) - if mbs and board in re.split(r",\s*", mbs[0]): - line = file.readline() - found_envs = re.match(r"\s*#include .+" + envregex, line) - if found_envs: - envlist = re.findall(envregex + r"(\w+)", line) - return [ "env:"+s for s in envlist ] - return [] + for line in file: + mbs = r.findall(line) + if mbs and board in re.split(r",\s*", mbs[0]): + line = file.readline() + found_envs = re.match(r"\s*#include .+" + envregex, line) + if found_envs: + envlist = re.findall(envregex + r"(\w+)", line) + return [ "env:"+s for s in envlist ] + return [] -def check_envs(build_env, board_envs, config): - if build_env in board_envs: - return True - ext = config.get(build_env, 'extends', default=None) - if ext: - if isinstance(ext, str): - return check_envs(ext, board_envs, config) - elif isinstance(ext, list): - for ext_env in ext: - if check_envs(ext_env, board_envs, config): - return True - return False + def check_envs(build_env, board_envs, config): + if build_env in board_envs: + return True + ext = config.get(build_env, 'extends', default=None) + if ext: + if isinstance(ext, str): + return check_envs(ext, board_envs, config) + elif isinstance(ext, list): + for ext_env in ext: + if check_envs(ext_env, board_envs, config): + return True + return False -def sanity_check_target(): - # Sanity checks: - if 'PIOENV' not in env: - raise SystemExit("Error: PIOENV is not defined. This script is intended to be used with PlatformIO") + def sanity_check_target(): + # Sanity checks: + if 'PIOENV' not in env: + raise SystemExit("Error: PIOENV is not defined. This script is intended to be used with PlatformIO") - if 'MARLIN_FEATURES' not in env: - raise SystemExit("Error: this script should be used after common Marlin scripts") + if 'MARLIN_FEATURES' not in env: + raise SystemExit("Error: this script should be used after common Marlin scripts") - if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: - raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") + if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: + raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") - build_env = env['PIOENV'] - motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] - board_envs = get_envs_for_board(motherboard) - config = env.GetProjectConfig() - result = check_envs("env:"+build_env, board_envs, config) + build_env = env['PIOENV'] + motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] + board_envs = get_envs_for_board(motherboard) + config = env.GetProjectConfig() + result = check_envs("env:"+build_env, board_envs, config) - if not result: - err = "Error: Build environment '%s' is incompatible with %s. Use one of these: %s" % \ - ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) - raise SystemExit(err) + if not result: + err = "Error: Build environment '%s' is incompatible with %s. Use one of these: %s" % \ + ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) + raise SystemExit(err) - # - # Check for Config files in two common incorrect places - # - for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: - for f in [ "Configuration.h", "Configuration_adv.h" ]: - if os.path.isfile(os.path.join(p, f)): - err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p - raise SystemExit(err) + # + # Check for Config files in two common incorrect places + # + for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: + for f in [ "Configuration.h", "Configuration_adv.h" ]: + if os.path.isfile(os.path.join(p, f)): + err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p + raise SystemExit(err) - # - # Give warnings on every build - # - warnfile = os.path.join(env['PROJECT_BUILD_DIR'], build_env, "src", "src", "inc", "Warnings.cpp.o") - if os.path.exists(warnfile): - os.remove(warnfile) + # + # Give warnings on every build + # + warnfile = os.path.join(env['PROJECT_BUILD_DIR'], build_env, "src", "src", "inc", "Warnings.cpp.o") + if os.path.exists(warnfile): + os.remove(warnfile) - # - # Check for old files indicating an entangled Marlin (mixing old and new code) - # - mixedin = [] - p = os.path.join(env['PROJECT_DIR'], "Marlin", "src", "lcd", "dogm") - for f in [ "ultralcd_DOGM.cpp", "ultralcd_DOGM.h" ]: - if os.path.isfile(os.path.join(p, f)): - mixedin += [ f ] - if mixedin: - err = "ERROR: Old files fell into your Marlin folder. Remove %s and try again" % ", ".join(mixedin) - raise SystemExit(err) + # + # Check for old files indicating an entangled Marlin (mixing old and new code) + # + mixedin = [] + p = os.path.join(env['PROJECT_DIR'], "Marlin", "src", "lcd", "dogm") + for f in [ "ultralcd_DOGM.cpp", "ultralcd_DOGM.h" ]: + if os.path.isfile(os.path.join(p, f)): + mixedin += [ f ] + if mixedin: + err = "ERROR: Old files fell into your Marlin folder. Remove %s and try again" % ", ".join(mixedin) + raise SystemExit(err) -sanity_check_target() + sanity_check_target() diff --git a/buildroot/share/PlatformIO/scripts/random-bin.py b/buildroot/share/PlatformIO/scripts/random-bin.py index c03b8634487a..5a88906c3092 100644 --- a/buildroot/share/PlatformIO/scripts/random-bin.py +++ b/buildroot/share/PlatformIO/scripts/random-bin.py @@ -2,8 +2,8 @@ # random-bin.py # Set a unique firmware name based on current date and time # -Import("env") - -from datetime import datetime - -env['PROGNAME'] = datetime.now().strftime("firmware-%Y%m%d-%H%M%S") +import pioutil +if pioutil.is_pio_build(): + from datetime import datetime + Import("env") + env['PROGNAME'] = datetime.now().strftime("firmware-%Y%m%d-%H%M%S") diff --git a/buildroot/share/PlatformIO/scripts/robin.py b/buildroot/share/PlatformIO/scripts/robin.py index 50d0d92d2ff7..ffc9a43b9004 100644 --- a/buildroot/share/PlatformIO/scripts/robin.py +++ b/buildroot/share/PlatformIO/scripts/robin.py @@ -1,12 +1,14 @@ # -# buildroot/share/PlatformIO/scripts/robin.py +# robin.py # -import marlin # Apply customizations for a MKS Robin def prepare(address, ldname, fwname): - def encrypt(source, target, env): - marlin.encrypt_mks(source, target, env, fwname) - marlin.relocate_firmware(address) - marlin.custom_ld_script(ldname) - marlin.add_post_action(encrypt); + import pioutil + if pioutil.is_pio_build(): + import marlin + def encrypt(source, target, env): + marlin.encrypt_mks(source, target, env, fwname) + marlin.relocate_firmware(address) + marlin.custom_ld_script(ldname) + marlin.add_post_action(encrypt); diff --git a/buildroot/share/PlatformIO/scripts/simulator.py b/buildroot/share/PlatformIO/scripts/simulator.py index fb9d93ccebcc..c6a5277b92ad 100644 --- a/buildroot/share/PlatformIO/scripts/simulator.py +++ b/buildroot/share/PlatformIO/scripts/simulator.py @@ -1,52 +1,54 @@ # +# simulator.py # PlatformIO pre: script for simulator builds # +import pioutil +if pioutil.is_pio_build(): + # Get the environment thus far for the build + Import("env") -# Get the environment thus far for the build -Import("env") + #print(env.Dump()) -#print(env.Dump()) + # + # Give the binary a distinctive name + # -# -# Give the binary a distinctive name -# - -env['PROGNAME'] = "MarlinSimulator" + env['PROGNAME'] = "MarlinSimulator" -# -# If Xcode is installed add the path to its Frameworks folder, -# or if Mesa is installed try to use its GL/gl.h. -# + # + # If Xcode is installed add the path to its Frameworks folder, + # or if Mesa is installed try to use its GL/gl.h. + # -import sys -if sys.platform == 'darwin': + import sys + if sys.platform == 'darwin': - # - # Silence half of the ranlib warnings. (No equivalent for 'ARFLAGS') - # - env['RANLIBFLAGS'] += [ "-no_warning_for_no_symbols" ] + # + # Silence half of the ranlib warnings. (No equivalent for 'ARFLAGS') + # + env['RANLIBFLAGS'] += [ "-no_warning_for_no_symbols" ] - # Default paths for Xcode and a lucky GL/gl.h dropped by Mesa - xcode_path = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks" - mesa_path = "/opt/local/include/GL/gl.h" + # Default paths for Xcode and a lucky GL/gl.h dropped by Mesa + xcode_path = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks" + mesa_path = "/opt/local/include/GL/gl.h" - import os.path + import os.path - if os.path.exists(xcode_path): + if os.path.exists(xcode_path): - env['BUILD_FLAGS'] += [ "-F" + xcode_path ] - print("Using OpenGL framework headers from Xcode.app") + env['BUILD_FLAGS'] += [ "-F" + xcode_path ] + print("Using OpenGL framework headers from Xcode.app") - elif os.path.exists(mesa_path): + elif os.path.exists(mesa_path): - env['BUILD_FLAGS'] += [ '-D__MESA__' ] - print("Using OpenGL header from", mesa_path) + env['BUILD_FLAGS'] += [ '-D__MESA__' ] + print("Using OpenGL header from", mesa_path) - else: + else: - print("\n\nNo OpenGL headers found. Install Xcode for matching headers, or use 'sudo port install mesa' to get a GL/gl.h.\n\n") + print("\n\nNo OpenGL headers found. Install Xcode for matching headers, or use 'sudo port install mesa' to get a GL/gl.h.\n\n") - # Break out of the PIO build immediately - sys.exit(1) + # Break out of the PIO build immediately + sys.exit(1) -env.AddCustomTarget("upload", "$BUILD_DIR/${PROGNAME}", "$BUILD_DIR/${PROGNAME}") + env.AddCustomTarget("upload", "$BUILD_DIR/${PROGNAME}", "$BUILD_DIR/${PROGNAME}") diff --git a/buildroot/share/PlatformIO/scripts/stm32_serialbuffer.py b/buildroot/share/PlatformIO/scripts/stm32_serialbuffer.py index c3779289e0f3..033803009e52 100644 --- a/buildroot/share/PlatformIO/scripts/stm32_serialbuffer.py +++ b/buildroot/share/PlatformIO/scripts/stm32_serialbuffer.py @@ -1,59 +1,61 @@ # # stm32_serialbuffer.py # -Import("env") - -# Marlin uses the `RX_BUFFER_SIZE` \ `TX_BUFFER_SIZE` options to -# configure buffer sizes for receiving \ transmitting serial data. -# Stm32duino uses another set of defines for the same purpose, so this -# script gets the values from the configuration and uses them to define -# `SERIAL_RX_BUFFER_SIZE` and `SERIAL_TX_BUFFER_SIZE` as global build -# flags so they are available for use by the platform. -# -# The script will set the value as the default one (64 bytes) -# or the user-configured one, whichever is higher. -# -# Marlin's default buffer sizes are 128 for RX and 32 for TX. -# The highest value is taken (128/64). -# -# If MF_*_BUFFER_SIZE, SERIAL_*_BUFFER_SIZE, USART_*_BUF_SIZE, are -# defined, the first of these values will be used as the minimum. -build_flags = env.ParseFlags(env.get('BUILD_FLAGS'))["CPPDEFINES"] -mf = env["MARLIN_FEATURES"] - -# Get a build flag's value or None -def getBuildFlagValue(name): - for flag in build_flags: - if isinstance(flag, list) and flag[0] == name: - return flag[1] - - return None - -# Get an overriding buffer size for RX or TX from the build flags -def getInternalSize(side): - return getBuildFlagValue(f"MF_{side}_BUFFER_SIZE") or \ - getBuildFlagValue(f"SERIAL_{side}_BUFFER_SIZE") or \ - getBuildFlagValue(f"USART_{side}_BUF_SIZE") - -# Get the largest defined buffer size for RX or TX -def getBufferSize(side, default): - # Get a build flag value or fall back to the given default - internal = int(getInternalSize(side) or default) - flag = side + "_BUFFER_SIZE" - # Return the largest value - return max(int(mf[flag]), internal) if flag in mf else internal - -# Add a build flag if it's not already defined -def tryAddFlag(name, value): - if getBuildFlagValue(name) is None: - env.Append(BUILD_FLAGS=[f"-D{name}={value}"]) - -# Get the largest defined buffer sizes for RX or TX, using defaults for undefined -rxBuf = getBufferSize("RX", 128) -txBuf = getBufferSize("TX", 64) - -# Provide serial buffer sizes to the stm32duino platform -tryAddFlag("SERIAL_RX_BUFFER_SIZE", rxBuf) -tryAddFlag("SERIAL_TX_BUFFER_SIZE", txBuf) -tryAddFlag("USART_RX_BUF_SIZE", rxBuf) -tryAddFlag("USART_TX_BUF_SIZE", txBuf) +import pioutil +if pioutil.is_pio_build(): + Import("env") + + # Get a build flag's value or None + def getBuildFlagValue(name): + for flag in build_flags: + if isinstance(flag, list) and flag[0] == name: + return flag[1] + + return None + + # Get an overriding buffer size for RX or TX from the build flags + def getInternalSize(side): + return getBuildFlagValue(f"MF_{side}_BUFFER_SIZE") or \ + getBuildFlagValue(f"SERIAL_{side}_BUFFER_SIZE") or \ + getBuildFlagValue(f"USART_{side}_BUF_SIZE") + + # Get the largest defined buffer size for RX or TX + def getBufferSize(side, default): + # Get a build flag value or fall back to the given default + internal = int(getInternalSize(side) or default) + flag = side + "_BUFFER_SIZE" + # Return the largest value + return max(int(mf[flag]), internal) if flag in mf else internal + + # Add a build flag if it's not already defined + def tryAddFlag(name, value): + if getBuildFlagValue(name) is None: + env.Append(BUILD_FLAGS=[f"-D{name}={value}"]) + + # Marlin uses the `RX_BUFFER_SIZE` \ `TX_BUFFER_SIZE` options to + # configure buffer sizes for receiving \ transmitting serial data. + # Stm32duino uses another set of defines for the same purpose, so this + # script gets the values from the configuration and uses them to define + # `SERIAL_RX_BUFFER_SIZE` and `SERIAL_TX_BUFFER_SIZE` as global build + # flags so they are available for use by the platform. + # + # The script will set the value as the default one (64 bytes) + # or the user-configured one, whichever is higher. + # + # Marlin's default buffer sizes are 128 for RX and 32 for TX. + # The highest value is taken (128/64). + # + # If MF_*_BUFFER_SIZE, SERIAL_*_BUFFER_SIZE, USART_*_BUF_SIZE, are + # defined, the first of these values will be used as the minimum. + build_flags = env.ParseFlags(env.get('BUILD_FLAGS'))["CPPDEFINES"] + mf = env["MARLIN_FEATURES"] + + # Get the largest defined buffer sizes for RX or TX, using defaults for undefined + rxBuf = getBufferSize("RX", 128) + txBuf = getBufferSize("TX", 64) + + # Provide serial buffer sizes to the stm32duino platform + tryAddFlag("SERIAL_RX_BUFFER_SIZE", rxBuf) + tryAddFlag("SERIAL_TX_BUFFER_SIZE", txBuf) + tryAddFlag("USART_RX_BUF_SIZE", rxBuf) + tryAddFlag("USART_TX_BUF_SIZE", txBuf) diff --git a/ini/stm32f1-maple.ini b/ini/stm32f1-maple.ini index e0b4ad711a37..969bb815dacd 100644 --- a/ini/stm32f1-maple.ini +++ b/ini/stm32f1-maple.ini @@ -326,7 +326,6 @@ platform = ${common_stm32f1.platform} extends = common_stm32f1 board = marlin_CHITU_F103 extra_scripts = ${common_stm32f1.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/chitu_crypt.py build_flags = ${common_stm32f1.build_flags} From 7b792014703e778d8fc0b1760747d50ab8f340d1 Mon Sep 17 00:00:00 2001 From: BigTreeTech <38851044+bigtreetech@users.noreply.github.com> Date: Thu, 4 Nov 2021 18:54:38 +0800 Subject: [PATCH 64/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20Octopus-Pro=20Max318?= =?UTF-8?q?65=20/=20SPI=20(#23072)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pins/stm32f4/pins_BTT_OCTOPUS_PRO_V1_0.h | 1 + .../src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_PRO_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_PRO_V1_0.h index a93ed68201b0..fd367e87c04f 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_PRO_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_PRO_V1_0.h @@ -32,6 +32,7 @@ #define TEMP_0_MISO_PIN PA6 #define TEMP_0_MOSI_PIN PA7 #define SOFTWARE_SPI // Max31865 and LCD SD share a set of SPIs, Set SD to softwareSPI for Max31865 + #define FORCE_SOFT_SPI #else #define TEMP_0_PIN PF4 // TH0 #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h index 6dc90bf910ef..efeff04f256a 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h @@ -168,13 +168,6 @@ #define POWER_LOSS_PIN PC0 // PWRDET #endif -// -// NeoPixel LED -// -#ifndef NEOPIXEL_PIN - #define NEOPIXEL_PIN PB0 -#endif - // // Steppers // @@ -524,6 +517,13 @@ #define BTN_ENC EXP1_09_PIN #endif +// +// NeoPixel LED +// +#ifndef NEOPIXEL_PIN + #define NEOPIXEL_PIN PB0 +#endif + // // WIFI // From a9dc737624cf45bceff1866ce4807bb2cc36ac44 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Thu, 4 Nov 2021 18:04:04 +0100 Subject: [PATCH 65/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20TFT=20backlight=20[S?= =?UTF-8?q?TM32]=20(#23062)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/STM32/fast_pwm.cpp | 4 +++- Marlin/src/HAL/STM32F1/fast_pwm.cpp | 1 + Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 4 +++- Marlin/src/lcd/tft/ui_common.cpp | 4 +++- Marlin/src/lcd/tft_io/tft_io.cpp | 3 +-- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 14 +++++++++++--- 6 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Marlin/src/HAL/STM32/fast_pwm.cpp b/Marlin/src/HAL/STM32/fast_pwm.cpp index d4d695b969b5..4d450374d32b 100644 --- a/Marlin/src/HAL/STM32/fast_pwm.cpp +++ b/Marlin/src/HAL/STM32/fast_pwm.cpp @@ -28,11 +28,13 @@ #include "timers.h" void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { + if (!PWM_PIN(pin)) return; // Don't proceed if no hardware timer + PinName pin_name = digitalPinToPinName(pin); TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(pin_name, PinMap_PWM); + uint16_t adj_val = Instance->ARR * v / v_size; if (invert) adj_val = Instance->ARR - adj_val; - switch (get_pwm_channel(pin_name)) { case TIM_CHANNEL_1: LL_TIM_OC_SetCompareCH1(Instance, adj_val); break; case TIM_CHANNEL_2: LL_TIM_OC_SetCompareCH2(Instance, adj_val); break; diff --git a/Marlin/src/HAL/STM32F1/fast_pwm.cpp b/Marlin/src/HAL/STM32F1/fast_pwm.cpp index 6a9d7e8a1947..5171c11545f5 100644 --- a/Marlin/src/HAL/STM32F1/fast_pwm.cpp +++ b/Marlin/src/HAL/STM32F1/fast_pwm.cpp @@ -28,6 +28,7 @@ #include "timers.h" void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { + if (!PWM_PIN(pin)) return; timer_dev *timer = PIN_MAP[pin].timer_device; uint16_t max_val = timer->regs.bas->ARR * v / v_size; if (invert) max_val = v_size - max_val; diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index f339cad70614..59c74148adef 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -339,12 +339,14 @@ void MarlinUI::draw_kill_screen() { void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop #if HAS_LCD_BRIGHTNESS + void MarlinUI::_set_brightness() { #if PIN_EXISTS(TFT_BACKLIGHT) if (PWM_PIN(TFT_BACKLIGHT_PIN)) - set_pwm_duty(pin_t(TFT_BACKLIGHT_PIN), brightness); + analogWrite(pin_t(TFT_BACKLIGHT_PIN), backlight ? brightness : 0); #endif } + #endif #if HAS_LCD_MENU diff --git a/Marlin/src/lcd/tft/ui_common.cpp b/Marlin/src/lcd/tft/ui_common.cpp index 85ae21e867fa..acc91f51fa83 100644 --- a/Marlin/src/lcd/tft/ui_common.cpp +++ b/Marlin/src/lcd/tft/ui_common.cpp @@ -210,12 +210,14 @@ void MarlinUI::clear_lcd() { } #if HAS_LCD_BRIGHTNESS + void MarlinUI::_set_brightness() { #if PIN_EXISTS(TFT_BACKLIGHT) if (PWM_PIN(TFT_BACKLIGHT_PIN)) - set_pwm_duty(pin_t(TFT_BACKLIGHT_PIN), brightness); + analogWrite(pin_t(TFT_BACKLIGHT_PIN), backlight ? brightness : 0); #endif } + #endif #if ENABLED(TOUCH_SCREEN_CALIBRATION) diff --git a/Marlin/src/lcd/tft_io/tft_io.cpp b/Marlin/src/lcd/tft_io/tft_io.cpp index 6ec3bedcdff6..acb78c3e6e9f 100644 --- a/Marlin/src/lcd/tft_io/tft_io.cpp +++ b/Marlin/src/lcd/tft_io/tft_io.cpp @@ -152,8 +152,7 @@ if (lcd_id != 0xFFFFFFFF) return; #endif #if PIN_EXISTS(TFT_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) - WRITE(TFT_BACKLIGHT_PIN, HIGH); - TERN_(HAS_LCD_BRIGHTNESS, ui._set_brightness()); + TERN(HAS_LCD_BRIGHTNESS, ui._set_brightness(), WRITE(TFT_BACKLIGHT_PIN, HIGH)); #endif } diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 7585a6e28951..3a8019a27e9c 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -89,9 +89,17 @@ #define HEATER_BED_PIN PA8 // pin 67 (Hot Bed Mosfet) #define FAN_PIN PA15 // pin 77 (4cm Fan) -#define FAN_SOFT_PWM // Required to avoid issues with heating or STLink -#define FAN_MIN_PWM 35 // Fan will not start in 1-30 range -#define FAN_MAX_PWM 255 +#ifdef MAPLE_STM32F1 + #define FAN_SOFT_PWM // Required to avoid issues with heating or STLink + #define FAN_MIN_PWM 35 // Fan will not start in 1-30 range + #define FAN_MAX_PWM 255 +#else + #define FAST_PWM_FAN // STM32 Variant allow TIMER2 Hardware PWM + #define FAST_PWM_FAN_FREQUENCY 31400 // This frequency allow a good range, fan starts at 3%, half noise at 50% + #define NEEDS_HARDWARE_PWM 1 + #define FAN_MIN_PWM 5 + #define FAN_MAX_PWM 255 +#endif //#define BEEPER_PIN PD13 // pin 60 (Servo PWM output 5V/GND on Board V0G+) made for BL-Touch sensor // Can drive a PC Buzzer, if connected between PWM and 5V pins From f53d627750ab0cf377ea1738bdcf792f2ef37de9 Mon Sep 17 00:00:00 2001 From: Skruppy Date: Thu, 4 Nov 2021 18:11:57 +0100 Subject: [PATCH 66/78] =?UTF-8?q?=F0=9F=90=9B=20Prevent=20AVR=20watchdogpi?= =?UTF-8?q?le=20(#23075)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 3 +++ Marlin/src/HAL/AVR/HAL.cpp | 21 ++++++++++++++++++++- Marlin/src/HAL/AVR/HAL.h | 6 +++--- Marlin/src/inc/SanityCheck.h | 5 +++++ 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 934ceceafd20..fc495a6ea632 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -4224,3 +4224,6 @@ */ //#define SOFT_RESET_VIA_SERIAL // 'KILL' and '^X' commands will soft-reset the controller //#define SOFT_RESET_ON_KILL // Use a digital button to soft-reset the controller after KILL + +// Report uncleaned reset reason from register r2 instead of MCUSR. Supported by Optiboot on AVR. +//#define OPTIBOOT_RESET_REASON diff --git a/Marlin/src/HAL/AVR/HAL.cpp b/Marlin/src/HAL/AVR/HAL.cpp index 708583b262a6..d7bf2a6f6fbb 100644 --- a/Marlin/src/HAL/AVR/HAL.cpp +++ b/Marlin/src/HAL/AVR/HAL.cpp @@ -35,12 +35,31 @@ // Public Variables // ------------------------ -//uint8_t MCUSR; +// Don't initialize/override variable (which would happen in .init4) +uint8_t reset_reason __attribute__((section(".noinit"))); // ------------------------ // Public functions // ------------------------ +__attribute__((naked)) // Don't output function pro- and epilogue +__attribute__((used)) // Output the function, even if "not used" +__attribute__((section(".init3"))) // Put in an early user definable section +void HAL_save_reset_reason() { + #if ENABLED(OPTIBOOT_RESET_REASON) + __asm__ __volatile__( + A("STS %0, r2") + : "=m"(reset_reason) + ); + #else + reset_reason = MCUSR; + #endif + + // Clear within 16ms since WDRF bit enables a 16ms watchdog timer -> Boot loop + MCUSR = 0; + wdt_disable(); +} + void HAL_init() { // Init Servo Pins #define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW) diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index ad1f47a4e685..2217f239d64e 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -91,7 +91,7 @@ typedef int8_t pin_t; // Public Variables // ------------------------ -//extern uint8_t MCUSR; +extern uint8_t reset_reason; // Serial ports #ifdef USBCON @@ -152,8 +152,8 @@ void HAL_init(); //void _delay_ms(const int delay); -inline void HAL_clear_reset_source() { MCUSR = 0; } -inline uint8_t HAL_get_reset_source() { return MCUSR; } +inline void HAL_clear_reset_source() { } +inline uint8_t HAL_get_reset_source() { return reset_reason; } void HAL_reboot(); diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b4eaf242b707..fbdda2c12758 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2489,6 +2489,11 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "An encoder button is required or SOFT_RESET_ON_KILL will reset the printer without notice!" #endif +// Reset reason for AVR +#if ENABLED(OPTIBOOT_RESET_REASON) && !defined(__AVR__) + #error "OPTIBOOT_RESET_REASON only applies to AVR." +#endif + /** * I2C bus */ From f6147e038bbd4b4b96c8c188107b9e7d4f02d534 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 4 Nov 2021 12:18:23 -0500 Subject: [PATCH 67/78] =?UTF-8?q?=F0=9F=8D=BB=20Get/clear=20reset=20source?= =?UTF-8?q?=20earlier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #23075 --- Marlin/src/MarlinCore.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index eb57835f969d..5e8881d1c647 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -1104,6 +1104,10 @@ void setup() { tmc_standby_setup(); // TMC Low Power Standby pins must be set early or they're not usable + // Check startup - does nothing if bootloader sets MCUSR to 0 + const byte mcu = HAL_get_reset_source(); + HAL_clear_reset_source(); + #if ENABLED(MARLIN_DEV_MODE) auto log_current_ms = [&](PGM_P const msg) { SERIAL_ECHO_START(); @@ -1232,15 +1236,14 @@ void setup() { SETUP_RUN(esp_wifi_init()); - // Check startup - does nothing if bootloader sets MCUSR to 0 - const byte mcu = HAL_get_reset_source(); + // Report Reset Reason if (mcu & RST_POWER_ON) SERIAL_ECHOLNPGM(STR_POWERUP); if (mcu & RST_EXTERNAL) SERIAL_ECHOLNPGM(STR_EXTERNAL_RESET); if (mcu & RST_BROWN_OUT) SERIAL_ECHOLNPGM(STR_BROWNOUT_RESET); if (mcu & RST_WATCHDOG) SERIAL_ECHOLNPGM(STR_WATCHDOG_RESET); if (mcu & RST_SOFTWARE) SERIAL_ECHOLNPGM(STR_SOFTWARE_RESET); - HAL_clear_reset_source(); + // Identify myself as Marlin x.x.x SERIAL_ECHOLNPGM("Marlin " SHORT_BUILD_VERSION); #if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR) SERIAL_ECHO_MSG( From 3e8cdef36b42d4cae1efc8fe3272497827dcc440 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 5 Nov 2021 01:00:14 +0000 Subject: [PATCH 68/78] [cron] Bump distribution date (2021-11-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 e562730ae3f6..b94659a0447c 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 "2021-11-04" +//#define STRING_DISTRIBUTION_DATE "2021-11-05" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index f695d0a1b24a..115eb4bbd2c0 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 "2021-11-04" + #define STRING_DISTRIBUTION_DATE "2021-11-05" #endif /** From 1b0e43a74d48549f26d30d17b59468dfcc71d459 Mon Sep 17 00:00:00 2001 From: Jyers Date: Fri, 5 Nov 2021 17:00:10 -0400 Subject: [PATCH 69/78] Put back support for other UIs --- Marlin/src/lcd/e3v2/common/encoder.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/e3v2/common/encoder.cpp b/Marlin/src/lcd/e3v2/common/encoder.cpp index 22c0a90d8c94..9ed1a409394a 100644 --- a/Marlin/src/lcd/e3v2/common/encoder.cpp +++ b/Marlin/src/lcd/e3v2/common/encoder.cpp @@ -94,7 +94,15 @@ EncoderState Encoder_ReceiveAnalyze() { //LED_Action(); #endif if (!ui.backlight) ui.refresh_brightness(); - else return ENCODER_DIFF_ENTER; + else { + #if ENABLED(DWIN_CREALITY_LCD_JYERSUI) + return ENCODER_DIFF_ENTER; + #else + const bool was_waiting = wait_for_user; + wait_for_user = false; + return was_waiting ? ENCODER_DIFF_NO : ENCODER_DIFF_ENTER; + #endif + } } else return ENCODER_DIFF_NO; } From 50e98e873e928628d383c3ec58805be4c199f35d Mon Sep 17 00:00:00 2001 From: Jyers Date: Fri, 5 Nov 2021 17:03:43 -0400 Subject: [PATCH 70/78] Re-add Beeper Mute --- .../E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h | 2 +- .../E3V2 Templates/BLTouch-3x3/Configuration_adv.h | 2 +- .../E3V2 Templates/Default-NoProbe/Configuration_adv.h | 2 +- .../E3V2 Templates/ManualMesh-3x3/Configuration_adv.h | 2 +- .../E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h | 2 +- .../E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h | 2 +- Configuration Files/Jyers's Config/Configuration_adv.h | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h b/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h index f00dbd11562e..861ccf1524c7 100644 --- a/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h @@ -1220,7 +1220,7 @@ #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 #endif -#if HAS_LCD_MENU +#if EITHER(HAS_LCD_MENU, HAS_DWIN_E3V2) // Add Probe Z Offset calibration to the Z Probe Offsets menu #if HAS_BED_PROBE diff --git a/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h b/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h index e8b60936311f..d1cd1e77fd8d 100644 --- a/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h @@ -1220,7 +1220,7 @@ #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 #endif -#if HAS_LCD_MENU +#if EITHER(HAS_LCD_MENU, HAS_DWIN_E3V2) // Add Probe Z Offset calibration to the Z Probe Offsets menu #if HAS_BED_PROBE diff --git a/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h b/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h index e8b60936311f..d1cd1e77fd8d 100644 --- a/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h @@ -1220,7 +1220,7 @@ #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 #endif -#if HAS_LCD_MENU +#if EITHER(HAS_LCD_MENU, HAS_DWIN_E3V2) // Add Probe Z Offset calibration to the Z Probe Offsets menu #if HAS_BED_PROBE diff --git a/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h b/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h index e8b60936311f..d1cd1e77fd8d 100644 --- a/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h @@ -1220,7 +1220,7 @@ #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 #endif -#if HAS_LCD_MENU +#if EITHER(HAS_LCD_MENU, HAS_DWIN_E3V2) // Add Probe Z Offset calibration to the Z Probe Offsets menu #if HAS_BED_PROBE diff --git a/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h b/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h index e8b60936311f..d1cd1e77fd8d 100644 --- a/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h @@ -1220,7 +1220,7 @@ #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 #endif -#if HAS_LCD_MENU +#if EITHER(HAS_LCD_MENU, HAS_DWIN_E3V2) // Add Probe Z Offset calibration to the Z Probe Offsets menu #if HAS_BED_PROBE diff --git a/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h b/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h index e8b60936311f..d1cd1e77fd8d 100644 --- a/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h @@ -1220,7 +1220,7 @@ #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 #endif -#if HAS_LCD_MENU +#if EITHER(HAS_LCD_MENU, HAS_DWIN_E3V2) // Add Probe Z Offset calibration to the Z Probe Offsets menu #if HAS_BED_PROBE diff --git a/Configuration Files/Jyers's Config/Configuration_adv.h b/Configuration Files/Jyers's Config/Configuration_adv.h index 6e010cc3c677..9bb771af811b 100644 --- a/Configuration Files/Jyers's Config/Configuration_adv.h +++ b/Configuration Files/Jyers's Config/Configuration_adv.h @@ -1220,7 +1220,7 @@ #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 #endif -#if HAS_LCD_MENU +#if EITHER(HAS_LCD_MENU, HAS_DWIN_E3V2) // Add Probe Z Offset calibration to the Z Probe Offsets menu #if HAS_BED_PROBE From 4100ea79bd9babe83702259d835d64197852857a Mon Sep 17 00:00:00 2001 From: Jyers Date: Fri, 5 Nov 2021 17:12:16 -0400 Subject: [PATCH 71/78] v2.0.1 --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 106078d767b3..374b5a9eeaee 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -25,7 +25,7 @@ * Release version. Leave the Marlin version or apply a custom scheme. */ #ifndef SHORT_BUILD_VERSION - #define SHORT_BUILD_VERSION "bugfix-JyersUI v2.0.0" + #define SHORT_BUILD_VERSION "bugfix-JyersUI v2.0.1" #endif /** From 02df365eb8b72ed131ab8526df86db2e276d19dc Mon Sep 17 00:00:00 2001 From: Jyers Date: Fri, 5 Nov 2021 17:17:06 -0400 Subject: [PATCH 72/78] Updated Workflow for Maple Env --- .github/workflows/compile-configs.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/compile-configs.yml b/.github/workflows/compile-configs.yml index 24ee4f98b5a0..eab789e03218 100644 --- a/.github/workflows/compile-configs.yml +++ b/.github/workflows/compile-configs.yml @@ -46,7 +46,7 @@ jobs: sed -i "s/#define MOTHERBOARD.*/#define MOTHERBOARD BOARD_CREALITY_$BOARD/g" Marlin/Configuration.h pio run mkdir temp - mv .pio/build/STM32F103RET6_creality/*.bin temp/build.bin + mv .pio/build/STM32F103RET6_creality_maple/*.bin temp/build.bin env: BOARD: ${{ matrix.board }} VERSION: ${{ env.RELEASE_VERSION }} @@ -109,7 +109,7 @@ jobs: sed -i "s/[^ ]*#define BLTOUCH_HS_MODE/$TEMP#define BLTOUCH_HS_MODE/g" Marlin/Configuration_adv.h pio run mkdir temp - mv .pio/build/STM32F103RET6_creality/*.bin temp/build.bin + mv .pio/build/STM32F103RET6_creality_maple/*.bin temp/build.bin env: BOARD: ${{ matrix.board }} GRID: ${{ matrix.grid }} @@ -170,7 +170,7 @@ jobs: sed -i "s/#define GRID_MAX_POINTS_X.*/#define GRID_MAX_POINTS_X $GRID/g" Marlin/Configuration.h pio run mkdir temp - mv .pio/build/STM32F103RET6_creality/*.bin temp/build.bin + mv .pio/build/STM32F103RET6_creality_maple/*.bin temp/build.bin env: BOARD: ${{ matrix.board }} GRID: ${{ matrix.grid }} @@ -234,7 +234,7 @@ jobs: sed -i "s/[^ ]*#define BLTOUCH_HS_MODE/$TEMP#define BLTOUCH_HS_MODE/g" Marlin/Configuration_adv.h pio run mkdir temp - mv .pio/build/STM32F103RET6_creality/*.bin temp/build.bin + mv .pio/build/STM32F103RET6_creality_maple/*.bin temp/build.bin env: BOARD: ${{ matrix.board }} GRID: ${{ matrix.grid }} @@ -295,7 +295,7 @@ jobs: sed -i "s/#define GRID_MAX_POINTS_X.*/#define GRID_MAX_POINTS_X $GRID/g" Marlin/Configuration.h pio run mkdir temp - mv .pio/build/STM32F103RET6_creality/*.bin temp/build.bin + mv .pio/build/STM32F103RET6_creality_maple/*.bin temp/build.bin env: BOARD: ${{ matrix.board }} GRID: ${{ matrix.grid }} From f5284715fb7c35a5ba9caf98f45f533db709eeb4 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 6 Nov 2021 00:58:50 +0000 Subject: [PATCH 73/78] [cron] Bump distribution date (2021-11-06) --- 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 b94659a0447c..c3618ba58642 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 "2021-11-05" +//#define STRING_DISTRIBUTION_DATE "2021-11-06" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 115eb4bbd2c0..670be92f4ba7 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 "2021-11-05" + #define STRING_DISTRIBUTION_DATE "2021-11-06" #endif /** From dfdffca2bddb2c7301b6befe5d453da5b84dc16f Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 7 Nov 2021 01:06:43 +0000 Subject: [PATCH 74/78] [cron] Bump distribution date (2021-11-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 c3618ba58642..ce8acbbc3e2c 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 "2021-11-06" +//#define STRING_DISTRIBUTION_DATE "2021-11-07" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 670be92f4ba7..7626b58e3eb3 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 "2021-11-06" + #define STRING_DISTRIBUTION_DATE "2021-11-07" #endif /** From c07aa875bc8c285adf7f967df656f6bf8a13bf92 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 7 Nov 2021 15:27:53 +1300 Subject: [PATCH 75/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20DGUS=20Reloaded=20st?= =?UTF-8?q?atus=20message=20(#23090)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp index 9bae2b95d303..17e7a3844592 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp @@ -409,7 +409,7 @@ void DGUSScreenHandler::SetStatusMessage(const char* msg, const millis_t duratio } void DGUSScreenHandler::SetStatusMessage(FSTR_P const fmsg, const millis_t duration) { - dgus_display.WriteStringPGM((uint16_t)DGUS_Addr::MESSAGE_Status, FTOP(msg), DGUS_STATUS_LEN, false, true); + dgus_display.WriteStringPGM((uint16_t)DGUS_Addr::MESSAGE_Status, FTOP(fmsg), DGUS_STATUS_LEN, false, true); status_expire = (duration > 0 ? ExtUI::safe_millis() + duration : 0); } From 30a69f76a3dc9deaef6974d18107d7f759502092 Mon Sep 17 00:00:00 2001 From: dwzg <50058606+dwzg@users.noreply.github.com> Date: Sun, 7 Nov 2021 04:48:00 +0100 Subject: [PATCH 76/78] =?UTF-8?q?=F0=9F=90=9B=20Fix=20JyersUI=20scrolling?= =?UTF-8?q?=20filename,=20etc.=20(#23082)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 50 +++++++++++++++------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 80ef88d0b214..4c838a2e2143 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -678,31 +678,31 @@ void CrealityDWINClass::Draw_Print_Filename(const bool reset/*=false*/) { static uint8_t namescrl = 0; if (reset) namescrl = 0; if (process == Print) { - size_t len = strlen(filename); - int8_t pos = len; - if (pos > 30) { - pos -= namescrl; - len = _MIN(pos, 30); - char dispname[len + 1]; + constexpr int8_t maxlen = 30; + char *outstr = filename; + size_t slen = strlen(filename); + int8_t outlen = slen; + if (slen > maxlen) { + char dispname[maxlen + 1]; + int8_t pos = slen - namescrl, len = maxlen; if (pos >= 0) { + NOMORE(len, pos); LOOP_L_N(i, len) dispname[i] = filename[i + namescrl]; } else { - LOOP_L_N(i, 30 + pos) dispname[i] = ' '; - LOOP_S_L_N(i, 30 + pos, 30) dispname[i] = filename[i - (30 + pos)]; + const int8_t mp = maxlen + pos; + LOOP_L_N(i, mp) dispname[i] = ' '; + LOOP_S_L_N(i, mp, maxlen) dispname[i] = filename[i - mp]; + if (mp <= 0) namescrl = 0; } dispname[len] = '\0'; - DWIN_Draw_Rectangle(1, Color_Bg_Black, 8, 50, DWIN_WIDTH - 8, 80); - const int8_t npos = (DWIN_WIDTH - 30 * MENU_CHR_W) / 2; - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, npos, 60, dispname); - if (-pos >= 30) namescrl = 0; + outstr = dispname; + outlen = maxlen; namescrl++; } - else { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 8, 50, DWIN_WIDTH - 8, 80); - const int8_t npos = (DWIN_WIDTH - strlen(filename) * MENU_CHR_W) / 2; - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, npos, 60, filename); - } + DWIN_Draw_Rectangle(1, Color_Bg_Black, 8, 50, DWIN_WIDTH - 8, 80); + const int8_t npos = (DWIN_WIDTH - outlen * MENU_CHR_W) / 2; + DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, npos, 60, outstr); } } @@ -4702,7 +4702,7 @@ void CrealityDWINClass::Update_Status(const char * const text) { char header[4]; LOOP_L_N(i, 3) header[i] = text[i]; header[3] = '\0'; - if (strcmp_P(header,"") == 0) { + if (strcmp_P(header, PSTR("")) == 0) { LOOP_L_N(i, _MIN((size_t)LONG_FILENAME_LENGTH, strlen(text))) filename[i] = text[i + 3]; filename[_MIN((size_t)LONG_FILENAME_LENGTH - 1, strlen(text))] = '\0'; Draw_Print_Filename(true); @@ -4798,22 +4798,23 @@ void CrealityDWINClass::State_Update() { } void CrealityDWINClass::Screen_Update() { + const millis_t ms = millis(); static millis_t scrltime = 0; - if (ELAPSED(millis(), scrltime)) { - scrltime = millis() + 200; + if (ELAPSED(ms, scrltime)) { + scrltime = ms + 200; Update_Status_Bar(); if (process == Print) Draw_Print_Filename(); } static millis_t statustime = 0; - if (ELAPSED(millis(), statustime)) { - statustime = millis() + 500; + if (ELAPSED(ms, statustime)) { + statustime = ms + 500; Draw_Status_Area(); } static millis_t printtime = 0; - if (ELAPSED(millis(), printtime)) { - printtime = millis() + 1000; + if (ELAPSED(ms, printtime)) { + printtime = ms + 1000; if (process == Print) { Draw_Print_ProgressBar(); Draw_Print_ProgressElapsed(); @@ -5000,6 +5001,7 @@ void MarlinUI::init() { void MarlinUI::pause_show_message(const PauseMessage message, const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/) { switch (message) { case PAUSE_MESSAGE_INSERT: CrealityDWIN.Confirm_Handler(FilInsert); break; + case PAUSE_MESSAGE_PURGE: case PAUSE_MESSAGE_OPTION: CrealityDWIN.Popup_Handler(PurgeMore); break; case PAUSE_MESSAGE_HEAT: CrealityDWIN.Confirm_Handler(HeaterTime); break; case PAUSE_MESSAGE_WAITING: CrealityDWIN.Draw_Print_Screen(); break; From 27220f09440e90ed490087273a2357b84a41663c Mon Sep 17 00:00:00 2001 From: Jin <3448324+jinhong-@users.noreply.github.com> Date: Sun, 7 Nov 2021 11:53:36 +0800 Subject: [PATCH 77/78] =?UTF-8?q?=F0=9F=8D=BB=20Preliminary=20fix=20for=20?= =?UTF-8?q?Max31865=20SPI=20(#22682)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/src/HAL/shared/Delay.h | 15 +++- Marlin/src/HAL/shared/Marduino.h | 2 +- Marlin/src/libs/MAX31865.cpp | 125 +++++++++++++++---------------- Marlin/src/libs/MAX31865.h | 11 ++- buildroot/tests/LPC1769 | 3 +- buildroot/tests/teensy41 | 5 +- 6 files changed, 90 insertions(+), 71 deletions(-) diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h index 04df35d88d6a..df07881f01d9 100644 --- a/Marlin/src/HAL/shared/Delay.h +++ b/Marlin/src/HAL/shared/Delay.h @@ -92,6 +92,12 @@ void calibrate_delay_loop(); #define DELAY_CYCLES(X) do { SmartDelay _smrtdly_X(X); } while(0) + #if GCC_VERSION <= 70000 + #define DELAY_CYCLES_VAR(X) DelayCycleFnc(X) + #else + #define DELAY_CYCLES_VAR DELAY_CYCLES + #endif + // For delay in microseconds, no smart delay selection is required, directly call the delay function // Teensy compiler is too old and does not accept smart delay compile-time / run-time selection correctly #define DELAY_US(x) DelayCycleFnc((x) * ((F_CPU) / 1000000UL)) @@ -200,9 +206,12 @@ void calibrate_delay_loop(); #endif #if ENABLED(DELAY_NS_ROUND_DOWN) - #define DELAY_NS(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL) / 1000UL) // floor + #define _NS_TO_CYCLES(x) ( (x) * ((F_CPU) / 1000000UL) / 1000UL) // floor #elif ENABLED(DELAY_NS_ROUND_CLOSEST) - #define DELAY_NS(x) DELAY_CYCLES(((x) * ((F_CPU) / 1000000UL) + 500) / 1000UL) // round + #define _NS_TO_CYCLES(x) (((x) * ((F_CPU) / 1000000UL) + 500) / 1000UL) // round #else - #define DELAY_NS(x) DELAY_CYCLES(((x) * ((F_CPU) / 1000000UL) + 999) / 1000UL) // "ceil" + #define _NS_TO_CYCLES(x) (((x) * ((F_CPU) / 1000000UL) + 999) / 1000UL) // "ceil" #endif + +#define DELAY_NS(x) DELAY_CYCLES(_NS_TO_CYCLES(x)) +#define DELAY_NS_VAR(x) DELAY_CYCLES_VAR(_NS_TO_CYCLES(x)) diff --git a/Marlin/src/HAL/shared/Marduino.h b/Marlin/src/HAL/shared/Marduino.h index 3b5a68a37320..0e2a021a3c4e 100644 --- a/Marlin/src/HAL/shared/Marduino.h +++ b/Marlin/src/HAL/shared/Marduino.h @@ -39,7 +39,7 @@ #define DISABLED(V...) DO(DIS,&&,V) #undef _BV -#define _BV(b) (1UL << (b)) +#define _BV(b) (1 << (b)) #ifndef SBI #define SBI(A,B) (A |= _BV(B)) #endif diff --git a/Marlin/src/libs/MAX31865.cpp b/Marlin/src/libs/MAX31865.cpp index df0702b9fb58..94048af2089c 100644 --- a/Marlin/src/libs/MAX31865.cpp +++ b/Marlin/src/libs/MAX31865.cpp @@ -48,20 +48,17 @@ #if HAS_MAX31865 && !USE_ADAFRUIT_MAX31865 -//#include // TODO: switch to SPIclass/SoftSPI #include "MAX31865.h" +#ifdef TARGET_LPC1768 + #include +#endif + // The maximum speed the MAX31865 can do is 5 MHz SPISettings MAX31865::spiConfig = SPISettings( - #if defined(TARGET_LPC1768) - SPI_QUARTER_SPEED - #elif defined(ARDUINO_ARCH_STM32) - SPI_CLOCK_DIV4 - #else - 500000 - #endif - , MSBFIRST - , SPI_MODE_1 // CPOL0 CPHA1 + TERN(TARGET_LPC1768, SPI_QUARTER_SPEED, TERN(ARDUINO_ARCH_STM32, SPI_CLOCK_DIV4, 500000)), + MSBFIRST, + SPI_MODE1 // CPOL0 CPHA1 ); #ifndef LARGE_PINMAP @@ -93,7 +90,7 @@ SPISettings MAX31865::spiConfig = SPISettings( _sclk = _miso = _mosi = -1; } -#else +#else // LARGE_PINMAP /** * Create the interface object using software (bitbang) SPI for PIN values @@ -106,9 +103,7 @@ SPISettings MAX31865::spiConfig = SPISettings( * @param spi_clk the SPI clock pin to use * @param pin_mapping set to 1 for positive pin values */ - MAX31865::MAX31865(uint32_t spi_cs, uint32_t spi_mosi, - uint32_t spi_miso, uint32_t spi_clk, - uint8_t pin_mapping) { + MAX31865::MAX31865(uint32_t spi_cs, uint32_t spi_mosi, uint32_t spi_miso, uint32_t spi_clk, uint8_t pin_mapping) { _cs = spi_cs; _mosi = spi_mosi; _miso = spi_miso; @@ -130,14 +125,12 @@ SPISettings MAX31865::spiConfig = SPISettings( #endif // LARGE_PINMAP - /** * * Instance & Class methods * */ - /** * Initialize the SPI interface and set the number of RTD wires used * @@ -152,22 +145,13 @@ void MAX31865::begin(max31865_numwires_t wires, float zero, float ref) { OUT_WRITE(_cs, HIGH); if (_sclk != TERN(LARGE_PINMAP, -1UL, -1)) { - // Define pin modes for Software SPI - #ifdef MAX31865_DEBUG - SERIAL_ECHOLN("Initializing MAX31865 Software SPI"); - #endif - - OUT_WRITE(_sclk, LOW); - SET_OUTPUT(_mosi); - SET_INPUT(_miso); + softSpiBegin(SPI_QUARTER_SPEED); // Define pin modes for Software SPI } else { - // Start and configure hardware SPI #ifdef MAX31865_DEBUG - SERIAL_ECHOLN("Initializing MAX31865 Hardware SPI"); + SERIAL_ECHOLNPGM("Initializing MAX31865 Hardware SPI"); #endif - - SPI.begin(); + SPI.begin(); // Start and configure hardware SPI } setWires(wires); @@ -176,25 +160,15 @@ void MAX31865::begin(max31865_numwires_t wires, float zero, float ref) { clearFault(); #ifdef MAX31865_DEBUG_SPI - #ifndef LARGE_PINMAP - SERIAL_ECHOLNPGM( - "Regular begin call with _cs: ", _cs, - " _miso: ", _miso, - " _sclk: ", _sclk, - " _mosi: ", _mosi - ); - #else - SERIAL_ECHOLNPGM( - "LARGE_PINMAP begin call with _cs: ", _cs, - " _miso: ", _miso, - " _sclk: ", _sclk, - " _mosi: ", _mosi - ); - #endif // LARGE_PINMAP - - SERIAL_ECHOLNPGM("config: ", readRegister8(MAX31856_CONFIG_REG)); - SERIAL_EOL(); - #endif // MAX31865_DEBUG_SPI + SERIAL_ECHOLNPGM( + TERN(LARGE_PINMAP, "LARGE_PINMAP", "Regular") + " begin call with _cs: ", _cs, + " _miso: ", _miso, + " _sclk: ", _sclk, + " _mosi: ", _mosi, + " config: ", readRegister8(MAX31856_CONFIG_REG) + ); + #endif } /** @@ -371,7 +345,6 @@ float MAX31865::temperature(float Rrtd) { // private: // - /** * Set a value in the configuration register. * @@ -432,10 +405,15 @@ void MAX31865::readRegisterN(uint8_t addr, uint8_t buffer[], uint8_t n) { WRITE(_sclk, LOW); WRITE(_cs, LOW); - spixfer(addr); + + #ifdef TARGET_LPC1768 + DELAY_CYCLES(_spi_speed); + #endif + + spiTransfer(addr); while (n--) { - buffer[0] = spixfer(0xFF); + buffer[0] = spiTransfer(0xFF); #ifdef MAX31865_DEBUG_SPI SERIAL_ECHOLNPGM("buffer read ", n, " data: ", buffer[0]); #endif @@ -462,8 +440,12 @@ void MAX31865::writeRegister8(uint8_t addr, uint8_t data) { WRITE(_cs, LOW); - spixfer(addr | 0x80); // make sure top bit is set - spixfer(data); + #ifdef TARGET_LPC1768 + DELAY_CYCLES(_spi_speed); + #endif + + spiTransfer(addr | 0x80); // make sure top bit is set + spiTransfer(data); if (_sclk == TERN(LARGE_PINMAP, -1UL, -1)) SPI.endTransaction(); @@ -480,21 +462,38 @@ void MAX31865::writeRegister8(uint8_t addr, uint8_t data) { * @param x an 8-bit chunk of data to write * @return the 8-bit response */ -uint8_t MAX31865::spixfer(uint8_t x) { +uint8_t MAX31865::spiTransfer(uint8_t x) { if (_sclk == TERN(LARGE_PINMAP, -1UL, -1)) return SPI.transfer(x); - uint8_t reply = 0; - for (int i = 7; i >= 0; i--) { - reply <<= 1; - WRITE(_sclk, HIGH); - WRITE(_mosi, x & (1 << i)); - WRITE(_sclk, LOW); - if (READ(_miso)) - reply |= 1; - } + #ifdef TARGET_LPC1768 + return swSpiTransfer(x, _spi_speed, _sclk, _miso, _mosi); + #else + uint8_t reply = 0; + for (int i = 7; i >= 0; i--) { + WRITE(_sclk, HIGH); DELAY_NS_VAR(_spi_delay); + reply <<= 1; + WRITE(_mosi, x & _BV(i)); DELAY_NS_VAR(_spi_delay); + if (READ(_miso)) reply |= 1; + WRITE(_sclk, LOW); DELAY_NS_VAR(_spi_delay); + } + return reply; + #endif +} - return reply; +void MAX31865::softSpiBegin(const uint8_t spi_speed) { + #ifdef MAX31865_DEBUG + SERIAL_ECHOLNPGM("Initializing MAX31865 Software SPI"); + #endif + #ifdef TARGET_LPC1768 + swSpiBegin(_sclk, _miso, _mosi); + _spi_speed = swSpiInit(spi_speed, _sclk, _mosi); + #else + _spi_delay = (100UL << spi_speed) / 3; // Calculate delay in ns. Top speed is ~10MHz, or 100ns delay between bits. + OUT_WRITE(_sclk, LOW); + SET_OUTPUT(_mosi); + SET_INPUT(_miso); + #endif } #endif // HAS_MAX31865 && !USE_ADAFRUIT_MAX31865 diff --git a/Marlin/src/libs/MAX31865.h b/Marlin/src/libs/MAX31865.h index 5d50e870ecd2..7610924c2313 100644 --- a/Marlin/src/libs/MAX31865.h +++ b/Marlin/src/libs/MAX31865.h @@ -90,6 +90,13 @@ class MAX31865 { static SPISettings spiConfig; TERN(LARGE_PINMAP, uint32_t, uint8_t) _sclk, _miso, _mosi, _cs; + + #ifdef TARGET_LPC1768 + uint8_t _spi_speed; + #else + uint16_t _spi_delay; + #endif + float Rzero, Rref; void setConfig(uint8_t config, bool enable); @@ -99,7 +106,9 @@ class MAX31865 { uint16_t readRegister16(uint8_t addr); void writeRegister8(uint8_t addr, uint8_t reg); - uint8_t spixfer(uint8_t addr); + uint8_t spiTransfer(uint8_t addr); + + void softSpiBegin(const uint8_t spi_speed); public: #ifdef LARGE_PINMAP diff --git a/buildroot/tests/LPC1769 b/buildroot/tests/LPC1769 index f0dab630e5e5..3fe99734ca6b 100755 --- a/buildroot/tests/LPC1769 +++ b/buildroot/tests/LPC1769 @@ -14,11 +14,12 @@ exec_test $1 $2 "Azteeg X5GT Example Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD \ - EXTRUDERS 2 TEMP_SENSOR_1 -1 TEMP_SENSOR_BED 5 \ + EXTRUDERS 2 TEMP_SENSOR_0 -5 TEMP_SENSOR_1 -1 TEMP_SENSOR_BED 5 TEMP_0_CS_PIN P1_29 \ 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 NO_FAN_SLOWING_IN_PID_TUNING \ + MAX31865_SENSOR_OHMS_0 MAX31865_CALIBRATION_OHMS_0 \ FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET LEVEL_CORNERS_USE_PROBE LEVEL_CORNERS_VERIFY_RAISED \ PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ diff --git a/buildroot/tests/teensy41 b/buildroot/tests/teensy41 index fd89512ea57b..1affd7c89e12 100755 --- a/buildroot/tests/teensy41 +++ b/buildroot/tests/teensy41 @@ -15,12 +15,13 @@ exec_test $1 $2 "Teensy4.1 with default config" "$3" # restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 \ - EXTRUDERS 2 TEMP_SENSOR_0 1 TEMP_SENSOR_1 5 TEMP_SENSOR_BED 1 \ + EXTRUDERS 2 TEMP_SENSOR_0 -5 TEMP_SENSOR_1 5 TEMP_SENSOR_BED 1 TEMP_0_CS_PIN 23 \ I2C_SLAVE_ADDRESS 63 \ 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 EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ +opt_enable MAX31865_SENSOR_OHMS_0 MAX31865_CALIBRATION_OHMS_0 \ + EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET \ From 633e79f660c0d47608d8712eb972fa6704959933 Mon Sep 17 00:00:00 2001 From: Jyers Date: Sun, 7 Nov 2021 10:39:41 -0500 Subject: [PATCH 78/78] Update Config Versions --- .../E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration.h | 2 +- .../E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h | 2 +- Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration.h | 2 +- .../E3V2 Templates/BLTouch-3x3/Configuration_adv.h | 2 +- .../E3V2 Templates/Default-NoProbe/Configuration.h | 2 +- .../E3V2 Templates/Default-NoProbe/Configuration_adv.h | 2 +- .../E3V2 Templates/ManualMesh-3x3/Configuration.h | 2 +- .../E3V2 Templates/ManualMesh-3x3/Configuration_adv.h | 2 +- .../E3V2 Templates/UBL-BLTouch-10x10/Configuration.h | 2 +- .../E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h | 2 +- .../E3V2 Templates/UBL-NoProbe-3x3/Configuration.h | 2 +- .../E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h | 2 +- Configuration Files/Jyers's Config/Configuration.h | 2 +- Configuration Files/Jyers's Config/Configuration_adv.h | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration.h b/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration.h index 85544b593288..09a7ee8bcf78 100644 --- a/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration.h +++ b/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration.h @@ -35,7 +35,7 @@ * * Advanced settings can be found in Configuration_adv.h */ -#define CONFIGURATION_H_VERSION 02000902 +#define CONFIGURATION_H_VERSION 02000903 //=========================================================================== //============================= Getting Started ============================= diff --git a/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h b/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h index 861ccf1524c7..8e9e20e5cb08 100644 --- a/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/BLTouch-3x3-HighSpeed/Configuration_adv.h @@ -30,7 +30,7 @@ * * Basic settings can be found in Configuration.h */ -#define CONFIGURATION_ADV_H_VERSION 02000902 +#define CONFIGURATION_ADV_H_VERSION 02000903 //=========================================================================== //============================= Thermal Settings ============================ diff --git a/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration.h b/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration.h index 85544b593288..09a7ee8bcf78 100644 --- a/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration.h +++ b/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration.h @@ -35,7 +35,7 @@ * * Advanced settings can be found in Configuration_adv.h */ -#define CONFIGURATION_H_VERSION 02000902 +#define CONFIGURATION_H_VERSION 02000903 //=========================================================================== //============================= Getting Started ============================= diff --git a/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h b/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h index d1cd1e77fd8d..3f53f226c726 100644 --- a/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/BLTouch-3x3/Configuration_adv.h @@ -30,7 +30,7 @@ * * Basic settings can be found in Configuration.h */ -#define CONFIGURATION_ADV_H_VERSION 02000902 +#define CONFIGURATION_ADV_H_VERSION 02000903 //=========================================================================== //============================= Thermal Settings ============================ diff --git a/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration.h b/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration.h index 25c44de9f263..7c617165eb5a 100644 --- a/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration.h +++ b/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration.h @@ -35,7 +35,7 @@ * * Advanced settings can be found in Configuration_adv.h */ -#define CONFIGURATION_H_VERSION 02000902 +#define CONFIGURATION_H_VERSION 02000903 //=========================================================================== //============================= Getting Started ============================= diff --git a/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h b/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h index d1cd1e77fd8d..3f53f226c726 100644 --- a/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/Default-NoProbe/Configuration_adv.h @@ -30,7 +30,7 @@ * * Basic settings can be found in Configuration.h */ -#define CONFIGURATION_ADV_H_VERSION 02000902 +#define CONFIGURATION_ADV_H_VERSION 02000903 //=========================================================================== //============================= Thermal Settings ============================ diff --git a/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration.h b/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration.h index 4a7fc3489f6c..314fff31ef79 100644 --- a/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration.h +++ b/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration.h @@ -35,7 +35,7 @@ * * Advanced settings can be found in Configuration_adv.h */ -#define CONFIGURATION_H_VERSION 02000902 +#define CONFIGURATION_H_VERSION 02000903 //=========================================================================== //============================= Getting Started ============================= diff --git a/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h b/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h index d1cd1e77fd8d..3f53f226c726 100644 --- a/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/ManualMesh-3x3/Configuration_adv.h @@ -30,7 +30,7 @@ * * Basic settings can be found in Configuration.h */ -#define CONFIGURATION_ADV_H_VERSION 02000902 +#define CONFIGURATION_ADV_H_VERSION 02000903 //=========================================================================== //============================= Thermal Settings ============================ diff --git a/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration.h b/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration.h index d9153d8fc852..3a451653c671 100644 --- a/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration.h +++ b/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration.h @@ -35,7 +35,7 @@ * * Advanced settings can be found in Configuration_adv.h */ -#define CONFIGURATION_H_VERSION 02000902 +#define CONFIGURATION_H_VERSION 02000903 //=========================================================================== //============================= Getting Started ============================= diff --git a/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h b/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h index d1cd1e77fd8d..3f53f226c726 100644 --- a/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/UBL-BLTouch-10x10/Configuration_adv.h @@ -30,7 +30,7 @@ * * Basic settings can be found in Configuration.h */ -#define CONFIGURATION_ADV_H_VERSION 02000902 +#define CONFIGURATION_ADV_H_VERSION 02000903 //=========================================================================== //============================= Thermal Settings ============================ diff --git a/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration.h b/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration.h index 86d87f298dfd..dd37ba29c823 100644 --- a/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration.h +++ b/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration.h @@ -35,7 +35,7 @@ * * Advanced settings can be found in Configuration_adv.h */ -#define CONFIGURATION_H_VERSION 02000902 +#define CONFIGURATION_H_VERSION 02000903 //=========================================================================== //============================= Getting Started ============================= diff --git a/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h b/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h index d1cd1e77fd8d..3f53f226c726 100644 --- a/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h +++ b/Configuration Files/E3V2 Templates/UBL-NoProbe-3x3/Configuration_adv.h @@ -30,7 +30,7 @@ * * Basic settings can be found in Configuration.h */ -#define CONFIGURATION_ADV_H_VERSION 02000902 +#define CONFIGURATION_ADV_H_VERSION 02000903 //=========================================================================== //============================= Thermal Settings ============================ diff --git a/Configuration Files/Jyers's Config/Configuration.h b/Configuration Files/Jyers's Config/Configuration.h index 8362a14f4e62..fce5fb2a0bae 100644 --- a/Configuration Files/Jyers's Config/Configuration.h +++ b/Configuration Files/Jyers's Config/Configuration.h @@ -35,7 +35,7 @@ * * Advanced settings can be found in Configuration_adv.h */ -#define CONFIGURATION_H_VERSION 02000902 +#define CONFIGURATION_H_VERSION 02000903 //=========================================================================== //============================= Getting Started ============================= diff --git a/Configuration Files/Jyers's Config/Configuration_adv.h b/Configuration Files/Jyers's Config/Configuration_adv.h index 9bb771af811b..bb01ddbbf330 100644 --- a/Configuration Files/Jyers's Config/Configuration_adv.h +++ b/Configuration Files/Jyers's Config/Configuration_adv.h @@ -30,7 +30,7 @@ * * Basic settings can be found in Configuration.h */ -#define CONFIGURATION_ADV_H_VERSION 02000902 +#define CONFIGURATION_ADV_H_VERSION 02000903 //=========================================================================== //============================= Thermal Settings ============================