From c8d51c27234bcb2b1419d238e8751593d855dadb Mon Sep 17 00:00:00 2001 From: DerAndere <26200979+DerAndere1@users.noreply.github.com> Date: Sat, 2 Mar 2024 04:16:39 +0100 Subject: [PATCH 001/111] =?UTF-8?q?=F0=9F=9A=B8=20Enable=20G92.9=20with=20?= =?UTF-8?q?rotational=20axes=20(#26174)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Supporting axes that can rotate forever. --- Marlin/src/gcode/geometry/G92.cpp | 4 ++-- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/lcd/marlinui.cpp | 12 ++++++++++-- Marlin/src/lcd/menu/menu_motion.cpp | 4 ++-- Marlin/src/module/motion.cpp | 7 +++++-- Marlin/src/module/planner.cpp | 14 +++++++++----- 6 files changed, 29 insertions(+), 14 deletions(-) diff --git a/Marlin/src/gcode/geometry/G92.cpp b/Marlin/src/gcode/geometry/G92.cpp index 626441f4e25c..cfdff51eba14 100644 --- a/Marlin/src/gcode/geometry/G92.cpp +++ b/Marlin/src/gcode/geometry/G92.cpp @@ -42,7 +42,7 @@ * G92 : Modify Workspace Offsets so the reported position shows the given X [Y [Z [A [B [C [U [V [W ]]]]]]]] [E]. * G92.1 : Zero XYZ Workspace Offsets (so the reported position = the native position). * - * With POWER_LOSS_RECOVERY: + * With POWER_LOSS_RECOVERY or with AXISn_ROTATES: * G92.9 : Set NATIVE Current Position to the given X [Y [Z [A [B [C [U [V [W ]]]]]]]] [E]. */ void GcodeSuite::G92() { @@ -67,7 +67,7 @@ void GcodeSuite::G92() { break; #endif - #if ENABLED(POWER_LOSS_RECOVERY) + #if ANY(POWER_LOSS_RECOVERY, HAS_ROTATIONAL_AXES) case 9: // G92.9 - Set Current Position directly (like Marlin 1.0) LOOP_LOGICAL_AXES(i) { if (parser.seenval(AXIS_CHAR(i))) { diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index c64bde0bc04c..2683312976b2 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -3279,7 +3279,7 @@ #endif // Add commands that need sub-codes to this list -#if ANY(G38_PROBE_TARGET, CNC_COORDINATE_SYSTEMS, POWER_LOSS_RECOVERY) +#if ANY(G38_PROBE_TARGET, CNC_COORDINATE_SYSTEMS, POWER_LOSS_RECOVERY, HAS_ROTATIONAL_AXES) #define USE_GCODE_SUBCODES 1 #endif diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index f66b680bc1c8..99a5996a2dfe 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -23,6 +23,7 @@ #include "../inc/MarlinConfig.h" #include "../MarlinCore.h" // for printingIsPaused +#include "../gcode/parser.h" // for axis_is_rotational, using_inch_units #if LED_POWEROFF_TIMEOUT > 0 || ALL(HAS_WIRED_LCD, PRINTER_EVENT_LEDS) || (HAS_BACKLIGHT_TIMEOUT && defined(NEOPIXEL_BKGD_INDEX_FIRST)) #include "../feature/leds/leds.h" @@ -824,6 +825,13 @@ void MarlinUI::init() { const feedRate_t fr_mm_s = (axis < LOGICAL_AXES) ? manual_feedrate_mm_s[axis] : XY_PROBE_FEEDRATE_MM_S; + /** + * For a rotational axis apply the "inch" to "mm" conversion factor. This mimics behaviour of the G-code G1 + * (see get_destination_from_command). For moves involving only rotational axes, the planner will convert + * back to the feedrate in degrees-per-time unit. + */ + const feedRate_t fr = parser.axis_is_rotational(axis) && parser.using_inch_units() ? IN_TO_MM(fr_mm_s) : fr_mm_s; + #if IS_KINEMATIC #if HAS_MULTI_EXTRUDER @@ -850,13 +858,13 @@ void MarlinUI::init() { // previous invocation is being blocked. Modifications to offset shouldn't be made while // processing is true or the planner will get out of sync. processing = true; - prepare_internal_move_to_destination(fr_mm_s); // will set current_position from destination + prepare_internal_move_to_destination(fr); // will set current_position from destination processing = false; #else // For Cartesian / Core motion simply move to the current_position - planner.buffer_line(current_position, fr_mm_s, + planner.buffer_line(current_position, fr, TERN_(MULTI_E_MANUAL, axis == E_AXIS ? e_index :) active_extruder ); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 239d03d9777a..ebc809fef8f5 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -78,8 +78,8 @@ void lcd_move_axis(const AxisEnum axis) { if (ui.should_draw()) { MenuEditItemBase::itemIndex = axis; const float pos = ui.manual_move.axis_value(axis); - if (parser.using_inch_units()) { - const float imp_pos = LINEAR_UNIT(pos); + if (parser.using_inch_units() && !parser.axis_is_rotational(axis)) { + const float imp_pos = parser.per_axis_value(axis, pos); MenuEditItemBase::draw_edit_screen(GET_TEXT_F(MSG_MOVE_N), ftostr63(imp_pos)); } else diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index c6b093644755..862f0c575433 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1153,10 +1153,13 @@ float get_move_distance(const xyze_pos_t &diff OPTARG(HAS_ROTATIONAL_AXES, bool #if HAS_ROTATIONAL_AXES if (UNEAR_ZERO(distance_sqr)) { - // Move involves only rotational axes. Calculate angular distance in accordance with LinuxCNC - is_cartesian_move = false; + // Move involves no linear axes. Calculate angular distance in accordance with LinuxCNC distance_sqr = ROTATIONAL_AXIS_GANG(sq(diff.i), + sq(diff.j), + sq(diff.k), + sq(diff.u), + sq(diff.v), + sq(diff.w)); } + if (!UNEAR_ZERO(distance_sqr)) { + // Move involves rotational axes, not just the extruder + is_cartesian_move = false; + } #endif #endif diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 0ace6e32ced8..8f7c4ceb72c7 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -2079,11 +2079,11 @@ bool Planner::_populate_block( /** * This part of the code calculates the total length of the movement. - * For cartesian bots, the X_AXIS is the real X movement and same for Y_AXIS. - * But for corexy bots, that is not true. The "X_AXIS" and "Y_AXIS" motors (that should be named to A_AXIS - * and B_AXIS) cannot be used for X and Y length, because A=X+Y and B=X-Y. - * So we need to create other 2 "AXIS", named X_HEAD and Y_HEAD, meaning the real displacement of the Head. - * Having the real displacement of the head, we can calculate the total movement length and apply the desired speed. + * For cartesian bots, the distance along the X axis equals the X_AXIS joint displacement and same holds true for Y_AXIS. + * But for geometries like CORE_XY that is not true. For these machines we need to create 2 additional variables, named X_HEAD and Y_HEAD, to store the displacent of the head along the X and Y axes in a cartesian coordinate system. + * The displacement of the head along the axes of the cartesian coordinate system has to be calculated from "X_AXIS" and "Y_AXIS" (should be renamed to A_JOINT and B_JOINT) + * displacements in joints space using forward kinematics (A=X+Y and B=X-Y in the case of CORE_XY). + * Next we can calculate the total movement length and apply the desired speed. */ struct DistanceMM : abce_float_t { #if ANY(IS_CORE, MARKFORGED_XY, MARKFORGED_YX) @@ -2308,6 +2308,10 @@ bool Planner::_populate_block( // Example 2: At 120°/s a 60° move involving only rotational axes takes 0.5s. So this will give 2.0. float inverse_secs = inverse_millimeters * ( #if ALL(HAS_ROTATIONAL_AXES, INCH_MODE_SUPPORT) + /** + * Workaround for premature feedrate conversion + * from in/s to mm/s by get_distance_from_command. + */ cartesian_move ? fr_mm_s : LINEAR_UNIT(fr_mm_s) #else fr_mm_s From ecde3a315891d141a7573aa78fe817ff12fcfa1c Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sat, 2 Mar 2024 16:58:56 +1300 Subject: [PATCH 002/111] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20AVR=20bootscreen?= =?UTF-8?q?=20RLE=20decode=20(#26827)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index cfff78ad40fe..a96d8e300287 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -140,7 +140,7 @@ bool MarlinUI::detected() { return true; } uint8_t *dst = (uint8_t*)bmp; auto rle_nybble = [&](const uint16_t i) -> uint8_t { - const uint8_t b = bmp_rle[i / 2]; + const uint8_t b = pgm_read_byte(&bmp_rle[i / 2]); return (i & 1 ? b & 0xF : b >> 4); }; From a9e72b2a2c6f37449ba8229f3afe16dab837cb75 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 1 Mar 2024 20:09:12 -0800 Subject: [PATCH 003/111] =?UTF-8?q?=F0=9F=94=A7=20Simpler=20CREALITY=5FV42?= =?UTF-8?q?2=20warning=20(#26826)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/Warnings.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index f889ce38e05c..3a2153916f20 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -682,7 +682,8 @@ #endif #if ENABLED(EMIT_CREALITY_422_WARNING) && DISABLED(NO_CREALITY_422_DRIVER_WARNING) - #warning "Creality 4.2.2 boards come with a variety of stepper drivers. Check the board label (typically on SD Card module) and set the correct *_DRIVER_TYPE! (C=HR4988, E=A4988, A=TMC2208, B=TMC2209, H=TMC2225, H8=HR4988). (Define NO_CREALITY_422_DRIVER_WARNING to suppress this warning.)" + // Driver labels: A=TMC2208, B=TMC2209, C=HR4988, E=A4988, H=TMC2225, H8=HR4988 + #warning "Creality 4.2.2 boards come with a variety of stepper drivers. Check the board label (typically on SD Card module) and set the correct *_DRIVER_TYPE! (A/H: TMC2208_STANDALONE B: TMC2209_STANDALONE C/E/H8: A4988). (Define NO_CREALITY_422_DRIVER_WARNING to suppress this warning.)" #endif #if ENABLED(PRINTCOUNTER_SYNC) From 3fd175af8ea56db48ea41d7f3d55e967f0df8cd8 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sat, 2 Mar 2024 17:31:42 +1300 Subject: [PATCH 004/111] =?UTF-8?q?=F0=9F=9A=B8=20M115=20"KINEMATICS:?= =?UTF-8?q?=E2=80=A6"=20(#26806)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/host/M115.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index b2f3496a6807..0d38d3147bea 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -63,11 +63,25 @@ */ void GcodeSuite::M115() { + // Hosts should match one of these + #define MACHINE_KINEMATICS "" \ + TERN_(COREXY, "COREXY") TERN_(COREYX, "COREYX") \ + TERN_(COREXZ, "COREXZ") TERN_(COREZX, "COREZX") \ + TERN_(COREYZ, "COREYZ") TERN_(COREZY, "COREZY") \ + TERN_(MARKFORGED_XY, "MARKFORGED_XY") TERN_(MARKFORGED_YX, "MARKFORGED_YX") \ + TERN_(POLARGRAPH, "POLARGRAPH") \ + TERN_(POLAR, "POLAR") \ + TERN_(DELTA, "DELTA") \ + TERN_(IS_SCARA, "SCARA") \ + TERN_(IS_CARTESIAN, "Cartesian") \ + TERN_(BELTPRINTER, " BELTPRINTER") + SERIAL_ECHOPGM("FIRMWARE_NAME:Marlin" " " DETAILED_BUILD_VERSION " (" __DATE__ " " __TIME__ ")" " SOURCE_CODE_URL:" SOURCE_CODE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME + " KINEMATICS:" MACHINE_KINEMATICS " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) #if NUM_AXES != XYZ " AXIS_COUNT:" STRINGIFY(NUM_AXES) From b9cfbaa8d4441dc095c8530a1fa2924d921b64fb Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 1 Mar 2024 20:34:12 -0800 Subject: [PATCH 005/111] =?UTF-8?q?=E2=9C=85=20Update=20Actions=20versions?= =?UTF-8?q?=20(#26814)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/lock.yml | 40 ------------------------------ .github/workflows/bump-date.yml | 4 +-- .github/workflows/clean-closed.yml | 2 +- .github/workflows/close-stale.yml | 2 +- .github/workflows/lock-closed.yml | 12 ++++----- .github/workflows/test-builds.yml | 6 ++--- 6 files changed, 13 insertions(+), 53 deletions(-) delete mode 100644 .github/lock.yml diff --git a/.github/lock.yml b/.github/lock.yml deleted file mode 100644 index c5ceff66b0a7..000000000000 --- a/.github/lock.yml +++ /dev/null @@ -1,40 +0,0 @@ -# -# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app -# - -# Number of days of inactivity before a closed issue or pull request is locked -daysUntilLock: 60 - -# Skip issues and pull requests created before a given timestamp. Timestamp must -# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable -skipCreatedBefore: false - -# Issues and pull requests with these labels will be ignored. Set to `[]` to disable -exemptLabels: [ 'no-locking' ] - -# Label to add before locking, such as `outdated`. Set to `false` to disable -lockLabel: false - -# Comment to post before locking. Set to `false` to disable -lockComment: > - This thread has been automatically locked since there has not been - any recent activity after it was closed. Please open a new issue for - related bugs. - -# Assign `resolved` as the reason for locking. Set to `false` to disable -setLockReason: true - -# Limit to only `issues` or `pulls` -# only: issues - -# Optionally, specify configuration settings just for `issues` or `pulls` -# issues: -# exemptLabels: -# - help-wanted -# lockLabel: outdated - -# pulls: -# daysUntilLock: 30 - -# Repository to extend settings from -# _extends: repo diff --git a/.github/workflows/bump-date.yml b/.github/workflows/bump-date.yml index a08eeea561d7..2d3fd1f33dee 100644 --- a/.github/workflows/bump-date.yml +++ b/.github/workflows/bump-date.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Check out bugfix-2.0.x - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: bugfix-2.0.x @@ -39,7 +39,7 @@ jobs: exit 0 - name: Check out bugfix-2.1.x - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: bugfix-2.1.x diff --git a/.github/workflows/clean-closed.yml b/.github/workflows/clean-closed.yml index 318d083dfae3..3f370a4362d1 100644 --- a/.github/workflows/clean-closed.yml +++ b/.github/workflows/clean-closed.yml @@ -32,7 +32,7 @@ jobs: - "Needs: Work" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Remove Labels uses: actions-ecosystem/action-remove-labels@v1 with: diff --git a/.github/workflows/close-stale.yml b/.github/workflows/close-stale.yml index 397f9b5ea6c2..55e19de5669a 100644 --- a/.github/workflows/close-stale.yml +++ b/.github/workflows/close-stale.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/stale@v8 + - uses: actions/stale@v9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: | diff --git a/.github/workflows/lock-closed.yml b/.github/workflows/lock-closed.yml index 8cdcd7a8369e..6392f244b593 100644 --- a/.github/workflows/lock-closed.yml +++ b/.github/workflows/lock-closed.yml @@ -17,15 +17,15 @@ jobs: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v2 + - uses: dessant/lock-threads@v5 with: github-token: ${{ github.token }} process-only: 'issues' - issue-lock-inactive-days: '60' - issue-exclude-created-before: '' - issue-exclude-labels: 'no-locking' - issue-lock-labels: '' - issue-lock-comment: > + issue-inactive-days: '60' + exclude-issue-created-before: '' + exclude-any-issue-labels: 'no-locking' + add-issue-labels: '' + issue-comment: > This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs. diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 7c62b5af6c54..a3cf32739c92 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -152,7 +152,7 @@ jobs: uses: actions/checkout@v4 - name: Cache pip - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} @@ -160,13 +160,13 @@ jobs: ${{ runner.os }}-pip- - name: Cache PlatformIO - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.platformio key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} - name: Select Python 3.9 - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.9' architecture: 'x64' From e6cda9932b8c711259b3ca79923b2aadd4e8421f Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 2 Mar 2024 06:06:49 +0000 Subject: [PATCH 006/111] [cron] Bump distribution date (2024-03-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 e3dc44bc9d06..326f539dcb10 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 "2024-02-28" +//#define STRING_DISTRIBUTION_DATE "2024-03-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 75ed6a0fe5b3..f1c0b41c2a59 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 "2024-02-28" + #define STRING_DISTRIBUTION_DATE "2024-03-02" #endif /** From ec6f9dd5c8443f9633ae5ea9bce7e5f090d5c72b Mon Sep 17 00:00:00 2001 From: fredycpu Date: Sun, 3 Mar 2024 19:39:50 +0100 Subject: [PATCH 007/111] =?UTF-8?q?=F0=9F=94=A7=20MKS=5FROBIN=5FPRO=20:=20?= =?UTF-8?q?I2C=20EEPROM=20+=20MKS=20Wifi=20(#26823)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/src/inc/Changes.h | 2 ++ Marlin/src/lcd/extui/mks_ui/mks_hardware.cpp | 12 ++++++++--- Marlin/src/lcd/extui/mks_ui/wifi_module.cpp | 4 +++- Marlin/src/lcd/extui/mks_ui/wifi_upload.cpp | 14 +++++++------ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 4 ++++ .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 4 ++++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 19 ++++++++++++++++++ .../src/pins/stm32f4/pins_MKS_MONSTER8_V2.h | 2 +- .../pins/stm32f4/pins_MKS_MONSTER8_common.h | 3 --- .../stm32f4/pins_MKS_ROBIN_NANO_V3_common.h | 20 ++++++++++--------- 10 files changed, 61 insertions(+), 23 deletions(-) diff --git a/Marlin/src/inc/Changes.h b/Marlin/src/inc/Changes.h index dd8acc1ce5c3..101963893189 100644 --- a/Marlin/src/inc/Changes.h +++ b/Marlin/src/inc/Changes.h @@ -691,6 +691,8 @@ #error "ANET_FULL_GRAPHICS_LCD_ALT_WIRING is now CTC_A10S_A13." #elif defined(Z_PROBE_END_SCRIPT) #error "Z_PROBE_END_SCRIPT is now EVENT_GCODE_AFTER_G29." +#elif defined(WIFI_SERIAL) + #error "WIFI_SERIAL is now WIFI_SERIAL_PORT." #endif // Changes to Probe Temp Compensation (#17392) diff --git a/Marlin/src/lcd/extui/mks_ui/mks_hardware.cpp b/Marlin/src/lcd/extui/mks_ui/mks_hardware.cpp index eb9cac641ad8..f06ffcd89d7b 100644 --- a/Marlin/src/lcd/extui/mks_ui/mks_hardware.cpp +++ b/Marlin/src/lcd/extui/mks_ui/mks_hardware.cpp @@ -99,7 +99,9 @@ #define ESTATE(S) (READ(S##_PIN) == S##_ENDSTOP_HIT_STATE) void test_gpio_readlevel_L() { - WRITE(WIFI_IO0_PIN, HIGH); + #if PIN_EXISTS(WIFI_IO0) + WRITE(WIFI_IO0_PIN, HIGH); + #endif delay(10); pw_det_sta = (READ(MKS_TEST_POWER_LOSS_PIN) == LOW); pw_off_sta = (READ(MKS_TEST_PS_ON_PIN) == LOW); @@ -132,7 +134,9 @@ } void test_gpio_readlevel_H() { - WRITE(WIFI_IO0_PIN, LOW); + #if PIN_EXISTS(WIFI_IO0) + WRITE(WIFI_IO0_PIN, LOW); + #endif delay(10); pw_det_sta = (READ(MKS_TEST_POWER_LOSS_PIN) == HIGH); pw_off_sta = (READ(MKS_TEST_PS_ON_PIN) == HIGH); @@ -169,7 +173,9 @@ void init_test_gpio() { endstops.init(); - SET_OUTPUT(WIFI_IO0_PIN); + #if PIN_EXISTS(WIFI_IO0) + SET_OUTPUT(WIFI_IO0_PIN); + #endif #if PIN_EXISTS(MT_DET_1) SET_INPUT_PULLUP(MT_DET_1_PIN); diff --git a/Marlin/src/lcd/extui/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/mks_ui/wifi_module.cpp index 122712e9e114..46ba86023918 100644 --- a/Marlin/src/lcd/extui/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/mks_ui/wifi_module.cpp @@ -1920,7 +1920,9 @@ void mks_esp_wifi_init() { SET_OUTPUT(WIFI_RESET_PIN); WIFI_SET(); SET_OUTPUT(WIFI_IO1_PIN); - SET_INPUT_PULLUP(WIFI_IO0_PIN); + #if PIN_EXISTS(WIFI_IO0) + SET_INPUT_PULLUP(WIFI_IO0_PIN); + #endif WIFI_IO1_SET(); esp_state = TRANSFER_IDLE; diff --git a/Marlin/src/lcd/extui/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/mks_ui/wifi_upload.cpp index 2d4d19e7a23e..3ce8bb42ec9a 100644 --- a/Marlin/src/lcd/extui/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/mks_ui/wifi_upload.cpp @@ -650,12 +650,14 @@ void resetWiFiForUpload(int begin_or_end) { //#if 0 uint32_t start = getWifiTick(); - if (begin_or_end == 0) { - SET_OUTPUT(WIFI_IO0_PIN); - WRITE(WIFI_IO0_PIN, LOW); - } - else - SET_INPUT_PULLUP(WIFI_IO0_PIN); + #if PIN_EXISTS(WIFI_IO0) + if (begin_or_end == 0) { + SET_OUTPUT(WIFI_IO0_PIN); + WRITE(WIFI_IO0_PIN, LOW); + } + else + SET_INPUT_PULLUP(WIFI_IO0_PIN); + #endif WIFI_RESET(); while (getWifiTickDiff(start, getWifiTick()) < 500) { /* nada */ } diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index b8ff3262c8f9..ae4ee3268eb7 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -201,10 +201,14 @@ #define WIFI_IO1_PIN PC7 #define WIFI_RESET_PIN PE9 + // + // MKS Testing for code in lcd/extui/mks_ui + // #if ENABLED(MKS_TEST) #define MKS_TEST_POWER_LOSS_PIN PA2 // PW_DET #define MKS_TEST_PS_ON_PIN PB0 // PW_OFF #endif + #else //#define POWER_LOSS_PIN PA2 // PW_DET //#define PS_ON_PIN PB2 // PW_OFF 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 0738afd80ee8..ea82c13fba88 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -228,10 +228,14 @@ #define WIFI_IO1_PIN PC7 #define WIFI_RESET_PIN PE9 + // + // MKS Testing for code in lcd/extui/mks_ui + // #if ENABLED(MKS_TEST) #define MKS_TEST_POWER_LOSS_PIN PA2 // PW_DET #define MKS_TEST_PS_ON_PIN PB2 // PW_OFF #endif + #else //#define POWER_LOSS_PIN PA2 // PW_DET //#define PS_ON_PIN PB2 // PW_OFF diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 545b73cf021c..d5689c1e71da 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -41,6 +41,15 @@ // #define DISABLE_DEBUG +// +// Onboard I2C EEPROM +// +#define IIC_BL24CXX_EEPROM // Use I2C EEPROM onboard IC (AT24C04C, Size 4K, PageSize 16B) +#define MARLIN_EEPROM_SIZE 0x1000 // 4K +#define IIC_EEPROM_SDA PB7 +#define IIC_EEPROM_SCL PB6 +#define EEPROM_DEVICE_ADDRESS 0xA0 + // // SPI // @@ -403,3 +412,13 @@ #define SPI_FLASH_MISO_PIN PB14 #define SPI_FLASH_MOSI_PIN PB15 #endif + +// +// MKS WIFI pins +// +#if ENABLED(MKS_WIFI_MODULE) + #define WIFI_RESET_PIN PA5 + #define WIFI_SERIAL_PORT 1 // USART1 + #define WIFI_IO1_PIN PC7 + #define WIFI_IO0_PIN -1 // N.C. +#endif diff --git a/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_V2.h index c5c79311e30e..12d3947b9934 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_V2.h @@ -51,7 +51,7 @@ // // MKS WIFI MODULE // -//#define WIFI_SERIAL 1// USART1 +//#define WIFI_SERIAL_PORT 1 // USART1 #if ENABLED(MKS_WIFI_MODULE) #define WIFI_IO0_PIN PB14 // MKS ESP WIFI IO0 PIN #define WIFI_IO1_PIN PB15 // MKS ESP WIFI IO1 PIN diff --git a/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_common.h b/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_common.h index 49650299276a..e96a6793603b 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_common.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_common.h @@ -217,9 +217,6 @@ #define KILL_PIN_STATE HIGH #endif -// Random Info -#define USB_SERIAL -1 // USB Serial - /** * ------ ------ * (BEEPER) PB2 | 1 2 | PE10 (BTN_ENC) (SPI1 MISO) PA6 | 1 2 | PA5 (SPI1 SCK) 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 0b3673046797..050c8f242462 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 @@ -195,25 +195,27 @@ #define KILL_PIN_STATE HIGH #endif -// Random Info -#define USB_SERIAL -1 // USB Serial -#define WIFI_SERIAL 3 // USART3 -#define MKS_WIFI_MODULE_SERIAL 1 // USART1 -#define MKS_WIFI_MODULE_SPI 2 // SPI2 - #ifndef SDCARD_CONNECTION #define SDCARD_CONNECTION ONBOARD #endif -// MKS WIFI MODULE +// +// MKS WiFi Module +// #if ENABLED(MKS_WIFI_MODULE) #define WIFI_IO0_PIN PC13 #define WIFI_IO1_PIN PC7 #define WIFI_RESET_PIN PE9 + #define MKS_WIFI_MODULE_SERIAL 1 // USART1 + #define MKS_WIFI_MODULE_SPI 2 // SPI2 +#else + #define WIFI_SERIAL_PORT 3 // USART3 #endif -// MKS TEST -#if ENABLED(MKS_TEST) +// +// MKS Testing for code in lcd/extui/mks_ui +// +#if ALL(TFT_LVGL_UI, MKS_TEST) #define MKS_TEST_POWER_LOSS_PIN PA13 // PW_DET #define MKS_TEST_PS_ON_PIN PB2 // PW_OFF #endif From 4f2b7271bddc1d691af34ceeb033d4ba424c99ec Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 4 Mar 2024 00:21:13 +0000 Subject: [PATCH 008/111] [cron] Bump distribution date (2024-03-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 326f539dcb10..39459850b094 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 "2024-03-02" +//#define STRING_DISTRIBUTION_DATE "2024-03-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 f1c0b41c2a59..1a43014544c1 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 "2024-03-02" + #define STRING_DISTRIBUTION_DATE "2024-03-04" #endif /** From 504219817cc4967acf14d6770fc2336e287cb9c1 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 9 Mar 2024 22:22:23 -0500 Subject: [PATCH 009/111] =?UTF-8?q?=E2=9C=A8=20Redundant=20PSU=20Control?= =?UTF-8?q?=20with=20EDM=20(#26751)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 15 ++++++++++++--- Marlin/src/MarlinCore.cpp | 6 ++++++ Marlin/src/feature/power.cpp | 15 +++++++++++++++ Marlin/src/feature/power.h | 9 ++++++++- Marlin/src/inc/SanityCheck.h | 2 ++ Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/pins/pinsDebug_list.h | 3 +++ Marlin/src/pins/pins_postprocess.h | 4 ++++ 8 files changed, 51 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index a616bd5090ff..49015aeec56a 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -401,9 +401,18 @@ //#define PS_OFF_SOUND // Beep 1s when power off #define PSU_ACTIVE_STATE LOW // Set 'LOW' for ATX, 'HIGH' for X-Box - //#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80 - //#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power - //#define LED_POWEROFF_TIMEOUT 10000 // (ms) Turn off LEDs after power-off, with this amount of delay + //#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80 + //#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power + //#define LED_POWEROFF_TIMEOUT 10000 // (ms) Turn off LEDs after power-off, with this amount of delay + + //#define PSU_OFF_REDUNDANT // Second pin for redundant power control + //#define PSU_OFF_REDUNDANT_INVERTED // Redundant pin state is the inverse of PSU_ACTIVE_STATE + + //#define PS_ON1_PIN 6 // Redundant pin required to enable power in combination with PS_ON_PIN + + //#define PS_ON_EDM_PIN 8 // External Device Monitoring pins for external power control relay feedback. Fault on mismatch. + //#define PS_ON1_EDM_PIN 9 + #define PS_EDM_RESPONSE 250 // (ms) Time to allow for relay action //#define POWER_OFF_TIMER // Enable M81 D to power off after a delay //#define POWER_OFF_WAIT_FOR_COOLDOWN // Enable M81 S to power off only after cooldown diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 53a74871efbb..8a2561f02d22 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -671,6 +671,12 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { TERN_(HOTEND_IDLE_TIMEOUT, hotend_idle.check()); + #if ANY(PSU_CONTROL, AUTO_POWER_CONTROL) && PIN_EXISTS(PS_ON_EDM) + if ( ELAPSED(ms, powerManager.last_state_change_ms + PS_EDM_RESPONSE) + && (READ(PS_ON_PIN) != READ(PS_ON_EDM_PIN) || TERN0(PSU_OFF_REDUNDANT, extDigitalRead(PS_ON1_PIN) != extDigitalRead(PS_ON1_EDM_PIN))) + ) kill(GET_TEXT_F(MSG_POWER_EDM_FAULT)); + #endif + #if ENABLED(EXTRUDER_RUNOUT_PREVENT) if (thermalManager.degHotend(active_extruder) > (EXTRUDER_RUNOUT_MINTEMP) && ELAPSED(ms, gcode.previous_move_ms + SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS)) diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index a9655029fbeb..1531d04a7f07 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -60,6 +60,10 @@ bool Power::psu_on; millis_t Power::lastPowerOn; #endif +#if PSU_TRACK_STATE_MS + millis_t Power::last_state_change_ms = 0; +#endif + /** * Initialize pins & state for the power manager. * @@ -87,8 +91,14 @@ void Power::power_on() { #endif OUT_WRITE(PS_ON_PIN, PSU_ACTIVE_STATE); + #if ENABLED(PSU_OFF_REDUNDANT) + OUT_WRITE(PS_ON1_PIN, TERN_(PSU_OFF_REDUNDANT_INVERTED, !)PSU_ACTIVE_STATE); + #endif + TERN_(PSU_TRACK_STATE_MS, last_state_change_ms = millis()); + psu_on = true; safe_delay(PSU_POWERUP_DELAY); + restore_stepper_drivers(); TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY)); @@ -117,6 +127,11 @@ void Power::power_off() { #endif OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_STATE); + #if ENABLED(PSU_OFF_REDUNDANT) + OUT_WRITE(PS_ON1_PIN, IF_DISABLED(PSU_OFF_REDUNDANT_INVERTED, !)PSU_ACTIVE_STATE); + #endif + TERN_(PSU_TRACK_STATE_MS, last_state_change_ms = millis()); + psu_on = false; #if ANY(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) diff --git a/Marlin/src/feature/power.h b/Marlin/src/feature/power.h index fdbb7126ceae..16f9dbcef54f 100644 --- a/Marlin/src/feature/power.h +++ b/Marlin/src/feature/power.h @@ -24,8 +24,11 @@ /** * power.h - power control */ +#if PIN_EXISTS(PS_ON_EDM) || (PIN_EXISTS(PS_ON1_EDM) && ENABLED(PSU_OFF_REDUNDANT)) + #define PSU_TRACK_STATE_MS 1 +#endif -#if ANY(AUTO_POWER_CONTROL, POWER_OFF_TIMER) +#if ANY(AUTO_POWER_CONTROL, POWER_OFF_TIMER, PSU_TRACK_STATE_MS) #include "../core/millis_t.h" #endif @@ -37,6 +40,10 @@ class Power { static void power_on(); static void power_off(); + #if PSU_TRACK_STATE_MS + static millis_t last_state_change_ms; + #endif + #if ANY(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) #if ENABLED(POWER_OFF_TIMER) static millis_t power_off_time; diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index c70ac494328f..c676c0aaa815 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3740,6 +3740,8 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." #error "POWER_OFF_DELAY must be a positive value." #elif ENABLED(POWER_OFF_WAIT_FOR_COOLDOWN) && !(defined(AUTO_POWER_E_TEMP) || defined(AUTO_POWER_CHAMBER_TEMP) || defined(AUTO_POWER_COOLER_TEMP)) #error "POWER_OFF_WAIT_FOR_COOLDOWN requires AUTO_POWER_E_TEMP, AUTO_POWER_CHAMBER_TEMP, and/or AUTO_POWER_COOLER_TEMP." + #elif ENABLED(PSU_OFF_REDUNDANT) && !PIN_EXISTS(PS_ON1) + #error "PSU_OFF_REDUNDANT requires PS_ON1_PIN." #endif #endif diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 553d9013a243..82fd637aa124 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -155,6 +155,7 @@ namespace LanguageNarrow_en { LSTR MSG_SPINDLE_REVERSE = _UxGT("Spindle Reverse"); LSTR MSG_SWITCH_PS_ON = _UxGT("Switch Power On"); LSTR MSG_SWITCH_PS_OFF = _UxGT("Switch Power Off"); + LSTR MSG_POWER_EDM_FAULT = _UxGT("Power EDM Fault"); LSTR MSG_EXTRUDE = _UxGT("Extrude"); LSTR MSG_RETRACT = _UxGT("Retract"); LSTR MSG_MOVE_AXIS = _UxGT("Move Axis"); diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index fa6cbf49b945..58f42598a06f 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -901,6 +901,9 @@ #if PIN_EXISTS(PS_ON) REPORT_NAME_DIGITAL(__LINE__, PS_ON_PIN) #endif +#if PIN_EXISTS(PS_ON1) + REPORT_NAME_DIGITAL(__LINE__, PS_ON1_PIN) +#endif // // LCD diff --git a/Marlin/src/pins/pins_postprocess.h b/Marlin/src/pins/pins_postprocess.h index 411faa4ddf2e..e6fdac2155d1 100644 --- a/Marlin/src/pins/pins_postprocess.h +++ b/Marlin/src/pins/pins_postprocess.h @@ -477,6 +477,10 @@ #undef PS_ON_PIN #define PS_ON_PIN -1 #endif +#if DISABLED(PSU_OFF_REDUNDANT) || !defined(PS_ON1_PIN) + #undef PS_ON1_PIN + #define PS_ON1_PIN -1 +#endif #ifndef KILL_PIN #define KILL_PIN -1 #endif From 9a1c993719b30dabfb2ab62101ba249dffa459c7 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 10 Mar 2024 06:05:40 +0000 Subject: [PATCH 010/111] [cron] Bump distribution date (2024-03-10) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 39459850b094..1b783cc7bc61 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 "2024-03-04" +//#define STRING_DISTRIBUTION_DATE "2024-03-10" /** * 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 1a43014544c1..d544d915cb72 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 "2024-03-04" + #define STRING_DISTRIBUTION_DATE "2024-03-10" #endif /** From bca40e07e312419d9defbf963bf0f7a330528c59 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 16 Mar 2024 11:34:02 -0700 Subject: [PATCH 011/111] =?UTF-8?q?=F0=9F=93=9D=20Remove=20Flattr=20Link?= =?UTF-8?q?=20(#26796)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index ac496aac21cd..83614ad9ccef 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,6 @@ Regular users can open and close their own issues, but only the administrators c 🇳🇱  **Erik van der Zalm**       [@ErikZalm](https://github.com/ErikZalm) -       [  Donate 💸  ](https://flattr.com/submit/auto?user_id=ErikZalm&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software) From d36b3fbf9d244edca1c974e38a6e9c3b4790eef5 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 17 Mar 2024 07:37:42 +1300 Subject: [PATCH 012/111] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Fix?= =?UTF-8?q?=20RLE=20script=20for=20infille=20=3D=3D=20outfile=20(#26795)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildroot/share/scripts/rle_compress_bitmap.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/buildroot/share/scripts/rle_compress_bitmap.py b/buildroot/share/scripts/rle_compress_bitmap.py index c3f673c61699..12d25a7e4a36 100755 --- a/buildroot/share/scripts/rle_compress_bitmap.py +++ b/buildroot/share/scripts/rle_compress_bitmap.py @@ -10,6 +10,8 @@ import re def addCompressedData(input_file, output_file): + input_lines = input_file.readlines() + input_file.close() ofile = open(output_file, 'wt') datatype = "uint8_t" @@ -18,8 +20,7 @@ def addCompressedData(input_file, output_file): arrname = '' c_data_section = False ; c_skip_data = False ; c_footer = False - while True: - line = input_file.readline() + for line in input_lines: if not line: break if not c_footer: @@ -56,8 +57,6 @@ def addCompressedData(input_file, output_file): arrname = line.split('[')[0].split(' ')[-1] print("Found data array", arrname) - input_file.close() - #print("\nRaw Bitmap Data", raw_data) # @@ -190,11 +189,11 @@ def rle_emit(ofile, arrname, rledata, rawsize, isext): print('Usage: rle_compress_bitmap.py INPUT_FILE OUTPUT_FILE') exit(1) -output_cpp = sys.argv[2] +output_h = sys.argv[2] inname = sys.argv[1].replace('//', '/') try: - input_cpp = open(inname) + input_h = open(inname) print("Processing", inname, "...") - addCompressedData(input_cpp, output_cpp) + addCompressedData(input_h, output_h) except OSError: print("Can't find input file", inname) From 3b4adac579f42683fbbd9099b89f33801c190145 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 16 Mar 2024 13:55:35 -0500 Subject: [PATCH 013/111] =?UTF-8?q?=F0=9F=8E=A8=20Trailing=20ws?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/stm32f4/pins_TRONXY_CXY_446_V10.h | 4 ++-- ini/stm32f4.ini | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_TRONXY_CXY_446_V10.h b/Marlin/src/pins/stm32f4/pins_TRONXY_CXY_446_V10.h index 00bf9de93401..7e35bfd08fa9 100644 --- a/Marlin/src/pins/stm32f4/pins_TRONXY_CXY_446_V10.h +++ b/Marlin/src/pins/stm32f4/pins_TRONXY_CXY_446_V10.h @@ -219,7 +219,7 @@ #define TOUCH_ORIENTATION TOUCH_LANDSCAPE #endif #endif - + #if ENABLED(MKS_ROBIN_TFT43) #ifndef TOUCH_CALIBRATION_X #define TOUCH_CALIBRATION_X 17184 @@ -237,7 +237,7 @@ #define TOUCH_ORIENTATION TOUCH_LANDSCAPE #endif #endif -#else +#else #error "TRONXY CXY 446 V10 only supports TFT with FSMC interface." #endif diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index fb8e9109cfd8..9c6f751746c3 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -820,7 +820,7 @@ board = marlin_STM32F446ZET_tronxy board_build.ldscript = buildroot/share/PlatformIO/variants/MARLIN_F446Zx_TRONXY/ldscript.ld board_build.offset = 0x10000 board_build.rename = fmw_tronxy.bin -build_flags = ${stm32_variant.build_flags} +build_flags = ${stm32_variant.build_flags} -DSTM32F4xx -DUSE_USB_HS -DUSE_USB_HS_IN_FS build_unflags = ${stm32_variant.build_unflags} -fno-rtti From 3a2c50c199a3fb0deabebc60326459a5f8b213b1 Mon Sep 17 00:00:00 2001 From: Sophist <3001893+Sophist-UK@users.noreply.github.com> Date: Sat, 16 Mar 2024 19:09:50 +0000 Subject: [PATCH 014/111] =?UTF-8?q?=F0=9F=A9=B9=20Thermistor=20name=20fixe?= =?UTF-8?q?s=20(#26857)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/menu/menu_info.cpp | 3 ++- Marlin/src/lcd/thermistornames.h | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index 874b7dbd59f6..9015a9fe6d80 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -116,6 +116,7 @@ void menu_info_thermistors() { #if TEMP_SENSOR_1 != 0 #define THERMISTOR_ID TEMP_SENSOR_1 #include "../thermistornames.h" + #undef THERMISTOR_ID THERM_ITEMS(STR_E1, HEATER_1, WATCH_HOTENDS); #endif @@ -162,9 +163,9 @@ void menu_info_thermistors() { #endif #if HAS_HEATED_BED - #undef THERMISTOR_ID #define THERMISTOR_ID TEMP_SENSOR_BED #include "../thermistornames.h" + #undef THERMISTOR_ID THERM_ITEMS("BED", BED, WATCH_BED); #endif diff --git a/Marlin/src/lcd/thermistornames.h b/Marlin/src/lcd/thermistornames.h index 71f48775bdbe..0454b48fcec0 100644 --- a/Marlin/src/lcd/thermistornames.h +++ b/Marlin/src/lcd/thermistornames.h @@ -104,6 +104,10 @@ #define THERMISTOR_NAME "100k Dagoma NTC" #elif THERMISTOR_ID == 18 #define THERMISTOR_NAME "ATC Semitec 204GT-2" +#elif THERMISTOR_ID == 22 + #define THERMISTOR_NAME "GTM32 Pro vB (hotend)" +#elif THERMISTOR_ID == 23 + #define THERMISTOR_NAME "GTM32 Pro vB (bed)" #elif THERMISTOR_ID == 60 #define THERMISTOR_NAME "Makers Tool" #elif THERMISTOR_ID == 70 @@ -156,6 +160,8 @@ #define THERMISTOR_NAME "Dyze / TL 4.7M" #elif THERMISTOR_ID == 67 #define THERMISTOR_NAME "SliceEng 450°C" +#elif THERMISTOR_ID == 68 + #define THERMISTOR_NAME "PT-100 + Dyze amp" // Dummies for dev testing #elif THERMISTOR_ID == 998 From c0264ae7871ca53de4ea8a24925d5f4f676115ec Mon Sep 17 00:00:00 2001 From: janenen Date: Sat, 16 Mar 2024 20:52:14 +0100 Subject: [PATCH 015/111] =?UTF-8?q?=F0=9F=90=9B=20Fix=20DETECT=5FBROKEN=5F?= =?UTF-8?q?ENDSTOP=20on=20IDEX=20(#26790)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/src/module/motion.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 862f0c575433..c86c382ddcbc 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -2183,6 +2183,7 @@ void prepare_line_to_destination() { do_homing_move(axis, -bump, TERN(HOMING_Z_WITH_PROBE, (axis == Z_AXIS ? z_probe_fast_mm_s : 0), 0), false); #if ENABLED(DETECT_BROKEN_ENDSTOP) + // Check for a broken endstop EndstopEnum es; switch (axis) { @@ -2190,11 +2191,20 @@ void prepare_line_to_destination() { MAIN_AXIS_MAP(_ESCASE) default: break; } + + #if ENABLED(DUAL_X_CARRIAGE) + if (axis == X_AXIS && axis_home_dir > 0) { + es = X_MAX; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("DUAL_X_CARRIAGE: Homing to X_MAX"); + } + #endif + if (TEST(endstops.state(), es)) { SERIAL_ECHO_MSG("Bad ", C(AXIS_CHAR(axis)), " Endstop?"); kill(GET_TEXT_F(MSG_KILL_HOMING_FAILED)); } - #endif + + #endif // DETECT_BROKEN_ENDSTOP #if ALL(HOMING_Z_WITH_PROBE, BLTOUCH) if (axis == Z_AXIS && !bltouch.high_speed_mode && bltouch.deploy()) From e0222d3e01382daf19509226d9cbac233decda21 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 16 Mar 2024 12:56:33 -0700 Subject: [PATCH 016/111] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20G35=20"Probing=20F?= =?UTF-8?q?ailed"=20output=20(#26780)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/bedlevel/G35.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 63a1491f9bb1..c1a329fb8ac0 100644 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -95,9 +95,11 @@ void GcodeSuite::G35() { for (uint8_t i = 0; i < G35_PROBE_COUNT; ++i) { const float z_probed_height = probe.probe_at_point(tramming_points[i], PROBE_PT_RAISE); if (isnan(z_probed_height)) { - SERIAL_ECHO( - F("G35 failed at point "), i + 1, F(" ("), FPSTR(pgm_read_ptr(&tramming_point_name[i])), C(')'), - FPSTR(SP_X_STR), tramming_points[i].x, FPSTR(SP_Y_STR), tramming_points[i].y + SERIAL_ECHOLN( + F("G35 failed at point "), i + 1, + F(" ("), FPSTR(pgm_read_ptr(&tramming_point_name[i])), C(')'), + FPSTR(SP_X_STR), tramming_points[i].x, + FPSTR(SP_Y_STR), tramming_points[i].y ); err_break = true; break; From c1be36bc66d9202fe533d8364b18aa82a8014fef Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 16 Mar 2024 12:58:53 -0700 Subject: [PATCH 017/111] =?UTF-8?q?=F0=9F=8E=A8=20Add=20MKS=20TinyBee=20si?= =?UTF-8?q?lkscreen=20labels=20(#26777)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/esp32/pins_MKS_TINYBEE.h | 52 +++++++++++------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h b/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h index 9164d60ab4f0..6a8187d79207 100644 --- a/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h +++ b/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h @@ -35,7 +35,7 @@ #endif #define BOARD_INFO_NAME "MKS TinyBee" -#define BOARD_WEBSITE_URL "https://github.com/makerbase-mks" +#define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-TinyBee" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME // MAX_EXPANDER_BITS is defined for MKS TinyBee in HAL/ESP32/inc/Conditionals_adv.h @@ -43,21 +43,22 @@ // // Servos // -#define SERVO0_PIN 2 +#define SERVO0_PIN 2 // 3D TOUCH // // Limit Switches // -#define X_STOP_PIN 33 -#define Y_STOP_PIN 32 -#define Z_STOP_PIN 22 -//#define FIL_RUNOUT_PIN 35 - +#define X_STOP_PIN 33 // X +#define Y_STOP_PIN 32 // Y +#define Z_STOP_PIN 22 // Z +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 35 // MT_DET +#endif // // Probe enable // #if ENABLED(PROBE_ENABLE_DISABLE) && !defined(PROBE_ENABLE_PIN) - #define PROBE_ENABLE_PIN SERVO0_PIN + #define PROBE_ENABLE_PIN SERVO0_PIN // 3D TOUCH #endif // @@ -75,49 +76,44 @@ // // Steppers // -#define X_STEP_PIN 129 +#define X_STEP_PIN 129 // X #define X_DIR_PIN 130 #define X_ENABLE_PIN 128 -#define Y_STEP_PIN 132 +#define Y_STEP_PIN 132 // Y #define Y_DIR_PIN 133 #define Y_ENABLE_PIN 131 -#define Z_STEP_PIN 135 +#define Z_STEP_PIN 135 // Z1 #define Z_DIR_PIN 136 #define Z_ENABLE_PIN 134 -#define E0_STEP_PIN 138 +#define E0_STEP_PIN 138 // E0 #define E0_DIR_PIN 139 #define E0_ENABLE_PIN 137 -#define E1_STEP_PIN 141 +#define E1_STEP_PIN 141 // E1 #define E1_DIR_PIN 142 #define E1_ENABLE_PIN 140 -#define Z2_STEP_PIN 141 -#define Z2_DIR_PIN 142 -#define Z2_ENABLE_PIN 140 - // // Temperature Sensors // -#define TEMP_0_PIN 36 // Analog Input -#define TEMP_1_PIN 34 // Analog Input, you need set R6=0Ω and R7=NC -#define TEMP_BED_PIN 39 // Analog Input +#define TEMP_0_PIN 36 // TH1 / Analog Input +#define TEMP_1_PIN 34 // TH2 / Analog Input, you need set R6=0Ω and R7=NC +#define TEMP_BED_PIN 39 // TB / Analog Input // // Heaters / Fans // -#define HEATER_0_PIN 145 -#define HEATER_1_PIN 146 -#define FAN0_PIN 147 -#define FAN1_PIN 148 -#define HEATER_BED_PIN 144 +#define HEATER_0_PIN 145 // HE0 +#define HEATER_1_PIN 146 // HE1 +#define FAN0_PIN 147 // FAN1 +#define FAN1_PIN 148 // FAN2 +#define HEATER_BED_PIN 144 // H-BED -//#define CONTROLLER_FAN_PIN 148 -//#define E0_AUTO_FAN_PIN 148 // need to update Configuration_adv.h @section extruder -//#define E1_AUTO_FAN_PIN 149 // need to update Configuration_adv.h @section extruder +//#define CONTROLLER_FAN_PIN 148 // FAN2 +//#define E0_AUTO_FAN_PIN 148 // FAN2 // // ADC Reference Voltage From 4b01c901bc864585ca3d72f13f0e3ca9e9af2a9f Mon Sep 17 00:00:00 2001 From: Sophist <3001893+Sophist-UK@users.noreply.github.com> Date: Sat, 16 Mar 2024 20:00:16 +0000 Subject: [PATCH 018/111] =?UTF-8?q?=F0=9F=93=9D=20Fix=20M201=20typos=20(#2?= =?UTF-8?q?6854)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 299c6418f3c1..302e459d863f 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1270,11 +1270,11 @@ * XY Frequency limit * Reduce resonance by limiting the frequency of small zigzag infill moves. * See https://hydraraptor.blogspot.com/2010/12/frequency-limit.html - * Use M201 F G to change limits at runtime. + * Use M201 F S to change limits at runtime. */ //#define XY_FREQUENCY_LIMIT 10 // (Hz) Maximum frequency of small zigzag infill moves. Set with M201 F. #ifdef XY_FREQUENCY_LIMIT - #define XY_FREQUENCY_MIN_PERCENT 5 // (%) Minimum FR percentage to apply. Set with M201 G. + #define XY_FREQUENCY_MIN_PERCENT 5 // (%) Minimum FR percentage to apply. Set with M201 S. #endif // From a50490b11f0f79dba3e488ed0d3cfbde6cfedab1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 16 Mar 2024 15:40:45 -0500 Subject: [PATCH 019/111] =?UTF-8?q?=F0=9F=91=B7=20Minor=20signature.py=20a?= =?UTF-8?q?djustments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildroot/share/PlatformIO/scripts/signature.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/signature.py b/buildroot/share/PlatformIO/scripts/signature.py index 2d024c366287..820e6b7d653c 100755 --- a/buildroot/share/PlatformIO/scripts/signature.py +++ b/buildroot/share/PlatformIO/scripts/signature.py @@ -18,13 +18,13 @@ def enabled_defines(filepath): Each entry is a dictionary with a 'name' and a 'section' key. We end up with: { MOTHERBOARD: { name: "MOTHERBOARD", section: "hardware" }, ... } - The 'name' key might get dropped as redundant, but it's useful for debugging. + TODO: Drop the 'name' key as redundant. For now it's useful for debugging. - Because the option names are the keys, only the last occurrence is retained. - Use the Schema class for a more complete list of options, soon with full parsing. + This list is only used to filter config-defined options from those defined elsewhere. - This list is used to filter what is actually a config-defined option versus - defines from elsewhere. + Because the option names are the keys, only the last occurrence is retained. + This means the actual used value might not be reflected by this function. + The Schema class does more complete parsing for a more accurate list of options. While the Schema class parses the configurations on its own, this script will get the preprocessor output and get the intersection of the enabled options from @@ -44,13 +44,10 @@ def enabled_defines(filepath): # This will avoid false positives from #defines in comments f = re.sub(r'/\*.*?\*/', '', '\n'.join(f), flags=re.DOTALL).split("\n") - a = [] for line in f: sline = line.strip() m = re.match(spatt, sline) # @section ... - if m: - section = m.group(1).strip() - continue + if m: section = m.group(1).strip() ; continue if sline[:7] == "#define": # Extract the key here (we don't care about the value) kv = sline[8:].strip().split() @@ -79,6 +76,7 @@ def compute_build_signature(env): Compute the build signature by extracting all configuration settings and building a unique reversible signature that can be included in the binary. The signature can be reversed to get a 1:1 equivalent configuration file. + Used by common-dependencies.py after filtering build files by feature. ''' if 'BUILD_SIGNATURE' in env: return env.Append(BUILD_SIGNATURE=1) From c913020dc2d4df663d58bc02f4ccf3185105e939 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 17 Mar 2024 00:22:34 +0000 Subject: [PATCH 020/111] [cron] Bump distribution date (2024-03-17) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 1b783cc7bc61..2f661d3eecdb 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 "2024-03-10" +//#define STRING_DISTRIBUTION_DATE "2024-03-17" /** * 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 d544d915cb72..693358466516 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 "2024-03-10" + #define STRING_DISTRIBUTION_DATE "2024-03-17" #endif /** From 983aee57188a588dc500049047476b70bb5f4720 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sun, 17 Mar 2024 01:46:22 +0100 Subject: [PATCH 021/111] =?UTF-8?q?=F0=9F=8C=90=20Update=20Italian=20langu?= =?UTF-8?q?age=20(#26837)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/language/language_it.h | 308 +++++++++++++------------- 1 file changed, 156 insertions(+), 152 deletions(-) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index a1c0dda9d9c0..b7dc9d5678bf 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -65,18 +65,18 @@ namespace LanguageNarrow_it { LSTR MSG_MEDIA_UPDATE = _UxGT("Aggiorna ") MEDIA_TYPE_IT; LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Overflow sottochiamate"); LSTR MSG_LCD_ENDSTOPS = _UxGT("Finecor."); // Max 8 characters - LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Finecorsa Soft"); + LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Finecorsa soft"); LSTR MSG_MAIN_MENU = _UxGT("Menu principale"); LSTR MSG_ADVANCED_SETTINGS = _UxGT("Impostaz. avanzate"); LSTR MSG_CONFIGURATION = _UxGT("Configurazione"); LSTR MSG_RUN_AUTO_FILES = _UxGT("Esegui files auto"); - LSTR MSG_DISABLE_STEPPERS = _UxGT("Disabilita Motori"); + LSTR MSG_DISABLE_STEPPERS = _UxGT("Disabilita motori"); LSTR MSG_DEBUG_MENU = _UxGT("Menu di debug"); LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test barra avanzam."); - LSTR MSG_ENDSTOP_TEST = _UxGT("Test Finecorsa"); + LSTR MSG_ENDSTOP_TEST = _UxGT("Test finecorsa"); LSTR MSG_Z_PROBE = _UxGT("Sonda Z"); LSTR MSG_HOMING = _UxGT("Azzeramento"); - LSTR MSG_AUTO_HOME = _UxGT("Auto Home"); + LSTR MSG_AUTO_HOME = _UxGT("Auto home"); LSTR MSG_AUTO_HOME_A = _UxGT("Home @"); LSTR MSG_AUTO_HOME_X = _UxGT("Home X"); LSTR MSG_AUTO_HOME_Y = _UxGT("Home Y"); @@ -85,13 +85,13 @@ namespace LanguageNarrow_it { LSTR MSG_FILAMENT_SET = _UxGT("Impostaz.filamento"); LSTR MSG_FILAMENT_MAN = _UxGT("Gestione filamento"); LSTR MSG_MANUAL_LEVELING = _UxGT("Livel.manuale"); - LSTR MSG_TRAM_FL = _UxGT("Davanti Sinistra"); - LSTR MSG_TRAM_FR = _UxGT("Davanti Destra"); + LSTR MSG_TRAM_FL = _UxGT("Davanti sinistra"); + LSTR MSG_TRAM_FR = _UxGT("Davanti destra"); LSTR MSG_TRAM_C = _UxGT("Centro"); - LSTR MSG_TRAM_BL = _UxGT("Dietro Sinistra"); - LSTR MSG_TRAM_BR = _UxGT("Dietro Destra"); - LSTR MSG_MANUAL_MESH = _UxGT("Mesh Manuale"); - LSTR MSG_AUTO_MESH = _UxGT("Generaz.Autom.Mesh"); + LSTR MSG_TRAM_BL = _UxGT("Dietro sinistra"); + LSTR MSG_TRAM_BR = _UxGT("Dietro destra"); + LSTR MSG_MANUAL_MESH = _UxGT("Mesh manuale"); + LSTR MSG_AUTO_MESH = _UxGT("Generaz.autom.mesh"); LSTR MSG_AUTO_Z_ALIGN = _UxGT("Allineam.automat. Z"); LSTR MSG_ITERATION = _UxGT("Iterazione G34: %i"); LSTR MSG_DECREASING_ACCURACY = _UxGT("Precisione in calo!"); @@ -100,7 +100,7 @@ namespace LanguageNarrow_it { LSTR MSG_LEVEL_BED_WAITING = _UxGT("Premi per iniziare"); LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Punto successivo"); LSTR MSG_LEVEL_BED_DONE = _UxGT("Livel. terminato!"); - LSTR MSG_Z_FADE_HEIGHT = _UxGT("Fade Height"); + LSTR MSG_Z_FADE_HEIGHT = _UxGT("Dissolvi altezza"); LSTR MSG_SET_HOME_OFFSETS = _UxGT("Imp. offset home"); LSTR MSG_HOME_OFFSET_X = _UxGT("Offset home X"); LSTR MSG_HOME_OFFSET_Y = _UxGT("Offset home Y"); @@ -113,21 +113,21 @@ namespace LanguageNarrow_it { 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"); - LSTR MSG_PREHEAT_1_END_E = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello ~"); - LSTR MSG_PREHEAT_1_ALL = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Tutto"); - LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Piatto"); + LSTR MSG_PREHEAT_1_END = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" ugello"); + LSTR MSG_PREHEAT_1_END_E = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" ugello ~"); + LSTR MSG_PREHEAT_1_ALL = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" tutto"); + LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" piatto"); LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" conf"); LSTR MSG_PREHEAT_M = _UxGT("Preriscalda $"); LSTR MSG_PREHEAT_M_H = _UxGT("Preriscalda $ ~"); - LSTR MSG_PREHEAT_M_END = _UxGT("Preris.$ Ugello"); - LSTR MSG_PREHEAT_M_END_E = _UxGT("Preris.$ Ugello ~"); - LSTR MSG_PREHEAT_M_ALL = _UxGT("Preris.$ Tutto"); - LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preris.$ Piatto"); + LSTR MSG_PREHEAT_M_END = _UxGT("Preris.$ ugello"); + LSTR MSG_PREHEAT_M_END_E = _UxGT("Preris.$ ugello ~"); + LSTR MSG_PREHEAT_M_ALL = _UxGT("Preris.$ tutto"); + LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preris.$ piatto"); LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preris.$ conf"); - LSTR MSG_PREHEAT_HOTEND = _UxGT("Prerisc.Hotend"); + LSTR MSG_PREHEAT_HOTEND = _UxGT("Prerisc.ugello"); LSTR MSG_PREHEAT_CUSTOM = _UxGT("Prerisc.personal."); LSTR MSG_COOLDOWN = _UxGT("Raffredda"); @@ -136,7 +136,7 @@ namespace LanguageNarrow_it { LSTR MSG_SPINDLE_MENU = _UxGT("Controllo mandrino"); LSTR MSG_LASER_POWER = _UxGT("Potenza laser"); LSTR MSG_SPINDLE_POWER = _UxGT("Potenza mandrino"); - LSTR MSG_LASER_TOGGLE = _UxGT("Alterna Laser"); + LSTR MSG_LASER_TOGGLE = _UxGT("Alterna laser"); LSTR MSG_LASER_EVAC_TOGGLE = _UxGT("Alterna soffiatore"); LSTR MSG_LASER_ASSIST_TOGGLE = _UxGT("Alterna aria supp."); LSTR MSG_LASER_PULSE_MS = _UxGT("ms impulso di test"); @@ -150,27 +150,27 @@ namespace LanguageNarrow_it { LSTR MSG_SWITCH_PS_OFF = _UxGT("Spegni aliment."); LSTR MSG_EXTRUDE = _UxGT("Estrudi"); LSTR MSG_RETRACT = _UxGT("Ritrai"); - LSTR MSG_MOVE_AXIS = _UxGT("Muovi Asse"); - LSTR MSG_BED_LEVELING = _UxGT("Livella piano"); - LSTR MSG_LEVEL_BED = _UxGT("Livella piano"); - LSTR MSG_BED_TRAMMING = _UxGT("Tarat.fine piano"); - LSTR MSG_BED_TRAMMING_MANUAL = _UxGT("Tarat.fine Manuale"); - LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Regola la vite finché la sonda non rileva il piano."); - LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Tolleranza raggiunta su tutti gli angoli. Piano livellato!"); + LSTR MSG_MOVE_AXIS = _UxGT("Muovi asse"); + LSTR MSG_BED_LEVELING = _UxGT("Livellamento piatto"); + LSTR MSG_LEVEL_BED = _UxGT("Livella piatto"); + LSTR MSG_BED_TRAMMING = _UxGT("Tarat.fine piatto"); + LSTR MSG_BED_TRAMMING_MANUAL = _UxGT("Tarat.fine manuale"); + LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Regola la vite finché la sonda non rileva il piatto."); + LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Tolleranza raggiunta su tutti gli angoli. Piatto livellato!"); LSTR MSG_BED_TRAMMING_GOOD_POINTS = _UxGT("Punti buoni: "); LSTR MSG_BED_TRAMMING_LAST_Z = _UxGT("Ultimo Z: "); LSTR MSG_NEXT_CORNER = _UxGT("Prossimo punto"); - LSTR MSG_MESH_EDITOR = _UxGT("Editor Mesh"); - LSTR MSG_MESH_VIEWER = _UxGT("Visualiz. Mesh"); - LSTR MSG_EDIT_MESH = _UxGT("Modifica Mesh"); - LSTR MSG_MESH_VIEW = _UxGT("Visualizza Mesh"); - LSTR MSG_EDITING_STOPPED = _UxGT("Modif. Mesh Fermata"); + LSTR MSG_MESH_EDITOR = _UxGT("Editor mesh"); + LSTR MSG_MESH_VIEWER = _UxGT("Visualiz. mesh"); + LSTR MSG_EDIT_MESH = _UxGT("Modifica mesh"); + LSTR MSG_MESH_VIEW = _UxGT("Visualizza mesh"); + LSTR MSG_EDITING_STOPPED = _UxGT("Modif. mesh fermata"); LSTR MSG_NO_VALID_MESH = _UxGT("Mesh non valida"); LSTR MSG_ACTIVATE_MESH = _UxGT("Attiva livellamento"); LSTR MSG_PROBING_POINT = _UxGT("Punto sondato"); LSTR MSG_MESH_X = _UxGT("Indice X"); LSTR MSG_MESH_Y = _UxGT("Indice Y"); - LSTR MSG_MESH_INSET = _UxGT("Mesh Inset"); + LSTR MSG_MESH_INSET = _UxGT("Mesh inset"); LSTR MSG_MESH_MIN_X = _UxGT("Mesh X minimo"); LSTR MSG_MESH_MAX_X = _UxGT("Mesh X massimo"); LSTR MSG_MESH_MIN_Y = _UxGT("Mesh Y minimo"); @@ -186,7 +186,7 @@ namespace LanguageNarrow_it { LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda oltre i limiti"); LSTR MSG_M48_DEVIATION = _UxGT("Deviazione"); LSTR MSG_IDEX_MENU = _UxGT("Modo IDEX"); - LSTR MSG_OFFSETS_MENU = _UxGT("Strumenti Offsets"); + LSTR MSG_OFFSETS_MENU = _UxGT("Strumenti offsets"); LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicazione"); LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia speculare"); @@ -197,10 +197,10 @@ namespace LanguageNarrow_it { LSTR MSG_UBL_DOING_G29 = _UxGT("G29 in corso"); LSTR MSG_UBL_TOOLS = _UxGT("Strumenti UBL"); LSTR MSG_LCD_TILTING_MESH = _UxGT("Punto inclinaz."); - LSTR MSG_UBL_TILT_MESH = _UxGT("Inclina Mesh"); + LSTR MSG_UBL_TILT_MESH = _UxGT("Inclina mesh"); LSTR MSG_UBL_TILTING_GRID = _UxGT("Dim.griglia inclin."); LSTR MSG_UBL_MESH_TILTED = _UxGT("Mesh inclinata"); - LSTR MSG_UBL_MANUAL_MESH = _UxGT("Mesh Manuale"); + LSTR MSG_UBL_MANUAL_MESH = _UxGT("Mesh manuale"); LSTR MSG_UBL_MESH_WIZARD = _UxGT("Creaz.guid.mesh UBL"); LSTR MSG_UBL_BC_INSERT = _UxGT("Metti spes. e misura"); LSTR MSG_UBL_BC_INSERT2 = _UxGT("Misura"); @@ -208,57 +208,57 @@ namespace LanguageNarrow_it { LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Spostamento succes."); LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Attiva UBL"); LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Disattiva UBL"); - LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Piatto"); - LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. Piatto"); - LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Ugello"); - LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. Ugello"); - LSTR MSG_UBL_MESH_EDIT = _UxGT("Modifica Mesh"); - LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Modif.Mesh personal."); - LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Ritocca Mesh"); - 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"); - LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Crea Mesh ($)"); - LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Valida Mesh ($)"); - LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Crea Mesh a freddo"); - LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Aggiusta Alt. Mesh"); + LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Temp. piatto"); + LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. piatto"); + LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. ugello"); + LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. ugello"); + LSTR MSG_UBL_MESH_EDIT = _UxGT("Modifica mesh"); + LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Modif.mesh personal."); + LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Ritocca mesh"); + 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"); + LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Crea mesh ($)"); + LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Valida mesh ($)"); + LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Crea mesh a freddo"); + LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Aggiusta alt. mesh"); LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Altezza"); - LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Valida Mesh"); - LSTR MSG_G26_HEATING_BED = _UxGT("G26 riscald.letto"); + LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Valida mesh"); + LSTR MSG_G26_HEATING_BED = _UxGT("G26 riscald.piatto"); LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 riscald.ugello"); LSTR MSG_G26_MANUAL_PRIME = _UxGT("Priming manuale..."); LSTR MSG_G26_FIXED_LENGTH = _UxGT("Prime a lung.fissa"); LSTR MSG_G26_PRIME_DONE = _UxGT("Priming terminato"); - LSTR MSG_G26_CANCELED = _UxGT("G26 Annullato"); + LSTR MSG_G26_CANCELED = _UxGT("G26 annullato"); LSTR MSG_G26_LEAVING = _UxGT("Uscita da G26"); - LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valida Mesh pers."); - LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Continua Mesh"); - LSTR MSG_UBL_MESH_LEVELING = _UxGT("Livell. Mesh"); + LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valida mesh pers."); + LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Continua mesh"); + LSTR MSG_UBL_MESH_LEVELING = _UxGT("Livell. mesh"); LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Livell. 3 Punti"); - LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Livell. Griglia Mesh"); - LSTR MSG_UBL_MESH_LEVEL = _UxGT("Livella Mesh"); + LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Livell. griglia mesh"); + LSTR MSG_UBL_MESH_LEVEL = _UxGT("Livella mesh"); LSTR MSG_UBL_SIDE_POINTS = _UxGT("Punti laterali"); - LSTR MSG_UBL_MAP_TYPE = _UxGT("Tipo di Mappa"); - LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Esporta Mappa"); - LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Esporta per Host"); + LSTR MSG_UBL_MAP_TYPE = _UxGT("Tipo di mappa"); + LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Esporta mappa"); + LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Esporta per host"); LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Esporta in CSV"); LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Backup esterno"); - LSTR MSG_UBL_INFO_UBL = _UxGT("Esporta Info UBL"); + LSTR MSG_UBL_INFO_UBL = _UxGT("Esporta info UBL"); LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Riempimento"); - LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Riempimento Manuale"); - LSTR MSG_UBL_SMART_FILLIN = _UxGT("Riempimento Smart"); - LSTR MSG_UBL_FILLIN_MESH = _UxGT("Riempimento Mesh"); + LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Riempimento manuale"); + LSTR MSG_UBL_SMART_FILLIN = _UxGT("Riempimento smart"); + LSTR MSG_UBL_FILLIN_MESH = _UxGT("Riempimento mesh"); LSTR MSG_UBL_MESH_FILLED = _UxGT("Pts mancanti riempiti"); LSTR MSG_UBL_MESH_INVALID = _UxGT("Mesh non valida"); - LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Invalida Tutto"); - LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalid.Punto Vicino"); - LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Ritocca Tutto"); - LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ritocca Punto Vicino"); - LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Salvate"); + LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Invalida tutto"); + LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalid.punto vicino"); + LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Ritocca tutto"); + LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ritocca punto vicino"); + LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh salvate"); LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Slot di memoria"); - LSTR MSG_UBL_LOAD_MESH = _UxGT("Carica Mesh Piatto"); - LSTR MSG_UBL_SAVE_MESH = _UxGT("Salva Mesh Piatto"); - LSTR MSG_UBL_INVALID_SLOT = _UxGT("Prima selez. uno slot Mesh"); + LSTR MSG_UBL_LOAD_MESH = _UxGT("Carica mesh piatto"); + LSTR MSG_UBL_SAVE_MESH = _UxGT("Salva mesh piatto"); + LSTR MSG_UBL_INVALID_SLOT = _UxGT("Prima selez. uno slot mesh"); LSTR MSG_MESH_LOADED = _UxGT("Mesh %i caricata"); LSTR MSG_MESH_SAVED = _UxGT("Mesh %i salvata"); LSTR MSG_MESH_ACTIVE = _UxGT("Mesh %i attiva"); @@ -266,15 +266,15 @@ namespace LanguageNarrow_it { LSTR MSG_UBL_SAVE_ERROR = _UxGT("Err: Salvataggio UBL"); LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Err: Ripristino UBL"); LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); - LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Fermato"); + LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset fermato"); LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL passo passo"); - LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Crea Mesh a freddo"); - LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Riempimento Smart"); - LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Valida Mesh"); - LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ritocca All"); - LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Valida Mesh"); - LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ritocca All"); - LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Salva Mesh Piatto"); + LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Crea mesh a freddo"); + LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Riempimento smart"); + LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Valida mesh"); + LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ritocca all"); + LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Valida mesh"); + LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ritocca all"); + LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Salva mesh piatto"); LSTR MSG_LED_CONTROL = _UxGT("Controllo LED"); LSTR MSG_LEDS = _UxGT("Luci"); @@ -311,7 +311,7 @@ namespace LanguageNarrow_it { LSTR MSG_MOVE_N_MM = _UxGT("Muovi di $mm"); LSTR MSG_MOVE_N_IN = _UxGT("Muovi di $in"); LSTR MSG_MOVE_N_DEG = _UxGT("Muovi di $") LCD_STR_DEGREE; - LSTR MSG_LIVE_MOVE = _UxGT("Modalità Live"); + LSTR MSG_LIVE_MOVE = _UxGT("Modalità live"); LSTR MSG_SPEED = _UxGT("Velocità"); LSTR MSG_MESH_Z_OFFSET = _UxGT("Piatto Z"); LSTR MSG_NOZZLE = _UxGT("Ugello"); @@ -364,8 +364,8 @@ namespace LanguageNarrow_it { LSTR MSG_MPC_POWER_E = _UxGT("Potenza *"); LSTR MSG_MPC_BLOCK_HEAT_CAPACITY = _UxGT("Capacità riscald."); LSTR MSG_MPC_BLOCK_HEAT_CAPACITY_E = _UxGT("Capac.riscald. *"); - LSTR MSG_SENSOR_RESPONSIVENESS = _UxGT("Reattiv.Sens."); - LSTR MSG_SENSOR_RESPONSIVENESS_E = _UxGT("Reattiv.Sens. *"); + LSTR MSG_SENSOR_RESPONSIVENESS = _UxGT("Reattiv.sens."); + LSTR MSG_SENSOR_RESPONSIVENESS_E = _UxGT("Reattiv.sens. *"); LSTR MSG_MPC_AMBIENT_XFER_COEFF = _UxGT("Coeff.ambiente"); LSTR MSG_MPC_AMBIENT_XFER_COEFF_E = _UxGT("Coeff.amb. *"); LSTR MSG_MPC_AMBIENT_XFER_COEFF_FAN = _UxGT("Coeff.ventola"); @@ -373,32 +373,32 @@ namespace LanguageNarrow_it { LSTR MSG_SELECT_E = _UxGT("Seleziona *"); LSTR MSG_ACC = _UxGT("Accel"); LSTR MSG_JERK = _UxGT("Jerk"); - LSTR MSG_VA_JERK = _UxGT("Max Jerk ") STR_A; - LSTR MSG_VB_JERK = _UxGT("Max Jerk ") STR_B; - LSTR MSG_VC_JERK = _UxGT("Max Jerk ") STR_C; - LSTR MSG_VN_JERK = _UxGT("Max Jerk @"); - LSTR MSG_VE_JERK = _UxGT("Max Jerk E"); + LSTR MSG_VA_JERK = _UxGT("Max jerk ") STR_A; + LSTR MSG_VB_JERK = _UxGT("Max jerk ") STR_B; + LSTR MSG_VC_JERK = _UxGT("Max jerk ") STR_C; + LSTR MSG_VN_JERK = _UxGT("Max jerk @"); + LSTR MSG_VE_JERK = _UxGT("Max jerk E"); LSTR MSG_JUNCTION_DEVIATION = _UxGT("Deviaz. giunzioni"); LSTR MSG_STEP_SMOOTHING = _UxGT("Leviga passo"); LSTR MSG_MAX_SPEED = _UxGT("Vel.massima (mm/s)"); - LSTR MSG_VMAX_A = _UxGT("Vel.Massima ") STR_A; - LSTR MSG_VMAX_B = _UxGT("Vel.Massima ") STR_B; - LSTR MSG_VMAX_C = _UxGT("Vel.Massima ") STR_C; - LSTR MSG_VMAX_N = _UxGT("Vel.Massima @"); - LSTR MSG_VMAX_E = _UxGT("Vel.Massima E"); - LSTR MSG_VMAX_EN = _UxGT("Vel.Massima *"); - LSTR MSG_VMIN = _UxGT("Vel.Minima"); - LSTR MSG_VTRAV_MIN = _UxGT("Vel.Min spostam."); + LSTR MSG_VMAX_A = _UxGT("Vel.massima ") STR_A; + LSTR MSG_VMAX_B = _UxGT("Vel.massima ") STR_B; + LSTR MSG_VMAX_C = _UxGT("Vel.massima ") STR_C; + LSTR MSG_VMAX_N = _UxGT("Vel.massima @"); + LSTR MSG_VMAX_E = _UxGT("Vel.massima E"); + LSTR MSG_VMAX_EN = _UxGT("Vel.massima *"); + LSTR MSG_VMIN = _UxGT("Vel.minima"); + LSTR MSG_VTRAV_MIN = _UxGT("Vel.min spostam."); LSTR MSG_ACCELERATION = _UxGT("Accelerazione"); - LSTR MSG_AMAX_A = _UxGT("Acc.Massima ") STR_A; - LSTR MSG_AMAX_B = _UxGT("Acc.Massima ") STR_B; - LSTR MSG_AMAX_C = _UxGT("Acc.Massima ") STR_C; - LSTR MSG_AMAX_N = _UxGT("Acc.Massima @"); - LSTR MSG_AMAX_E = _UxGT("Acc.Massima E"); - LSTR MSG_AMAX_EN = _UxGT("Acc.Massima *"); + LSTR MSG_AMAX_A = _UxGT("Acc.massima ") STR_A; + LSTR MSG_AMAX_B = _UxGT("Acc.massima ") STR_B; + LSTR MSG_AMAX_C = _UxGT("Acc.massima ") STR_C; + LSTR MSG_AMAX_N = _UxGT("Acc.massima @"); + LSTR MSG_AMAX_E = _UxGT("Acc.massima E"); + LSTR MSG_AMAX_EN = _UxGT("Acc.massima *"); LSTR MSG_A_RETRACT = _UxGT("A-Ritrazione"); LSTR MSG_A_TRAVEL = _UxGT("A-Spostamento"); - LSTR MSG_INPUT_SHAPING = _UxGT("Input Shaping"); + LSTR MSG_INPUT_SHAPING = _UxGT("Input shaping"); LSTR MSG_SHAPING_ENABLE = _UxGT("Abilita shaping @"); LSTR MSG_SHAPING_DISABLE = _UxGT("Disabil. shaping @"); LSTR MSG_SHAPING_FREQ = _UxGT("Frequenza @"); @@ -435,13 +435,15 @@ namespace LanguageNarrow_it { LSTR MSG_DRAW_MIN_Y = _UxGT("Min Y area disegno"); LSTR MSG_DRAW_MAX_Y = _UxGT("Max Y area disegno"); LSTR MSG_MAX_BELT_LEN = _UxGT("Lungh.max cinghia"); - LSTR MSG_LINEAR_ADVANCE = _UxGT("Avanzam.Lineare"); + LSTR MSG_LINEAR_ADVANCE = _UxGT("Avanzam.lineare"); LSTR MSG_ADVANCE_K = _UxGT("K Avanzamento"); LSTR MSG_ADVANCE_K_E = _UxGT("K Avanzamento *"); LSTR MSG_CONTRAST = _UxGT("Contrasto LCD"); LSTR MSG_BRIGHTNESS = _UxGT("Luminosità LCD"); LSTR MSG_SCREEN_TIMEOUT = _UxGT("Timeout LCD (m)"); - LSTR MSG_BRIGHTNESS_OFF = _UxGT("Spegni Retroillum."); + LSTR MSG_HOTEND_TEMP_GRAPH = _UxGT("Grafico temp.ugello"); + LSTR MSG_BED_TEMP_GRAPH = _UxGT("Grafico temp.piatto"); + LSTR MSG_BRIGHTNESS_OFF = _UxGT("Spegni retroillum."); LSTR MSG_STORE_EEPROM = _UxGT("Salva impostazioni"); LSTR MSG_LOAD_EEPROM = _UxGT("Carica impostazioni"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("Ripristina imp."); @@ -488,15 +490,16 @@ namespace LanguageNarrow_it { LSTR MSG_BUTTON_PURGE = _UxGT("Spurga"); LSTR MSG_PAUSING = _UxGT("Messa in pausa..."); LSTR MSG_PAUSE_PRINT = _UxGT("Pausa stampa"); - LSTR MSG_ADVANCED_PAUSE = _UxGT("Pausa Avanzata"); + LSTR MSG_ADVANCED_PAUSE = _UxGT("Pausa avanzata"); LSTR MSG_RESUME_PRINT = _UxGT("Riprendi stampa"); - LSTR MSG_HOST_START_PRINT = _UxGT("Host Avvio"); + LSTR MSG_HOST_START_PRINT = _UxGT("Host avvio"); LSTR MSG_STOP_PRINT = _UxGT("Arresta stampa"); LSTR MSG_END_LOOPS = _UxGT("Fine cicli di rip."); - LSTR MSG_PRINTING_OBJECT = _UxGT("Stampa Oggetto"); - LSTR MSG_CANCEL_OBJECT = _UxGT("Cancella Oggetto"); - LSTR MSG_CANCEL_OBJECT_N = _UxGT("Canc. Oggetto {"); - LSTR MSG_OUTAGE_RECOVERY = _UxGT("Ripresa da PowerLoss"); + LSTR MSG_PRINTING_OBJECT = _UxGT("Stampa oggetto"); + LSTR MSG_CANCEL_OBJECT = _UxGT("Cancella oggetto"); + LSTR MSG_CANCEL_OBJECT_N = _UxGT("Canc. oggetto {"); + LSTR MSG_OUTAGE_RECOVERY = _UxGT("Ripresa da interruz."); + LSTR MSG_RESUME_BED_TEMP = _UxGT("Riprendi temp.piatto"); LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Cont.proc.stampa"); LSTR MSG_MEDIA_MENU = _UxGT("Stampa da ") MEDIA_TYPE_IT; LSTR MSG_NO_MEDIA = MEDIA_TYPE_IT _UxGT(" non presente"); @@ -506,22 +509,22 @@ namespace LanguageNarrow_it { LSTR MSG_PRINTING = _UxGT("Stampa..."); LSTR MSG_STOPPING = _UxGT("Fermata..."); LSTR MSG_REMAINING_TIME = _UxGT("Rimanente"); - LSTR MSG_PRINT_ABORTED = _UxGT("Stampa Annullata"); - LSTR MSG_PRINT_DONE = _UxGT("Stampa Eseguita"); + LSTR MSG_PRINT_ABORTED = _UxGT("Stampa annullata"); + LSTR MSG_PRINT_DONE = _UxGT("Stampa eseguita"); LSTR MSG_PRINTER_KILLED = _UxGT("Stampante uccisa!"); LSTR MSG_TURN_OFF = _UxGT("Spegni stampante"); - LSTR MSG_NO_MOVE = _UxGT("Nessun Movimento"); + LSTR MSG_NO_MOVE = _UxGT("Nessun movimento"); LSTR MSG_KILLED = _UxGT("UCCISO. "); LSTR MSG_STOPPED = _UxGT("ARRESTATO. "); LSTR MSG_FWRETRACT = _UxGT("Ritraz.da firmware"); LSTR MSG_CONTROL_RETRACT = _UxGT("Ritrai mm"); - LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Scamb. Ritrai mm"); - LSTR MSG_CONTROL_RETRACTF = _UxGT("Ritrai V"); + LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Scamb. ritrai mm"); + LSTR MSG_CONTROL_RETRACTF = _UxGT("Ritrai V"); LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Salta mm"); LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Avanza mm"); LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Scamb. Avanza mm"); LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Avanza V"); - LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Scamb. Avanza V"); + LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Scamb. avanza V"); LSTR MSG_AUTORETRACT = _UxGT("AutoRitrai"); LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Lunghezza scambio"); LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra scambio"); @@ -574,11 +577,11 @@ namespace LanguageNarrow_it { LSTR MSG_TOUCHMI_ZTEST = _UxGT("Test Z offset"); LSTR MSG_TOUCHMI_SAVE = _UxGT("Memorizzare"); LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Estendi TouchMI"); - LSTR MSG_MANUAL_DEPLOY = _UxGT("Estendi Sonda-Z"); + LSTR MSG_MANUAL_DEPLOY = _UxGT("Estendi sonda-Z"); LSTR MSG_MANUAL_PENUP = _UxGT("Penna su"); LSTR MSG_MANUAL_PENDOWN = _UxGT("Penna giù"); LSTR MSG_BLTOUCH_STOW = _UxGT("Ritrai BLTouch"); - LSTR MSG_MANUAL_STOW = _UxGT("Ritrai Sonda-Z"); + LSTR MSG_MANUAL_STOW = _UxGT("Ritrai sonda-Z"); LSTR MSG_HOME_FIRST = _UxGT("Home %s prima"); LSTR MSG_ZPROBE_SETTINGS = _UxGT("Impostazioni sonda"); LSTR MSG_ZPROBE_OFFSETS = _UxGT("Offsets sonda"); @@ -588,14 +591,14 @@ namespace LanguageNarrow_it { LSTR MSG_ZPROBE_MARGIN = _UxGT("Margine sonda"); LSTR MSG_Z_FEED_RATE = _UxGT("Velocità Z"); LSTR MSG_ENABLE_HS_MODE = _UxGT("Abilita modo HS"); - LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Muovi ugel.su letto"); + LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Muovi ugel.su piatto"); LSTR MSG_BABYSTEP_X = _UxGT("Babystep X"); LSTR MSG_BABYSTEP_Y = _UxGT("Babystep Y"); LSTR MSG_BABYSTEP_Z = _UxGT("Babystep Z"); LSTR MSG_BABYSTEP_N = _UxGT("Babystep @"); LSTR MSG_BABYSTEP_TOTAL = _UxGT("Totali"); LSTR MSG_ENDSTOP_ABORT = _UxGT("Interrompi se FC"); - LSTR MSG_ERR_HEATING_FAILED = _UxGT("Risc.Fallito"); // Max 12 characters + LSTR MSG_ERR_HEATING_FAILED = _UxGT("Risc.fallito"); // Max 12 characters LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP RIDONDANTE"); LSTR MSG_ERR_THERMAL_RUNAWAY = _UxGT("TEMP FUORI CONTROLLO"); LSTR MSG_ERR_TEMP_MALFUNCTION = _UxGT("MALFUNZIONAMENTO TEMP"); @@ -610,29 +613,30 @@ namespace LanguageNarrow_it { LSTR MSG_COOLING = _UxGT("Raffreddamento..."); LSTR MSG_BED_HEATING = _UxGT("Risc. piatto..."); LSTR MSG_BED_COOLING = _UxGT("Raffr. piatto..."); + LSTR MSG_BED_ANNEALING = _UxGT("Ricottura..."); LSTR MSG_PROBE_HEATING = _UxGT("Risc. sonda..."); LSTR MSG_PROBE_COOLING = _UxGT("Raffr. sonda..."); LSTR MSG_CHAMBER_HEATING = _UxGT("Risc. camera..."); LSTR MSG_CHAMBER_COOLING = _UxGT("Raffr. camera..."); LSTR MSG_LASER_COOLING = _UxGT("Raffr. laser..."); LSTR MSG_DELTA_CALIBRATE = _UxGT("Calibraz. Delta"); - LSTR MSG_DELTA_CALIBRATION_IN_PROGRESS = _UxGT("Calibrazione Delta in corso"); + LSTR MSG_DELTA_CALIBRATION_IN_PROGRESS = _UxGT("Calibrazione delta in corso"); LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibra X"); LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibra Y"); LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibra Z"); LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibra centro"); - LSTR MSG_DELTA_SETTINGS = _UxGT("Impostaz. Delta"); + LSTR MSG_DELTA_SETTINGS = _UxGT("Impostaz. delta"); LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto calibrazione"); - LSTR MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonale"); + LSTR MSG_DELTA_DIAG_ROD = _UxGT("Barra diagonale"); LSTR MSG_DELTA_HEIGHT = _UxGT("Altezza"); LSTR MSG_DELTA_RADIUS = _UxGT("Raggio"); LSTR MSG_INFO_MENU = _UxGT("Info su stampante"); LSTR MSG_INFO_PRINTER_MENU = _UxGT("Info. stampante"); LSTR MSG_3POINT_LEVELING = _UxGT("Livel. a 3 punti"); - LSTR MSG_LINEAR_LEVELING = _UxGT("Livel. Lineare"); - LSTR MSG_BILINEAR_LEVELING = _UxGT("Livel. Bilineare"); + LSTR MSG_LINEAR_LEVELING = _UxGT("Livel. lineare"); + LSTR MSG_BILINEAR_LEVELING = _UxGT("Livel. bilineare"); LSTR MSG_UBL_LEVELING = _UxGT("Livel.piatto unific."); - LSTR MSG_MESH_LEVELING = _UxGT("Livel. Mesh"); + LSTR MSG_MESH_LEVELING = _UxGT("Livel. mesh"); LSTR MSG_MESH_DONE = _UxGT("Sond.mesh eseguito"); LSTR MSG_INFO_STATS_MENU = _UxGT("Statistiche"); LSTR MSG_RESET_STATS = _UxGT("Reset stat.stampa?"); @@ -644,12 +648,12 @@ namespace LanguageNarrow_it { LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Controllo fuga: OFF"); LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Controllo fuga: ON"); LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Timeout inatt.ugello"); - LSTR MSG_HOTEND_IDLE_DISABLE = _UxGT("Disabilita Timeout"); + LSTR MSG_HOTEND_IDLE_DISABLE = _UxGT("Disabilita timeout"); LSTR MSG_HOTEND_IDLE_NOZZLE_TARGET = _UxGT("Temp.inatt.ugello"); - LSTR MSG_HOTEND_IDLE_BED_TARGET = _UxGT("Temp.inatt.letto"); + LSTR MSG_HOTEND_IDLE_BED_TARGET = _UxGT("Temp.inatt.piatto"); LSTR MSG_FAN_SPEED_FAULT = _UxGT("Err.vel.della ventola"); - LSTR MSG_CASE_LIGHT = _UxGT("Luci Case"); + LSTR MSG_CASE_LIGHT = _UxGT("Luci case"); LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Luminosità Luci"); LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("STAMPANTE ERRATA"); @@ -662,13 +666,13 @@ namespace LanguageNarrow_it { LSTR MSG_COLORS_WHITE = _UxGT("Bianco"); LSTR MSG_UI_LANGUAGE = _UxGT("Lingua UI"); LSTR MSG_SOUND_ENABLE = _UxGT("Abilita suono"); - LSTR MSG_LOCKSCREEN = _UxGT("Blocca Schermo"); + LSTR MSG_LOCKSCREEN = _UxGT("Blocca schermo"); LSTR MSG_LOCKSCREEN_LOCKED = _UxGT("Stamp. bloccata,"); LSTR MSG_LOCKSCREEN_UNLOCK = _UxGT("Scroll x sbloccare."); LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Attendere fino al riavvio."); - LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("No Supporto"); - LSTR MSG_PLEASE_PREHEAT = _UxGT("Prerisc. hot end."); + LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("No supporto"); + LSTR MSG_PLEASE_PREHEAT = _UxGT("Prerisc. ugello."); LSTR MSG_INFO_PRINT_COUNT = _UxGT("Stampe"); LSTR MSG_INFO_PRINT_TIME = _UxGT("Durata"); LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Più lungo"); @@ -678,7 +682,7 @@ namespace LanguageNarrow_it { LSTR MSG_INFO_MIN_TEMP = _UxGT("Temp min"); LSTR MSG_INFO_MAX_TEMP = _UxGT("Temp max"); LSTR MSG_INFO_PSU = _UxGT("Alimentatore"); - LSTR MSG_DRIVE_STRENGTH = _UxGT("Potenza Drive"); + LSTR MSG_DRIVE_STRENGTH = _UxGT("Potenza drive"); LSTR MSG_DAC_PERCENT_N = _UxGT("Driver @ %"); LSTR MSG_ERROR_TMC = _UxGT("ERR.CONNESSIONE TMC"); LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Scrivi DAC EEPROM"); @@ -793,21 +797,21 @@ namespace LanguageNarrow_it { LSTR MSG_FIXED_TIME_MOTION = _UxGT("Movimento a Tempo-Fisso"); LSTR MSG_FTM_MODE = _UxGT("Modo Movimento:"); - LSTR MSG_FTM_ZV = _UxGT("ZV"); - LSTR MSG_FTM_ZVD = _UxGT("ZVD"); - LSTR MSG_FTM_EI = _UxGT("EI"); - LSTR MSG_FTM_2HEI = _UxGT("2HEI"); - LSTR MSG_FTM_3HEI = _UxGT("3HEI"); - LSTR MSG_FTM_MZV = _UxGT("MZV"); - //LSTR MSG_FTM_ULENDO_FBS = _UxGT("Ulendo FBS"); - //LSTR MSG_FTM_DISCTF = _UxGT("DISCTF"); + //LSTR MSG_FTM_ZV = _UxGT("ZV"); + //LSTR MSG_FTM_ZVD = _UxGT("ZVD"); + //LSTR MSG_FTM_ZVDD = _UxGT("ZVDD"); + //LSTR MSG_FTM_ZVDDD = _UxGT("ZVDDD"); + //LSTR MSG_FTM_EI = _UxGT("EI"); + //LSTR MSG_FTM_2HEI = _UxGT("2HEI"); + //LSTR MSG_FTM_3HEI = _UxGT("3HEI"); + //LSTR MSG_FTM_MZV = _UxGT("MZV"); LSTR MSG_FTM_DYN_MODE = _UxGT("Modo DF:"); LSTR MSG_FTM_Z_BASED = _UxGT("Base-Z"); LSTR MSG_FTM_MASS_BASED = _UxGT("Base-Massa"); - LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Freq. Base"); - LSTR MSG_FTM_DFREQ_K_N = _UxGT("@ Freq. Dinam."); - LSTR MSG_FTM_ZETA = _UxGT("Smorzamento"); - LSTR MSG_FTM_VTOL = _UxGT("Livello Vib."); + LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Freq. base"); + LSTR MSG_FTM_DFREQ_K_N = _UxGT("@ Freq. dinam."); + LSTR MSG_FTM_ZETA_N = _UxGT("Smorzamento @"); + LSTR MSG_FTM_VTOL_N = _UxGT("Livello vib. @"); LSTR MSG_LEVEL_X_AXIS = _UxGT("Livello asse X"); LSTR MSG_AUTO_CALIBRATE = _UxGT("Auto Calibra"); @@ -847,7 +851,7 @@ namespace LanguageNarrow_it { LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("Nessun file selezionato"); LSTR DGUS_MSG_TEMP_TOO_LOW = _UxGT("Temperatura troppo bassa"); LSTR DGUS_MSG_EXECUTING_COMMAND = _UxGT("Esecuzione del comando..."); - LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("PID letto disabilitato"); + LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("PID piatto disabilitato"); LSTR DGUS_MSG_PID_DISABLED = _UxGT("PID disabilitato"); LSTR DGUS_MSG_PID_AUTOTUNING = _UxGT("Calibrazione PID..."); LSTR DGUS_MSG_INVALID_RECOVERY_DATA = _UxGT("Dati di recupero non validi"); @@ -856,7 +860,7 @@ namespace LanguageNarrow_it { LSTR DGUS_MSG_BUSY = _UxGT("Occupato"); LSTR DGUS_MSG_HOMING = _UxGT("Azzeramento..."); LSTR DGUS_MSG_FW_OUTDATED = _UxGT("Richiesto aggiornamento DWIN GUI/OS"); - LSTR DGUS_MSG_ABL_REQUIRED = _UxGT("Richiesto autolivellamento letto"); + LSTR DGUS_MSG_ABL_REQUIRED = _UxGT("Richiesto autolivellamento piatto"); LSTR DGUS_MSG_PROBING_FAILED = _UxGT("Sondaggio fallito"); LSTR DGUS_MSG_PROBING_SUCCESS = _UxGT("Sondaggio effettuato"); LSTR DGUS_MSG_RESET_EEPROM = _UxGT("Reset EEPROM"); @@ -873,12 +877,12 @@ namespace LanguageWide_it { LSTR MSG_PRINTING_OBJECT = _UxGT("Sto stampando l'oggetto"); LSTR MSG_CANCEL_OBJECT = _UxGT("Cancella l'oggetto"); LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancella l'oggetto {"); - LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Continua il Job di stampa"); + LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Continua il job di stampa"); LSTR MSG_MEDIA_MENU = _UxGT("Selez.da supporto"); LSTR MSG_TURN_OFF = _UxGT("Spegni la stampante"); LSTR MSG_END_LOOPS = _UxGT("Termina i cicli di ripetizione"); LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Nessun supporto inserito."); - LSTR MSG_PLEASE_PREHEAT = _UxGT("Si prega di preriscaldare l'hot end."); + LSTR MSG_PLEASE_PREHEAT = _UxGT("Si prega di preriscaldare l'ugello."); LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Azzera i contatori di stampa"); LSTR MSG_INFO_PRINT_COUNT = _UxGT("Contatori di stampa"); LSTR MSG_INFO_PRINT_TIME = _UxGT("Tempo totale"); From ea6a89103872af8cdfc4a6f6dcebf1df79c8b376 Mon Sep 17 00:00:00 2001 From: Manuel McLure Date: Sun, 17 Mar 2024 12:23:12 -0700 Subject: [PATCH 022/111] =?UTF-8?q?=E2=9C=A8=20MAX7219=5FREINIT=5FON=5FPOW?= =?UTF-8?q?ERUP=20(#26163)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 1 + Marlin/src/feature/max7219.cpp | 48 ++++++++++++++++++++++++++++++---- Marlin/src/feature/power.cpp | 7 +++++ buildroot/tests/DUE | 2 +- 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 302e459d863f..a12eef2556a9 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -4308,6 +4308,7 @@ // See class CodeProfiler. //#define MAX7219_DEBUG_MULTISTEPPING 6 // Show multi-stepping 1 to 128 on this LED matrix row. //#define MAX7219_DEBUG_SLOWDOWN 6 // Count (mod 16) how many times SLOWDOWN has reduced print speed. + //#define MAX7219_REINIT_ON_POWERUP // Re-initialize MAX7129 when power supply turns on #endif /** diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp index 6089b1a86e85..64960f1dfe73 100644 --- a/Marlin/src/feature/max7219.cpp +++ b/Marlin/src/feature/max7219.cpp @@ -72,6 +72,26 @@ uint16_t CodeProfiler::call_count = 0; #endif +#if defined(MAX7219_DEBUG_PLANNER_HEAD) && defined(MAX7219_DEBUG_PLANNER_TAIL) && MAX7219_DEBUG_PLANNER_HEAD == MAX7219_DEBUG_PLANNER_TAIL + static int16_t last_head_cnt = 0xF, last_tail_cnt = 0xF; +#else + #ifdef MAX7219_DEBUG_PLANNER_HEAD + static int16_t last_head_cnt = 0x1; + #endif + #ifdef MAX7219_DEBUG_PLANNER_TAIL + static int16_t last_tail_cnt = 0x1; + #endif +#endif +#ifdef MAX7219_DEBUG_PLANNER_QUEUE + static int16_t last_depth = 0; +#endif +#ifdef MAX7219_DEBUG_PROFILE + static uint8_t last_time_fraction = 0; +#endif +#ifdef MAX7219_DEBUG_MULTISTEPPING + static uint8_t last_multistepping = 0; +#endif + Max7219 max7219; uint8_t Max7219::led_line[MAX7219_LINES]; // = { 0 }; @@ -550,6 +570,29 @@ void Max7219::init() { #if MAX7219_INIT_TEST start_test_pattern(); #endif + + #ifdef MAX7219_REINIT_ON_POWERUP + #if defined(MAX7219_DEBUG_PLANNER_HEAD) && defined(MAX7219_DEBUG_PLANNER_TAIL) && MAX7219_DEBUG_PLANNER_HEAD == MAX7219_DEBUG_PLANNER_TAIL + last_head_cnt = 0xF; + last_tail_cnt = 0xF; + #else + #ifdef MAX7219_DEBUG_PLANNER_HEAD + last_head_cnt = 0x1; + #endif + #ifdef MAX7219_DEBUG_PLANNER_TAIL + last_tail_cnt = 0x1; + #endif + #endif + #ifdef MAX7219_DEBUG_PLANNER_QUEUE + last_depth = 0; + #endif + #ifdef MAX7219_DEBUG_PROFILE + last_time_fraction = 0; + #endif + #ifdef MAX7219_DEBUG_MULTISTEPPING + last_multistepping = 0; + #endif + #endif } /** @@ -676,8 +719,6 @@ void Max7219::idle_tasks() { #if defined(MAX7219_DEBUG_PLANNER_HEAD) && defined(MAX7219_DEBUG_PLANNER_TAIL) && MAX7219_DEBUG_PLANNER_HEAD == MAX7219_DEBUG_PLANNER_TAIL - static int16_t last_head_cnt = 0xF, last_tail_cnt = 0xF; - if (last_head_cnt != head || last_tail_cnt != tail) { range16(MAX7219_DEBUG_PLANNER_HEAD, last_tail_cnt, tail, last_head_cnt, head, &row_change_mask); last_head_cnt = head; @@ -687,7 +728,6 @@ void Max7219::idle_tasks() { #else #ifdef MAX7219_DEBUG_PLANNER_HEAD - static int16_t last_head_cnt = 0x1; if (last_head_cnt != head) { mark16(MAX7219_DEBUG_PLANNER_HEAD, last_head_cnt, head, &row_change_mask); last_head_cnt = head; @@ -695,7 +735,6 @@ void Max7219::idle_tasks() { #endif #ifdef MAX7219_DEBUG_PLANNER_TAIL - static int16_t last_tail_cnt = 0x1; if (last_tail_cnt != tail) { mark16(MAX7219_DEBUG_PLANNER_TAIL, last_tail_cnt, tail, &row_change_mask); last_tail_cnt = tail; @@ -714,7 +753,6 @@ void Max7219::idle_tasks() { #endif #ifdef MAX7219_DEBUG_PROFILE - static uint8_t last_time_fraction = 0; const uint8_t current_time_fraction = (uint16_t(CodeProfiler::get_time_fraction()) * MAX7219_NUMBER_UNITS + 8) / 16; if (current_time_fraction != last_time_fraction) { quantity(MAX7219_DEBUG_PROFILE, last_time_fraction, current_time_fraction, &row_change_mask); diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 1531d04a7f07..20eb63a6f160 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -34,6 +34,10 @@ #include "../module/temperature.h" #include "../MarlinCore.h" +#if ENABLED(MAX7219_REINIT_ON_POWERUP) + #include "max7219.h" +#endif + #if ENABLED(PS_OFF_SOUND) #include "../libs/buzzer.h" #endif @@ -100,6 +104,9 @@ void Power::power_on() { safe_delay(PSU_POWERUP_DELAY); restore_stepper_drivers(); + + TERN_(MAX7219_REINIT_ON_POWERUP, max7219.init()); + TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY)); #ifdef PSU_POWERUP_GCODE diff --git a/buildroot/tests/DUE b/buildroot/tests/DUE index 81e60c962345..590d76606c97 100755 --- a/buildroot/tests/DUE +++ b/buildroot/tests/DUE @@ -27,7 +27,7 @@ opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ FWRETRACT ARC_SUPPORT ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS \ PSU_CONTROL AUTO_POWER_CONTROL E_DUAL_STEPPER_DRIVERS \ PIDTEMPBED SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER \ - PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL \ + PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL MAX7219_REINIT_ON_POWERUP \ EXTENSIBLE_UI opt_add EXTUI_EXAMPLE exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), ExtUI, S-Curve, many options." "$3" From 05896551f1fd521865e6cc056a3acc07a6bf2c0b Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 18 Mar 2024 00:21:39 +0000 Subject: [PATCH 023/111] [cron] Bump distribution date (2024-03-18) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 2f661d3eecdb..2a4c325b488c 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 "2024-03-17" +//#define STRING_DISTRIBUTION_DATE "2024-03-18" /** * 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 693358466516..4af70324e982 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 "2024-03-17" + #define STRING_DISTRIBUTION_DATE "2024-03-18" #endif /** From 075f96d2bf44c20d480599ccf7b90909dfa6f217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20M=C3=B6=C3=9Finger?= Date: Fri, 22 Mar 2024 22:36:42 +0100 Subject: [PATCH 024/111] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20stepper=20MS?= =?UTF-8?q?=20pin=20typos=20(#26891)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/stepper.cpp | 48 +++++++++++++++++------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 0ae6ccb9a75c..16855ebb660a 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -4118,22 +4118,22 @@ void Stepper::report_positions() { break; #endif #if HAS_I_MS_PINS - case I_AXIS: WRITE(I_MS1_PIN, ms1); break + case I_AXIS: WRITE(I_MS1_PIN, ms1); break; #endif #if HAS_J_MS_PINS - case J_AXIS: WRITE(J_MS1_PIN, ms1); break + case J_AXIS: WRITE(J_MS1_PIN, ms1); break; #endif #if HAS_K_MS_PINS - case K_AXIS: WRITE(K_MS1_PIN, ms1); break + case K_AXIS: WRITE(K_MS1_PIN, ms1); break; #endif #if HAS_U_MS_PINS - case U_AXIS: WRITE(U_MS1_PIN, ms1); break + case U_AXIS: WRITE(U_MS1_PIN, ms1); break; #endif #if HAS_V_MS_PINS - case V_AXIS: WRITE(V_MS1_PIN, ms1); break + case V_AXIS: WRITE(V_MS1_PIN, ms1); break; #endif #if HAS_W_MS_PINS - case W_AXIS: WRITE(W_MS1_PIN, ms1); break + case W_AXIS: WRITE(W_MS1_PIN, ms1); break; #endif #if HAS_E0_MS_PINS case E_AXIS: WRITE(E0_MS1_PIN, ms1); break; @@ -4198,22 +4198,22 @@ void Stepper::report_positions() { break; #endif #if HAS_I_MS_PINS - case I_AXIS: WRITE(I_MS2_PIN, ms2); break + case I_AXIS: WRITE(I_MS2_PIN, ms2); break; #endif #if HAS_J_MS_PINS - case J_AXIS: WRITE(J_MS2_PIN, ms2); break + case J_AXIS: WRITE(J_MS2_PIN, ms2); break; #endif #if HAS_K_MS_PINS - case K_AXIS: WRITE(K_MS2_PIN, ms2); break + case K_AXIS: WRITE(K_MS2_PIN, ms2); break; #endif #if HAS_U_MS_PINS - case U_AXIS: WRITE(U_MS2_PIN, ms2); break + case U_AXIS: WRITE(U_MS2_PIN, ms2); break; #endif #if HAS_V_MS_PINS - case V_AXIS: WRITE(V_MS2_PIN, ms2); break + case V_AXIS: WRITE(V_MS2_PIN, ms2); break; #endif #if HAS_W_MS_PINS - case W_AXIS: WRITE(W_MS2_PIN, ms2); break + case W_AXIS: WRITE(W_MS2_PIN, ms2); break; #endif #if HAS_E0_MS_PINS case E_AXIS: WRITE(E0_MS2_PIN, ms2); break; @@ -4277,23 +4277,23 @@ void Stepper::report_positions() { #endif break; #endif - #if HAS_I_MS_PINS - case I_AXIS: WRITE(I_MS3_PIN, ms3); break + #if HAS_I_MS_PINS && PIN_EXISTS(I_MS3) + case I_AXIS: WRITE(I_MS3_PIN, ms3); break; #endif - #if HAS_J_MS_PINS - case J_AXIS: WRITE(J_MS3_PIN, ms3); break + #if HAS_J_MS_PINS && PIN_EXISTS(J_MS3) + case J_AXIS: WRITE(J_MS3_PIN, ms3); break; #endif - #if HAS_K_MS_PINS - case K_AXIS: WRITE(K_MS3_PIN, ms3); break + #if HAS_K_MS_PINS && PIN_EXISTS(K_MS3) + case K_AXIS: WRITE(K_MS3_PIN, ms3); break; #endif - #if HAS_U_MS_PINS - case U_AXIS: WRITE(U_MS3_PIN, ms3); break + #if HAS_U_MS_PINS && PIN_EXISTS(U_MS3) + case U_AXIS: WRITE(U_MS3_PIN, ms3); break; #endif - #if HAS_V_MS_PINS - case V_AXIS: WRITE(V_MS3_PIN, ms3); break + #if HAS_V_MS_PINS && PIN_EXISTS(V_MS3) + case V_AXIS: WRITE(V_MS3_PIN, ms3); break; #endif - #if HAS_W_MS_PINS - case W_AXIS: WRITE(W_MS3_PIN, ms3); break + #if HAS_W_MS_PINS && PIN_EXISTS(W_MS3) + case W_AXIS: WRITE(W_MS3_PIN, ms3); break; #endif #if HAS_E0_MS_PINS && PIN_EXISTS(E0_MS3) case E_AXIS: WRITE(E0_MS3_PIN, ms3); break; From 896a6a93afdc74ce6684ec1b8b3e3e7dd84caa3e Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 23 Mar 2024 00:20:15 +0000 Subject: [PATCH 025/111] [cron] Bump distribution date (2024-03-23) --- 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 2a4c325b488c..29b7c88c8053 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 "2024-03-18" +//#define STRING_DISTRIBUTION_DATE "2024-03-23" /** * 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 4af70324e982..b1634889cb3f 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 "2024-03-18" + #define STRING_DISTRIBUTION_DATE "2024-03-23" #endif /** From aecfb257e9ceb9d5e584413a885f8417864b4fb0 Mon Sep 17 00:00:00 2001 From: Sophist <3001893+Sophist-UK@users.noreply.github.com> Date: Sat, 23 Mar 2024 00:27:13 +0000 Subject: [PATCH 026/111] =?UTF-8?q?=F0=9F=9A=B8=20Hide=20auto-run=20as=20n?= =?UTF-8?q?eeded=20(#26853)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/menu/menu_main.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 7277045baf6b..3cff167f3fc0 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -237,12 +237,11 @@ void menu_configuration(); #endif void menu_main() { - const bool busy = printingIsActive() - #if HAS_MEDIA - , card_detected = card.isMounted() - , card_open = card_detected && card.isFileOpen() - #endif - ; + const bool busy = printingIsActive(); + #if HAS_MEDIA + const bool card_detected = card.isMounted(), + card_open = card_detected && card.isFileOpen(); + #endif START_MENU(); BACK_ITEM(MSG_INFO_SCREEN); @@ -279,12 +278,12 @@ void menu_main() { else { #if ALL(HAS_MEDIA, MEDIA_MENU_AT_TOP) // BEGIN MEDIA MENU - #if ENABLED(MENU_ADDAUTOSTART) - ACTION_ITEM(MSG_RUN_AUTO_FILES, card.autofile_begin); // Run Auto Files - #endif - if (card_detected) { if (!card_open) { + #if ENABLED(MENU_ADDAUTOSTART) + ACTION_ITEM(MSG_RUN_AUTO_FILES, card.autofile_begin); // Run Auto Files + #endif + #if HAS_SD_DETECT GCODES_ITEM(MSG_CHANGE_MEDIA, F("M21" TERN_(MULTI_VOLUME, "S"))); // M21 Change Media #if ENABLED(MULTI_VOLUME) @@ -396,12 +395,12 @@ void menu_main() { #if HAS_MEDIA && DISABLED(MEDIA_MENU_AT_TOP) // BEGIN MEDIA MENU - #if ENABLED(MENU_ADDAUTOSTART) - ACTION_ITEM(MSG_RUN_AUTO_FILES, card.autofile_begin); // Run Auto Files - #endif - if (card_detected) { if (!card_open) { + #if ENABLED(MENU_ADDAUTOSTART) + ACTION_ITEM(MSG_RUN_AUTO_FILES, card.autofile_begin); // Run Auto Files + #endif + #if HAS_SD_DETECT GCODES_ITEM(MSG_CHANGE_MEDIA, F("M21" TERN_(MULTI_VOLUME, "S"))); // M21 Change Media #if ENABLED(MULTI_VOLUME) From 3ee3964becc6861375b8a0470bfb6401d52b83b8 Mon Sep 17 00:00:00 2001 From: John Robertson Date: Sat, 23 Mar 2024 00:57:23 +0000 Subject: [PATCH 027/111] =?UTF-8?q?=F0=9F=90=9B=20Fix=20ESP32=20laser=20M4?= =?UTF-8?q?=20exception=20(#26884)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/stepper.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 16855ebb660a..9380ff79f4c0 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2456,7 +2456,8 @@ hal_timer_t Stepper::block_phase_isr() { */ if (cutter.cutter_mode == CUTTER_MODE_DYNAMIC && planner.laser_inline.status.isPowered // isPowered flag set on any parsed G1, G2, G3, or G5 move; cleared on any others. - && cutter.last_block_power != current_block->laser.power // Prevent constant update without change + && current_block // Block may not be available if steps completed (see discard_current_block() above) + && cutter.last_block_power != current_block->laser.power // Only update if the power changed ) { cutter.apply_power(current_block->laser.power); cutter.last_block_power = current_block->laser.power; From 825ebfd5fe9e518969c7436e366840fa0de1356a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 24 Mar 2024 00:23:21 +0000 Subject: [PATCH 028/111] [cron] Bump distribution date (2024-03-24) --- 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 29b7c88c8053..d94bbdfcd8a2 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 "2024-03-23" +//#define STRING_DISTRIBUTION_DATE "2024-03-24" /** * 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 b1634889cb3f..ead800e214f1 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 "2024-03-23" + #define STRING_DISTRIBUTION_DATE "2024-03-24" #endif /** From eb897e65a1f43c309c2ddd91e146ed7306e2271e Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Mon, 25 Mar 2024 03:49:25 +0900 Subject: [PATCH 029/111] =?UTF-8?q?=F0=9F=93=9D=20Fix=20Cutter.md=20typo?= =?UTF-8?q?=20(#26901)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Cutter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Cutter.md b/docs/Cutter.md index 623beb21f4d3..8f4b7e67aa69 100644 --- a/docs/Cutter.md +++ b/docs/Cutter.md @@ -81,7 +81,7 @@ A reduced entry laser power factor is based on the entry step rate to cruise ste block entry laser power = laser power * ( entry step rate / cruise step rate ) -The initial power will be set to no less than the laser_power_floor or the inital power calculation. +The initial power will be set to no less than the laser_power_floor or the initial power calculation. The reduced final power factor is based on the final step rate to cruise step rate ratio for deceleration. From d0d229e380d9b5c82dfeef4980f5b7b4745e933d Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 25 Mar 2024 00:21:58 +0000 Subject: [PATCH 030/111] [cron] Bump distribution date (2024-03-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 d94bbdfcd8a2..50b202713d00 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 "2024-03-24" +//#define STRING_DISTRIBUTION_DATE "2024-03-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 ead800e214f1..1ec56af89a33 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 "2024-03-24" + #define STRING_DISTRIBUTION_DATE "2024-03-25" #endif /** From cd357b027881dc1d3a432127f74d54d3d9ee91db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20M=C3=B6=C3=9Finger?= Date: Wed, 27 Mar 2024 20:38:08 +0100 Subject: [PATCH 031/111] =?UTF-8?q?=F0=9F=94=A7=F0=9F=9A=B8=20Tweaks=20for?= =?UTF-8?q?=20(MiniRambo)=20CNC=20(#26892)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 4 +-- .../src/gcode/feature/digipot/M907-M910.cpp | 4 ++- Marlin/src/inc/SanityCheck.h | 4 +-- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 34 ++++++++++++++++++- Marlin/src/pins/rambo/pins_MINIRAMBO.h | 26 ++++++++++---- 5 files changed, 59 insertions(+), 13 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 49015aeec56a..72ec272b4d99 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2636,9 +2636,9 @@ #define DISPLAY_CHARSET_HD44780 JAPANESE /** - * Info Screen Style (0:Classic, 1:Průša) + * Info Screen Style (0:Classic, 1:Průša, 2:CNC) * - * :[0:'Classic', 1:'Průša'] + * :[0:'Classic', 1:'Průša', 2:'CNC'] */ #define LCD_INFO_SCREEN_STYLE 0 diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index 55d43f1b416f..e36cf76e88e1 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -133,7 +133,9 @@ void GcodeSuite::M907() { SERIAL_ECHOLNPGM_P( // PWM-based has 3 values: PSTR(" M907 X"), stepper.motor_current_setting[0] // X, Y, (I, J, K, U, V, W) , SP_Z_STR, stepper.motor_current_setting[1] // Z - , SP_E_STR, stepper.motor_current_setting[2] // E + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + , SP_E_STR, stepper.motor_current_setting[2] // E + #endif ); #elif HAS_MOTOR_CURRENT_SPI SERIAL_ECHOPGM(" M907"); // SPI-based has 5 values: diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index c676c0aaa815..fdc78aa3e4b0 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -345,8 +345,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #if LCD_INFO_SCREEN_STYLE > 0 #if HAS_MARLINUI_U8GLIB || LCD_WIDTH < 20 || LCD_HEIGHT < 4 #error "Alternative LCD_INFO_SCREEN_STYLE requires 20x4 Character LCD." - #elif LCD_INFO_SCREEN_STYLE > 1 - #error "LCD_INFO_SCREEN_STYLE only has options 0 and 1 at this time." + #elif LCD_INFO_SCREEN_STYLE > 2 + #error "LCD_INFO_SCREEN_STYLE only has options 0 (Classic), 1 (Průša), and 2 (CNC)." #endif #endif diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 1126b4a4b62c..d36233d73d98 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -1139,7 +1139,39 @@ void MarlinUI::draw_status_screen() { TERN_(SHOW_PROGRESS_PERCENT, setPercentPos(LCD_WIDTH - 9, 2)); rotate_progress(); #endif - #endif // LCD_INFO_SCREEN_STYLE 1 + + #elif LCD_INFO_SCREEN_STYLE == 2 + + // ========== Line 1 ========== + + // + // X Coordinate + // + lcd_moveto(0, 0); + _draw_axis_value(X_AXIS, ftostr52sp(LOGICAL_X_POSITION(current_position.x)), blink); + + // + // Y Coordinate + // + lcd_moveto(LCD_WIDTH - 9, 0); + _draw_axis_value(Y_AXIS, ftostr52sp(LOGICAL_Y_POSITION(current_position.y)), blink); + + // ========== Line 2 ========== + lcd_moveto(0, 1); + _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position.z)), blink); + + lcd_moveto(LCD_WIDTH - 9, 1); + _draw_axis_value(I_AXIS, ftostr52sp(LOGICAL_I_POSITION(current_position.i)), blink); + + // ========== Line 3 ========== + lcd_moveto(0, 2); + lcd_put_lchar('F'); + + lcd_moveto(LCD_WIDTH - 9, 2); + lcd_put_lchar('S'); + + + #endif // LCD_INFO_SCREEN_STYLE // ========= Last Line ======== diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index f176efcc7111..c0bac9b36328 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -31,10 +31,12 @@ #include "env_validate.h" -#if MB(MINIRAMBO_10A) - #define BOARD_INFO_NAME "Mini RAMBo 1.0a" -#else - #define BOARD_INFO_NAME "Mini RAMBo" +#ifndef BOARD_INFO_NAME + #if MB(MINIRAMBO_10A) + #define BOARD_INFO_NAME "Mini RAMBo 1.0a" + #else + #define BOARD_INFO_NAME "Mini RAMBo" + #endif #endif // @@ -47,6 +49,10 @@ #define Z_MIN_PIN 10 #define Z_MAX_PIN 23 +#if HAS_I_AXIS + #define I_STOP_PIN 30 // X_MAX (for now) +#endif + // // Z Probe (when not Z_MIN_PIN) // @@ -128,9 +134,15 @@ // #if HAS_CUTTER // Use P1 connector for spindle pins - #define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM - #define SPINDLE_LASER_ENA_PIN 18 // Pullup! - #define SPINDLE_DIR_PIN 19 + #ifndef SPINDLE_LASER_PWM_PIN + #define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM + #endif + #ifndef SPINDLE_LASER_ENA_PIN + #define SPINDLE_LASER_ENA_PIN 18 // Pullup! + #endif + #ifndef SPINDLE_DIR_PIN + #define SPINDLE_DIR_PIN 19 + #endif #endif // From d3e1a92b847f89d0730d8202ae1629668cc973ce Mon Sep 17 00:00:00 2001 From: Chris <52449218+shadow578@users.noreply.github.com> Date: Wed, 27 Mar 2024 20:39:54 +0100 Subject: [PATCH 032/111] =?UTF-8?q?=F0=9F=94=A8=20Fix=20HC32=20preflight?= =?UTF-8?q?=20(#26912)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/hc32f4/env_validate.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/hc32f4/env_validate.h b/Marlin/src/pins/hc32f4/env_validate.h index 9bbc999fd6ee..b2db5e8b83e4 100644 --- a/Marlin/src/pins/hc32f4/env_validate.h +++ b/Marlin/src/pins/hc32f4/env_validate.h @@ -22,7 +22,7 @@ #ifndef ENV_VALIDATE_H #define ENV_VALIDATE_H -#ifndef ARDUINO_ARCH_HC32 +#if NOT_TARGET(ARDUINO_ARCH_HC32) #error "Oops! Select an HC32F460 board in 'Tools > Board.'" #endif From 0b9f487ab9ce5a91238d3135f84e0ddbca861c6a Mon Sep 17 00:00:00 2001 From: Jordan Stocker Date: Thu, 28 Mar 2024 06:14:03 +1030 Subject: [PATCH 033/111] =?UTF-8?q?=F0=9F=94=A8=20Fix=20binary=20upload=20?= =?UTF-8?q?firmware=20path=20(#26909)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildroot/share/scripts/upload.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/buildroot/share/scripts/upload.py b/buildroot/share/scripts/upload.py index 9fb927c42685..ae7f7e62617b 100644 --- a/buildroot/share/scripts/upload.py +++ b/buildroot/share/scripts/upload.py @@ -157,14 +157,14 @@ def _RollbackUpload(FirmwareFile): marlin_string_config_h_author = _GetMarlinEnv(MarlinEnv, 'STRING_CONFIG_H_AUTHOR') # Get firmware upload params - upload_firmware_source_name = env['PROGNAME'] + '.bin' if 'PROGNAME' in env else str(source[0]) + upload_firmware_source_path = os.path.join(env["PROJECT_BUILD_DIR"], env["PIOENV"], f"{env['PROGNAME']}.bin") if 'PROGNAME' in env else str(source[0]) # Source firmware filename upload_speed = env['UPLOAD_SPEED'] if 'UPLOAD_SPEED' in env else 115200 # baud rate of serial connection upload_port = _GetUploadPort(env) # Serial port to use # Set local upload params - upload_firmware_target_name = os.path.basename(upload_firmware_source_name) + upload_firmware_target_name = os.path.basename(upload_firmware_source_path) # Target firmware filename upload_timeout = 1000 # Communication timout, lossy/slow connections need higher values upload_blocksize = 512 # Transfer block size. 512 = Autodetect @@ -216,7 +216,7 @@ def _RollbackUpload(FirmwareFile): print(f' LONG_FILENAME_WRITE_SUPPORT : {marlin_longname_write}') print(f' CUSTOM_FIRMWARE_UPLOAD : {marlin_custom_firmware_upload}') print('---- Upload parameters ------------------------') - print(f' Source : {upload_firmware_source_name}') + print(f' Source : {upload_firmware_source_path}') print(f' Target : {upload_firmware_target_name}') print(f' Port : {upload_port} @ {upload_speed} baudrate') print(f' Timeout : {upload_timeout}') @@ -271,14 +271,14 @@ def _RollbackUpload(FirmwareFile): # WARNING! The serial port must be closed here because the serial transfer that follow needs it! # Upload firmware file - debugPrint(f"Copy '{upload_firmware_source_name}' --> '{upload_firmware_target_name}'") + debugPrint(f"Copy '{upload_firmware_source_path}' --> '{upload_firmware_target_name}'") protocol = MarlinBinaryProtocol.Protocol(upload_port, upload_speed, upload_blocksize, float(upload_error_ratio), int(upload_timeout)) #echologger = MarlinBinaryProtocol.EchoProtocol(protocol) protocol.connect() # Mark the rollback (delete broken transfer) from this point on rollback = True filetransfer = MarlinBinaryProtocol.FileTransferProtocol(protocol) - transferOK = filetransfer.copy(upload_firmware_source_name, upload_firmware_target_name, upload_compression, upload_test) + transferOK = filetransfer.copy(upload_firmware_source_path, upload_firmware_target_name, upload_compression, upload_test) protocol.disconnect() # Notify upload completed From 17594298e194b14ee62d32d5574284b6b2c9eb5a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 28 Mar 2024 00:20:53 +0000 Subject: [PATCH 034/111] [cron] Bump distribution date (2024-03-28) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 50b202713d00..339ac44a6701 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 "2024-03-25" +//#define STRING_DISTRIBUTION_DATE "2024-03-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 1ec56af89a33..e87c6f2bd257 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 "2024-03-25" + #define STRING_DISTRIBUTION_DATE "2024-03-28" #endif /** From 466282f322ae4f42a8f3db5e3c9765c38445fdc8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 31 Mar 2024 18:20:37 -0500 Subject: [PATCH 035/111] =?UTF-8?q?=F0=9F=A9=B9=20Misc.=20changes=20from?= =?UTF-8?q?=20ProUI=20/=20ExtUI=20updates=20(#26928)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/feature/leds/printer_event_leds.h | 2 +- Marlin/src/feature/pause.h | 6 +- Marlin/src/gcode/temp/M303.cpp | 2 +- .../lcd/dogm/status_screen_lite_ST7920.cpp | 2 +- Marlin/src/lcd/e3v2/common/dwin_api.h | 6 + Marlin/src/lcd/e3v2/common/dwin_font.h | 2 + Marlin/src/lcd/e3v2/creality/dwin.cpp | 2 - Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 1 + Marlin/src/lcd/e3v2/marlinui/dwin_lcd.h | 4 - Marlin/src/lcd/e3v2/marlinui/marlinui_dwin.h | 6 + Marlin/src/lcd/e3v2/marlinui/ui_common.cpp | 2 +- Marlin/src/lcd/e3v2/proui/dwin.cpp | 5 +- Marlin/src/lcd/e3v2/proui/dwin_defines.h | 14 +- .../extui/anycubic_chiron/chiron_extui.cpp | 12 +- .../extui/anycubic_i3mega/anycubic_extui.cpp | 9 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 8 +- .../lcd/extui/anycubic_vyper/vyper_extui.cpp | 10 +- .../src/lcd/extui/dgus/DGUSScreenHandler.cpp | 4 +- .../lcd/extui/dgus/DGUSScreenHandlerBase.h | 6 +- Marlin/src/lcd/extui/dgus/dgus_extui.cpp | 6 +- .../extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp | 16 +-- .../extui/dgus_reloaded/DGUSScreenHandler.cpp | 1 + .../dgus_reloaded/dgus_reloaded_extui.cpp | 5 +- Marlin/src/lcd/extui/example/example.cpp | 22 +++- .../ftdi_eve_touch_ui/ftdi_eve_extui.cpp | 25 ++-- .../extui/ia_creality/ia_creality_extui.cpp | 115 +++++++++-------- Marlin/src/lcd/extui/malyan/malyan_extui.cpp | 11 +- .../src/lcd/extui/nextion/nextion_extui.cpp | 9 +- Marlin/src/lcd/extui/ui_api.cpp | 12 +- Marlin/src/lcd/extui/ui_api.h | 42 +++++- Marlin/src/lcd/language/language_de.h | 1 - Marlin/src/lcd/language/language_en.h | 7 +- Marlin/src/lcd/language/language_fr.h | 2 + Marlin/src/lcd/language/language_fr_na.h | 2 + Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_ru.h | 2 +- Marlin/src/lcd/language/language_sk.h | 2 +- Marlin/src/lcd/language/language_tr.h | 2 +- Marlin/src/lcd/lcdprint.h | 5 - Marlin/src/lcd/marlinui.cpp | 27 ++-- Marlin/src/lcd/marlinui.h | 14 +- Marlin/src/lcd/menu/menu_advanced.cpp | 8 +- Marlin/src/lcd/menu/menu_main.cpp | 4 +- Marlin/src/module/motion.cpp | 121 +++++++++--------- Marlin/src/module/stepper.cpp | 25 +++- Marlin/src/module/stepper.h | 2 +- Marlin/src/module/temperature.cpp | 12 +- Marlin/src/sd/cardreader.cpp | 2 - 48 files changed, 363 insertions(+), 244 deletions(-) diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h index 3a037eba96e5..856826b969e3 100644 --- a/Marlin/src/feature/leds/printer_event_leds.h +++ b/Marlin/src/feature/leds/printer_event_leds.h @@ -56,7 +56,7 @@ class PrinterEventLEDs { #if HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER static void onHeatingDone() { leds.set_white(); } - static void onPidTuningDone(LEDColor c) { leds.set_color(c); } + static void onPIDTuningDone(LEDColor c) { leds.set_color(c); } #endif #if HAS_MEDIA diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index 304c8a611d13..b86f86b633a9 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -52,10 +52,14 @@ enum PauseMessage : char { PAUSE_MESSAGE_RESUME, PAUSE_MESSAGE_HEAT, PAUSE_MESSAGE_HEATING, - PAUSE_MESSAGE_STATUS + PAUSE_MESSAGE_STATUS, + PAUSE_MESSAGE_COUNT }; #if M600_PURGE_MORE_RESUMABLE + /** + * Input methods can Purge More, Resume, or request input + */ enum PauseMenuResponse : char { PAUSE_RESPONSE_WAIT_FOR, PAUSE_RESPONSE_EXTRUDE_MORE, diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index f9f3abc5bd4e..24702d65f099 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -68,7 +68,7 @@ void GcodeSuite::M303() { default: SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_BAD_HEATER_ID); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_BAD_HEATER_ID)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_BAD_HEATER_ID)); TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_BAD_HEATER_ID)); return; } diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index 4eb031e5385a..a9e8bb564600 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -886,7 +886,7 @@ void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { * If STATUS_EXPIRE_SECONDS is zero, only the status is shown. */ if (forceUpdate || status_changed()) { - TERN_(STATUS_MESSAGE_SCROLLING, ui.status_scroll_offset = 0); + TERN_(STATUS_MESSAGE_SCROLLING, ui.reset_status_scroll()); #if STATUS_EXPIRE_SECONDS countdown = !ui.status_message.empty() ? STATUS_EXPIRE_SECONDS : 0; #endif diff --git a/Marlin/src/lcd/e3v2/common/dwin_api.h b/Marlin/src/lcd/e3v2/common/dwin_api.h index fe2105baea07..dd4fccbcc5ff 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_api.h +++ b/Marlin/src/lcd/e3v2/common/dwin_api.h @@ -23,6 +23,12 @@ #include "../../../inc/MarlinConfig.h" +// +// e3v2/common/dwin_api.h +// +// Included by: e3v2/*/dwin_lcd.h +// + #if ENABLED(DWIN_MARLINUI_LANDSCAPE) #define DWIN_WIDTH 480 #define DWIN_HEIGHT 272 diff --git a/Marlin/src/lcd/e3v2/common/dwin_font.h b/Marlin/src/lcd/e3v2/common/dwin_font.h index b92bfcf99c9f..a0becfc32522 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_font.h +++ b/Marlin/src/lcd/e3v2/common/dwin_font.h @@ -21,6 +21,8 @@ */ #pragma once +#include + typedef uint8_t fontid_t; /** diff --git a/Marlin/src/lcd/e3v2/creality/dwin.cpp b/Marlin/src/lcd/e3v2/creality/dwin.cpp index b2c08861d7d7..08161dffaf9b 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -1822,8 +1822,6 @@ void MarlinUI::update() { dwinHandleScreen(); // Rotary encoder update } -void MarlinUI::refresh() { /* Nothing to see here */ } - #if HAS_LCD_BRIGHTNESS void MarlinUI::_set_brightness() { dwinLCDBrightness(backlight ? brightness : 0); } #endif diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 856229b0d845..a29f5fc42fb5 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -5158,6 +5158,7 @@ void MarlinUI::init_lcd() { #if ENABLED(ADVANCED_PAUSE_FEATURE) void MarlinUI::pause_show_message(const PauseMessage message, const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/) { + if (mode != PAUSE_MODE_SAME) pause_mode = mode; switch (message) { case PAUSE_MESSAGE_INSERT: jyersDWIN.confirmHandler(Popup_FilInsert); break; case PAUSE_MESSAGE_PURGE: diff --git a/Marlin/src/lcd/e3v2/marlinui/dwin_lcd.h b/Marlin/src/lcd/e3v2/marlinui/dwin_lcd.h index dc6c79bd2d0e..ef81a7df77c9 100644 --- a/Marlin/src/lcd/e3v2/marlinui/dwin_lcd.h +++ b/Marlin/src/lcd/e3v2/marlinui/dwin_lcd.h @@ -76,7 +76,3 @@ #include "../common/dwin_color.h" #define Color_Bg_Heading 0x3344 // Static Heading - -// Character matrix width x height -//#define LCD_WIDTH ((DWIN_WIDTH) / 8) -//#define LCD_HEIGHT ((DWIN_HEIGHT) / 12) diff --git a/Marlin/src/lcd/e3v2/marlinui/marlinui_dwin.h b/Marlin/src/lcd/e3v2/marlinui/marlinui_dwin.h index a91cd19f6e8f..b8913914dd74 100644 --- a/Marlin/src/lcd/e3v2/marlinui/marlinui_dwin.h +++ b/Marlin/src/lcd/e3v2/marlinui/marlinui_dwin.h @@ -72,6 +72,12 @@ extern dwin_font_t dwin_font; #define EXTRA_ROW_HEIGHT 8 #define MENU_LINE_HEIGHT (MENU_FONT_HEIGHT + EXTRA_ROW_HEIGHT) +// Character matrix width x height based on menu font +#define LCD_PIXEL_WIDTH DWIN_WIDTH +#define LCD_PIXEL_HEIGHT DWIN_HEIGHT +#define LCD_WIDTH ((LCD_PIXEL_WIDTH) / (MENU_FONT_WIDTH)) +#define LCD_HEIGHT ((LCD_PIXEL_HEIGHT) / (MENU_LINE_HEIGHT)) + #if DWIN_FONT_EDIT == font6x12 #define EDIT_FONT_WIDTH 6 #define EDIT_FONT_ASCENT 10 diff --git a/Marlin/src/lcd/e3v2/marlinui/ui_common.cpp b/Marlin/src/lcd/e3v2/marlinui/ui_common.cpp index 6a4cb6afde5e..4a60f77c9dab 100644 --- a/Marlin/src/lcd/e3v2/marlinui/ui_common.cpp +++ b/Marlin/src/lcd/e3v2/marlinui/ui_common.cpp @@ -219,7 +219,7 @@ void MarlinUI::draw_status_message(const bool blink) { const char *stat = status_and_len(rlen); lcd_put_u8str_max(stat, max_status_chars); - // If the string doesn't completely fill the line... + // If the remaining string doesn't completely fill the line... if (rlen < max_status_chars) { lcd_put_u8str(F(".")); // Always at 1+ spaces left, draw a dot uint8_t chars = max_status_chars - rlen; // Amount of space left in characters diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index 888d1f74928e..b65adbb78043 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -1890,8 +1890,6 @@ void MarlinUI::update() { dwinHandleScreen(); // Rotary encoder update } -void MarlinUI::refresh() { /* Nothing to see here */ } - #if HAS_LCD_BRIGHTNESS void MarlinUI::_set_brightness() { dwinLCDBrightness(backlight ? brightness : 0); } #endif @@ -1928,8 +1926,7 @@ void dwinRedrawScreen() { } void MarlinUI::pause_show_message(const PauseMessage message, const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/) { - //if (mode == PAUSE_MODE_SAME) return; - pause_mode = mode; + if (mode != PAUSE_MODE_SAME) pause_mode = mode; switch (message) { case PAUSE_MESSAGE_PARKING: dwinPopupPause(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; // M125 case PAUSE_MESSAGE_CHANGING: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; // pause_print (M125, M600) diff --git a/Marlin/src/lcd/e3v2/proui/dwin_defines.h b/Marlin/src/lcd/e3v2/proui/dwin_defines.h index 87cb50b8183a..f7026ebc7dda 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_defines.h +++ b/Marlin/src/lcd/e3v2/proui/dwin_defines.h @@ -79,13 +79,23 @@ #if CASELIGHT_USES_BRIGHTNESS #define defCaseLightBrightness 255 #endif + #ifdef Z_AFTER_HOMING #define DEF_Z_AFTER_HOMING Z_AFTER_HOMING #else #define DEF_Z_AFTER_HOMING 0 #endif -#define DEF_HOTENDPIDT TERN(PREHEAT_1_TEMP_BED, PREHEAT_1_TEMP_HOTEND, 195) -#define DEF_BEDPIDT TERN(PREHEAT_1_TEMP_BED, PREHEAT_1_TEMP_HOTEND, 60) + +#ifdef PREHEAT_1_TEMP_HOTEND + #define DEF_HOTENDPIDT PREHEAT_1_TEMP_HOTEND +#else + #define DEF_HOTENDPIDT 195 +#endif +#ifdef PREHEAT_1_TEMP_BED + #define DEF_BEDPIDT PREHEAT_1_TEMP_BED +#else + #define DEF_BEDPIDT 60 +#endif #define DEF_PIDCYCLES 5 /** diff --git a/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp b/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp index c29f165d2423..268111b6cb05 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp @@ -58,12 +58,14 @@ namespace ExtUI { void onPrintTimerStarted() { chiron.timerEvent(AC_timer_started); } void onPrintTimerPaused() { chiron.timerEvent(AC_timer_paused); } void onPrintTimerStopped() { chiron.timerEvent(AC_timer_stopped); } + void onPrintDone() {} - void onFilamentRunout(const extruder_t) { chiron.filamentRunout(); } + void onFilamentRunout(const extruder_t) { chiron.filamentRunout(); } + + void onUserConfirmRequired(const char * const msg) { chiron.confirmationRequest(msg); } - void onUserConfirmRequired(const char * const msg) { chiron.confirmationRequest(msg); } - void onStatusChanged(const char * const msg) { chiron.statusChange(msg); } + void onStatusChanged(const char * const msg) { chiron.statusChange(msg); } void onHomingStart() {} void onHomingDone() {} @@ -133,13 +135,13 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { + void onPIDTuning(const result_t rst) { // Called for temperature PID tuning result } #endif void onSteppersDisabled() {} - void onSteppersEnabled() {} + void onSteppersEnabled() {} } #endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp index 0006091cda2b..ef02664dacf1 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp @@ -38,21 +38,26 @@ namespace ExtUI { void onStartup() { anycubicTFT.onSetup(); } void onIdle() { anycubicTFT.onCommandScan(); } void onPrinterKilled(FSTR_P const error, FSTR_P const component) { anycubicTFT.onKillTFT(); } + void onMediaInserted() { anycubicTFT.onSDCardStateChange(true); } void onMediaError() { anycubicTFT.onSDCardError(); } void onMediaRemoved() { anycubicTFT.onSDCardStateChange(false); } + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) { TERN_(SPEAKER, ::tone(BEEPER_PIN, frequency, duration)); } void onPrintTimerStarted() { anycubicTFT.onPrintTimerStarted(); } void onPrintTimerPaused() { anycubicTFT.onPrintTimerPaused(); } void onPrintTimerStopped() { anycubicTFT.onPrintTimerStopped(); } + void onFilamentRunout(const extruder_t extruder) { anycubicTFT.onFilamentRunout(); } void onUserConfirmRequired(const char * const msg) { anycubicTFT.onUserConfirmRequired(msg); } + void onStatusChanged(const char * const msg) {} void onHomingStart() {} void onHomingDone() {} + void onPrintDone() {} void onFactoryReset() {} @@ -119,13 +124,13 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { + void onPIDTuning(const result_t rst) { // Called for temperature PID tuning result } #endif void onSteppersDisabled() {} - void onSteppersEnabled() {} + void onSteppersEnabled() {} } #endif // ANYCUBIC_LCD_I3MEGA diff --git a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 709b54a6d76a..abd32aa88c8a 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -283,7 +283,7 @@ void AnycubicTFT::handleSpecialMenu() { break; case '9': // "<09HtBedPID>" - SERIAL_ECHOLNPGM("Special Menu: ", F("Auto Tune Hotbed Pid")); + SERIAL_ECHOLNPGM("Special Menu: ", F("Auto Tune Hotbed PID")); injectCommands(F("M303 E-1 S65 C6 U1")); break; } @@ -328,7 +328,7 @@ void AnycubicTFT::handleSpecialMenu() { break; case '4': // "<04HtbedPID>" - SERIAL_ECHOLNPGM("Special Menu: ", F("Auto Tune Hotbed Pid")); + SERIAL_ECHOLNPGM("Special Menu: ", F("Auto Tune Hotbed PID")); injectCommands(F("M303 E-1 S65 C6 U1")); break; @@ -822,8 +822,8 @@ void AnycubicTFT::getCommandFromTFT() { case 25: // A25 cool down if (!isPrinting()) { - setTargetTemp_celsius(0, (heater_t) BED); - setTargetTemp_celsius(0, (extruder_t) E0); + setTargetTemp_celsius(0, (heater_t)BED); + setTargetTemp_celsius(0, (extruder_t)E0); SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Cooling down... J12"); // J12 cool down } diff --git a/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp b/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp index d4351a4dab6f..85e7b280790d 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp @@ -58,12 +58,14 @@ namespace ExtUI { void onPrintTimerStarted() { dgus.timerEvent(AC_timer_started); } void onPrintTimerPaused() { dgus.timerEvent(AC_timer_paused); } void onPrintTimerStopped() { dgus.timerEvent(AC_timer_stopped); } + void onPrintDone() {} - void onFilamentRunout(const extruder_t) { dgus.filamentRunout(); } + void onFilamentRunout(const extruder_t) { dgus.filamentRunout(); } void onUserConfirmRequired(const char * const msg) { dgus.confirmationRequest(msg); } - void onStatusChanged(const char * const msg) { dgus.statusChange(msg); } + + void onStatusChanged(const char * const msg) { dgus.statusChange(msg); } void onHomingStart() { dgus.homingStart(); } void onHomingDone() { dgus.homingComplete(); } @@ -135,7 +137,7 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { + void onPIDTuning(const result_t rst) { // Called for temperature PID tuning result switch (rst) { case PID_STARTED: break; @@ -148,7 +150,7 @@ namespace ExtUI { #endif void onSteppersDisabled() {} - void onSteppersEnabled() {} + void onSteppersEnabled() {} } #endif // ANYCUBIC_LCD_VYPER diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp index 4403716fff65..6b1632bfec9f 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp @@ -62,7 +62,7 @@ void (*DGUSScreenHandler::confirm_action_cb)() = nullptr; filament_data_t filament_data; #endif -void DGUSScreenHandler::sendInfoScreen(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { +void DGUSScreenHandler::sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { DGUS_VP_Variable ramcopy; if (populate_VPVar(VP_MSGSTR1, &ramcopy)) { ramcopy.memadr = (void*) line1; @@ -89,7 +89,7 @@ void DGUSScreenHandler::handleUserConfirmationPopUp(uint16_t VP, PGM_P const lin popToOldScreen(); confirmVP = VP; - sendInfoScreen(line1, line2, line3, line4, l1, l2, l3, l4); + sendInfoScreen_P(line1, line2, line3, line4, l1, l2, l3, l4); gotoScreen(DGUS_SCREEN_CONFIRM); } diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h b/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h index 3764920be1d0..8ee0fa68c8d5 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h @@ -37,12 +37,12 @@ class DGUSScreenHandler { // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifying whether the strings are in RAM or FLASH. - static void sendInfoScreen(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash) { - sendInfoScreen(FTOP(line1), FTOP(line2), line3, line4, l1inflash, l2inflash, l3inflash, liinflash); + sendInfoScreen_P(FTOP(line1), FTOP(line2), line3, line4, l1inflash, l2inflash, l3inflash, liinflash); } static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, FSTR_P const line3, FSTR_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash) { - sendInfoScreen(FTOP(line1), FTOP(line2), FTOP(line3), FTOP(line4), l1inflash, l2inflash, l3inflash, liinflash); + sendInfoScreen_P(FTOP(line1), FTOP(line2), FTOP(line3), FTOP(line4), l1inflash, l2inflash, l3inflash, liinflash); } static void handleUserConfirmationPopUp(uint16_t confirmVP, PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); diff --git a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp index b956d62b36fb..58aead69845d 100644 --- a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp +++ b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp @@ -74,6 +74,7 @@ namespace ExtUI { void onHomingStart() {} void onHomingDone() {} + void onPrintDone() {} void onFactoryReset() {} @@ -141,10 +142,11 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { + void onPIDTuning(const result_t rst) { // Called for temperature PID tuning result switch (rst) { case PID_STARTED: + case PID_BED_STARTED: screen.setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case PID_BAD_HEATER_ID: @@ -165,7 +167,7 @@ namespace ExtUI { #endif void onSteppersDisabled() {} - void onSteppersEnabled() {} + void onSteppersEnabled() {} } #endif // HAS_DGUS_LCD_CLASSIC diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp b/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp index fbd8c994c7f8..41f5b41d4982 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp @@ -117,19 +117,15 @@ namespace ExtUI { screen.configurationStoreRead(success); } - #if HAS_MESH - void onLevelingStart() { - screen.levelingStart(); - } - - void onLevelingDone() { - screen.levelingEnd(); - } + #if HAS_LEVELING + void onLevelingStart() { screen.levelingStart(); } + void onLevelingDone() { screen.levelingEnd(); } + #endif + #if HAS_MESH void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { screen.meshUpdate(xpos, ypos); } - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { } #endif @@ -147,7 +143,7 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { + void onPIDTuning(const result_t rst) { // Called for temperature PID tuning result screen.pidTuning(rst); } diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp index 87a0f6ce1228..aaef68632ac0 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp @@ -308,6 +308,7 @@ void DGUSScreenHandler::filamentRunout(const ExtUI::extruder_t extruder) { void DGUSScreenHandler::pidTuning(const ExtUI::result_t rst) { switch (rst) { case ExtUI::PID_STARTED: + case ExtUI::PID_BED_STARTED: setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case ExtUI::PID_BAD_HEATER_ID: diff --git a/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp b/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp index 3e4911f765ca..1c62bee9d5af 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp @@ -84,6 +84,7 @@ namespace ExtUI { void onHomingStart() {} void onHomingDone() {} + void onPrintDone() {} void onFactoryReset() { @@ -138,14 +139,14 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { + void onPIDTuning(const result_t rst) { // Called for temperature PID tuning result screen.pidTuning(rst); } #endif void onSteppersDisabled() {} - void onSteppersEnabled() {} + void onSteppersEnabled() {} } #endif // DGUS_LCD_UI_RELOADED diff --git a/Marlin/src/lcd/extui/example/example.cpp b/Marlin/src/lcd/extui/example/example.cpp index 46faa49868f5..7f9ff62de43d 100644 --- a/Marlin/src/lcd/extui/example/example.cpp +++ b/Marlin/src/lcd/extui/example/example.cpp @@ -47,19 +47,26 @@ namespace ExtUI { } void onIdle() {} void onPrinterKilled(FSTR_P const error, FSTR_P const component) {} + void onMediaInserted() {} void onMediaError() {} void onMediaRemoved() {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) {} + void onPrintTimerStarted() {} void onPrintTimerPaused() {} void onPrintTimerStopped() {} + void onFilamentRunout(const extruder_t extruder) {} + void onUserConfirmRequired(const char * const msg) {} + void onStatusChanged(const char * const msg) {} void onHomingStart() {} void onHomingDone() {} + void onPrintDone() {} void onFactoryReset() {} @@ -126,20 +133,21 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { + void onPIDTuning(const result_t rst) { // Called for temperature PID tuning result switch (rst) { - case PID_STARTED: break; - case PID_BAD_HEATER_ID: break; - case PID_TEMP_TOO_HIGH: break; - case PID_TUNING_TIMEOUT: break; - case PID_DONE: break; + case PID_STARTED: + case PID_BED_STARTED: + case PID_BAD_HEATER_ID: break; + case PID_TEMP_TOO_HIGH: break; + case PID_TUNING_TIMEOUT: break; + case PID_DONE: break; } } #endif void onSteppersDisabled() {} - void onSteppersEnabled() {} + void onSteppersEnabled() {} } #endif // EXTUI_EXAMPLE && EXTENSIBLE_UI diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp index d89e90ece1ea..0dda4a977d1e 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp @@ -51,6 +51,11 @@ namespace ExtUI { #endif } + void onMediaError() { + sound.play(sad_trombone, PLAY_ASYNCHRONOUS); + AlertDialogBox::showError(F("Unable to read media.")); + } + void onMediaRemoved() { #if HAS_MEDIA if (isPrintingFromMedia()) { @@ -65,11 +70,6 @@ namespace ExtUI { #endif } - void onMediaError() { - sound.play(sad_trombone, PLAY_ASYNCHRONOUS); - AlertDialogBox::showError(F("Unable to read media.")); - } - void onStatusChanged(const char *lcd_msg) { StatusScreen::setStatusMessage(lcd_msg); } void onPrintTimerStarted() { @@ -78,8 +78,8 @@ namespace ExtUI { void onPrintTimerStopped() { InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FINISHED); } - void onPrintTimerPaused() {} + void onPrintDone() {} void onFilamentRunout(const extruder_t extruder) { @@ -123,8 +123,12 @@ namespace ExtUI { #endif #if HAS_MESH - void onMeshUpdate(const int8_t x, const int8_t y, const_float_t val) { BedMeshViewScreen::onMeshUpdate(x, y, val); } - void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { BedMeshViewScreen::onMeshUpdate(x, y, state); } + void onMeshUpdate(const int8_t x, const int8_t y, const_float_t val) { + BedMeshViewScreen::onMeshUpdate(x, y, val); + } + void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { + BedMeshViewScreen::onMeshUpdate(x, y, state); + } #endif #if ENABLED(POWER_LOSS_RECOVERY) @@ -140,11 +144,12 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { + void onPIDTuning(const result_t rst) { // Called for temperature PID tuning result //SERIAL_ECHOLNPGM("OnPidTuning:", rst); switch (rst) { case PID_STARTED: + case PID_BED_STARTED: StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case PID_BAD_HEATER_ID: @@ -165,7 +170,7 @@ namespace ExtUI { #endif // HAS_PID_HEATING void onSteppersDisabled() {} - void onSteppersEnabled() {} + void onSteppersEnabled() {} } #endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp index 1c64df500f58..af5d1c7ace7c 100644 --- a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp @@ -249,41 +249,14 @@ void onFactoryReset() { show_status = true; } -void onMeshUpdate(const int8_t xpos, const int8_t ypos, probe_state_t state) {} - -void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { - if (waitway == 3) - if (isPositionKnown() && (getActualTemp_celsius(BED) >= (getTargetTemp_celsius(BED) - 1))) - rts.sendData(ExchangePageBase + 64, ExchangepageAddr); - #if HAS_MESH - uint8_t abl_probe_index = 0; - for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) - for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { - const bool zig = outer & 1; // != ((PR_OUTER_END) & 1); - const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; - if (point.x == xpos && outer == ypos) - rts.sendData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + (abl_probe_index * 2)); - ++abl_probe_index; - } - #endif -} +static_assert(eeprom_data_size >= sizeof(creality_dwin_settings_t), "Insufficient space in EEPROM for UI parameters"); void onStoreSettings(char *buff) { - static_assert( - ExtUI::eeprom_data_size >= sizeof(creality_dwin_settings_t), - "Insufficient space in EEPROM for UI parameters" - ); - // Write to buffer memcpy(buff, &dwin_settings, sizeof(creality_dwin_settings_t)); } void onLoadSettings(const char *buff) { - static_assert( - ExtUI::eeprom_data_size >= sizeof(creality_dwin_settings_t), - "Insufficient space in EEPROM for UI parameters" - ); - creality_dwin_settings_t eepromSettings; memcpy(&eepromSettings, buff, sizeof(creality_dwin_settings_t)); @@ -305,7 +278,7 @@ void onLoadSettings(const char *buff) { } void onSettingsStored(const bool success) { - // This is called after the entire EEPROM has been written, + // Called after the entire EEPROM has been written, // whether successful or not. } @@ -334,6 +307,55 @@ void onSettingsLoaded(const bool success) { rts.setTouchScreenConfiguration(); } +void onPostprocessSettings() {} + +#if HAS_LEVELING + void onLevelingStart() {} + + void onLevelingDone() { + #if HAS_MESH + if (ExtUI::getLevelingIsValid()) { + uint8_t abl_probe_index = 0; + for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) + for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { + const bool zig = outer & 1; + const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; + rts.sendData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + abl_probe_index * 2); + ++abl_probe_index; + } + + rts.sendData(3, AutoLevelIcon); // 2=On, 3=Off + setLevelingActive(true); + } + else { + rts.sendData(2, AutoLevelIcon); /*Off*/ + setLevelingActive(false); + } + #endif + } +#endif + +#if HAS_MESH + void onMeshUpdate(const int8_t xpos, const int8_t ypos, probe_state_t state) {} + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { + if (waitway == 3) + if (isPositionKnown() && (getActualTemp_celsius(BED) >= (getTargetTemp_celsius(BED) - 1))) + rts.sendData(ExchangePageBase + 64, ExchangepageAddr); + #if HAS_MESH + uint8_t abl_probe_index = 0; + for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) + for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { + const bool zig = outer & 1; // != ((PR_OUTER_END) & 1); + const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; + if (point.x == xpos && outer == ypos) + rts.sendData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + (abl_probe_index * 2)); + ++abl_probe_index; + } + #endif + } +#endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -351,7 +373,7 @@ void onSettingsLoaded(const bool success) { #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { + void onPIDTuning(const result_t rst) { // Called for temperature PID tuning result rts.sendData(pid_hotendAutoTemp, HotendPID_AutoTmp); rts.sendData(pid_bedAutoTemp, BedPID_AutoTmp); @@ -367,37 +389,14 @@ void onSettingsLoaded(const bool success) { } #endif -void onLevelingStart() {} - -void onLevelingDone() { - #if HAS_MESH - if (ExtUI::getLevelingIsValid()) { - uint8_t abl_probe_index = 0; - for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) - for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { - const bool zig = outer & 1; - const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; - rts.sendData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + abl_probe_index * 2); - ++abl_probe_index; - } - - rts.sendData(3, AutoLevelIcon); // 2=On, 3=Off - setLevelingActive(true); - } - else { - rts.sendData(2, AutoLevelIcon); /*Off*/ - setLevelingActive(false); - } - #endif -} - -void onSteppersEnabled() {} -void onPrintDone() {} void onHomingStart() {} void onHomingDone() {} + +void onPrintDone() {} + void onSteppersDisabled() {} -void onPostprocessSettings() {} +void onSteppersEnabled() {} -} // namespace ExtUI +} // ExtUI #endif // DGUS_LCD_UI_IA_CREALITY diff --git a/Marlin/src/lcd/extui/malyan/malyan_extui.cpp b/Marlin/src/lcd/extui/malyan/malyan_extui.cpp index 4865f42354e0..00bc173fb3f2 100644 --- a/Marlin/src/lcd/extui/malyan/malyan_extui.cpp +++ b/Marlin/src/lcd/extui/malyan/malyan_extui.cpp @@ -104,11 +104,12 @@ namespace ExtUI { #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { + void onPIDTuning(const result_t rst) { // Called for temperature PID tuning result //SERIAL_ECHOLNPGM("OnPidTuning:", rst); switch (rst) { case PID_STARTED: + case PID_BED_STARTED: set_lcd_error(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case PID_BAD_HEATER_ID: @@ -134,16 +135,22 @@ namespace ExtUI { // Not needed for Malyan LCD void onStatusChanged(const char * const) {} + void onMediaInserted() {} void onMediaError() {} void onMediaRemoved() {} + void onPlayTone(const uint16_t, const uint16_t/*=0*/) {} + void onFilamentRunout(const extruder_t extruder) {} void onUserConfirmRequired(const char * const) {} + void onHomingStart() {} void onHomingDone() {} + void onPrintDone() {} void onFactoryReset() {} + void onStoreSettings(char*) {} void onLoadSettings(const char*) {} void onPostprocessSettings() {} @@ -173,7 +180,7 @@ namespace ExtUI { #endif void onSteppersDisabled() {} - void onSteppersEnabled() {} + void onSteppersEnabled() {} } #endif // MALYAN_LCD diff --git a/Marlin/src/lcd/extui/nextion/nextion_extui.cpp b/Marlin/src/lcd/extui/nextion/nextion_extui.cpp index e33268f3a375..fc864320971c 100644 --- a/Marlin/src/lcd/extui/nextion/nextion_extui.cpp +++ b/Marlin/src/lcd/extui/nextion/nextion_extui.cpp @@ -38,19 +38,24 @@ namespace ExtUI { void onStartup() { nextion.startup(); } void onIdle() { nextion.idleLoop(); } void onPrinterKilled(FSTR_P const error, FSTR_P const component) { nextion.printerKilled(error, component); } + void onMediaInserted() {} void onMediaError() {} void onMediaRemoved() {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) {} void onPrintTimerStarted() {} void onPrintTimerPaused() {} void onPrintTimerStopped() {} void onFilamentRunout(const extruder_t) {} + void onUserConfirmRequired(const char * const msg) { nextion.confirmationRequest(msg); } + void onStatusChanged(const char * const msg) { nextion.statusChange(msg); } void onHomingStart() {} void onHomingDone() {} + void onPrintDone() { nextion.PrintFinished(); } void onFactoryReset() {} @@ -117,14 +122,14 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { + void onPIDTuning(const result_t rst) { // Called for temperature PID tuning result nextion.panelInfo(37); } #endif void onSteppersDisabled() {} - void onSteppersEnabled() {} + void onSteppersEnabled() {} } diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 2ba01a694d0e..9d0b7e2723de 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -20,9 +20,9 @@ * */ -/************** - * ui_api.cpp * - **************/ +/************************************* + * ui_api.cpp - Shared ExtUI methods * + *************************************/ /**************************************************************************** * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * @@ -1119,7 +1119,7 @@ namespace ExtUI { #if M600_PURGE_MORE_RESUMABLE void setPauseMenuResponse(PauseMenuResponse response) { pause_menu_response = response; } PauseMessage pauseModeStatus = PAUSE_MESSAGE_STATUS; - PauseMode getPauseMode() { return pause_mode;} + PauseMode getPauseMode() { return pause_mode; } #endif void printFile(const char *filename) { @@ -1225,7 +1225,9 @@ namespace ExtUI { } // namespace ExtUI -// At the moment we hook into MarlinUI methods, but this could be cleaned up in the future +// +// MarlinUI passthroughs to ExtUI +// void MarlinUI::init_lcd() { ExtUI::onStartup(); } diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 50ecd13d7553..b7d670de13d6 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -57,18 +57,43 @@ namespace ExtUI { // in the EEPROM when the methods onStoreSettings and // onLoadSettings are called. - static constexpr size_t eeprom_data_size = 48; + #ifndef EXTUI_EEPROM_DATA_SIZE + #define EXTUI_EEPROM_DATA_SIZE 48 + #endif + static constexpr size_t eeprom_data_size = EXTUI_EEPROM_DATA_SIZE; enum axis_t : uint8_t { X, Y, Z, I, J, K, U, V, W, X2, Y2, Z2, Z3, Z4 }; enum extruder_t : uint8_t { E0, E1, E2, E3, E4, E5, E6, E7 }; enum heater_t : uint8_t { H0, H1, H2, H3, H4, H5, BED, CHAMBER, COOLER }; enum fan_t : uint8_t { FAN0, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7 }; - enum result_t : uint8_t { PID_STARTED, PID_BAD_HEATER_ID, PID_TEMP_TOO_HIGH, PID_TUNING_TIMEOUT, PID_DONE }; + enum result_t : uint8_t { + OPTITEM(HAS_PID_HEATING, PID_STARTED) + OPTITEM(HAS_PID_HEATING, PID_BED_STARTED) + OPTITEM(HAS_PID_HEATING, PID_BAD_HEATER_ID) + OPTITEM(HAS_PID_HEATING, PID_TEMP_TOO_HIGH) + OPTITEM(HAS_PID_HEATING, PID_TUNING_TIMEOUT) + OPTITEM(HAS_PID_HEATING, PID_DONE) + }; constexpr uint8_t extruderCount = EXTRUDERS; constexpr uint8_t hotendCount = HOTENDS; constexpr uint8_t fanCount = FAN_COUNT; + inline const axis_t axis_to_axis_t(const AxisEnum a) { + switch (a) { + TERN_(HAS_X_AXIS, case X_AXIS:) + default: return X; + OPTCODE(HAS_Y_AXIS, case Y_AXIS: return Y) + OPTCODE(HAS_Z_AXIS, case Z_AXIS: return Z) + OPTCODE(HAS_I_AXIS, case I_AXIS: return I) + OPTCODE(HAS_J_AXIS, case J_AXIS: return J) + OPTCODE(HAS_K_AXIS, case K_AXIS: return K) + OPTCODE(HAS_U_AXIS, case U_AXIS: return U) + OPTCODE(HAS_V_AXIS, case V_AXIS: return V) + OPTCODE(HAS_W_AXIS, case W_AXIS: return W) + } + } + #if HAS_MESH typedef float bed_mesh_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; #endif @@ -458,38 +483,49 @@ namespace ExtUI { */ void onStartup(); void onIdle(); + void onMediaInserted(); void onMediaError(); void onMediaRemoved(); + void onPlayTone(const uint16_t frequency, const uint16_t duration=0); + void onPrinterKilled(FSTR_P const error, FSTR_P const component); void onSurviveInKilled(); + void onPrintTimerStarted(); void onPrintTimerPaused(); void onPrintTimerStopped(); void onPrintDone(); + void onFilamentRunout(const extruder_t extruder); + void onUserConfirmRequired(const char * const msg); void onUserConfirmRequired(FSTR_P const fstr); + void onStatusChanged(const char * const msg); void onStatusChanged(FSTR_P const fstr); + void onHomingStart(); void onHomingDone(); + void onSteppersDisabled(); void onSteppersEnabled(); + void onFactoryReset(); void onStoreSettings(char *); void onLoadSettings(const char *); void onPostprocessSettings(); void onSettingsStored(const bool success); void onSettingsLoaded(const bool success); + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff); void onPowerLoss(); void onPowerLossResume(); #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst); + void onPIDTuning(const result_t rst); #endif }; diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 037beb2b3caa..6885da5ca6b3 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -328,7 +328,6 @@ namespace LanguageNarrow_de { LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("PID Autotune fehlge.!"); LSTR MSG_BAD_HEATER_ID = _UxGT("ungültiger Extruder."); LSTR MSG_TEMP_TOO_HIGH = _UxGT("Temperatur zu hoch."); - LSTR MSG_TIMEOUT = _UxGT("Timeout"); LSTR MSG_PID_BAD_HEATER_ID = _UxGT("Autotune fehlge.! Ungültiger Extruder"); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune fehlge.! Temperatur zu hoch."); LSTR MSG_PID_TIMEOUT = _UxGT("Autotune fehlge.! Timeout."); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 82fd637aa124..2ea52c2ccf5d 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -350,19 +350,23 @@ namespace LanguageNarrow_en { LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); LSTR MSG_AUTOTEMP = _UxGT("Autotemp"); + LSTR MSG_TIMEOUT = _UxGT("Timeout"); LSTR MSG_LCD_ON = _UxGT("On"); LSTR MSG_LCD_OFF = _UxGT("Off"); + LSTR MSG_PID_AUTOTUNE = _UxGT("PID Autotune"); LSTR MSG_PID_AUTOTUNE_E = _UxGT("Autotune * PID"); LSTR MSG_PID_CYCLE = _UxGT("PID Cycles"); LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("PID tuning done"); LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Autotune failed!"); + LSTR MSG_BAD_HEATER_ID = _UxGT("Bad extruder."); LSTR MSG_TEMP_TOO_HIGH = _UxGT("Temperature too high."); - LSTR MSG_TIMEOUT = _UxGT("Timeout"); + LSTR MSG_PID_BAD_HEATER_ID = _UxGT("Autotune failed! Bad extruder."); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed! Temperature too high."); LSTR MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout."); + LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Testing heat loss"); LSTR MSG_MPC_HEATING_PAST_200 = _UxGT("Heating to >200C"); LSTR MSG_MPC_COOLING_TO_AMBIENT = _UxGT("Cooling to ambient"); @@ -378,6 +382,7 @@ namespace LanguageNarrow_en { LSTR MSG_MPC_AMBIENT_XFER_COEFF_E = _UxGT("Ambient Co. *"); LSTR MSG_MPC_AMBIENT_XFER_COEFF_FAN = _UxGT("Fan coeff."); LSTR MSG_MPC_AMBIENT_XFER_COEFF_FAN_E = _UxGT("Fan coeff. *"); + LSTR MSG_SELECT_E = _UxGT("Select *"); LSTR MSG_ACC = _UxGT("Accel"); LSTR MSG_JERK = _UxGT("Jerk"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 0ac8f71d5874..52bbd7fac3c6 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -255,12 +255,14 @@ namespace LanguageNarrow_fr { LSTR MSG_AUTOTEMP = _UxGT("Temp. Auto."); LSTR MSG_LCD_ON = _UxGT("Marche"); LSTR MSG_LCD_OFF = _UxGT("Arrêt"); + LSTR MSG_PID_AUTOTUNE = _UxGT("PID Autotune"); LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *"); LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("Tuning PID terminé"); LSTR MSG_PID_BAD_HEATER_ID = _UxGT("Echec Autotune! E incorrect"); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Echec Autotune! Temp. trop haute"); LSTR MSG_PID_TIMEOUT = _UxGT("Echec Autotune! Opér. expirée"); + LSTR MSG_SELECT_E = _UxGT("Sélectionner *"); LSTR MSG_ACC = _UxGT("Accélération"); LSTR MSG_JERK = _UxGT("Jerk"); diff --git a/Marlin/src/lcd/language/language_fr_na.h b/Marlin/src/lcd/language/language_fr_na.h index 55737555030a..98302af61c70 100644 --- a/Marlin/src/lcd/language/language_fr_na.h +++ b/Marlin/src/lcd/language/language_fr_na.h @@ -255,12 +255,14 @@ namespace LanguageNarrow_fr_na { LSTR MSG_AUTOTEMP = _UxGT("Temp. Auto."); LSTR MSG_LCD_ON = _UxGT("Marche"); LSTR MSG_LCD_OFF = _UxGT("Arret"); + LSTR MSG_PID_AUTOTUNE = _UxGT("PID Autotune"); LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *"); LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("Tuning PID termine"); LSTR MSG_PID_BAD_HEATER_ID = _UxGT("Echec Autotune! E incorrect"); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Echec Autotune! Temp. trop haute"); LSTR MSG_PID_TIMEOUT = _UxGT("Echec Autotune! Oper. expiree"); + LSTR MSG_SELECT_E = _UxGT("Selectionner *"); LSTR MSG_ACC = _UxGT("Acceleration"); LSTR MSG_JERK = _UxGT("Jerk"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index b7dc9d5678bf..08b048eadd4e 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -342,6 +342,7 @@ namespace LanguageNarrow_it { LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); LSTR MSG_AUTOTEMP = _UxGT("Autotemp"); + LSTR MSG_TIMEOUT = _UxGT("Tempo scaduto"); LSTR MSG_LCD_ON = _UxGT("On"); LSTR MSG_LCD_OFF = _UxGT("Off"); LSTR MSG_PID_AUTOTUNE = _UxGT("Calibrazione PID"); @@ -351,7 +352,6 @@ namespace LanguageNarrow_it { LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Calibr.PID fallito!"); LSTR MSG_BAD_HEATER_ID = _UxGT("Estrusore invalido."); LSTR MSG_TEMP_TOO_HIGH = _UxGT("Temp.troppo alta."); - LSTR MSG_TIMEOUT = _UxGT("Tempo scaduto"); LSTR MSG_PID_BAD_HEATER_ID = _UxGT("Calibrazione fallita! Estrusore errato."); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Calibrazione fallita! Temperatura troppo alta."); LSTR MSG_PID_TIMEOUT = _UxGT("Calibrazione fallita! Tempo scaduto."); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index ffe2fb1ae5c7..851b4ffd0d9a 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -294,6 +294,7 @@ namespace LanguageNarrow_ru { LSTR MSG_MAX = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С макс"); LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Фактор"); LSTR MSG_AUTOTEMP = _UxGT("Автотемпература"); + LSTR MSG_TIMEOUT = _UxGT("Таймаут."); LSTR MSG_LCD_ON = _UxGT("Вкл"); LSTR MSG_LCD_OFF = _UxGT("Выкл"); @@ -707,7 +708,6 @@ namespace LanguageNarrow_ru { LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Автонастройка PID не удалась!"); LSTR MSG_BAD_HEATER_ID = _UxGT("Неверный экструдер."); LSTR MSG_TEMP_TOO_HIGH = _UxGT("Слишком высокая температура."); - LSTR MSG_TIMEOUT = _UxGT("Таймаут."); LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Тест потери тепла"); LSTR MSG_MPC_HEATING_PAST_200 = _UxGT("Нагрев выше >200C"); LSTR MSG_MPC_COOLING_TO_AMBIENT = _UxGT("Охлаждение до окружающей"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 73bf58d99110..dd64c29f2529 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -338,6 +338,7 @@ namespace LanguageNarrow_sk { LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fakt"); LSTR MSG_AUTOTEMP = _UxGT("Auto-teplota"); + LSTR MSG_TIMEOUT = _UxGT("Čas vypršal"); LSTR MSG_LCD_ON = _UxGT("Zap"); LSTR MSG_LCD_OFF = _UxGT("Vyp"); LSTR MSG_PID_AUTOTUNE = _UxGT("Kalibrácia PID"); @@ -347,7 +348,6 @@ namespace LanguageNarrow_sk { LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Kal. PID zlyhala!"); LSTR MSG_BAD_HEATER_ID = _UxGT("Zlý extrudér"); LSTR MSG_TEMP_TOO_HIGH = _UxGT("Príliš vysoká tepl."); - LSTR MSG_TIMEOUT = _UxGT("Čas vypršal"); LSTR MSG_PID_BAD_HEATER_ID = _UxGT("Auto-kal. zlyhala! Zlý extrúder."); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Auto-kal. zlyhala! Príliš vysoká tepl."); LSTR MSG_PID_TIMEOUT = _UxGT("Auto-kal. zlyhala! Čas vypršal."); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 86c39b344eb7..23aefff2f7de 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -341,6 +341,7 @@ namespace LanguageNarrow_tr { LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Çarpan"); LSTR MSG_AUTOTEMP = _UxGT("Oto. Sıcaklık"); + LSTR MSG_TIMEOUT = _UxGT("Zaman aşımı"); LSTR MSG_LCD_ON = _UxGT("Açık"); LSTR MSG_LCD_OFF = _UxGT("Kapalı"); LSTR MSG_PID_AUTOTUNE = _UxGT("PID Kalibrasyonu"); @@ -350,7 +351,6 @@ namespace LanguageNarrow_tr { LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Kalibrasyon başarısız!"); LSTR MSG_BAD_HEATER_ID = _UxGT("Kötü ekstruder."); LSTR MSG_TEMP_TOO_HIGH = _UxGT("Sıcaklık çok yüksek."); - LSTR MSG_TIMEOUT = _UxGT("Zaman aşımı"); LSTR MSG_PID_BAD_HEATER_ID = _UxGT("Kalibrasyon başarısız! Kötü ekstruder."); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Kalibrasyon başarısız! Sıcaklık çok yüksek."); LSTR MSG_PID_TIMEOUT = _UxGT("Kalibrasyon başarısız! Zaman aşımı."); diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 87032201fb0c..a93e3adc6b14 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -38,11 +38,6 @@ #include "e3v2/marlinui/marlinui_dwin.h" - #define LCD_PIXEL_WIDTH DWIN_WIDTH - #define LCD_PIXEL_HEIGHT DWIN_HEIGHT - #define LCD_WIDTH ((LCD_PIXEL_WIDTH) / (MENU_FONT_WIDTH)) - #define LCD_HEIGHT ((LCD_PIXEL_HEIGHT) / (MENU_LINE_HEIGHT)) - // The DWIN lcd_moveto function uses row / column, not pixels #define LCD_COL_X(col) (col) #define LCD_ROW_Y(row) (row) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 99a5996a2dfe..4eed5f3c6595 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1491,7 +1491,7 @@ void MarlinUI::host_notify(const char * const cstr) { else if (!no_welcome) msg = GET_TEXT_F(WELCOME_MSG); else if (ENABLED(DWIN_LCD_PROUI)) - msg = F(""); + msg = F(""); else return; @@ -1605,9 +1605,7 @@ void MarlinUI::host_notify(const char * const cstr) { #endif - #if ENABLED(STATUS_MESSAGE_SCROLLING) && ANY(HAS_WIRED_LCD, DWIN_LCD_PROUI) - status_scroll_offset = 0; - #endif + TERN_(STATUS_MESSAGE_SCROLLING, reset_status_scroll()); TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); TERN_(DWIN_CREALITY_LCD, dwinStatusChanged(status_message)); @@ -1622,7 +1620,7 @@ void MarlinUI::host_notify(const char * const cstr) { if (status_scroll_offset < status_message.glyphs()) while (!START_OF_UTF8_CHAR(status_message[++status_scroll_offset])); else - status_scroll_offset = 0; + reset_status_scroll(); } char* MarlinUI::status_and_len(uint8_t &len) { @@ -1669,8 +1667,11 @@ void MarlinUI::host_notify(const char * const cstr) { void MarlinUI::abort_print() { #if HAS_MEDIA wait_for_heatup = wait_for_user = false; - card.abortFilePrintSoon(); - #endif + if (IS_SD_PRINTING()) + card.abortFilePrintSoon(); + else if (card.isMounted()) + card.closefile(); + #endif #ifdef ACTION_ON_CANCEL hostui.cancel(); #endif @@ -1698,6 +1699,16 @@ void MarlinUI::host_notify(const char * const cstr) { } #endif + /** + * - Synchronize and put up a wait screen + * - Wake the display + * - Tell the host to present a "Resume" option + * - Print "Paused" on the display + * - One of three possibilities follow: + * - If Parking, Print a message, send M125 P (which parks and waits), then M24 which will resume SD printing. + * - If media exists call M25 to pause the SD print. + * - For a host-only printer tell the host to pause the print in progress. + */ void MarlinUI::pause_print() { #if HAS_MARLINUI_MENU synchronize(GET_TEXT_F(MSG_PAUSING)); @@ -1884,7 +1895,7 @@ void MarlinUI::host_notify(const char * const cstr) { const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/ ) { - pause_mode = mode; + if (mode != PAUSE_MODE_SAME) pause_mode = mode; ExtUI::pauseModeStatus = message; switch (message) { case PAUSE_MESSAGE_PARKING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index ff87852f119b..3388c2047bc4 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -297,14 +297,6 @@ class MarlinUI { static void sleep_display(const bool=true) IF_DISABLED(HAS_DISPLAY_SLEEP, {}); static void wake_display() { sleep_display(false); } - #if HAS_DWIN_E3V2_BASIC - static void refresh(); - #else - FORCE_INLINE static void refresh() { - TERN_(HAS_WIRED_LCD, refresh(LCDVIEW_CLEAR_CALL_REDRAW)); - } - #endif - #if HAS_PRINT_PROGRESS_PERMYRIAD typedef uint16_t progress_t; #define PROGRESS_SCALE 100U @@ -393,6 +385,7 @@ class MarlinUI { #if ENABLED(STATUS_MESSAGE_SCROLLING) static uint8_t status_scroll_offset; + static void reset_status_scroll() { status_scroll_offset = 0; } static void advance_status_scroll(); static char* status_and_len(uint8_t &len); #endif @@ -510,6 +503,11 @@ class MarlinUI { // Periodic or as-needed display update static void update() IF_DISABLED(HAS_UI_UPDATE, {}); + // Tell the screen to redraw on the next call + FORCE_INLINE static void refresh() { + TERN_(HAS_WIRED_LCD, refresh(LCDVIEW_CLEAR_CALL_REDRAW)); + } + #if HAS_DISPLAY static void abort_print(); diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 840b658d09c9..22c0823f2613 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -562,24 +562,24 @@ void menu_backlash(); #if ENABLED(INPUT_SHAPING_X) editable.decimal = stepper.get_shaping_frequency(X_AXIS); if (editable.decimal) { - ACTION_ITEM_N(X_AXIS, MSG_SHAPING_DISABLE, []{ stepper.set_shaping_frequency(X_AXIS, 0.0f); ui.refresh(LCDVIEW_CLEAR_CALL_REDRAW); }); + ACTION_ITEM_N(X_AXIS, MSG_SHAPING_DISABLE, []{ stepper.set_shaping_frequency(X_AXIS, 0.0f); ui.refresh(); }); EDIT_ITEM_FAST_N(float41, X_AXIS, MSG_SHAPING_FREQ, &editable.decimal, min_frequency, 200.0f, []{ stepper.set_shaping_frequency(X_AXIS, editable.decimal); }); editable.decimal = stepper.get_shaping_damping_ratio(X_AXIS); EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_SHAPING_ZETA, &editable.decimal, 0.0f, 1.0f, []{ stepper.set_shaping_damping_ratio(X_AXIS, editable.decimal); }); } else - ACTION_ITEM_N(X_AXIS, MSG_SHAPING_ENABLE, []{ stepper.set_shaping_frequency(X_AXIS, (SHAPING_FREQ_X) ?: (SHAPING_MIN_FREQ)); ui.refresh(LCDVIEW_CLEAR_CALL_REDRAW); }); + ACTION_ITEM_N(X_AXIS, MSG_SHAPING_ENABLE, []{ stepper.set_shaping_frequency(X_AXIS, (SHAPING_FREQ_X) ?: (SHAPING_MIN_FREQ)); ui.refresh(); }); #endif #if ENABLED(INPUT_SHAPING_Y) editable.decimal = stepper.get_shaping_frequency(Y_AXIS); if (editable.decimal) { - ACTION_ITEM_N(Y_AXIS, MSG_SHAPING_DISABLE, []{ stepper.set_shaping_frequency(Y_AXIS, 0.0f); ui.refresh(LCDVIEW_CLEAR_CALL_REDRAW); }); + ACTION_ITEM_N(Y_AXIS, MSG_SHAPING_DISABLE, []{ stepper.set_shaping_frequency(Y_AXIS, 0.0f); ui.refresh(); }); EDIT_ITEM_FAST_N(float41, Y_AXIS, MSG_SHAPING_FREQ, &editable.decimal, min_frequency, 200.0f, []{ stepper.set_shaping_frequency(Y_AXIS, editable.decimal); }); editable.decimal = stepper.get_shaping_damping_ratio(Y_AXIS); EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_SHAPING_ZETA, &editable.decimal, 0.0f, 1.0f, []{ stepper.set_shaping_damping_ratio(Y_AXIS, editable.decimal); }); } else - ACTION_ITEM_N(Y_AXIS, MSG_SHAPING_ENABLE, []{ stepper.set_shaping_frequency(Y_AXIS, (SHAPING_FREQ_Y) ?: (SHAPING_MIN_FREQ)); ui.refresh(LCDVIEW_CLEAR_CALL_REDRAW); }); + ACTION_ITEM_N(Y_AXIS, MSG_SHAPING_ENABLE, []{ stepper.set_shaping_frequency(Y_AXIS, (SHAPING_FREQ_Y) ?: (SHAPING_MIN_FREQ)); ui.refresh(); }); #endif END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 3cff167f3fc0..622b03379a5d 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -295,7 +295,7 @@ void menu_main() { #if ENABLED(TFT_COLOR_UI) // Menu display issue on item removal with multi language selection menu if (encoderTopLine > 0) encoderTopLine--; - ui.refresh(LCDVIEW_CLEAR_CALL_REDRAW); + ui.refresh(); #endif }); #endif @@ -412,7 +412,7 @@ void menu_main() { #if ENABLED(TFT_COLOR_UI) // Menu display issue on item removal with multi language selection menu if (encoderTopLine > 0) encoderTopLine--; - ui.refresh(LCDVIEW_CLEAR_CALL_REDRAW); + ui.refresh(); #endif }); #endif diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index c86c382ddcbc..c5e45899a19d 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -689,6 +689,17 @@ void do_blocking_move_to(const xyze_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f* fr_mm_s ); } + void do_blocking_move_to_xy(const_float_t rx, const_float_t ry, const_feedRate_t fr_mm_s/*=0.0*/) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("do_blocking_move_to_xy(", rx, ", ", ry, ", ", fr_mm_s, ")"); + do_blocking_move_to( + NUM_AXIS_LIST_(rx, ry, current_position.z, current_position.i, current_position.j, current_position.k, + current_position.u, current_position.v, current_position.w) + fr_mm_s + ); + } + void do_blocking_move_to_xy(const xy_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { + do_blocking_move_to_xy(raw.x, raw.y, fr_mm_s); + } #endif #if HAS_Z_AXIS @@ -696,122 +707,108 @@ void do_blocking_move_to(const xyze_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f* if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("do_blocking_move_to_z(", rz, ", ", fr_mm_s, ")"); do_blocking_move_to_xy_z(current_position, rz, fr_mm_s); } + void do_blocking_move_to_xy_z(const xy_pos_t &raw, const_float_t z, const_feedRate_t fr_mm_s/*=0.0f*/) { + do_blocking_move_to( + NUM_AXIS_LIST_(raw.x, raw.y, z, current_position.i, current_position.j, current_position.k, + current_position.u, current_position.v, current_position.w) + fr_mm_s + ); + } + void do_z_clearance(const_float_t zclear, const bool with_probe/*=true*/, const bool lower_allowed/*=false*/) { + UNUSED(with_probe); + float zdest = zclear; + TERN_(HAS_BED_PROBE, if (with_probe && probe.offset.z < 0) zdest -= probe.offset.z); + NOMORE(zdest, Z_MAX_POS); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("do_z_clearance(", zclear, " [", current_position.z, " to ", zdest, "], ", lower_allowed, ")"); + if ((!lower_allowed && zdest < current_position.z) || zdest == current_position.z) return; + do_blocking_move_to_z(zdest, TERN(HAS_BED_PROBE, z_probe_fast_mm_s, homing_feedrate(Z_AXIS))); + } + void do_z_clearance_by(const_float_t zclear) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("do_z_clearance_by(", zclear, ")"); + do_z_clearance(current_position.z + zclear, false); + } + void do_move_after_z_homing() { + DEBUG_SECTION(mzah, "do_move_after_z_homing", DEBUGGING(LEVELING)); + float zpos = 0; + #ifdef Z_POST_CLEARANCE // (is always defined) + NOLESS(zpos, Z_POST_CLEARANCE); + #endif + #if ENABLED(USE_PROBE_FOR_Z_HOMING) + NOLESS(zpos, Z_AFTER_PROBING); + #endif + if (zpos) do_z_clearance(zpos, true, true); + } #endif #if HAS_I_AXIS - void do_blocking_move_to_i(const_float_t ri, const_feedRate_t fr_mm_s/*=0.0*/) { - do_blocking_move_to_xyz_i(current_position, ri, fr_mm_s); - } void do_blocking_move_to_xyz_i(const xyze_pos_t &raw, const_float_t i, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( NUM_AXIS_LIST_(raw.x, raw.y, raw.z, i, raw.j, raw.k, raw.u, raw.v, raw.w) fr_mm_s ); } + void do_blocking_move_to_i(const_float_t ri, const_feedRate_t fr_mm_s/*=0.0*/) { + do_blocking_move_to_xyz_i(current_position, ri, fr_mm_s); + } #endif #if HAS_J_AXIS - void do_blocking_move_to_j(const_float_t rj, const_feedRate_t fr_mm_s/*=0.0*/) { - do_blocking_move_to_xyzi_j(current_position, rj, fr_mm_s); - } void do_blocking_move_to_xyzi_j(const xyze_pos_t &raw, const_float_t j, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( NUM_AXIS_LIST_(raw.x, raw.y, raw.z, raw.i, j, raw.k, raw.u, raw.v, raw.w) fr_mm_s ); } + void do_blocking_move_to_j(const_float_t rj, const_feedRate_t fr_mm_s/*=0.0*/) { + do_blocking_move_to_xyzi_j(current_position, rj, fr_mm_s); + } #endif #if HAS_K_AXIS - void do_blocking_move_to_k(const_float_t rk, const_feedRate_t fr_mm_s/*=0.0*/) { - do_blocking_move_to_xyzij_k(current_position, rk, fr_mm_s); - } void do_blocking_move_to_xyzij_k(const xyze_pos_t &raw, const_float_t k, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( NUM_AXIS_LIST_(raw.x, raw.y, raw.z, raw.i, raw.j, k, raw.u, raw.v, raw.w) fr_mm_s ); } + void do_blocking_move_to_k(const_float_t rk, const_feedRate_t fr_mm_s/*=0.0*/) { + do_blocking_move_to_xyzij_k(current_position, rk, fr_mm_s); + } #endif #if HAS_U_AXIS - void do_blocking_move_to_u(const_float_t ru, const_feedRate_t fr_mm_s/*=0.0*/) { - do_blocking_move_to_xyzijk_u(current_position, ru, fr_mm_s); - } void do_blocking_move_to_xyzijk_u(const xyze_pos_t &raw, const_float_t u, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( NUM_AXIS_LIST_(raw.x, raw.y, raw.z, raw.i, raw.j, raw.k, u, raw.v, raw.w) fr_mm_s ); } + void do_blocking_move_to_u(const_float_t ru, const_feedRate_t fr_mm_s/*=0.0*/) { + do_blocking_move_to_xyzijk_u(current_position, ru, fr_mm_s); + } #endif #if HAS_V_AXIS - void do_blocking_move_to_v(const_float_t rv, const_feedRate_t fr_mm_s/*=0.0*/) { - do_blocking_move_to_xyzijku_v(current_position, rv, fr_mm_s); - } void do_blocking_move_to_xyzijku_v(const xyze_pos_t &raw, const_float_t v, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( NUM_AXIS_LIST_(raw.x, raw.y, raw.z, raw.i, raw.j, raw.k, raw.u, v, raw.w) fr_mm_s ); } + void do_blocking_move_to_v(const_float_t rv, const_feedRate_t fr_mm_s/*=0.0*/) { + do_blocking_move_to_xyzijku_v(current_position, rv, fr_mm_s); + } #endif #if HAS_W_AXIS - void do_blocking_move_to_w(const_float_t rw, const_feedRate_t fr_mm_s/*=0.0*/) { - do_blocking_move_to_xyzijkuv_w(current_position, rw, fr_mm_s); - } void do_blocking_move_to_xyzijkuv_w(const xyze_pos_t &raw, const_float_t w, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( NUM_AXIS_LIST_(raw.x, raw.y, raw.z, raw.i, raw.j, raw.k, raw.u, raw.v, w) fr_mm_s ); } -#endif - -#if HAS_Y_AXIS - void do_blocking_move_to_xy(const_float_t rx, const_float_t ry, const_feedRate_t fr_mm_s/*=0.0*/) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("do_blocking_move_to_xy(", rx, ", ", ry, ", ", fr_mm_s, ")"); - do_blocking_move_to( - NUM_AXIS_LIST_(rx, ry, current_position.z, current_position.i, current_position.j, current_position.k, - current_position.u, current_position.v, current_position.w) - fr_mm_s - ); - } - void do_blocking_move_to_xy(const xy_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { - do_blocking_move_to_xy(raw.x, raw.y, fr_mm_s); - } -#endif - -#if HAS_Z_AXIS - void do_blocking_move_to_xy_z(const xy_pos_t &raw, const_float_t z, const_feedRate_t fr_mm_s/*=0.0f*/) { - do_blocking_move_to( - NUM_AXIS_LIST_(raw.x, raw.y, z, current_position.i, current_position.j, current_position.k, - current_position.u, current_position.v, current_position.w) - fr_mm_s - ); - } - void do_z_clearance(const_float_t zclear, const bool with_probe/*=true*/, const bool lower_allowed/*=false*/) { - UNUSED(with_probe); - float zdest = zclear; - TERN_(HAS_BED_PROBE, if (with_probe && probe.offset.z < 0) zdest -= probe.offset.z); - NOMORE(zdest, Z_MAX_POS); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("do_z_clearance(", zclear, " [", current_position.z, " to ", zdest, "], ", lower_allowed, ")"); - if ((!lower_allowed && zdest < current_position.z) || zdest == current_position.z) return; - do_blocking_move_to_z(zdest, TERN(HAS_BED_PROBE, z_probe_fast_mm_s, homing_feedrate(Z_AXIS))); - } - void do_z_clearance_by(const_float_t zclear) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("do_z_clearance_by(", zclear, ")"); - do_z_clearance(current_position.z + zclear, false); - } - void do_move_after_z_homing() { - DEBUG_SECTION(mzah, "do_move_after_z_homing", DEBUGGING(LEVELING)); - #if defined(Z_AFTER_HOMING) || ALL(DWIN_LCD_PROUI, INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) - do_z_clearance(Z_POST_CLEARANCE, true, true); - #elif ENABLED(USE_PROBE_FOR_Z_HOMING) - probe.move_z_after_probing(); - #endif + void do_blocking_move_to_w(const_float_t rw, const_feedRate_t fr_mm_s/*=0.0*/) { + do_blocking_move_to_xyzijkuv_w(current_position, rw, fr_mm_s); } #endif diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 9380ff79f4c0..851fa452e7b9 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -203,12 +203,17 @@ uint32_t Stepper::acceleration_time, Stepper::deceleration_time; hal_timer_t Stepper::time_spent_in_isr = 0, Stepper::time_spent_out_isr = 0; #endif +#if ENABLED(ADAPTIVE_STEP_SMOOTHING) + // Oversampling factor (log2(multiplier)) to increase temporal resolution of axis + uint8_t Stepper::oversampling_factor; +#else + constexpr uint8_t Stepper::oversampling_factor; // = 0 +#endif + #if ENABLED(FREEZE_FEATURE) bool Stepper::frozen; // = false #endif -IF_DISABLED(ADAPTIVE_STEP_SMOOTHING, constexpr) uint8_t Stepper::oversampling_factor; - xyze_long_t Stepper::delta_error{0}; xyze_long_t Stepper::advance_dividend{0}; @@ -544,6 +549,21 @@ void Stepper::enable_axis(const AxisEnum axis) { mark_axis_enabled(axis); } +/** + * Mark an axis as disabled and power off its stepper(s). + * If one of the axis steppers is still in use by a non-disabled axis the axis will remain powered. + * DISCUSSION: It's basically just stepper ENA pins that are shared across axes, not whole steppers. + * Used on MCUs with a shortage of pins. We already track the overlap of ENA pins, so now + * we just need stronger logic to track which ENA pins are being set more than once. + * + * It would be better to use a bit mask (i.e., Flags). + * While the method try_to_disable in gcode/control/M17_M18_M84.cpp does use the + * bit mask, it is still only at the axis level. + * TODO: Power off steppers that don't share another axis. Currently axis-based steppers turn off as a unit. + * So we'd need to power off the off axis, then power on the on axis (for a microsecond). + * A global solution would keep a usage count when enabling or disabling a stepper, but this partially + * defeats the purpose of an on/off mask. + */ bool Stepper::disable_axis(const AxisEnum axis) { mark_axis_disabled(axis); @@ -558,6 +578,7 @@ bool Stepper::disable_axis(const AxisEnum axis) { default: break; } } + return can_disable; } diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 99fd2d293609..8c13831d9e7b 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -377,7 +377,7 @@ class Stepper { #if ENABLED(ADAPTIVE_STEP_SMOOTHING) static uint8_t oversampling_factor; // Oversampling factor (log2(multiplier)) to increase temporal resolution of axis #else - static constexpr uint8_t oversampling_factor = 0; + static constexpr uint8_t oversampling_factor = 0; // Without smoothing apply no shift #endif // Delta error variables for the Bresenham line tracer diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 9b071ecc3650..53b9f37fb2ef 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -723,12 +723,12 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(HAS_FAN_LOGIC, fan_update_ms = next_temp_ms + fan_update_interval_ms); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_STARTED)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_STARTED)); TERN_(PROUI_PID_TUNE, dwinPidTuning(isbed ? PIDTEMPBED_START : PIDTEMP_START)); if (target > GHV(CHAMBER_MAX_TARGET, BED_MAX_TARGET, hotend_max_target(heater_id))) { SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_TEMP_TOO_HIGH)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH))); return; @@ -822,7 +822,7 @@ volatile bool Temperature::raw_temps_ready = false; #endif if (current_temp > target + MAX_OVERSHOOT_PID_AUTOTUNE) { SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_TEMP_TOO_HIGH)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH))); break; @@ -861,7 +861,7 @@ volatile bool Temperature::raw_temps_ready = false; if ((ms - _MIN(t1, t2)) > MIN_TO_MS(PID_AUTOTUNE_MAX_CYCLE_MINS)) { TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_TUNING_TIMEOUT)); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TUNING_TIMEOUT)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_TUNING_TIMEOUT)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TIMEOUT))); SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TIMEOUT); break; @@ -918,8 +918,8 @@ volatile bool Temperature::raw_temps_ready = false; disable_all_heaters(); EXIT_M303: - TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPidTuningDone(oldcolor)); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_DONE)); + TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPIDTuningDone(oldcolor)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_DONE)); TERN_(PROUI_PID_TUNE, dwinPidTuning(AUTOTUNE_DONE)); TERN_(TEMP_TUNING_MAINTAIN_FAN, adaptive_fan_slowing = true); return; diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index ae7415548213..25a30585f81f 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -34,8 +34,6 @@ #if ENABLED(DWIN_CREALITY_LCD) #include "../lcd/e3v2/creality/dwin.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../lcd/e3v2/proui/dwin.h" #endif #include "../module/planner.h" // for synchronize From 017a9032f1b767c5689b680f88bed7e31921c57c Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 1 Apr 2024 00:23:48 +0000 Subject: [PATCH 036/111] [cron] Bump distribution date (2024-04-01) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 339ac44a6701..f96b65b83440 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 "2024-03-28" +//#define STRING_DISTRIBUTION_DATE "2024-04-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 e87c6f2bd257..c3d13262e476 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 "2024-03-28" + #define STRING_DISTRIBUTION_DATE "2024-04-01" #endif /** From 87e94f456348e944ba4487aed436c762dd718966 Mon Sep 17 00:00:00 2001 From: Andrew <18502096+classicrocker883@users.noreply.github.com> Date: Mon, 1 Apr 2024 16:05:11 -0400 Subject: [PATCH 037/111] =?UTF-8?q?=F0=9F=9A=B8=20Update=20ProUI=20Plot=20?= =?UTF-8?q?graph=20-=20part=202=20(#26563)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 2 +- Marlin/src/MarlinCore.cpp | 6 +- Marlin/src/feature/bedlevel/ubl/ubl.h | 2 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 33 +- Marlin/src/feature/host_actions.cpp | 4 +- Marlin/src/feature/pause.cpp | 10 +- Marlin/src/feature/powerloss.cpp | 4 +- Marlin/src/feature/powerloss.h | 4 +- Marlin/src/feature/runout.cpp | 3 - Marlin/src/feature/tmc_util.h | 44 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 12 +- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 5 - Marlin/src/gcode/bedlevel/ubl/M421.cpp | 3 - Marlin/src/gcode/calibrate/G28.cpp | 6 +- Marlin/src/gcode/config/M302.cpp | 18 +- Marlin/src/gcode/control/M997.cpp | 6 +- Marlin/src/gcode/feature/powerloss/M1000.cpp | 10 +- Marlin/src/gcode/lcd/M0_M1.cpp | 17 +- Marlin/src/gcode/lcd/M73.cpp | 4 - Marlin/src/gcode/probe/G30.cpp | 12 +- Marlin/src/gcode/sd/M524.cpp | 8 +- Marlin/src/gcode/stats/M75-M78.cpp | 8 +- Marlin/src/gcode/temp/M303.cpp | 7 +- Marlin/src/inc/Conditionals_LCD.h | 9 +- Marlin/src/inc/Conditionals_adv.h | 16 +- Marlin/src/inc/Conditionals_post.h | 7 +- Marlin/src/lcd/dogm/marlinui_DOGM.h | 2 +- .../dogm/{ => u8g}/HAL_LCD_class_defines.h | 2 +- .../lcd/dogm/{ => u8g}/HAL_LCD_com_defines.h | 2 +- .../u8g_dev_ssd1306_sh1106_128x64_I2C.cpp | 2 +- .../dogm/{ => u8g}/u8g_dev_ssd1309_12864.cpp | 2 +- .../{ => u8g}/u8g_dev_st7565_64128n_HAL.cpp | 2 +- .../{ => u8g}/u8g_dev_st7920_128x64_HAL.cpp | 2 +- .../u8g_dev_tft_upscale_from_128x64.cpp | 14 +- .../u8g_dev_uc1701_mini12864_HAL.cpp | 2 +- .../ultralcd_st7920_u8glib_rrd_AVR.cpp | 6 +- .../ultralcd_st7920_u8glib_rrd_AVR.h | 4 +- Marlin/src/lcd/e3v2/common/dwin_api.cpp | 32 +- Marlin/src/lcd/e3v2/common/dwin_api.h | 20 +- Marlin/src/lcd/e3v2/common/dwin_set.h | 6 +- Marlin/src/lcd/e3v2/creality/dwin.cpp | 6 +- Marlin/src/lcd/e3v2/proui/dwin.cpp | 532 ++++++++++-------- Marlin/src/lcd/e3v2/proui/dwin.h | 107 ++-- Marlin/src/lcd/e3v2/proui/dwin_defines.h | 11 +- Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp | 36 +- Marlin/src/lcd/e3v2/proui/dwinui.cpp | 2 +- Marlin/src/lcd/e3v2/proui/dwinui.h | 76 ++- Marlin/src/lcd/e3v2/proui/proui_extui.cpp | 246 ++++++++ .../extui/anycubic_chiron/chiron_extui.cpp | 48 +- .../extui/anycubic_i3mega/anycubic_extui.cpp | 48 +- .../lcd/extui/anycubic_vyper/vyper_extui.cpp | 51 +- Marlin/src/lcd/extui/dgus/dgus_extui.cpp | 64 ++- .../extui/dgus_e3s1pro/DGUSScreenHandler.cpp | 2 +- .../extui/dgus_e3s1pro/DGUSScreenHandler.h | 2 +- .../extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp | 49 +- .../lcd/extui/dgus_reloaded/DGUSRxHandler.cpp | 2 +- .../extui/dgus_reloaded/DGUSScreenHandler.cpp | 3 +- .../extui/dgus_reloaded/DGUSScreenHandler.h | 2 +- .../dgus_reloaded/dgus_reloaded_extui.cpp | 48 +- Marlin/src/lcd/extui/example/example.cpp | 49 +- .../ftdi_eve_touch_ui/ftdi_eve_extui.cpp | 57 +- .../extui/ia_creality/ia_creality_extui.cpp | 45 +- .../lcd/extui/ia_creality/ia_creality_rts.cpp | 19 +- Marlin/src/lcd/extui/malyan/malyan_extui.cpp | 44 +- .../src/lcd/extui/nextion/nextion_extui.cpp | 49 +- Marlin/src/lcd/extui/ui_api.cpp | 64 ++- Marlin/src/lcd/extui/ui_api.h | 53 +- Marlin/src/lcd/language/language_en.h | 12 +- Marlin/src/lcd/language/language_fr.h | 3 +- Marlin/src/lcd/language/language_fr_na.h | 3 +- Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_tr.h | 2 +- Marlin/src/lcd/marlinui.cpp | 37 +- Marlin/src/lcd/marlinui.h | 6 +- Marlin/src/module/motion.h | 14 +- Marlin/src/module/probe.cpp | 9 +- Marlin/src/module/settings.cpp | 68 ++- Marlin/src/module/stepper.cpp | 13 +- Marlin/src/module/stepper.h | 6 + Marlin/src/module/temperature.cpp | 53 +- buildroot/share/dwin/bin/DWIN_ICO.py | 224 ++++---- buildroot/share/dwin/bin/README.md | 93 ++- .../share/dwin/icons-4/016-ICON_Bedline.jpg | Bin 0 -> 748 bytes .../dwin/icons-4/017-ICON_BedLeveledOff.jpg | Bin 0 -> 2707 bytes .../dwin/icons-4/018-ICON_BedLeveledOn.jpg | Bin 0 -> 3931 bytes .../dwin/icons-7/009-ICON_HotendTemp.jpg | Bin 1671 -> 1119 bytes .../share/dwin/icons-7/010-ICON_BedTemp.jpg | Bin 1655 -> 1082 bytes .../share/dwin/icons-7/011-ICON_Speed.jpg | Bin 1706 -> 1610 bytes .../share/dwin/icons-7/012-ICON_Zoffset.jpg | Bin 1654 -> 1202 bytes .../share/dwin/icons-7/019-ICON_Pause_0.jpg | Bin 3592 -> 4340 bytes .../share/dwin/icons-7/020-ICON_Pause_1.jpg | Bin 3583 -> 4414 bytes .../share/dwin/icons-7/030-ICON_SetHome.jpg | Bin 1881 -> 1861 bytes .../share/dwin/icons-7/034-ICON_Language.jpg | Bin 1960 -> 1657 bytes .../share/dwin/icons-7/035-ICON_MoveX.jpg | Bin 1871 -> 1473 bytes .../share/dwin/icons-7/036-ICON_MoveY.jpg | Bin 1874 -> 1429 bytes .../share/dwin/icons-7/037-ICON_MoveZ.jpg | Bin 1820 -> 1327 bytes .../share/dwin/icons-7/038-ICON_Extruder.jpg | Bin 1692 -> 1422 bytes .../dwin/icons-7/040-ICON_Temperature.jpg | Bin 1821 -> 1244 bytes .../share/dwin/icons-7/041-ICON_Motion.jpg | Bin 1906 -> 1508 bytes .../share/dwin/icons-7/045-ICON_Info.jpg | Bin 1679 -> 1113 bytes .../dwin/icons-7/046-ICON_SetEndTemp.jpg | Bin 1808 -> 1100 bytes .../dwin/icons-7/047-ICON_SetBedTemp.jpg | Bin 1712 -> 1655 bytes .../share/dwin/icons-7/051-ICON_MaxSpeed.jpg | Bin 1718 -> 1489 bytes .../dwin/icons-7/052-ICON_MaxAccelerated.jpg | Bin 1768 -> 1510 bytes .../share/dwin/icons-7/053-ICON_MaxJerk.jpg | Bin 1756 -> 1501 bytes .../share/dwin/icons-7/054-ICON_Step.jpg | Bin 1816 -> 1549 bytes .../icons-7/058-ICON_StockConfiguraton.jpg | Bin 1624 -> 1050 bytes .../share/dwin/icons-7/059-ICON_MaxSpeedX.jpg | Bin 1896 -> 1479 bytes .../share/dwin/icons-7/060-ICON_MaxSpeedY.jpg | Bin 1891 -> 1465 bytes .../share/dwin/icons-7/061-ICON_MaxSpeedZ.jpg | Bin 1901 -> 1471 bytes .../share/dwin/icons-7/062-ICON_MaxSpeedE.jpg | Bin 1888 -> 1461 bytes .../share/dwin/icons-7/063-ICON_MaxAccX.jpg | Bin 1929 -> 1504 bytes .../share/dwin/icons-7/064-ICON_MaxAccY.jpg | Bin 1924 -> 1496 bytes .../share/dwin/icons-7/065-ICON_MaxAccZ.jpg | Bin 1934 -> 1506 bytes .../share/dwin/icons-7/066-ICON_MaxAccE.jpg | Bin 1933 -> 1494 bytes .../dwin/icons-7/067-ICON_MaxSpeedJerkX.jpg | Bin 1936 -> 1511 bytes .../dwin/icons-7/068-ICON_MaxSpeedJerkY.jpg | Bin 1938 -> 1500 bytes .../dwin/icons-7/069-ICON_MaxSpeedJerkZ.jpg | Bin 1943 -> 1507 bytes .../dwin/icons-7/070-ICON_MaxSpeedJerkE.jpg | Bin 1934 -> 1498 bytes .../share/dwin/icons-7/071-ICON_StepX.jpg | Bin 1976 -> 1555 bytes .../share/dwin/icons-7/072-ICON_StepY.jpg | Bin 1979 -> 1548 bytes .../share/dwin/icons-7/073-ICON_StepZ.jpg | Bin 1984 -> 1550 bytes .../share/dwin/icons-7/074-ICON_StepE.jpg | Bin 1979 -> 1545 bytes .../share/dwin/icons-7/075-ICON_Setspeed.jpg | Bin 1748 -> 1598 bytes .../dwin/icons-7/076-ICON_SetZOffset.jpg | Bin 1881 -> 1460 bytes .../share/dwin/icons-7/078-ICON_BLTouch.jpg | Bin 2016 -> 3702 bytes .../dwin/icons-7/079-ICON_TempTooLow.jpg | Bin 2058 -> 3596 bytes .../dwin/icons-7/081-ICON_TempTooHigh.jpg | Bin 2137 -> 3901 bytes .../share/dwin/icons-7/092-ICON_DegreesC.jpg | Bin 0 -> 1345 bytes .../share/dwin/icons-7/093-ICON_Printer_0.jpg | Bin 0 -> 9153 bytes .../dwin/icons-7/200-ICON_Checkbox_F.jpg | Bin 0 -> 1263 bytes .../dwin/icons-7/201-ICON_Checkbox_T.jpg | Bin 0 -> 1279 bytes .../share/dwin/icons-7/202-ICON_Fade.jpg | Bin 0 -> 1360 bytes .../share/dwin/icons-7/203-ICON_Mesh.jpg | Bin 0 -> 1373 bytes .../share/dwin/icons-7/204-ICON_Tilt.jpg | Bin 0 -> 1215 bytes .../dwin/icons-7/205-ICON_Brightness.jpg | Bin 0 -> 1922 bytes .../share/dwin/icons-7/206-ICON_Probe.jpg | Bin 0 -> 1898 bytes .../share/dwin/icons-7/249-ICON_AxisD.jpg | Bin 0 -> 4752 bytes .../share/dwin/icons-7/250-ICON_AxisBR.jpg | Bin 0 -> 1500 bytes .../share/dwin/icons-7/251-ICON_AxisTR.jpg | Bin 0 -> 1454 bytes .../share/dwin/icons-7/252-ICON_AxisBL.jpg | Bin 0 -> 1550 bytes .../share/dwin/icons-7/253-ICON_AxisTL.jpg | Bin 0 -> 1536 bytes .../share/dwin/icons-7/254-ICON_AxisC.jpg | Bin 0 -> 1483 bytes 143 files changed, 1781 insertions(+), 837 deletions(-) rename Marlin/src/lcd/dogm/{ => u8g}/HAL_LCD_class_defines.h (99%) rename Marlin/src/lcd/dogm/{ => u8g}/HAL_LCD_com_defines.h (97%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp (99%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_ssd1309_12864.cpp (99%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_st7565_64128n_HAL.cpp (99%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_st7920_128x64_HAL.cpp (99%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_tft_upscale_from_128x64.cpp (98%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_uc1701_mini12864_HAL.cpp (99%) rename Marlin/src/lcd/dogm/{ => u8g}/ultralcd_st7920_u8glib_rrd_AVR.cpp (98%) rename Marlin/src/lcd/dogm/{ => u8g}/ultralcd_st7920_u8glib_rrd_AVR.h (96%) create mode 100644 Marlin/src/lcd/e3v2/proui/proui_extui.cpp create mode 100644 buildroot/share/dwin/icons-4/016-ICON_Bedline.jpg create mode 100644 buildroot/share/dwin/icons-4/017-ICON_BedLeveledOff.jpg create mode 100644 buildroot/share/dwin/icons-4/018-ICON_BedLeveledOn.jpg create mode 100644 buildroot/share/dwin/icons-7/092-ICON_DegreesC.jpg create mode 100644 buildroot/share/dwin/icons-7/093-ICON_Printer_0.jpg create mode 100644 buildroot/share/dwin/icons-7/200-ICON_Checkbox_F.jpg create mode 100644 buildroot/share/dwin/icons-7/201-ICON_Checkbox_T.jpg create mode 100644 buildroot/share/dwin/icons-7/202-ICON_Fade.jpg create mode 100644 buildroot/share/dwin/icons-7/203-ICON_Mesh.jpg create mode 100644 buildroot/share/dwin/icons-7/204-ICON_Tilt.jpg create mode 100644 buildroot/share/dwin/icons-7/205-ICON_Brightness.jpg create mode 100644 buildroot/share/dwin/icons-7/206-ICON_Probe.jpg create mode 100644 buildroot/share/dwin/icons-7/249-ICON_AxisD.jpg create mode 100644 buildroot/share/dwin/icons-7/250-ICON_AxisBR.jpg create mode 100644 buildroot/share/dwin/icons-7/251-ICON_AxisTR.jpg create mode 100644 buildroot/share/dwin/icons-7/252-ICON_AxisBL.jpg create mode 100644 buildroot/share/dwin/icons-7/253-ICON_AxisTL.jpg create mode 100644 buildroot/share/dwin/icons-7/254-ICON_AxisC.jpg diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a12eef2556a9..13c59b0a441e 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3558,7 +3558,7 @@ * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and * to set spindle speed, spindle direction, and laser power. * - * SuperPid is a router/spindle speed controller used in the CNC milling community. + * SuperPID is a router/spindle speed controller used in the CNC milling community. * Marlin can be used to turn the spindle on and off. It can also be used to set * the spindle speed from 5,000 to 30,000 RPM. * diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 8a2561f02d22..272e50340a2d 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -77,8 +77,6 @@ #include "lcd/e3v2/common/encoder.h" #if ENABLED(DWIN_CREALITY_LCD) #include "lcd/e3v2/creality/dwin.h" - #elif ENABLED(DWIN_LCD_PROUI) - #include "lcd/e3v2/proui/dwin.h" #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) #include "lcd/e3v2/jyersui/dwin.h" #endif @@ -1594,11 +1592,11 @@ void setup() { SERIAL_ECHO_TERNARY(err, "BL24CXX Check ", "failed", "succeeded", "!\n"); #endif - #if HAS_DWIN_E3V2_BASIC + #if ENABLED(DWIN_CREALITY_LCD) SETUP_RUN(dwinInitScreen()); #endif - #if HAS_SERVICE_INTERVALS && !HAS_DWIN_E3V2_BASIC + #if HAS_SERVICE_INTERVALS && DISABLED(DWIN_CREALITY_LCD) SETUP_RUN(ui.reset_status(true)); // Show service messages or keep current status #endif diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 7377f7dfc03a..b08cb812f83c 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -95,7 +95,7 @@ class unified_bed_leveling { static void report_current_mesh(); static void report_state(); static void save_ubl_active_state_and_disable(); - static void restore_ubl_active_state_and_leave(); + static void restore_ubl_active_state(const bool is_done=true); static void display_map(const uint8_t) __O0; static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) __O0; static mesh_index_pair find_furthest_invalid_mesh_point() __O0; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 2e7ea743273f..fcf408b34ed1 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -309,7 +309,7 @@ void unified_bed_leveling::G29() { #if ALL(DWIN_LCD_PROUI, ZHOME_BEFORE_LEVELING) save_ubl_active_state_and_disable(); gcode.process_subcommands_now(F("G28Z")); - restore_ubl_active_state_and_leave(); + restore_ubl_active_state(false); // ...without telling ExtUI "done" #else // Send 'N' to force homing before G29 (internal only) if (axes_should_home() || parser.seen_test('N')) gcode.home_all_axes(); @@ -425,7 +425,7 @@ void unified_bed_leveling::G29() { if (parser.seen_test('J')) { save_ubl_active_state_and_disable(); tilt_mesh_based_on_probed_grid(param.J_grid_size == 0); // Zero size does 3-Point - restore_ubl_active_state_and_leave(); + restore_ubl_active_state(); #if ENABLED(UBL_G29_J_RECENTER) do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); #endif @@ -754,7 +754,6 @@ void unified_bed_leveling::shift_mesh_height() { TERN_(HAS_MARLINUI_MENU, ui.capture()); TERN_(EXTENSIBLE_UI, ExtUI::onLevelingStart()); - TERN_(DWIN_LCD_PROUI, dwinLevelingStart()); save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained grid_count_t count = GRID_MAX_POINTS; @@ -768,7 +767,6 @@ void unified_bed_leveling::shift_mesh_height() { SERIAL_ECHOLNPGM("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_POINT), point_num, int(GRID_MAX_POINTS))); TERN_(HAS_BACKLIGHT_TIMEOUT, ui.refresh_backlight_timeout()); - TERN_(DWIN_LCD_PROUI, dwinRedrawScreen()); #if HAS_MARLINUI_MENU if (ui.button_pressed()) { @@ -778,8 +776,7 @@ void unified_bed_leveling::shift_mesh_height() { ui.quick_feedback(); ui.release(); probe.stow(); // Release UI before stow to allow for PAUSE_BEFORE_DEPLOY_STOW - TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); - return restore_ubl_active_state_and_leave(); + return restore_ubl_active_state(); } #endif @@ -815,15 +812,12 @@ void unified_bed_leveling::shift_mesh_height() { probe.move_z_after_probing(); - restore_ubl_active_state_and_leave(); - do_blocking_move_to_xy( constrain(nearby.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), constrain(nearby.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) ); - TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); - TERN_(DWIN_LCD_PROUI, dwinLevelingDone()); + restore_ubl_active_state(); } #endif // HAS_BED_PROBE @@ -932,7 +926,7 @@ void set_message_with_feedback(FSTR_P const fstr) { if (param.V_verbosity > 1) SERIAL_ECHOLNPGM("Business Card is ", p_float_t(thickness, 4), "mm thick."); - restore_ubl_active_state_and_leave(); + restore_ubl_active_state(); return thickness; } @@ -987,7 +981,7 @@ void set_message_with_feedback(FSTR_P const fstr) { if (_click_and_hold([]{ SERIAL_ECHOLNPGM("\nMesh only partially populated."); do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); - })) return restore_ubl_active_state_and_leave(); + })) return restore_ubl_active_state(); // Store the Z position minus the shim height z_values[lpos.x][lpos.y] = current_position.z - thick; @@ -1002,10 +996,8 @@ void set_message_with_feedback(FSTR_P const fstr) { if (do_ubl_mesh_map) display_map(param.T_map_type); // show user where we're probing - restore_ubl_active_state_and_leave(); + restore_ubl_active_state(); do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE); - - TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); } /** @@ -1111,7 +1103,7 @@ void set_message_with_feedback(FSTR_P const fstr) { } while (lpos.x >= 0 && --param.R_repetition > 0); if (do_ubl_mesh_map) display_map(param.T_map_type); - restore_ubl_active_state_and_leave(); + restore_ubl_active_state(); do_blocking_move_to_xy_z(pos, Z_TWEEN_SAFE_CLEARANCE); @@ -1263,17 +1255,20 @@ void unified_bed_leveling::save_ubl_active_state_and_disable() { set_bed_leveling_enabled(false); } -void unified_bed_leveling::restore_ubl_active_state_and_leave() { +void unified_bed_leveling::restore_ubl_active_state(const bool is_done/*=true*/) { TERN_(HAS_MARLINUI_MENU, ui.release()); #if ENABLED(UBL_DEVEL_DEBUGGING) if (--ubl_state_recursion_chk) { - SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); + SERIAL_ECHOLNPGM("restore_ubl_active_state() called too many times."); set_message_with_feedback(GET_TEXT_F(MSG_UBL_RESTORE_ERROR)); return; } #endif set_bed_leveling_enabled(ubl_state_at_invocation); - TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); + + if (is_done) { + TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); + } } mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index cc5face2594d..538aa92e91e7 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -186,13 +186,13 @@ void HostUI::action(FSTR_P const fstr, const bool eol) { switch (response) { case 0: // "Purge More" button - #if ALL(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE) + #if ENABLED(M600_PURGE_MORE_RESUMABLE) pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // Simulate menu selection (menu exits, doesn't extrude more) #endif break; case 1: // "Continue" / "Disable Runout" button - #if ALL(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE) + #if ENABLED(M600_PURGE_MORE_RESUMABLE) pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; // Simulate menu selection #endif #if HAS_FILAMENT_SENSOR diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 8756c339e3c1..74a4f236c0a9 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -23,6 +23,8 @@ /** * feature/pause.cpp - Pause feature support functions * This may be combined with related G-codes if features are consolidated. + * + * Note: Calls to ui.pause_show_message are passed to either ExtUI or MarlinUI. */ #include "../inc/MarlinConfigPre.h" @@ -60,8 +62,6 @@ #if ENABLED(EXTENSIBLE_UI) #include "../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../lcd/e3v2/proui/dwin.h" #endif #include "../lcd/marlinui.h" @@ -148,7 +148,7 @@ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=P thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder); #endif - ui.pause_show_message(PAUSE_MESSAGE_HEATING, mode); UNUSED(mode); + ui.pause_show_message(PAUSE_MESSAGE_HEATING, mode); if (wait) return thermalManager.wait_for_hotend(active_extruder); @@ -288,8 +288,8 @@ 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 ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) - ui.pause_show_message(PAUSE_MESSAGE_OPTION); // Also sets PAUSE_RESPONSE_WAIT_FOR + #if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI) + ui.pause_show_message(PAUSE_MESSAGE_OPTION); // MarlinUI and MKS UI also set PAUSE_RESPONSE_WAIT_FOR #else pause_menu_response = PAUSE_RESPONSE_WAIT_FOR; #endif diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 70fac66fce39..1867aba6ed25 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -48,8 +48,8 @@ uint8_t PrintJobRecovery::queue_index_r; uint32_t PrintJobRecovery::cmd_sdpos, // = 0 PrintJobRecovery::sdpos[BUFSIZE]; -#if HAS_DWIN_E3V2_BASIC - bool PrintJobRecovery::dwin_flag; // = false +#if HAS_PLR_UI_FLAG + bool PrintJobRecovery::ui_flag_resume; // = false #endif #include "../sd/cardreader.h" diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 579731ffddcb..7de8450c9146 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -151,8 +151,8 @@ class PrintJobRecovery { static uint32_t cmd_sdpos, //!< SD position of the next command sdpos[BUFSIZE]; //!< SD positions of queued commands - #if HAS_DWIN_E3V2_BASIC - static bool dwin_flag; + #if HAS_PLR_UI_FLAG + static bool ui_flag_resume; //!< Flag the UI to show a dialog to Resume (M1000) or Cancel (M1000C) #endif static void init(); diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 1d684c6b856a..2bcb47e99a83 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -68,8 +68,6 @@ bool FilamentMonitorBase::enabled = true, #if ENABLED(EXTENSIBLE_UI) #include "../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../lcd/e3v2/proui/dwin.h" #endif void event_filament_runout(const uint8_t extruder) { @@ -88,7 +86,6 @@ void event_filament_runout(const uint8_t extruder) { #endif TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getTool(extruder))); - TERN_(DWIN_LCD_PROUI, dwinFilamentRunout(extruder)); #if ANY(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS, MULTI_FILAMENT_SENSOR) const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, extruder); diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index a0a72058aa2d..7ed070c9b8ca 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -144,15 +144,13 @@ class TMCMarlin : public TMC, public TMCStorage { #endif #endif - #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) - void refresh_stepper_current() { rms_current(this->val_mA); } + void refresh_stepper_current() { rms_current(this->val_mA); } - #if ENABLED(HYBRID_THRESHOLD) - void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } - #endif - #if USE_SENSORLESS - void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } - #endif + #if ENABLED(HYBRID_THRESHOLD) + void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } + #endif + #if USE_SENSORLESS + void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } #endif static constexpr int8_t sgt_min = -64, @@ -207,12 +205,10 @@ class TMCMarlin : public TMC220 } #endif - #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) - void refresh_stepper_current() { rms_current(this->val_mA); } + void refresh_stepper_current() { rms_current(this->val_mA); } - #if ENABLED(HYBRID_THRESHOLD) - void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } - #endif + #if ENABLED(HYBRID_THRESHOLD) + void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } #endif }; @@ -269,15 +265,13 @@ class TMCMarlin : public TMC220 } #endif - #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) - void refresh_stepper_current() { rms_current(this->val_mA); } + void refresh_stepper_current() { rms_current(this->val_mA); } - #if ENABLED(HYBRID_THRESHOLD) - void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } - #endif - #if USE_SENSORLESS - void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } - #endif + #if ENABLED(HYBRID_THRESHOLD) + void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } + #endif + #if USE_SENSORLESS + void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } #endif static constexpr uint8_t sgt_min = 0, @@ -315,12 +309,10 @@ class TMCMarlin : public TMC266 } #endif - #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) - void refresh_stepper_current() { rms_current(this->val_mA); } + void refresh_stepper_current() { rms_current(this->val_mA); } - #if USE_SENSORLESS - void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } - #endif + #if USE_SENSORLESS + void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } #endif static constexpr int8_t sgt_min = -64, diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 3126bee47f84..449c25fefdc3 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -51,8 +51,6 @@ #include "../../../lcd/extui/ui_api.h" #elif ENABLED(DWIN_CREALITY_LCD) #include "../../../lcd/e3v2/creality/dwin.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../../lcd/e3v2/proui/dwin.h" #endif #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) @@ -77,7 +75,7 @@ static void pre_g29_return(const bool retry, const bool did) { TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE, false)); } if (did) { - TERN_(HAS_DWIN_E3V2_BASIC, dwinLevelingDone()); + TERN_(DWIN_CREALITY_LCD, dwinLevelingDone()); TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); } } @@ -425,8 +423,6 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(AUTO_BED_LEVELING_3POINT) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> 3-point Leveling"); points[0].z = points[1].z = points[2].z = 0; // Probe at 3 arbitrary points - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - TERN_(DWIN_LCD_PROUI, dwinLevelingStart()); #endif TERN_(EXTENSIBLE_UI, ExtUI::onLevelingStart()); @@ -436,11 +432,7 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(PREHEAT_BEFORE_LEVELING) if (!abl.dryrun) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, - #if ALL(DWIN_LCD_PROUI, HAS_HEATED_BED) - hmiData.bedLevT - #else - LEVELING_BED_TEMP - #endif + TERN(EXTENSIBLE_UI, ExtUI::getLevelingBedTemp(), LEVELING_BED_TEMP) ); #endif } diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index b3f03d03ba43..c9c04b4f0ca0 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -40,8 +40,6 @@ #if ENABLED(EXTENSIBLE_UI) #include "../../../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../../lcd/e3v2/proui/dwin.h" #endif #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) @@ -144,7 +142,6 @@ void GcodeSuite::G29() { queue.inject(F("G29S2")); TERN_(EXTENSIBLE_UI, ExtUI::onLevelingStart()); - TERN_(DWIN_LCD_PROUI, dwinLevelingStart()); return; } @@ -170,7 +167,6 @@ void GcodeSuite::G29() { // Save Z for the previous mesh position bedlevel.set_zigzag_z(mbl_probe_index - 1, current_position.z); TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, current_position.z)); - TERN_(DWIN_LCD_PROUI, dwinMeshUpdate(_MIN(mbl_probe_index, GRID_MAX_POINTS), int(GRID_MAX_POINTS), current_position.z)); SET_SOFT_ENDSTOP_LOOSE(false); } // If there's another point to sample, move there with optional lift. @@ -237,7 +233,6 @@ void GcodeSuite::G29() { if (parser.seenval('Z')) { bedlevel.z_values[ix][iy] = parser.value_linear_units(); TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, bedlevel.z_values[ix][iy])); - TERN_(DWIN_LCD_PROUI, dwinMeshUpdate(ix, iy, bedlevel.z_values[ix][iy])); } else return echo_not_entered('Z'); diff --git a/Marlin/src/gcode/bedlevel/ubl/M421.cpp b/Marlin/src/gcode/bedlevel/ubl/M421.cpp index 3a5aa8cb038c..99ba3ce19b46 100644 --- a/Marlin/src/gcode/bedlevel/ubl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/ubl/M421.cpp @@ -33,8 +33,6 @@ #if ENABLED(EXTENSIBLE_UI) #include "../../../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../../lcd/e3v2/proui/dwin.h" #endif /** @@ -69,7 +67,6 @@ void GcodeSuite::M421() { float &zval = bedlevel.z_values[ij.x][ij.y]; // Altering this Mesh Point zval = hasN ? NAN : parser.value_linear_units() + (hasQ ? zval : 0); // N=NAN, Z=NEWVAL, or Q=ADDVAL TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ij.x, ij.y, zval)); // Ping ExtUI in case it's showing the mesh - TERN_(DWIN_LCD_PROUI, dwinMeshUpdate(ij.x, ij.y, zval)); } } diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 55698c942bd4..0ab1ca610578 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -52,8 +52,6 @@ #include "../../lcd/extui/ui_api.h" #elif ENABLED(DWIN_CREALITY_LCD) #include "../../lcd/e3v2/creality/dwin.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/e3v2/proui/dwin.h" #endif #if ENABLED(LASER_FEATURE) @@ -223,7 +221,7 @@ void GcodeSuite::G28() { set_and_report_grblstate(M_HOMING); #endif - TERN_(HAS_DWIN_E3V2_BASIC, dwinHomingStart()); + TERN_(DWIN_CREALITY_LCD, dwinHomingStart()); TERN_(EXTENSIBLE_UI, ExtUI::onHomingStart()); planner.synchronize(); // Wait for planner moves to finish! @@ -652,7 +650,7 @@ void GcodeSuite::G28() { ui.refresh(); - TERN_(HAS_DWIN_E3V2_BASIC, dwinHomingDone()); + TERN_(DWIN_CREALITY_LCD, dwinHomingDone()); TERN_(EXTENSIBLE_UI, ExtUI::onHomingDone()); report_current_position(); diff --git a/Marlin/src/gcode/config/M302.cpp b/Marlin/src/gcode/config/M302.cpp index 3373e143251c..0648f3edca50 100644 --- a/Marlin/src/gcode/config/M302.cpp +++ b/Marlin/src/gcode/config/M302.cpp @@ -25,12 +25,13 @@ #if ENABLED(PREVENT_COLD_EXTRUSION) #include "../gcode.h" -#include "../../module/temperature.h" -#if ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/e3v2/proui/dwin.h" +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" #endif +#include "../../module/temperature.h" + /** * M302: Allow cold extrudes, or set the minimum extrude temperature * @@ -50,13 +51,14 @@ void GcodeSuite::M302() { const bool seen_S = parser.seen('S'); if (seen_S) { thermalManager.extrude_min_temp = parser.value_celsius(); - thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0); - TERN_(DWIN_LCD_PROUI, hmiData.extMinT = thermalManager.extrude_min_temp); + TERN_(EXTENSIBLE_UI, ExtUI::onSetMinExtrusionTemp(thermalManager.extrude_min_temp)); } - if (parser.seen('P')) - thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0) || parser.value_bool(); - else if (!seen_S) { + const bool seen_P = parser.seen('P'); + if (seen_P || seen_S) { + thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0) || (seen_P && parser.value_bool()); + } + else { // Report current state SERIAL_ECHO_START(); SERIAL_ECHOLN(F("Cold extrudes are "), thermalManager.allow_cold_extrude ? F("en") : F("dis"), F("abled (min temp "), thermalManager.extrude_min_temp, F("C)")); diff --git a/Marlin/src/gcode/control/M997.cpp b/Marlin/src/gcode/control/M997.cpp index 5ac0ba23bbca..c651961902f4 100644 --- a/Marlin/src/gcode/control/M997.cpp +++ b/Marlin/src/gcode/control/M997.cpp @@ -24,8 +24,8 @@ #if ENABLED(PLATFORM_M997_SUPPORT) -#if ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/e3v2/proui/dwin.h" +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" #endif /** @@ -33,7 +33,7 @@ */ void GcodeSuite::M997() { - TERN_(DWIN_LCD_PROUI, dwinRebootScreen()); + TERN_(EXTENSIBLE_UI, ExtUI::onFirmwareFlash()); flashFirmware(parser.intval('S')); diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp index c735b72cedbb..c70bf7667ff8 100644 --- a/Marlin/src/gcode/feature/powerloss/M1000.cpp +++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp @@ -37,8 +37,6 @@ #include "../../../lcd/extui/ui_api.h" #elif ENABLED(DWIN_CREALITY_LCD) #include "../../../lcd/e3v2/creality/dwin.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../../lcd/e3v2/proui/dwin.h" #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) #include "../../../lcd/e3v2/jyersui/dwin.h" // Temporary fix until it can be better implemented #endif @@ -76,12 +74,12 @@ void GcodeSuite::M1000() { if (!force_resume && parser.seen_test('S')) { #if HAS_MARLINUI_MENU ui.goto_screen(menu_job_recovery); - #elif HAS_DWIN_E3V2_BASIC - recovery.dwin_flag = true; - #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) // Temporary fix until it can be better implemented - jyersDWIN.popupHandler(Popup_Resume); #elif ENABLED(EXTENSIBLE_UI) ExtUI::onPowerLossResume(); + #elif HAS_PLR_UI_FLAG + recovery.ui_flag_resume = true; + #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) // Temporary fix until it can be better implemented + jyersDWIN.popupHandler(Popup_Resume); #else SERIAL_ECHO_MSG("Resume requires LCD."); #endif diff --git a/Marlin/src/gcode/lcd/M0_M1.cpp b/Marlin/src/gcode/lcd/M0_M1.cpp index fcab61b59d92..c600bd5da659 100644 --- a/Marlin/src/gcode/lcd/M0_M1.cpp +++ b/Marlin/src/gcode/lcd/M0_M1.cpp @@ -35,9 +35,6 @@ #include "../../lcd/marlinui.h" #elif ENABLED(EXTENSIBLE_UI) #include "../../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/e3v2/proui/dwin_popup.h" - #include "../../lcd/e3v2/proui/dwin.h" #endif #if ENABLED(HOST_PROMPT_SUPPORT) @@ -66,16 +63,20 @@ void GcodeSuite::M0_M1() { #endif } + #elif ENABLED(DWIN_LCD_PROUI) // ExtUI with icon, string, button title + + if (parser.string_arg) + ExtUI::onUserConfirmRequired(ICON_Continue_1, parser.string_arg, GET_TEXT_F(MSG_USERWAIT)); + else + ExtUI::onUserConfirmRequired(ICON_Stop_1, GET_TEXT_F(MSG_STOPPED), GET_TEXT_F(MSG_USERWAIT)); + #elif ENABLED(EXTENSIBLE_UI) + if (parser.string_arg) ExtUI::onUserConfirmRequired(parser.string_arg); // String in an SRAM buffer else ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_USERWAIT)); - #elif ENABLED(DWIN_LCD_PROUI) - if (parser.string_arg) - dwinPopupConfirm(ICON_BLTouch, parser.string_arg, GET_TEXT_F(MSG_USERWAIT)); - else - dwinPopupConfirm(ICON_BLTouch, GET_TEXT_F(MSG_STOPPED), GET_TEXT_F(MSG_USERWAIT)); + #else if (parser.string_arg) { diff --git a/Marlin/src/gcode/lcd/M73.cpp b/Marlin/src/gcode/lcd/M73.cpp index 5ac2839beb4e..6f7447624098 100644 --- a/Marlin/src/gcode/lcd/M73.cpp +++ b/Marlin/src/gcode/lcd/M73.cpp @@ -29,10 +29,6 @@ #include "../../sd/cardreader.h" #include "../../libs/numtostr.h" -#if ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/e3v2/proui/dwin.h" -#endif - /** * M73: Set percentage complete (for display on LCD) * diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp index e83df544c863..3ce37bed05d3 100644 --- a/Marlin/src/gcode/probe/G30.cpp +++ b/Marlin/src/gcode/probe/G30.cpp @@ -34,6 +34,10 @@ #include "../../feature/probe_temp_comp.h" #endif +#if ANY(DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) + #define VERBOSE_SINGLE_PROBE +#endif + /** * G30: Do a single Z probe at the given XY (default: current) * @@ -66,9 +70,7 @@ void GcodeSuite::G30() { remember_feedrate_scaling_off(); - #if ANY(DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) - process_subcommands_now(F("G28O")); - #endif + TERN_(VERBOSE_SINGLE_PROBE, process_subcommands_now(F("G28O"))); const ProbePtRaise raise_after = parser.boolval('E', true) ? PROBE_PT_STOW : PROBE_PT_NONE; @@ -83,9 +85,7 @@ void GcodeSuite::G30() { F( " Z:"), p_float_t(measured_z, 3) ); msg.echoln(); - #if ANY(DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) - ui.set_status(msg); - #endif + TERN_(VERBOSE_SINGLE_PROBE, ui.set_status(msg)); } restore_feedrate_and_scaling(); diff --git a/Marlin/src/gcode/sd/M524.cpp b/Marlin/src/gcode/sd/M524.cpp index a3c03e90bab6..61185b7e0bed 100644 --- a/Marlin/src/gcode/sd/M524.cpp +++ b/Marlin/src/gcode/sd/M524.cpp @@ -27,8 +27,8 @@ #include "../gcode.h" #include "../../sd/cardreader.h" -#if ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/marlinui.h" +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" #endif /** @@ -36,9 +36,9 @@ */ void GcodeSuite::M524() { - #if ENABLED(DWIN_LCD_PROUI) + #if ENABLED(EXTENSIBLE_UI) - ui.abort_print(); + ExtUI::stopPrint(); // Calls ui.abort_print() which does the same as below #else diff --git a/Marlin/src/gcode/stats/M75-M78.cpp b/Marlin/src/gcode/stats/M75-M78.cpp index bced97351dac..03e76d531d60 100644 --- a/Marlin/src/gcode/stats/M75-M78.cpp +++ b/Marlin/src/gcode/stats/M75-M78.cpp @@ -35,10 +35,14 @@ /** * M75: Start print timer + * + * ProUI: If the print fails to start and any text is + * included in the command, print it in the header. */ void GcodeSuite::M75() { - startOrResumeJob(); + startOrResumeJob(); // ... ExtUI::onPrintTimerStarted() #if ENABLED(DWIN_LCD_PROUI) + // TODO: Remove if M75 is never used if (!IS_SD_PRINTING()) dwinPrintHeader(parser.string_arg && parser.string_arg[0] ? parser.string_arg : GET_TEXT(MSG_HOST_START_PRINT)); #endif } @@ -47,7 +51,7 @@ void GcodeSuite::M75() { * M76: Pause print timer */ void GcodeSuite::M76() { - TERN(DWIN_LCD_PROUI, ui.pause_print(), print_job_timer.pause()); + print_job_timer.pause(); // ... ExtUI::onPrintTimerPaused() TERN_(HOST_PAUSE_M76, hostui.pause()); } diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index 24702d65f099..730ec65ba439 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -31,8 +31,6 @@ #if ENABLED(EXTENSIBLE_UI) #include "../../lcd/extui/ui_api.h" -#elif ENABLED(PROUI_PID_TUNE) - #include "../../lcd/e3v2/proui/dwin.h" #endif /** @@ -68,8 +66,7 @@ void GcodeSuite::M303() { default: SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_BAD_HEATER_ID); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_BAD_HEATER_ID)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_BAD_HEATER_ID)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::pidresult_t::PID_BAD_HEATER_ID)); return; } @@ -79,7 +76,7 @@ void GcodeSuite::M303() { const celsius_t temp = seenS ? parser.value_celsius() : default_temp; const bool u = parser.boolval('U'); - TERN_(PROUI_PID_TUNE, dwinStartM303(seenC, c, seenS, hid, temp)); + TERN_(EXTENSIBLE_UI, ExtUI::onStartM303(c, hid, temp)); IF_DISABLED(BUSY_WHILE_HEATING, KEEPALIVE_STATE(NOT_BUSY)); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index af2ea772c3db..92799b7cd48b 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1035,16 +1035,13 @@ #endif // Extensible UI serial touch screens. (See src/lcd/extui) -#if ANY(HAS_DGUS_LCD, MALYAN_LCD, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, NEXTION_TFT, TOUCH_UI_FTDI_EVE) +#if ANY(HAS_DGUS_LCD, MALYAN_LCD, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, NEXTION_TFT, TOUCH_UI_FTDI_EVE, DWIN_LCD_PROUI) #define IS_EXTUI 1 // Just for sanity check. #define EXTENSIBLE_UI #endif // Aliases for LCD features -#if ANY(DWIN_CREALITY_LCD, DWIN_LCD_PROUI) - #define HAS_DWIN_E3V2_BASIC 1 -#endif -#if ANY(HAS_DWIN_E3V2_BASIC, DWIN_CREALITY_LCD_JYERSUI) +#if ANY(DWIN_CREALITY_LCD, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) #define HAS_DWIN_E3V2 1 #endif @@ -1058,6 +1055,7 @@ #if ENABLED(DWIN_LCD_PROUI) #define DO_LIST_BIN_FILES 1 #define LCD_BRIGHTNESS_DEFAULT 127 + #define STATUS_DO_CLEAR_EMPTY #endif // Serial Controllers require LCD_SERIAL_PORT @@ -1092,6 +1090,7 @@ * - draw_kill_screen * - kill_screen * - draw_status_message + * (calling advance_status_scroll, status_and_len for a scrolling status message) */ #define HAS_DISPLAY 1 #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 4f74fa006718..5f983c60f388 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -323,6 +323,13 @@ #define HAS_LINEAR_E_JERK 1 #endif +// Some displays can toggle Adaptive Step Smoothing. +// The state is saved to EEPROM. +// In future this may be added to a G-code such as M205 A. +#if ALL(ADAPTIVE_STEP_SMOOTHING, DWIN_LCD_PROUI) + #define ADAPTIVE_STEP_SMOOTHING_TOGGLE +#endif + /** * Temperature Sensors; define what sensor(s) we have. */ @@ -1381,6 +1388,11 @@ #endif // Power-Loss Recovery -#if ENABLED(POWER_LOSS_RECOVERY) && defined(PLR_BED_THRESHOLD) - #define HAS_PLR_BED_THRESHOLD 1 +#if ENABLED(POWER_LOSS_RECOVERY) + #ifdef PLR_BED_THRESHOLD + #define HAS_PLR_BED_THRESHOLD 1 + #endif + #if ANY(DWIN_CREALITY_LCD, DWIN_LCD_PROUI) + #define HAS_PLR_UI_FLAG 1 // recovery.ui_flag_resume + #endif #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 2683312976b2..64c95fa6c413 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2487,9 +2487,6 @@ // PID heating #if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER) #define HAS_PID_HEATING 1 - #if ENABLED(DWIN_LCD_PROUI) && ANY(PIDTEMP, PIDTEMPBED) - #define PROUI_PID_TUNE 1 - #endif #endif // Thermal protection @@ -3047,8 +3044,8 @@ * Advanced Pause - Filament Change */ #if ENABLED(ADVANCED_PAUSE_FEATURE) - #if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) || ALL(EMERGENCY_PARSER, HOST_PROMPT_SUPPORT) - #define M600_PURGE_MORE_RESUMABLE 1 + #if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI, DWIN_CREALITY_LCD_JYERSUI) || ALL(EMERGENCY_PARSER, HOST_PROMPT_SUPPORT) + #define M600_PURGE_MORE_RESUMABLE 1 // UI provides some way to Purge More / Resume #endif #ifndef FILAMENT_CHANGE_SLOW_LOAD_LENGTH #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index 59df915f496e..9025395f5600 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -28,7 +28,7 @@ #include "../../inc/MarlinConfigPre.h" #include -#include "HAL_LCD_class_defines.h" +#include "u8g/HAL_LCD_class_defines.h" //#define ALTERNATIVE_LCD diff --git a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h b/Marlin/src/lcd/dogm/u8g/HAL_LCD_class_defines.h similarity index 99% rename from Marlin/src/lcd/dogm/HAL_LCD_class_defines.h rename to Marlin/src/lcd/dogm/u8g/HAL_LCD_class_defines.h index f07064ea7165..907fa43c9bd7 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h +++ b/Marlin/src/lcd/dogm/u8g/HAL_LCD_class_defines.h @@ -21,7 +21,7 @@ */ #pragma once -#include "../../inc/MarlinConfig.h" +#include "../../../inc/MarlinConfig.h" // use this file to create the public interface for device drivers that are NOT in the U8G library diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/u8g/HAL_LCD_com_defines.h similarity index 97% rename from Marlin/src/lcd/dogm/HAL_LCD_com_defines.h rename to Marlin/src/lcd/dogm/u8g/HAL_LCD_com_defines.h index a70e2b7b8b66..e94c75380770 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/u8g/HAL_LCD_com_defines.h @@ -27,7 +27,7 @@ #include -#include HAL_PATH(../.., u8g/LCD_defines.h) +#include HAL_PATH(../../.., u8g/LCD_defines.h) #if HAS_FSMC_GRAPHICAL_TFT || HAS_SPI_GRAPHICAL_TFT || HAS_LTDC_GRAPHICAL_TFT uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp similarity index 99% rename from Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp index 5865bb11873b..4cd9b8f3c06d 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp @@ -65,7 +65,7 @@ * beginning. */ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp similarity index 99% rename from Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp index 6d40ea0d4b47..4aa90d5e8e82 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp @@ -20,7 +20,7 @@ * */ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp similarity index 99% rename from Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp index 6c7066179eb0..61a1e214bd66 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp @@ -53,7 +53,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "../../inc/MarlinConfig.h" +#include "../../../inc/MarlinConfig.h" #if HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp similarity index 99% rename from Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp index d5f1be18ec95..fb9d4b7ad657 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp @@ -53,7 +53,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if HAS_MARLINUI_U8GLIB && DISABLED(TFT_CLASSIC_UI) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp similarity index 98% rename from Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp index 51bbee78b9df..dcf835a6cbb4 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp @@ -53,12 +53,12 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "../../inc/MarlinConfig.h" +#include "../../../inc/MarlinConfig.h" #if HAS_MARLINUI_U8GLIB && (PIN_EXISTS(FSMC_CS) || HAS_SPI_GRAPHICAL_TFT || HAS_LTDC_GRAPHICAL_TFT) #include "HAL_LCD_com_defines.h" -#include "marlinui_DOGM.h" +#include "../marlinui_DOGM.h" #include @@ -66,7 +66,7 @@ #define HAS_LCD_IO 1 #endif -#include "../tft_io/tft_io.h" +#include "../../tft_io/tft_io.h" TFT_IO tftio; #define WIDTH LCD_PIXEL_WIDTH @@ -74,12 +74,12 @@ TFT_IO tftio; #define PAGE_HEIGHT 8 #if ENABLED(TOUCH_SCREEN_CALIBRATION) - #include "../tft_io/touch_calibration.h" - #include "../marlinui.h" + #include "../../tft_io/touch_calibration.h" + #include "../../marlinui.h" #endif -#include "../touch/touch_buttons.h" -#include "../scaled_tft.h" +#include "../../touch/touch_buttons.h" +#include "../../scaled_tft.h" #define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1) #define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1) diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp similarity index 99% rename from Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp index 172afbd76647..95ae2810f256 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp @@ -53,7 +53,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp similarity index 98% rename from Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp rename to Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp index 11cd7b14ba55..cd7445e01997 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -23,11 +23,11 @@ // NOTE - the HAL version of the rrd device uses a generic ST7920 device. // See u8g_dev_st7920_128x64_HAL.cpp for the HAL version. -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if ANY(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) -#include "../../inc/MarlinConfig.h" +#include "../../../inc/MarlinConfig.h" #if IS_U8GLIB_ST7920 @@ -184,7 +184,7 @@ u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_rrd_st7920_128x64_fn, &u8 #pragma GCC reset_options #if ENABLED(LIGHTWEIGHT_UI) - #include "../../HAL/shared/HAL_ST7920.h" + #include "../../../HAL/shared/HAL_ST7920.h" void ST7920_cs() { ST7920_CS(); } void ST7920_ncs() { ST7920_NCS(); } void ST7920_set_cmd() { ST7920_SET_CMD(); } diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.h similarity index 96% rename from Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h rename to Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.h index 9a565fc2efb9..f965913341a7 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h +++ b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.h @@ -24,8 +24,8 @@ // NOTE - the HAL version of the rrd device uses a generic ST7920 device. See the // file u8g_dev_st7920_128x64_HAL.cpp for the HAL version. -#include "../../inc/MarlinConfig.h" -#include "../../HAL/shared/Delay.h" +#include "../../../inc/MarlinConfig.h" +#include "../../../HAL/shared/Delay.h" #define ST7920_CLK_PIN LCD_PINS_D4 #define ST7920_DAT_PIN LCD_PINS_EN diff --git a/Marlin/src/lcd/e3v2/common/dwin_api.cpp b/Marlin/src/lcd/e3v2/common/dwin_api.cpp index 342289e99329..1688b2423053 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_api.cpp +++ b/Marlin/src/lcd/e3v2/common/dwin_api.cpp @@ -153,21 +153,23 @@ void dwinFrameClear(const uint16_t color) { dwinSend(i); } -// Draw a point -// color: point color -// width: point width 0x01-0x0F -// height: point height 0x01-0x0F -// x,y: upper left point -void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y) { - size_t i = 0; - dwinByte(i, 0x02); - dwinWord(i, color); - dwinByte(i, width); - dwinByte(i, height); - dwinWord(i, x); - dwinWord(i, y); - dwinSend(i); -} +#if DISABLED(TJC_DISPLAY) + // Draw a point + // color: point color + // width: point width 0x01-0x0F + // height: point height 0x01-0x0F + // x,y: upper left point + void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y) { + size_t i = 0; + dwinByte(i, 0x02); + dwinWord(i, color); + dwinByte(i, width); + dwinByte(i, height); + dwinWord(i, x); + dwinWord(i, y); + dwinSend(i); + } +#endif // Draw a line // color: Line segment color diff --git a/Marlin/src/lcd/e3v2/common/dwin_api.h b/Marlin/src/lcd/e3v2/common/dwin_api.h index dd4fccbcc5ff..48785150328f 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_api.h +++ b/Marlin/src/lcd/e3v2/common/dwin_api.h @@ -113,13 +113,6 @@ void dwinUpdateLCD(); // color: Clear screen color void dwinFrameClear(const uint16_t color); -// Draw a point -// color: point color -// width: point width 0x01-0x0F -// height: point height 0x01-0x0F -// x,y: upper left point -void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y); - // Draw a line // color: Line segment color // xStart/yStart: Start point @@ -158,6 +151,19 @@ inline void dwinDrawBox(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t dwinDrawRectangle(mode, color, xStart, yStart, xStart + xSize - 1, yStart + ySize - 1); } +// Draw a point +// color: point color +// width: point width 0x01-0x0F +// height: point height 0x01-0x0F +// x,y: upper left point +#if ENABLED(TJC_DISPLAY) + inline void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y) { + dwinDrawBox(1, color, x, y, 1, 1); + } +#else + void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y); +#endif + // Move a screen area // mode: 0, circle shift; 1, translation // dir: 0=left, 1=right, 2=up, 3=down diff --git a/Marlin/src/lcd/e3v2/common/dwin_set.h b/Marlin/src/lcd/e3v2/common/dwin_set.h index ada7dec71fea..f32d0e6d9e43 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_set.h +++ b/Marlin/src/lcd/e3v2/common/dwin_set.h @@ -130,7 +130,7 @@ #define ICON_Folder ICON_More #define ICON_AdvSet ICON_Language -#define ICON_HomeOffset ICON_AdvSet +#define ICON_HomeOffset ICON_PrintSize #define ICON_HomeOffsetX ICON_StepX #define ICON_HomeOffsetY ICON_StepY #define ICON_HomeOffsetZ ICON_StepZ @@ -138,8 +138,8 @@ #define ICON_ProbeOffsetX ICON_StepX #define ICON_ProbeOffsetY ICON_StepY #define ICON_ProbeOffsetZ ICON_StepZ -#define ICON_PIDNozzle ICON_SetEndTemp -#define ICON_PIDBed ICON_SetBedTemp +#define ICON_PIDNozzle ICON_HotendTemp +#define ICON_PIDBed ICON_BedTemp #define ICON_FWRetract ICON_StepE #define ICON_FWRetLength ICON_StepE #define ICON_FWRetSpeed ICON_Setspeed diff --git a/Marlin/src/lcd/e3v2/creality/dwin.cpp b/Marlin/src/lcd/e3v2/creality/dwin.cpp index 08161dffaf9b..9ecfbfe1faed 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -4169,8 +4169,8 @@ void eachMomentUpdate() { gotoMainMenu(); } #if ENABLED(POWER_LOSS_RECOVERY) - else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off - recovery.dwin_flag = false; + else if (DWIN_lcd_sd_status && recovery.ui_flag_resume) { // Resume interrupted print + recovery.ui_flag_resume = false; auto update_selection = [&](const bool sel) { hmiFlag.select_flag = sel; @@ -4197,7 +4197,7 @@ void eachMomentUpdate() { if (encoder_diffState == ENCODER_DIFF_ENTER) { recovery_flag = false; if (hmiFlag.select_flag) break; - TERN_(POWER_LOSS_RECOVERY, queue.inject(F("M1000C"))); + queue.inject(F("M1000C")); hmiStartFrame(true); return; } diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index b65adbb78043..bb345e519155 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -158,6 +158,8 @@ #define MAX_ETEMP thermalManager.hotend_max_target(0) #define MIN_BEDTEMP 0 #define MAX_BEDTEMP BED_MAX_TARGET +#define MIN_CHAMBERTEMP 0 +#define MAX_CHAMBERTEMP CHAMBER_MAX_TARGET #define DWIN_VAR_UPDATE_INTERVAL 500 #define DWIN_UPDATE_INTERVAL 1000 @@ -243,11 +245,16 @@ Menu *stepsMenu = nullptr; #if ANY(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) Menu *hotendMPCMenu = nullptr; #endif -#if ENABLED(PIDTEMP) && ANY(PID_EDIT_MENU, PID_AUTOTUNE_MENU) - Menu *hotendPIDMenu = nullptr; -#endif -#if ENABLED(PIDTEMPBED) && ANY(PID_EDIT_MENU, PID_AUTOTUNE_MENU) - Menu *bedPIDMenu = nullptr; +#if ANY(PID_EDIT_MENU, PID_AUTOTUNE_MENU) + #if ENABLED(PIDTEMP) + Menu *hotendPIDMenu = nullptr; + #endif + #if ENABLED(PIDTEMPBED) + Menu *bedPIDMenu = nullptr; + #endif + #if ENABLED(PIDTEMPCHAMBER) + Menu *chamberPIDMenu = nullptr; + #endif #endif #if CASELIGHT_USES_BRIGHTNESS Menu *caseLightMenu = nullptr; @@ -418,49 +425,50 @@ void popupPauseOrStop() { drawSelectHighlight(true); dwinUpdateLCD(); } - else - dwinPopupConfirmCancel(ICON_BLTouch, select_print.now == PRINT_PAUSE_RESUME ? GET_TEXT_F(MSG_PAUSE_PRINT) : GET_TEXT_F(MSG_STOP_PRINT)); -} - -#if HAS_HOTEND - - void popupETempTooLow() { - if (hmiIsChinese()) { - hmiSaveProcessID(ID_WaitResponse); - DWINUI::clearMainArea(); - drawPopupBkgd(); - DWINUI::drawIcon(ICON_TempTooLow, 102, 105); - dwinFrameAreaCopy(1, 103, 371, 136, 386, 69, 240); - dwinFrameAreaCopy(1, 170, 371, 270, 386, 102, 240); - DWINUI::drawIconWB(ICON_Confirm_C, 86, 280); - dwinUpdateLCD(); + else { + switch (select_print.now) { + case PRINT_PAUSE_RESUME: dwinPopupConfirmCancel(ICON_Pause_1, GET_TEXT_F(MSG_PAUSE_PRINT)); break; + case PRINT_STOP: dwinPopupConfirmCancel(ICON_Stop_1, GET_TEXT_F(MSG_STOP_PRINT)); break; + default: break; } - else - dwinPopupConfirm(ICON_TempTooLow, GET_TEXT_F(MSG_HOTEND_TOO_COLD), GET_TEXT_F(MSG_PLEASE_PREHEAT)); } +} -#endif - -#if HAS_HOTEND || HAS_HEATED_BED - void dwinPopupTemperature(const bool toohigh) { +#if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER + void dwinPopupTemperature(const int_fast8_t heater_id, const uint8_t state) { hmiSaveProcessID(ID_WaitResponse); if (hmiIsChinese()) { DWINUI::clearMainArea(); drawPopupBkgd(); - if (toohigh) { + if (state == 1) { DWINUI::drawIcon(ICON_TempTooHigh, 102, 165); dwinFrameAreaCopy(1, 103, 371, 237, 386, 52, 285); dwinFrameAreaCopy(1, 151, 389, 185, 402, 187, 285); dwinFrameAreaCopy(1, 189, 389, 271, 402, 95, 310); } - else { + else if (state == 0) { DWINUI::drawIcon(ICON_TempTooLow, 102, 165); dwinFrameAreaCopy(1, 103, 371, 270, 386, 52, 285); dwinFrameAreaCopy(1, 189, 389, 271, 402, 95, 310); } + else { + // Chinese "Temp Error" + } + } + else { + FSTR_P heaterstr = nullptr; + if (TERN0(HAS_HEATED_BED, heater_id == H_BED)) heaterstr = F("Bed"); + else if (TERN0(HAS_HEATED_CHAMBER, heater_id == H_CHAMBER)) heaterstr = F("Chamber"); + else if (TERN0(HAS_HOTEND, heater_id >= 0)) heaterstr = F("Nozzle"); + FSTR_P errorstr; + uint8_t icon; + switch (state) { + case 0: errorstr = GET_TEXT_F(MSG_TEMP_TOO_LOW); icon = ICON_TempTooLow; break; + case 1: errorstr = GET_TEXT_F(MSG_TEMP_TOO_HIGH); icon = ICON_TempTooHigh; break; + default: errorstr = GET_TEXT_F(MSG_ERR_HEATING_FAILED); icon = ICON_Temperature; break; // May be thermal runaway, temp malfunction, etc. + } + dwinShowPopup(icon, heaterstr, errorstr, BTN_Continue); } - else - dwinShowPopup(toohigh ? ICON_TempTooHigh : ICON_TempTooLow, F("Nozzle or Bed temperature"), toohigh ? F("is too high") : F("is too low"), BTN_Continue); } #endif @@ -581,16 +589,17 @@ void ICON_ResumeOrPause() { if (checkkey == ID_PrintProcess) (print_job_timer.isPaused() || hmiFlag.pause_flag) ? ICON_Resume() : ICON_Pause(); } -// Update filename on print -void dwinPrintHeader(const char *text = nullptr) { +// Print a string (up to 30 characters) in the header, +// e.g., The filename or string sent with M75. +void dwinPrintHeader(const char * const cstr/*=nullptr*/) { static char headertxt[31] = ""; // Print header text - if (text) { - const int8_t size = _MIN(30U, strlen_P(text)); - for (uint8_t i = 0; i < size; ++i) headertxt[i] = text[i]; + if (cstr) { + const int8_t size = _MIN(30U, strlen(cstr)); + for (uint8_t i = 0; i < size; ++i) headertxt[i] = cstr[i]; headertxt[size] = '\0'; } if (checkkey == ID_PrintProcess || checkkey == ID_PrintDone) { - dwinDrawRectangle(1, hmiData.colorBackground, 0, 60, DWIN_WIDTH, 60+16); + dwinDrawRectangle(1, hmiData.colorBackground, 0, 60, DWIN_WIDTH, 60 + 16); DWINUI::drawCenteredString(60, headertxt); } } @@ -601,7 +610,7 @@ void drawPrintProcess() { else title.showCaption(GET_TEXT_F(MSG_PRINTING)); DWINUI::clearMainArea(); - dwinPrintHeader(nullptr); + dwinPrintHeader(); drawPrintLabels(); DWINUI::drawIcon(ICON_PrintTime, 15, 173); DWINUI::drawIcon(ICON_RemainTime, 150, 171); @@ -629,7 +638,7 @@ void drawPrintDone() { TERN_(SET_REMAINING_TIME, ui.reset_remaining_time()); title.showCaption(GET_TEXT_F(MSG_PRINT_DONE)); DWINUI::clearMainArea(); - dwinPrintHeader(nullptr); + dwinPrintHeader(); #if HAS_GCODE_PREVIEW const bool haspreview = preview.valid(); if (haspreview) { @@ -1031,7 +1040,7 @@ void hmiSDCardUpdate() { currentMenu = nullptr; drawPrintFileMenu(); } - if (!DWIN_lcd_sd_status && sdPrinting()) ui.abort_print(); // Media removed while printing + if (!DWIN_lcd_sd_status && sdPrinting()) ExtUI::stopPrint(); // Media removed while printing } } @@ -1060,7 +1069,7 @@ void dwinDrawDashboard() { #endif #if HAS_HEATED_BED - DWINUI::drawIcon(ICON_BedTemp, 10, 416); + DWINUI::drawIcon(ICON_SetBedTemp, 10, 416); DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 28, 417, thermalManager.wholeDegBed()); DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 25 + 3 * STAT_CHR_W + 5, 417, F("/")); DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 25 + 4 * STAT_CHR_W + 6, 417, thermalManager.degTargetBed()); @@ -1155,8 +1164,8 @@ void hmiMainMenu() { // Pause or Stop popup void onClickPauseOrStop() { switch (select_print.now) { - case PRINT_PAUSE_RESUME: if (hmiFlag.select_flag) ui.pause_print(); break; // Confirm pause - case PRINT_STOP: if (hmiFlag.select_flag) ui.abort_print(); break; // Stop confirmed then abort print + case PRINT_PAUSE_RESUME: if (hmiFlag.select_flag) ExtUI::pausePrint(); break; // Confirm pause + case PRINT_STOP: if (hmiFlag.select_flag) ExtUI::stopPrint(); break; // Stop confirmed then abort print default: break; } return gotoPrintProcess(); @@ -1190,7 +1199,7 @@ void hmiPrinting() { case PRINT_SETUP: drawTuneMenu(); break; case PRINT_PAUSE_RESUME: if (printingIsPaused()) { // If printer is already in pause - ui.resume_print(); + ExtUI::resumePrint(); break; } else @@ -1213,6 +1222,20 @@ void drawMainArea() { #if HAS_ESDIAG case ID_ESDiagProcess: drawEndStopDiag(); break; #endif + #if ENABLED(PROUI_ITEM_PLOT) + case ID_PlotProcess: + switch (hmiValue.tempControl) { + #if ENABLED(PIDTEMP) + case PIDTEMP_START: drawHPlot(); break; + #endif + #if ENABLED(PIDTEMPBED) + case PIDTEMPBED_START: drawBPlot(); break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case PIDTEMPCHAMBER_START: drawCPlot(); break; + #endif + } break; + #endif case ID_Popup: popupDraw(); break; #if HAS_LOCKSCREEN case ID_Locked: lockScreen.draw(); break; @@ -1280,12 +1303,14 @@ void eachMomentUpdate() { if (checkkey == ID_PIDProcess) { TERN_(PIDTEMP, if (hmiValue.tempControl == PIDTEMP_START) plot.update(thermalManager.wholeDegHotend(0))); TERN_(PIDTEMPBED, if (hmiValue.tempControl == PIDTEMPBED_START) plot.update(thermalManager.wholeDegBed())); + TERN_(PIDTEMPCHAMBER, if (hmiValue.tempControl == PIDTEMPCHAMBER_START) plot.update(thermalManager.wholeDegChamber())); } TERN_(MPCTEMP, if (checkkey == ID_MPCProcess) plot.update(thermalManager.wholeDegHotend(0))); #if ENABLED(PROUI_ITEM_PLOT) if (checkkey == ID_PlotProcess) { TERN_(PIDTEMP, if (hmiValue.tempControl == PIDTEMP_START) { plot.update(thermalManager.wholeDegHotend(0)); }) TERN_(PIDTEMPBED, if (hmiValue.tempControl == PIDTEMPBED_START) { plot.update(thermalManager.wholeDegBed()); }) + TERN_(PIDTEMPCHAMBER, if (hmiValue.tempControl == PIDTEMPCHAMBER_START) { plot.update(thermalManager.wholeDegChamber()); }) TERN_(MPCTEMP, if (hmiValue.tempControl == MPCTEMP_START) { plot.update(thermalManager.wholeDegHotend(0)); }) if (hmiFlag.abort_flag || hmiFlag.pause_flag || print_job_timer.isPaused()) { hmiReturnScreen(); @@ -1357,8 +1382,8 @@ void eachMomentUpdate() { drawPrintProgressElapsed(); } } - #if ENABLED(POWER_LOSS_RECOVERY) - else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // Resume print before power off + #if HAS_PLR_UI_FLAG + else if (DWIN_lcd_sd_status && recovery.ui_flag_resume) { // Resume interrupted print return gotoPowerLossRecovery(); } #endif @@ -1368,6 +1393,7 @@ void eachMomentUpdate() { } #if ENABLED(POWER_LOSS_RECOVERY) + void popupPowerLossRecovery() { DWINUI::clearMainArea(); drawPopupBkgd(); @@ -1407,7 +1433,7 @@ void eachMomentUpdate() { } void gotoPowerLossRecovery() { - recovery.dwin_flag = false; + recovery.ui_flag_resume = false; LCD_MESSAGE(MSG_CONTINUE_PRINT_JOB); gotoPopup(popupPowerLossRecovery, onClickPowerLossRecovery); } @@ -1435,7 +1461,8 @@ void dwinHandleScreen() { TERN_(HAS_BED_PROBE, case ID_Leveling:) case ID_Homing: - case ID_PIDProcess: + TERN_(HAS_PID_HEATING, case ID_PIDProcess:) + TERN_(MPCTEMP, case ID_MPCProcess:) case ID_NothingToDo: default: break; } @@ -1449,7 +1476,9 @@ bool idIsPopUp() { // If ID is popup... case ID_WaitResponse: case ID_Popup: case ID_Homing: - case ID_PIDProcess: + TERN_(HAS_PID_HEATING, case ID_PIDProcess:) + TERN_(MPCTEMP, case ID_MPCProcess:) + TERN_(PROUI_ITEM_PLOT, case ID_PlotProcess:) return true; default: break; } @@ -1482,7 +1511,11 @@ void dwinHomingStart() { hmiFlag.home_flag = true; hmiSaveProcessID(ID_Homing); title.showCaption(GET_TEXT_F(MSG_HOMING)); - dwinShowPopup(ICON_BLTouch, GET_TEXT_F(MSG_HOMING), GET_TEXT_F(MSG_PLEASE_WAIT)); + #if ANY(TJC_DISPLAY, DACAI_DISPLAY) + dwinShowPopup(ICON_BLTouch, GET_TEXT_F(MSG_HOMING), GET_TEXT_F(MSG_PLEASE_WAIT)); + #else + dwinShowPopup(ICON_Printer_0, GET_TEXT_F(MSG_HOMING), GET_TEXT_F(MSG_PLEASE_WAIT)); + #endif } void dwinHomingDone() { @@ -1499,22 +1532,7 @@ void dwinLevelingStart() { title.showCaption(GET_TEXT_F(MSG_BED_LEVELING)); dwinShowPopup(ICON_AutoLeveling, GET_TEXT_F(MSG_BED_LEVELING), GET_TEXT_F(MSG_PLEASE_WAIT)); #if ALL(AUTO_BED_LEVELING_UBL, PREHEAT_BEFORE_LEVELING) - #if HAS_BED_PROBE - if (!DEBUGGING(DRYRUN)) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, hmiData.bedLevT); - #else - #if HAS_HOTEND - if (!DEBUGGING(DRYRUN) && thermalManager.degTargetHotend(0) < LEVELING_NOZZLE_TEMP) { - thermalManager.setTargetHotend(LEVELING_NOZZLE_TEMP, 0); - thermalManager.wait_for_hotend(0); - } - #endif - #if HAS_HEATED_BED - if (!DEBUGGING(DRYRUN) && thermalManager.degTargetBed() < hmiData.bedLevT) { - thermalManager.setTargetBed(hmiData.bedLevT); - thermalManager.wait_for_bed_heating(); - } - #endif - #endif + if (!DEBUGGING(DRYRUN)) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, hmiData.bedLevT); #endif #elif ENABLED(MESH_BED_LEVELING) drawManualMeshMenu(); @@ -1551,7 +1569,7 @@ void dwinLevelingDone() { case MPCTEMP_START: DWINUI::drawCenteredString(hmiData.colorPopupTxt, 70, GET_TEXT_F(MSG_MPC_AUTOTUNE)); DWINUI::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, F("MPC target: Celsius")); - DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, F("for NOZZLE is running.")); + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_NOZZLE)); _maxtemp = thermalManager.hotend_maxtemp[0]; _target = 200; break; @@ -1560,18 +1578,27 @@ void dwinLevelingDone() { case PIDTEMP_START: DWINUI::drawCenteredString(hmiData.colorPopupTxt, 70, GET_TEXT_F(MSG_PID_AUTOTUNE)); DWINUI::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, F("PID target: Celsius")); - DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, F("for NOZZLE is running.")); + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_NOZZLE)); _maxtemp = thermalManager.hotend_maxtemp[0]; - _target = hmiData.hotendPidT; + _target = hmiData.hotendPIDT; break; #endif #if ENABLED(PIDTEMPBED) case PIDTEMPBED_START: DWINUI::drawCenteredString(hmiData.colorPopupTxt, 70, GET_TEXT_F(MSG_PID_AUTOTUNE)); DWINUI::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, F("PID target: Celsius")); - DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, F("for BED is running.")); + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_BED)); _maxtemp = BED_MAXTEMP; - _target = hmiData.bedPidT; + _target = hmiData.bedPIDT; + break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case PIDTEMPCHAMBER_START: + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 70, GET_TEXT_F(MSG_PID_AUTOTUNE)); + DWINUI::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, F("PID target: Celsius")); + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_CHAMBER)); + _maxtemp = CHAMBER_MAXTEMP; + _target = hmiData.chamberPIDT; break; #endif } @@ -1585,7 +1612,7 @@ void dwinLevelingDone() { void dwinDrawPlot(tempcontrol_t result) { hmiValue.tempControl = result; - constexpr frame_rect_t gfrm = {30, 135, DWIN_WIDTH - 60, 160}; + constexpr frame_rect_t gfrm = { 30, 135, DWIN_WIDTH - 60, 160 }; DWINUI::clearMainArea(); drawPopupBkgd(); hmiSaveProcessID(ID_PlotProcess); @@ -1597,18 +1624,26 @@ void dwinLevelingDone() { case PIDTEMP_START: #endif title.showCaption(GET_TEXT_F(MSG_HOTEND_TEMP_GRAPH)); - DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, F("Nozzle Temperature")); + DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, GET_TEXT_F(MSG_TEMP_NOZZLE)); _maxtemp = thermalManager.hotend_max_target(0); _target = thermalManager.degTargetHotend(0); break; #if ENABLED(PIDTEMPBED) case PIDTEMPBED_START: title.showCaption(GET_TEXT_F(MSG_BED_TEMP_GRAPH)); - DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, F("Bed Temperature")); + DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, GET_TEXT_F(MSG_TEMP_BED)); _maxtemp = BED_MAX_TARGET; _target = thermalManager.degTargetBed(); break; #endif + #if ENABLED(PIDTEMPCHAMBER) + case PIDTEMPCHAMBER_START: + title.showCaption(GET_TEXT_F(MSG_CHAMBER_TEMP_GRAPH)); + DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, GET_TEXT_F(MSG_TEMP_CHAMBER)); + _maxtemp = CHAMBER_MAX_TARGET; + _target = thermalManager.degTargetChamber(); + break; + #endif default: break; } @@ -1616,7 +1651,6 @@ void dwinLevelingDone() { plot.draw(gfrm, _maxtemp, _target); DWINUI::drawInt(false, 2, hmiData.colorStatusTxt, hmiData.colorPopupBg, 3, gfrm.x + 80, gfrm.y - DWINUI::fontHeight() - 4, _target); DWINUI::drawButton(BTN_Continue, 86, 305); - dwinUpdateLCD(); } void drawHPlot() { @@ -1626,29 +1660,33 @@ void dwinLevelingDone() { void drawBPlot() { TERN_(PIDTEMPBED, dwinDrawPlot(PIDTEMPBED_START)); } + void drawCPlot() { + TERN_(PIDTEMPCHAMBER, dwinDrawPlot(PIDTEMPCHAMBER_START)); + } #endif // PROUI_ITEM_PLOT #endif // PROUI_TUNING_GRAPH -#if PROUI_PID_TUNE +#if HAS_PID_HEATING - void dwinStartM303(const bool seenC, const int c, const bool seenS, const heater_id_t hid, const celsius_t temp) { - if (seenC) hmiData.pidCycles = c; - if (seenS) { - switch (hid) { - #if ENABLED(PIDTEMP) - case 0 ... HOTENDS - 1: hmiData.hotendPidT = temp; break; - #endif - #if ENABLED(PIDTEMPBED) - case H_BED: hmiData.bedPidT = temp; break; - #endif - default: break; - } + void dwinStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + hmiData.pidCycles = count; + switch (hid) { + #if ENABLED(PIDTEMP) + case 0 ... HOTENDS - 1: hmiData.hotendPIDT = temp; break; + #endif + #if ENABLED(PIDTEMPBED) + case H_BED: hmiData.bedPIDT = temp; break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case H_CHAMBER: hmiData.chamberPIDT = temp; break; + #endif + default: break; } } - void dwinPidTuning(tempcontrol_t result) { + void dwinPIDTuning(tempcontrol_t result) { hmiValue.tempControl = result; switch (result) { #if ENABLED(PIDTEMP) @@ -1657,22 +1695,20 @@ void dwinLevelingDone() { #if PROUI_TUNING_GRAPH dwinDrawPIDMPCPopup(); #else - dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), F("for Nozzle is running.")); + dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_PID_FOR_NOZZLE)); #endif break; - case PID_TEMP_TOO_HIGH: - checkkey = last_checkkey; - dwinPopupConfirm(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE_FAILED), GET_TEXT_F(MSG_TEMP_TOO_HIGH)); - break; #endif #if ENABLED(PIDTEMPBED) case PIDTEMPBED_START: hmiSaveProcessID(ID_PIDProcess); - #if PROUI_TUNING_GRAPH - dwinDrawPIDMPCPopup(); - #else - dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), F("for BED is running.")); - #endif + dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_PID_FOR_BED)); + break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case PIDTEMPCHAMBER_START: + hmiSaveProcessID(ID_PIDProcess); + dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_PID_FOR_CHAMBER)); break; #endif case PID_BAD_HEATER_ID: @@ -1683,17 +1719,22 @@ void dwinLevelingDone() { checkkey = last_checkkey; dwinPopupConfirm(ICON_TempTooHigh, GET_TEXT_F(MSG_ERROR), GET_TEXT_F(MSG_PID_TIMEOUT)); break; + case PID_TEMP_TOO_HIGH: + checkkey = last_checkkey; + dwinPopupConfirm(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE_FAILED), GET_TEXT_F(MSG_TEMP_TOO_HIGH)); + break; case AUTOTUNE_DONE: checkkey = last_checkkey; dwinPopupConfirm(ICON_TempTooLow, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_BUTTON_DONE)); break; default: checkkey = last_checkkey; + dwinPopupConfirm(ICON_Info_0, GET_TEXT_F(MSG_ERROR), GET_TEXT_F(MSG_STOPPING)); break; } } -#endif // PROUI_PID_TUNE +#endif // HAS_PID_HEATING #if ENABLED(MPC_AUTOTUNE) @@ -1808,12 +1849,14 @@ void dwinSetColorDefaults() { hmiData.colorCoordinate = defColorCoordinate; } +static_assert(ExtUI::eeprom_data_size >= sizeof(hmi_data_t), "Insufficient space in EEPROM for UI parameters"); + void dwinSetDataDefaults() { dwinSetColorDefaults(); DWINUI::setColors(hmiData.colorText, hmiData.colorBackground, hmiData.colorStatusBg); - TERN_(PIDTEMP, hmiData.hotendPidT = DEF_HOTENDPIDT); - TERN_(PIDTEMPBED, hmiData.bedPidT = DEF_BEDPIDT); - TERN_(PROUI_PID_TUNE, hmiData.pidCycles = DEF_PIDCYCLES); + TERN_(PIDTEMP, hmiData.hotendPIDT = DEF_HOTENDPIDT); + TERN_(PIDTEMPBED, hmiData.bedPIDT = DEF_BEDPIDT); + TERN_(HAS_PID_HEATING, hmiData.pidCycles = DEF_PIDCYCLES); #if ENABLED(PREVENT_COLD_EXTRUSION) hmiData.extMinT = EXTRUDE_MINTEMP; applyExtMinT(); @@ -1835,12 +1878,11 @@ void dwinSetDataDefaults() { TERN_(LED_COLOR_PRESETS, leds.set_default()); applyLEDColor(); #endif - TERN_(ADAPTIVE_STEP_SMOOTHING, hmiData.adaptiveStepSmoothing = true); TERN_(HAS_GCODE_PREVIEW, hmiData.enablePreview = true); } void dwinCopySettingsTo(char * const buff) { - memcpy(buff, &hmiData, eeprom_data_size); + memcpy(buff, &hmiData, sizeof(hmi_data_t)); } void dwinCopySettingsFrom(const char * const buff) { @@ -1895,7 +1937,11 @@ void MarlinUI::update() { #endif void MarlinUI::kill_screen(FSTR_P const lcd_error, FSTR_P const) { - dwinDrawPopup(ICON_BLTouch, GET_TEXT_F(MSG_PRINTER_KILLED), lcd_error); + #if ANY(TJC_DISPLAY, DACAI_DISPLAY) + dwinDrawPopup(ICON_BLTouch, GET_TEXT_F(MSG_PRINTER_KILLED), lcd_error); + #else + dwinDrawPopup(ICON_Printer_0, GET_TEXT_F(MSG_PRINTER_KILLED), lcd_error); + #endif DWINUI::drawCenteredString(hmiData.colorPopupTxt, 270, GET_TEXT_F(MSG_TURN_OFF)); dwinUpdateLCD(); } @@ -1920,32 +1966,14 @@ void dwinRedrawScreen() { } #if ENABLED(ADVANCED_PAUSE_FEATURE) + void dwinPopupPause(FSTR_P const fmsg, uint8_t button/*=0*/) { hmiSaveProcessID(button ? ID_WaitResponse : ID_NothingToDo); - dwinShowPopup(ICON_BLTouch, GET_TEXT_F(MSG_ADVANCED_PAUSE), fmsg, button); - } - - void MarlinUI::pause_show_message(const PauseMessage message, const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/) { - if (mode != PAUSE_MODE_SAME) pause_mode = mode; - switch (message) { - case PAUSE_MESSAGE_PARKING: dwinPopupPause(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; // M125 - case PAUSE_MESSAGE_CHANGING: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; // pause_print (M125, M600) - case PAUSE_MESSAGE_WAITING: dwinPopupPause(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING), BTN_Continue); break; - case PAUSE_MESSAGE_INSERT: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT), BTN_Continue); break; - case PAUSE_MESSAGE_LOAD: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; - case PAUSE_MESSAGE_UNLOAD: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; // Unload of pause and Unload of M702 - case PAUSE_MESSAGE_PURGE: dwinPopupPause(GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE))); break; - case PAUSE_MESSAGE_OPTION: gotoFilamentPurge(); break; - case PAUSE_MESSAGE_RESUME: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; - case PAUSE_MESSAGE_HEAT: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT), BTN_Continue); break; - case PAUSE_MESSAGE_HEATING: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; - case PAUSE_MESSAGE_STATUS: hmiReturnScreen(); break; // Exit from Pause, Load and Unload - default: break; - } + dwinShowPopup(ICON_Pause_1, GET_TEXT_F(MSG_ADVANCED_PAUSE), fmsg, button); } void drawPopupFilamentPurge() { - dwinDrawPopup(ICON_BLTouch, GET_TEXT_F(MSG_ADVANCED_PAUSE), GET_TEXT_F(MSG_FILAMENT_CHANGE_PURGE_CONTINUE)); + dwinDrawPopup(ICON_AutoLeveling, GET_TEXT_F(MSG_ADVANCED_PAUSE), GET_TEXT_F(MSG_FILAMENT_CHANGE_PURGE_CONTINUE)); DWINUI::drawButton(BTN_Purge, 26, 280); DWINUI::drawButton(BTN_Continue, 146, 280); drawSelectHighlight(true); @@ -1970,7 +1998,7 @@ void dwinRedrawScreen() { #if HAS_MESH void dwinMeshViewer() { if (!leveling_is_valid()) - dwinPopupContinue(ICON_BLTouch, GET_TEXT_F(MSG_MESH_VIEWER), GET_TEXT_F(MSG_NO_VALID_MESH)); + dwinPopupContinue(ICON_Leveling_1, GET_TEXT_F(MSG_MESH_VIEWER), GET_TEXT_F(MSG_NO_VALID_MESH)); else { hmiSaveProcessID(ID_WaitResponse); meshViewer.draw(); @@ -3088,17 +3116,17 @@ void drawPrepareMenu() { if (SET_MENU(trammingMenu, MSG_BED_TRAMMING, 8)) { BACK_ITEM(drawPrepareMenu); #if HAS_BED_PROBE && HAS_MESH - MENU_ITEM(ICON_ProbeSet, MSG_TRAMMING_WIZARD, onDrawMenuItem, trammingwizard); - EDIT_ITEM(ICON_ProbeSet, MSG_BED_TRAMMING_MANUAL, onDrawChkbMenu, setManualTramming, &hmiData.fullManualTramming); + MENU_ITEM(ICON_Tram, MSG_TRAMMING_WIZARD, onDrawMenuItem, trammingwizard); + EDIT_ITEM(ICON_Version, MSG_BED_TRAMMING_MANUAL, onDrawChkbMenu, setManualTramming, &hmiData.fullManualTramming); #elif !HAS_BED_PROBE && HAS_ZOFFSET_ITEM MENU_ITEM_F(ICON_MoveZ0, "Home Z and disable", onDrawMenuItem, homeZAndDisable); #endif - MENU_ITEM(ICON_Axis, MSG_TRAM_FL, onDrawMenuItem, []{ (void)tram(0); }); - MENU_ITEM(ICON_Axis, MSG_TRAM_FR, onDrawMenuItem, []{ (void)tram(1); }); - MENU_ITEM(ICON_Axis, MSG_TRAM_BR, onDrawMenuItem, []{ (void)tram(2); }); - MENU_ITEM(ICON_Axis, MSG_TRAM_BL, onDrawMenuItem, []{ (void)tram(3); }); + MENU_ITEM(ICON_AxisBL, MSG_TRAM_FL, onDrawMenuItem, []{ (void)tram(0); }); + MENU_ITEM(ICON_AxisBR, MSG_TRAM_FR, onDrawMenuItem, []{ (void)tram(1); }); + MENU_ITEM(ICON_AxisTR, MSG_TRAM_BR, onDrawMenuItem, []{ (void)tram(2); }); + MENU_ITEM(ICON_AxisTL, MSG_TRAM_BL, onDrawMenuItem, []{ (void)tram(3); }); #if ENABLED(BED_TRAMMING_INCLUDE_CENTER) - MENU_ITEM(ICON_Axis, MSG_TRAM_C, onDrawMenuItem, []{ (void)tram(4); }); + MENU_ITEM(ICON_AxisC, MSG_TRAM_C, onDrawMenuItem, []{ (void)tram(4); }); #endif } updateMenu(trammingMenu); @@ -3144,13 +3172,13 @@ void drawAdvancedSettingsMenu() { MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); #endif #if HAS_MESH - MENU_ITEM(ICON_ProbeSet, MSG_MESH_LEVELING, onDrawSubMenu, drawMeshSetMenu); + MENU_ITEM(ICON_Mesh, MSG_MESH_LEVELING, onDrawSubMenu, drawMeshSetMenu); #endif #if HAS_BED_PROBE - MENU_ITEM(ICON_ProbeSet, MSG_ZPROBE_SETTINGS, onDrawSubMenu, drawProbeSetMenu); + MENU_ITEM(ICON_Probe, MSG_ZPROBE_SETTINGS, onDrawSubMenu, drawProbeSetMenu); #endif #if HAS_HOME_OFFSET - MENU_ITEM(ICON_ProbeSet, MSG_SET_HOME_OFFSETS, onDrawSubMenu, drawHomeOffsetMenu); + MENU_ITEM(ICON_HomeOffset, MSG_SET_HOME_OFFSETS, onDrawSubMenu, drawHomeOffsetMenu); #endif MENU_ITEM(ICON_FilSet, MSG_FILAMENT_SET, onDrawSubMenu, drawFilSetMenu); #if ENABLED(PIDTEMP) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) @@ -3176,7 +3204,7 @@ void drawAdvancedSettingsMenu() { MENU_ITEM(ICON_Lock, MSG_LOCKSCREEN, onDrawMenuItem, dwinLockScreen); #endif #if ENABLED(EDITABLE_DISPLAY_TIMEOUT) - EDIT_ITEM(ICON_Brightness, MSG_SCREEN_TIMEOUT, onDrawPIntMenu, setTimer, &ui.backlight_timeout_minutes); + EDIT_ITEM(ICON_RemainTime, MSG_SCREEN_TIMEOUT, onDrawPIntMenu, setTimer, &ui.backlight_timeout_minutes); #endif #if ENABLED(SOUND_MENU_ITEM) EDIT_ITEM(ICON_Sound, MSG_SOUND_ENABLE, onDrawChkbMenu, setEnableSound, &ui.sound_on); @@ -3196,7 +3224,7 @@ void drawAdvancedSettingsMenu() { #endif #if HAS_LCD_BRIGHTNESS EDIT_ITEM(ICON_Brightness, MSG_BRIGHTNESS, onDrawPInt8Menu, setBrightness, &ui.brightness); - MENU_ITEM(ICON_Brightness, MSG_BRIGHTNESS_OFF, onDrawMenuItem, turnOffBacklight); + MENU_ITEM(ICON_Box, MSG_BRIGHTNESS_OFF, onDrawMenuItem, turnOffBacklight); #endif #if HAS_CUSTOM_COLORS MENU_ITEM(ICON_Scolor, MSG_COLORS_SELECT, onDrawSubMenu, drawSelectColorsMenu); @@ -3268,7 +3296,7 @@ void drawMoveMenu() { #if ENABLED(BLTOUCH) MENU_ITEM(ICON_ProbeStow, MSG_MANUAL_STOW, onDrawMenuItem, probeStow); MENU_ITEM(ICON_ProbeDeploy, MSG_MANUAL_DEPLOY, onDrawMenuItem, probeDeploy); - MENU_ITEM(ICON_BltouchReset, MSG_BLTOUCH_RESET, onDrawMenuItem, bltouch._reset); + MENU_ITEM(ICON_BLTouchReset, MSG_BLTOUCH_RESET, onDrawMenuItem, bltouch._reset); #if HAS_BLTOUCH_HS_MODE EDIT_ITEM(ICON_HSMode, MSG_ENABLE_HS_MODE, onDrawChkbMenu, setHSMode, &bltouch.high_speed_mode); #endif @@ -3397,10 +3425,10 @@ void drawTuneMenu() { #endif #if HAS_LCD_BRIGHTNESS EDIT_ITEM(ICON_Brightness, MSG_BRIGHTNESS, onDrawPInt8Menu, setBrightness, &ui.brightness); - MENU_ITEM(ICON_Brightness, MSG_BRIGHTNESS_OFF, onDrawMenuItem, turnOffBacklight); + MENU_ITEM(ICON_Box, MSG_BRIGHTNESS_OFF, onDrawMenuItem, turnOffBacklight); #endif #if ENABLED(EDITABLE_DISPLAY_TIMEOUT) - EDIT_ITEM(ICON_Brightness, MSG_SCREEN_TIMEOUT, onDrawPIntMenu, setTimer, &ui.backlight_timeout_minutes); + EDIT_ITEM(ICON_RemainTime, MSG_SCREEN_TIMEOUT, onDrawPIntMenu, setTimer, &ui.backlight_timeout_minutes); #endif #if ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) MENU_ITEM(ICON_PIDNozzle, MSG_HOTEND_TEMP_GRAPH, onDrawMenuItem, drawHPlot); @@ -3425,9 +3453,9 @@ void drawTuneMenu() { updateMenu(tuneMenu); } -#if ENABLED(ADAPTIVE_STEP_SMOOTHING) +#if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) void setAdaptiveStepSmoothing() { - toggleCheckboxLine(hmiData.adaptiveStepSmoothing); + toggleCheckboxLine(stepper.adaptive_step_smoothing_enabled); } #endif @@ -3518,8 +3546,8 @@ void drawMotionMenu() { #if ENABLED(SHAPING_MENU) MENU_ITEM(ICON_InputShaping, MSG_INPUT_SHAPING, onDrawSubMenu, drawInputShaping_menu); #endif - #if ENABLED(ADAPTIVE_STEP_SMOOTHING) - EDIT_ITEM(ICON_UBLActive, MSG_STEP_SMOOTHING, onDrawChkbMenu, setAdaptiveStepSmoothing, &hmiData.adaptiveStepSmoothing); + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + EDIT_ITEM(ICON_UBLActive, MSG_STEP_SMOOTHING, onDrawChkbMenu, setAdaptiveStepSmoothing, &stepper.adaptive_step_smoothing_enabled); #endif #if ENABLED(EDITABLE_STEPS_PER_UNIT) MENU_ITEM(ICON_Step, MSG_STEPS_PER_MM, onDrawSteps, drawStepsMenu); @@ -3589,10 +3617,10 @@ void drawFilamentManMenu() { if (notCurrent) { BACK_ITEM(drawTemperatureMenu); #if HAS_HOTEND - EDIT_ITEM(ICON_SetEndTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawSetPreheatHotend, setPreheatEndTemp, &ui.material_preset[hmiValue.select].hotend_temp); + EDIT_ITEM(ICON_HotendTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawSetPreheatHotend, setPreheatEndTemp, &ui.material_preset[hmiValue.select].hotend_temp); #endif #if HAS_HEATED_BED - EDIT_ITEM(ICON_SetBedTemp, MSG_UBL_SET_TEMP_BED, onDrawSetPreheatBed, setPreheatBedTemp, &ui.material_preset[hmiValue.select].bed_temp); + EDIT_ITEM(ICON_BedTemp, MSG_UBL_SET_TEMP_BED, onDrawSetPreheatBed, setPreheatBedTemp, &ui.material_preset[hmiValue.select].bed_temp); #endif #if HAS_FAN EDIT_ITEM(ICON_FanSpeed, MSG_FAN_SPEED, onDrawSetPreheatFan, setPreheatFanSpeed, &ui.material_preset[hmiValue.select].fan_speed); @@ -3618,10 +3646,10 @@ void drawTemperatureMenu() { if (SET_MENU_R(temperatureMenu, selrect({236, 2, 28, 12}), MSG_TEMPERATURE, 4 + PREHEAT_COUNT)) { BACK_ITEM(drawControlMenu); #if HAS_HOTEND - hotendTargetItem = EDIT_ITEM(ICON_SetEndTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawHotendTemp, setHotendTemp, &thermalManager.temp_hotend[0].target); + hotendTargetItem = EDIT_ITEM(ICON_HotendTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawHotendTemp, setHotendTemp, &thermalManager.temp_hotend[0].target); #endif #if HAS_HEATED_BED - bedTargetItem = EDIT_ITEM(ICON_SetBedTemp, MSG_UBL_SET_TEMP_BED, onDrawBedTemp, setBedTemp, &thermalManager.temp_bed.target); + bedTargetItem = EDIT_ITEM(ICON_BedTemp, MSG_UBL_SET_TEMP_BED, onDrawBedTemp, setBedTemp, &thermalManager.temp_bed.target); #endif #if HAS_FAN fanSpeedItem = EDIT_ITEM(ICON_FanSpeed, MSG_FAN_SPEED, onDrawFanSpeed, setFanSpeed, &thermalManager.fan_speed[0]); @@ -3844,101 +3872,137 @@ void drawMaxAccelMenu() { #endif // MPC_EDIT_MENU || MPC_AUTOTUNE_MENU -#if PROUI_PID_TUNE - void setPID(celsius_t t, heater_id_t h) { - gcode.process_subcommands_now( - MString<60>(F("G28OXY\nG0Z5F300\nG0X"), X_CENTER, F("Y"), Y_CENTER, F("F5000\nM84\nM400")) - ); - thermalManager.PID_autotune(t, h, hmiData.pidCycles, true); - } - void setPidCycles() { setPIntOnClick(3, 50); } -#endif +#if HAS_PID_HEATING -#if ALL(HAS_PID_HEATING, PID_EDIT_MENU) + #if ENABLED(PID_AUTOTUNE_MENU) + void setPID(celsius_t t, heater_id_t h) { + gcode.process_subcommands_now( + MString<60>(F("G28OXY\nG0Z5F300\nG0X"), X_CENTER, F("Y"), Y_CENTER, F("F5000\nM84\nM400")) + ); + thermalManager.PID_autotune(t, h, hmiData.pidCycles, true); + } + void setPIDCycles() { setPIntOnClick(3, 50); } + #endif - void setKp() { setPFloatOnClick(0, 1000, 2); } - void applyPIDi() { - *menuData.floatPtr = scalePID_i(menuData.value / POW(10, 2)); - TERN_(PIDTEMP, thermalManager.updatePID()); - } - void applyPIDd() { - *menuData.floatPtr = scalePID_d(menuData.value / POW(10, 2)); - TERN_(PIDTEMP, thermalManager.updatePID()); - } - void setKi() { - menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value; - const float value = unscalePID_i(*menuData.floatPtr); - setFloatOnClick(0, 1000, 2, value, applyPIDi); - } - void setKd() { - menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value; - const float value = unscalePID_d(*menuData.floatPtr); - setFloatOnClick(0, 1000, 2, value, applyPIDd); - } - void onDrawPIDi(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_i(*(float*)static_cast(menuitem)->value)); } - void onDrawPIDd(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_d(*(float*)static_cast(menuitem)->value)); } + #if ENABLED(PID_EDIT_MENU) + void setKp() { setPFloatOnClick(0, 1000, 2); } + void applyPIDi() { + *menuData.floatPtr = scalePID_i(menuData.value / POW(10, 2)); + TERN_(PIDTEMP, thermalManager.updatePID()); + } + void applyPIDd() { + *menuData.floatPtr = scalePID_d(menuData.value / POW(10, 2)); + TERN_(PIDTEMP, thermalManager.updatePID()); + } + void setKi() { + menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value; + const float value = unscalePID_i(*menuData.floatPtr); + setFloatOnClick(0, 1000, 2, value, applyPIDi); + } + void setKd() { + menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value; + const float value = unscalePID_d(*menuData.floatPtr); + setFloatOnClick(0, 1000, 2, value, applyPIDd); + } + void onDrawPIDi(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_i(*(float*)static_cast(menuitem)->value)); } + void onDrawPIDd(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_d(*(float*)static_cast(menuitem)->value)); } + #endif // PID_EDIT_MENU -#endif // HAS_PID_HEATING && PID_EDIT_MENU +#endif // HAS_PID_HEATING -#if ENABLED(PIDTEMP) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) +#if ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) - #if ENABLED(PID_AUTOTUNE_MENU) - void hotendPID() { setPID(hmiData.hotendPidT, H_E0); } - void setHotendPidT() { setPIntOnClick(MIN_ETEMP, MAX_ETEMP); } - #endif + #if ENABLED(PIDTEMP) - void drawHotendPIDMenu() { - checkkey = ID_Menu; - if (SET_MENU_F(hotendPIDMenu, STR_HOTEND_PID " Settings", 8)) { - BACK_ITEM(drawAdvancedSettingsMenu); - #if ENABLED(PID_AUTOTUNE_MENU) - MENU_ITEM_F(ICON_PIDNozzle, STR_HOTEND_PID, onDrawMenuItem, hotendPID); - EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, setHotendPidT, &hmiData.hotendPidT); - EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, setPidCycles, &hmiData.pidCycles); - #endif - #if ENABLED(PID_EDIT_MENU) - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KP, onDrawPFloat2Menu, setKp, &thermalManager.temp_hotend[0].pid.Kp); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KI, onDrawPIDi, setKi, &thermalManager.temp_hotend[0].pid.Ki); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KD, onDrawPIDd, setKd, &thermalManager.temp_hotend[0].pid.Kd); - #endif - #if ENABLED(EEPROM_SETTINGS) - MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); - #endif + #if ENABLED(PID_AUTOTUNE_MENU) + void hotendPID() { setPID(hmiData.hotendPIDT, H_E0); } + void setHotendPIDT() { setPIntOnClick(MIN_ETEMP, MAX_ETEMP); } + #endif + + void drawHotendPIDMenu() { + checkkey = ID_Menu; + if (SET_MENU_F(hotendPIDMenu, STR_HOTEND_PID " Settings", 8)) { + BACK_ITEM(drawAdvancedSettingsMenu); + #if ENABLED(PID_AUTOTUNE_MENU) + MENU_ITEM_F(ICON_PIDNozzle, STR_HOTEND_PID, onDrawMenuItem, hotendPID); + EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, setHotendPIDT, &hmiData.hotendPIDT); + EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, setPIDCycles, &hmiData.pidCycles); + #endif + #if ENABLED(PID_EDIT_MENU) + EDIT_ITEM_F(ICON_PIDValue, "Set Kp: ", onDrawPFloat2Menu, setKp, &thermalManager.temp_hotend[0].pid.Kp); + EDIT_ITEM_F(ICON_PIDValue, "Set Ki: ", onDrawPIDi, setKi, &thermalManager.temp_hotend[0].pid.Ki); + EDIT_ITEM_F(ICON_PIDValue, "Set Kd: ", onDrawPIDd, setKd, &thermalManager.temp_hotend[0].pid.Kd); + #endif + #if ENABLED(EEPROM_SETTINGS) + MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); + #endif + } + updateMenu(hotendPIDMenu); } - updateMenu(hotendPIDMenu); - } -#endif // PIDTEMP && (PID_AUTOTUNE_MENU || PID_EDIT_MENU) + #endif // PIDTEMP -#if ENABLED(PIDTEMPBED) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) + #if ENABLED(PIDTEMPBED) - #if ENABLED(PID_AUTOTUNE_MENU) - void bedPID() { setPID(hmiData.bedPidT, H_BED); } - void setBedPidT() { setPIntOnClick(MIN_BEDTEMP, MAX_BEDTEMP); } - #endif + #if ENABLED(PID_AUTOTUNE_MENU) + void bedPID() { setPID(hmiData.bedPIDT, H_BED); } + void setBedPIDT() { setPIntOnClick(MIN_BEDTEMP, MAX_BEDTEMP); } + #endif - void drawBedPIDMenu() { - checkkey = ID_Menu; - if (SET_MENU_F(bedPIDMenu, STR_BED_PID " Settings", 8)) { - BACK_ITEM(drawAdvancedSettingsMenu); - #if ENABLED(PID_AUTOTUNE_MENU) - MENU_ITEM_F(ICON_PIDBed, STR_BED_PID, onDrawMenuItem,bedPID); - EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, setBedPidT, &hmiData.bedPidT); - EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, setPidCycles, &hmiData.pidCycles); - #endif - #if ENABLED(PID_EDIT_MENU) - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KP, onDrawPFloat2Menu, setKp, &thermalManager.temp_bed.pid.Kp); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KI, onDrawPIDi, setKi, &thermalManager.temp_bed.pid.Ki); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KD, onDrawPIDd, setKd, &thermalManager.temp_bed.pid.Kd); - #endif - #if ENABLED(EEPROM_SETTINGS) - MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); - #endif + void drawBedPIDMenu() { + checkkey = ID_Menu; + if (SET_MENU_F(bedPIDMenu, STR_BED_PID " Settings", 8)) { + BACK_ITEM(drawAdvancedSettingsMenu); + #if ENABLED(PID_AUTOTUNE_MENU) + MENU_ITEM_F(ICON_PIDBed, STR_BED_PID, onDrawMenuItem,bedPID); + EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, setBedPIDT, &hmiData.bedPIDT); + EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, setPIDCycles, &hmiData.pidCycles); + #endif + #if ENABLED(PID_EDIT_MENU) + EDIT_ITEM_F(ICON_PIDValue, "Set Kp: ", onDrawPFloat2Menu, setKp, &thermalManager.temp_bed.pid.Kp); + EDIT_ITEM_F(ICON_PIDValue, "Set Ki: ", onDrawPIDi, setKi, &thermalManager.temp_bed.pid.Ki); + EDIT_ITEM_F(ICON_PIDValue, "Set Kd: ", onDrawPIDd, setKd, &thermalManager.temp_bed.pid.Kd); + #endif + #if ENABLED(EEPROM_SETTINGS) + MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); + #endif + } + updateMenu(bedPIDMenu); } - updateMenu(bedPIDMenu); - } -#endif // PIDTEMPBED && (PID_AUTOTUNE_MENU || PID_EDIT_MENU) + #endif // PIDTEMPBED + + #if ENABLED(PIDTEMPCHAMBER) + + #if ENABLED(PID_AUTOTUNE_MENU) + void chamberPID() { setPID(hmiData.chamberPIDT, H_CHAMBER); } + void setChamberPIDT() { setPIntOnClick(MIN_CHAMBERTEMP, MAX_CHAMBERTEMP); } + #endif + + void drawChamberPIDMenu() { + checkkey = ID_Menu; + if (SET_MENU_F(chamberPIDMenu, STR_CHAMBER_PID " Settings", 8)) { + BACK_ITEM(drawAdvancedSettingsMenu); + #if ENABLED(PID_AUTOTUNE_MENU) + MENU_ITEM_F(ICON_PIDChamber, STR_CHAMBER_PID, onDrawMenuItem,chamberPID); + EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, setChamberPIDT, &hmiData.chamberPIDT); + EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, setPIDCycles, &hmiData.pidCycles); + #endif + #if ENABLED(PID_EDIT_MENU) + EDIT_ITEM_F(ICON_PIDValue, "Set Kp: ", onDrawPFloat2Menu, setKp, &thermalManager.temp_chamber.pid.Kp); + EDIT_ITEM_F(ICON_PIDValue, "Set Ki: ", onDrawPIDi, setKi, &thermalManager.temp_chamber.pid.Ki); + EDIT_ITEM_F(ICON_PIDValue, "Set Kd: ", onDrawPIDd, setKd, &thermalManager.temp_chamber.pid.Kd); + #endif + #if ENABLED(EEPROM_SETTINGS) + MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); + #endif + } + updateMenu(chamberPIDMenu); + } + + #endif // PIDTEMPCHAMBER + +#endif // PID_AUTOTUNE_MENU || PID_EDIT_MENU //============================================================================= @@ -3949,7 +4013,7 @@ void drawMaxAccelMenu() { if (SET_MENU(zOffsetWizMenu, MSG_PROBE_WIZARD, 4)) { BACK_ITEM(drawPrepareMenu); MENU_ITEM(ICON_Homing, MSG_AUTO_HOME, onDrawMenuItem, autoHome); - MENU_ITEM(ICON_MoveZ0, MSG_MOVE_NOZZLE_TO_BED, onDrawMenuItem, setMoveZto0); + MENU_ITEM(ICON_AxisD, MSG_MOVE_NOZZLE_TO_BED, onDrawMenuItem, setMoveZto0); EDIT_ITEM(ICON_Zoffset, MSG_XATC_UPDATE_Z_OFFSET, onDrawPFloat2Menu, setZOffset, &BABY_Z_VAR); } updateMenu(zOffsetWizMenu); diff --git a/Marlin/src/lcd/e3v2/proui/dwin.h b/Marlin/src/lcd/e3v2/proui/dwin.h index 94b949b5e780..7d264b8b12ed 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.h +++ b/Marlin/src/lcd/e3v2/proui/dwin.h @@ -53,17 +53,16 @@ enum processID : uint8_t { ID_MainMenu, ID_Menu, ID_SetInt, - ID_SetPInt, - ID_SetIntNoDraw, ID_SetFloat, + ID_SetPInt, ID_SetPFloat, + ID_SetIntNoDraw, ID_PrintProcess, ID_Popup, ID_Leveling, ID_Locked, - ID_Reboot, - ID_PrintDone, ID_ESDiagProcess, + ID_PrintDone, ID_WaitResponse, ID_Homing, ID_PIDProcess, @@ -72,12 +71,20 @@ enum processID : uint8_t { ID_NothingToDo }; -#if ANY(PROUI_PID_TUNE, MPC_AUTOTUNE) +#if ANY(HAS_PID_HEATING, MPC_AUTOTUNE) - enum tempcontrol_t : uint8_t { - #if PROUI_PID_TUNE - PIDTEMP_START, - PIDTEMPBED_START, + enum TempControl { + AUTOTUNE_DONE, + #if HAS_PID_HEATING + #if ENABLED(PIDTEMP) + PIDTEMP_START, + #endif + #if ENABLED(PIDTEMPBED) + PIDTEMPBED_START, + #endif + #if ENABLED(PIDTEMPCHAMBER) + PIDTEMPCHAMBER_START, + #endif PID_BAD_HEATER_ID, PID_TEMP_TOO_HIGH, PID_TUNING_TIMEOUT, @@ -87,9 +94,11 @@ enum processID : uint8_t { MPC_TEMP_ERROR, MPC_INTERRUPTED, #endif - AUTOTUNE_DONE + TEMPCONTROL_COUNT }; + typedef bits_t(TEMPCONTROL_COUNT) tempcontrol_t; + #endif #define DWIN_CHINESE 123 @@ -117,20 +126,23 @@ typedef struct { uint16_t colorCoordinate; // Temperatures - #if PROUI_PID_TUNE + #if HAS_PID_HEATING int16_t pidCycles = DEF_PIDCYCLES; #if ENABLED(PIDTEMP) - int16_t hotendPidT = DEF_HOTENDPIDT; + celsius_t hotendPIDT = DEF_HOTENDPIDT; #endif #if ENABLED(PIDTEMPBED) - int16_t bedPidT = DEF_BEDPIDT; + celsius_t bedPIDT = DEF_BEDPIDT; + #endif + #if ENABLED(PIDTEMPCHAMBER) + celsius_t chamberPIDT = DEF_CHAMBERPIDT; #endif #endif #if ENABLED(PREVENT_COLD_EXTRUSION) - int16_t extMinT = EXTRUDE_MINTEMP; + celsius_t extMinT = EXTRUDE_MINTEMP; #endif #if ENABLED(PREHEAT_BEFORE_LEVELING) - int16_t bedLevT = LEVELING_BED_TEMP; + celsius_t bedLevT = LEVELING_BED_TEMP; #endif #if ENABLED(BAUD_RATE_GCODE) bool baud115K = false; @@ -144,20 +156,19 @@ typedef struct { bool mediaAutoMount = ENABLED(HAS_SD_EXTENDER); #if ALL(INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) uint8_t zAfterHoming = DEF_Z_AFTER_HOMING; + #define Z_POST_CLEARANCE hmiData.zAfterHoming #endif #if ALL(LED_CONTROL_MENU, HAS_COLOR_LEDS) LEDColor ledColor = defColorLeds; #endif - #if ENABLED(ADAPTIVE_STEP_SMOOTHING) - bool adaptiveStepSmoothing = true; - #endif #if HAS_GCODE_PREVIEW bool enablePreview = true; #endif } hmi_data_t; extern hmi_data_t hmiData; -static constexpr size_t eeprom_data_size = sizeof(hmi_data_t); + +#define EXTUI_EEPROM_DATA_SIZE sizeof(hmi_data_t) typedef struct { int8_t r, g, b; @@ -174,7 +185,7 @@ typedef struct { typedef struct { rgb_t color; // Color - #if ANY(PROUI_PID_TUNE, MPCTEMP) + #if ANY(HAS_PID_HEATING, MPCTEMP) tempcontrol_t tempControl = AUTOTUNE_DONE; #endif uint8_t select = 0; // Auxiliary selector variable @@ -196,8 +207,8 @@ extern hmi_flag_t hmiFlag; extern uint8_t checkkey; // Popups -#if HAS_HOTEND || HAS_HEATED_BED - void dwinPopupTemperature(const bool toohigh); +#if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER + void dwinPopupTemperature(const int_fast8_t heater_id, const uint8_t state); #endif #if ENABLED(POWER_LOSS_RECOVERY) void popupPowerLossRecovery(); @@ -288,7 +299,7 @@ void dwinPrintAborted(); #if HAS_FILAMENT_SENSOR void dwinFilamentRunout(const uint8_t extruder); #endif -void dwinPrintHeader(const char *text); +void dwinPrintHeader(const char * const cstr=nullptr); void dwinSetColorDefaults(); void dwinCopySettingsTo(char * const buff); void dwinCopySettingsFrom(const char * const buff); @@ -313,6 +324,11 @@ void dwinRebootScreen(); #if HAS_ESDIAG void drawEndStopDiag(); #endif +#if ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) + void dwinDrawPlot(tempcontrol_t result); + void drawHPlot(); + void drawBPlot(); +#endif // Menu drawing functions void drawPrintFileMenu(); @@ -376,28 +392,29 @@ void drawMaxAccelMenu(); #endif // PID -#if PROUI_PID_TUNE +#if HAS_PID_HEATING #include "../../../module/temperature.h" - void dwinStartM303(const bool seenC, const int c, const bool seenS, const heater_id_t hid, const celsius_t temp); - void dwinPidTuning(tempcontrol_t result); - #if PROUI_TUNING_GRAPH - void dwinDrawPIDMPCPopup(); - #endif -#endif -#if ENABLED(PIDTEMP) - #if ENABLED(PID_AUTOTUNE_MENU) - void hotendPID(); - #endif - #if ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) - void drawHotendPIDMenu(); - #endif -#endif -#if ENABLED(PIDTEMPBED) - #if ENABLED(PID_AUTOTUNE_MENU) - void bedPID(); - #endif + void dwinStartM303(const int count, const heater_id_t hid, const celsius_t temp); + void dwinPIDTuning(tempcontrol_t result); #if ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) - void drawBedPIDMenu(); + #if ENABLED(PIDTEMP) + #if ENABLED(PID_AUTOTUNE_MENU) + void hotendPID(); + #endif + void drawHotendPIDMenu(); + #endif + #if ENABLED(PIDTEMPBED) + #if ENABLED(PID_AUTOTUNE_MENU) + void bedPID(); + #endif + void drawBedPIDMenu(); + #endif + #if ENABLED(PIDTEMPCHAMBER) + #if ENABLED(PID_AUTOTUNE_MENU) + void chamberPID(); + #endif + void drawChamberPIDMenu(); + #endif #endif #endif @@ -410,3 +427,7 @@ void drawMaxAccelMenu(); void dwinMPCTuning(tempcontrol_t result); #endif #endif + +#if PROUI_TUNING_GRAPH + void dwinDrawPIDMPCPopup(); +#endif diff --git a/Marlin/src/lcd/e3v2/proui/dwin_defines.h b/Marlin/src/lcd/e3v2/proui/dwin_defines.h index f7026ebc7dda..f09d2bd625ab 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_defines.h +++ b/Marlin/src/lcd/e3v2/proui/dwin_defines.h @@ -30,6 +30,10 @@ #include "../../../inc/MarlinConfigPre.h" +//#define TJC_DISPLAY // Enable for TJC display +//#define DACAI_DISPLAY // Enable for DACAI display +//#define TITLE_CENTERED // Center Menu Title Text + #if HAS_MESH #define PROUI_MESH_EDIT // Add a menu to edit mesh points #if ENABLED(PROUI_MESH_EDIT) @@ -96,6 +100,11 @@ #else #define DEF_BEDPIDT 60 #endif +#ifdef PREHEAT_1_TEMP_CHAMBER + #define DEF_CHAMBERPIDT PREHEAT_1_TEMP_CHAMBER +#else + #define DEF_CHAMBERPIDT 0 +#endif #define DEF_PIDCYCLES 5 /** @@ -113,7 +122,7 @@ #if ENABLED(LIN_ADVANCE) #define PROUI_ITEM_ADVK // Tune > Linear Advance #endif -#if ANY(PROUI_PID_TUNE, MPC_AUTOTUNE) && DISABLED(DISABLE_TUNING_GRAPH) +#if ANY(HAS_PID_HEATING, MPC_AUTOTUNE) && DISABLED(DISABLE_TUNING_GRAPH) #define PROUI_TUNING_GRAPH 1 #endif #if PROUI_TUNING_GRAPH diff --git a/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp b/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp index 7c71b8fc5974..10e53882748b 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp @@ -52,14 +52,6 @@ void dwinDrawQR(uint8_t QR_Pixel, uint16_t x, uint16_t y, char *string) { dwinSend(i); } -// Draw an Icon with transparent background -// libID: Icon library ID -// picID: Icon ID -// x/y: Upper-left point -void dwinIconShow(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { - dwinIconShow(false, false, true, libID, picID, x, y); -} - // Copy area from current virtual display area to current screen // xStart/yStart: Upper-left of virtual area // xEnd/yEnd: Lower-right of virtual area @@ -134,21 +126,25 @@ void dwinWriteToMem(uint8_t mem, uint16_t addr, uint16_t length, uint8_t *data) } } -// Draw an Icon from SRAM without background transparency for DACAI Screens support -void DACAI_ICON_Show(uint16_t x, uint16_t y, uint16_t addr) { - NOMORE(x, DWIN_WIDTH - 1); - NOMORE(y, DWIN_HEIGHT - 1); - size_t i = 0; - dwinByte(i, 0x70); - dwinWord(i, x); - dwinWord(i, y); - dwinWord(i, addr); - dwinSend(i); -} +#if ENABLED(DACAI_DISPLAY) + + // Draw an Icon from SRAM without background transparency for DACAI Screens support + void dacaiIconShow(uint16_t x, uint16_t y, uint16_t addr) { + NOMORE(x, DWIN_WIDTH - 1); + NOMORE(y, DWIN_HEIGHT - 1); + size_t i = 0; + dwinByte(i, 0x70); + dwinWord(i, x); + dwinWord(i, y); + dwinWord(i, addr); + dwinSend(i); + } + +#endif void dwinIconShow(uint16_t x, uint16_t y, uint16_t addr) { #if ENABLED(DACAI_DISPLAY) - DACAI_ICON_Show(x, y, addr); + dacaiIconShow(x, y, addr); #else dwinIconShow(0, 0, 1, x, y, addr); #endif diff --git a/Marlin/src/lcd/e3v2/proui/dwinui.cpp b/Marlin/src/lcd/e3v2/proui/dwinui.cpp index 453e21a240f4..41eab7878588 100644 --- a/Marlin/src/lcd/e3v2/proui/dwinui.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwinui.cpp @@ -209,7 +209,7 @@ void DWINUI::drawFloat(uint8_t bShow, bool signedMode, fontid_t fid, uint16_t co // libID: Icon library ID // picID: Icon ID // x/y: Upper-left point -void DWINUI::ICON_Show(bool BG, uint8_t icon, uint16_t x, uint16_t y) { +void DWINUI::iconShow(bool BG, uint8_t icon, uint16_t x, uint16_t y) { const uint8_t libID = ICON TERN_(HAS_CUSTOMICONS, + (icon / 100)); const uint8_t picID = icon TERN_(HAS_CUSTOMICONS, % 100); dwinIconShow(BG, false, !BG, libID, picID, x, y); diff --git a/Marlin/src/lcd/e3v2/proui/dwinui.h b/Marlin/src/lcd/e3v2/proui/dwinui.h index b0ff00c527d9..27825b0869a0 100644 --- a/Marlin/src/lcd/e3v2/proui/dwinui.h +++ b/Marlin/src/lcd/e3v2/proui/dwinui.h @@ -36,14 +36,28 @@ #include "dwin_lcd.h" // Extra Icons +#define ICON_Printer_0 93 +#define ICON_Box 200 +#define ICON_Checkbox 201 +#define ICON_Fade 202 +#define ICON_Mesh 203 +#define ICON_Tilt 204 +#define ICON_Brightness 205 +#define ICON_Probe 206 +#define ICON_AxisD 249 +#define ICON_AxisBR 250 +#define ICON_AxisTR 251 +#define ICON_AxisBL 252 +#define ICON_AxisTL 253 +#define ICON_AxisC 254 + #define ICON_BedSizeX ICON_PrintSize #define ICON_BedSizeY ICON_PrintSize #define ICON_BedTramming ICON_SetHome #define ICON_Binary ICON_Contact -#define ICON_BltouchReset ICON_StockConfiguration -#define ICON_Brightness ICON_Motion +#define ICON_BLTouchReset ICON_ResetEEPROM #define ICON_Cancel ICON_StockConfiguration -#define ICON_CustomPreheat ICON_SetEndTemp +#define ICON_CustomPreheat ICON_BedTemp #define ICON_Error ICON_TempTooHigh #define ICON_esDiag ICON_Info #define ICON_ExtrudeMinT ICON_HotendTemp @@ -55,28 +69,27 @@ #define ICON_HomeX ICON_MoveX #define ICON_HomeY ICON_MoveY #define ICON_HomeZ ICON_MoveZ -#define ICON_HSMode ICON_StockConfiguration +#define ICON_HSMode ICON_MaxAccZ #define ICON_InputShaping ICON_MaxAccelerated #define ICON_JDmm ICON_MaxJerk -#define ICON_Tram ICON_SetEndTemp -#define ICON_Level ICON_HotendTemp -#define ICON_Lock ICON_Cool -#define ICON_ManualMesh ICON_HotendTemp +#define ICON_Level ICON_Mesh +#define ICON_Lock ICON_Checkbox +#define ICON_ManualMesh ICON_Mesh #define ICON_MaxPosX ICON_MoveX #define ICON_MaxPosY ICON_MoveY #define ICON_MaxPosZ ICON_MoveZ -#define ICON_MeshEdit ICON_Homing +#define ICON_MeshEdit ICON_Fade #define ICON_MeshEditX ICON_MoveX #define ICON_MeshEditY ICON_MoveY -#define ICON_MeshEditZ ICON_MoveZ -#define ICON_MeshNext ICON_Axis -#define ICON_MeshPoints ICON_SetEndTemp -#define ICON_MeshReset ICON_StockConfiguration +#define ICON_MeshEditZ ICON_Zoffset +#define ICON_MeshNext ICON_AxisD +#define ICON_MeshPoints ICON_HotendTemp +#define ICON_MeshReset ICON_ResetEEPROM #define ICON_MeshSave ICON_WriteEEPROM -#define ICON_MeshViewer ICON_HotendTemp -#define ICON_MoveZ0 ICON_HotendTemp -#define ICON_Park ICON_Motion -#define ICON_ParkPos ICON_AdvSet +#define ICON_MeshViewer ICON_Mesh +#define ICON_MoveZ0 ICON_CloseMotor +#define ICON_Park ICON_SetHome +#define ICON_ParkPos ICON_AxisC #define ICON_ParkPosX ICON_StepX #define ICON_ParkPosY ICON_StepY #define ICON_ParkPosZ ICON_StepZ @@ -95,18 +108,18 @@ #define ICON_Preheat8 ICON_CustomPreheat #define ICON_Preheat9 ICON_CustomPreheat #define ICON_Preheat10 ICON_CustomPreheat -#define ICON_ProbeDeploy ICON_SetEndTemp +#define ICON_ProbeDeploy ICON_Probe #define ICON_ProbeMargin ICON_PrintSize #define ICON_ProbeSet ICON_SetEndTemp -#define ICON_ProbeStow ICON_SetEndTemp -#define ICON_ProbeTest ICON_SetEndTemp +#define ICON_ProbeStow ICON_Tilt +#define ICON_ProbeTest ICON_Zoffset #define ICON_ProbeZSpeed ICON_MaxSpeedZ #define ICON_Pwrlossr ICON_Motion #define ICON_Reboot ICON_ResetEEPROM #define ICON_Runout ICON_MaxAccE #define ICON_Scolor ICON_MaxSpeed #define ICON_SetBaudRate ICON_Setspeed -#define ICON_SetCustomPreheat ICON_SetEndTemp +#define ICON_SetCustomPreheat ICON_BedTemp #define ICON_SetPreheat1 ICON_SetPLAPreheat #define ICON_SetPreheat2 ICON_SetABSPreheat #define ICON_SetPreheat3 ICON_SetCustomPreheat @@ -125,22 +138,24 @@ #define ICON_TMCYSet ICON_MoveY #define ICON_TMCZSet ICON_MoveZ #define ICON_TMCESet ICON_Extruder -#define ICON_UBLActive ICON_HotendTemp +#define ICON_Tram ICON_Step +#define ICON_UBLActive ICON_Fade #define ICON_UBLSlot ICON_ResetEEPROM #define ICON_UBLMeshSave ICON_WriteEEPROM #define ICON_UBLMeshLoad ICON_ReadEEPROM -#define ICON_UBLTiltGrid ICON_PrintSize #define ICON_UBLSmartFill ICON_StockConfiguration -#define ICON_ZAfterHome ICON_SetEndTemp +#define ICON_UBLTiltGrid ICON_Tilt +#define ICON_ZAfterHome ICON_Tilt +// LED Lights #define ICON_CaseLight ICON_Motion #define ICON_LedControl ICON_Motion // MPC -#define ICON_MPCNozzle ICON_SetEndTemp +#define ICON_MPCNozzle ICON_HotendTemp #define ICON_MPCValue ICON_Contact #define ICON_MPCHeater ICON_Temperature -#define ICON_MPCHeatCap ICON_SetBedTemp +#define ICON_MPCHeatCap ICON_BedTemp #define ICON_MPCFan ICON_FanSpeed // Buttons @@ -300,20 +315,20 @@ namespace DWINUI { // libID: Icon library ID // picID: Icon ID // x/y: Upper-left point - void ICON_Show(bool BG, uint8_t icon, uint16_t x, uint16_t y); + void iconShow(bool BG, uint8_t icon, uint16_t x, uint16_t y); // Draw an Icon with transparent background from the library ICON // icon: Icon ID // x/y: Upper-left point inline void drawIcon(uint8_t icon, uint16_t x, uint16_t y) { - ICON_Show(false, icon, x, y); + iconShow(false, icon, x, y); } // Draw an Icon from the library ICON with its background // icon: Icon ID // x/y: Upper-left point inline void drawIconWB(uint8_t icon, uint16_t x, uint16_t y) { - ICON_Show(true, icon, x, y); + iconShow(true, icon, x, y); } // Draw a numeric integer value @@ -486,6 +501,9 @@ namespace DWINUI { // y: Upper coordinate of the string // *string: The string void drawCenteredString(bool bShow, fontid_t fid, uint16_t color, uint16_t bColor, uint16_t x1, uint16_t x2, uint16_t y, const char * const string); + inline void drawCenteredString(bool bShow, fontid_t fid, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const char * const string) { + drawCenteredString(bShow, fid, color, bColor, 2 * x, 0, y, string); + } inline void drawCenteredString(bool bShow, fontid_t fid, uint16_t color, uint16_t bColor, uint16_t y, const char * const string) { drawCenteredString(bShow, fid, color, bColor, 0, DWIN_WIDTH, y, string); } diff --git a/Marlin/src/lcd/e3v2/proui/proui_extui.cpp b/Marlin/src/lcd/e3v2/proui/proui_extui.cpp new file mode 100644 index 000000000000..d377ca5fdce3 --- /dev/null +++ b/Marlin/src/lcd/e3v2/proui/proui_extui.cpp @@ -0,0 +1,246 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2024 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 . + * + */ + +/********************* + * proui_extui.cpp * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * 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. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(DWIN_LCD_PROUI) + +#include "dwin_popup.h" + +#include "../../extui/ui_api.h" +#include "../../../module/stepper.h" + +#if ENABLED(PREVENT_COLD_EXTRUSION) + #include "../../../module/temperature.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../feature/powerloss.h" +#endif + +namespace ExtUI { + + void onStartup() { dwinInitScreen(); } + + void onIdle() {} + void onPrinterKilled(FSTR_P const error, FSTR_P const component) {} + + void onMediaInserted() {} + void onMediaError() {} + void onMediaRemoved() {} + + void onHeatingError(const heater_id_t heater_id) { + dwinPopupTemperature(heater_id, 2); // "Heating failed" + } + void onMinTempError(const heater_id_t heater_id) { + dwinPopupTemperature(heater_id, 0); // "Too low" + } + void onMaxTempError(const heater_id_t heater_id) { + dwinPopupTemperature(heater_id, 1); // "Too high" + } + + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) {} + void onPrintTimerStarted() {} + void onPrintTimerPaused() {} + void onPrintTimerStopped() {} + + #if HAS_FILAMENT_SENSOR + void onFilamentRunout(const extruder_t extruder) { + dwinFilamentRunout(extruder); + } + #endif + + void onUserConfirmRequired(const char * const cstr) { + // TODO: A version of this method that takes an icon and button title, + // or implement some kind of ExtUI enum. + onUserConfirmRequired(ICON_Continue_1, cstr, GET_TEXT_F(MSG_USERWAIT)); + } + + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + dwinPopupConfirm(icon, cstr, fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + dwinPopupConfirm(icon, fstr, fBtn); + } + + void onStatusChanged(const char * const) { dwinCheckStatusMessage(); } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode(const PauseMessage message, const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/) { + if (mode != PAUSE_MODE_SAME) pause_mode = mode; + switch (message) { + case PAUSE_MESSAGE_PARKING: dwinPopupPause(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; // M125 + case PAUSE_MESSAGE_CHANGING: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; // pause_print (M125, M600) + case PAUSE_MESSAGE_WAITING: dwinPopupPause(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING), BTN_Continue); break; + case PAUSE_MESSAGE_INSERT: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT), BTN_Continue); break; + case PAUSE_MESSAGE_LOAD: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; + case PAUSE_MESSAGE_UNLOAD: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; // Unload of pause and Unload of M702 + case PAUSE_MESSAGE_PURGE: dwinPopupPause(GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE))); break; + case PAUSE_MESSAGE_OPTION: gotoFilamentPurge(); break; + case PAUSE_MESSAGE_RESUME: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; + case PAUSE_MESSAGE_HEAT: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT), BTN_Continue); break; + case PAUSE_MESSAGE_HEATING: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; + case PAUSE_MESSAGE_STATUS: hmiReturnScreen(); break; // Exit from Pause, Load and Unload + default: break; + } + } + #endif + + void onHomingStart() { dwinHomingStart(); } + void onHomingDone() { dwinHomingDone(); } + + void onPrintDone() {} + + void onFactoryReset() { dwinSetDataDefaults(); } + + // Copy settings to EEPROM buffer for write + void onStoreSettings(char *buff) { dwinCopySettingsTo(buff); } + + // Get settings from loaded EEPROM data + void onLoadSettings(const char *buff) { dwinCopySettingsFrom(buff); } + + void onPostprocessSettings() { + // Called after loading or resetting stored settings + } + + void onSettingsStored(const bool success) { + // Called after the entire EEPROM has been written, + // whether successful or not. + } + + void onSettingsLoaded(const bool success) { + // Called after the entire EEPROM has been read, + // whether successful or not. + } + + #if HAS_LEVELING + void onLevelingStart() { dwinLevelingStart(); } + void onLevelingDone() { dwinLevelingDone(); } + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return hmiData.bedLevT; } + #endif + #endif + + #if HAS_MESH + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { + const int16_t idx = ypos * (GRID_MAX_POINTS_X) + xpos; + dwinMeshUpdate(_MIN(idx, GRID_MAX_POINTS), int(GRID_MAX_POINTS), zval); + dwinRedrawScreen(); + } + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { + // Called to indicate a special condition + } + #endif + + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t t) { hmiData.extMinT = t; } + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + void onSetPowerLoss(const bool onoff) { + // Called when power-loss is enabled/disabled + } + void onPowerLoss() { + // Called when power-loss state is detected + } + void onPowerLossResume() { + // Called on resume from power-loss + recovery.ui_flag_resume = true; + } + #endif + + #if HAS_PID_HEATING + void onPIDTuning(const pidresult_t rst) { + // Called for temperature PID tuning result + switch (rst) { + #if ENABLED(PIDTEMP) + case PID_STARTED: dwinPIDTuning(PIDTEMP_START); break; + #endif + #if ENABLED(PIDTEMPBED) + case PID_BED_STARTED: dwinPIDTuning(PIDTEMPBED_START); break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case PID_CHAMBER_STARTED: dwinPIDTuning(PIDTEMPCHAMBER_START); break; + #endif + case PID_BAD_HEATER_ID: dwinPIDTuning(tempcontrol_t(PID_BAD_HEATER_ID)); break; + case PID_TEMP_TOO_HIGH: dwinPIDTuning(tempcontrol_t(PID_TEMP_TOO_HIGH)); break; + case PID_TUNING_TIMEOUT: dwinPIDTuning(tempcontrol_t(PID_TUNING_TIMEOUT)); break; + case PID_DONE: dwinPIDTuning(AUTOTUNE_DONE); break; + + } + } + + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + dwinStartM303(count, hid, temp); + } + + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + switch (rst) { + case MPC_STARTED: dwinMPCTuning(MPCTEMP_START); break; + case MPC_TEMP_ERROR: dwinMPCTuning(MPC_TEMP_ERROR); break; + case MPC_INTERRUPTED: dwinMPCTuning(MPC_INTERRUPTED); break; + case MPC_DONE: dwinMPCTuning(AUTOTUNE_DONE); break; + } + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() { dwinRebootScreen(); } + #endif + + void onSteppersDisabled() {} + void onSteppersEnabled() {} + void onAxisDisabled(const axis_t axis) { + set_axis_untrusted(AxisEnum(axis)); // MRISCOC workaround: https://github.com/MarlinFirmware/Marlin/issues/23095 + } + void onAxisEnabled(const axis_t) {} + +} // ExtUI + +#endif // DWIN_LCD_PROUI diff --git a/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp b/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp index 268111b6cb05..78a8ffa3a26d 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp @@ -49,6 +49,10 @@ namespace ExtUI { void onMediaError() { chiron.mediaEvent(AC_media_error); } void onMediaRemoved() { chiron.mediaEvent(AC_media_removed); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) { #if ENABLED(SPEAKER) ::tone(BEEPER_PIN, frequency, duration); @@ -65,6 +69,26 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { chiron.confirmationRequest(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { chiron.statusChange(msg); } void onHomingStart() {} @@ -109,6 +133,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -123,6 +150,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -135,13 +166,28 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp index ef02664dacf1..79738fab10ac 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp @@ -43,6 +43,10 @@ namespace ExtUI { void onMediaError() { anycubicTFT.onSDCardError(); } void onMediaRemoved() { anycubicTFT.onSDCardStateChange(false); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) { TERN_(SPEAKER, ::tone(BEEPER_PIN, frequency, duration)); } @@ -53,6 +57,26 @@ namespace ExtUI { void onFilamentRunout(const extruder_t extruder) { anycubicTFT.onFilamentRunout(); } void onUserConfirmRequired(const char * const msg) { anycubicTFT.onUserConfirmRequired(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) {} void onHomingStart() {} @@ -99,6 +123,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -111,6 +138,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -124,13 +155,28 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // ANYCUBIC_LCD_I3MEGA diff --git a/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp b/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp index 85e7b280790d..1bf13eafa306 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp @@ -49,6 +49,10 @@ namespace ExtUI { void onMediaError() { dgus.mediaEvent(AC_media_error); } void onMediaRemoved() { dgus.mediaEvent(AC_media_removed); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) { #if ENABLED(SPEAKER) ::tone(BEEPER_PIN, frequency, duration); @@ -65,6 +69,26 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { dgus.confirmationRequest(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { dgus.statusChange(msg); } void onHomingStart() { dgus.homingStart(); } @@ -113,6 +137,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -137,20 +164,28 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result - switch (rst) { - case PID_STARTED: break; - case PID_BAD_HEATER_ID: break; - case PID_TEMP_TOO_HIGH: break; - case PID_TUNING_TIMEOUT: break; - case PID_DONE: break; - } } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // ANYCUBIC_LCD_VYPER diff --git a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp index 58aead69845d..2bc6e0d4617a 100644 --- a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp +++ b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp @@ -52,6 +52,10 @@ namespace ExtUI { void onMediaError() { TERN_(HAS_MEDIA, screen.sdCardError()); } void onMediaRemoved() { TERN_(HAS_MEDIA, screen.sdCardRemoved()); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) {} void onPrintTimerStarted() {} void onPrintTimerPaused() {} @@ -70,6 +74,26 @@ namespace ExtUI { } } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { screen.setStatusMessage(msg); } void onHomingStart() {} @@ -116,6 +140,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -128,6 +155,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -142,11 +173,12 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result switch (rst) { case PID_STARTED: case PID_BED_STARTED: + case PID_CHAMBER_STARTED: screen.setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case PID_BAD_HEATER_ID: @@ -164,10 +196,40 @@ namespace ExtUI { } screen.gotoScreen(DGUS_SCREEN_MAIN); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + switch (rst) { + case MPC_STARTED: + screen.setStatusMessage(GET_TEXT_F(MSG_MPC_AUTOTUNE)); + break; + case MPC_TEMP_ERROR: + //screen.setStatusMessage(GET_TEXT_F(MSG_MPC_TEMP_ERROR)); + break; + case MPC_INTERRUPTED: + //screen.setStatusMessage(GET_TEXT_F(MSG_MPC_INTERRUPTED)); + break; + case MPC_DONE: + //screen.setStatusMessage(GET_TEXT_F(MSG_MPC_AUTOTUNE_DONE)); + break; + } + screen.gotoScreen(DGUS_SCREEN_MAIN); + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // HAS_DGUS_LCD_CLASSIC diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp index 58313e433343..c88412fe2ccc 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp @@ -369,7 +369,7 @@ void DGUSScreenHandler::addCurrentPageStringLength(size_t stringLength, size_t t #endif #if HAS_PID_HEATING - void DGUSScreenHandler::pidTuning(const ExtUI::result_t rst) { + void DGUSScreenHandler::pidTuning(const ExtUI::pidresult_t rst) { dgus.playSound(3); } #endif diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.h index a5f053043c7a..2f8c53f14d0e 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.h @@ -132,7 +132,7 @@ class DGUSScreenHandler { #endif #if HAS_PID_HEATING - static void pidTuning(const ExtUI::result_t rst); + static void pidTuning(const ExtUI::pidresult_t rst); #endif static void steppersStatusChanged(bool steppersEnabled); diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp b/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp index 41f5b41d4982..f3f4ff961cc5 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp @@ -59,6 +59,10 @@ namespace ExtUI { void onMediaError() { TERN_(HAS_MEDIA, screen.sdCardError()); } void onMediaRemoved() { TERN_(HAS_MEDIA, screen.sdCardRemoved()); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) { screen.playTone(frequency, duration); } @@ -83,6 +87,26 @@ namespace ExtUI { screen.userConfirmRequired(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { screen.setStatusMessage(msg); } @@ -120,6 +144,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() { screen.levelingStart(); } void onLevelingDone() { screen.levelingEnd(); } + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -129,6 +156,10 @@ namespace ExtUI { void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -143,10 +174,23 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result screen.pidTuning(rst); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() { @@ -156,6 +200,9 @@ namespace ExtUI { void onSteppersEnabled() { screen.steppersStatusChanged(true); } + + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // DGUS_LCD_UI_RELOADED diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp index c953b417a53a..b8ef8bcacc04 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp @@ -598,7 +598,7 @@ void DGUSRxHandler::filamentMove(DGUS_VP &vp, void *data_ptr) { } if (ExtUI::getActualTemp_celsius(extruder) < (float)EXTRUDE_MINTEMP) { - screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_TEMP_TOO_LOW)); + screen.setStatusMessage(GET_TEXT_F(MSG_TEMP_TOO_LOW)); return; } diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp index aaef68632ac0..181d1ae34c04 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp @@ -305,10 +305,11 @@ void DGUSScreenHandler::filamentRunout(const ExtUI::extruder_t extruder) { #if HAS_PID_HEATING - void DGUSScreenHandler::pidTuning(const ExtUI::result_t rst) { + void DGUSScreenHandler::pidTuning(const ExtUI::pidresult_t rst) { switch (rst) { case ExtUI::PID_STARTED: case ExtUI::PID_BED_STARTED: + case ExtUI::PID_CHAMBER_STARTED: setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case ExtUI::PID_BAD_HEATER_ID: diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h index 2cffd55e2319..ed8b163d870f 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h @@ -66,7 +66,7 @@ class DGUSScreenHandler { #endif #if HAS_PID_HEATING - static void pidTuning(const ExtUI::result_t rst); + static void pidTuning(const ExtUI::pidresult_t rst); #endif static void setMessageLine(const char * const msg, const uint8_t line); diff --git a/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp b/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp index 1c62bee9d5af..fad878a2124f 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp @@ -54,6 +54,10 @@ namespace ExtUI { void onMediaError() { TERN_(HAS_MEDIA, screen.sdCardError()); } void onMediaRemoved() { TERN_(HAS_MEDIA, screen.sdCardRemoved()); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) { screen.playTone(frequency, duration); } @@ -78,6 +82,26 @@ namespace ExtUI { screen.userConfirmRequired(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { screen.setStatusMessage(msg); } @@ -112,6 +136,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -125,6 +152,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -139,14 +170,29 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result screen.pidTuning(rst); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // DGUS_LCD_UI_RELOADED diff --git a/Marlin/src/lcd/extui/example/example.cpp b/Marlin/src/lcd/extui/example/example.cpp index 7f9ff62de43d..fb033b965539 100644 --- a/Marlin/src/lcd/extui/example/example.cpp +++ b/Marlin/src/lcd/extui/example/example.cpp @@ -52,6 +52,10 @@ namespace ExtUI { void onMediaError() {} void onMediaRemoved() {} + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) {} void onPrintTimerStarted() {} @@ -62,6 +66,20 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) {} + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) {} + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) {} + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) {} void onHomingStart() {} @@ -108,6 +126,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -120,6 +141,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -133,21 +158,43 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result switch (rst) { case PID_STARTED: case PID_BED_STARTED: + case PID_CHAMBER_STARTED: break; case PID_BAD_HEATER_ID: break; case PID_TEMP_TOO_HIGH: break; case PID_TUNING_TIMEOUT: break; case PID_DONE: break; } } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + switch (rst) { + case MPC_STARTED: break; + case MPC_TEMP_ERROR: break; + case MPC_INTERRUPTED: break; + case MPC_DONE: break; + } + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // EXTUI_EXAMPLE && EXTENSIBLE_UI diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp index 0dda4a977d1e..48c136bd6e8e 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp @@ -70,6 +70,10 @@ namespace ExtUI { #endif } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onStatusChanged(const char *lcd_msg) { StatusScreen::setStatusMessage(lcd_msg); } void onPrintTimerStarted() { @@ -117,9 +121,32 @@ namespace ExtUI { ConfirmUserRequestAlertBox::hide(); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -131,6 +158,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -144,12 +175,13 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result - //SERIAL_ECHOLNPGM("OnPidTuning:", rst); + //SERIAL_ECHOLNPGM("OnPIDTuning:", rst); switch (rst) { case PID_STARTED: case PID_BED_STARTED: + case PID_CHAMBER_STARTED: StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case PID_BAD_HEATER_ID: @@ -167,10 +199,31 @@ namespace ExtUI { } GOTO_SCREEN(StatusScreen); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } #endif // HAS_PID_HEATING + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + switch (rst) { + case MPC_STARTED: + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MPC_AUTOTUNE)); + break; + } + GOTO_SCREEN(StatusScreen); + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} + #endif + void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp index af5d1c7ace7c..3440cf987daa 100644 --- a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp @@ -98,6 +98,10 @@ void onMediaRemoved() { } } +void onHeatingError(const heater_id_t header_id) {} +void onMinTempError(const heater_id_t header_id) {} +void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t, const uint16_t/*=0*/) { rts.sendData(StartSoundSet, SoundAddr); } @@ -228,6 +232,26 @@ void onUserConfirmRequired(const char *const msg) { lastPauseMsgState = ExtUI::pauseModeStatus; } +// For fancy LCDs include an icon ID, message, and translated button title +void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); +} +void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); +} + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } +#endif + void onStatusChanged(const char *const statMsg) { for (int16_t j = 0; j < 20; j++) // Clear old message rts.sendData(' ', StatusMessageString + j); @@ -356,6 +380,10 @@ void onPostprocessSettings() {} } #endif +#if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} +#endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -373,7 +401,7 @@ void onPostprocessSettings() {} #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result rts.sendData(pid_hotendAutoTemp, HotendPID_AutoTmp); rts.sendData(pid_bedAutoTemp, BedPID_AutoTmp); @@ -387,6 +415,19 @@ void onPostprocessSettings() {} #endif onStatusChanged(F("PID Tune Finished")); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } +#endif + +#if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + } +#endif + +#if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onHomingStart() {} @@ -396,6 +437,8 @@ void onPrintDone() {} void onSteppersDisabled() {} void onSteppersEnabled() {} +void onAxisDisabled(const axis_t) {} +void onAxisEnabled(const axis_t) {} } // ExtUI diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp index 15810b67a570..797b80b0d542 100644 --- a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp @@ -163,21 +163,10 @@ void RTS::onIdle() { TERN_(HAS_MULTI_HOTEND, rts.sendData(uint8_t(getActiveTool() + 1), ActiveToolVP)); if (awaitingUserConfirm() && (lastPauseMsgState != ExtUI::pauseModeStatus || userConfValidation > 99)) { - switch (ExtUI::pauseModeStatus) { - case PAUSE_MESSAGE_PARKING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; - case PAUSE_MESSAGE_CHANGING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; - case PAUSE_MESSAGE_UNLOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; - case PAUSE_MESSAGE_WAITING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING)); break; - case PAUSE_MESSAGE_INSERT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT)); break; - case PAUSE_MESSAGE_LOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; - case PAUSE_MESSAGE_PURGE: ExtUI::onUserConfirmRequired(GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE))); break; - case PAUSE_MESSAGE_RESUME: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; - case PAUSE_MESSAGE_HEAT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT)); break; - case PAUSE_MESSAGE_HEATING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; - case PAUSE_MESSAGE_OPTION: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_OPTION_HEADER)); break; - case PAUSE_MESSAGE_STATUS: break; - default: onUserConfirmRequired(PSTR("Confirm Continue")); break; - } + if (ExtUI::pauseModeStatus < PAUSE_MESSAGE_COUNT) + ui.pause_show_message(ExtUI::pauseModeStatus); + else + ExtUI::onUserConfirmRequired(F("Confirm Continue")); userConfValidation = 0; } else if (pause_resume_selected && !awaitingUserConfirm()) { diff --git a/Marlin/src/lcd/extui/malyan/malyan_extui.cpp b/Marlin/src/lcd/extui/malyan/malyan_extui.cpp index 00bc173fb3f2..9287091cfe60 100644 --- a/Marlin/src/lcd/extui/malyan/malyan_extui.cpp +++ b/Marlin/src/lcd/extui/malyan/malyan_extui.cpp @@ -104,12 +104,13 @@ namespace ExtUI { #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result - //SERIAL_ECHOLNPGM("OnPidTuning:", rst); + //SERIAL_ECHOLNPGM("OnPIDTuning:", rst); switch (rst) { case PID_STARTED: case PID_BED_STARTED: + case PID_CHAMBER_STARTED: set_lcd_error(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case PID_BAD_HEATER_ID: @@ -127,6 +128,10 @@ namespace ExtUI { } } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif void onPrintTimerStarted() { write_to_lcd(F("{SYS:BUILD}")); } @@ -140,11 +145,27 @@ namespace ExtUI { void onMediaError() {} void onMediaRemoved() {} + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t, const uint16_t/*=0*/) {} void onFilamentRunout(const extruder_t extruder) {} void onUserConfirmRequired(const char * const) {} + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) {} + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) {} + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) {} + #endif + void onHomingStart() {} void onHomingDone() {} @@ -160,6 +181,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -167,6 +191,10 @@ namespace ExtUI { void onMeshUpdate(const int8_t, const int8_t, const ExtUI::probe_state_t) {} #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -179,8 +207,20 @@ namespace ExtUI { } #endif + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} + #endif + void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // MALYAN_LCD diff --git a/Marlin/src/lcd/extui/nextion/nextion_extui.cpp b/Marlin/src/lcd/extui/nextion/nextion_extui.cpp index fc864320971c..e72167d38013 100644 --- a/Marlin/src/lcd/extui/nextion/nextion_extui.cpp +++ b/Marlin/src/lcd/extui/nextion/nextion_extui.cpp @@ -43,6 +43,10 @@ namespace ExtUI { void onMediaError() {} void onMediaRemoved() {} + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) {} void onPrintTimerStarted() {} void onPrintTimerPaused() {} @@ -51,6 +55,26 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { nextion.confirmationRequest(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { nextion.statusChange(msg); } void onHomingStart() {} @@ -97,6 +121,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -109,6 +136,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -122,15 +153,29 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result nextion.panelInfo(37); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} - + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // NEXTION_TFT diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 9d0b7e2723de..ec9b05318c47 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -106,7 +106,7 @@ #include "../../feature/host_actions.h" #endif -#if M600_PURGE_MORE_RESUMABLE +#if ENABLED(ADVANCED_PAUSE_FEATURE) #include "../../feature/pause.h" #endif @@ -1116,10 +1116,39 @@ namespace ExtUI { } void setUserConfirmed() { TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); } - #if M600_PURGE_MORE_RESUMABLE + #if ENABLED(ADVANCED_PAUSE_FEATURE) void setPauseMenuResponse(PauseMenuResponse response) { pause_menu_response = response; } - PauseMessage pauseModeStatus = PAUSE_MESSAGE_STATUS; PauseMode getPauseMode() { return pause_mode; } + + PauseMessage pauseModeStatus = PAUSE_MESSAGE_STATUS; + + void stdOnPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + if (mode != PAUSE_MODE_SAME) pause_mode = mode; + pauseModeStatus = message; + switch (message) { + case PAUSE_MESSAGE_PARKING: onUserConfirmRequired(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; + case PAUSE_MESSAGE_CHANGING: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; + case PAUSE_MESSAGE_UNLOAD: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; + case PAUSE_MESSAGE_WAITING: onUserConfirmRequired(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING)); break; + case PAUSE_MESSAGE_INSERT: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT)); break; + case PAUSE_MESSAGE_LOAD: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; + case PAUSE_MESSAGE_PURGE: onUserConfirmRequired( + GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE)) + ); + break; + case PAUSE_MESSAGE_RESUME: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; + case PAUSE_MESSAGE_HEAT: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT)); break; + case PAUSE_MESSAGE_HEATING: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; + case PAUSE_MESSAGE_OPTION: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_OPTION_HEADER)); break; + case PAUSE_MESSAGE_STATUS: break; + default: break; + } + } + #endif void printFile(const char *filename) { @@ -1228,17 +1257,30 @@ namespace ExtUI { // // MarlinUI passthroughs to ExtUI // +#if DISABLED(HAS_DWIN_E3V2) + void MarlinUI::init_lcd() { ExtUI::onStartup(); } -void MarlinUI::init_lcd() { ExtUI::onStartup(); } + void MarlinUI::update() { ExtUI::onIdle(); } -void MarlinUI::update() { ExtUI::onIdle(); } + void MarlinUI::kill_screen(FSTR_P const error, FSTR_P const component) { + using namespace ExtUI; + if (!flags.printer_killed) { + flags.printer_killed = true; + onPrinterKilled(error, component); + } + } +#endif -void MarlinUI::kill_screen(FSTR_P const error, FSTR_P const component) { - using namespace ExtUI; - if (!flags.printer_killed) { - flags.printer_killed = true; - onPrinterKilled(error, component); +#if ENABLED(ADVANCED_PAUSE_FEATURE) + + void MarlinUI::pause_show_message( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + ExtUI::onPauseMode(message, mode, extruder); } -} + +#endif #endif // EXTENSIBLE_UI diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index b7d670de13d6..8202f7be8d0a 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -46,8 +46,10 @@ #include "../marlinui.h" #include "../../gcode/gcode.h" +#include "../../module/temperature.h" -#if M600_PURGE_MORE_RESUMABLE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../../module/motion.h" #include "../../feature/pause.h" #endif @@ -66,14 +68,12 @@ namespace ExtUI { enum extruder_t : uint8_t { E0, E1, E2, E3, E4, E5, E6, E7 }; enum heater_t : uint8_t { H0, H1, H2, H3, H4, H5, BED, CHAMBER, COOLER }; enum fan_t : uint8_t { FAN0, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7 }; - enum result_t : uint8_t { - OPTITEM(HAS_PID_HEATING, PID_STARTED) - OPTITEM(HAS_PID_HEATING, PID_BED_STARTED) - OPTITEM(HAS_PID_HEATING, PID_BAD_HEATER_ID) - OPTITEM(HAS_PID_HEATING, PID_TEMP_TOO_HIGH) - OPTITEM(HAS_PID_HEATING, PID_TUNING_TIMEOUT) - OPTITEM(HAS_PID_HEATING, PID_DONE) - }; + #if HAS_PID_HEATING + enum pidresult_t : uint8_t { PID_STARTED, PID_BED_STARTED, PID_CHAMBER_STARTED, PID_BAD_HEATER_ID, PID_TEMP_TOO_HIGH, PID_TUNING_TIMEOUT, PID_DONE }; + #endif + #if ENABLED(MPC_AUTOTUNE) + enum mpcresult_t : uint8_t { MPC_STARTED, MPC_TEMP_ERROR, MPC_INTERRUPTED, MPC_DONE }; + #endif constexpr uint8_t extruderCount = EXTRUDERS; constexpr uint8_t hotendCount = HOTENDS; @@ -234,6 +234,9 @@ namespace ExtUI { bool getLevelingIsValid(); void onLevelingStart(); void onLevelingDone(); + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp(); + #endif #if HAS_MESH // Mesh data, utilities, events bed_mesh_t& getMeshArray(); @@ -312,10 +315,9 @@ namespace ExtUI { bool awaitingUserConfirm(); void setUserConfirmed(); - #if M600_PURGE_MORE_RESUMABLE + #if ENABLED(ADVANCED_PAUSE_FEATURE) // "Purge More" has a control screen void setPauseMenuResponse(PauseMenuResponse); - extern PauseMessage pauseModeStatus; PauseMode getPauseMode(); #endif @@ -488,6 +490,10 @@ namespace ExtUI { void onMediaError(); void onMediaRemoved(); + void onHeatingError(const heater_id_t header_id); + void onMinTempError(const heater_id_t header_id); + void onMaxTempError(const heater_id_t header_id); + void onPlayTone(const uint16_t frequency, const uint16_t duration=0); void onPrinterKilled(FSTR_P const error, FSTR_P const component); @@ -503,6 +509,17 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg); void onUserConfirmRequired(FSTR_P const fstr); + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn); + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn); + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + // Standard stdOnPauseMode sets pauseModeStatus and calls onUserConfirmRequired + extern PauseMessage pauseModeStatus; + void stdOnPauseMode(const PauseMessage message, const PauseMode mode=PAUSE_MODE_SAME, const uint8_t extruder=active_extruder); + void onPauseMode(const PauseMessage message, const PauseMode mode=PAUSE_MODE_SAME, const uint8_t extruder=active_extruder); + #endif + void onStatusChanged(const char * const msg); void onStatusChanged(FSTR_P const fstr); @@ -511,6 +528,8 @@ namespace ExtUI { void onSteppersDisabled(); void onSteppersEnabled(); + void onAxisDisabled(const axis_t axis); + void onAxisEnabled(const axis_t axis); void onFactoryReset(); void onStoreSettings(char *); @@ -519,13 +538,23 @@ namespace ExtUI { void onSettingsStored(const bool success); void onSettingsLoaded(const bool success); + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t t); + #endif #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff); void onPowerLoss(); void onPowerLossResume(); #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst); + void onPIDTuning(const pidresult_t rst); + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp); + #endif + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst); + #endif + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash(); #endif }; diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 2ea52c2ccf5d..1ecf65a57fe0 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -360,8 +360,17 @@ namespace LanguageNarrow_en { LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("PID tuning done"); LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Autotune failed!"); + LSTR MSG_PID_FOR_NOZZLE = _UxGT("for Nozzle is running."); + LSTR MSG_PID_FOR_BED = _UxGT("for BED is running."); + LSTR MSG_PID_FOR_CHAMBER = _UxGT("for CHAMBER is running."); + + LSTR MSG_TEMP_NOZZLE = _UxGT("Nozzle Temperature"); + LSTR MSG_TEMP_BED = _UxGT("Bed Temperature"); + LSTR MSG_TEMP_CHAMBER = _UxGT("Chamber Temperature"); + LSTR MSG_BAD_HEATER_ID = _UxGT("Bad extruder."); LSTR MSG_TEMP_TOO_HIGH = _UxGT("Temperature too high."); + LSTR MSG_TEMP_TOO_LOW = _UxGT("Temperature too low"); LSTR MSG_PID_BAD_HEATER_ID = _UxGT("Autotune failed! Bad extruder."); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed! Temperature too high."); @@ -841,7 +850,7 @@ namespace LanguageNarrow_en { LSTR MSG_XATC = _UxGT("X-Twist Wizard"); LSTR MSG_XATC_DONE = _UxGT("X-Twist Wizard Done!"); - LSTR MSG_XATC_UPDATE_Z_OFFSET = _UxGT("Update Probe Z-Offset to "); + LSTR MSG_XATC_UPDATE_Z_OFFSET = _UxGT("Update Z-Offset to "); LSTR MSG_SOUND = _UxGT("Sound"); @@ -881,7 +890,6 @@ namespace LanguageNarrow_en { LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Not allowed during print"); LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("Not allowed while idle"); LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("No file selected"); - LSTR DGUS_MSG_TEMP_TOO_LOW = _UxGT("Temperature too low"); LSTR DGUS_MSG_EXECUTING_COMMAND = _UxGT("Executing command..."); LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("Bed PID disabled"); LSTR DGUS_MSG_PID_DISABLED = _UxGT("PID disabled"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 52bbd7fac3c6..09e7f949174f 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -263,6 +263,8 @@ namespace LanguageNarrow_fr { LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Echec Autotune! Temp. trop haute"); LSTR MSG_PID_TIMEOUT = _UxGT("Echec Autotune! Opér. expirée"); + LSTR MSG_TEMP_TOO_LOW = _UxGT("Temperature trop basse"); + LSTR MSG_SELECT_E = _UxGT("Sélectionner *"); LSTR MSG_ACC = _UxGT("Accélération"); LSTR MSG_JERK = _UxGT("Jerk"); @@ -598,7 +600,6 @@ namespace LanguageNarrow_fr { LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Impossible pendant une impression"); LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("Impossible tant que l'imprimante est en attente"); LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("Aucun fichier selectionne"); - LSTR DGUS_MSG_TEMP_TOO_LOW = _UxGT("Temperature trop basse"); LSTR DGUS_MSG_EXECUTING_COMMAND = _UxGT("Execution de la commande..."); LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("Bed PID desactive"); LSTR DGUS_MSG_PID_DISABLED = _UxGT("PID desactive"); diff --git a/Marlin/src/lcd/language/language_fr_na.h b/Marlin/src/lcd/language/language_fr_na.h index 98302af61c70..dc31af4fcb0e 100644 --- a/Marlin/src/lcd/language/language_fr_na.h +++ b/Marlin/src/lcd/language/language_fr_na.h @@ -263,6 +263,8 @@ namespace LanguageNarrow_fr_na { LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Echec Autotune! Temp. trop haute"); LSTR MSG_PID_TIMEOUT = _UxGT("Echec Autotune! Oper. expiree"); + LSTR MSG_TEMP_TOO_LOW = _UxGT("Temperature trop basse"); + LSTR MSG_SELECT_E = _UxGT("Selectionner *"); LSTR MSG_ACC = _UxGT("Acceleration"); LSTR MSG_JERK = _UxGT("Jerk"); @@ -601,7 +603,6 @@ namespace LanguageNarrow_fr_na { LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Impossible pendant une impression"); LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("Impossible tant que l'imprimante est en attente"); LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("Aucun fichier selectionne"); - LSTR DGUS_MSG_TEMP_TOO_LOW = _UxGT("Temperature trop basse"); LSTR DGUS_MSG_EXECUTING_COMMAND = _UxGT("Execution de la commande..."); LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("Bed PID desactive"); LSTR DGUS_MSG_PID_DISABLED = _UxGT("PID desactive"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 08b048eadd4e..7a4f17d49b58 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -849,7 +849,6 @@ namespace LanguageNarrow_it { LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Non ammesso durante la stampa"); LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("Non ammesso mentre è in riposo"); LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("Nessun file selezionato"); - LSTR DGUS_MSG_TEMP_TOO_LOW = _UxGT("Temperatura troppo bassa"); LSTR DGUS_MSG_EXECUTING_COMMAND = _UxGT("Esecuzione del comando..."); LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("PID piatto disabilitato"); LSTR DGUS_MSG_PID_DISABLED = _UxGT("PID disabilitato"); @@ -888,6 +887,7 @@ namespace LanguageWide_it { LSTR MSG_INFO_PRINT_TIME = _UxGT("Tempo totale"); LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Lavoro più lungo"); LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Totale estruso"); + LSTR MSG_TEMP_TOO_LOW = _UxGT("Temperatura troppo bassa"); #endif } diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 23aefff2f7de..1a335bac3a92 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -351,6 +351,7 @@ namespace LanguageNarrow_tr { LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Kalibrasyon başarısız!"); LSTR MSG_BAD_HEATER_ID = _UxGT("Kötü ekstruder."); LSTR MSG_TEMP_TOO_HIGH = _UxGT("Sıcaklık çok yüksek."); + LSTR MSG_TEMP_TOO_LOW = _UxGT("Sıcaklık çok düşük"); LSTR MSG_PID_BAD_HEATER_ID = _UxGT("Kalibrasyon başarısız! Kötü ekstruder."); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Kalibrasyon başarısız! Sıcaklık çok yüksek."); LSTR MSG_PID_TIMEOUT = _UxGT("Kalibrasyon başarısız! Zaman aşımı."); @@ -867,7 +868,6 @@ namespace LanguageNarrow_tr { LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Yazdırma sırasında izin verilmez"); LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("Boştayken izin verilmez"); LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("Seçili dosya yok"); - LSTR DGUS_MSG_TEMP_TOO_LOW = _UxGT("Sıcaklık çok düşük"); LSTR DGUS_MSG_EXECUTING_COMMAND = _UxGT("Komut yürütülüyor..."); LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("Tabla PID pasif"); LSTR DGUS_MSG_PID_DISABLED = _UxGT("PID devre dışı"); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 4eed5f3c6595..aaa8fb65e837 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -48,8 +48,6 @@ MarlinUI ui; #if ENABLED(DWIN_CREALITY_LCD) #include "e3v2/creality/dwin.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "e3v2/proui/dwin.h" #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) #include "e3v2/jyersui/dwin.h" #endif @@ -69,7 +67,7 @@ MarlinUI ui; constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #if HAS_STATUS_MESSAGE - #if ENABLED(STATUS_MESSAGE_SCROLLING) && ANY(HAS_WIRED_LCD, DWIN_LCD_PROUI) + #if ENABLED(STATUS_MESSAGE_SCROLLING) uint8_t MarlinUI::status_scroll_offset; // = 0 #endif MString MarlinUI::status_message; @@ -1490,7 +1488,7 @@ void MarlinUI::host_notify(const char * const cstr) { else if (!no_welcome) msg = GET_TEXT_F(WELCOME_MSG); - else if (ENABLED(DWIN_LCD_PROUI)) + else if (ENABLED(STATUS_DO_CLEAR_EMPTY)) msg = F(""); else return; @@ -1609,7 +1607,6 @@ void MarlinUI::host_notify(const char * const cstr) { TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); TERN_(DWIN_CREALITY_LCD, dwinStatusChanged(status_message)); - TERN_(DWIN_LCD_PROUI, dwinCheckStatusMessage()); TERN_(DWIN_CREALITY_LCD_JYERSUI, jyersDWIN.updateStatus(status_message)); } @@ -1888,36 +1885,6 @@ void MarlinUI::host_notify(const char * const cstr) { #endif -#if ALL(EXTENSIBLE_UI, ADVANCED_PAUSE_FEATURE) - - void MarlinUI::pause_show_message( - const PauseMessage message, - const PauseMode mode/*=PAUSE_MODE_SAME*/, - const uint8_t extruder/*=active_extruder*/ - ) { - if (mode != PAUSE_MODE_SAME) pause_mode = mode; - ExtUI::pauseModeStatus = message; - switch (message) { - case PAUSE_MESSAGE_PARKING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; - case PAUSE_MESSAGE_CHANGING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; - case PAUSE_MESSAGE_UNLOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; - case PAUSE_MESSAGE_WAITING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING)); break; - case PAUSE_MESSAGE_INSERT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT)); break; - case PAUSE_MESSAGE_LOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; - case PAUSE_MESSAGE_PURGE: - ExtUI::onUserConfirmRequired(GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE))); - break; - case PAUSE_MESSAGE_RESUME: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; - case PAUSE_MESSAGE_HEAT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT)); break; - case PAUSE_MESSAGE_HEATING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; - case PAUSE_MESSAGE_OPTION: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_OPTION_HEADER)); break; - case PAUSE_MESSAGE_STATUS: break; - default: break; - } - } - -#endif - #if ENABLED(EEPROM_SETTINGS) #if HAS_MARLINUI_MENU diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 3388c2047bc4..f21d2565bef6 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -53,6 +53,10 @@ #include "e3v2/proui/dwin.h" #endif +#if ALL(HAS_STATUS_MESSAGE, IS_DWIN_MARLINUI) + #include "e3v2/marlinui/marlinui_dwin.h" // for LCD_WIDTH +#endif + typedef bool (*statusResetFunc_t)(); #if HAS_WIRED_LCD @@ -753,7 +757,7 @@ class MarlinUI { static bool use_click() { return false; } #endif - #if ENABLED(ADVANCED_PAUSE_FEATURE) && ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) + #if ENABLED(ADVANCED_PAUSE_FEATURE) && ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI, DWIN_CREALITY_LCD_JYERSUI) static void pause_show_message(const PauseMessage message, const PauseMode mode=PAUSE_MODE_SAME, const uint8_t extruder=active_extruder); #else static void _pause_show_message() {} diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index c7558db43fc4..f9748871f5c8 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -31,7 +31,7 @@ #include "../inc/MarlinConfig.h" #if ALL(DWIN_LCD_PROUI, INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) - #include "../lcd/e3v2/proui/dwin.h" + #include "../lcd/e3v2/proui/dwin.h" // for Z_POST_CLEARANCE #endif #if IS_SCARA @@ -413,12 +413,12 @@ void remember_feedrate_scaling_off(); void restore_feedrate_and_scaling(); #if HAS_Z_AXIS - #if ALL(DWIN_LCD_PROUI, INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) - #define Z_POST_CLEARANCE hmiData.zAfterHoming - #elif defined(Z_AFTER_HOMING) - #define Z_POST_CLEARANCE Z_AFTER_HOMING - #else - #define Z_POST_CLEARANCE Z_CLEARANCE_FOR_HOMING + #ifndef Z_POST_CLEARANCE // May be set by proui/dwin.h :-P + #ifdef Z_AFTER_HOMING + #define Z_POST_CLEARANCE Z_AFTER_HOMING + #else + #define Z_POST_CLEARANCE Z_CLEARANCE_FOR_HOMING + #endif #endif void do_z_clearance(const_float_t zclear, const bool with_probe=true, const bool lower_allowed=false); void do_z_clearance_by(const_float_t zclear); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 2fec098b8aaa..342ce2bb3af3 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -96,8 +96,6 @@ #if ENABLED(EXTENSIBLE_UI) #include "../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../lcd/e3v2/proui/dwin_popup.h" #endif #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) @@ -376,8 +374,11 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #endif TERN_(HOST_PROMPT_SUPPORT, hostui.continue_prompt(ds_fstr)); - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(ds_fstr)); - TERN_(DWIN_LCD_PROUI, dwinPopupConfirm(ICON_BLTouch, ds_fstr, FPSTR(CONTINUE_STR))); + #if ENABLED(DWIN_LCD_PROUI) + ExtUI::onUserConfirmRequired(ICON_BLTouch, ds_fstr, FPSTR(CONTINUE_STR)); + #elif ENABLED(EXTENSIBLE_UI) + ExtUI::onUserConfirmRequired(ds_fstr); + #endif TERN_(HAS_RESUME_CONTINUE, wait_for_user_response()); ui.reset_status(); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index b382f80d5149..48800138621f 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -75,11 +75,13 @@ #include "../feature/z_stepper_align.h" #endif -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) +#if ENABLED(DWIN_LCD_PROUI) #include "../lcd/e3v2/proui/dwin.h" #include "../lcd/e3v2/proui/bedlevel_tools.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) #include "../lcd/e3v2/jyersui/dwin.h" #endif @@ -490,6 +492,13 @@ typedef struct SettingsDataStruct { #endif uint32_t motor_current_setting[MOTOR_CURRENT_COUNT]; // M907 X Z E ... + // + // Adaptive Step Smoothing state + // + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + bool adaptive_step_smoothing_enabled; // G-code pending + #endif + // // CNC_COORDINATE_SYSTEMS // @@ -537,9 +546,7 @@ typedef struct SettingsDataStruct { // // Ender-3 V2 DWIN // - #if ENABLED(DWIN_LCD_PROUI) - uint8_t dwin_data[eeprom_data_size]; - #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) + #if ENABLED(DWIN_CREALITY_LCD_JYERSUI) uint8_t dwin_settings[jyersDWIN.eeprom_data_size]; #endif @@ -1530,6 +1537,14 @@ void MarlinSettings::postprocess() { #endif } + // + // Adaptive Step Smoothing state + // + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + _FIELD_TEST(adaptive_step_smoothing_enabled); + EEPROM_WRITE(stepper.adaptive_step_smoothing_enabled); + #endif + // // CNC Coordinate Systems // @@ -1606,17 +1621,8 @@ void MarlinSettings::postprocess() { #endif // - // Creality DWIN User Data + // JyersUI DWIN User Data // - #if ENABLED(DWIN_LCD_PROUI) - { - _FIELD_TEST(dwin_data); - char dwin_data[eeprom_data_size] = { 0 }; - dwinCopySettingsTo(dwin_data); - EEPROM_WRITE(dwin_data); - } - #endif - #if ENABLED(DWIN_CREALITY_LCD_JYERSUI) { _FIELD_TEST(dwin_settings); @@ -2599,6 +2605,13 @@ void MarlinSettings::postprocess() { #endif } + // + // Adaptive Step Smoothing state + // + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + EEPROM_READ(stepper.adaptive_step_smoothing_enabled); + #endif + // // CNC Coordinate System // @@ -2690,16 +2703,9 @@ void MarlinSettings::postprocess() { #endif // - // DWIN User Data + // JyersUI User Data // - #if ENABLED(DWIN_LCD_PROUI) - { - const char dwin_data[eeprom_data_size] = { 0 }; - _FIELD_TEST(dwin_data); - EEPROM_READ(dwin_data); - if (!validating) dwinCopySettingsFrom(dwin_data); - } - #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) + #if ENABLED(DWIN_CREALITY_LCD_JYERSUI) { const char dwin_settings[jyersDWIN.eeprom_data_size] = { 0 }; _FIELD_TEST(dwin_settings); @@ -3544,6 +3550,13 @@ void MarlinSettings::reset() { DEBUG_ECHOLNPGM("Digipot Written"); #endif + // + // Adaptive Step Smoothing state + // + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + stepper.adaptive_step_smoothing_enabled = true; + #endif + // // CNC Coordinate System // @@ -3589,11 +3602,6 @@ void MarlinSettings::reset() { // TERN_(DGUS_LCD_UI_MKS, MKS_reset_settings()); - // - // Ender-3 V2 with ProUI - // - TERN_(DWIN_LCD_PROUI, dwinSetDataDefaults()); - // // Model predictive control // diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 851fa452e7b9..803c14d73cca 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -204,6 +204,11 @@ uint32_t Stepper::acceleration_time, Stepper::deceleration_time; #endif #if ENABLED(ADAPTIVE_STEP_SMOOTHING) + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + bool Stepper::adaptive_step_smoothing_enabled; // Initialized by settings.load() + #else + constexpr bool Stepper::adaptive_step_smoothing_enabled; // = true + #endif // Oversampling factor (log2(multiplier)) to increase temporal resolution of axis uint8_t Stepper::oversampling_factor; #else @@ -547,6 +552,8 @@ void Stepper::enable_axis(const AxisEnum axis) { default: break; } mark_axis_enabled(axis); + + TERN_(EXTENSIBLE_UI, ExtUI::onAxisEnabled(ExtUI::axis_to_axis_t(axis))); } /** @@ -567,7 +574,8 @@ void Stepper::enable_axis(const AxisEnum axis) { bool Stepper::disable_axis(const AxisEnum axis) { mark_axis_disabled(axis); - TERN_(DWIN_LCD_PROUI, set_axis_untrusted(axis)); // MRISCOC workaround: https://github.com/MarlinFirmware/Marlin/issues/23095 + // This scheme prevents shared steppers being disabled. It should consider several axes at once + // and keep a count of how many times each ENA pin has been set. // If all the axes that share the enabled bit are disabled const bool can_disable = can_axis_disable(axis); @@ -577,6 +585,7 @@ bool Stepper::disable_axis(const AxisEnum axis) { MAIN_AXIS_MAP(_CASE_DISABLE) default: break; } + TERN_(EXTENSIBLE_UI, ExtUI::onAxisDisabled(ExtUI::axis_to_axis_t(axis))); } return can_disable; @@ -2640,7 +2649,7 @@ hal_timer_t Stepper::block_phase_isr() { oversampling_factor = TERN(NONLINEAR_EXTRUSION, 1, 0); // Decide if axis smoothing is possible - if (TERN1(DWIN_LCD_PROUI, hmiData.adaptiveStepSmoothing)) { + if (stepper.adaptive_step_smoothing_enabled) { uint32_t max_rate = current_block->nominal_rate; // Get the step event rate while (max_rate < MIN_STEP_ISR_FREQUENCY) { // As long as more ISRs are possible... max_rate <<= 1; // Try to double the rate diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 8c13831d9e7b..6712198aaeb2 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -336,6 +336,12 @@ class Stepper { static ne_coeff_t ne; #endif + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + static bool adaptive_step_smoothing_enabled; + #else + static constexpr bool adaptive_step_smoothing_enabled = true; + #endif + private: static block_t* current_block; // A pointer to the block currently being traced diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 53b9f37fb2ef..a1fe14c75df3 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -52,8 +52,6 @@ #if ENABLED(DWIN_CREALITY_LCD) #include "../lcd/e3v2/creality/dwin.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../lcd/e3v2/proui/dwin.h" #endif #if ENABLED(EXTENSIBLE_UI) @@ -723,13 +721,11 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(HAS_FAN_LOGIC, fan_update_ms = next_temp_ms + fan_update_interval_ms); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_STARTED)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(isbed ? PIDTEMPBED_START : PIDTEMP_START)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ischamber ? ExtUI::pidresult_t::PID_CHAMBER_STARTED : isbed ? ExtUI::pidresult_t::PID_BED_STARTED : ExtUI::pidresult_t::PID_STARTED)); if (target > GHV(CHAMBER_MAX_TARGET, BED_MAX_TARGET, hotend_max_target(heater_id))) { SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_TEMP_TOO_HIGH)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::pidresult_t::PID_TEMP_TOO_HIGH)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH))); return; } @@ -822,8 +818,7 @@ volatile bool Temperature::raw_temps_ready = false; #endif if (current_temp > target + MAX_OVERSHOOT_PID_AUTOTUNE) { SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_TEMP_TOO_HIGH)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::pidresult_t::PID_TEMP_TOO_HIGH)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH))); break; } @@ -860,8 +855,7 @@ volatile bool Temperature::raw_temps_ready = false; #endif if ((ms - _MIN(t1, t2)) > MIN_TO_MS(PID_AUTOTUNE_MAX_CYCLE_MINS)) { TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_TUNING_TIMEOUT)); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_TUNING_TIMEOUT)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::pidresult_t::PID_TUNING_TIMEOUT)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TIMEOUT))); SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TIMEOUT); break; @@ -919,8 +913,7 @@ volatile bool Temperature::raw_temps_ready = false; EXIT_M303: TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPIDTuningDone(oldcolor)); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_DONE)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(AUTOTUNE_DONE)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::pidresult_t::PID_DONE)); TERN_(TEMP_TUNING_MAINTAIN_FAN, adaptive_fan_slowing = true); return; } @@ -1137,7 +1130,7 @@ volatile bool Temperature::raw_temps_ready = false; // Ensure we don't drift too far from the window between the last sampled temp and the target temperature if (!WITHIN(current_temp, get_sample_3_temp() - 15.0f, hotend.target + 15.0f)) { SERIAL_ECHOLNPGM(STR_MPC_TEMPERATURE_ERROR); - TERN_(DWIN_LCD_PROUI, dwinMPCTuning(MPC_TEMP_ERROR)); + TERN_(EXTENSIBLE_UI, ExtUI::onMPCTuning(ExtUI::mpcresult_t::MPC_TEMP_ERROR)); wait_for_heatup = false; return FAILED; } @@ -1175,7 +1168,7 @@ volatile bool Temperature::raw_temps_ready = false; if (!wait_for_heatup) { SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_INTERRUPTED); - TERN_(DWIN_LCD_PROUI, dwinMPCTuning(MPC_INTERRUPTED)); + TERN_(EXTENSIBLE_UI, ExtUI::onMPCTuning(ExtUI::mpcresult_t::MPC_INTERRUPTED)); return MeasurementState::CANCELLED; } @@ -1202,12 +1195,8 @@ volatile bool Temperature::raw_temps_ready = false; // Determine ambient temperature. SERIAL_ECHOLNPGM(STR_MPC_COOLING_TO_AMBIENT); - #if ENABLED(DWIN_LCD_PROUI) - dwinMPCTuning(MPCTEMP_START); - LCD_ALERTMESSAGE(MSG_MPC_COOLING_TO_AMBIENT); - #else - LCD_MESSAGE(MSG_COOLING); - #endif + TERN_(EXTENSIBLE_UI, ExtUI::onMPCTuning(ExtUI::mpcresult_t::MPCTEMP_START)); + TERN(DWIN_LCD_PROUI, LCD_ALERTMESSAGE(MSG_MPC_COOLING_TO_AMBIENT), LCD_MESSAGE(MSG_COOLING)); if (tuner.measure_ambient_temp() != MPC_autotuner::MeasurementState::SUCCESS) return; hotend.modeled_ambient_temp = tuner.get_ambient_temp(); @@ -1293,7 +1282,7 @@ volatile bool Temperature::raw_temps_ready = false; } SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_FINISHED); - TERN_(DWIN_LCD_PROUI, dwinMPCTuning(AUTOTUNE_DONE)); + TERN_(EXTENSIBLE_UI, ExtUI::onMPCTuning(ExtUI::mpcresult_t::MPC_DONE)); SERIAL_ECHOLNPGM("MPC_BLOCK_HEAT_CAPACITY ", mpc.block_heat_capacity); SERIAL_ECHOLNPGM("MPC_SENSOR_RESPONSIVENESS ", p_float_t(mpc.sensor_responsiveness, 4)); @@ -1532,15 +1521,17 @@ void Temperature::_temp_error( } void Temperature::maxtemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_TEMP, const celsius_float_t deg)) { - #if HAS_DWIN_E3V2_BASIC && (HAS_HOTEND || HAS_HEATED_BED) - dwinPopupTemperature(1); + #if HAS_HOTEND || HAS_HEATED_BED + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(1)); + TERN_(EXTENSIBLE_UI, ExtUI::onMaxTempError(heater_id)); #endif _TEMP_ERROR(heater_id, F(STR_T_MAXTEMP), MSG_ERR_MAXTEMP, deg); } void Temperature::mintemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_TEMP, const celsius_float_t deg)) { - #if HAS_DWIN_E3V2_BASIC && (HAS_HOTEND || HAS_HEATED_BED) - dwinPopupTemperature(0); + #if HAS_HOTEND || HAS_HEATED_BED + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); + TERN_(EXTENSIBLE_UI, ExtUI::onMinTempError(heater_id)); #endif _TEMP_ERROR(heater_id, F(STR_T_MINTEMP), MSG_ERR_MINTEMP, deg); } @@ -1765,7 +1756,8 @@ void Temperature::mintemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_T if (watch_hotend[e].check(temp)) // Increased enough? start_watching_hotend(e); // If temp reached, turn off elapsed check else { - TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); + TERN_(EXTENSIBLE_UI, ExtUI::onHeatingError(e)); _TEMP_ERROR(e, FPSTR(str_t_heating_failed), MSG_ERR_HEATING_FAILED, temp); } } @@ -1795,7 +1787,8 @@ void Temperature::mintemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_T if (watch_bed.check(deg)) // Increased enough? start_watching_bed(); // If temp reached, turn off elapsed check else { - TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); + TERN_(EXTENSIBLE_UI, ExtUI::onHeatingError(H_BED)); _TEMP_ERROR(H_BED, FPSTR(str_t_heating_failed), MSG_ERR_HEATING_FAILED, deg); } } @@ -3247,13 +3240,15 @@ void Temperature::init() { } // fall through case TRRunaway: - TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); + TERN_(EXTENSIBLE_UI, ExtUI::onHeatingError(heater_id)); _TEMP_ERROR(heater_id, FPSTR(str_t_thermal_runaway), MSG_ERR_THERMAL_RUNAWAY, current); break; #if ENABLED(THERMAL_PROTECTION_VARIANCE_MONITOR) case TRMalfunction: - TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); + TERN_(EXTENSIBLE_UI, ExtUI::onHeatingError(heater_id)); _TEMP_ERROR(heater_id, F(STR_T_THERMAL_MALFUNCTION), MSG_ERR_TEMP_MALFUNCTION, current); break; #endif diff --git a/buildroot/share/dwin/bin/DWIN_ICO.py b/buildroot/share/dwin/bin/DWIN_ICO.py index 436a98701de0..4594e5501725 100644 --- a/buildroot/share/dwin/bin/DWIN_ICO.py +++ b/buildroot/share/dwin/bin/DWIN_ICO.py @@ -76,23 +76,19 @@ def splitFile(self, filename, outDir): self._parseHeader(infile) self._splitEntryData(infile, outDir) - return - def _parseHeader(self, infile): maxEntries = 256 count = 0 - validEntries = 0 + icon_nums = _iconNames.keys() while count < maxEntries: rawBytes = infile.read(16) entry = Entry() entry.parseRawData(rawBytes) # check that it is valid: is offset nonzero? - # Special case: treat 39 as valid - if (entry.offset > 0) or (count == 39): - validEntries += 1 + # Special case: treat missing numbers as valid + if (entry.offset > 0) or count not in icon_nums: self.entries.append(entry) count += 1 - return def _splitEntryData(self, infile, outDir): print('Splitting Entry Data...') @@ -110,18 +106,16 @@ def _splitEntryData(self, infile, outDir): if entry.length == 0: count += 1 continue - # Seek file position, read length bytes, and write to new output file. - print('%02d: offset: 0x%06x len: 0x%04x width: %d height: %d' % - (count, entry.offset, entry.length, entry.width, entry.height)) - outfilename = os.path.join(outDir, '%03d-ICON_%s.jpg' % (count, _iconNames7[count])) + outfilename = os.path.join(outDir, '%03d-ICON_%s.jpg' % (count, _iconNames.get(count, "UNKNOWN"))) with open(outfilename, 'wb') as outfile: infile.seek(entry.offset) blob = infile.read(entry.length) outfile.write(blob) - print('Wrote %d bytes to %s' % (entry.length, outfilename)) + # Seek file position, read length bytes, and write to new output file. + print('(%3d: width=%3d height=%3d offset=%6d len=%4d) ... %s' % + (count, entry.width, entry.height, entry.offset, entry.length, os.path.basename(outfilename))) count += 1 - return def createFile(self, iconDir, filename): '''Create a new .ico file from the contents of iconDir. @@ -179,7 +173,6 @@ def _updateHeaderOffsets(self): offset += e.length #print('%03d: (%d x %d) len=%d off=%d' % # (i, e.width, e.height, e.length, e.offset)) - return def _combineAndWriteIcoFile(self, filename): """Write out final .ico file. @@ -198,7 +191,6 @@ def _combineAndWriteIcoFile(self, filename): if 0 == e.length: continue guts = self._getFileContents(e.filename, e.length) outfile.write(guts) - return def _getFileContents(self, filename, length): """Read contents of filename, and return bytes""" @@ -232,7 +224,6 @@ def parseRawData(self, rawEntryBytes): self.height = h self.offset = off self.length = len3 * 65536 + len21 - return def serialize(self): """Convert this Entry's information into a 16-byte @@ -245,97 +236,112 @@ def serialize(self): 0, 0, 0, 0, 0) return rawdata -_iconNames7 = { - 0 : "LOGO_Creality", - 1 : "Print_0", - 2 : "Print_1", - 3 : "Prepare_0", - 4 : "Prepare_1", - 5 : "Control_0", - 6 : "Control_1", - 7 : "Leveling_0", - 8 : "Leveling_1", - 9 : "HotendTemp", - 10 : "BedTemp", - 11 : "Speed", - 12 : "Zoffset", - 13 : "Back", - 14 : "File", - 15 : "PrintTime", - 16 : "RemainTime", - 17 : "Setup_0", - 18 : "Setup_1", - 19 : "Pause_0", - 20 : "Pause_1", - 21 : "Continue_0", - 22 : "Continue_1", - 23 : "Stop_0", - 24 : "Stop_1", - 25 : "Bar", - 26 : "More", - 27 : "Axis", - 28 : "CloseMotor", - 29 : "Homing", - 30 : "SetHome", - 31 : "PLAPreheat", - 32 : "ABSPreheat", - 33 : "Cool", - 34 : "Language", - 35 : "MoveX", - 36 : "MoveY", - 37 : "MoveZ", - 38 : "Extruder", - # Skip 39 - 40 : "Temperature", - 41 : "Motion", - 42 : "WriteEEPROM", - 43 : "ReadEEPROM", - 44 : "ResetEEPROM", - 45 : "Info", - 46 : "SetEndTemp", - 47 : "SetBedTemp", - 48 : "FanSpeed", - 49 : "SetPLAPreheat", - 50 : "SetABSPreheat", - 51 : "MaxSpeed", - 52 : "MaxAccelerated", - 53 : "MaxJerk", - 54 : "Step", - 55 : "PrintSize", - 56 : "Version", - 57 : "Contact", - 58 : "StockConfiguraton", - 59 : "MaxSpeedX", - 60 : "MaxSpeedY", - 61 : "MaxSpeedZ", - 62 : "MaxSpeedE", - 63 : "MaxAccX", - 64 : "MaxAccY", - 65 : "MaxAccZ", - 66 : "MaxAccE", - 67 : "MaxSpeedJerkX", - 68 : "MaxSpeedJerkY", - 69 : "MaxSpeedJerkZ", - 70 : "MaxSpeedJerkE", - 71 : "StepX", - 72 : "StepY", - 73 : "StepZ", - 74 : "StepE", - 75 : "Setspeed", - 76 : "SetZOffset", - 77 : "Rectangle", - 78 : "BLTouch", - 79 : "TempTooLow", - 80 : "AutoLeveling", - 81 : "TempTooHigh", - 82 : "NoTips_C", - 83 : "NoTips_E", - 84 : "Continue_C", - 85 : "Continue_E", - 86 : "Cancel_C", - 87 : "Cancel_E", - 88 : "Confirm_C", - 89 : "Confirm_E", - 90 : "Info_0", - 91 : "Info_1" +_iconNames = { + 0 : "LOGO_Creality", + 1 : "Print_0", + 2 : "Print_1", + 3 : "Prepare_0", + 4 : "Prepare_1", + 5 : "Control_0", + 6 : "Control_1", + 7 : "Leveling_0", + 8 : "Leveling_1", + 9 : "HotendTemp", + 10 : "BedTemp", + 11 : "Speed", + 12 : "Zoffset", + 13 : "Back", + 14 : "File", + 15 : "PrintTime", + 16 : "RemainTime", + 17 : "Setup_0", + 18 : "Setup_1", + 19 : "Pause_0", + 20 : "Pause_1", + 21 : "Continue_0", + 22 : "Continue_1", + 23 : "Stop_0", + 24 : "Stop_1", + 25 : "Bar", + 26 : "More", + 27 : "Axis", + 28 : "CloseMotor", + 29 : "Homing", + 30 : "SetHome", + 31 : "PLAPreheat", + 32 : "ABSPreheat", + 33 : "Cool", + 34 : "Language", + 35 : "MoveX", + 36 : "MoveY", + 37 : "MoveZ", + 38 : "Extruder", + # Skip 39 + 40 : "Temperature", + 41 : "Motion", + 42 : "WriteEEPROM", + 43 : "ReadEEPROM", + 44 : "ResetEEPROM", + 45 : "Info", + 46 : "SetEndTemp", + 47 : "SetBedTemp", + 48 : "FanSpeed", + 49 : "SetPLAPreheat", + 50 : "SetABSPreheat", + 51 : "MaxSpeed", + 52 : "MaxAccelerated", + 53 : "MaxJerk", + 54 : "Step", + 55 : "PrintSize", + 56 : "Version", + 57 : "Contact", + 58 : "StockConfiguraton", + 59 : "MaxSpeedX", + 60 : "MaxSpeedY", + 61 : "MaxSpeedZ", + 62 : "MaxSpeedE", + 63 : "MaxAccX", + 64 : "MaxAccY", + 65 : "MaxAccZ", + 66 : "MaxAccE", + 67 : "MaxSpeedJerkX", + 68 : "MaxSpeedJerkY", + 69 : "MaxSpeedJerkZ", + 70 : "MaxSpeedJerkE", + 71 : "StepX", + 72 : "StepY", + 73 : "StepZ", + 74 : "StepE", + 75 : "Setspeed", + 76 : "SetZOffset", + 77 : "Rectangle", + 78 : "BLTouch", + 79 : "TempTooLow", + 80 : "AutoLeveling", + 81 : "TempTooHigh", + 82 : "NoTips_C", + 83 : "NoTips_E", + 84 : "Continue_C", + 85 : "Continue_E", + 86 : "Cancel_C", + 87 : "Cancel_E", + 88 : "Confirm_C", + 89 : "Confirm_E", + 90 : "Info_0", + 91 : "Info_1", + 92 : "DegreesC", + 93 : "Printer_0", + 200 : "Checkbox_F", + 201 : "Checkbox_T", + 202 : "Fade", + 203 : "Mesh", + 204 : "Tilt", + 205 : "Brightness", + 206 : "Probe", + 249 : "AxisD", + 250 : "AxisBR", + 251 : "AxisTR", + 252 : "AxisBL", + 253 : "AxisTL", + 254 : "AxisC" } diff --git a/buildroot/share/dwin/bin/README.md b/buildroot/share/dwin/bin/README.md index a00d679bf8e1..c78f4eb97f32 100644 --- a/buildroot/share/dwin/bin/README.md +++ b/buildroot/share/dwin/bin/README.md @@ -4,7 +4,7 @@ Tools for processing `.ICO` files used by DWIN displays. ## Introduction -The DWIN LCDs that come with the Creality Ender-3 v2 and other 3D printers contain image and container files stored on them which are used to draw various the UI elements. +The DWIN LCDs that come with the Creality Ender-3 V2 and other 3D printers contain image and container files stored on them which are used to draw various the UI elements. Standard `.JPG` files can be installed for things like the boot screen, and `.ICO` files can contain several images within a structured file format. @@ -48,9 +48,11 @@ Pillow is most easily installed with pip: These tools process an `.ICO` file that you specify. The safest method is to create a folder and copy your `.ICO` file there. For example: +``` $ mkdir hackicons - $ cp 9.ICO hackicons + $ cp 7.ICO hackicons $ cd hackicons +``` The following explanations will refer back to this layout. @@ -58,35 +60,68 @@ The following explanations will refer back to this layout. If you want to edit the individual icons stored in an ICO file (or add more images) you'll first need to extract all the images from the archive using `splitIco.py`. -**Usage:** `splitIco.py #.ICO foldername`. - -**Example:** - -In this example we're extracting the constituent JPEG files from `9.ICO` and storing them in a folder named `icons`. As each file is extracted the script reports its index number, byte offset, size, dimensions, and filename: - - $ cd buildroot/share/dwin - $ ./bin/splitIco.py 9.ICO icons-9 - Splitting 9.ICO into dir icons - Splitting Entry Data... - 00: offset: 0x001000 len: 0x10a2 width: 130 height: 17 - Wrote 4258 bytes to icons/000-ICON_LOGO.jpg - 01: offset: 0x0020a2 len: 0x0eac width: 110 height: 100 - Wrote 3756 bytes to icons/001-ICON_Print_0.jpg - 02: offset: 0x002f4e len: 0x0eaa width: 110 height: 100 - Wrote 3754 bytes to icons/002-ICON_Print_1.jpg - ... - 91: offset: 0x0345fc len: 0x0d89 width: 110 height: 100 - Wrote 3465 bytes to icons/091-ICON_Info_1.jpg +#### Usage: +``` +splitIco.py #.ICO foldername +``` + +#### Splitting .ICO FIle In Windows: +- Create `Split-ICO.bat` file in this folder with the following code: + - `for /f %%f in ('dir *.ICO /B /O:-D') do splitico.py %%f %%f-icons` +- Paste `.ICO` file into this folder +- Run `Split-ICO.bat` +- A new folder should appear containing all icons + +#### Example: + +In this example we're extracting the constituent JPEG files from `7.ICO` and storing them in a folder named `icons-7`. As each file is extracted the script reports its index number, byte offset, size, dimensions, and filename: + +``` +$ cd buildroot/share/dwin +$ ./bin/splitIco.py 7.ICO icons-7 + Splitting 7.ICO into dir icons-7 + Splitting Entry Data... + 00: offset: 0x001000 len: 0x10a2 width: 130 height: 17 + Wrote 4258 bytes to icons-7/000-ICON_LOGO.jpg + 01: offset: 0x0020a2 len: 0x0eac width: 110 height: 100 + Wrote 3756 bytes to icons-7/001-ICON_Print_0.jpg + 02: offset: 0x002f4e len: 0x0eaa width: 110 height: 100 + Wrote 3754 bytes to icons-7/002-ICON_Print_1.jpg + ... + 91: offset: 0x0345fc len: 0x0d89 width: 110 height: 100 + Wrote 3465 bytes to icons-7/091-ICON_Info_1.jpg +``` Once the individual JPEG files have been saved they can be edited using common graphics applications like Photoshop. JPEG files are inherently lossy and will usually contain ugly artifacts, so cleanup may be needed before they are re-exported. Keep the limits of bank size in mind when exporting images and try to find the best balance between compressed size and image quality. ### `makeIco.py` - Combine JPEGs into `ICO` archive -After editing images you'll create a new `9.ICO` archive with `makeIco.py` like so: - - $ cd buildroot/share/dwin - $ ./bin/makeIco.py icons-3 3.ICO - Making .ico file '3.ICO' from contents of 'icons-3' - Scanning icon directory icons-3 - ...Scanned 16 icon files - Scanning done. 16 icons included. +If you want to create an ICO file you'll need to use `makeIco.py`. + +#### Usage: +``` +makeIco.py foldername #.ICO +``` + +#### Making .ICO FIle In Windows: +- Create `Make-ICO.bat` file in this folder with the following code: + - ``` + setlocal enabledelayedexpansion + for /f %%f in ('dir *-icons /B /O:-D') do set f=%%f & makeico.py %%f !f:~0,-7! + ``` +- Paste folder containing all icons into this folder +- Run `Make-ICO.bat` +- A new `.ICO` file should appear + +#### Example: + +After editing images you'll create a new `7.ICO` archive with `makeIco.py` like so: + +``` +$ cd buildroot/share/dwin +$ ./bin/makeIco.py icons-7 7.ICO + Making .ico file '7.ICO' from contents of 'icons-7' + Scanning icon directory icons-7 + ...Scanned 16 icon files + Scanning done. 16 icons included. +``` diff --git a/buildroot/share/dwin/icons-4/016-ICON_Bedline.jpg b/buildroot/share/dwin/icons-4/016-ICON_Bedline.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68d65dc5fee0ba496b88c63a7dd8bae1e52ed60a GIT binary patch literal 748 zcmex=eOY?pU$4S9CCZ9sD+e3`nUL9f}yb|TAX6Vm{*h?zY&@-*RNpe&x)3NQ}mzDVUNjZ zi@3K?u&34D*L^w5R(F}XKAJ6x+xLD64L!u!#uF>KEj4PcIqSa-`R&gN&g5{_c&IVX zxp%tj?%MnQ>&sPRu1=~7>j^tM!zQBG_t+$NG5hGliQuo4BlDWr5&|`OAH{k~xC5+&QW`N6*J~c41-Dx^s)3 z{aY9<^IT?er*|X60%@xkcf$2vaJar#SUqW@jVpx*mJ5(K5^S|2F{`tmvEo literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-4/017-ICON_BedLeveledOff.jpg b/buildroot/share/dwin/icons-4/017-ICON_BedLeveledOff.jpg new file mode 100644 index 0000000000000000000000000000000000000000..853fa5159b673e2fb3cb0ec686b33887b2e824fb GIT binary patch literal 2707 zcmbuAX*kqtAIJYQ!`RD^VXTd%K~ZBn92o~8Q5xG&WE&jo31!VBjx3XXUs54qhRK>G zsX=7M(t|N(EZHig5`(BbI@j}}H_xl{{ayEcUBByl|GuC5es%9N_ul}*=gch301yZO zKnDfvvjLNX?%(NW$iGWCnBIR5z<2>g;1mP|1Hdp41P0pg0b~FG4B~5!20_~X3fGcSHOgeZoh#UAd3JT%k=HUf_ z`3`K21L%Q3U@i!h=N}pv0^;I^0z5F$BfKKwXr#lK7+l^cHxH%do?qF**k=KP5YWL* zAuzxY_>1loA6$E zG5-$#HGickslg7tU7B~d@KFRqhGJxJ4DHbO!9~i2p>xCwmm7BN%UG_?vgfJ3bn!)B z@@b}|dn8mRsLaEPWRmsrn3;ck|7C%9A6I5O6pTB_Oor;R>UhW&k5~b-h2!I7=}L19 zrm4Gg5>1)e97r(G)Kh4gD@)kZ9dX)y#3SI1!gCB;=yn< zm{QW%aWsZt`uv_o0{^)eIk+jl%QkB-?h5hxZb-k!s|0ePc1NNg}zGjE&Ec{dh`%r=~$|+A2v>i5!P^y74So z|MU!_I0J2Fcrxe8wK>#n;@|BpO9J`o0cx@M*XJ!$g@_Y4%Ka-<9?`(Jmw%mT$*HQ> z)`<$UQ;U(}y?b@cG}Vn^n|L%)@GylpQ@HL$--^<_Bi>Kq^&y3bVg?mA za;%`MD5Gi5I4|6pULi$c_c~SQ-Ztvj2&zu5iB-zb3(V_l6~8~WyWlwO^1exXQt%{p zB1(2WSuOs7mKn(>2>Z#bna6$OY?|fU@AVPm#UqM^{l;J5!GY#~J!LhQj)WjYJ;)XO zOivvX1Rs3JtJ=nqds_D{wab4wYWUCVAy+5KnBlZ?!nA5sr2x|RL_b5SxxrE(B5}!} z&ce)Wd^)S~+^lJ@xbuE%S-k6-S#Y^HW0C)tdS6#5(Cxta)l zw7GAeo8Q~!gcGfvIH>_tc&pyr=etPP&hK%mMx}qlq$Ej5fC6$Xf z>kx54f}>E>ryn#GL+q%nD!jF*7k#Gq<$=@7X$9gbo6)iZG4Ng%hN3>`Qe8IWy}1^uVFQ@s{gv z?3s<8W^`Qgge7ch&&zJPP0}~(N!-&r4sR1qa%W$Jo4|4&SF27MvLxsU4a5Tb^-$2&V)aH!6@lI zZL64Gsei07*W(#^;FAT>W|Q+n?1C-W?N*8hXI;DC$eHA1Bf%akD{EBv;kj9)L$B2L zJmOf8Qf}>N+ss~SQ46URFG&=e?ku{Jck3+rJQ#w=L>3gL;eSky=tqaVFX+rhVL#OB zUlleMm2rO*u*o)1yB?8F0e`MMj>NFZ8@NMW1NcsLkq)&6p$WQ$r*;LU@@F7b`!GzBxPk zvXhp@-N42ccqe`+*jas0b{SvYWZ&=DbqB?#!<8e5@)1SY1QSat!j*UWVXJ)QjZ5IkOG_Em5_q!W)BeM0jg+vZv%1wm z@I6_dzL`iStZkcD0Ktw`qcp@_u9cHpWMqny{$R@x z=jblhb;Y-_SzbS6x_LxbL@I7JN{8+PWUP%zf;?kYwY1$fw({>({5X|9Pde6WP3N^y z-sQh^rYp$~0%-0$@7drkqRwqOf|%>N^qtxYPMTkWGZ~UZFurQKgyF7`qgu)FD16hz z7#_0h()zBympUs)WAp4CF6^3#$=^5>y4$=DjD;9(E>H}S%lBA2h9h69$7KvszAe0F zFNx3DF6sQBn(n+3m(E^u|E|%C6SIDewHN>J%rJ7xm996uGI8+d_Hg>HSkIb_qSg%4 zDDiteUz7I%g>R46(>Y6qzcSN*K?eUyq`AL0_!=aHY4e}nBMe_rWe8?N+$V9GMoA6q z!T!MN`B#$JP)|n;&HByMZRtMoqCh%Uvs*eV_0EqlmeUo6znXW42ePU@vvsjS-mOfc zQa5&<|7aPnx4Z}H6O7jWJ0_plQoJ*0g6q3Nwz>ZC^~Aci+Wr2syxHEJrfsH2@gjeC OYABj$&U>TwC;toVRK1P> literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-4/018-ICON_BedLeveledOn.jpg b/buildroot/share/dwin/icons-4/018-ICON_BedLeveledOn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d495b57c0a6645390bcadbf1d61e269e84ebd46d GIT binary patch literal 3931 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 literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/009-ICON_HotendTemp.jpg b/buildroot/share/dwin/icons-7/009-ICON_HotendTemp.jpg index 0bf1437c646d026ee3df5e16fcc65f6144cadfb2..b3551f3c5c6416f0b6cfb623d75799441f9f5869 100644 GIT binary patch literal 1119 zcmex=VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7Ky&JB|SfaB{G70VUK07?_wCnVDEwVREc&EbPpTOdO(O44gv3A`((zD{lf7 zN-#1oGcv*yfoV2&4pyLyBG4XYMxZf30s@#>m{{2u8Q6tI1cgME|KDQZ0m%z83o_U< zJdtZQ+a7V{+t!CxYuCIjn>t%<`kL#_(FeUuRk}q}SH}1BsFj2^6^Iz+RHTM#Ph{~i z-819ih1A)%7p&Q=c627|w$|3wT5Izra{+H?`IPF!jjiJXFPc= z_Mjtgf>XQqxwar3HOsP_*1TfN_51lIyUtu!Z@=!M&9%s**||~awwWF4T`ePI#eJlH zcKiI4lB$n*W^m>G%^p_8$+gRO>g}(No*Jw2{K!0MzL4!}mS~-9SmbN0sd>VoeAg%1fXzvZHzqN0Z+;r->z6qyx z?mE%A!8w<&Zu=p&d41NZ#9U>;3f_tT8D=iiJN?+A`<|Fuc<20C%BR|U#dqxuRy`|r z)%|wLMRA@0#<#9E!q2)Bx;K`z%sidR+rghzO2tOH}Oi&t}kNOWDYh+QoXOo&V|%rjVVV zKQ^~~dwuQ@=SUr(a{{RYE#&9iIYi$6)}U=5BfbMc?g zUTyOxIwgfyI;`)sc~{SyRXNu#-PwNW+oXX0BrcZ|k}moC<&SfoUh(JdgW#UUqCEQZ zil!{mt2A%1o%r@;TX&$t^R=5yYX!con*4gpyL)HU8@b(GPTEyCi(7C{s=GY#=UcY= zXX~8Ts(T7OKXUl2?4#7f`X;BZx0qJGTC_3#)dGoluZUokzk!v#L2*q_r%%21`N3O1 z#p3GT(3Si?suq&g4UaU_JL{hNs@=3;cGw}q zyeKi(b%)y@%Ws|^qoX|WcjLqDHw<1Ja-A?u?$zem@;S@$vodvVTQ?o5DycAi`O3Gq PC;iC;LxT^W|K9`vQs|>F literal 1671 zcmaJ=drVVT96tB_DYr7$AnpDWAIl;Z0I43w11MVTB2E{5coY|(%={DywXLnjDm__{lIQgA(zVG|} z&N;smIUnfmVm_&(Z_x0vExgygQDS3>%z%U^D`Xmct33I$gf~*tYLxo zDEvZ5V06>Nee}5RM6Go{Jfc|e)rBJHn;{i~}5mc5C7oaj&38GO# z-vlbdlrqtKJjt19u7L@FT#3jOaUz0hAQeodtcl7AZoO)89X`(%=>el*8n~qab3sk} z9OuctvAu_;eUmtQXI1KR=G@8>(J_YAEet(DQmsiFEb4GV9-du!`s~1wZN<7Tmj{|m zr#^k5sB`(sUDm{_HQ`Wp;<49BjdHxX_F#8e(dB{F?>7gkcQ!2DvEcKs?kbrT{FRjV zUcyt4{%~k3=I?z<*;E$pK5%3G)G5~|37hlVF5>svu06eFDK*g1z5iv_X4^U?TsPCc zd&a!nOO95$yB_^mQ84!Y;R~hQM{`_D-q@TvTQT#KG^JxcDlcv9DIC{wFI0TZFnw>s z)_3hE_EuMsS*?33J6HF8hBn;j(%{p$+NQb_jmLy8bwMb3fc&EV#y@H7+AXe8)!T2U zafXw2vPR%X1_U=_(Rr*`?`P-_#PQBuqe(8e=@{O+=_Z-~V z+R~N1puVQUdl}pJ@1*SOJx!=WdogFxcZ=(sD{MdKk$+VFPLy;`9P?x2lfTdj%I)Fj zMOAGpc0Bo<_0H=h<g|4^;aNS(VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7PMSU|?cqKn5I~jO<)M84UpjCMG5ZRu)E9s5C1ZGYbPoa}dw{XtCb5&-g1)>@*m0p$TJd{g{2RmIp7~$xug#3+zBiL^`uA?O z`4q;b94l23RhCY86VB{Qw~Rbi@H?7aW6vi%!xxX zk{$;Hm)ECc&GxCelhgQJ?8U2ZPj7Q(SKZhCy2*CSHr3YxUZU?-mFzqc!ciEOJt=eB z<&0PfR-bULD;1TZvze3DP3KOO_@%17_=eTfpsrho9vj~LQWEO@`FnP3YTt{AW)52e zu5!pd+kQ*A%#g$Oo%v_0<(DI+(^vMM+dH-Nul1d;;jb=~@Obf0yuZCNVe?8i2t1Y;ZuKknybpCa{7l&LYOtA~yJX?NS hu=&xFDK{$l4p)^_nqIy$TUz4$O@*X~hv)yl2>>4Inz8@@ literal 1655 zcmex=+JW@c$vRenv@2ft9{~ zUa?+cN`6wRUUGh}ennz|zM-ChK7);YML}Y6c4~=2Qfhi;o~_dR-TRdkGE;1o!cBb* zd<&dYGcrA@ic*8C{6dnevXd=Sl&_Q3Q(W~w5=#5%__*n4QdyVXR8GDRC#&1Ub(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjTCALaHmqNUdTL3o}Ygi#E^!3HB zG&dI%0AOQ_OM+4n?!{_waY$uBs(w&vaeir0aw<@{GDvfQm2**QVo82cNPd0}EEEGW z@=NlIGx7@*oSi|TW}%=Fo|%`DUtX*U*5m7I<(XGpl9-pA>gi&u1T;l2Gc(1?($&qx z!ot$U$jHUS(9qSF|+YBuXjBvmNWHB)TNgx3M%uLKc03=vIfSDBx z*g=2;4nW$0s#%$tS=m`xSdnDlO7JuOA7BvVU=U&uVrCR%U=n0x7G(T?grS~+fteAJ z{edhFPA-rO(S+F=~y0b!_Y1l^yo* z@t=H&d(Iha3@3VBxv`=v+tc&X&7GppXF4}E&2y#?DbXG?jJmU zF1v5ey$@%c7#miHCOO=mlGT*(%3OVJu*H0pohRZxh?lUqy6`OcGSlcs0_(Tk+r;+w z9h)x0pSb2$(4+YE*?nudd$N-2+aI}EJ1kB4Y@;sS zee!Poms_@GCcCq9D!oPD+L&!hixv}HGWY4E_4P|0oqoD<>DD{Ump7W2B;SzOuIrc1 z7ZkYZxz$pS23L<_#^&X7{nJt(KQ7{#mp;wRZY`tgk;uiLwyh8>T{->qpSXI(1E*U% z1*ZA*U%%pz&AeWDdXQv+6!&%|?u&WP1HZqVw(ITBOJ81{JO3%~)$NWCHww3joNR4h z;_B|Z)`FjJbBD>L&_l}#?`+qS-OH*W^N2}S=HBj|g}0ACd9~@OZ5cyggT>CUBU2rw z?fkS(&A#vR{qu#VIF3J7^e>sXFWs_nwgbzA3$y3M76tH2&ExaSzEB$dZ^r(`JKTTD if7gHW{<*yQsh`td*m>Xmu~csVgY_aSv>#3Ve-i*zHX2s| diff --git a/buildroot/share/dwin/icons-7/011-ICON_Speed.jpg b/buildroot/share/dwin/icons-7/011-ICON_Speed.jpg index 387c166566b72257cbca8cd39c46ceee6d9653c0..83da633221b85f30e71ce77872e91ccfd52c5649 100644 GIT binary patch literal 1610 zcmbu2dpOez7{`CRV3KCDW~YSB{fx9kaY80jO)fhTv2r22afRSp1yAs_$* zh5VmFB_NU@uoMg-jg&{BajN1Y1&|p32?hYDq?Cj>P#6Dzhy_0k|MB7pDj|tP$V;Js zomd=Uzqx1(*e;I22nYf&1Kv5NcC4L*+|m6y5v?6FcTt0SL;Wxqjuto52Rr@C@0op7ze}wiI)2+j7xVC4t~)jC_%Al6W6a zb94UKQ{m&TYZnsf{MJ)->~KfuTB`aRK71+r1vgN$Hhq5UR3Jv=&Q;PmXUUd$tTFjN7kPch~PB&7W*uo8k>+!7-kLV&`ev`)3 zenY4o^zXoBP{EUqB{?t0k=3CZ@uys5mFl(8hxTUYHhkq)rJ+AyFASCkjYm0`SebT= zR0PsIhR!&u>tshTaFk9hfi;QHzxFh_Z*<($-ZuB3nd5lrLefb6E4X)RtWE~1Ca~p(G!O~2y5P}JH&+-mux9QCt&wJ*BZ-o2S!5;O>_pbW{7}WX4hM(pP+pM-1 zW2=WpSfM3(p1Ut#tL6-=5Q_aIW^KARoYWq|df2*TP^qD&Onoj};bvBiLnDv$A-~ya z?qPnfXf?8l(w|uhm-K1)y>?mNBfId{M0X$4tEMJcub7vy*S<0CbWj)WJP|{{yP*cR zT9p~{-5ZfUtZ4y$Wx|_Z%Gcoy*YVFJ96jSe94snVG1CjFl^CG8j=To@*G)%Tf$s0n zzn#;wdo5!QeNdKtv&K;-rQZSrX1o%X#TFJ+OJ^oABb3q6S9K}G0y+YY{2G6c!?OC$ zp{{nEG|m$NX)aKmC7CqBJ%!OnjL>gmj3>hJLl+B-=B+#P3JZw!w$Xn#*DE!D>t%h( zhj_hfA4UtBcTQiooV|XZc4Y{~(IU+zI~_~R+d+dB?yMGmT(NaCc);x~J7!K6oLXqb zs0z}MDkq)T7;>iaUm7?Ud_saZOJ-wbZp^A~ZE>bs-YcS3!FOC)O1`o73yF}h9*Wvtjlv1IzE`JAi{&fF z2h8#n30`a}$-1*r1mGAF`4x|CyoyVOeJ1D9jbs}?w}sZsyoL^RbTwl8!Dd~mQSJr5I(B;lJIZtpOEegaP4@?sQ=Og1Xa5rMK z^*RD6e%j;WK>L1sSR2XF-3wKW9X@Zz8MNkvStd9`2K290gT} z)nVeMgG0bAh=iH1>6CpA_xX@X%=7G7cFK7-@>YvIU(<>nxJz+T_H`tMUt#@8k2M~c zdD+)^+OF5#p4~#8`Y^gBoAoRK^NdS4kF$dZaGWpE;#SB>%=yrAvgcVRrRuwj`Tgb6 z92GWq5;N=?pmuL|mnAy=AE?ty&~ze(MX- z0uvvPKp^5V@ptl)lV2-#Ijt`BTj(1%exww;Vtt9IeJYh05x|Y#>fPY2(dqOJ(dfU2 C^{&$Z literal 1706 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 literal 1654 zcmaJ=eM}Q)7=N$V^5F-w2u>%l=i!_v^xA{cUSnm@g5p-J42K)2DZLXea39_swy-%8 zGAEe1FfyZKahcPNxHue%8!9R=5F+5BnF9o}ff^@~xMjw%g}LsoQgDg*`{T{?KJWAU zJ79B3V-p5ih90k!OY69E4xj1@@|Z^bZH)VoQp zfYN(72J^Xj%&0eDU~P(zcYBH{2`QioY1W4R*4%<3G-*R~O-_T8w^K#*hH`;=tvoBo zQ(o*LNHk>~veswyF+4*_Zp6owu%gvxLj&Sg*;d>biUdNWVjG&OWJR_*U5K3%D8!^s zPVg9$aKudLjmZWAPl`uygVBr`%$PAT!C3D z_3FKedQK?Bj08bo1{}lj1UVu>EMq0NFM$3PUo{j8AfS9KvtBpshN78DlF!d@f4O#iCn4Rq2%ybh0I&+0_B!CA&28i zf?aeKaS|sMaXezTD_yf7t8!_UsDaa*fxT&*pm2qHrIkSTj=-m{VA#e;5 zxVDv^y%zJVdQ)6-_F62naxu9WOnKZV9y{ogCrB};M_1lV4?o4q6EDc4?Y|Eq0s{-k zR{0A-{vq%#fTp36EtN`M<>fJ86)Zzu)Cyot0HF%PrlHW~XblW&LN#j56DQLl&o=z6 zKpO@kK_m=mfl3R(TFBo4Dgc0?neQ)KVc~N^A=&wVZ%C*nYykivkV*}Q2ag~Xtk#5t zf-r65!tkhM%W^x}5xpqGOnj^bkWwnF2}(m+6<8h#t5Y>0#)VNR9-5Z8BKk%DAebko zS7~7_NC5};R5i8rPfGfT=8}QQ+RJaKNY#bn$v@h2(pDOlzSO4~YF{BNSu|4D5Vf`a zN;e9YwcdQxHnjJhyPanb{BmYu!$eF+xCu_hUrqbB= z&!4Z^(*45HYlSBlGG2%&KBfHHOs}?pU_0H^0YK-*TvW^N$C6 zL4AKuwhxceqEja$@nYc4b!&o&0bCRaE7k)xs#j6 ze#$#Fa(wBf?lbH$q2XBPz0dBB9n9K(I7+>LfiK&Viw=IXtKqx9&gh4uu6O5{U31^B zwvlAjd&IpvdgyY~*IkS5%x(N3nK;$t8(zO{&fc~ICezWl=Ja0D%R_~HCrd5;?RM2zZgSKPi> fU*Y@vVs3BC^53`X91F_*pz<72wdR_-!hhpG8+8u9 diff --git a/buildroot/share/dwin/icons-7/019-ICON_Pause_0.jpg b/buildroot/share/dwin/icons-7/019-ICON_Pause_0.jpg index 2f6e83110965fd56b0366cbed7c0a52524a60922..227f0dd8f4859e7f75fdd9783577fba2c3bfd777 100644 GIT binary patch literal 4340 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 UmY3D&e{sYA%_0Arv-7Y21N=qqO8@`> literal 3592 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 LYcc5W|9=wz)GwsQ delta 1038 zcmX@gcav{}8B>g@ft$0bg_Dtysi~u(p{t{#sfC4$xrLdbxtXDxfwQ5KLPc(YudkI$ zesXDUYF>$_i>(q+L@y;X#R{s|7?5|o-|m4e#>LtJ_%%Q3$b zo6Nw##LR#U*g4raCM&Rr)U&Y&Ffg#Nure`mvO*OwF|)EU3bC*Y3X6zwFo-HCD>^2t zw5YnKP8C;AU(PAWz{teH%*xEc4OP!5$Rxxp%)+2(s3gM5#_m`s8kpGVl%(uDIjAYQ zStVtOYU)z8|F;-;m>C(E1epaH>=}-ii_HbT-^=`e?+goDuI*L_m!Lgr@1&3Rp1@O*+4^XY(JrZKxWWMA3M zr}I0|>fE1*O##KrEKa3dh-&!tJWa$ZYhR9eids2?P3Z^ElgeQo`LhA=V5rzyUS z2NWfiu_P#bd3>=uQ7z~6_FH$(IdaRY#S~cdE}rLjKw#DrubyKJzg}mWcSN7sG`%=q zb?L#+l2(Z+x$G&aGZPh#E}9_lq%il#wnLAfZhd0C^3m2TOOwX@yJC}mm|dS9E}^Qc z6SDJu+1=QM4oprHeI&dpLj7BO>&+~j7O5OL(K6>^d-v?B!h)B*<$Rm>X>AOf5?U?9 z_I=f(>uSYUE&cL^c5UQnZ1Oq6P}VHHd!oU_Z=c%>-pcNe-CcTjeb$Rt)$@z5y!cWT zX}tOKo;@qmW*=^|>+7;HdR}?=L21UqMxH<|XTFVk9$h;VsS50=CkRc`c#t}70X{rPy7>KQucc1 zLBXisJz34Z&+j>PbZ%HR^Js@mamgyJYau^MFN(bOPObjz^2W!%zI1=*e})BBH|v-D zGyXNl?eF%_@v9F=Ka1Y|vi9}v+UAX~P5(1=U3{ilV-~;pMgB)S-4Clne`^K0e$rfj b*ZECy>bvd!Q5>~9F50Dde!YIa|Nl(@C8((x diff --git a/buildroot/share/dwin/icons-7/034-ICON_Language.jpg b/buildroot/share/dwin/icons-7/034-ICON_Language.jpg index 055b4c1ae8e6bd17d5cee0c393dcf8f297fc669c..8cebfa76c7f3f5cdbab6bb57c3cbb07d42f5db99 100644 GIT binary patch literal 1657 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 PF}+v{hR=d$yZZ6Jdc|f) literal 1871 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 clIFw{G6D2g$GU8wNe-+6i_@% literal 1874 zcmaJ=Yfuwc6u!wOBwBO`ARxY$AS%{8NrDLk3`s!Lpz^YV6&sR87R>IFED*3N0@g}> z;iyb2R$IrZmWs6M6xu=2suZn^4;;~0G@~$$2#AU(R?`jga601ml|Xn;YbQvh(vI@nN-0t5`b79n|`Du`@IVQfrR1tyUExo3OJFr_Mqnvl#xsZ{ zVmMUJ7s-Tjv1AS`7K%az!cc)IgeMd!gfc~l93BLh>Si{kE8;cLgT1Jok~?^)yu3Vq zUI-sIuM&vla=Ab#7Kp_>s)A?9$4I@EhgkxL6f}s%U`7cN#WC2Ws87RlNF|qY`t}GW zVp#UQclA!8PWRzblgV`f1F{w}9vSibUSUgOK7k105euGUHXu}apo>f>)Mi9a;^ssg zUp;h-OEPd0w`AZ1tX8{jZ7w`(8HyS4JWKEZN2gQ7Vir=58IV|wl1r)ZQPil=L`4as zR5GntDhm;bv?`TWCZ4O(ie=i6xhi#tc8IIN4LK$RBZs)g5pMLTT-P|52&%INF{8PN zG1`oq;DKW+(9yl9N7WnT8b|k{8I>!b%m`dR_nn_Tl%gic6%LOswHY3M1fwS2OpUg) z3ydEaSYWKDo)FDx10{eq3_2Cj>C{RsZvoLE3e>`I0b&k-B13-spBkvyo))=N6do1n$X{H+;Vlg}bU@#~T z5Oa`1hZsy6$J5Qrdx8%O1h4~r$B4LoDshw~hy!R4jYTQw_IIoeXT)hmZ0Bv@PWhm7AP$HG_UDb&Rd1s6Co%V2Fxbkb`yVC0SU~=Hwalab z{Osn+iJBQO#~Tie6T&41wq}L>X5O?5H~)_C-pegDLtsnNf?%eQ*R_jwbv99s@}70XCi~0;EKC_ z*7e+`Jtt#4$0@c}E;s<@6i-{^X)E1ZSnKobLhI#U-^8yA?@~+l6VKziFKwE{t3Bb~ z#UyXU9MPKhqi^b__xtr?P0KPJ$NEcuXuaKVDf9EJ8}Lk9hZb8QKW|>XdrorCSLIlf z7iw%<$46tb?^aA{Ob&%l-Tr8Se@Rtm?#|-LJ2s$Qay1h2F?4cF>Eh zCsXc7_47QRE32%2j>37ND}8ES{=!EiJlfFfcv$qI_4m-apJsw5Df2JJWjtwz3eOdt zJGG>H{Y1}~z7JSateUc|$L?P$esS&Y{Z@8r{o^P7w(Q#9!hJ779u@nO`AcfgOV1GU zv4NY*HV1!sb|dV*F%s{rOlZL}>!MpZsoM^JdaYjJ%h=r_2@8AJ$D5thXG^Z;o} zJy~W+jnfgL)4o1!=HTYZ(s9cp)>Ur*`i5xHU+vkV?4MVq2CdIYsCd=1Hn1bYk`R>i zu(m39O{c@*I8ek5YAl+;-p30tVWzdm(laMjdi|@LDLrCHnAY*2F6B_uny;K zd9><|pgb;NWydt}YhFyC?Vo*CNAJ#<-sML#9<0ng-r3rP=@z;dMBH!gAu=~w{mXkQ zemr>MOv~>43Uf?tIO@FhAEE1f AEC2ui diff --git a/buildroot/share/dwin/icons-7/037-ICON_MoveZ.jpg b/buildroot/share/dwin/icons-7/037-ICON_MoveZ.jpg index 487d6e4e4436a05c8931814f6bdd217184f40968..4af56c25a67eb2c1793949a916d674bbc9e31e72 100644 GIT binary patch literal 1327 zcmex=VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7PMSU|?osWIzHOoLp?|KpABL1}2acBMUQBo`sc}jh%^ukwH*YkyFXY5vWL# z5u^x7Hv=0711meoWDTG#%nXdoOl&X(%q)ydtZafp!VDtpN``@njU1wis{d~>@BkGs z2{H>Z*fVtI)bggCUl9~==jx01T0L_Co@(U@9Pn^yjuWebz(Ls_ub}L^)n#mR zpU;}+$~~ie+U})ukC(#;*Qn+0WJIEX9&%?>qZ(_Px@~7ZpyNcbyig%-r%SVP?Q3l^ZfsJ{gDH{r#}r zH9X!y`C5OkU{ib1RFOxU{SN-gf3(M5T%LE1O`7rD)+TGi8B6u2Gp}tiTD#|Hk9B)c zPU6ku;_Us&6wCNFD=v5b{#mP2*WTcBPqW*>eD%-%`TM#zsdRme z3tY7P#G8!5J-g>k7D!CZ2rgazY_h#6TiT{gm(nr?pE8$4Y@0Ce@eX#y0IQnotqT|4 zuemzu$?S)5cT?Rg`2u(R+VLr>GIsJYMj={Ks_L4^{jk zsk}9Ya-uKp-uLsEeB;+XwcWQ^D~`I^FTd_1uwG}$g};Wo-d&kHKXQF|SL(`pd6t_m z3I^V}EbbUPv0Ljjd(!8|qwh~`EPnjgJJ~g7Z^Er4r<~>Q-O}_T_dZ5N(C%syam4P#&U$?K$O%8CqxVA~<%#j!7Tp^MLJ8rgnGB4m# z%ytgtP@WWeE@=PB4|^UT(++>`pYpLJSYG5&O?{vFu11!3tJ0p#vT_ccaN$6M0!$?WiGHAV9KfvPb}H$4W;l zVig&r;wToaq86)Ds8fVu6<<`T777v_Q4tX}Djm_PkZzENoe{qucg{WceBU|u+;g3+ z&fDOl2%9kpfT*ZIzyc$1J_2lYhCVF|K!8rUmjU3s4f9h-l0f-PSeW` zoOxkLs13E52opx?5SuC8Y(;Gf&VV>d*)BJqgA9a_X$p?gl@<9^6OE{F3x)*qq+GpF zB0@ssJfTz|7fI$IB7rc3F9_ia#aw|96-ZIB92o?M%4RVnp|R@7!Ccf%!5O?%W@aWY zQ_RCH$$X()F6RqGe36JtMR2WIW>RP4nys^j6x5hiZ!r?25jP_)MO`AEK`J;@rEjlb zB8Fw(+pBj1HJT5HnoO<+49Hr^SZt);_X=C%vj~hIi&^muiyouGXSv7(sAax2E6(qEflKCPVxajAjF#X$=_QXf$Y)*-GlndMrw<;7}?&qtSq>!zChB zh)N&|mWqYK2&F7oEsTg%%cZgirC2Tz4RO`DKEs5W$sw*`gex4C>lz0WL1k8B7ULSs z5NW|p$iTHx9# z2sD_^aD&*M6TK!)X0iZhmTtED6gGfh8r=<|!-KLAo8}4A!A#CXp)$scQWA+JlXR=Y zoo!$om7B(f*X=@4_3;I;&Y&8|vJC~#gk#a^%`}d5+_U+zZB{H6Ve4+pR{rtKf$?`E7-hcKM zm3_`O79HIL9@yv}r3KcrH9ax;GdBj6r>;!wE^K`HWV7+|o8OCc(AN1UF9huQJCGQc zAGhs_cFUn_xm(HjQ%&yn&B0K8xm(gnx5-4F&kP0mtNmQdsRJ*HyVIE^@R^H5*V6U- zZX77^6s&(N&9Ci|%z3zOZb^&-_bZz0cKqh@@+;i-uCM7dVWtxt^Ol`H?OoF3s0ezn zrKF;+!{2&$W2(V?O&hmMnXq{GGS9H+;=J>|vg&Q6FB7wid>xvFM5E*%cWLpe($q!G zZ}RK=T7N$JVrf}48tZ#Ca))3Et*Ib4+M}b4rr6tJn#0X$Se9P4dO?+M{`jI&=?!L6 z%hBk=vLjY-H!z`o!#By5c5{FFFBdBUTm7CT{oCSQrFEO3zI$=*5m_6Jt xQ~#x9>Y|>E)3G@y+wb7mu(>B3Q)}e@xwofUUT0(H#La(&2K6V0#yoRg{}1V&YO4SM diff --git a/buildroot/share/dwin/icons-7/038-ICON_Extruder.jpg b/buildroot/share/dwin/icons-7/038-ICON_Extruder.jpg index 155b9a58576d83b82bce168280b0872d4c294d41..69e456c499ae502605341e550126e81d75419329 100644 GIT binary patch literal 1422 zcmbu3e>~H99LGQ3{a}9V7%t1H7#AWx;-TvtbA(W#RP!r8s*RicCK~6?InfVAQ^$-m zG+Uc8lQ1L^(Yo?;xHGAE$SOZFKikdY?vH!izrEgny&tdF>-m1mhGk-)?&0e03Lppu zEaU@Zqrh3deV#TUpGT0lWe)%b1+;(`9Krw?27+TC*(0zO02mws{}Do@x5K03mVKlX@HtW#;>j*`8W|M3xzXAs^2!@0y{)2}jEph)4n-MQ`Gmz~$VPyw{0A5YjsbWuA=Uh4Xpzh!%_T$ziI56sOO}j0TJDw5E!?!t z7x&)lEpsa__s#-EO)b1?Hlf$t;Qk(6pF+{fogYeiey_pmJ>F^a*jHK1`FM)oz4KBP zskAuf%7#fNvJNtNVP!{qc^o*<)r4&oXo zp}7@;Q~h$a3{Z@+QY}e&mXbuB6~qI*u7vo)?qT8ev3V6v&vZDiarV%x1=vY^lx>sW zR(dl_JzYx%vY{AiExL0~(oiv}np2H$ykPQD@Dl)L9SPc9gOhLf2-Ctf2X1i1>dbci zS}QZBw^O%IotO&pycOSJ<{ooPrA$(@YqTJ_D&QEei0px!eZo;rHgjtaR(K=$B3!{` zG1kOjhtbSb5VmKqzn5kBoX(h6_q$WyGap%yZc#snm|J^^$2gRX1qagB$+_>ba6(hE zpU!K-{_E(t2vYR~b@cC}LemSfYUcCxf1U(~>QQY-@QfNk$NbI8bU^aFZaNC_@pC^Qeo z7g}Ry&A+(HNExn*=B1!HG2_~)Dn)-Kt{Qkt_PVxuWsU?A8xog-t)lyqG=-Q}QipR) zY;`nanSM(@=GUS!#&Z|7?n|tqcZ3UJ6ju_Acc*!~vHr3BiuyR`0Tm&!{#l&Yg$dUl zA@939u5J0~`_Pm7bkk$E9ob^yDM}DoPqQLgb1&DO=`?Q0_(qu!nxz{exfjnLbu-;< z(|w@bjMrv(^ln>^33X~8Y0qyR#a%}ZA1$slp}fBj(|FzdBw#r6Yi^vz678gv|CCGi z@3SWR6NyApL+L@Q%c0nZm_MApG}cG?R&`qC)_ABURJcTV9LLph!*FuhAK=v1R;C5` zlTDQ=zU~`cBfgCTXY*ax&!|ZbEnZX@u$VM)TLYobmZhIQ+|VBX~p1sLwE4 zqPV#a?+wJa?ACsem+|WAUWna8bt;C;>k{Z7%rq0mvqG#Vx z9VTFFI)}qWu}_s!81telVlEd$c1+77pR;{Oq-@m{j5R*BwtgXG8Lbq!xC~@$7=28I VGq0~nqo$-EOE-?5#}COwe*<0yN^k%G literal 1692 zcmaJ=c~BE)6#tUVLF6(JJjQETJX#CcY`DzUR6`bOlsHP_Sw|=CE@TI?8+I2GXlnd@x))Pj9LOO%j>Wk3cLQg|5v!CnY;i=r1tQC85qC~hOI zCpi!5cX?4vZ$QEP1%9uKETlzvBVE9-X5@C`83bl1GqNh(Zm@f;w3}H}&eM+arB1TE zkTg-qg4f{re%$ZzdT7xF`#nXhfcwozm>ieRp)iWT;S{mZj95Zd;nntKu$AL!I9;ES zLSkt~IMbxZG7KhTS~6@jV40{P6U9a?6z*9}|kRehvp32Abh@7EXl4nMSn)3O4 zdS9xZ;|oyCWHO-!BWg6JNEs(+QJ>NVjGi z31cRPWm_!sa-(#G@BY6ts4On6}d z)ht~hS+EmS0{MtR(g{*XPe`FugiNVYhE1hXt0UBEl}0meoJJG%yvZO4QYw@hl}ZyG zsfmn^jgc%iHk>r{ihAljj~nrV%|IIgbU+8mv_P(vL0VbxoFoj$A=&8t2SBA(C?hm7 zNig(m7*fg8yk|fBrkQOWey#w)3O-J|ks8`}o^Tdwt?qCkP z&ZcQwLq|DVa~mS|Uz1l_+c&q?K0Z82_wR;|0?@@Ww>s0aHuu^3z{&l}hT10clkThM z(YrVL9yPZYCr>$4Z?D!}oxJzQX^y(wH;(;Xe|h(NTWf0bDv7sAH2ISGokOL6?!74c zbwYspyl3jSO+m0SBbTYY&}Ca0Fz+H(L<`Pc*Kcc1|I7_8d2l_?e6)0+XZ4Zz)-zuR zj;1A{X$^y~zuV-x@XLn&6_2v3n*Q;c@;Z;=Wb*mbiH%R%J1_aTDdd2mWyZ=md+uNF zwtH%7lM}9d@K#pf)jP$vChtp~y3RS!9Oam?2T>oiw`H8r-AZf@ME+%E7xvWbI1c%C z2>pAu48+VtFHEF}@nsd)ax=`gXWxrIezSa&!|6Vou&wQG`O-CY?P_}Y7wq&K$;E+F z-3hIQ=uaKnk93V&F?&|(^wJ{1-S*~js;+|Hw(#7B-Pn|Cryd-u7_8FUv!({L`LmK{ zb*TRoLjbNS}(P>I{4dvkkBjY diff --git a/buildroot/share/dwin/icons-7/040-ICON_Temperature.jpg b/buildroot/share/dwin/icons-7/040-ICON_Temperature.jpg index eaea25bbd88154c2ebb3e50991d3da78fd7991cc..b0eef7e42030c4685a0dad98a61cf179d7a2058b 100644 GIT binary patch literal 1244 zcmex=VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7PMSU}RusWIzI3Z0wvIKpA-f21XWUWJwlgRyKAzun{6Zexvz-Af`4*=oxAu6WuU$t=uq z$V{N|#3Ap@^zB;;jciW!%_|S>RJr6)rt~G)NJKLD$KT+uCn8Sp|H{~0ZL~W^J^Ry{ zNxg4Hw`g4bxIorLS*KF$yXcj(lMc#X`0VD*Y9a8i-{9u6ujQ{3|8^I}2Fg8|F?Wq= zvG2iW`8K(SVlOk=ObT^DLtmEY1YDWw*}O?*>ZgDhtLfQ)lCwR1O==xF zT-zLvidW4{S$2BEon?>gY{MOmg>0D`uNqFX^6V|N`5Qdcyzl@*m(J$vvKUqY|W8V?Eibuh=54x0R?V7dc^(vkBp@DXOFLM{I-eAWct7F;Z=%RM^Yc`yhq&6<8O`WK`Q+NW$>$SD-`yVV>aQfktkH$QHpB5I@ z*(=#UQHeRpB0a0m>Tkz40fufR`x}psKmOxBQQc|#L0P+3)zOigtGdEeF72;VZTt}; z&Ru%(s_L}Ywl!ex@t2}`vfPp)6toRR&)phj)q&3V>G z4sKi+aB{EoDwvp@EKd1K3TApH- nx%i<$Y$!5bdk!KQ85h4;^T2nP73t1uAkSr#EGuYZz z$Kq54i$oDoJ5{MV9i>uVNG*1XQ(u5pe3j~e^3aivk1~Vl26_DuzaMwbJ@hM8?5oq@_CM0(1E zIdm2b7l|V{Eq@Ly@5nIyVZ9b7w`Csh1)O%1R)iqOc%6 z9wI@)r6N2`ER}>TKqO*39219QcyN#ymx;qPL)fSStDa!O{oQ1XOkpK-G-XYr zsJxLbE;Uj#WiwJ1M4@nZEdmi{l4b*Cw*?Gw)M{CR*+%QkdLls?g)%B4k~GK^%6N%f zF2^OI!EzjrkCUq8QYEfX%9T<{oIF%9!c|iG0uy1TN4SPDu4F>4dmKy_CbN>Tl4}Wr z%1W7#p=-;?32TW{O{h1_HB4NKctS456oa`Rcidx-xR?oYo1>%4Y(|HlFf$WxWk%ce z1WX+oSYSBMd?Cnn8+-|%QLq?`#bQ=wc>|aQGhi0B8!%@GTsJ&N;ifau92n+sIc(0j zlhKfO8?N(!=LrNr07E>$;z2MEa{V@3*x3IEVDcocCj%79-eG30N5NBo5LA7 zfmkrdo9)5%>&wmv&G_6{8nsZoOd1&1y2acYps@pGIe69cTvfRh9SFQ=VPc#x_Py37R zi-ML@*?V^TmtS&(t(kdgyZlh8*S@XL`WL%S-dfWh+H^rE`KE76$X0Y?ecgw?+nkMs zQ|CEF)wQp#lrLZ2dZyN{dS17oDO3INA#rrJfV1~-f|rM(ajFm7(NbR%5&di-B}}S2 zm*#IZ+po83`gG)j*s{eZ(N}-h7N2%b5~h}?m+ufxk*9!wQWh)Kms8zF-<4k+7}(_O zytm8n#om0sr*L0h37Wx$R(2dW4fcIqZCP~uSo+;X2b$J@kT<`q>cUR8a>|_QM;kh4 zrSIs3Z|*iWZ?E-zWK!XDn1w-P>5iw`E1)~x^TtSbJfSQ^mjAsxIgPYjfOC0S8uN~xNYf)~DD z%->{Fs*HTp60kq|c4|fC4?bA)>~)?UFK4|Dw_iAQB<3S~^y{lTZ(P6LK9IAdtK^sd zpBwUu_V5(bw2^ZMDoXBEo+zoAd^izni@ZNmdQ6bKJ*%?owCavs@aSOtWwZBz?1#Ij zudeS|alC(3UHbhK#Z<2_hF)7uoVwcm?TwJgzL=vw&h~2ZQEH8t-UV8E>xw^XIGNnl xt1&!i8z_63*qHfGedx2h8}h&ZtLJ$`ZGGCRpH`o#*gPkdpIAz4yi?-3^*?kZU*7-# diff --git a/buildroot/share/dwin/icons-7/041-ICON_Motion.jpg b/buildroot/share/dwin/icons-7/041-ICON_Motion.jpg index 472a6354e43d81743bdffdf8eb4928cbe69fd8a1..ad083a208b39e851c498c2ccaa74c120724e6cc5 100644 GIT binary patch literal 1508 zcmbtNc{tMz9RKZV$gw$^#aPaY(q8wqHAh*Cs26)@(p*V-S&lJsq`arY3kE3$E zvQoJ!+U$MtqBS`po3xm@pWf#z9bvfQ{Q_$jVlqdPYBCqwZxYpi=!6zsnan=*nOr)Z1LLriyOM^V`>n zWuJv^D{K6nr`TQ8N2+HN}5Itqm8{ zmt`h9TRB<_CNi?_T!`|Q+WFT0Dk>0T$z&Rb#RN$RSpRN#W^Uv8RoOX#^*OGa;80wR z6lK!<2GG8*UTx@Q%LEEq7fbQYLNjW#l1Lguj%(Hollmb)xNUgh@yXvZ6z0avB zBkx{dbl$UV&NHw0ly-Bmk6C&5q0$+lntg}!Us7?~v(s8VRc>32a%pv3Y6GdNHa+2aZJ|o|^{e$t>+RB)*1*$Wb!*E^S0NjQ z9j9|X^_xu4RFX82!@3)BQDG+1#?bD1@Z_qMn;uHg$~~ag^8$ z=gu34UzrU!53_TsJp1_X(maN$Opyz(?oi|xX%6RlJoL7EY1VkYN2mV>O70BQ9qk!# z1LvauBrV!4oBhInvtx4XJmDTiCj{wDh4vXN+ff~2P0t41S$>`3T1iT?U!V%Sy;)9- z=GWoXVFVh}GW-agXT#x3_+;x2WJ;UE=rWA4Hj?^krsRLwhK4rm?%td0%XSyZs`yOLim%buenubgx>mC#EQB78&O+Q$fQoEA5>J^0M}$PH!u07Jjo z0uhw3OH$KdJzZwTY}|((SCwKIA4}M3w2GUZFQ{~z_dD>H)9j-HZPGtecSmZ2D6C!x zqR0*XVv+s+)UP>v5XLo6lp|(xxjN;0&q4K3o#u>lCKY2nm;5k9W}zp>;LnZJ!vW(i zA|T1jqS%-|QW88~ykan2Vx_&6_@Q;QG%a2W>ll(c<;BAu;F1;bfstwBT7usRSP|g2 z>2F!NdA5pmACv~OZ)cUm_3+ZuSy8e&v3ek1~gF!AE@xxB6<8H!m9aA2vE_ ArT_o{ literal 1906 zcmaJ=Yfuwc6u!wOJnEwcqfu*RSr`#9*=)kYq{IjW1T;khNKvO4k`+?SZYCQbP^^kt z1O`;pnS$c@LY~1vOBIXwLR3(!PXsDH@KJ3=M6IQarW*?A5ApkP=iIa3_nmX^o@>2j zy$2=*nRP1w2o0SH9Kd^6{{kFEk|r?~FaV2AF9E=M4?+`6CW9132}+>Wl5w~|L+Vkp z+JIsLAqxEDW`kOjh@0RzJYGl0kmtXiKwzC#hD3WSg-Sypo}dd!GvX0xUq@=v5;YPn zBA)~MnWbjEL64i%uvx#7prmFQGGH#HV_O2s>0tW7s7$05r@46K70-4 zC4zk=0?bD!5qZsmMMBIM75bu>m@mYnLLaGE0uKVAs~NQ`q$)-5U@dwlLk16(l9D1w z5erCTJc>yq5>zNcMIt`U;8UrDNp0p6l9o>-pdjx6 zNw8StEe^o2Ab-hh2^K8z5()jWfIwd?U`VSVHA#A$Fb!$7@3medYHj17H_(+8xKWpk zYlDrX9v(QhR5x-j*oc0ETJ6Zah(^?+bTg>!=YH_Bhf?$e*}~z`r8mRFj}!F78|l%u zc7w440}He#=_kanc7XMOF$^XhF`4vAFaHB#LNw@wWdp<>fV~Y4!?4L|HXDN2_G}jW zgD=CBPY2eMfa3tTfD17=fXQJ%9EP<4WC6g0-amgja&Tm_KV#5Y#)oM;d%$*JjicEP zEH=a%k}#MYCy2#m+u4twFwp_HAg(+tz|p^2lp%JT%%Kl$M>hp6;BeT(X?pQ(2 z?u+gbeO-&^_QWhJx&n{+0>U7#1nssp@C+fNA#O1%_2(W1 zDYvGhH& zg4>HmSM%7J$g<;;*HoO4z9gI=>Ox0HYfWZdN8#3M8(z$hIBH+AM+MwR@fy9YAiqvl zyeoaj&L?lDWhfqV48jXBiuzH{E47N6d5 zadA-WvZ5V_PsPT{ey;LyJkpw`toJ;=xy+Nd)Z(F)HIhlL{q9dR{c-kwLd`8t{|D9E z!w-(BkI1S>y?e9O=ic&~3e}YJU6bt`HYxsIm%r`wwe`QW^;v$8T1V)vdR-22L1xd3 zdgC5+2I`CL)F1BitdDiR`m8#p7B8-Nw!LhhM^=B#)TVeWd8^D)C=I#go9?uEYFSAH z@91KM&^MuX46BJdm$&9FQTwebw|FzQxNMx_;`r{FYeaSp^D`d&f46bg4Yv)sSKC+cSDy`e*X_PnnxB_GyFOx* z6)Y$U&a2FBC{%hc%TKNfKP~U+u!5KT>@W4+^9~%?f1*0;)oBaW(%W`3cJkKpXQe%e zOH|{#y2ZQzOrEHUC)n`?cf+5-Q<`1dxAlgPUw4Pt({{P?`j!>v%fmWvL>enF i)XUUT9`agoso=1@mHW0%e!%HOd1=3E_D)lmwe3G?50dl% diff --git a/buildroot/share/dwin/icons-7/045-ICON_Info.jpg b/buildroot/share/dwin/icons-7/045-ICON_Info.jpg index 34e63e587a1c07c0efbe4291b4ebf1907d585e75..9cfcf912c86575c2516b9517771c5ee8dbd62123 100644 GIT binary patch literal 1113 zcmex=VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7Ky&JB|SfaI!IT0VR|L7?_xt85miZ8KIKQEKID7Z0y1e9GpTTib}>nMN*7l zMM%1tS=l(4SlEGbdV)aBj4TYyteh|d7@1gD1sT|cghdn`**TOA6IG0iO`Mzq3yc5X zV&DN<#3aZp$Y9U#ux!(&Q?HInRaJdoyLQbjq0p_RU9!KW+5Pnwh`6e{g+*svKBuI5 zKuKiMzeJwrUtcU_Tr#zxPw0fDc*h~ZJxi50tUlVDWcfZuX`NKp4%Z7QC;Ry&z@1@spQ~ZlvmWQXVEyV@S5Bptyr^k^DKC8I`QzO;j_rSYd&+mY^iRpj z(TgH~?+RX#J?~*@sz+#_&3L1i{Lj&t)0BdZPxK=TaOB+DrT;TTf1{o-z%*v zvx`nGx;A4C>)zDXkS1O(gGi^TEJuX*xk^0c@T>UT@~mTRXvm>;Q!mE{y%X3M%X>EW zj-ki_omI1?URx}-j=654YQikLMnCG4#MKjDgr2;0(k>DB6}voY+q2WTWwPwvD=w~I zW7@kv@#e~}wN<~?UA^V5owIGZ>)Mu!o7Wq?)8Tw{Eur{OM&%`K?(>$C=`y=+7wWt* zXVuL$nJK8NtE+I;!6uWvC(U#71Pi7|8TUnZ*0i`jo}3OaAfjmBDstduE;%E87;RXZN6g-S_v#+K1l7?%%Sj_vUuZ zAeT;|dZS8lS^3_tAHIG(|L>E^t9{j*a@((7eAjy>aGUaX-{%4j+*L`(djlT{D|G*s zn4DDc<10(WEtS1tYa`F*?B-EB^mf_7E4j|COQl1O#4e4BnP~K8&4E;=#@4eOBJ3g$ z0>uOso=P57DnypGE9ZxI#Wgb?02(uh2=1}J7%{~^mbG`Jf>xL(u zxcbByPVEv#?42ZFTsjW&5Au9LM*?^~;olU#^G` KxNCm>|4jhj!=S+JW@c$vRenv@2ft9{~ zUa?+cN`6wRUUGh}ennz|zM-ChK7);YML}Y6c4~=2Qfhi;o~_dR-TRdkGE;1o!cBb* zd<&dYGcrA@ic*8C{6dnevXd=Sl&_Q3Q(W~w5=#5%__*n4QdyVXR8GDRC#&1Ub(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjTCALaHmqNUdTL3o}Ygi#E^!3HB zG&dI%0AOQ_OM+4n?!{_waY$uBs(w&vaeir0aw<@{GDvfQm2**QVo82cNPd0}EEEGW z@=NlIGx7@*oSi|TW}%=Fo|%`DUtX*U*5m7I<(XGpl9-pA>gi&u1T;l2Gc(1?%*4Xn z+{Mts$kf=((9qS<(Za;p!qvhAXn>^&kPXx8lAm0fo0?Yw)0=|OYl%}YC^_U70Bv?j zEy^rQO>ryA&s6|>+bR>cTg-5p2i2Q`+b!le_38s1qYsK)q{xN|0aFl&2~WB}4m|Ov z<^fZD5in{0f5*TFPOuCq2Y^|K@&9dx76wK*U;?t3n1CdZfBk8y6!`lo45&nU#f|gH3>effeWk7Pt;ZCT12^VKxRqAyIZk5l%xTaSq3YCV~u% zOstHoZ0s--7zLRa6or^s3>^c7S=kZ`8%0Dp79Lb8Y7%4re~W#!=WcR zIaAIwYs{#4`gCc^R3*cUxq*R)r*msqdCl@vVzWGx_<~h~qmMi7^gA2VhUu~lGwlRq z=FBe3oqnevJ4$3y0OOv?OKjzpuE}@pGx+%Wi`SK3e~(;WF8R~2;?%wBZ$GVj=YBi7 ztM}0Lf+?rkR8OrqI!DH*%RPDP6o-zfPWrwM7d!u)pOTum!|3n!=t3^$Sy90?2U=w& zuQ1rz?RzGA?XCkJs(sl_@4_aV{K)2L=X&@icE`=F*A-8g#kls`Ji4*_oupY|*`Lqh z-kTyf&kQ{+70h(@ob!amF%CERgF4z5JiPDwC^e;+JFM_dblKxu$0m4aJ@%L}?}qOc z|6^&q$DbJ3U6zW8a!_dN+G1qoy-jlebiOdJ=TFWlKN9Pn7rCG3_94A@;q0Puwv}eQ z2fl_Fbj(+op;Bm8>sOrqvitp=bN<{jBM&%j(_N_^6gTUKiQK1TyXuse&E3rtXFc>h zu~V&+L1Gv0z5J!MH2CA~?|znflfG2RKGAfYtG&Me6l2A* K$Lst5-vj_KUm}wL diff --git a/buildroot/share/dwin/icons-7/046-ICON_SetEndTemp.jpg b/buildroot/share/dwin/icons-7/046-ICON_SetEndTemp.jpg index 33f50041836c0c6a19356f8f8103e51ad864c591..7565e5defeb9ecc15b65ba5138e083ba4c89a6e3 100644 GIT binary patch literal 1100 zcmex=VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7Kz@U|?osKnCm_oLoQ&4FLuwCPrpv7DiU6EDI|eJ2N8_hp?y^1E-LPpoCP| z%9}uyl8g*Y=w`66az`1I==T~jxIZL{fRH~%<>_k8YLqU$-Wy+mr2V1Rs|Pu!LLuJ-a~a*_|EEl`6cKzPbIYos+h+Cg+kvX=u`+ z-Lh;G^rK@q;}j;^d`(mO^x>^o_1i!#Z&#ntn_sSfoxVi8y!`rKhT4g5V&~twS@vHfU8>)CgvVQcIZU9P|XBt9YR@}ysLw@%sc zgezI|!aO;1`5nR2=O6mdu))73{_Et651#~W%`yA-bYV)=CmH+5zjJM8MC7x7l038h v_4ZjF5ho=RKdrWkwA-}gu5x7B%_n9uuQDx5KfVh(nbP}HM@FKe^8ZZ$nj5J0 literal 1808 zcmaJ=c~BEq7=N2h44x$rL~3!CMJ^@T-CU3;SO`HPrd0@s?NlZtD`X(qxLF_^T2XXR zTTv`UsW^^Ttq0Tt#(JO@I$EcWjDU*QD3w-56daE#RMQP|*ctKn$D8kc@B96}?|tuk z&g;&5V2Z|JUIKttI|I0Z5jeYnASTC{l@B1mW!+x@;JgQ8nG9o7VVKn}Hkhb%Qf#Cw zn8RSh2r-U<*>fB=gE5O_kaRM`Y>hyBPM$##vnc{ik?U}sO-*K+;|gdpvEVbku^`K+ zG@)}Mk=YKF!(y|Li~(_2vaNQNBLW=|SFyIsjiJau2$L0oM!B*gsk#M-nxaWWE>?() zgiL~jDaC{WS4w1|hy*9XFgy$+q#~S9;R=;hi3|c|v(cs{s)U%>!CdSv0v)_mUS6I! zPb#M942)1Jl^8C;BoYxDA+qON8G}P)wfhe##E^C)ZMHFH%8IxY4e3-46M?dozP*CQ zHZ1$zUcD2j(|tJ9VsSNKK-SJAkR$cJSJ=c=$;xJMlC-+Rn#d z(!jt1(^>WlLC%|?1VF>!uoj2IuI%y_Fb8JAE?gI2-T?S6xDCTaXQO#A%;WR8ymwB9 zLq2Rc&jNuP5CS0#2>?d`!2-zH1j+$`p^@*;TKuu&+#uEo{m(sy5A)pI0pM~uJgz%` zkO6UEt|xB{U*G}!gkElhZ1R-eg-g+BY2x&f0C}LoJHuy9P-Xbo5TyV>FyscoTzH5o zV7b7Li1J_s78+1t@unyI=mdY~4KRVNh$DanU=H}sDhSYQfVZpQVGO819^7gos59htX{=xJJEfF=gN7O%mIlk~>y^5`j_Is#UN zZ!F?;yL)y{Zgzqj6<&6_RXA~b9I}ro{tM-n)b03rhR0RozT$g{Q>PwZe5&=lFsz~M za7EA9-1H<(ie}3m{UwudX;)W&vTo0YX~72%KlEM~nnJE#r}3K*=$o3=G;7(c^0KY> z7ij}zP+5{_NhN?HuZ%l%4f=NT8RN6Q4Zk#LFC@}l8>&Pqb?4Pz<5xhBM6m9k@@ONu z5c>XU`_b^*H)Ce^Hf9xji}6<|*;`m}tUS}&v3ULSe{WvtFKchh-JPcSJTf%*a9&M{ z<%eX(w=ga!t^L43kNY)pe4Ov8bN=zdMX_a_HJ(bttn3Uv0j_VntDOJI%1PBT>sp#C zTiVW_)JASX&Na^4wMFk=wR`pPyG13B|8AXr-`7_sTQlRh+;Vbqwf3i4pSla)L}~B* z*3Kl8Bf03%Z}n~Cnb*`;&XyJk4uA4hr-+`tWfV=ha8IZl%%t`#S1ti&9_Iw_GpXUb^;0 z-ApH#aJt|`?X~LE22NLZOQ93&T7K=pvvTaw_}jIf{OZ2Oi?13k?N!{l)YzZb-QV#b i_1MPc)UxKt(?$J#e?Iy853IGO@a3wOXQ5v@+y4XP(N*IB diff --git a/buildroot/share/dwin/icons-7/047-ICON_SetBedTemp.jpg b/buildroot/share/dwin/icons-7/047-ICON_SetBedTemp.jpg index 09e5072ab9b4e69a5ca2d17ce6eb83abd720e81b..186d02ad3b926608bf1296bff6a0d88fd0fd07cf 100644 GIT binary patch delta 841 zcmdnM`<-Wl8B>g$_i>(q+L@y;X#R{s|6_?)0lb8%(7C7Njq@++>5|o-|m4e#>XIy$G%Q4@p z7h(`%W)x@ci+Wc+`Gp`L+(nUMh*aBy-lF)}iu39~b@vT+D7Ft7pTSUF)j7@3$^ zSlQS)7=#3cmCZN}MO0FbxS3m6&J<)|WM*b&Vr7My%qYmj%wWh;uPDT-#O4^7D9rAZ zRHQ8O{}uxe(0(RCW8bH*COiC$N3tmw-2^t^O)r|9#U z&P@&Zog$~$BaJG$RAgHih5A#4w=B%LljjrAP&9|BavJkB>DSNnTvsuFnin%;?&0Gp zPj~d0_7xO{WTz=AmCVnoe{rcKdwtcl`v;Go%kGw(I((^92QNdTzDUqrugqn6Y{JT>rGx$B&D6 z=A}wU%=iA(2aw+uCvcfytwPg3Q zYREidl9jo)duQS8<4;~~dTLw75ZGX`GwjGzhiN-Mty8n_`+Wa=;VF*ej}`q(ChkkO zY@F@DGU3APIk80n{8IDy{IV~UM*o|!fAJ3YpYq@J-@Jb=Z+`0M^cQyCcYiFE+y7v_ M$O`R8Q~%!t05L>9l>h($ delta 899 zcmey)vw?Sm8B>g#g{!%%v$3<0sfnARp{t{li-DP?nX$RCtA&N5lcTAULPc(YudkI$ zesXDUYF>$_i>(q+L@y;X#R{s|1()8*lb8%(7C7Qkq@++>5|o-|m4e#>CtP|b%Q4@p z7hw=#W)x@ci+Wc+`Gp@)HiiJ1WzaB?xSb1(u$8IeU9*csV4m;@LYSXh{uIQU>% z7@3$^1X^*Yg0aPkA;w?*@L~D&jy75nn>S3{ z9wvX)n#uHi%m^7`S0^30le1bSEj3kPfw*q1Zr=CT+hbQWS>I#2 zV7=q^&zNJ}o3m5jv&^m3wN5{yqCIQc(t<9j`pAuu9E}r{{DNX1>=bHPrgdOXMT5of4Z ze7bsN$j28orI%WJ*aZ4{Y%I=%E_pe_e%ZM@wbNGLJ6maG^W#_QdCT9&iasAV@c1_W zi2byhX@{gN_g7S&bM|iP(tUjI;R>CitWDDDzuULme8zG3IL9FijiqXT_TFo}e%-&e V;&1#V@i*&Ze>dO$5E%deCII2!Qw;zB diff --git a/buildroot/share/dwin/icons-7/051-ICON_MaxSpeed.jpg b/buildroot/share/dwin/icons-7/051-ICON_MaxSpeed.jpg index eaaa21255b6276f580dd87f6f43af0d72cec8cdf..d8b416827dd2a804b46e2c25d44df914b9e9b4f4 100644 GIT binary patch literal 1489 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 F{{VNN@ literal 1768 zcmaJ=drVVj6#vTYgYwd=JbXmB+(JZz-nQ7MmaeoEkW~?xDAQ-T&8&T7eZN-sM?zqS+CDRG^8Cz#C%Dj zQMgQmNacK?L?9O}OF%>dp%fEHF=0}oK&TK%6iISq0w|r$ZrZBI*6Jp5(UuaOIF!@r zkTQASV(S0dryO)6+{htY1fQD%}ryo!c=vXoMybfvG3 zV6{!jzO`4c1?u(xA8NIF8{m_5P}%r&y>AtE@=vKjRzxTcwFkpum@K9jEH=vrHk-ro=Wy6uZa@H+8}ud^5CpN9 zEH0bP4G!c62G0tiF>97DXyOy}%6gMGWqG;)><>agD8zt)AIyMYhNm0s0t_0{?;ikv zx&Yb(z2Rgrm~3b^01%tWgt(Kx7=94U3}vx7bLNJHgJ?8D$cr&-KPt-3PZH1bhXG*u zF(D4bnviF}esdroj5f?=s<*S&lib5Zq;bni;5*F_12SIdBKNy063Jl_Ht<_>} zJ^B9CRuPrjxi2B)^xB%m^-rEZi@D5M%v`Xs=+-cr92}w>?mp)R2cU#g#am*WaAa2i z=hV}R(Vh*_@ZCHMQ*!}6o6PB|9 zX;iL#c4&1;* z@XDUQ__1k~(M7Dm_^9-~2`f$}cBuRA{_#!aI}IJkN^p1Yk!TO-BcE*gt^Rs$pp@Ty zyw~j%9NKUWsNr4`Z_RUMBTj#;kMjRu|kG8vLa>_E?-asTVii+Z@4 z-QFT;8(UX!>+(xyT7+Oserep+Fx2*deZOhk5z#LGF}dzQEw@?MbRzXq`MW}yt$WNm z)*;<<_2!^Bk03&L)))K%chrJwKR4bgi;OXC>u&EKN?&;VMbp_uw4AEp#NumAu6 diff --git a/buildroot/share/dwin/icons-7/053-ICON_MaxJerk.jpg b/buildroot/share/dwin/icons-7/053-ICON_MaxJerk.jpg index 119df1a03d640da7a8df0627c27e160b0a05a6e7..05190db4c33406e9257380bfdd49893b0326fcb7 100644 GIT binary patch literal 1501 zcmbu3cTm#@6vuzR48n4RDWDAq0z#4&WE2n(H35RkUJ*f7040$Yj);QRDsn-w3C69K#(9535vS`H2{D>LEt}{0tpq5_AQhDN9n{wOiU9wQfFS@WX^14!kz9fT5D+Hm{|EvD zp>QcA0#Hy?Qa-4vr7fNUBBKNROCVOyG zm@^aME^C4I0UK-zt@C-43^Pae=o_20dMCk(5#Ncd>6(o*oJw@y-eUX`nUWw0U zM_`^UCCl*-ZCVy27fzny!2PBhl~ESwKlNRMu5^7oM_mkXTg83wZ*R}z1iMq=zGjmR zQy6%dh*B6=+->ODdv24gijZZW;qIQZ)5Q`IyV!x!!{oNaHH?$%AXijY^>TUf71xQU zz|b9_;xg2{YO?t|R!-|Yk2)W%bR@K?Q~gCq2|fNzZ}{tJAu6RtjyAj6oWXdfiZQLf zk5enAEXZgvyNv343C)D5vw0ae%VNnbbY^LWM|S+cihtV92{%SjwqNsY-@hQy!TT~R z`)^{wRM<~4XHb{jmRS$~^jq?4OyV)4lZ>(qycNT&S;*K7-+Jtm*zg)lOJ->i8p40N zLeSf$rRnqVAtc?H*OX){wf7emkGMBZ5nk~yqeo1QD@;?y{1lDgt2MO>%Xto0H&baR zyG>it9@&hFY`$DCZ~El?U~nUo8pnZL8PAC6d#jx8gemyFV<`4khvsoJ9O7QTSHdQ3 z;+5X%q7=U+Ix{5x@NS}V?3W=!`Z>II0_N~`sQfswk(;n% ziOUQYX;S!eclo4iD)xUgn8zKpuxxrL3fmI)mmE_yM)TL|joEHA;)_tOMu{+?yeg_A zSL-|B$aZZ6rtR{UHgX0#_xuyPs<-uk^C%HJ@11o0em71av>k3LQHNPvCj>>QM01sU^t|2hf0gQox{qtptB9K zE?`UV2*5gWxhCJDGIu_R8`u@&zLeTN+cMD=YT#Q4xo%XKcsSykxmnE=jNL_?EMt zy<$&}mAU);Ha#pLKBW*0y=a{`*XI_v*QPUH%BvV3B%P3}WOuSR|Cl`%0JE!!H8R0Z z<<8PO_q)uPGcvV2CPteRJMl8Y{7*U}Uo zJQzuCc4Y7dSdD#-%yH8vjxR}O-g=$|=iO8QA4P4OQKZ)LZC%4_H`eW|#GJnYC>D1R literal 1756 zcmaJ=c~BE)6#q7xg8+gl0i}a=S-|lko81sXQUZn?iW)@Z?07UJi)3Q5AqgZzwAcaZ z2&15OEViBMU{R}eDk@g(L2W&zmsmPn7KI`shee&Kl|gH|iGVsIeShq}_vZKez4yKE zeV$HFADFFn84CbNOChoA^CpX3=8~g6aT)D<(-?~QAP$opRd}l+x!QC@N!dt5EQpWQ z<8cHckqYp5p_GVQj1WRxf(a!UE{YZ6GGV+-Bt<3+rK{Nt1+om4W}+4y$9Zr4 zty8kEoYf0Jt@i(+X0vwyK3TgXgM8laD~0WurB)KlAnjDKO;6JBC@O(h%_lmp+X`|kcbmBlUx<0FE*1F$0XM<#T5ys<$Bk_Y^5u!NSm>Q zG-zy;8Sx!kW}Lnk)wFsOT*I`z5b9~U7~Kr!z1$Zrdoo3Dkk_4BT{@Ure$qm3yp3LM z&nO7;Ei5p!&`${R+yE7TF=a6A!A$xKGg(ZpvDhr1vDqAsABV%{a{c|e+`yL&f?=4& zWO3PS?u-C#z>MG^+Jb|9pow4Lv*=~sROD#^JU_q(d>G;Z1`mRHkmmau#GQ+hM+AOk1r7RMdAelsWg+_@#yO5*yCm7n5wkoLu0#G{eY zeVpGCVA0`%hl1Jt@8aXz^Zja6wU?H5j4TQg6U+O!zm{?59nVd?zc;Y7qq4mMeXu!c zp0=z!A|o_9h(zw!2S+7raIF{W{fYA2gRMbZ^W*+mG8ez>0i9ddoY(GryohM+u0MNq z^itQJ^@A7OL#EU3oVS^N>TZ9UKKH=qPu)NN(Keh`wB?JVjTe^ve*3Vw_I-C}&%W)+ zjRnE_sIe;}H`ef}?saF0RZ*6&JNRc>$A-dIG~fR6Pz+aC~ z&1`wI_U_{@_^oT2vyEq}w)VQ6NrtwPJ@>C^-J0y?TbG=HuA9>ezyttsKpX;s0bm#i0t0b60ja&?fS)A5FDS$X3QzzH*;@)gKzo>n z7sAI6761u~1N+4ket7@KKY982cm=pXg}VR(fOx=QZrc-t2L$Hju=RO#1|9SV`bcRQ$T^8FLS;l%R*eyu#V33mE8`d_v4J-QL zQj10yM%U*JYjpMle0E;>0jC?35y%m|?(oz`-p!LFmv`39SCpM8n-g+o(P)@rm`x^a&fSdrz`7I{H}y6?8p0vt3kV|3;ya;){f!}3y*Wz z#vh5Dw!(#oQGECta?ChO0+;OP;;B-#uZLH?nY6Oj;H-DZ3*}AynJ|WB+%-e^ zB@l|5t4ToWT4F2=@dkM;Ih-qawSlJUfn`c1cD9rp^H07S{h)Uxhs<<)eCUClXW_z1sDWfp+BjOP zI#&2Rj_(=9tab&17dqlw+UzqLl{}T`GTr5uw^@*;+ifA83x^KHVZG;<;O3WtQk?tH zu92~%RweKKjSMWOBTM1w*u$IS zIpqWNh{8BMfKoZ<8qI9iZCc#t)(>0dW zI?ETB8XsI&V=W3gmD9ZfL;^F(8X8uTo=X)3%^IrOWWsek!-rTO<`!g9-gOdJKtYwJ z7JhN{r{ukjk*Mro*mkR}-Ra`D{np~;Y*3)pMb)=Of0n(0?USJ_upIG$FC!z4VUzzB z@Wm)K9H>UXj#_yHM~^0bH(^VTwvpMWk`{NT`VjlfLAeaPx{0R_>xeSE5?!%Fz`C3& ztIb8O3b$iz`?lNq&kJ&&ZnJ_^YaXm5HQ0wSh|6qr=9o()4@eE+2YoR~xhqSzA^(AT z@4x{jx9aZ95NGDYPwUS$zB{XxslS1?@Moy7X7vRwqvdsH91gIP%HK?!(>@HJ)bP5rXa03Zhp27sKTSD6 z#-Qp+s}K+Go<`r|$VO>Z``-E!SBdG_!&f>=yX11S^G(K-%;fP7$T5Wzg06wbTtgxtz zBa!RBV&eFRkH@e5mEQCW!*AasKERh!o*mN)l6oYsXu$ytj0xVtM`#!V+h)FTu480c zc7z!`zuc2dib!P6EO2W#Q q3jZcQO3f<-amVO(o0`!~Q{w*gk|qrfpk*i$s)>o?08kQ!^YK5qgPa2Z literal 1816 zcmaJ=c~BE)6#tgZK?K2YsP*Wqfwm%$&4zGfhlnu&jT#Pv1qGRg>}nQFHYTA2s68yA z!ib7>1Z{OZ5wu{XSdnREs;%QtRM1h7;s_Nxl|w{Cryl7ha_Efo_s8z{-oD>^zxVci z_Evi*m>zAT)&QVV%>%Ar9QIzoS7zxla{vTbj5{6xdnb(QtyU9`qDG5QOVH`0P)8e3 zo7RM4LJEv3c5m<*&AtAotZLODcXoQGHTQ5EUQewD1F_6 z!8DfkowIr)P_6#|P=moS0B2f@bvZe%_nnC?i8&?`T~1o)EVGVe!u=d%6Rt3mS}Sc% zr0I2|Q;gTsR@$PcO^8C_m|6rfH;FP5bhahH$x*9umC<6=8g-;fDHAYRgcL>KF=1GY zC^S?q4vkh~ShQRkBbLTULgbhvTC9-7M2~Wnv@Xj)8m*&TVw}5hLat*S3?`2~XbAKBU48v>| zo5$hsCcE+6CVP4?@bq*BjlA4nTW|BmEPDgsy8<8J14De^!iQi!WWUG=gBXn8e*n0y zFwfzF-*mD$FpE0{07fjtWsiP=m=^e6Y!2}D@#RjPBNr_6o92og6icS_0p!BOGLlDP zA-)Ud1+%~$xle-Do9!zQFI=BqGO+W9W-+XCt({>$@X@is zqs!8&n%t&dKOEH7^5l|g-l>T6&f`1o&rx2C)q497Oc|`GptrX|bNFm^U&370d&L>9 zFUhU3J%3i6NSzrd@%ZM--!AwkN2;hB_ceY8u5}jFUb>k)V{@iC?)Uokzw*vKs$3T2 zcC3p|F#gt^&<6WgugGmaRO!ohmj^7iKz{Iof?4FD=Q9rl3^j$6QY$8DCGOgny4bGG zw!XW!dJ3C{_MBO{I&eeFnpH;@eGrv+v9`~U(h-*t?h|gfrSCYM`cIASL!xeFo#olu zlK1tE?O(shdzzBfln`G&P_g+%ldND^6I3JE6xZP^NlW;3HC41f`fmLc15r|uXsb=y z*1y*`xU3o1-%xJcwQGkfsB4%Rttrv+MWvrzD9C8XpZ}!E;)hhs&0FOmzZQA5TpUq7 z%hx#En!TihoP2Uq)%w(S{_ysX7YxKsztev_V9=$rGgp0ZNhP*)``P}E8soY8p)DoB zQx6w*^|j91Tj+EAtHiCWF3pyFf2hFi^r;gYR-QcOp~9Lgykbk!28VZVoA&cPFBOu} z{UyAAimXNVk~;t3#O>5OrPm+u8~2681^Ee!>9pjgsG^>>LfPZUmVb8=TMElN2fOOJ zG#Ba{hMJ2WCI+%!yb5GBdfCD3ClBK_x!x&fGcNDmU3T=!j)5DB>-oE0t#0lwhI;cl zE`(LqSa!xg|8e7`Wl2wE)vES<<-Ll=M3b0@Bbw)1HbHFT;}EWxP=&Q{Pw*0ZVJl3X$Ss$wL$3zW@`$2E@Pr+WdEMN M;thp=d|_|<5Bm^qc>n+a diff --git a/buildroot/share/dwin/icons-7/058-ICON_StockConfiguraton.jpg b/buildroot/share/dwin/icons-7/058-ICON_StockConfiguraton.jpg index 8e2b6fedbe13d70828d9edfd21ff5c0e95272e7a..7a64b703781750e837fd9a715362fd8f13eed095 100644 GIT binary patch literal 1050 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 z z6wGxqUUopR%xMJ~r>Z<(5-Y>kQOnF?-_mFLE2&ys9`}?FTkq&h?XPiTvd8OwlSxEj zaOA>3+xXbIi`}k0H!uQeC|#?)g}6B_*J+*1a-JBCP+hc0SC;#6wnjx)ATQ#3P8y9B zXh8N4CJYFS$Z5x69e*_K+c**B{M(W;s?sit3!}A!^i=r|XqoQ`frJc?IDvCO4Nnen~AL2K2@0@$@`Mz`Rx#wE% zSbKqcv`L)>KwO+JV1Nl&`v6mBQ0AHe1yITDWB{zaFp@(MS}}rPdago+XQEssu0c!+ zEyCyW5D*q_(khg>D8b4^v(=b{{iO9Ao26Ds*sB8NJh@hi=BQ)yb?A!xrHRV?T%}0G z4qwO$Gl@+atp+6&ER!Y=(~C_K_K3Kcv~Al6n>FG><3q`C^u*qmTRhBqG7Bd=)TuIoYmogfS zT%(YS>#`BPNF+jd0z@F-kRBYp86y-X4yN}SQ;?y0rB1CS)HuenDJn8?10i9PnZCb* zMmsM1(OP}rD3^cQRim*LU_@3=B%l-depFbWXx5@g0;~KYA}t6aXL5QE7=lTV6V(QoHUhd0jB(iLq&E$QX>=Nu z_QA=x%cl)%8(=bkGjN6}OaL({Fq2|!2W0?2FlFNZ13+g$v?=x!3V_Km0Xm@BQ5iD; zfN6F#m^OAqfv8N_nP%tcfOmxSuUk$DNkmdvddw>*A12Wl3}E!peut!*f+Lswd4RZEH%FiWdm?ibDu zlf>4a`|`#*Z{Objd&C#=!gv=*ekcn1r#&gcWam}1dDnM7{b%~5+QsSW;rlHOXS+9M ztWaN@<{C94ZM|(qpi@kw(IIZ@1w>#MUVj7kQxtm(|_aEJ=ODzpK&h)@yqp2;@ zHd+Yd(I)DKOSfMAT9B7x!M?fq>~Pf3PI2{X_1j|p!ibqC+uNWH`cA(;y6bbREQ$7F_v6aVi>W1l z8=0m?2W5t5UGwe#bc2tQ3ybSAo+VYfhWkD4`1VUpxwI9(u~+`8xAAcNrfcSHhmVAo zT&>P7TKN1zD0SE~{Y|G#Dqd5qsTmyJ<5tyl)>Ts6rS0f*ypr1W8Izu61w#!3t$AnO z8S9ayg9DVskxQ9@8y8gsm|7<+Gn}u;F4p8>B+>hdh=raQ#U94b!~NwF*&KDT3Awhs%+Nr YR?nk{-mXf!?f+&?({-PI3vTWCA2hvu)Bpeg diff --git a/buildroot/share/dwin/icons-7/060-ICON_MaxSpeedY.jpg b/buildroot/share/dwin/icons-7/060-ICON_MaxSpeedY.jpg index c3b3cc7ce18f4bdc64e26a25c9e43a2546ef087f..f069adeb0287cee17cfea70dd1397978e9e412a3 100644 GIT binary patch literal 1465 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 diff --git a/buildroot/share/dwin/icons-7/062-ICON_MaxSpeedE.jpg b/buildroot/share/dwin/icons-7/062-ICON_MaxSpeedE.jpg index 519f1b448c84021fff252a8e10ed9bf583145b73..1625ed2c6abef35969d0e846ec4d57dd9f0d8421 100644 GIT binary patch literal 1461 zcmbu2eKga19LK-EjXmHl^N>q4&8DtPnTJGmOnVlfA=wb}6sx&hx`nMxsFkOVJYB3MySwL}drtrNe*g73@Av2RR)`c+K=Y_8#T7sh z3=owD3JGvlUSFqwAzw#Oek-~G76o*G4jjS)7#4zKAw?h12LJ|#z!yTHVJb*9Wkl2j zkSYWLNCgJ}FIRzJa8(2ng#~CWZ5WV} zS29!)S^$aF*4d?tHz8R$*&LxcE5txUS%G2USl|fWdJJua48~IOd_=x!pgxf@jZ)GUGOsu!sT_0ZTR41kw{Vj$2#S?;=-r9duCbjCW279A zaM8h*qTkmwrfm@(lUXg7BFIhqZ`Jtr-q?3Ot)qG7pu@r>&dI}ZC>={y~p0uFXHR+w@eIOR*ryDD%Dd3y--KU#*IbUXa8AP z=N)*0iE_p#mPn!OxW4*dO!2-eyDR#-X$;%)#GFh17uucEq+$hdKUe!9KVY<(R(z)G zc6PlgighE@>q_azSaQH&l2qW3Y+FFZo_n1@U$v8U5Vssp`g)ocT3iS#d3K_JeWYeD zeXu}X^B#3vR=j*QmD&|Y`cJ7!JD4>9DNGUygN5p&z!C`{PLX=`cZCEnW9=TAJj5V=8In<0uB=i4@3O|>|@x;krbcdS1? zrSt6YJIO3}qv1U1Zd{;Wk`Ft4-({n^$@Vi)&*bf?5EBHgxG0ZgM#R(tpcKlghc63$ONy>nhX-G-|_Sln)6`SzJ;o~aR=zNzDk zDIN5l*@rQ3SAbfUS7#NMltKDgKd{4{LkYRw_`{u|2;)g>TL!76On18reFJIJz^|8JJn0eJ3RoWN7^etz6FHfr0o?v(*b@JgJq1ZJ+~8aNmfWh~9){Pj7MQUqU6 zfPu47^62j$$MmX2n;4#(5*ycXQL%#bgQjVYE6fPi1NWXGa;5@=x|rE}2RpWHdwhIF z?uc<(%Zpc?h>430aP0GeyJ_Xf!WOHiYY&cC$SUOn8?#>h7faVCC(+wck>uO2bq62i zlKnCHdqPJR^mvro@n3s3Z%RmQUFK^Xf+{=Xrx@JHp!m~EglcH?o)*+lu_UlrV3iTm zS&{>*M-K`54RU+TuL(FDx2714G}*nrEsGh_eRwMrgWwd>QnOy0qcc8OW7M=X30VR7 zH^irrypHmOpbVzST*d91^+hb-86%1E7sjLgeG?{{c=0(Wuq3`|lL2e29FI@I@7{Eg L&n@>qRlNKM`U+Yu literal 1888 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 IJFM;h0Yw;+u>b%7 diff --git a/buildroot/share/dwin/icons-7/064-ICON_MaxAccY.jpg b/buildroot/share/dwin/icons-7/064-ICON_MaxAccY.jpg index 1a163314560cf2101c522785e0cf3ebff3f906a9..d7183b716b1229cf020062c78fe133282fa5b0f2 100644 GIT binary patch literal 1496 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 v`sAU_15rL9z diff --git a/buildroot/share/dwin/icons-7/065-ICON_MaxAccZ.jpg b/buildroot/share/dwin/icons-7/065-ICON_MaxAccZ.jpg index 23255ce0e591fcccf003ec52339bc53122fec042..ccf17d2b41427a1b2dce1d0918ba52e8b7940f42 100644 GIT binary patch literal 1506 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 Jx8FJ&{s&Xtn1=uW diff --git a/buildroot/share/dwin/icons-7/067-ICON_MaxSpeedJerkX.jpg b/buildroot/share/dwin/icons-7/067-ICON_MaxSpeedJerkX.jpg index c316c750b58cbb87b50e938651e249524afb005b..d00fa1156d444f59de046cd92774181a32b61638 100644 GIT binary patch literal 1511 zcmbu2do%={_d{rj$nAZPBAKJT>zwyJ=Y9X~`Tq4i&+~j9@uc`Ypg=n1atZ)J2%sxD zKs*gNNWP!b56I6EByDjgfJ6Xj01X9^00ap_k)XI6I0%3M6a@aGeE=M>U*hN}03aL$ z0T2rR$Av?nFezyShz9m4B2ik}I+Bzs2tfYdhe-oc2>1_xWCjXAB>Fc1fk|LeNNE(H zh*r|n(ng5i0uHT$%zN1Y@>uhW>t1?UV z`$hlYi1>z#P)45T;)@+tRsqgRnu^SQrJnWcd>X02VB1P+F=yHGwX*$JJG@|xu7J-L zra`yH(PV74polD3y>)hb70S)&Obrux(+4_SlM7ltp%qkc5iuFHzeiD4l`>w40X1za zTD6SQBE6<*6K`Q@m96HAqRFX2`CoE14gBNg(qufwE?V+%7q(NaS}lu3*>(F`W{1Oi z$@MiHG0-^jy@JFjfSKBB(0v^!2Bn|>DF1E!(DXZp4fe?dYn!&jhHO;70f09l@|usEy&d-YEJB7e5S83Dac1B9MZ$RJ#7_0=;%}K#AoY&M0UyhEENpFNbF@YY<7U?Kf=UkrJ5pVr zO7&c2sG%((K|@JPiH1Vhq7$lyQPdMx^2WBxF2G`#MDG<5P^U|SoQmr8SFyh-aEJ&OCYUJ-2jj9oCnZ=@ zx}GN6z8R<^>@LI{lsQUSm&V$cATl;_3gJ;x3ms$9L>JEdBxCJ@jho>ZKD?5!3% zEXier)oC=N^4&{EF}MG5p^d_V7^uR9vsXfSd-dOP?3m*RVt&DorNi-oWX#!0{0N1u z=jp7(j`dRatCM2FFVw_T`pRgP)1n(;k9arQ(cY^}+DGQIYlo-K7U8c%8%xz&2 z26adwp(Nb;;iq**Zdvq`KV@-OiJDG%@ktl;_)C5l{UM DToGfI literal 1936 zcmaJ=X;4#F6uvJnfnco?7ExiwmxrJNSzbuMq((~;5R@Qd%IZ`@@{kmh7m`2%S}AVh z0%}=Qa4Qy!b<}|trv`1sWssp_i~E8yf{IuLv9@3p(-#WJ5ApkP=iGD8_nmXkJ=cEA z{s2r4w`kG;h>8jTbnqVbXMiEgQf1@-2vA9PG641mFelw)(u+78osq3n6R9{`MQAw| zrJjSaxg0QOo<*-zW#A?x6Wm_b7#$QBk+#FlL6N}_Q-&A~b7Vyl<*|sAFyM%Q9l}y! zd>#@iWMd&*A&(z~@VHngha1Ylf>~Tl#0?Pz3y~q9WHy63O%x}K7|KQN#OTna%w{v& z9Ly#RD>#@?DCBT?93GEFMzD-II+N1E(iwe+6=b+kWzgtN8bXIS6qTt&mPw3~mHvMP zt$sxIgS{FRD3^acRI7C~U{Ka*io@U6`$1u&B1eyN;&3C8Wl-T{xUYk(7fB7c(nJ^( z1hI0si?Qj1i7=)UdPFL9bZs^=GeM(M6K3PAL5^H5iqaWPN}URil8I4Lg{{%3MWF%# zU&fR2c>+NMhJ}ZP@gx$dOe&G`L&60@LFh17MyRs1xXv`pRlny7#^gH2L8~V-%W#7x z8&^jd2rV*rZINc|T6kmX4RO_D*AhG?mqQlAaXjv*#~yZ(6XY;QMwi@-3_q?TC*DAg zw!Irn7#vujt|z|`WWNj6184*k(xOnvm0bP@Oo2&|3)KObHV9`2=p%5@$!Ho3)0}Bk z+NhI}kdGVodcdFq58weq3_xK(Faxq*0EOf~hoSfX9{?AM6MY;6C=__K*U1^sAu7!k z0N9BJQ)slILkg7!G2CD$XLk?JNp!&ULVdBY3Z9E3HF)wA1^`qljY6e54@E-^iW?Jl zrvfa@gXZa^{1$c2=fzE0Tq7y+E%vhC0prP9C=8eZ=7EPxw(VVJ?GB$3-}YIXAz$6! z8RlJ5{zFprch|m%-+8D>`AwB?F`Rh&5ckg6@!C~>HAmeg{@mC-*=-v1>AeJV@T?Rh zQV|i5aAn7}JPt3e&kk(v{cmim&C_NW^Y}jWkSaQTZfb2*J-oC4$vw7WQ!8Y%J~@@s zFgJm<;PlTBBu*;~KPuU#b$z*Ioqzq>^rtR4Qw_UQSm#Rx#Xc=mW`V>UZd?_dUza@n z_R>PU(ql)`INAJH^h)T+3->>KH+EAh)7-imFtBUju~( z7;fNfVMlUb<9+6xhSOz7pAYPz8*?uknWb+kwt8RbJN3BF+_mhA&YY4~m>{S-*?78F zwWj^Yt~Z?aGFk@Oto{yi)LUYV7Z}lk|Irt*iUC}LDJ=1M7V~lQV)yJpS9x21* z#WB9zFPh$-=*S6t*RZP^C~OP%oO~Tk|H>}{qb$10Xq-qF^tOI& z&1>1$JQ4c})pyyV(2}Gx?^Erlh(!_fga6cQ!wtuR){3fHi^5k|mZg;`8rhJ%1bMt!y>2Tz(Yml8^zQv>J0IHkuMR4@mSv diff --git a/buildroot/share/dwin/icons-7/068-ICON_MaxSpeedJerkY.jpg b/buildroot/share/dwin/icons-7/068-ICON_MaxSpeedJerkY.jpg index c7cda895033b1fd4aab35285009224d93ad4263b..6b8888a910fc0cfbf31e0d014692c2d56d63a20d 100644 GIT binary patch literal 1500 zcmbu2dpOez9L9g!+)u^kHmPJbiI7GerJT78bKO>%>xpGZq?lDZZbgcdiL-{KTqe<( zF>~$2XqC-19M%mBfIwgXB|ktm z1~|&U@6%Vv_Yvf6nGk@g09t?+1Ox@ZP!I$Pl8FE~0DvLDw^C6B6xHMoN&^5XKmafp zr1+n$0EQ?kft2MCsHTo83}J+n$MisQ0O(tQf-<0_qA0hJ@|~{$@c#j@0!WU4D#HLx zEp0=Dk&5g&utDAiLm^PW9_VbdeYZ>}KQ(9f(dKT)^Y-^oJ*>tB5;c}HpHf@2_9NlL ztFIe6`X{-mr@JsNg>S~~;N|Mur(p=R(X_PbFW6o8gT0vMl2xxg={ffqJ!tx-7QBK9 zg{NsihoKdSJ?UHOzA>UDki0w7}5wiVtXQRIa4^g-cWX< zj)0h`t^OFLu5_t4Bj4#c3E4T_Z)FjG0rs$AT~}Cd?t;#Gce{;N#&*17c?Va+Hkayn zg!xONc&qc4Z=Y30)Hos$%G5NQT(P(5N@MmD?)^!7{o}ft55{Oa{8}yiqoPbQ(H>F> z%rWQ^IVzi(z!WrMb|@3(#?F}q;f*VIEf>rL8&(*{6%TMo(8w=5mv|$rwbtzd!WmPko4nm82*`m_q`~p}u zhk^|a_oPgh)!w{bO}05u#Nlo#m7>u^(>jvWxgD($+;B8BNJ~{ciG#pfZCoVA^nCH0 z@H#IzBjTu>2^?)S|KfX!f6TfRg)mTeH*h%5?{RC`N7Tbgg-u?823v$DUn_ zQSx0=tZS5rg#$zGS&td{ypOvDi3OjI&4!aqRPnSw-)3oUwld=xETUXxz!|%HW_48u z9!2HaB)_%4yV6F?iyPiA16t{*&HSPi#os>#i&7d-^c3OExxH_JBxs+{J~4$V#b(;oL%jD(At%3LbYAG zwY%oxA@`|@!kefoYcGS zy=iajiar)B8KPqz=Wsfn%GxY4Kr%ON4c?v(c8RCgzho)Pn22iFj z%T+azu}51d&lOYnI~ypH7dZOou3G1q=7bnOI*Aa?g!2n~rzlIS3(R@LyxTFnf94B2 zlZ5LPBQn4M>C`O(&EqgQv4glKV~m2`K2hc!#?Ox>_&f<|5pOI`y%|p%$k@#yQ6Jst zVEgA4uq!LFrKct%?*F#z7;$(Z>LfxMlIY^u9$-3pM7WO_G8l11_Q${H~pSxs`_KR%vU+XDtKmY&$ literal 1938 zcmaJ=X;c$e6n>M*21nGe2rktzs0UFpnS=mIj2H+sp`s8`S*kS42q7esCWDD`tQ#sQ z;9lITSgIV4yPiT(K}Ffrsnc$&d1OF$gcV0bypSLr7A!zQ z#XKy8FBSw(L+6y=Aam@tTsN%$cWp&01_m&#_<&y%PX(LK4Sos8RaDZAayvkQ5I zH4VkYVlm1WpaMY<6%k}xU?w$=AhXTCS3!Z>bXJ3fG!SOQrKr&oS)`0hRr>AW?ZmQ{yS;r=eNMG|SnH6&q8Ac)M~ zF2Zz;TIepojBc=8VE4gAr=l4!%wRF-j1Nxw zLOyLcs{n@$yn#0iaR7}2!5qk04e|k?!SBC6WwG68Om_$Z5aUBPiwPh)gFP4kn8|=? z%w7&eV{klSI+Nw)?K6Z8M*DL8G5H=rgjVP_lmh^r&Y;ohtR5wZL-QOBd(i^Iysr8$pAeoUy;rDcIFx)AHUw(d9o^KNICkvY(wORuFY@W`fI9|S zQP7(FckOSZZ~roPYUBL>E|cY_)5PoQyRMurcw$WIG)iBjUN_rQ<`v8q{Zv+a>e;o* zuan5G&hzG)%4n~(^^?Q&c`wJ_KHvlgE9{D!b$N-o3AB@`!`J663AnlmsVnWssMCPC`9Ky$Nf99`tOH(|=g7uD86$oJy2 z#?wv^^04cyAOknmG{!3%k`-PM=Jj%laHV_7z50rZOHD-=1COt&5B_&iYUX%VV9k1r zHfx&VxNm*yU{7Pl%84t~5%j0kO2hS)c_WiYC@o8NEkDuBT$*h-*EwQUz^*MoShBp> zZ3%msLKQcp?5(nfeWne~ExN!<9p^sOi=NAf<}!D~Q{|UYXvsj72C{ zf?*r0>oc-bObe7HmE1kdko^+=u; zl%n4AO|5T(`_|C;=~Nhcxf4%*R;>^!JXFe#7J-HO^b;&_m-x^zy{Vb#+)(@E*5>DM~9E#Jbr zc)m9KP|K+|Qc2^h_Pgabe$*T({W7Pt{6WP1Ol5vUWSF*Gc93%?WQRv}Qq`5AZO<+c RS06q8d0(<}m++|b*8h}OlsNzZ diff --git a/buildroot/share/dwin/icons-7/069-ICON_MaxSpeedJerkZ.jpg b/buildroot/share/dwin/icons-7/069-ICON_MaxSpeedJerkZ.jpg index be450cd460ac69baeb096607fecc8e2f95790a49..f06a69ae2ed92bcf2b0773594d25475ab8078833 100644 GIT binary patch literal 1507 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 diff --git a/buildroot/share/dwin/icons-7/070-ICON_MaxSpeedJerkE.jpg b/buildroot/share/dwin/icons-7/070-ICON_MaxSpeedJerkE.jpg index 3c926b85651935a5e5f4b0d1fd1d4302349f613b..9a018367fff5fadac938fe8b859dab59b89542f3 100644 GIT binary patch literal 1498 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ρCP>=S^xk5 diff --git a/buildroot/share/dwin/icons-7/071-ICON_StepX.jpg b/buildroot/share/dwin/icons-7/071-ICON_StepX.jpg index f1015b82185f1a126f222893c0df32cc2f09b05c..432b10626c09d7509ddae455bad7599ee70dcf67 100644 GIT binary patch literal 1555 zcmbu7c{J1u6vuzFkF5;DD2izC4ib|v*@Y}GylQM28KOo~k@Z+g(P*q=i|or(_H`Q0 z;K^31u{YLw)-qI*Ei`ZHy+8WDd;hxUbH2+Tm&f6~14OONEzJQC2n?w67vPNpru^&o z=7-7eIq=oIHUNbL&;S|&LIGeD2!aCfIsnYia=TGP+}5*I9gs(;m~1C z-WVYKBLM|L0fxZ5Hci*xdCQdkbVxUw=o;s6~<2_t@B+wsO|7Uci`ISZW zvP%sa!r>qqhwj{0@%&U`J=bP+LvMb9?U$}G@bQ7bxrW{2v0rkH899~JIT`>X3#OQu4CKQndI@7XK5>4l@=px zdnxBhTwfz2fPCL`Treh>)FkUDwjMNm;hi>y(($b!7U8hUa` z{md?*ZD0N7VYa&vq@*%=x-hJR!!8e82u}MEkna{I1drbtSp0G!}}>pUvFT?M7v| zkcMlsB#HS|)%repv)fjdJiucgEqFt3$mc-GrmQ2A`bAS#e@`JoKi9B^Q4a6$x;A&u zTgzi&U6G8#Pbtg2GSXUnN^oOcm8zr7Dpe}yX`W^}x6&h7659?~%7RXNkR_2E=I`dT z)mW{J6&l_4_E5za6UvwMqyFkCdf$|vx=T67>BGM1P@G7vFNjMR@qMO4*w7qvIiYqu z|12q&ZOg45=&}ncujjsc+a@^dzMZY7`GN#z0Z<2DBvBhm*Jrz`5>?mWD-8Go4s0cAY5 zSDrg#X4@H%(k`M;?O(V+M5lN;l*=?6&FlZ;fyG^nQ-j0E;-1No9N7x7(6YToQCO(W zv_x3wry|zntZph^&}}Cy*fofEYq1_;~ z7hFhVn=9Xo?3t&@l;~7x%$~>D>z@}9f8;qX-Qax6dZE^RU^?-Y_3M0cihL5`v5y}Y z%N0lAR;2wCJZ>C&ncgncs1Rd(_-X7GSSE@8wyu=&R2)q7x!4Jdk9cR2SIw#$bKSw* z%|~iTwOMpkjP2&*5^NZaNH~6XIX;P590|AULBE9GSI&rP17T9-6fCxHgfpqCW%1ve z*KjE_v3qR;f^3IdX+`qJcyV7}IPwODP%B*(*rw92wckbnEff_*$vE=NBD42{H>^8y wRN>CkEa|eAlG3?6V*60s;OFH9X#S^&c{wYSgjvQ;+k1^Z)~4Z#&;oDtUq0%5_y7O^ literal 1976 zcmaJ=X;c$e6n@E&kknQUOJq~WfF3t8StKE&krD!m7(_%+P&CV+Lrf;jB(kXI^t4)0 zidH~Tv;wwTMUNtADej6}MXR_Aih@NeqEtO-i%U9*fc_A_AMf0E-~I0W-hKDkZ`zxH zS9k`V0zhQsNWcLfU~dCFwM}o#1PtIpyAuJhH$ljJtJQ)ch?x><4TKI8>IoB)p|v1l zp$GxvLNY8`y%Dp*I&2g2K`BTG(ug#cFl;_PF^j~eWktv7vy6I$K@c(? z9+!b;m@FpDs)aL53(ORnp%gfiqqOaCBLdhNVl^rSp^mEX3{4CiMvxdBB$Nf}#bYF} zTp<+8L<-56(Xd1$mLnoLB9;b<#HdJyN)>Py1avjhkb=glBf4tQJEfrOQt9dG!gQ&S zAm<@sg+hUdB#1;3NJj)xnP#gtBhXCwcV|#zl%B*bR-7=yj*MCzVY4a)w9@xiFj;!i zezI2|1!^>(4>g$_4REHVtg+Y!y`M}>#bsJBBo?Cx8>z?WaDNBcf`*Zp)=H3Z1hJsI zi!t*FD?!aCEO1zuqiezN@C4j!AkwK3PL4){Mw%(B)~v@O)k*=KMTp}DR3r_O%fe-H zNsvq|7Keuht7URkSXh``5~`Aj6`|c+HKDheFtfFrYxuwo?v?8p2a|=atj0)uA!djm z2@~wRHj4MIC8*bYU0g%&T4cR)5n2r5c-)U3yW2%iki+a5U3$|q{Fs@Zc#1k0SlKKy?GI9&D@POTq1T{&!4e*hpht-F)0Yg;&UgA*g-hd!)E)Osuz-6+TP**gA$8-Zj#G#P83yUrAoGMXy z@CRt~(*j)W_25g0L2H6|AOy5jnNjYR_~ai2cQ&^s9-&e;gcRg&sn-)o{$$T&!xgwz!W-BSxsJc?M|+IWgsl6^bp zL1Av`)~wY^$)bs}cRtp(1qYf@JaFAkyrS}YK>vKv@u0C^0nOY=(lc92PTz0HZ`c;> z8vO!36PY-xeRL~}q2AZ82`{>{u+dh&xBkK7q}??O`U?FZKkx6eo-f^Wi@&SPr5^p} zm%m?D+g@*fS$Z`RtvGt+a6;b3D->}ox8JA@wWt2d;oep}TYllRyy@oK`&DP7r^b;; z?#i63p)V7{+bj0n^=TI=GN~Un2JGig&5K`Il{DSGN^@ur>FeL{EQ@5$o3^BUR8h&b zTGib(n^Xnl>w?QZ>XY~#xK9CayHVgXqrPsR&a3D=d)P4J!pWNUm2*QPq=SDJdhOCr zgq6IrKZW~VRh8utrSIy>QfkfzCAY1UCi++!UwzBf?VLV2anB=qDp*(J+H=y@J?yO6 z?i;n=%D;BiXgFMX&J*uAV{4pH`{&nVN2+x`vs>hGxig!lkh=p$`l6g7n4=!bo#1zS zhM(NKx#-TT#Pfda!;IFn=jF-GsSLNy3+w8apRFF0ufNo+*Yn+)F4sNCtS*T!+i{Pz zaOTEWk^b*0J33;YY)wJ=#W95~TT*sd{>eNiwS$e^hs`hEEDpy0i!W~T7LHCB;kkY1 z;2V#l;tzl&X}KN0R;}{LSLj+Q=2Tt!Eut*y?ZNc+-}!fSBiDAWP|P}#x^`3Trl+=x z6FB0u6)lTeR=e0i%bX!k*Uv7Sw*Fad-r$g}JX19u@nZ9Zw!63ey&Chv2PHj;LM91q z#hr@!d#}*aIuGuir0O+q&DONki=E!f2Yv@_9^^$GttlS=T3RV@+!h@@Oc$ybR3F)} yMdf))NtPB5_*ZUuw~L~D`z-z=4hi3%I_E^Jwln5Ud3op9{3kHVRZ~YIMP_JwN diff --git a/buildroot/share/dwin/icons-7/072-ICON_StepY.jpg b/buildroot/share/dwin/icons-7/072-ICON_StepY.jpg index 9bb3e6e6beb79f8acf54eccfda0bf8ae7c1cfa34..9348ef0424526e91475322b0f719bc8278ec2a34 100644 GIT binary patch literal 1548 zcmbu3dpOez7{`CxFb;>!##9_8nGjiYa%&z$xfNZ^CDYs~%;kjBT+(66<#BnK<(kn6 z!_*owB;@HRmloz;E~hkVu9?`;dCqg5bN=r8KF|9+@AG-S-|s6L70m!JJDW2$00;yI z^!El3jRRJD*Z1jL$oD1exkViSToOP6NC*fHfZ-qr93<)jPyhe{0sj?LQtF32pbi7T z;61dr{-I*x5D73;5+sELYMKUy3&jCYu{(GR`7eP^`puC%~g40*Na^~P#9y*y3i51 zU_j5c&YQ?1D>W*1?nG3b*WboF!czT_MCNT>C&FQ!UZui}O=f>m-L9#|gN%~yVRXtt z%Bdz1(7mkPsFvTkx^f%!F^R?$|FKSIXe0ieS#~I)N3f-x*iyr%qi#LGJLlFN*Aat_ zs$;Iil`gXM&OP-_WbNj1{mY^5^5>;{`sbW{+ahP>aF1ddr+BP#r@9(!J-!-)_c(Oj zc9dyj^5r1Y9f_(JzvkVjv0k2|9MwF27|47*;keon4r?2*2xy}lY$KdwAKfFm zs1Yph$dG5q^Ijt!F5A_r4Cdff2E2%wcf=<#QmXrkjfFA#?Og?`V`932Fomj#S3s7; z8CYBG+8R>l4|m6AslTPAEzSfMTWO9?Ru5Sc%yVT6knzD@(U1$-$eS#Cj|4Y;JTpM9o?9<9y ro-DeDx~=n%oMzx;r^4-IH6Y>56k6(ty literal 1979 zcmaJ=X;c$e6n@!*S|Ex->ox`~$dXCI5)z3qB%qN-5d|tmX-GyHA(@cHBp?=-x*Mv3 z8_)`BKt((js3>lSY5@d5#?uJ^*qcajiou{2z_3QoQmC+Ggr&sPuvwvnIV?5| z!bE1RLYayfpk!nLsu41u*PLWRs7lC;50fn9$;2`RvM}8O zn8WAuVKx`$aszNifZn1pD9iyGy=Sk36wxbnsMdgD8pz?ONXCo?ArtTP!x7ZlKHE>; z)kj3R{PR?`+HnEhwt7Ph(%1JbCTJJ4J zr(gz5pMq&2iNtYhp^#5Js!?Gk{e*6fTrQAl^ah1SiO8fvCho#QQI&wrjpXqoczkYf z2#3Ro5Qj!`#ZnGi%H#3^LvWW~trSxl)riK>t5x-D#RF;`%z`cYHsD<%nV8_q>=x6t)@CkB+eWQzS`i39T;1jRIN8A1kICl>$ zP@Te`5W(IERscdDh7#r; zu%7}9I&cGSBmx5v83Yo8U_T930ze}4KYu);(VYf$_xf>`MyFC-aViz>kJig4lE{Ri z!zff5!)-VnFh{s^!aY64i4}*ug1>ZP00N0XB~yvL_5=oTC<%w))M81t{tE1 zabgyGvSP}RO*@!$bQ$BvwXQqPQi|E5yxT5U6&LLsJ!PJ4yLNd(Le%-M<(}Eqz8g&s z*UhMTn`tb>VukLzBC2$E^JlhYMnID9J40Pcj3_P4S|%{OZe4wly~97tYqGJdSj4`0nDNQyE?rAb}*_?=%?Tj#{Y-~%^jxf&BJ3hNM?rF})g^?*5UW z$`_qSV&9f_7S+oH6-kfo?Y|)Z_fF$Ko|20#x)&B^t;u<@q9fh<%DCi3<3n$seSG(G zl!*Il&JBKgq%$u6!Q2)a%u3&^+E#p#8+A2)C2!8wGW7M&4}Rk*mZxsEl`b58&?mp> zs6lF-Uc}hDv3|LiZ0n9_CwgpwYu&sU%Zy67$4Z!Rc*Sv(bpMUcLRxF~-dT}}zMKtE zcGsvimn@dmiLx+tcI%scSv2$G@_mI`TXkr7e+?Rj-8gv4E=+CX6N*6lIYCI>9txPLy<`>e8-=^2wHhaH_Lc0U)`wCaLb;JX$Fn8UE&alngpk+}`mh#beWS@7ng5 z(+3TkL{CIX3-dI2+gj&}qPI2|&#$aDhqbJ?gO*y$t7Gp)&LdC6mb|4##rfr~t&h!l z@}JEwt0bx1FAHsZFilo)NY?~6wkCQS_q@Mb^YYFh?9f-Xlck&U>RKwxS`z=(muG~E z*R7x7_m{uf+Ya&;uR0pj7E^G}n)uV}cRuTKC{-g*Wb!J0(5_dW@md>pEd86%J^A^+ zzZ=!2%`7Z6L@o_}V&aMpT(Pps?4W2{`YkrUscF^3F8=f96%zxq9;+VKUz+N#isxMm yni~G9q&zOL!49a;#x`3uN=43g)+)EexaO|$wy}F$>IS>)s?Ms;QHvYxxBmxO^R0gX diff --git a/buildroot/share/dwin/icons-7/073-ICON_StepZ.jpg b/buildroot/share/dwin/icons-7/073-ICON_StepZ.jpg index 78dce2a36933d6f986f21027cdb263d23326ec59..93434107e69da98b270e04d2fe20d1c43b69d9dc 100644 GIT binary patch literal 1550 zcmbu3c|6k%9LIm#Y?LLlDay)_yO>pT!>oL~&-8W&j8T2Gq6(;J*Wm zx36E*4&>Je+i89~fDi&u015&^0AK_Nf&lS5fc-zp0soWGF2UW~21XPBgCQVbXMain z3W0$Ig+RMdfEW_9ll{@@e^EdX1{K;i@z-96+LE_Q_)8 zH25O`e20&KAOHhk>R?7A%>h!$**e&Vt8~0Mmy1hwp3YNxU{gLip9cy{;I`-amWEmk z>V|0g=YX6f9`KeM;){ZClPT<`Shr5pg8qx8<5kR8-zl%GXHQjNNwry~h5qP}<6d?Y z7t``5#4qrB&-I290&pgjQoL7w~pVc|rX?x}4QEK#KI}%M^cJvNxG*q_< z%zUotc0StkHjhfilXR91PS!x#fiG+rM>uK-6y2=Sr$jq%`dkx1<C~(ig3nk zmPCV_nQB5++xds-FL^^q6AU{+qMVS5r1jvIVe&-E9BIt2joPhD^r|K&T}t|d2ryWR zN-0k|Qq{6qn6NSCS#D_Tm$J&pf08EWLR)Hy!4({P#8rZhD?6avXK$oD70?z+X1SJb zR9K~}J4+vpEnbs+U^oiTTg}nq2Qx_y zH|K=A>^Cg0)gIHSqK-GKW;sbIiz!@Z62rvr1-^~Z?Uj`B^$s%D6R}LYb2nI$+;G%I z>2D9tZZ2e~k!M?1oWG9E)=4A1Hme?Si(5<0>XpT;^l_v~>M1S5FYonx?rwSPX-1pZM@&1P8CIy3 zO0?5Xa|{f~xWD?Q->WW6-@2d!T9(7vinvf|@3~xW(`9M;lr#|_`HbF}`IgQ0sRtLK z)+1vtBxY({Wq6dj2Jirfvb~M^5=HfkD75~EwPdHMXy*Q;@e@VG2QUrs0R^fBo_kAN5=Ub~-i;m)#@1B#JFz@iQ5|x0r;*!mk zbChFLiZexh<~-B%!C#B-XfQ5LK8)wx&Q1@vBj?&v0t)8e`}A-0D?F-N6#}0zd4qAJ zS8nJJWtWFD3rhF^ect_Bn@?NULVPeYn3{7*K6t8+`p@X;mG&Uf*1q4pT8ptpjFn^7v9GDi8#sB9?tcFw?sSjfi9o**jXJAo-=%CqZNLX4T(D(bl)3F6uwb?Yi+ zrIV|Kq-&d0A8gMbDJzFenOexf_I|y@)78!P#qq6C^5|oVn*%Kz*h3j5sBdNiug0|+ zi!?ycb*FS>t-JlDn+dw^Vpd79H!4Hyx3Rh%{FZE8%tXn3dB4M2+*-hjRS%!=c4e`JbIiYbz~ijjy=#)g;Q%7S2&@_V#+Hsv$Ovv5j=3Ll zK4^SqfjYB6Uk-J*P%ye&QSem6h%;nNUSL5Z<%=xiWa5HEmNX_=-Yb$6)v+gwT)7|` s(wH1JP&ZmT%fjEn$Dmur($R~f9lI>-Ml<<978<6vzfF*biRQEa118FhHUIzs literal 1984 zcmaJ=X;c$e6n@ztfC~{Ys0d>~R5Z&ZK%7Wwk%&eNAfS|`+K>#AU@~Je2oV*i3j(4? zC>A|p6^pHHU2rKBHxS`ySv=x`0xne4qooLP(5lsRf`I%GzaQ`1ci;WKd*6NcnQxoh zf%E(nO*{Z{xffu9k1%%vmMlq?XaW>KC*9EinA>Um1cJaNe7@euQ>w8zl&8XU{1he5 zhj{`%@SB^0D^-ao0mY#!HF_!M`I!qGNTZf=B7GDB1s;GVXcn$Dpy6wSBUEb>Rfw81 z_Y24`MUtY!bts{PQgo~IMoEg4(=RR|ZHt@Ff%-#;L@CGLk`?+&5efxh1{Ct)`EpgT zw-6E|JlI!&2)$=PLIEu13&ea_#1+62fv-e_Km*{A*$nDHF`CcY@E^0Q79yGy^&DrRj6Dh<&Y{ojYcgI2xkZS z_T-M$hC}v4kt6qP=jU- zstz<@I;j8J63vLUhyq8{8{n!(u0=2+mroYMw><8!#~yT%6J#-mMwi?S4L_Kz#M{wPDV3mG=?>U z&KPzw6!Lk)TnSiA;0PRP6c(VeC^Qzud$4d=pwbwWaSn7VYnG!E6L7|}=eavif&G=G9zHe`Sb#zUOuE&OJcUIa2d2O@2Rg&b zpEJ*CiBjk|p1nFh!^7I#0!Gm&WK}d4m<#HH?{+TTw!ibn`L41!;;#Z*#*O1qt@yXa zIezPvvx`KMsU9_mDBC-%13uBQwS8Mt%SD-|fNNiMal_qKlgs%pwMd`XV4oNyH`#fX z<4%k)uU=06%XjxG8dH}^JhOApZ!E=Jn==TPN!F#6SrgmRY4wbR(WA7D)wf^Phc5fU z;C9rm=uLZU`L@IPzxNn_oiXvS)M-s|ICMNnn|Z@#hA7x++WKy9JjUy;o}9VH)V*o% zO>UGUy#>k3?rnM$`Rrg*=8{E8@fWV2i_D9>Zp12c$IjecSJRPW(}wh9Hq_2(Z+`c% z>~ipu2m?PiJEz7Wx8Rzw^S83vGxcL!T^@Q~;m-d~T~K_?PJ2MS^m=dWjyt0>MxUC# zx#rxlhM5cRX8Ta=U#lK@Xaksz6<+kTJdwg88y^p;C!UuLBq`6no| zqju`!#pTOObD{LNE?M;^)7BWdpC* zyrj8;F>~6vJ*|nmlH-EdQm;zg72D_nSy^9$U2xOkQxg+pVa0uN-_s$tmfD2>nPVHM z2njAk5Wh+Ey!$raF!4Ddnw6)|KIHM7AKcovk~p4(H2zF~&+gR*KWlrhum;@aZMB*>*s0=Ona{M`)_$#+Q}^! z3efjedG~7YozdB)@78Oy&GILI=R7|mJ*)q*u#U~mdw0%Gtu4OLTDIYBhT^4rM04Lb z!yoHz73{6s+m&>68WUcf)t=hEgKh?oR!r&o{_9`D3wx^b+*T~&v{q>XpYLnvyx->T z+#~1g2$>YtIAh-9UNcxQC)V|eb~0uAklM?9$y`UG(1N)vG&2 zyU+Ita10)2H^Hgq=^l?MvEfG}L@j1u)#Y|`JI`H-9rns}j9FIlV$rO*UT#~)yG_I2 MtafeM_>=k0|4X^ClK=n! diff --git a/buildroot/share/dwin/icons-7/074-ICON_StepE.jpg b/buildroot/share/dwin/icons-7/074-ICON_StepE.jpg index 58eaff565032860f0ba11c2cccaa8f965aa5298a..9102da951d123474e724030efa617a28f0750981 100644 GIT binary patch literal 1545 zcmbu3dpOez7{`CxZ06Ewo69&Z<(hI?<~DO#EXyq=hvbr25jn)9%{3`W!sF7q%_S)@ z*N_#5BE)ft36ti|8A)U!&d%!m)Bkf{TiY3k?+n0EP&$@BM#Q z1PXzPg5e-BX#gdq@}2$h(@!WM3WLIhhNkcU1OSPE!NT!F5D^d<3KK=5WB@5?RarF^ zb*z8`ND8CDNC*-j05eTJUyT)rZ7plPr2!E=Ij?zTvKIG`G7Z}`7nZaanc?r}*P|wy zbL~aK_zcP3BNorGs-^oakqJikvb{-+cIpSsNI6;_hIO40F!)F>k^-+eoLEi@=3z?D z*3u`9J`B* z(ZJ)8?!?g#XxC!+&Y%Mibk0}I*fv=6O=#OOaSah0k*o`}l}1uGbeTI%b!jKw%s1EZ zV?Sq4Nz=bjf(BTbG-@?;Bt&fm{jkxsa2EHcJjKz)rC~I#VfQ=mw9Z48r67 zvXL5JH{E6Xth0-e?tot5wA-|G+mg09_u*DpE*8h`8&8T*%-XdFH;G*c_Na5Q?qbXE zMaw8#d4YC>MKU&2dG78_a!nIt0j-})BF+`C56nGn=NqqG8cyv|tdg8%M(4J6lL9bLtCgP*RdQ=6J6tcHNV_0CmY`AD^O+HOZRh?QfgJIi3B7L6Pl5FJre#NRcP%w}88W1B(WT zH^KT`9&)e!N!uguG~;#%09DRyJeO&Bu{5QwXCI1IxMEb4ED7_`I9Ql-ScZ_(?*KRC z8yp%-pdPau@o_f|@+I`U;L}r-p9WQwv6Wtw;RznpuP(_fXV;QMz1& zbQ6D@nY;ecWJ9Sh4Hu$6;HchX&Ovgbum45;4UFc%CD++W1iv7RakiuVL5X>1-}Hu^ z4fLmF$G&9~JjoA6Jk(6dS|07dtW@W#)Jx&SsXA@ky#zVRX436FUNX{omZ{DN0njm< zm0N_X(4Y1)aJKN;Ays^ORH4?x)?u#Nw|_Fd+o2~vC{s1V?a8^&1&swMq`_weN*X!b z@b6o%B&$EeDB=yu?9dY4!_U8JrHR5nUWlnp3zGFltfG2- z&UsP^FB9kPS@YXEy!r`=#izynAvSD>=2O6pP6V=00GJX&$P)Xe;>))kr|TzL2F8>I z)8gA?i`_i&GK|Z&ozT-v;(dA& n$O;&$tW~YqGNZlJGUKw6Q5l6ST>-EkFByS}7yVZyMlkXp9Rh>n literal 1979 zcmaJ=X;4#F6u#L=5U>Uk!KM0mpdvyx5J)s&ARsA?vRT=R4aq|iNnT8XB#785)e6;4 zQK7aXR%fsUWyT6ql~Jf|LBt}W0)ohnf-A+MfSSHUwjbj6Al07N2JKmk)QJ_b}_igb$s-~bVG#{gjLBrub7IyH~URB0I!8Jd7Fq^Odqm#CR+ z28#(+`{~sZ=@vu>B_NySDn9(IyaI;gGCsUqk+v>UnzlvCmBD_# z&}uzTuT(1$odnV=lT})to)4Ro^Dx`wX2Os;M7M)j_G((7Sp4BorP9;@b6Tw~9GTMl-o)BSgBoFmBU&^?BSo-qClguC3(z1E9jb{$ z(d3CPh9;ppRGWmVp@0BW*L)zCjdGO?P1P7uaJKHue7jpjZ-TnYB)Lk|`FXIRIelNCZ52 z`~*)Rl5FiP$T%vE4&b@=6ekBuw!fo5a@Kj}JSxBua27-okuV;OqvCA|z>!TPSqNY| zI>(YNUC$Wxy;ErBFAZuM@ThZ=*F52JNT?`Ek~X5uG*~iEj*ezzo8-Czouj% z>5s_l%RMm}?d46;Hx$*vn_*?gpPpG;))7A2W_NRkaR1XaxIX*~i`vn~tIeSoV#nA$ zdDVf}UbPpM2sV7;_c4Q>nDdKDk+CB_%sI!~Lt&A7SP^kN@>hmq7PI9~ssziche&UBBQ9&-6QdvcB(9wA-m;HlFui?y^iM7Q}xx^l#~L3h0!* zyehtauD~@u*}2@;vHnJB7(M%BPHok|pz_D0h^Pn~f9Z2|YMQ*n^-4Z17vxjB*R>yl zD6?1rJy)LO7awcVUOy?w1csyE%&*USunK&+xMTTmOS|tG_*T$pSpnR6?eFjh^q{iy z_k%ap2$C1|I~YM@#^pBGw&Jk*@{Er5!Xrg3y}h&ro;&|JOw$_PR_wKYJ5c+2_mX0I zKU_waj=t{CYL}07XSL5y(>LU#zz&c%|^EuJ=JM*qP>&^0=$)_uVHE+&;rxdgr@BR-f CEV7;e diff --git a/buildroot/share/dwin/icons-7/075-ICON_Setspeed.jpg b/buildroot/share/dwin/icons-7/075-ICON_Setspeed.jpg index 94b808f716a24c444918d3919e909e90ee413fb7..a0d15689470ae251ad6f68d817d527f36d0e9547 100644 GIT binary patch literal 1598 zcmbu5dpOez7{`Cxu(=e=rc|q3Gn0cws58Yuxm3z+T+QI%NfbKw#h} z@c^Pxz(TzJnEna*u>`SO)B?a^00KZjKyUyI2SMNZ74NhxU=F*>Lq zMgSND0Ym@A5|Utu6bK62p@@L11JXz(RW*I_;Z6|n{|G=r3MwfE>f$1C0$AJt`rZMS z06`?B6yZAn1Qe;NV&EX+0&-$A7!H90X23Ld+Yrhjfrs4uJh58SKT0zixJoL*nwm!B zhPJrwkxHhn7}2dYPN(z;im#x#YP)4x5^virW6EKFP0Hg_$FckxtbRgf#5v)PwfDQC zF%5#T;G3avR%C}W3QwGH9NAZ+R1>ah0GgaVU)$AW^jYg!;^pwiIOg4)8S2odF zimv(n-{_|+nPCCO9NDKlG~U(OvREma(SgZRglLziT`<;6Y}8GWEsAw&jDLq2bgMu1 zK0UUc(URSLZY(WDnV8zwByT^BJ&2vHPHx*v?_vIq%1@rT6B*^uACfw*)w|t%cya2w z(_w8I*@kVM*A!yrTdGTUz!G-S0tPcUM;0H{Tw{%{ZpIZq51%QcsK+m&_Zx1{GhGY} zi`ZcD$0;%GrZEc|8Hfo}Uh|*%PJaFR*_npgB-cfsz=_;}^OuG`67}lyD;V{yN;EE` z-J0;p(ZbJf>R|gumh=fZ$F*iPYcc`d@ZgA(twhHW?f!V9lrH_CutK(Tl(SCh%+9Lc zT>P@TMzDCw$*dVRY8E@6QZyc2j zZ6Z_sBWEj?LQN7j2`|$LtLsv!18*in9t+Vvy{IJIYuQ(ahi|Z`pEQv7y&Fw=&sMF# z=!~E#xpWzo{rpBA=JC3$NqNsk-Pe#FSiGj~#U+ln*SR^8FAc79!~CYEf9PG$PRi~U z^}4XH?O%kgeYy-B1j|=pG%@0eW7K(GC?STtHf&sSmNgPkT`gsN5?67T%j~@|KLf3E z!mqpQYQf5*rzjKrM?_-O&;)0IjT-Z;4RfiBBA)1$;LOjlxZc;8q%#?2+T;}heqdy5 z_}b4e#ynosj&SBT1;Vve!PfJb4H57H=O35*-oJ=8U%7Ho)ctx z|G-(Vf{0xNgR#Dqcs2USyW^$)INN4K`mLPzbjz<+^1jrik1i(8%^S6pG81TM?-s$& zT>$TAUYrch)2RvGWumpV`_!o0bbegXg8XGA_H)T^1#MS+-L9Ra+HzCJ17fErRUsGA zG{t6$*BP_ZA(OE%>Jr&Az-*#>igZjfHa!EyHYO+zx-61yw*psK9St?LmaM9)6{-)o z>Z&$cDP;{Go*j$S&(CgxKFs>{kn6x9TDV7Q1=c_tYXH@3&dJG?rrCZ=P=&*G(U{|m z1$#a2w2J1TPK2V{0t$lVxj7&=FhNLS=Hc={c{4T~H(lbmJ~!g@B&(=%uSNFrHpcw4 za`H?=VZGd7+2TFnAUYChZ!SQr41swsNXWX<79A1rv`YHG9}ENMQLFB`?R@8{eanUI zxQ_5S4ymxMwVFhT!C%M_OqsDM>ld!_U*){DSGt~TKYr9W(H@^4Ow;+0Qkxg1D%99| z6M3JX8l6UbnKb06azO?5At)#?1xWMR s2S}J7@GiaQVq%$TlZiJ(%P4s^>mdf=lgDGa`;tTeC+E8g3Pha00isX0`v3p{ literal 1748 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 H);s?LiaLdi diff --git a/buildroot/share/dwin/icons-7/078-ICON_BLTouch.jpg b/buildroot/share/dwin/icons-7/078-ICON_BLTouch.jpg index b3234d45aa12f9c909b935e13022bdeec8569220..fa4b87b8a9b4cf95a93421f1451c8ad93eba1aff 100644 GIT binary patch delta 3010 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 fEINqG48|C}t(26cZxXhRL|Z_*Tj-5xHeEHWQM? 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 TZP`e41oP;yvB;_$1AY82(N24` delta 1354 zcmY+Ae>~H99LGQ3eK-1H_-p6`F&uh;wW{_%L{Tjm+NX-Bkb zU>1}vI0!&!r~_CBKB1il2uIEnW&jAFb+$PGS~cukq=GD!LKZ|(UKT-=B0LlTQLe{A z`yrjUgUVM>e4S-U2faD`BRrWvk}60M`~7D{b9Q`8)4kJ05)nT&K_~pvB?&wsKb684 zC$XtAs=uFh5f}y}r6lq}(p}wBNIM2j0tAc28e(yVhBynv2(hpx;&4Q3D)A#!8p(=G zwj$AJbO(k5ou**1e0*4}fX{(&2tqI=n3%evp3PV(YLLeA{v|XSGKoA6A=+o1H0u4hbjNV6ASNa5m zf&m(13?LWO$?5!9C zKxhDC^z{Fq2LZ$e#SFkjB}l1oma;juzr=!EB79T?EmPS`j zEGi&_8)ByK;rs?WJ<9Cv3!=9N@R9+e@QOkH9zbEVRe!4i)C$@Ksy*-#dxnUoJc z%ZxMXo4MCunGqQJ*gpPc@}YrdsoXK?Tz;qh{o-yHZfr{LYUIM<@~>ga?fH<##@t4= zD%qx~OmnZU(5FxyBKJD;Aum>x|M>J(MS1Cy$2S;r8{10W_p$xy+`Wq1!*+t5fMMRW zT@=0zml5yV*AVFWr}xOT(^si>he-YVWsL)=ve%@X(y8EPXP&rbe23o;BSUJ%&xCnP zzX99Bri>q-OZ!7kpD|I!4{Ahd;S%QPh!&U>Tx6V&*0|&`>jV3|yocQ$XsS~c-(Ik} zCPPob3n!|N3k5ylZK!^3Lc86Je{(&>VbA5{4g+#K6f$&Hzp`$?ObMT76$oahe!r-aAV;629)`#$3@D=QV5L&RCJrqPb5a=VnQ=DzoSPFTvsz z;WrO7eg###T3{DkPg+hZ;X&KxSEC-m6X&6dd2xUt1)oRm*o7@^^YIm(aGC1fCx4d|T7nqV_HnKFq@M zA}XgO)u>a;lF63bu?0~)OBTgGURpfKv&vK#j{EG6?%i~Di#&e1B>Y%5t9H4SW2`>m zY6dM2l diff --git a/buildroot/share/dwin/icons-7/081-ICON_TempTooHigh.jpg b/buildroot/share/dwin/icons-7/081-ICON_TempTooHigh.jpg index 07aae4e5ec3352884ed28b2e9593e373d5e6fdec..61ca9f41d72f90e6fad7de7921c5ce3a96e5105d 100644 GIT binary patch delta 3211 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 literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/093-ICON_Printer_0.jpg b/buildroot/share/dwin/icons-7/093-ICON_Printer_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7175b7194ef5e277355dc11530fb95e0eaf9f8c8 GIT binary patch literal 9153 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 J+8uXu{{xcqxfBwKs78t2}7VY zj4X^S49qOt5P3$RyII);8Q6ss4MoHQIYh-Am5hQy!xD=oPq}pY|1Aa{ph--E%z_N| z3{Pe|W%SAR3*=NP6~Db6Pm{XSw*8%2+ce3vg4OYN!c;OPG}5{6I8E4{V7_*O&FA>& z{|rn^uUbDY%X(86JGGT<+wGZZ%&vA1kImgan{VE;)ROe2!U?>qkKIX74m-f=(Y;XQ zr69Y)_N9yd#%3;0N^Z(jX5D(n$y!4_N?M`v0(0HY>_h8AE#;&$Ph?MZxf*i8=b@Q^ z$wuW30p0=&HomXqM?*w|$Mw0Ie|D4~eapVzu+RJB zZPneEtn22@m%F#4_vzN7>$dJ%w`x_d(7$~yokA*>veKE$W-}GsF>(|X4GnP#{gB6d zS#ELgvu~BJ4S!wf%vyPRb5MxZs?G_U4GkMsF{n&(U=Z?PZu|Uav(S!&@?BcqOHC%7 z^bG1+ZR2z1Jol=veTYxoiAG46&|?Yyp$z#^#vVH=DO0a zPxYVpE7Z?5m;Y9J|5uIa=knF^N50E{&Z>WX#=gbS{%*up|YO`JJVP;kNU0^fsR54nOa@JS=fYu`2a%&Lk08v|2F}4)z}yS literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/201-ICON_Checkbox_T.jpg b/buildroot/share/dwin/icons-7/201-ICON_Checkbox_T.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4eabacad4dc5debaa508f3bbd2e90b653290b3b2 GIT binary patch literal 1279 zcmex=nftib*IMhEKl&GJ+A^2o_d$kP*5-dq5@t zwL#5b1Uj5mkc~k|k=;>Nsw8P!Jc8JeZGFaZ|Lc_ zzV=Ex8+Uy=yUe$7%9Z3FX6w!uo>84%YO&0^=dQPi{i={tiEo$K{XN{n?9nMPpWoj? zRM6Ao@torR=*OpLomtzSHqYbGp^NJe%M|Xk-_g76$GNrxc5K)09NPKZ{P~V^d3Vyg zwo1HSYO&lXy02U|w34V=NBS-lVZiV&-SqzSM&I&^yPFJelcC*Zw_{xTkvj z@+7@yC%^r3Y<&IdPf~;mpGgSiM)3AA584#-H8VT)es4jeOX;Y7eqRS8jOuE-l>6WI1n-)Xc{{$8Ft? znZ`UXxwhP62A^ZUk6YC@wcWxp!k!Yk>mCW-bhNr~llfeO^tV^H4{Z*sl;=J2N&3{H z?9c@>59KIiCb=gpn5O8Me0!UE)J?m;#&Ytfc9{!rT~bq?azFF5jq$w8Whc$%83~Jh z7h?_M_2+%K-qG~b%gJI#7Yle@Wj>~<6|ZJ^ShbkFdw>1K7ji8@Vv>;(dos@6S{tFrt{wA0benf}KEbqdZZ%-0DRQRrPcqUXgYKh-ZoKs{y zE3#hi$%|u?W>;iLM0rn`aqZBqtCiCjzs+UWaSbkxH<-yeMReno?S3Br8MNH2=ZbPH ze3PVn#BJ;H=BL^x4TbI^e%=mz^E#nCyGn6&OF)rHr{M6 z=fs<~qT>6nitoRFW$_ga9+}^kjPkmtm2bZ_?q43Z-%rWlS7l>MujtZ{+Pw>UN-U3- zEjxcOVcuqr8$X}PMr(Q9@LGSg=r>Ol&*aq+riRQiYm(=!mAL(E<Z$cd|Kou9N^WZh!Nc_u|{ z-xov(vHf}d{@V0U>J#kG&F=qg_5QEj+`4tYHvaXW_@BY-{NF0}Pwm40^tOLf`p*#8 zD*XKHmf1$<&ZVr@*4A{HpO|Rp{q)?NV%sB{J>gnA-&fChZuu@WTzhJ0X!te0tEtXUamUxW~a`XBa?v0Q)QB;daYfT#)8g-MyEv$pkhIaf$;%@4TBBi_5U{k DaNFvl literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/202-ICON_Fade.jpg b/buildroot/share/dwin/icons-7/202-ICON_Fade.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d327ae9b9c3fa3b0fe3ceb147e8768f52402acc GIT binary patch literal 1360 zcmex=j1_g;h|9fsI{JSSip@MAXQsuyNAC5C3m5@BkgbB*-ktV9)TxdCL9O zZ-fn(+_sfnzw^-wPuA_n-x%vzu6(7usfi=|fe}aN49-qA!5I?kJ?3k8p{WVSc8 zctz~wscYjbS3X%Ex@I=dvYguLHBTD&#iwaXI<>NBBrsZs@^~7>tId11>TB+|V?s4c z`XpnMPMz$JXt=DYrNXJ0bdH;WL$KlO5e;6g`4dg&@;e<|Ru&%q`p~L37MIh%GDRlc z?>k%UJ}r6k!wS=Vsb0KGJwq>hin#O!Cgfc7eyN$fs^G-ICwf9k+3$1u{I}#f#% zUMb??cqI9e2H%fQyde`jzOA|w>F|y1xaT~DGpc+(q|~{03rUnT==7`II`Z4;g2m}gX2GXYOCzRCeKRRjR{0V`Tc2TjujuKo z4Hb{O%zk7`TwA2%mUCWrw^7veuFV^h1Vcr{tZf3B7U}Qz>JoKd%D`atqU!77^-N(s z8$%e~)zWhr7oNPcd2?N4XPVuONuDpB|EWo=s(YRv@%(moLRL)#uWzVaXxpRcbW3rL z1ve^%|Go}p6h70nieoe1$&+7=!c9ZMex)YgJ3m!k@L_=^&zGGtUr&8dO^sCUJF=SV zv?hzv#@x3ey&D4}gl4lwwg=9)e7bwt^6aC{Z>z#os?Q`%i@IoYp0#+PX26odX%3~5 zNedd@o-kVZ;_=g5>sjfsTX%fwdA#DMesWs0fBUYifA4jUZeMXE>FSajnKrkjC4{)t zI3lcEULQ>9Nc;IU?8FMPL<5URny|X&-2#|`?Af_Fl*DFhZV0c%V{6~%E<6f zV1Zuyx*0X`6OQiBR}v3;AeJ_=xVSlFt*`1XW^EmmqS|!Cd`PQ@g_`bQTpZNWGv%l9m z*f4EPw!-wsec^&84UH!s-ao2#NNK}F$=DF(HvjdGMzwnz&;2d>@@Q(u!;=%eTUCCA zUst_$u4_Wb?^wCz(OaWxD?@jdZMwX(;ggi*BCoe~cDpyMsWF@=JzKKk_NwQTECc$# zv`jxMwMNi#ZT9S^KF6P&)D6k9J=kwSnPdpUC14hO15!LRxskc#imp zCaYA>yZEr?(`oC)y)r#nXH_O?N6jzadoO15>}`wYJ-K|4$))FvOGeBhCQpu~ckis~ sUp2kFh~deb+bUlaAG9i^={YcLX56NbvGI{;S$*))(0T^`*!urB0rDvnfB*mh literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/203-ICON_Mesh.jpg b/buildroot/share/dwin/icons-7/203-ICON_Mesh.jpg new file mode 100644 index 0000000000000000000000000000000000000000..65c94be0dda9f8fbed817841e36571ef6370b6b8 GIT binary patch literal 1373 zcmex=Z{=G5bSK%dUA&GoR;1 za4w(4bjtQf#M_piZ#0{~^}1SzuDUldx?)aRx@_0!X>VsuJSoH68nCZA_tX(?ZLhUD z+m(78F143@V2BV^j*i-%)jNC2fs5L}YiXmh=g~zVE*svI`>{ zmz8~*b<^nTtXHBJT+h9d`&njk>NMxqW85kn+3&c-_N+1zY*yNOqAzJx<$jIx-|h(+ z`m6WNf4gA2;LODNIUiqTCZ_VO{_Iz<(Jj?o%OUl~le07aOuha&bhG?4kNC!lFQWT6 z9!yn#bgS?L)8YE&U+fJNohoF4Pm15NwM(v0;M%r8GUrS6>D-_oPmj>DwVJ6d4lfs` zu>Th5uU;+sZ~Njq`=u7m7S)a6uT0hRkJefkWZEP$&09X_pN2Z?(%$3?fw4Q;(lRUy z5{`V)ymZUEo;OTn+CtSCC*E|+Pp!163Q4*@S>aj(|2l`h8A7QaedD@cS*_|?9zB_t zHM`S1cGe!&IolSLg$T-N?fTBaBa$+yK(y!gRP}XA=65gu&W^eKO;u)pW%9>@h*cXD zb(17RZxo)m+S?*9wL_;aEG+Q((?hnECiew3<;tomvc;D41wAS3z0&w@%Nm|OZm~Rt zri#KRw;#X0HG77O@6>PAF}aidW6N7su&V6sRAu^iqBL+nt65>wkqOP7Wujq46Ghe) zPx7DrtNPA-fqjd#%f-T$)%o;mq^*u|xyIcYo8Z57QdrhQDZPbv4gm_z>= zF4e2PdB1R?wXNT>UvAr)vg!jjWiQ*Y(dSBtyRw(LlI4mO9V@z~*e$PhE&(ab zXNpgKQ_BDH;ap1RvA+#34hV33V|-QL{q5E7wkd_%UoLi(?*CcwW7mI%xQ?%{KVAr% z?w`JTlecw9+aW%M1;;w0IZ8_dnAE;pbnQ^dXgFH5r_0cE&1dbaQgi=AolRSxzK(nQ zjyA4UtGYHG>sowiNd}YB``n{U>(!DN?z_AUYHG3LFkd^#Tj-4E-_5eqtS;PCdBI;> H|NkZcV8$R; literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/204-ICON_Tilt.jpg b/buildroot/share/dwin/icons-7/204-ICON_Tilt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1689e05ea110219e1d73ac1542d9ce0720de4a3 GIT binary patch literal 1215 zcmex=vfSVD0xV_34Q=>l6R!M@xU*#C+k(ub$VZrHkkAc3s>!Z-dS8s8ZfZMjsd6 zZqY8YD>!@Rb?aNdgRgq-woQ|%$xPytovth{R~H)A`lREOVADmx6H{|SRtw#le*dp+ z>t0KtCn-mb6+;bD{n_PJ3_P9)inDx)Guxk$aEj?gweP1V_crdzyBC=GxU0%E-}a2J z?Zup(^H=PAerqb9*;0+HuZ>UJPA~BAbZ9fozwg4~=d+FF?~@#p39E`Gma5&am9;TS z&YR7&m@R01=TsYC2ZPl7F3S_At}PLbxasw8(Hgh@?)0xoHj%T_ew^!RyR0oG>AGDk zEWS;`XUzfw#aXV3dzcoyW_+TCDZV5Sa_0WZB z`Eo3Z%u5%_uYdTskcTh$$_&p3C;C^MncVkN$V|%Ui0328<_*!`+7ebsHY|uxVzX_H zUYOdqle@2b%E6@!MOsTkww8r@TL$<}SbC%JV%n!z|C_(PW-b4z{_ebR+vyXRY*XaT zub1q3_nAFGg>_*Mua_EvAU3NPNAJms0&oBs?`YL`}hF3WzMz_-uQQ_gSdzRGv{zE5ZOt$wkqu2E)f zaABso^hUd#&r5sV7B4f|=xIJr+scHI-4wc(_G7SxTTqRp$A+U9(*-MP0bHkIVSg)ZRZ$GFxn(?0LIM zDtygcRtB5$`mH{jxMu5Wsy~^;>lOc%#cSG@E#XB^F`dD|~;cv?)z@8_vk z8hi}NY01k492306x0xL&1F>JR<7A!lo!7z)*sp#p+HqlPmnJpPH zid_~awkwwifbtUnk^*Z;o>05bN~ Aga7~l literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/205-ICON_Brightness.jpg b/buildroot/share/dwin/icons-7/205-ICON_Brightness.jpg new file mode 100644 index 0000000000000000000000000000000000000000..22eda81168de36697b4b56427cff8fbc4bdc82db GIT binary patch literal 1922 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 XIxAkctTuhC{`&Hkkc^ZF@72EmRGXD_ literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/249-ICON_AxisD.jpg b/buildroot/share/dwin/icons-7/249-ICON_AxisD.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14730dfa425ca214ab9a0690abe3e2888e8a46f5 GIT binary patch literal 4752 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 literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/250-ICON_AxisBR.jpg b/buildroot/share/dwin/icons-7/250-ICON_AxisBR.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89d5ef05ce219c3508b85664cdcf5d6ef5068416 GIT binary patch literal 1500 zcmbu5Sya*q6vqF6xJ4!kn5NAr1+GahHM!a)X1XTv)mJu9)$PplU2n_kk2Z139P`HL7 zpl_h0dC&=AfkdN%F3CgyOpXA4 z7Phvr11>F%1)Z~t8pV!1NL3vW|4@>cFXz9?lkX+a; z4m;35MZNYL)6(gl;Bt#P*WDYhmrLIbT;U{6auP>o?ME8DS1~GF&?A4WlZ4%mwvl?x zk!65TgjQTED#RnO_a6{~@$U&bVtiPRF}0;%`i#EvMM?8@)I9M)__xJEk<8qtSXQV@HamA+3wArrDD6a_E`TCN6RkX>O9Jls;>c0tql=xU zJ&=-JD&F26K~X<)NT{WzRz#Qe(?zLk#DK^A*8Z&`rLW4gA8Se%1BbqW$c zQ|xC#hbAvMTzrGzUTxev%)zS<%YbX${x4#Z&Sw=N2U+6F6LgOoy$S;ozHh$)h! zABE##QM0u&K(mIdSGIh|Jn-CANYEY+wDZYRc|Wb_zCvpv;XXXW>5n6}Ph>zhN-(D= z9=1R4wm_mU7#t?lVYbKiBt7Wx1`_Xf}5&@A`4o zywDHvjdZA`GwxTeLSfZ@Lp@@;NBxemNe3oxZ5EYk8}IzuSM(UzsEo_fwD#`E)ysRN z?;5yzBeal@5OWq;f6!l;+e@L6s8O>_QCPIy^D-eJ6P90%2s5_U^C!JsZ*)ViO=FCy zE;Z2<7Wpij)U!EL+Q8TMR4gFjD|%}8%=;8{rJEV{)+RQ2;tDOp$MLOV{+Y~7>ucbl zeWSA+leONc-cDP!W7)^Gi;f3q<&x^0TFT!f)29$BieK^^GIFL-P!!;vdcm#I+N1#0 z#_z26S~`SmQ@_H*AeJ;kuw1tzOfk3Lz?3sbRLyd-rvlqYL)xFMIOd@%E%s7j^va6UKFA=6m+}@|1|;!Lw$ru)ZU2-6KP%VR zAn;EVc=hgBNum3m+PQg42^-nBUzb23w4=a=fEbB$AvJV}o=rhSV1y(GNOY~*Kmg+b~E)vWJOE6EHljq`GTT;<_bGwij$Os6;!4D|Up|sNr+HMa%$Z24sW(0v%&>Z2$lO literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/251-ICON_AxisTR.jpg b/buildroot/share/dwin/icons-7/251-ICON_AxisTR.jpg new file mode 100644 index 0000000000000000000000000000000000000000..716b9f7314c48e312c782f47db744144014680c9 GIT binary patch literal 1454 zcmbu6dpOez7{`CR*d|(r4Y`#|#W*s}Q#pn?iKOICE!kGdrQ~eu;2ew|E4QX|atTLH zJLR&lTq>Q)Q`?eDg=TD#%c8app@kMZ>*@S)&fk6CzuxEjem~zoUiFZA4A9%-X6_8gFN2>_3vyf6pQ9rgqJY zg&Me}Vp+ajc_{d0)x-Kd#uYondn{g6>QZ^UF6=tDH;X=fJod*`qWdGMVyKa{jP&^Q zIS;Lv$4}0K9ZO=dg?sAj7W}DL)#mD*A4Y2Q4}|w|yk16~Vi=Km+&aeF z$aj>o{CA&wc{)&2U_-gp&xKtR_mraIn6Q(V>d_dEoV3Hr_beCIopO;@91eFVnltI} z!!_U=HX7I~6--B!6?sgTV%*(xfoy9+cJD_VBVG z{mS^RlQoiBdTiVChTaf5R(}$0(mY5C9PO8QI$pvH+}V7wBs3z|PBdNUd2JmE<#)j# z6u*Z+jLC{ZZOP@NM`R&oPtMOnm$E#e8KhKg{qxU>$peA=n)G3t`9eF6r`b_#n07ip7<%< zJy)p)P7hR04m1^87%iTxO_!P<9dJ{H%x1UO%r(0{9a0DuEV|@XI!_%23tHND{C2m9 z8TRsp;$xd`4lLYiIC|^#4VP>ax5Y2bA9H)K;y6R#*Jj^ItrQP*k2{wP$CUcF$S0B` z(Zk1w6~zwn8kwHGYhv&ouKz4CRFRNnLMoEGn%;9fcH$Z>PV#69x4rA!zM#tb6o*7R z+oWDmkWl4ZNVyIr{PpTktnCxV`x4*9l7^MOlx?$^$A9DQ{~p~RCq{p$t^3e=;z?If=*kxwNX`I9i%i5Ekv>x@>@cP;dXJx0{*X&O@l*yc0^8LQ=cwy2Lv*g{yILg8lDGj+- z(1N4C3%+bZY8~S9_7+^Q?M*l|A>i#bttU^zc2%Wyu9|DH4+eJf;>ofSK`!+SM${c3 zz&R|;AEd9^&@G~6w6I~-V%*H_aM)0%#d@^Da+vFMM>ifVe8R1ekA^QVBD_`vRHa=)Mv zk#b_9^~R6X&6ORDGp87w8!p;j^vI$n)0nEVa>_Douotp1z~fq#b)(#`QriPFa-v;5 F{107&UJL*L literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/252-ICON_AxisBL.jpg b/buildroot/share/dwin/icons-7/252-ICON_AxisBL.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c94915dd25392fa7e8a75106fc9a551e568ae8dd GIT binary patch literal 1550 zcmbu3X*`q*6vp3Km?31Wlbf;($<81VN{orJC6ySwGuMzUlqgw3cB8qBC|eq28#A&D z)s?J8SC&EJx*;V)er}dbi#v6{^u7Q2a?bBL=XuWd#P(}I(jIpV2S6ZDKu=J>HWxT5 zn0}4#Ccow&xZdsnP)I-qkbyx^02Bp*p&;8`fc%f=fS(XSiXsGpsw4n~!XN+?2EhJT z;X*KB2o!-7K}pFd0|thIB?W;lSojGzLKq2w!UUSSAVmNK{@vvVf(9;x5|)w%5HiXt zsMx`xE}UzO)R+vhIK>STV!DMiRnbj4Fu8KIrx^h=1SHK#bAbro z_a!$(w0ZrV=4*|)k9>mI^^bL%6%pU!$o84eZU=;Wy&vQKjXR2igwhiI`SpWkNnny2 zGo2G@aZ!+YU6F3|E%9b-?&DflI(+%;38u$I&8d^C`{ch?!y8Q!dcjY`D zR&Z8~5v{x0RAG;YdUGvL41_e^;=YwzRZV#^-)I!fCDz@4P!IZsw1fFnYEH}rEoq0~ zW?FTCv;?c06-ybm)lf-?za&czr72;L8U@T~V})-=*-KWbjhs!vM6Xe$>~4Gc-MEGs z_5_ayQ~qr-a60KxlHLcR@lmq49dhfjI>L}@jD+Zc5tkv7-RHEmB}5{p25J0APEOY$ zZ$DUAPU+6@zkhwmGCs%}=1)oN!MR6ZDMh3o>k`OMHWk!Ox$oO<$*#62e;FRHzz`nIV@^X*M=#kcJJ%_=4;= zJ&{G9tZ~aFdlmC%yjE!K`|RfK@e$Nb!ohcr?1{EhoBiXMr(1e=Cu`|>tj}E2*Wp9yZNj5(i#$w2c_wOHAxt4LV?K2 zrA~_?gHN?F0egn349&TgvgG&+OXOWm1?@DZJvxNt%5gtOaPArF=}@9ajT++5?-2DM zV&-@{i-#=ReH+}o?>3MAV^-r)y*ze?XL6o<^5#S!4PGhnQfpK&m1K3s$Cp<4q&QkcPTDN`wCt%Y=SJxJVPO*_ zd+>1CANs!A0D@UEq3Gx{K)Pp795z^q%l|7p=GM6BJa+Vv+SS7Ros1;5vEQBB#&CJ9 z)>3;mg}e}uXmW|cZ|uI;$BIl4EoKtD&0RE_%re~r2@G3TA<&UZ%$RKjJj1~z@kHk; z@~Ytw{K&zI=Q`6<8~#_8LR4;aA@#b{&w1jv(1*!7q)6U0>5?Q9KvGxZkKMUh^0jxI z6Z?3L61qjP`g?XHt~S<#%=3!V>-8jl4Xn5Pw(*&(UgrxUC#*n{DohOpvubqN#IE5y qrUrN}ShMvUeB*=u)+_n=_z0+3YIY0Mg`LV@HZMp`EhxIOJ^3GJ3wq}O literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/253-ICON_AxisTL.jpg b/buildroot/share/dwin/icons-7/253-ICON_AxisTL.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7fb5de6e9c6e6704a58669a6c4f609f31b8e3d36 GIT binary patch literal 1536 zcmbtOdo`egXg74Sx zJ>=IC1n#{y00{?B0165s0SFR=BEh{*K>Gi2z)ui^i--yc6$AhZg8&4C3jZL5AW&hL z2na`tiYX`p5-2I6K!yXq%fO%fFc2yv0tX-h@~EIl08j`5{s@6UK_OuzOhOV6QP4yw zDk*FIPW0Xz2gIR*DkKyMm;%_Q4NEZCNslmH+7$mjA!5RbL#y#ss5I}hi=(NE;G;}+ z2WI(e^}V7of2X5cPY`5fHFe*;u9Jmv4A23gUFIb1mxWAbf81{mY&9+@L(GEiTrp|A zmh3Dc-+^ExXXP(`fE_VHZ=1ta;*q68><&>TCfH(2`M$D+oqaF?(V?@QxKf)cCaWHxV$0UsEn}ydI+nOnX-um7eDU?b{rzl*F5vWOe3C5jZgieR9+svSLY>Z@;+B_IUe5B0lj)(VRy|`byC-~T zue?e~@j`dD(Y?$S$@&V1(NG~w^O`za9D`M1NcUj-{Vhhk6}@~7vyN^TcH)qBsik<7+;|86`>S60L?; zfg7Ly84FL$rB2w^lZy}J?sFk@8P>DEJa)_IcJ^b=jTRQYz^+~Y?8C8ut2MRBt*9{@ zB^cf+JLzhud)L-KZI0(Ga@-sJhg?c>@-+y04i(Ast@h;4Q{#w=W;NF2X> z$|~Go)VVBb_bUBqevw|`tJP|mrDNeNDbDO#G)XgTa7O*!Ky0rYySdbpE?=E1X-45@ zPgbXeOTQ1;9@w~ysf`VLPM1xbb-9#JGRmCOH;%wdajMco9UN=Oj~?c-Y@T}dQGC7> zJm5S;JBp?TIS=n7^q9Bsi`cIpk-s|NDNWMO#U`{DOJSMILhJ} zyT<8Bep{Z{A(-sOtPgyfij7%dQ5N*Yc{f)FJ43=&A)2@)kD;~?k)|i0NL)T6d8%w! bD?OlM_uD#d*v*J*Va2uLTEq>W+Z+22i2ig9 literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/254-ICON_AxisC.jpg b/buildroot/share/dwin/icons-7/254-ICON_AxisC.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3dd02c52b0eaf7b8505d2e57bd1c703a586e8506 GIT binary patch literal 1483 zcmbu4e>l?#9LK-=ZG6c#Y_d{P6fq;0$};5q%*{0}?VG{{i3pv%3a(VKj z`B6I|+9JcEAIkjdC(^aKr*wPH8trz^bAR0Z-TU*`=XrnLug~YB8`r%COauJ_`~V09 z3OMTv&`kk8`tIBG59Hej`m|00Us@?kX?Ry(-6R0&uYh7;7+^P0IKD+%BE%aJ=^dPCqY}@(gGssh zW`%~7FQO2vAz|^XAGPbqMy`8Uh{17o<&0y5hJ(Z4wD>0fAFC@ZYTDMe7jOGPe2Ypd zZ~g2C{)PyY8{V{QiW|| zTJx3PL0k>5&9Ttt7Bs&|6MuoZak}R~$ZabQ8nKuE-tE5gwJ-hqpIr`~5KVF#B>neG zw@3z%^jPohCSfxnR!Z)#xtQYU}LO0}X$2Tcv7Qq{?V^ zt0W~kWz0Bf`9oKHQPruohM*nhcQm%|P@R;w0dUH5THwlCXa6h9Di`(gbbaP!>`&^S z!&ZCJMj1(*3FypJD-|MHYbk#`)<_3DQDuQSjFN?n!5ljmQD*)-P3tI4 zOjnWaTOl{A944aGD(>0`e5010^ql?23F@y`6wGuT(Aq0jhpA7rbFySqXN5^Yf^kmp z*yLifU9x!ad7b;N=Ubw5fCsJoV%?K>vkhNfy2hwHbMT@`Zik^Zw2S`~!p{9Z&xD&o zdOW=tD2wjsQlL_4*#*r^7VB_R_onm$0+Zhw8ZA9@P0kQ?>OTUVWG$TKhCDhKZRqQpzdogWMm97Q6lKM*2E`3jF6z=(ySQ$*{iu{5(BA!P zR^=mhw&8pFDPb%tCYCkm!oShqJFB`-EvfB0DdaK|QJ`0hnB5yd)Hu4W*KXt^`5+0oCM;(C| zQJhp?FYOS*?9o^-j>tP9@GTRtiJh5n|MU0mu$7-TDAv3h+3t|Iq7`RECKM+o1f@38 zaZ-Y~ZRXV2aLJy5GWQQ}=1s-BJ}&if0@wu}OP@Y9^JX4a&HKIbsP9VMv<;ZNd9vnl zcnP{R*_c*w`jCV0iL`93>m=DDjVT()NLwKEdkAqcHKXE%un_DyNJEeXDIEP5PFAL_ aBd1B%RplglPAIiPJ80-&J2;)AoA?_Q9Z{PA literal 0 HcmV?d00001 From ef5fb390ec39b91a722f06ac138721991c7cdfbf Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 2 Apr 2024 00:20:47 +0000 Subject: [PATCH 038/111] [cron] Bump distribution date (2024-04-02) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index f96b65b83440..b89148643814 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 "2024-04-01" +//#define STRING_DISTRIBUTION_DATE "2024-04-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 c3d13262e476..8f933f1023df 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 "2024-04-01" + #define STRING_DISTRIBUTION_DATE "2024-04-02" #endif /** From 60f2837a9804f71fa731ee2b9e7fe9cb468fc023 Mon Sep 17 00:00:00 2001 From: Sophist <3001893+Sophist-UK@users.noreply.github.com> Date: Tue, 2 Apr 2024 03:30:04 +0100 Subject: [PATCH 039/111] =?UTF-8?q?=F0=9F=94=A7=20Minor=20INPUT=5FSHAPING?= =?UTF-8?q?=20config=20fixes=20(#26882)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 10 +++++----- Marlin/src/module/stepper.h | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 13c59b0a441e..434aa83e5699 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1204,14 +1204,14 @@ //#define INPUT_SHAPING_Y #if ANY(INPUT_SHAPING_X, INPUT_SHAPING_Y) #if ENABLED(INPUT_SHAPING_X) - #define SHAPING_FREQ_X 40 // (Hz) The default dominant resonant frequency on the X axis. - #define SHAPING_ZETA_X 0.15f // Damping ratio of the X axis (range: 0.0 = no damping to 1.0 = critical damping). + #define SHAPING_FREQ_X 40.0 // (Hz) The default dominant resonant frequency on the X axis. + #define SHAPING_ZETA_X 0.15 // Damping ratio of the X axis (range: 0.0 = no damping to 1.0 = critical damping). #endif #if ENABLED(INPUT_SHAPING_Y) - #define SHAPING_FREQ_Y 40 // (Hz) The default dominant resonant frequency on the Y axis. - #define SHAPING_ZETA_Y 0.15f // Damping ratio of the Y axis (range: 0.0 = no damping to 1.0 = critical damping). + #define SHAPING_FREQ_Y 40.0 // (Hz) The default dominant resonant frequency on the Y axis. + #define SHAPING_ZETA_Y 0.15 // Damping ratio of the Y axis (range: 0.0 = no damping to 1.0 = critical damping). #endif - //#define SHAPING_MIN_FREQ 20 // By default the minimum of the shaping frequencies. Override to affect SRAM usage. + //#define SHAPING_MIN_FREQ 20.0 // (Hz) By default the minimum of the shaping frequencies. Override to affect SRAM usage. //#define SHAPING_MAX_STEPRATE 10000 // By default the maximum total step rate of the shaped axes. Override to affect SRAM usage. //#define SHAPING_MENU // Add a menu to the LCD to set shaping parameters. #endif diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 6712198aaeb2..84f85391d2bf 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -159,10 +159,10 @@ constexpr ena_mask_t enable_overlap[] = { #endif #ifndef SHAPING_MIN_FREQ - #define SHAPING_MIN_FREQ _MIN(0x7FFFFFFFL OPTARG(INPUT_SHAPING_X, SHAPING_FREQ_X) OPTARG(INPUT_SHAPING_Y, SHAPING_FREQ_Y)) + #define SHAPING_MIN_FREQ _MIN(__FLT_MAX__ OPTARG(INPUT_SHAPING_X, SHAPING_FREQ_X) OPTARG(INPUT_SHAPING_Y, SHAPING_FREQ_Y)) #endif - constexpr uint16_t shaping_min_freq = SHAPING_MIN_FREQ, - shaping_echoes = max_step_rate / shaping_min_freq / 2 + 3; + constexpr float shaping_min_freq = SHAPING_MIN_FREQ; + constexpr uint16_t shaping_echoes = FLOOR(max_step_rate / shaping_min_freq / 2) + 3; typedef hal_timer_t shaping_time_t; enum shaping_echo_t { ECHO_NONE = 0, ECHO_FWD = 1, ECHO_BWD = 2 }; From 7b6b6e1c3e294f5d8785f7e14fe05b4fedb6ea08 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Apr 2024 21:44:18 -0500 Subject: [PATCH 040/111] =?UTF-8?q?=F0=9F=A9=B9=20Revert=20motion=20change?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/motion.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index c5e45899a19d..e4e419dd767f 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -729,14 +729,11 @@ void do_blocking_move_to(const xyze_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f* } void do_move_after_z_homing() { DEBUG_SECTION(mzah, "do_move_after_z_homing", DEBUGGING(LEVELING)); - float zpos = 0; - #ifdef Z_POST_CLEARANCE // (is always defined) - NOLESS(zpos, Z_POST_CLEARANCE); + #if defined(Z_AFTER_HOMING) || ALL(DWIN_LCD_PROUI, INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) + do_z_clearance(Z_POST_CLEARANCE, true, true); + #elif ENABLED(USE_PROBE_FOR_Z_HOMING) + probe.move_z_after_probing(); #endif - #if ENABLED(USE_PROBE_FOR_Z_HOMING) - NOLESS(zpos, Z_AFTER_PROBING); - #endif - if (zpos) do_z_clearance(zpos, true, true); } #endif From 17dfe8edc9239a3c0c213b5ad9d7bdaebe4125f7 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 3 Apr 2024 00:20:46 +0000 Subject: [PATCH 041/111] [cron] Bump distribution date (2024-04-03) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index b89148643814..3fdd1e007cef 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 "2024-04-02" +//#define STRING_DISTRIBUTION_DATE "2024-04-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 8f933f1023df..76971d3d409c 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 "2024-04-02" + #define STRING_DISTRIBUTION_DATE "2024-04-03" #endif /** From d30fcb8fffd04dd7ac6d67719902471a6cd969ae Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 5 Apr 2024 17:24:58 -0700 Subject: [PATCH 042/111] =?UTF-8?q?=F0=9F=90=9B=20Fix=20bool=20evalution?= =?UTF-8?q?=20of=20XYval=20and=20similar=20types=20(#26936)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Require explicit cast to get T* pointers from XYval and similar types. This prevents the pointer from being implicitly returned and checked for nullptr when trying to evaluate these structs in boolean expressions. --- Marlin/src/core/types.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index e67644e52fc6..44805e130a56 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -449,7 +449,7 @@ struct XYval { // Length reduced to one dimension FI constexpr T magnitude() const { return (T)sqrtf(x*x + y*y); } // Pointer to the data as a simple array - FI operator T* () { return pos; } + explicit FI operator T* () { return pos; } // If any element is true then it's true FI constexpr operator bool() const { return x || y; } // Smallest element @@ -599,7 +599,7 @@ struct XYZval { // Length reduced to one dimension FI constexpr T magnitude() const { return (T)TERN(HAS_X_AXIS, sqrtf(NUM_AXIS_GANG(x*x, + y*y, + z*z, + i*i, + j*j, + k*k, + u*u, + v*v, + w*w)), 0); } // Pointer to the data as a simple array - FI operator T* () { return pos; } + explicit FI operator T* () { return pos; } // If any element is true then it's true FI constexpr operator bool() const { return 0 NUM_AXIS_GANG(|| x, || y, || z, || i, || j, || k, || u, || v, || w); } // Smallest element @@ -747,7 +747,7 @@ struct XYZEval { // Length reduced to one dimension FI constexpr T magnitude() const { return (T)sqrtf(LOGICAL_AXIS_GANG(+ e*e, + x*x, + y*y, + z*z, + i*i, + j*j, + k*k, + u*u, + v*v, + w*w)); } // Pointer to the data as a simple array - FI operator T* () { return pos; } + explicit FI operator T* () { return pos; } // If any element is true then it's true FI constexpr operator bool() const { return 0 LOGICAL_AXIS_GANG(|| e, || x, || y, || z, || i, || j, || k, || u, || v, || w); } // Smallest element From 390f1f7c69f6bcb41b7e179dcdd45187da3bfec3 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 5 Apr 2024 17:27:30 -0700 Subject: [PATCH 043/111] =?UTF-8?q?=F0=9F=90=9B=20Don't=20apply=20settings?= =?UTF-8?q?=20during=20validation=20(#26935)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check the `validating` variable before applying settings for several features. This specifically avoids settings corruption for BACKLASH_PREVENTION, which has side-effects when first applied using incorrect values. --- Marlin/src/module/settings.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 48800138621f..17b8ae4d72fa 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -1940,7 +1940,7 @@ void MarlinSettings::postprocess() { _FIELD_TEST(runout_sensor_enabled); EEPROM_READ(runout_sensor_enabled); #if HAS_FILAMENT_SENSOR - runout.enabled = runout_sensor_enabled < 0 ? FIL_RUNOUT_ENABLED_DEFAULT : runout_sensor_enabled; + if (!validating) runout.enabled = runout_sensor_enabled < 0 ? FIL_RUNOUT_ENABLED_DEFAULT : runout_sensor_enabled; #endif TERN_(HAS_FILAMENT_SENSOR, if (runout.enabled) runout.reset()); @@ -2121,7 +2121,7 @@ void MarlinSettings::postprocess() { #if ENABLED(PTC_HOTEND) EEPROM_READ(ptc.z_offsets_hotend); #endif - ptc.reset_index(); + if (!validating) ptc.reset_index(); #else // No placeholder data for this feature #endif @@ -2681,11 +2681,13 @@ void MarlinSettings::postprocess() { EEPROM_READ(backlash_smoothing_mm); #if ENABLED(BACKLASH_GCODE) + if (!validating) { LOOP_NUM_AXES(axis) backlash.set_distance_mm((AxisEnum)axis, backlash_distance_mm[axis]); backlash.set_correction_uint8(backlash_correction); #ifdef BACKLASH_SMOOTHING_MM backlash.set_smoothing_mm(backlash_smoothing_mm); #endif + } #endif } #endif // NUM_AXES @@ -2787,7 +2789,7 @@ void MarlinSettings::postprocess() { uint8_t ui_language; EEPROM_READ(ui_language); if (ui_language >= NUM_LANGUAGES) ui_language = 0; - ui.set_language(ui_language); + if (!validating) ui.set_language(ui_language); } #endif @@ -2813,8 +2815,10 @@ void MarlinSettings::postprocess() { { float _data[2]; EEPROM_READ(_data); - stepper.set_shaping_frequency(X_AXIS, _data[0]); - stepper.set_shaping_damping_ratio(X_AXIS, _data[1]); + if (!validating) { + stepper.set_shaping_frequency(X_AXIS, _data[0]); + stepper.set_shaping_damping_ratio(X_AXIS, _data[1]); + } } #endif @@ -2822,8 +2826,10 @@ void MarlinSettings::postprocess() { { float _data[2]; EEPROM_READ(_data); - stepper.set_shaping_frequency(Y_AXIS, _data[0]); - stepper.set_shaping_damping_ratio(Y_AXIS, _data[1]); + if (!validating) { + stepper.set_shaping_frequency(Y_AXIS, _data[0]); + stepper.set_shaping_damping_ratio(Y_AXIS, _data[1]); + } } #endif From 1dec9831d3d24b5a2eecb1b1f454456258fd85ad Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 6 Apr 2024 06:06:36 +0000 Subject: [PATCH 044/111] [cron] Bump distribution date (2024-04-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 3fdd1e007cef..60090171d851 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 "2024-04-03" +//#define STRING_DISTRIBUTION_DATE "2024-04-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 76971d3d409c..5b8254dfcc7e 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 "2024-04-03" + #define STRING_DISTRIBUTION_DATE "2024-04-06" #endif /** From 56773bd80eaf726bced653781a8b27d22251f58b Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 7 Apr 2024 16:11:32 +1200 Subject: [PATCH 045/111] =?UTF-8?q?=F0=9F=A9=B9=20add=20onSetMinExtrusionT?= =?UTF-8?q?emp=20to=20anycubic=5Fviper=20(#26933)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp b/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp index 1bf13eafa306..b21bee7a7a55 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp @@ -154,6 +154,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) // Called when power-loss is enabled/disabled void onSetPowerLoss(const bool) { dgus.powerLoss(); } From 7dc7195696bde1405ba8b78b18233712bf72573b Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 6 Apr 2024 21:17:00 -0700 Subject: [PATCH 046/111] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20active=20extruder?= =?UTF-8?q?=20indicator=20(#26834)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🩹 No active extruder when any of several incompatible features are enabled --- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 24165019b473..747e462b1dac 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -323,7 +323,7 @@ FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, co } // PAGE_CONTAINS - #if HAS_MULTI_EXTRUDER && DISABLED(SLIM_LCD_MENUS) + #if HAS_MULTI_EXTRUDER && NONE(SLIM_LCD_MENUS, STATUS_HOTEND_NUMBERLESS, SINGLENOZZLE) if (active_extruder == heater_id) u8g.drawBitmapP(_MAX(0, STATUS_HOTEND_X(heater_id) - 6), STATUS_HEATERS_Y + 3, 1, 5, status_active_extruder_indicator_bmp); #endif From 77f93e0b8c5c983cc7ba3f56bd6fb1954fb1ae18 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 6 Apr 2024 21:22:25 -0700 Subject: [PATCH 047/111] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20Mini=2012864=20on?= =?UTF-8?q?=20BTT=20Kraken=20(#26918)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ellensp <530024+ellensp@users.noreply.github.com> --- Marlin/src/pins/stm32h7/pins_BTT_KRAKEN_V1_0.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Marlin/src/pins/stm32h7/pins_BTT_KRAKEN_V1_0.h b/Marlin/src/pins/stm32h7/pins_BTT_KRAKEN_V1_0.h index 1840e441f8e6..4a4c47de2c1c 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_KRAKEN_V1_0.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_KRAKEN_V1_0.h @@ -516,6 +516,9 @@ #define DOGLCD_CS EXP1_03_PIN #define DOGLCD_A0 EXP1_04_PIN //#define LCD_BACKLIGHT_PIN -1 + + #define FORCE_SOFT_SPI + #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN From a337a43bfdba816ae641102f2bd8306b478785fd Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 7 Apr 2024 16:47:40 +1200 Subject: [PATCH 048/111] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20type=20mismatch=20?= =?UTF-8?q?when=20SEGMENT=5FLEVELED=5FMOVES=20disabled=20(#26819)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp index f40cbccadd79..14216ac4244e 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -63,7 +63,7 @@ */ void mesh_bed_leveling::line_to_destination(const_feedRate_t scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) { // Get current and destination cells for this line - xy_int8_t scel = cell_indexes(current_position), ecel = cell_indexes(destination); + xy_uint8_t scel = cell_indexes(current_position), ecel = cell_indexes(destination); NOMORE(scel.x, GRID_MAX_CELLS_X - 1); NOMORE(scel.y, GRID_MAX_CELLS_Y - 1); NOMORE(ecel.x, GRID_MAX_CELLS_X - 1); @@ -80,7 +80,7 @@ float normalized_dist; xyze_pos_t dest; - const int8_t gcx = _MAX(scel.x, ecel.x), gcy = _MAX(scel.y, ecel.y); + const uint8_t gcx = _MAX(scel.x, ecel.x), gcy = _MAX(scel.y, ecel.y); // Crosses on the X and not already split on this X? // The x_splits flags are insurance against rounding errors. From c91771a51e32dd490b1298fa2eef3af67f033553 Mon Sep 17 00:00:00 2001 From: Vovodroid Date: Sun, 7 Apr 2024 08:41:01 +0300 Subject: [PATCH 049/111] =?UTF-8?q?=F0=9F=A9=B9Disable=20nonlinear=20extru?= =?UTF-8?q?sion=20on=20unretract=20(#26824)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes disable NLE on unretract #26808, which reported blobs at the start of lines during unretract. --- Marlin/src/module/planner.cpp | 6 +----- Marlin/src/module/planner.h | 6 ++++++ Marlin/src/module/stepper.cpp | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 8f7c4ceb72c7..c21230f662b3 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -2462,11 +2462,7 @@ bool Planner::_populate_block( #if ENABLED(LIN_ADVANCE) bool use_advance_lead = false; #endif - if (true NUM_AXIS_GANG( - && !block->steps.a, && !block->steps.b, && !block->steps.c, - && !block->steps.i, && !block->steps.j, && !block->steps.k, - && !block->steps.u, && !block->steps.v, && !block->steps.w) - ) { // Is this a retract / recover move? + if (!ANY_AXIS_MOVES(block)) { // Is this a retract / recover move? accel = CEIL(settings.retract_acceleration * steps_per_mm); // Convert to: acceleration steps/sec^2 } else { diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 856e70e5821a..b7b1abbb6153 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -1123,4 +1123,10 @@ class Planner { #define PLANNER_XY_FEEDRATE() _MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]) +#define ANY_AXIS_MOVES(BLOCK) \ + (false NUM_AXIS_GANG( \ + || BLOCK->steps.a, || BLOCK->steps.b, || BLOCK->steps.c, \ + || BLOCK->steps.i, || BLOCK->steps.j, || BLOCK->steps.k, \ + || BLOCK->steps.u, || BLOCK->steps.v, || BLOCK->steps.w)) + extern Planner planner; diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 803c14d73cca..6426c7f4a2e3 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2770,7 +2770,7 @@ hal_timer_t Stepper::block_phase_isr() { ne_edividend = advance_dividend.e; const float scale = (float(ne_edividend) / advance_divisor) * planner.mm_per_step[E_AXIS_N(current_block->extruder)]; ne_scale = (1L << 24) * scale; - if (current_block->direction_bits.e) { + if (current_block->direction_bits.e && ANY_AXIS_MOVES(current_block)) { ne_fix.A = (1L << 24) * ne.A; ne_fix.B = (1L << 24) * ne.B; ne_fix.C = (1L << 24) * ne.C; From d1cf817660a0760b1de37f6f42b9619c128c1a0f Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 7 Apr 2024 17:57:42 +1200 Subject: [PATCH 050/111] =?UTF-8?q?=F0=9F=90=9B=20Fix=20CREALITY=5FENDER2P?= =?UTF-8?q?=5FV24S4=20pins=20(#26908)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/hc32f4/pins_CREALITY_ENDER2P_V24S4.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/pins/hc32f4/pins_CREALITY_ENDER2P_V24S4.h b/Marlin/src/pins/hc32f4/pins_CREALITY_ENDER2P_V24S4.h index 64b013d9993e..89c313662023 100644 --- a/Marlin/src/pins/hc32f4/pins_CREALITY_ENDER2P_V24S4.h +++ b/Marlin/src/pins/hc32f4/pins_CREALITY_ENDER2P_V24S4.h @@ -183,20 +183,20 @@ /** ------ * PC6 | 1 2 | PC7 - * PA2 | 3 4 | PC1 + * PA2 | 3 4 | PA3 * PB13 5 6 | PB14 - * PB15 | 7 8 | PB12 - * GND | 9 10 | 5V + * N/C | 7 8 | PB12 + * GND | 9 10 | 5V * ------ * EXP1 */ #define EXP1_01_PIN PC6 #define EXP1_02_PIN PC7 #define EXP1_03_PIN PA2 -#define EXP1_04_PIN PC1 +#define EXP1_04_PIN PA3 #define EXP1_05_PIN PB13 #define EXP1_06_PIN PB14 -#define EXP1_07_PIN PB15 +#define EXP1_07_PIN -1 #define EXP1_08_PIN PB12 #if ENABLED(CR10_STOCKDISPLAY) // LCD used for C2 From 7e9868d762152b9321370cb42629e8d1899de03f Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 7 Apr 2024 06:05:53 +0000 Subject: [PATCH 051/111] [cron] Bump distribution date (2024-04-07) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 60090171d851..ba8adf315a6a 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 "2024-04-06" +//#define STRING_DISTRIBUTION_DATE "2024-04-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 5b8254dfcc7e..2cb8456a49a1 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 "2024-04-06" + #define STRING_DISTRIBUTION_DATE "2024-04-07" #endif /** From 351a1a1332e293b2c972ee42a026e7033ad2f760 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 7 Apr 2024 18:29:19 +1200 Subject: [PATCH 052/111] =?UTF-8?q?=F0=9F=94=A7=20Add=20UART=205=20for=20S?= =?UTF-8?q?KR=20Mini=20E3=20V3.0=20(#26825)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ini/stm32g0.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/ini/stm32g0.ini b/ini/stm32g0.ini index 8da5ab230fe1..77bdde7438dd 100644 --- a/ini/stm32g0.ini +++ b/ini/stm32g0.ini @@ -57,6 +57,7 @@ board_build.offset = 0x2000 board_upload.offset_address = 0x08002000 build_flags = ${stm32_variant.build_flags} -DPIN_SERIAL4_RX=PC_11 -DPIN_SERIAL4_TX=PC_10 + -DPIN_SERIAL5_RX=PD_2 -DPIN_SERIAL5_TX=PD_3 -DSERIAL_RX_BUFFER_SIZE=1024 -DSERIAL_TX_BUFFER_SIZE=1024 -DTIMER_SERVO=TIM3 -DTIMER_TONE=TIM4 -DSTEP_TIMER_IRQ_PRIO=0 From 9343247e075fbc11e0ea83670f92543e2b1245f2 Mon Sep 17 00:00:00 2001 From: sargonphin <85966195+sargonphin@users.noreply.github.com> Date: Sun, 7 Apr 2024 17:48:13 +0200 Subject: [PATCH 053/111] =?UTF-8?q?=F0=9F=A9=B9Increase=20range=20of=20G34?= =?UTF-8?q?=20accuracy=20target=20=20(#26771)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Allow G34 accuracy down to 0.001mm, previous minimum was 0.01mm. --- Marlin/src/gcode/calibrate/G34_M422.cpp | 4 ++-- Marlin/src/inc/SanityCheck.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 8b94dd53921b..7a27a61b9d71 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -115,8 +115,8 @@ void GcodeSuite::G34() { } const float z_auto_align_accuracy = parser.floatval('T', Z_STEPPER_ALIGN_ACC); - if (!WITHIN(z_auto_align_accuracy, 0.01f, 1.0f)) { - SERIAL_ECHOLNPGM(GCODE_ERR_MSG("(T)arget accuracy out of bounds (0.01-1.0).")); + if (!WITHIN(z_auto_align_accuracy, 0.001f, 1.0f)) { + SERIAL_ECHOLNPGM(GCODE_ERR_MSG("(T)arget accuracy out of bounds (0.001-1.0).")); break; } diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index fdc78aa3e4b0..327d55760a6b 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3617,6 +3617,7 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." #error "Z_STEPPER_ALIGN_STEPPER_XY requires 3 or 4 Z steppers." #endif #endif + static_assert(WITHIN(Z_STEPPER_ALIGN_ACC, 0.001, 1.0), "Z_STEPPER_ALIGN_ACC needs to be between 0.001 and 1.0"); #endif #if ENABLED(MECHANICAL_GANTRY_CALIBRATION) From d9d7820b0df60553279c6be85f0b0bd8d2d648e4 Mon Sep 17 00:00:00 2001 From: narno2202 <130909513+narno2202@users.noreply.github.com> Date: Sun, 7 Apr 2024 17:52:35 +0200 Subject: [PATCH 054/111] =?UTF-8?q?=F0=9F=A9=B9=20Set=20correct=20LCD=20se?= =?UTF-8?q?rial=20port=20for=20MKS=5FMONSTER8=5FV1=20(#26879)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/Conditionals_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 5f983c60f388..aa55731d90ab 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -1305,7 +1305,7 @@ * currently HAL.h must be included ahead of pins.h. */ #if LCD_IS_SERIAL_HOST && !defined(LCD_SERIAL_PORT) - #if MB(BTT_SKR_MINI_E3_V1_0, BTT_SKR_MINI_E3_V1_2, BTT_SKR_MINI_E3_V2_0, BTT_SKR_MINI_E3_V3_0, BTT_SKR_MINI_E3_V3_0_1, BTT_SKR_E3_TURBO, BTT_OCTOPUS_V1_1, AQUILA_V101) + #if MB(MKS_MONSTER8_V1, BTT_SKR_MINI_E3_V1_0, BTT_SKR_MINI_E3_V1_2, BTT_SKR_MINI_E3_V2_0, BTT_SKR_MINI_E3_V3_0, BTT_SKR_MINI_E3_V3_0_1, BTT_SKR_E3_TURBO, BTT_OCTOPUS_V1_1, AQUILA_V101) #define LCD_SERIAL_PORT 1 #elif MB(CREALITY_V24S1_301, CREALITY_V24S1_301F4, CREALITY_F401RE, CREALITY_V423, CREALITY_CR4NTXXC10, MKS_ROBIN, PANOWIN_CUTLASS, KODAMA_BARDO) #define LCD_SERIAL_PORT 2 From c31d9e717b207d1fa59ac942475ebcf15c1a3841 Mon Sep 17 00:00:00 2001 From: Andrew Bortz Date: Sun, 7 Apr 2024 09:37:37 -0700 Subject: [PATCH 055/111] =?UTF-8?q?=F0=9F=A9=B9Fix=20ProUI=20Z=20probe=20o?= =?UTF-8?q?ffset=20text=20(#26832)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/e3v2/proui/dwin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index bb345e519155..4c5f91e03222 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -4014,7 +4014,7 @@ void drawMaxAccelMenu() { BACK_ITEM(drawPrepareMenu); MENU_ITEM(ICON_Homing, MSG_AUTO_HOME, onDrawMenuItem, autoHome); MENU_ITEM(ICON_AxisD, MSG_MOVE_NOZZLE_TO_BED, onDrawMenuItem, setMoveZto0); - EDIT_ITEM(ICON_Zoffset, MSG_XATC_UPDATE_Z_OFFSET, onDrawPFloat2Menu, setZOffset, &BABY_Z_VAR); + EDIT_ITEM(ICON_Zoffset, MSG_ZPROBE_ZOFFSET, onDrawPFloat2Menu, setZOffset, &BABY_Z_VAR); } updateMenu(zOffsetWizMenu); if (!axis_is_trusted(Z_AXIS)) LCD_MESSAGE_F("WARNING: Z position unknown, move Z to home"); From 2bf56b00d4752daabb2afe048b2e07448cc25e78 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sun, 7 Apr 2024 10:49:36 -0700 Subject: [PATCH 056/111] =?UTF-8?q?=F0=9F=94=A7=20Improve=20BIQU=20BX=20pi?= =?UTF-8?q?ns,=20allow=20Z=20swap=20(#26871)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add a swap Z & E1 option for BIQU BX Users can add #define BX_SWAP_ZM_E1M to their config instead of opening their printer up & swapping Z & E1 motor cables. Allows G34 to work correctly on early BX printers since both Z motor wires were installed without a standard procedure in place and wires could be swapped from the factory. * Add BOARD URL, DIAG pin info, update pin comments * Add WIFISUPPORT defines for documentation purposes WIFISUPPORT does not need to be enabled (read: shouldn't be enabled). Simply enable an available SERIAL_PORT*, set it to 4, and connect an ESP-01/ESP-01S flashed with luc-github's ESP3D firmware for basic WiFi functionality. * Sanity check TOUCH_SCREEN_CALIBRATION on GT911 TFTs (BIQU BX TFT70) Use a sanity check so it's clear which options are valid for TFT_TOUCH_DEVICE_GT911 / BIQU_BX_TFT70. --- Marlin/src/inc/Conditionals_LCD.h | 4 - Marlin/src/inc/SanityCheck.h | 5 + .../pins/stm32h7/pins_BTT_SKR_SE_BX_common.h | 122 +++++++++++++----- 3 files changed, 95 insertions(+), 36 deletions(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 92799b7cd48b..a3756217e660 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1852,10 +1852,6 @@ #if NONE(TFT_TOUCH_DEVICE_GT911, TFT_TOUCH_DEVICE_XPT2046) #define TFT_TOUCH_DEVICE_XPT2046 // ADS7843/XPT2046 ADC Touchscreen such as ILI9341 2.8 #endif - #if ENABLED(TFT_TOUCH_DEVICE_GT911) // GT911 Capacitive touch screen such as BIQU_BX_TFT70 - #undef TOUCH_SCREEN_CALIBRATION - #undef TOUCH_CALIBRATION_AUTO_SAVE - #endif #if !HAS_GRAPHICAL_TFT #undef TOUCH_SCREEN #if ENABLED(TFT_CLASSIC_UI) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 327d55760a6b..b2f909de084a 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3919,6 +3919,11 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." #error "TOUCH_CALIBRATION_[XY] and TOUCH_OFFSET_[XY] are required for resistive touch screens with TOUCH_SCREEN_CALIBRATION disabled." #endif +// GT911 Capacitive touch screen such as BIQU_BX_TFT70 +#if ALL(TFT_TOUCH_DEVICE_GT911, TOUCH_SCREEN_CALIBRATION) + #error "TOUCH_SCREEN_CALIBRATION is not supported by the selected LCD controller." +#endif + /** * Sanity check WiFi options */ diff --git a/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h index fd9aa53a9471..7314ccc825d4 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h @@ -23,8 +23,11 @@ #include "env_validate.h" +#define BOARD_WEBSITE_URL "github.com/bigtreetech/BIQU-BX" #define DEFAULT_MACHINE_NAME "BIQU BX" +#define USES_DIAG_JUMPERS + // Onboard I2C EEPROM #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x1000 // 4K (24C32) @@ -32,18 +35,27 @@ #define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support //#define SWD_DEBUG // Use pins PA13 and PA14 on STM32H7 for the SWD debugger +// +// Trinamic Stallguard pins +// +#define X_DIAG_PIN PB11 // X- +#define Y_DIAG_PIN PB12 // Y- +#define Z_DIAG_PIN PD12 // Z- +#define E0_DIAG_PIN PD13 // X+ +#define E1_DIAG_PIN PB13 // Y+ + // // Limit Switches // -#define X_MIN_PIN PB11 -#define X_MAX_PIN PD13 -#define Y_MIN_PIN PB12 -#define Y_MAX_PIN PB13 -#define Z_MIN_PIN PD12 -#define Z_MAX_PIN PD11 +#define X_MIN_PIN X_DIAG_PIN // X- +#define X_MAX_PIN E0_DIAG_PIN // X+ +#define Y_MIN_PIN Y_DIAG_PIN // Y- +#define Y_MAX_PIN E1_DIAG_PIN // Y+ +#define Z_MIN_PIN Z_DIAG_PIN // Z- +#define Z_MAX_PIN PD11 // Z+ -#define FIL_RUNOUT_PIN PD13 -#define FIL_RUNOUT2_PIN PB13 +#define FIL_RUNOUT_PIN E0_DIAG_PIN // X+ +#define FIL_RUNOUT2_PIN E1_DIAG_PIN // Y+ #ifndef SWD_DEBUG #define LED_PIN PA13 @@ -53,13 +65,13 @@ #define POWER_MONITOR_PIN PB0 #define RPI_POWER_PIN PE5 -#define SERVO0_PIN PA2 +#define SERVO0_PIN PA2 // PROBE // // Z Probe (when not Z_MIN_PIN) // #ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN PH2 // Probe + #define Z_MIN_PROBE_PIN PH2 // PROBE #endif // @@ -72,30 +84,44 @@ // // Steppers // -#define X_STEP_PIN PG13 +#define X_STEP_PIN PG13 // X #define X_DIR_PIN PG12 #define X_ENABLE_PIN PG14 #define X_CS_PIN PG10 -#define Y_STEP_PIN PB3 +#define Y_STEP_PIN PB3 // Y #define Y_DIR_PIN PD3 #define Y_ENABLE_PIN PB4 #define Y_CS_PIN PD4 -#define Z_STEP_PIN PD7 -#define Z_DIR_PIN PD6 -#define Z_ENABLE_PIN PG9 -#define Z_CS_PIN PD5 +#ifdef BX_SWAP_ZM_E1M + #define Z_STEP_PIN PA8 // E1 + #define Z_DIR_PIN PC9 + #define Z_ENABLE_PIN PD2 + #define Z_CS_PIN PC8 +#else + #define Z_STEP_PIN PD7 // Z1 + #define Z_DIR_PIN PD6 + #define Z_ENABLE_PIN PG9 + #define Z_CS_PIN PD5 +#endif -#define E0_STEP_PIN PC14 +#define E0_STEP_PIN PC14 // E0 #define E0_DIR_PIN PC13 #define E0_ENABLE_PIN PC15 #define E0_CS_PIN PI8 -#define E1_STEP_PIN PA8 -#define E1_DIR_PIN PC9 -#define E1_ENABLE_PIN PD2 -#define E1_CS_PIN PC8 +#ifdef BX_SWAP_ZM_E1M + #define E1_STEP_PIN PD7 // Z1 + #define E1_DIR_PIN PD6 + #define E1_ENABLE_PIN PG9 + #define E1_CS_PIN PD5 +#else + #define E1_STEP_PIN PA8 // E1 + #define E1_DIR_PIN PC9 + #define E1_ENABLE_PIN PD2 + #define E1_CS_PIN PC8 +#endif // // SPI pins for TMC2130 stepper drivers @@ -138,14 +164,24 @@ #define Y_SERIAL_TX_PIN PD4 #define Y_SERIAL_RX_PIN Y_SERIAL_TX_PIN - #define Z_SERIAL_TX_PIN PD5 - #define Z_SERIAL_RX_PIN Z_SERIAL_TX_PIN + #ifdef BX_SWAP_ZM_E1M + #define Z_SERIAL_TX_PIN PC8 + #define Z_SERIAL_RX_PIN Z_SERIAL_TX_PIN + #else + #define Z_SERIAL_TX_PIN PD5 + #define Z_SERIAL_RX_PIN Z_SERIAL_TX_PIN + #endif #define E0_SERIAL_TX_PIN PI8 #define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN - #define E1_SERIAL_TX_PIN PC8 - #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN + #ifdef BX_SWAP_ZM_E1M + #define E1_SERIAL_TX_PIN PD5 + #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN + #else + #define E1_SERIAL_TX_PIN PC8 + #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN + #endif // Reduce baud rate to improve software serial reliability #ifndef TMC_BAUD_RATE @@ -164,15 +200,15 @@ // // Heaters / Fans // -#define HEATER_0_PIN PC4 -#define HEATER_1_PIN PC5 -#define HEATER_BED_PIN PA4 +#define HEATER_0_PIN PC4 // HE0 +#define HEATER_1_PIN PC5 // HE1 +#define HEATER_BED_PIN PA4 // BED -#define FAN0_PIN PA5 // "FAN0" -#define FAN1_PIN PA6 // "FAN1" -#define FAN2_PIN PA7 // "FAN2" +#define FAN0_PIN PA5 // FAN0 +#define FAN1_PIN PA6 // FAN1 +#define FAN2_PIN PA7 // FAN2 / DCOT -#define BOARD_NEOPIXEL_PIN PH3 +#define BOARD_NEOPIXEL_PIN PH3 // RGB #define NEOPIXEL2_PIN PB1 #if HAS_LTDC_TFT @@ -238,3 +274,25 @@ #define SD_MISO_PIN PC11 #define SD_MOSI_PIN PC12 #define SD_DETECT_PIN PI3 + +#if ENABLED(WIFISUPPORT) + // + // WIFI + // + + /** + * ----- + * (ESP-RX4) PA1 | 1 8 | GND + * (ESP-EN) -- | 2 7 | -- (ESP-IO2) + * (ESP-RST) -- | 3 6 | -- (ESP-IO0) + * 3.3V | 4 5 | PA0 (ESP-TX4) + * ----- + * WIFI-ESP01 + */ + #define ESP_WIFI_MODULE_COM 4 // Must also set either SERIAL_PORT / SERIAL_PORT_2 / SERIAL_PORT_3 to this + #define ESP_WIFI_MODULE_BAUDRATE BAUDRATE // Must use same BAUDRATE as SERIAL_PORT / SERIAL_PORT_2 / SERIAL_PORT_3 + #define ESP_WIFI_MODULE_RESET_PIN -1 + #define ESP_WIFI_MODULE_ENABLE_PIN -1 + #define ESP_WIFI_MODULE_GPIO0_PIN -1 + #define ESP_WIFI_MODULE_GPIO2_PIN -1 +#endif From a3434de2e62c31c40baa52a68dde06885fd18ff5 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sun, 7 Apr 2024 12:05:35 -0700 Subject: [PATCH 057/111] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20MCU=20check=20for?= =?UTF-8?q?=20STM32H7-based=20BTT=20Octopus=20Pro=20V1=20(#26831)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🩹 Fix MCU check for STM32H7-based BTT Octopus Pro V1 Co-authored-by: ellensp <530024+ellensp@users.noreply.github.com> * Update Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h --------- Co-authored-by: ellensp <530024+ellensp@users.noreply.github.com> --- Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 169cc9d8322a..294782029658 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h @@ -21,7 +21,13 @@ */ #pragma once -#include "env_validate.h" +// The Octopus Pro V1 has shipped with both STM32F4 and STM32H7 MCUs. +// Ensure the correct env_validate.h file is included based on the build environment used. +#if NOT_TARGET(STM32H7) + #include "env_validate.h" +#else + #include "../stm32h7/env_validate.h" +#endif #define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support #define USES_DIAG_JUMPERS From 311bfc99f3f47292f5d4d5e80f29be3de58071a7 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 8 Apr 2024 00:21:49 +0000 Subject: [PATCH 058/111] [cron] Bump distribution date (2024-04-08) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index ba8adf315a6a..0b350f6bdbda 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 "2024-04-07" +//#define STRING_DISTRIBUTION_DATE "2024-04-08" /** * 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 2cb8456a49a1..d574879705fe 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 "2024-04-07" + #define STRING_DISTRIBUTION_DATE "2024-04-08" #endif /** From 9215bf791b015a8970c3ca54188f8145ab0cc263 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Wed, 10 Apr 2024 17:50:21 +1200 Subject: [PATCH 059/111] =?UTF-8?q?=F0=9F=94=A8=20MarlinSimUI=20updates=20?= =?UTF-8?q?(#26955)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ini/native.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ini/native.ini b/ini/native.ini index ba5ddbc4cc01..d07eaa22051e 100644 --- a/ini/native.ini +++ b/ini/native.ini @@ -44,7 +44,7 @@ debug_build_flags = -fstack-protector-strong -g -g3 -ggdb lib_compat_mode = off build_src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} - MarlinSimUI=https://github.com/p3p/MarlinSimUI/archive/8791f3ff43.zip + MarlinSimUI=https://github.com/p3p/MarlinSimUI/archive/66a2b82c8f.zip Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/c6b319f447.zip LiquidCrystal=https://github.com/p3p/LiquidCrystal/archive/322fb5fc23.zip extra_scripts = ${common.extra_scripts} From e6755450df46870c961f8d675815da1415d6436f Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 9 Apr 2024 22:58:13 -0700 Subject: [PATCH 060/111] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20ESP3D=20WiFi=20Sup?= =?UTF-8?q?port=20(#26822)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 2 +- Marlin/src/inc/SanityCheck.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 434aa83e5699..559eafdbf6a6 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -4342,7 +4342,7 @@ * Extras for an ESP32-based motherboard with WIFISUPPORT * These options don't apply to add-on WiFi modules based on ESP32 WiFi101. */ -#if ENABLED(WIFISUPPORT) +#if ANY(WIFISUPPORT, ESP3D_WIFISUPPORT) //#define WEBSUPPORT // Start a webserver (which may include auto-discovery) using SPIFFS //#define OTASUPPORT // Support over-the-air firmware updates //#define WIFI_CUSTOM_COMMAND // Accept feature config commands (e.g., WiFi ESP3D) from the host diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b2f909de084a..eea7d15d9bbe 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3935,11 +3935,11 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." #if !(defined(WIFI_SSID) && defined(WIFI_PWD)) #error "ESP32 motherboard with WIFISUPPORT requires WIFI_SSID and WIFI_PWD." #endif -#elif ENABLED(WIFI_CUSTOM_COMMAND) +#elif ENABLED(WIFI_CUSTOM_COMMAND) && NONE(ESP3D_WIFISUPPORT, WIFISUPPORT) #error "WIFI_CUSTOM_COMMAND requires an ESP32 motherboard and WIFISUPPORT." -#elif ENABLED(OTASUPPORT) +#elif ENABLED(OTASUPPORT) && NONE(ESP3D_WIFISUPPORT, WIFISUPPORT) #error "OTASUPPORT requires an ESP32 motherboard and WIFISUPPORT." -#elif defined(WIFI_SSID) || defined(WIFI_PWD) +#elif (defined(WIFI_SSID) || defined(WIFI_PWD)) && NONE(ESP3D_WIFISUPPORT, WIFISUPPORT) #error "WIFI_SSID and WIFI_PWD only apply to ESP32 motherboard with WIFISUPPORT." #endif From 80dd02fbdb81e149fb2e63d76f3a17c0a6537a91 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Wed, 10 Apr 2024 18:02:32 +1200 Subject: [PATCH 061/111] =?UTF-8?q?=F0=9F=93=9D=20Update=20RGB565=20color?= =?UTF-8?q?=20picker=20url=20(#26951)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp | 2 +- Marlin/src/lcd/tft/tft_color.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp index dcf835a6cbb4..73b35b0ec2fa 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp @@ -84,7 +84,7 @@ TFT_IO tftio; #define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1) #define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1) -// RGB565 color picker: https://embeddednotepad.com/page/rgb565-color-picker +// RGB565 color picker: https://rgbcolorpicker.com/565 // Hex code to color name: https://www.color-name.com/ #define COLOR_BLACK 0x0000 // #000000 diff --git a/Marlin/src/lcd/tft/tft_color.h b/Marlin/src/lcd/tft/tft_color.h index cd03224615a9..ef0d2fa5b5be 100644 --- a/Marlin/src/lcd/tft/tft_color.h +++ b/Marlin/src/lcd/tft/tft_color.h @@ -30,7 +30,7 @@ #define COLOR(color) RGB(((color >> 16) & 0xFF), ((color >> 8) & 0xFF), (color & 0xFF)) #define HALF(color) RGB(RED(color) >> 1, GREEN(color) >> 1, BLUE(color) >> 1) -// RGB565 color picker: https://embeddednotepad.com/page/rgb565-color-picker +// RGB565 color picker: https://rgbcolorpicker.com/565 // Hex code to color name: https://www.color-name.com/ #define COLOR_BLACK 0x0000 // #000000 From a75a5f8b2a5fd163bfc2710ef649a0cf6f65e6a6 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 10 Apr 2024 06:13:36 +0000 Subject: [PATCH 062/111] [cron] Bump distribution date (2024-04-10) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 0b350f6bdbda..412c144adc28 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 "2024-04-08" +//#define STRING_DISTRIBUTION_DATE "2024-04-10" /** * 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 d574879705fe..771e9b593f88 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 "2024-04-08" + #define STRING_DISTRIBUTION_DATE "2024-04-10" #endif /** From 1b091ecb874bb873c12c686746084e6ee71b056f Mon Sep 17 00:00:00 2001 From: Andrew <18502096+classicrocker883@users.noreply.github.com> Date: Thu, 11 Apr 2024 02:13:54 -0400 Subject: [PATCH 063/111] =?UTF-8?q?=E2=9C=8F=EF=B8=8FMinor=20style=20and?= =?UTF-8?q?=20typo=20fixups=20(#26947)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * tweaks from PR, whitespace, wording in pause.h * Update Marlin/src/feature/pause.h --- Marlin/src/feature/pause.h | 8 +++----- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 2 +- Marlin/src/lcd/marlinui.cpp | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index b86f86b633a9..4d968406c272 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -57,9 +57,7 @@ enum PauseMessage : char { }; #if M600_PURGE_MORE_RESUMABLE - /** - * Input methods can Purge More, Resume, or request input - */ + // Input methods can Purge More, Resume, or request input enum PauseMenuResponse : char { PAUSE_RESPONSE_WAIT_FOR, PAUSE_RESPONSE_EXTRUDE_MORE, @@ -109,7 +107,7 @@ void wait_for_confirmation( void resume_print( const_float_t slow_load_length=0, // (mm) Slow Load Length for finishing move const_float_t fast_load_length=0, // (mm) Fast Load Length for initial move - const_float_t extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, // (mm) Purge length + const_float_t purge_length=ADVANCED_PAUSE_PURGE_LENGTH, // (mm) Purge length const int8_t max_beep_count=0, // Beep alert for attention const celsius_t targetTemp=0 // (°C) A target temperature for the hotend DXC_PARAMS // Dual-X-Carriage extruder index @@ -118,7 +116,7 @@ void resume_print( bool load_filament( const_float_t slow_load_length=0, // (mm) Slow Load Length for finishing move const_float_t fast_load_length=0, // (mm) Fast Load Length for initial move - const_float_t extrude_length=0, // (mm) Purge length + const_float_t purge_length=0, // (mm) Purge length const int8_t max_beep_count=0, // Beep alert for attention const bool show_lcd=false, // Set LCD status messages? const bool pause_for_user=false, // Pause for user before returning? diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index d36233d73d98..0ab045bda37a 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -1169,7 +1169,7 @@ void MarlinUI::draw_status_screen() { lcd_moveto(LCD_WIDTH - 9, 2); lcd_put_lchar('S'); - + #endif // LCD_INFO_SCREEN_STYLE diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index aaa8fb65e837..dca18f2125ff 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1668,7 +1668,7 @@ void MarlinUI::host_notify(const char * const cstr) { card.abortFilePrintSoon(); else if (card.isMounted()) card.closefile(); - #endif + #endif #ifdef ACTION_ON_CANCEL hostui.cancel(); #endif From 9a570b23a3be455e9bf5f2a5b8355f42c0957ca1 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 11 Apr 2024 12:07:54 +0000 Subject: [PATCH 064/111] [cron] Bump distribution date (2024-04-11) --- 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 412c144adc28..4bdfcdaebbde 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 "2024-04-10" +//#define STRING_DISTRIBUTION_DATE "2024-04-11" /** * 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 771e9b593f88..cb598b58adae 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 "2024-04-10" + #define STRING_DISTRIBUTION_DATE "2024-04-11" #endif /** From 2715e5ba1b2015b4e25d4b5c27505e753d2aa4d4 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 13 Apr 2024 02:29:59 -0400 Subject: [PATCH 065/111] =?UTF-8?q?=F0=9F=90=9BFix=20IDEX=20X2=20Direction?= =?UTF-8?q?=20(#26958)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix IDEX X2 Direction * Sanity Check IDEX X1_MAX_POS --- Marlin/src/inc/Conditionals_adv.h | 6 ++++++ Marlin/src/inc/SanityCheck.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index aa55731d90ab..78da97f67b96 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -954,6 +954,12 @@ #define HAS_MOTOR_CURRENT_I2C 1 #endif +#if ENABLED(DUAL_X_CARRIAGE) + #ifndef INVERT_X2_DIR + #define INVERT_X2_DIR INVERT_X_DIR + #endif +#endif + // X2 but not IDEX => Dual Synchronized X Steppers #if defined(X2_DRIVER_TYPE) && DISABLED(DUAL_X_CARRIAGE) #define HAS_SYNCED_X_STEPPERS 1 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index eea7d15d9bbe..392d75675e2d 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1837,6 +1837,8 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #error "DUAL_X_CARRIAGE requires X2_HOME_POS, X2_MIN_POS, and X2_MAX_POS." #elif X_HOME_TO_MAX #error "DUAL_X_CARRIAGE requires X_HOME_DIR -1." + #elif (X2_HOME_POS <= X1_MAX_POS) || (X2_MAX_POS < X1_MAX_POS) + #error "DUAL_X_CARRIAGE will crash if X1 can meet or exceed X2 travel." #endif #endif From 6575dcc803d71b38cf0bb922f8d048c867142db7 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 13 Apr 2024 02:40:59 -0400 Subject: [PATCH 066/111] =?UTF-8?q?=F0=9F=A9=B9=20Reduce=20Kill=20Pin=20Wa?= =?UTF-8?q?it=20(#26945)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reduce kill pin wait time, and allow override by setting KILL_DELAY --- Marlin/src/MarlinCore.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 272e50340a2d..97e7c32bf6a2 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -474,11 +474,16 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { #if HAS_KILL - // Check if the kill button was pressed and wait just in case it was an accidental - // key kill key press + // Check if the kill button was pressed and wait to ensure the signal is not noise + // typically caused by poor insulation and grounding on LCD cables. + // Lower numbers here will increase response time and therefore safety rating. + // It is recommended to set this as low as possibe without false triggers. // ------------------------------------------------------------------------------- + #ifndef KILL_DELAY + #define KILL_DELAY 250 + #endif + static int killCount = 0; // make the inactivity button a bit less responsive - const int KILL_DELAY = 750; if (kill_state()) killCount++; else if (killCount > 0) From 71d9a3e1dfa55edd5ec737a4f4ca82e9f2a11d32 Mon Sep 17 00:00:00 2001 From: Vovodroid Date: Sat, 13 Apr 2024 10:04:34 +0300 Subject: [PATCH 067/111] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20M413=20report=20(#?= =?UTF-8?q?26846)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/feature/powerloss/M413.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp index 733a34484cb7..b12257b4e55b 100644 --- a/Marlin/src/gcode/feature/powerloss/M413.cpp +++ b/Marlin/src/gcode/feature/powerloss/M413.cpp @@ -72,6 +72,7 @@ void GcodeSuite::M413_report(const bool forReplay/*=true*/) { , " B", recovery.bed_temp_threshold #endif ); + SERIAL_ECHO(" ; "); serialprintln_onoff(recovery.enabled); } From 9e88eb6100a30761bde51294814c5a4ddff72278 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 13 Apr 2024 12:06:36 +0000 Subject: [PATCH 068/111] [cron] Bump distribution date (2024-04-13) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 4bdfcdaebbde..113c27fe54a7 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 "2024-04-11" +//#define STRING_DISTRIBUTION_DATE "2024-04-13" /** * 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 cb598b58adae..1fa8ce961fa7 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 "2024-04-11" + #define STRING_DISTRIBUTION_DATE "2024-04-13" #endif /** From d99e150097ddfd9cf369c4643888622769e147fb Mon Sep 17 00:00:00 2001 From: David Buezas Date: Sat, 13 Apr 2024 18:54:25 +0200 Subject: [PATCH 069/111] =?UTF-8?q?=E2=9A=A1=EF=B8=8FReduce=20DISPLAY=5FSL?= =?UTF-8?q?EEP=5FMINUTES=20overhead=20(#26964)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index a96d8e300287..06a234d04d09 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -377,7 +377,13 @@ void MarlinUI::draw_kill_screen() { void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop #if HAS_DISPLAY_SLEEP - void MarlinUI::sleep_display(const bool sleep/*=true*/) { sleep ? u8g.sleepOn() : u8g.sleepOff(); } + void MarlinUI::sleep_display(const bool sleep/*=true*/) { + static bool asleep = false; + if (asleep != sleep){ + sleep ? u8g.sleepOn() : u8g.sleepOff(); + asleep = sleep; + } + } #endif #if HAS_LCD_BRIGHTNESS From cf7c86d5815e604a7be13f570761514d5897bbd4 Mon Sep 17 00:00:00 2001 From: Andrew <18502096+classicrocker883@users.noreply.github.com> Date: Sat, 13 Apr 2024 14:59:59 -0400 Subject: [PATCH 070/111] =?UTF-8?q?=F0=9F=94=A7Fix=20M936=20in=20features.?= =?UTF-8?q?ini=20(#26957)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ini/features.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ini/features.ini b/ini/features.ini index 1100216867bb..8999c8f23db8 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -314,7 +314,6 @@ HAS_ZV_SHAPING = build_src_filter=+ GRADIENT_MIX = build_src_filter=+ NONLINEAR_EXTRUSION = build_src_filter=+ -OTA_FIRMWARE_UPDATE = build_src_filter=+ HAS_SAVED_POSITIONS = build_src_filter=+ + PARK_HEAD_ON_PAUSE = build_src_filter=+ FILAMENT_LOAD_UNLOAD_GCODES = build_src_filter=+ @@ -340,6 +339,7 @@ TOUCH_SCREEN_CALIBRATION = build_src_filter=+ GCODE_MOTION_MODES = build_src_filter=+ BABYSTEPPING = build_src_filter=+ + +OTA_FIRMWARE_UPDATE = build_src_filter=+ Z_PROBE_SLED = build_src_filter=+ G38_PROBE_TARGET = build_src_filter=+ MAGNETIC_PARKING_EXTRUDER = build_src_filter=+ From d10861e478d60042a0836e95b8a22e7b68a1d9e5 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 13 Apr 2024 12:06:08 -0700 Subject: [PATCH 071/111] =?UTF-8?q?=E2=9C=85=20Add=20unit=20testing=20fram?= =?UTF-8?q?ework=20(#26948)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add a framework to build and execute unit tests for Marlin. - Enable unit test execution as part of PR checks. --------- Co-authored-by: Costas Basdekis Co-authored-by: Scott Lahteine --- .../{test-builds.yml => ci-build-tests.yml} | 6 +- .github/workflows/ci-unit-tests.yml | 73 ++++++++ Makefile | 34 +++- Marlin/src/HAL/LINUX/hardware/Timer.cpp | 5 +- Marlin/src/HAL/LINUX/main.cpp | 2 + Marlin/src/tests/marlin_tests.cpp | 35 ---- Marlin/tests/README.md | 5 + Marlin/tests/gcode/test_gcode.cpp | 58 +++++++ Marlin/tests/runout/test_runout_sensor.cpp | 36 ++++ Marlin/tests/types/test_types.cpp | 160 ++++++++++++++++++ README.md | 104 +++++------- buildroot/bin/restore_configs | 2 +- .../PlatformIO/scripts/collect-code-tests.py | 59 +++++++ .../PlatformIO/scripts/preflight-checks.py | 4 +- ini/native.ini | 15 +- test/001-default.ini | 8 + test/002-extruders_1_runout.ini | 18 ++ test/003-extruders_3_runout.ini | 32 ++++ test/README.md | 40 +++++ test/unit_tests.cpp | 52 ++++++ test/unit_tests.h | 73 ++++++++ 21 files changed, 710 insertions(+), 111 deletions(-) rename .github/workflows/{test-builds.yml => ci-build-tests.yml} (98%) create mode 100644 .github/workflows/ci-unit-tests.yml create mode 100644 Marlin/tests/README.md create mode 100644 Marlin/tests/gcode/test_gcode.cpp create mode 100644 Marlin/tests/runout/test_runout_sensor.cpp create mode 100644 Marlin/tests/types/test_types.cpp create mode 100644 buildroot/share/PlatformIO/scripts/collect-code-tests.py create mode 100644 test/001-default.ini create mode 100644 test/002-extruders_1_runout.ini create mode 100644 test/003-extruders_3_runout.ini create mode 100644 test/README.md create mode 100644 test/unit_tests.cpp create mode 100644 test/unit_tests.h diff --git a/.github/workflows/test-builds.yml b/.github/workflows/ci-build-tests.yml similarity index 98% rename from .github/workflows/test-builds.yml rename to .github/workflows/ci-build-tests.yml index a3cf32739c92..ad37100d6031 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/ci-build-tests.yml @@ -1,9 +1,9 @@ # -# test-builds.yml +# ci-build-tests.yml # Do test builds to catch compile errors # -name: CI +name: CI - Build Tests on: pull_request: @@ -27,7 +27,7 @@ on: jobs: test_builds: - name: Run All Tests + name: Build Test if: github.repository == 'MarlinFirmware/Marlin' runs-on: ubuntu-latest diff --git a/.github/workflows/ci-unit-tests.yml b/.github/workflows/ci-unit-tests.yml new file mode 100644 index 000000000000..caed5b1fbc95 --- /dev/null +++ b/.github/workflows/ci-unit-tests.yml @@ -0,0 +1,73 @@ +# +# ci-unit-tests.yml +# Build and execute unit tests to catch functional issues in code +# + +name: CI - Unit Tests + +on: + pull_request: + branches: + - bugfix-2.1.x + # Cannot be enabled on 2.1.x until it contains the unit test framework + #- 2.1.x + paths-ignore: + - config/** + - data/** + - docs/** + - '**/*.md' + push: + branches: + - bugfix-2.1.x + # Cannot be enabled on 2.1.x until it contains the unit test framework + #- 2.1.x + paths-ignore: + - config/** + - data/** + - docs/** + - '**/*.md' + +jobs: + # This runs all unit tests as a single job. While it should be possible to break this up into + # multiple jobs, they currently run quickly and finish long before the compilation tests. + run_unit_tests: + name: Unit Test + # These tests will only be able to run on the bugfix-2.1.x branch, until the next release + # pulls them into additional branches. + if: github.repository == 'MarlinFirmware/Marlin' + + runs-on: ubuntu-latest + + steps: + - name: Check out the PR + uses: actions/checkout@v4 + + - name: Cache pip + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Cache PlatformIO + uses: actions/cache@v4 + with: + path: ~/.platformio + key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} + + - name: Select Python 3.9 + uses: actions/setup-python@v5 + with: + python-version: '3.9' + architecture: 'x64' + + - name: Install PlatformIO + run: | + pip install -U platformio + pio upgrade --dev + pio pkg update --global + + - name: Run All Unit Tests + run: | + make unit-test-all-local diff --git a/Makefile b/Makefile index bc26173aaf36..029ab3ada13f 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,12 @@ help: @echo "make tests-single-local-docker : Run a single test locally, using docker" @echo "make tests-all-local : Run all tests locally" @echo "make tests-all-local-docker : Run all tests locally, using docker" - @echo "make setup-local-docker : Build the local docker image" +# @echo "make unit-test-single-ci : Run a single code test from inside the CI" +# @echo "make unit-test-single-local : Run a single code test locally" +# @echo "make unit-test-single-local-docker : Run a single code test locally, using docker-compose" + @echo "make unit-test-all-local : Run all code tests locally" + @echo "make unit-test-all-local-docker : Run all code tests locally, using docker-compose" + @echo "make setup-local-docker : Setup local docker-compose" @echo "" @echo "Options for testing:" @echo " TEST_TARGET Set when running tests-single-*, to select the" @@ -43,7 +48,7 @@ tests-single-local: tests-single-local-docker: @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET= or use make tests-all-local-docker" ; return 1; fi @if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi - $(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)" + $(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)" tests-all-local: export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \ @@ -52,10 +57,31 @@ tests-all-local: tests-all-local-docker: @if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi - $(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) $(MAKE) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) + $(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) + +#unit-test-single-ci: +# export GIT_RESET_HARD=true +# $(MAKE) unit-test-single-local TEST_TARGET=$(TEST_TARGET) + +# TODO: How can we limit tests with ONLY_TEST with platformio? +#unit-test-single-local: +# @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET= or use make unit-test-all-local" ; return 1; fi +# platformio run -t marlin_$(TEST_TARGET) + +#unit-test-single-local-docker: +# @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET= or use make unit-test-all-local-docker" ; return 1; fi +# @if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi +# $(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-single-local TEST_TARGET=$(TEST_TARGET) ONLY_TEST="$(ONLY_TEST)" + +unit-test-all-local: + platformio run -t test-marlin -e linux_native_test + +unit-test-all-local-docker: + @if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi + $(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-all-local setup-local-docker: - $(CONTAINER_RT_BIN) build -t $(CONTAINER_IMAGE) -f docker/Dockerfile . + $(CONTAINER_RT_BIN) buildx build -t $(CONTAINER_IMAGE) -f docker/Dockerfile . PINS := $(shell find Marlin/src/pins -mindepth 2 -name '*.h') diff --git a/Marlin/src/HAL/LINUX/hardware/Timer.cpp b/Marlin/src/HAL/LINUX/hardware/Timer.cpp index 9f0d6a8f3ae2..013690a404bf 100644 --- a/Marlin/src/HAL/LINUX/hardware/Timer.cpp +++ b/Marlin/src/HAL/LINUX/hardware/Timer.cpp @@ -37,7 +37,10 @@ Timer::Timer() { } Timer::~Timer() { - timer_delete(timerid); + if (timerid != 0) { + timer_delete(timerid); + timerid = 0; + } } void Timer::init(uint32_t sig_id, uint32_t sim_freq, callback_fn* fn) { diff --git a/Marlin/src/HAL/LINUX/main.cpp b/Marlin/src/HAL/LINUX/main.cpp index f2af2ff33f52..27a066d619ce 100644 --- a/Marlin/src/HAL/LINUX/main.cpp +++ b/Marlin/src/HAL/LINUX/main.cpp @@ -21,6 +21,7 @@ */ #ifdef __PLAT_LINUX__ +#ifndef UNIT_TEST //#define GPIO_LOGGING // Full GPIO and Positional Logging @@ -135,4 +136,5 @@ int main() { read_serial.join(); } +#endif // UNIT_TEST #endif // __PLAT_LINUX__ diff --git a/Marlin/src/tests/marlin_tests.cpp b/Marlin/src/tests/marlin_tests.cpp index f61f840176f2..89e5664345d8 100644 --- a/Marlin/src/tests/marlin_tests.cpp +++ b/Marlin/src/tests/marlin_tests.cpp @@ -37,41 +37,6 @@ // Startup tests are run at the end of setup() void runStartupTests() { // Call post-setup tests here to validate behaviors. - - // String with cutoff at 20 chars: - // "F-string, 1234.50, 2" - SString<20> str20; - str20 = F("F-string, "); - str20.append(1234.5f).append(',').append(' ') - .append(2345.67).append(',').append(' ') - .echoln(); - - // Truncate to "F-string" - str20.trunc(8).echoln(); - - // 100 dashes, but chopped down to DEFAULT_MSTRING_SIZE (20) - TSS(repchr_t('-', 100)).echoln(); - - // Hello World!-123456------ str(F("Hello")); - str.append(F(" World!")); - str += '-'; - str += uint8_t(123); - str += F("456"); - str += repchr_t('-', 6); - str += Spaces(3); - str += "< spaces!"; - str += int8_t(33); - str.eol(); - str += "^ eol!"; - - str.append("...", 1234.5f, '*', p_float_t(2345.602, 3), F(" = "), 1234.5 * 2345.602).echoln(); - - // Print it again with SERIAL_ECHOLN - auto print_char_ptr = [](char * const str) { SERIAL_ECHOLN(str); }; - print_char_ptr(str); - } // Periodic tests are run from within loop() diff --git a/Marlin/tests/README.md b/Marlin/tests/README.md new file mode 100644 index 000000000000..883069f044bd --- /dev/null +++ b/Marlin/tests/README.md @@ -0,0 +1,5 @@ +These test files are executed by the unit-tests built from the `/test` folder. + +These are placed outside of the main PlatformIO test folder so we can collect all test files and compile them into multiple PlatformIO test binaries. This enables tests to be executed against a variety of Marlin configurations. + +To execute these tests, refer to the top-level Makefile. diff --git a/Marlin/tests/gcode/test_gcode.cpp b/Marlin/tests/gcode/test_gcode.cpp new file mode 100644 index 000000000000..be364cb90550 --- /dev/null +++ b/Marlin/tests/gcode/test_gcode.cpp @@ -0,0 +1,58 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2024 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../test/unit_tests.h" +#include +#include + +MARLIN_TEST(gcode, process_parsed_command) { + GcodeSuite suite; + parser.command_letter = 'G'; + parser.codenum = 0; + suite.process_parsed_command(false); +} + +MARLIN_TEST(gcode, parse_g1_xz) { + char current_command[] = "G0 X10 Z30"; + parser.command_letter = -128; + parser.codenum = -1; + parser.parse(current_command); + TEST_ASSERT_EQUAL('G', parser.command_letter); + TEST_ASSERT_EQUAL(0, parser.codenum); + TEST_ASSERT_TRUE(parser.seen('X')); + TEST_ASSERT_FALSE(parser.seen('Y')); + TEST_ASSERT_TRUE(parser.seen('Z')); + TEST_ASSERT_FALSE(parser.seen('E')); +} + +MARLIN_TEST(gcode, parse_g1_nxz) { + char current_command[] = "N123 G0 X10 Z30"; + parser.command_letter = -128; + parser.codenum = -1; + parser.parse(current_command); + TEST_ASSERT_EQUAL('G', parser.command_letter); + TEST_ASSERT_EQUAL(0, parser.codenum); + TEST_ASSERT_TRUE(parser.seen('X')); + TEST_ASSERT_FALSE(parser.seen('Y')); + TEST_ASSERT_TRUE(parser.seen('Z')); + TEST_ASSERT_FALSE(parser.seen('E')); +} diff --git a/Marlin/tests/runout/test_runout_sensor.cpp b/Marlin/tests/runout/test_runout_sensor.cpp new file mode 100644 index 000000000000..2719446437fa --- /dev/null +++ b/Marlin/tests/runout/test_runout_sensor.cpp @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2024 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../test/unit_tests.h" + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + +#include + +MARLIN_TEST(runout, poll_runout_states) { + FilamentSensorBase sensor; + // Expected default value is one bit set for each extruder + uint8_t expected = static_cast(~(~0u << NUM_RUNOUT_SENSORS)); + TEST_ASSERT_EQUAL(expected, sensor.poll_runout_states()); +} + +#endif diff --git a/Marlin/tests/types/test_types.cpp b/Marlin/tests/types/test_types.cpp new file mode 100644 index 000000000000..11ed19f4c3b1 --- /dev/null +++ b/Marlin/tests/types/test_types.cpp @@ -0,0 +1,160 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2024 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../test/unit_tests.h" +#include "src/core/types.h" + +MARLIN_TEST(types, XYval_const_as_bools) { + const XYval xy_const_true = {1, 2}; + TEST_ASSERT_TRUE(xy_const_true); + + const XYval xy_const_false = {0, 0}; + TEST_ASSERT_FALSE(xy_const_false); +} + +MARLIN_TEST(types, XYval_non_const_as_bools) { + XYval xy_true = {1, 2}; + TEST_ASSERT_TRUE(xy_true); + + XYval xy_false = {0, 0}; + TEST_ASSERT_FALSE(xy_false); +} + +MARLIN_TEST(types, XYZval_const_as_bools) { + const XYZval xyz_const_true = {1, 2, 3}; + TEST_ASSERT_TRUE(xyz_const_true); + + const XYZval xyz_const_false = {0, 0, 0}; + TEST_ASSERT_FALSE(xyz_const_false); +} + +MARLIN_TEST(types, XYZval_non_const_as_bools) { + XYZval xyz_true = {1, 2, 3}; + TEST_ASSERT_TRUE(xyz_true); + + XYZval xyz_false = {0, 0, 0}; + TEST_ASSERT_FALSE(xyz_false); +} + +MARLIN_TEST(types, XYZEval_const_as_bools) { + const XYZEval xyze_const_true = {1, 2, 3, 4}; + TEST_ASSERT_TRUE(xyze_const_true); + + const XYZEval xyze_const_false = {0, 0, 0, 0}; + TEST_ASSERT_FALSE(xyze_const_false); +} + +MARLIN_TEST(types, XYZEval_non_const_as_bools) { + XYZEval xyze_true = {1, 2, 3, 4}; + TEST_ASSERT_TRUE(xyze_true); + + XYZEval xyze_false = {0, 0, 0, 0}; + TEST_ASSERT_FALSE(xyze_false); +} + +MARLIN_TEST(types, Flags_const_as_bools) { + const Flags<32> flags_const_false = {0}; + TEST_ASSERT_FALSE(flags_const_false); + + const Flags<32> flags_const_true = {1}; + TEST_ASSERT_TRUE(flags_const_true); +} + +MARLIN_TEST(types, Flags_non_const_as_bools) { + Flags<32> flags_false = {0}; + TEST_ASSERT_FALSE(flags_false); + + Flags<32> flags_true = {1}; + TEST_ASSERT_TRUE(flags_true); +} + +MARLIN_TEST(types, AxisFlags_const_as_bools) { + const AxisFlags axis_flags_const_false = {0}; + TEST_ASSERT_FALSE(axis_flags_const_false); + + const AxisFlags axis_flags_const_true = {1}; + TEST_ASSERT_TRUE(axis_flags_const_true); +} + +MARLIN_TEST(types, AxisFlags_non_const_as_bools) { + AxisFlags axis_flags_false = {0}; + TEST_ASSERT_FALSE(axis_flags_false); + + AxisFlags axis_flags_true = {1}; + TEST_ASSERT_TRUE(axis_flags_true); +} + +MARLIN_TEST(types, AxisBits_const_as_bools) { + const AxisBits axis_bits_const_false = {0}; + TEST_ASSERT_FALSE(axis_bits_const_false); + + const AxisBits axis_bits_const_true = {1}; + TEST_ASSERT_TRUE(axis_bits_const_true); +} + +MARLIN_TEST(types, AxisBits_non_const_as_bools) { + AxisBits axis_bits_false = {0}; + TEST_ASSERT_FALSE(axis_bits_false); + + AxisBits axis_bits_true = {1}; + TEST_ASSERT_TRUE(axis_bits_true); +} + +MARLIN_TEST(types, MString1) { + // String with cutoff at 20 chars: + // "F-string, 1234.50, 2" + MString<20> str20; + str20 = F("F-string, "); + str20.append(1234.5f).append(',').append(' ') + .append(2345.67).append(',').append(' '); + + TEST_ASSERT_TRUE(strcmp_P(str20, PSTR("F-string, 1234.50, 2")) == 0); + + // Truncate to "F-string" + str20.trunc(8); + + TEST_ASSERT_FALSE(strcmp_P(&str20, PSTR("F-string")) != 0); +} + +MARLIN_TEST(types, MString2) { + // 100 dashes, but chopped down to DEFAULT_MSTRING_SIZE (20) + TEST_ASSERT_TRUE(TSS(repchr_t('-', 100)).length() == 20); +} + +MARLIN_TEST(types, SString) { + // Hello World!-123456------ < spaces!33 + // ^ eol! ... 1234.50*2345.602 = 2895645.67 + SString<100> str(F("Hello")); + str.append(F(" World!")); + str += '-'; + str += uint8_t(123); + str += F("456"); + str += repchr_t('-', 6); + str += Spaces(3); + str += "< spaces!"; + str += int8_t(33); + str.eol(); + str += "^ eol!"; + str.append(" ... ", 1234.5f, '*', p_float_t(2345.602, 3), F(" = "), 1234.5 * 2345.602); + + TEST_ASSERT_TRUE(strcmp_P(str, PSTR("Hello World!-123456------ < spaces!33\n^ eol! ... 1234.50*2345.602 = 2895645.67")) == 0); +} diff --git a/README.md b/README.md index 83614ad9ccef..efbba1de27a6 100644 --- a/README.md +++ b/README.md @@ -39,16 +39,16 @@ To build and upload Marlin you will use one of these tools: Marlin is optimized to build with the **PlatformIO IDE** extension for **Visual Studio Code**. You can still build Marlin with **Arduino IDE**, and we hope to improve the Arduino build experience, but at this time PlatformIO is the better choice. +## 8-Bit AVR Boards + +We intend to continue supporting 8-bit AVR boards in perpetuity, maintaining a single codebase that can apply to all machines. We want casual hobbyists and tinkerers and owners of older machines to benefit from the community's innovations just as much as those with fancier machines. Plus, those old AVR-based machines are often the best for your testing and feedback! + ## Hardware Abstraction Layer (HAL) Marlin includes an abstraction layer to provide a common API for all the platforms it targets. This allows Marlin code to address the details of motion and user interface tasks at the lowest and highest levels with no system overhead, tying all events directly to the hardware clock. Every new HAL opens up a world of hardware. At this time we need HALs for RP2040 and the Duet3D family of boards. A HAL that wraps an RTOS is an interesting concept that could be explored. Did you know that Marlin includes a Simulator that can run on Windows, macOS, and Linux? Join the Discord to help move these sub-projects forward! -## 8-Bit AVR Boards - -A core tenet of this project is to keep supporting 8-bit AVR boards while also maintaining a single codebase that applies equally to all machines. We want casual hobbyists to benefit from the community's innovations as much as possible just as much as those with fancier machines. Plus, those old AVR-based machines are often the best for your testing and feedback! - ### Supported Platforms Platform|MCU|Example Boards @@ -71,22 +71,9 @@ A core tenet of this project is to keep supporting 8-bit AVR boards while also m [Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|ARM® Cortex-M7| Linux Native|x86/ARM/etc.|Raspberry Pi -## Submitting Patches - -Proposed patches should be submitted as a Pull Request against the ([bugfix-2.1.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.1.x)) branch. - -- This branch is for fixing bugs and integrating any new features for the duration of the Marlin 2.1.x life-cycle. -- Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers. -- Please submit Feature Requests and Bug Reports to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues/new/choose). Support resources are also listed there. -- Whenever you add new features, be sure to add tests to `buildroot/tests` and then run your tests locally, if possible. - - It's optional: Running all the tests on Windows might take a long time, and they will run anyway on GitHub. - - If you're running the tests on Linux (or on WSL with the code on a Linux volume) the speed is much faster. - - You can use `make tests-all-local` or `make tests-single-local TEST_TARGET=...`. - - If you prefer Docker you can use `make tests-all-local-docker` or `make tests-all-local-docker TEST_TARGET=...`. - ## Marlin Support -The Issue Queue is reserved for Bug Reports and Feature Requests. To get help with configuration and troubleshooting, please use the following resources: +The Issue Queue is reserved for Bug Reports and Feature Requests. Please use the following resources for help with configuration and troubleshooting: - [Marlin Documentation](https://marlinfw.org) - Official Marlin documentation - [Marlin Discord](https://discord.gg/n5NJ59y) - Discuss issues with Marlin users and developers @@ -95,59 +82,48 @@ The Issue Queue is reserved for Bug Reports and Feature Requests. To get help wi - Facebook Group ["Marlin Firmware for 3D Printers"](https://www.facebook.com/groups/3Dtechtalk/) - [Marlin Configuration](https://www.youtube.com/results?search_query=marlin+configuration) on YouTube -## Contributors - -Marlin is constantly improving thanks to a huge number of contributors from all over the world bringing their specialties and talents. Huge thanks are due to [all the contributors](https://github.com/MarlinFirmware/Marlin/graphs/contributors) who regularly patch up bugs, help direct traffic, and basically keep Marlin from falling apart. Marlin's continued existence would not be possible without them. - -## Administration +## Contributing Patches -Regular users can open and close their own issues, but only the administrators can do project-related things like add labels, merge changes, set milestones, and kick trolls. The current Marlin admin team consists of: +You can contribute patches by submitting a Pull Request to the ([bugfix-2.1.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.1.x)) branch. - - - -
Project Maintainer
- - 🇺🇸  **Scott Lahteine** -       [@thinkyhead](https://github.com/thinkyhead) -       [  Donate 💸  ](https://www.thinkyhead.com/donate-to-marlin) - - - - 🇺🇸  **Roxanne Neufeld** -       [@Roxy-3D](https://github.com/Roxy-3D) - - 🇺🇸  **Keith Bennett** -       [@thisiskeithb](https://github.com/thisiskeithb) -       [  Donate 💸  ](https://github.com/sponsors/thisiskeithb) - - 🇺🇸  **Jason Smith** -       [@sjasonsmith](https://github.com/sjasonsmith) - - - - 🇧🇷  **Victor Oliveira** -       [@rhapsodyv](https://github.com/rhapsodyv) - - 🇬🇧  **Chris Pepper** -       [@p3p](https://github.com/p3p) - -🇳🇿  **Peter Ellens** -       [@ellensp](https://github.com/ellensp) -       [  Donate 💸  ](https://ko-fi.com/ellensp) +- We use branches named with a "bugfix" or "dev" prefix to fix bugs and integrate new features. +- Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers. +- Please submit Feature Requests and Bug Reports to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues/new/choose). See above for user support. +- Whenever you add new features, be sure to add one or more build tests to `buildroot/tests`. Any tests added to a PR will be run within that PR on GitHub servers as soon as they are pushed. To minimize iteration be sure to run your new tests locally, if possible. + - Local build tests: + - All: `make tests-config-all-local` + - Single: `make tests-config-single-local TEST_TARGET=...` + - Local build tests in Docker: + - All: `make tests-config-all-local-docker` + - Single: `make tests-config-all-local-docker TEST_TARGET=...` + - To run all unit test suites: + - Using PIO: `platformio run -t test-marlin` + - Using Make: `make unit-test-all-local` + - Using Docker + make: `maker unit-test-all-local-docker` + - To run a single unit test suite: + - Using PIO: `platformio run -t marlin_` + - Using make: `make unit-test-single-local TEST_TARGET=` + - Using Docker + make: `maker unit-test-single-local-docker TEST_TARGET=` +- If your feature can be unit tested, add one or more unit tests. For more information see our documentation on [Unit Tests](test). - +## Contributors - 🇺🇸  **Bob Kuhn** -       [@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn) +Marlin is constantly improving thanks to a huge number of contributors from all over the world bringing their specialties and talents. Huge thanks are due to [all the contributors](https://github.com/MarlinFirmware/Marlin/graphs/contributors) who regularly patch up bugs, help direct traffic, and basically keep Marlin from falling apart. Marlin's continued existence would not be possible without them. - 🇳🇱  **Erik van der Zalm** -       [@ErikZalm](https://github.com/ErikZalm) +## Project Leadership -
+Name|Role|Link|Donate +----|----|----|---- +🇺🇸 Scott Lahteine|Project Lead|[[@thinkyhead](https://github.com/thinkyhead)]|[💸 Donate](https://www.thinkyhead.com/donate-to-marlin) +🇺🇸 Roxanne Neufeld|Admin|[[@Roxy-3D](https://github.com/Roxy-3D)]| +🇺🇸 Keith Bennett|Admin|[[@thisiskeithb](https://github.com/thisiskeithb)]|[💸 Donate](https://github.com/sponsors/thisiskeithb) +🇺🇸 Jason Smith|Admin|[[@sjasonsmith](https://github.com/sjasonsmith)]| +🇧🇷 Victor Oliveira|Admin|[[@rhapsodyv](https://github.com/rhapsodyv)]| +🇬🇧 Chris Pepper|Admin|[[@p3p](https://github.com/p3p)]| +🇳🇿 Peter Ellens|Admin|[[@ellensp](https://github.com/ellensp)]|[💸 Donate](https://ko-fi.com/ellensp) +🇺🇸 Bob Kuhn|Admin|[[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)]| +🇳🇱 Erik van der Zalm|Founder|[[@ErikZalm](https://github.com/ErikZalm)]|[💸 Donate](https://flattr.com/submit/auto?user_id=ErikZalm&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software) ## License Marlin is published under the [GPL license](/LICENSE) because we believe in open development. The GPL comes with both rights and obligations. Whether you use Marlin firmware as the driver for your open or closed-source product, you must keep Marlin open, and you must provide your compatible Marlin source code to end users upon request. The most straightforward way to comply with the Marlin license is to make a fork of Marlin on Github, perform your modifications, and direct users to your modified fork. - -While we can't prevent the use of this code in products (3D printers, CNC, etc.) that are closed source or crippled by a patent, we would prefer that you choose another firmware or, better yet, make your own. diff --git a/buildroot/bin/restore_configs b/buildroot/bin/restore_configs index ea998484c243..51f72c579258 100755 --- a/buildroot/bin/restore_configs +++ b/buildroot/bin/restore_configs @@ -7,5 +7,5 @@ if [[ $1 == '-d' || $1 == '--default' ]]; then else git checkout Marlin/Configuration.h 2>/dev/null git checkout Marlin/Configuration_adv.h 2>/dev/null - git checkout Marlin/src/pins/ramps/pins_RAMPS.h 2>/dev/null + git checkout Marlin/src/pins/*/pins_*.h 2>/dev/null fi diff --git a/buildroot/share/PlatformIO/scripts/collect-code-tests.py b/buildroot/share/PlatformIO/scripts/collect-code-tests.py new file mode 100644 index 000000000000..a0e0e86b1176 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/collect-code-tests.py @@ -0,0 +1,59 @@ +# +# collect-code-tests.py +# Convenience script to collect all code tests. Used by env:linux_native_test in native.ini. +# + +import pioutil +if pioutil.is_pio_build(): + + import os, re + Import("env") + Import("projenv") + + os.environ['PATH'] = f"./buildroot/bin/:./buildroot/tests/:{os.environ['PATH']}" + + def collect_test_suites(): + """Get all the test suites""" + from pathlib import Path + return sorted(list(Path("./test").glob("*.ini"))) + + def register_test_suites(): + """Register all the test suites""" + targets = [] + test_suites = collect_test_suites() + for path in test_suites: + name = re.sub(r'^\d+-|\.ini$', '', path.name) + targets += [name]; + + env.AddCustomTarget( + name = f"marlin_{name}", + dependencies = None, + actions = [ + f"echo ====== Configuring for marlin_{name} ======", + "restore_configs", + f"cp -f {path} ./Marlin/config.ini", + "python ./buildroot/share/PlatformIO/scripts/configuration.py", + f"platformio test -e linux_native_test -f {name}", + "restore_configs", + ], + title = "Marlin: {}".format(name.lower().title().replace("_", " ")), + description = ( + f"Run a Marlin test suite, with the appropriate configuration, " + f"that sits in {path}" + ) + ) + + env.AddCustomTarget( + name = "test-marlin", + dependencies = None, + actions = [ + f"platformio run -t marlin_{name} -e linux_native_test" + for name in targets + ], + title = "Marlin: Test all code test suites", + description = ( + f"Run all Marlin code test suites ({len(targets)} found)." + ), + ) + + register_test_suites() diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 2e4ab5c92d54..2a5f98dbbfc5 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -71,7 +71,9 @@ def sanity_check_target(): config = env.GetProjectConfig() result = check_envs("env:"+build_env, board_envs, config) - if not result: + # Make sure board is compatible with the build environment. Skip for _test, + # since the board is manipulated as each unit test is executed. + if not result and build_env != "linux_native_test": err = "Error: Build environment '%s' is incompatible with %s. Use one of these environments: %s" % \ ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) raise SystemExit(err) diff --git a/ini/native.ini b/ini/native.ini index d07eaa22051e..332555ed0555 100644 --- a/ini/native.ini +++ b/ini/native.ini @@ -15,13 +15,24 @@ [env:linux_native] platform = native framework = -build_flags = -D__PLAT_LINUX__ -std=gnu++17 -ggdb -g -lrt -lpthread -D__MARLIN_FIRMWARE__ -Wno-expansion-to-defined +build_flags = ${common.build_flags} -D__PLAT_LINUX__ -std=gnu++17 -ggdb -g -lrt -lpthread -D__MARLIN_FIRMWARE__ -Wno-expansion-to-defined build_src_flags = -Wall -IMarlin/src/HAL/LINUX/include build_unflags = -Wall lib_ldf_mode = off -lib_deps = build_src_filter = ${common.default_src_filter} + +# Environment specifically for unit testing through the Makefile +# This is somewhat unorthodox, in that it uses the PlatformIO Unity testing framework, +# but actual targets are dynamically generated during the build. This seems to prevent +# Unity from being automatically included, so it is added here. +[env:linux_native_test] +extends = env:linux_native +extra_scripts = ${common.extra_scripts} + post:buildroot/share/PlatformIO/scripts/collect-code-tests.py +build_src_filter = ${env:linux_native.build_src_filter} + +lib_deps = throwtheswitch/Unity@^2.5.2 +test_build_src = true + # # Native Simulation # Builds with a small subset of available features diff --git a/test/001-default.ini b/test/001-default.ini new file mode 100644 index 000000000000..b98042cc2dcb --- /dev/null +++ b/test/001-default.ini @@ -0,0 +1,8 @@ +# This file should remain empty except for the motherboard. +# If changes are needed by tests, it should be performed in another configuration. + +[config:base] +ini_use_config = base + +# Unit tests must use BOARD_SIMULATED to run natively in Linux +motherboard = BOARD_SIMULATED diff --git a/test/002-extruders_1_runout.ini b/test/002-extruders_1_runout.ini new file mode 100644 index 000000000000..74afa0f02f21 --- /dev/null +++ b/test/002-extruders_1_runout.ini @@ -0,0 +1,18 @@ +# +# Test configuration with a single extruder and a filament runout sensor +# +[config:base] +ini_use_config = base + +# Unit tests must use BOARD_SIMULATED to run natively in Linux +motherboard = BOARD_SIMULATED + +# Options to support runout sensors test +filament_runout_sensor = on +fil_runout_pin = 4 # dummy +advanced_pause_feature = on +emergency_parser = on +nozzle_park_feature = on + +# Option to support testing parsing with parentheses comments enabled +paren_comments = on diff --git a/test/003-extruders_3_runout.ini b/test/003-extruders_3_runout.ini new file mode 100644 index 000000000000..4bd91e8b7cae --- /dev/null +++ b/test/003-extruders_3_runout.ini @@ -0,0 +1,32 @@ +# +# Test configuration with three extruders and filament runout sensors +# +[config:base] +ini_use_config = base + +# Unit tests must use BOARD_SIMULATED to run natively in Linux +motherboard = BOARD_SIMULATED + +# Options to support runout sensor tests on three extruders. +# Options marked "dummy" are simply required to pass sanity checks. +extruders = 3 +temp_sensor_1 = 1 +temp_sensor_2 = 1 +temp_2_pin = 4 # dummy +temp_3_pin = 4 # dummy +heater_2_pin = 4 # dummy +e2_step_pin = 4 # dummy +e2_dir_pin = 4 # dummy +e2_enable_pin = 4 # dummy +e3_step_pin = 4 # dummy +e3_dir_pin = 4 # dummy +e3_enable_pin = 4 # dummy +num_runout_sensors = 3 +filament_runout_sensor = on +fil_runout_pin = 4 # dummy +fil_runout2_pin = 4 # dummy +fil_runout3_pin = 4 # dummy +filament_runout_script = "M600 %%c" +advanced_pause_feature = on +emergency_parser = on +nozzle_park_feature = on diff --git a/test/README.md b/test/README.md new file mode 100644 index 000000000000..19b4cd7d5949 --- /dev/null +++ b/test/README.md @@ -0,0 +1,40 @@ +# Testing Marlin + +Marlin included two types of automated tests: +- [Build Tests](../buildroot/tests) to catch syntax and code build errors. +- Unit Tests (this folder) to catch implementation errors. + +This document focuses on Unit tests. + +## Unit tests + +Unit testing allows for functional testing of Marlin logic on a local machine. This strategy is available to all developers, and will be able to be used on generic GitHub workers to automate testing. While PlatformIO does support the execution of unit tests on target controllers, that is not yet implemented and not really practical. This would require dedicated testing labs, and would be less broadly usable than testing directly on the development or build machine. + +Unit tests verify the behavior of small discrete sections of Marlin code. By thoroughly unit testing important parts of Marlin code, we effectively provide "guard rails" which will prevent major regressions in behavior. As long as all submissions go through the Pull Request process and execute automated checks, it is possible to catch most major issues prior to completion of a PR. + +## What unit tests can and can't do + +Unit tests can be used to validate the logic of single functions or whole features, as long as that function or feature doesn't depend on real hardware. So, for example, we can test whether a G-code command is parsed correctly and produces all the expected state changes, but we can't test whether a G-code triggered an endstop or the filament runout sensor without adding a new layer to simulate pins. + +Generally speaking, the types of errors caught by unit tests are most often caught in the initial process of writing the tests, and thereafter they shore up the codebase against regressions, especially in core classes and types, which can be very useful for refactoring. + +### Unit test FAQ + +#### Q: Isn't writing unit tests a lot of work? +A: Yes, and it can be especially difficult with existing code that wasn't designed for unit testing. Some common sense should be used to decide where to employ unit testing, and at what level to perform it. While unit testing takes effort, it pays dividends in preventing regressions, and helping to pinpoint the source of failures when they do occur. + +#### Q: Will this make refactoring harder? +A: Yes and No. Of course if you refactor code that unit tests use directly, it will have to be reworked as well. It actually can make refactoring more efficient, by providing assurance that the mechanism still works as intended. + +#### Q: How can I debug one of these failing unit tests? +A: That's a great question, without a known immediate answer. It is likely possible to debug them interactively through PlatformIO, but that can at times take some creativity to configure. Unit tests are generally extremely small, so even without interactive debugging it can get you fairly close to the cause of the problem. + +### Unit test architecture +We are currently using [PlatformIO unit tests](https://docs.platformio.org/en/latest/plus/unit-testing.html). + +Since Marlin only compiles code required by the configuration, a separate test binary must be generated for any configuration change. The following process is used to unit test a variety of configurations: + +1. This folder contains a set of INI configuration files (See `config.ini`), each containing a distinct set of configuration options for unit testing. All applicable unit tests will be run for each of these configurations. +2. The `Marlin/tests` folder contains the CPP code for all Unit Tests. Marlin macros (`ENABLED(feature)`, `TERN(FEATURE, A, B)`, etc.) are used to determine which tests should be registered and to alter test behavior. +3. The `linux_native_test` PlatformIO environment specifies a script to collect all the tests from this folder and add them to PlatformIO's list of test targets. +4. Tests are built and executed by the `Makefile` commands `unit-test-all-local` or `unit-test-all-local-docker`. diff --git a/test/unit_tests.cpp b/test/unit_tests.cpp new file mode 100644 index 000000000000..0d9e568760b2 --- /dev/null +++ b/test/unit_tests.cpp @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2024 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 . + * + */ + +/** + * Provide the main() function used for all compiled unit test binaries. + * It collects all the tests defined in the code and runs them through Unity. + */ + +#include "unit_tests.h" + +static std::list all_marlin_tests; + +MarlinTest::MarlinTest(const std::string _name, const void(*_test)(), const int _line) +: name(_name), test(_test), line(_line) { + all_marlin_tests.push_back(this); +} + +void MarlinTest::run() { + UnityDefaultTestRun((UnityTestFunction)test, name.c_str(), line); +} + +void run_all_marlin_tests() { + for (const auto registration : all_marlin_tests) { + registration->run(); + } +} + +int main(int argc, char **argv) { + UNITY_BEGIN(); + run_all_marlin_tests(); + UNITY_END(); + return 0; +} diff --git a/test/unit_tests.h b/test/unit_tests.h new file mode 100644 index 000000000000..6f8387619a4b --- /dev/null +++ b/test/unit_tests.h @@ -0,0 +1,73 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2024 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include +#include +#include + +// Include MarlinConfig so configurations are available to all tests +#include "src/inc/MarlinConfig.h" + +/** + * Class that allows us to dynamically collect tests + */ +class MarlinTest { +public: + MarlinTest(const std::string name, const void(*test)(), const int line); + /** + * Run the test via Unity + */ + void run(); + + /** + * The name, a pointer to the function, and the line number. These are + * passed to the Unity test framework. + */ + const std::string name; + const void(*test)(); + const int line; +}; + +/** + * Internal macros used by MARLIN_TEST + */ +#define _MARLIN_TEST_CLASS_NAME(SUITE, NAME) MarlinTestClass_##SUITE##_##NAME +#define _MARLIN_TEST_INSTANCE_NAME(SUITE, NAME) MarlinTestClass_##SUITE##_##NAME##_instance + +/** + * Macro to define a test. This will create a class with the test body and + * register it with the global list of tests. + * + * Usage: + * MARLIN_TEST(test_suite_name, test_name) { + * // Test body + * } + */ +#define MARLIN_TEST(SUITE, NAME) \ + class _MARLIN_TEST_CLASS_NAME(SUITE, NAME) : public MarlinTest { \ + public: \ + _MARLIN_TEST_CLASS_NAME(SUITE, NAME)() : MarlinTest(#NAME, (const void(*)())&TestBody, __LINE__) {} \ + static void TestBody(); \ + }; \ + const _MARLIN_TEST_CLASS_NAME(SUITE, NAME) _MARLIN_TEST_INSTANCE_NAME(SUITE, NAME); \ + void _MARLIN_TEST_CLASS_NAME(SUITE, NAME)::TestBody() From 1bb4a042e26af49602816ef33fcd2f3f4f728329 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 13 Apr 2024 14:11:51 -0700 Subject: [PATCH 072/111] =?UTF-8?q?=E2=9C=85Unit=20test=20improvements=20(?= =?UTF-8?q?#26965)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Do not warn about display in unit tests * Treat warnings as errors in unit tests * Report actual filenames with unit tests --- Marlin/src/inc/Warnings.cpp | 2 +- ini/native.ini | 2 ++ test/unit_tests.cpp | 5 +++-- test/unit_tests.h | 5 +++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index 3a2153916f20..2c2a82497839 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -99,7 +99,7 @@ #warning "Warning! Don't use dummy thermistors (998/999) for final build!" #endif -#if NONE(HAS_RESUME_CONTINUE, HOST_PROMPT_SUPPORT) +#if NONE(HAS_RESUME_CONTINUE, HOST_PROMPT_SUPPORT, UNIT_TEST) #warning "Your Configuration provides no method to acquire user feedback!" #endif diff --git a/ini/native.ini b/ini/native.ini index 332555ed0555..9df621172d1b 100644 --- a/ini/native.ini +++ b/ini/native.ini @@ -32,6 +32,8 @@ extra_scripts = ${common.extra_scripts} build_src_filter = ${env:linux_native.build_src_filter} + lib_deps = throwtheswitch/Unity@^2.5.2 test_build_src = true +build_unflags = +build_flags = ${env:linux_native.build_flags} -Werror # # Native Simulation diff --git a/test/unit_tests.cpp b/test/unit_tests.cpp index 0d9e568760b2..e22aa529d0d4 100644 --- a/test/unit_tests.cpp +++ b/test/unit_tests.cpp @@ -29,12 +29,13 @@ static std::list all_marlin_tests; -MarlinTest::MarlinTest(const std::string _name, const void(*_test)(), const int _line) -: name(_name), test(_test), line(_line) { +MarlinTest::MarlinTest(const std::string _name, const void(*_test)(), const char *_file, const int _line) +: name(_name), test(_test), file(_file), line(_line) { all_marlin_tests.push_back(this); } void MarlinTest::run() { + Unity.TestFile = file.c_str(); UnityDefaultTestRun((UnityTestFunction)test, name.c_str(), line); } diff --git a/test/unit_tests.h b/test/unit_tests.h index 6f8387619a4b..53bb64074a1f 100644 --- a/test/unit_tests.h +++ b/test/unit_tests.h @@ -33,7 +33,7 @@ */ class MarlinTest { public: - MarlinTest(const std::string name, const void(*test)(), const int line); + MarlinTest(const std::string name, const void(*test)(), const char *_file, const int line); /** * Run the test via Unity */ @@ -45,6 +45,7 @@ class MarlinTest { */ const std::string name; const void(*test)(); + const std::string file; const int line; }; @@ -66,7 +67,7 @@ class MarlinTest { #define MARLIN_TEST(SUITE, NAME) \ class _MARLIN_TEST_CLASS_NAME(SUITE, NAME) : public MarlinTest { \ public: \ - _MARLIN_TEST_CLASS_NAME(SUITE, NAME)() : MarlinTest(#NAME, (const void(*)())&TestBody, __LINE__) {} \ + _MARLIN_TEST_CLASS_NAME(SUITE, NAME)() : MarlinTest(#SUITE "___" #NAME, (const void(*)())&TestBody, __FILE__, __LINE__) {} \ static void TestBody(); \ }; \ const _MARLIN_TEST_CLASS_NAME(SUITE, NAME) _MARLIN_TEST_INSTANCE_NAME(SUITE, NAME); \ From 0683e8a9a3fc79481376c82528d6850c01ec5bd0 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 14 Apr 2024 00:24:15 +0000 Subject: [PATCH 073/111] [cron] Bump distribution date (2024-04-14) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 113c27fe54a7..6612c2f640ff 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 "2024-04-13" +//#define STRING_DISTRIBUTION_DATE "2024-04-14" /** * 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 1fa8ce961fa7..ad30d749778c 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 "2024-04-13" + #define STRING_DISTRIBUTION_DATE "2024-04-14" #endif /** From 52a561399eb5bf9f60106e0fa6a74a50e7522e5a Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 13 Apr 2024 17:47:16 -0700 Subject: [PATCH 074/111] =?UTF-8?q?=E2=8F=AA=EF=B8=8F=20Revert=20unintende?= =?UTF-8?q?d=20README=20changes=20(#26967)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert all the changes that went in with the unit test framework This restored broken links and other changes. Restoring to the prior revision seems the most appropriate action until the intentions of those file changes are known. --------- Co-authored-by: Jason Smith --- README.md | 104 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 64 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index efbba1de27a6..83614ad9ccef 100644 --- a/README.md +++ b/README.md @@ -39,16 +39,16 @@ To build and upload Marlin you will use one of these tools: Marlin is optimized to build with the **PlatformIO IDE** extension for **Visual Studio Code**. You can still build Marlin with **Arduino IDE**, and we hope to improve the Arduino build experience, but at this time PlatformIO is the better choice. -## 8-Bit AVR Boards - -We intend to continue supporting 8-bit AVR boards in perpetuity, maintaining a single codebase that can apply to all machines. We want casual hobbyists and tinkerers and owners of older machines to benefit from the community's innovations just as much as those with fancier machines. Plus, those old AVR-based machines are often the best for your testing and feedback! - ## Hardware Abstraction Layer (HAL) Marlin includes an abstraction layer to provide a common API for all the platforms it targets. This allows Marlin code to address the details of motion and user interface tasks at the lowest and highest levels with no system overhead, tying all events directly to the hardware clock. Every new HAL opens up a world of hardware. At this time we need HALs for RP2040 and the Duet3D family of boards. A HAL that wraps an RTOS is an interesting concept that could be explored. Did you know that Marlin includes a Simulator that can run on Windows, macOS, and Linux? Join the Discord to help move these sub-projects forward! +## 8-Bit AVR Boards + +A core tenet of this project is to keep supporting 8-bit AVR boards while also maintaining a single codebase that applies equally to all machines. We want casual hobbyists to benefit from the community's innovations as much as possible just as much as those with fancier machines. Plus, those old AVR-based machines are often the best for your testing and feedback! + ### Supported Platforms Platform|MCU|Example Boards @@ -71,9 +71,22 @@ Every new HAL opens up a world of hardware. At this time we need HALs for RP2040 [Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|ARM® Cortex-M7| Linux Native|x86/ARM/etc.|Raspberry Pi +## Submitting Patches + +Proposed patches should be submitted as a Pull Request against the ([bugfix-2.1.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.1.x)) branch. + +- This branch is for fixing bugs and integrating any new features for the duration of the Marlin 2.1.x life-cycle. +- Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers. +- Please submit Feature Requests and Bug Reports to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues/new/choose). Support resources are also listed there. +- Whenever you add new features, be sure to add tests to `buildroot/tests` and then run your tests locally, if possible. + - It's optional: Running all the tests on Windows might take a long time, and they will run anyway on GitHub. + - If you're running the tests on Linux (or on WSL with the code on a Linux volume) the speed is much faster. + - You can use `make tests-all-local` or `make tests-single-local TEST_TARGET=...`. + - If you prefer Docker you can use `make tests-all-local-docker` or `make tests-all-local-docker TEST_TARGET=...`. + ## Marlin Support -The Issue Queue is reserved for Bug Reports and Feature Requests. Please use the following resources for help with configuration and troubleshooting: +The Issue Queue is reserved for Bug Reports and Feature Requests. To get help with configuration and troubleshooting, please use the following resources: - [Marlin Documentation](https://marlinfw.org) - Official Marlin documentation - [Marlin Discord](https://discord.gg/n5NJ59y) - Discuss issues with Marlin users and developers @@ -82,48 +95,59 @@ The Issue Queue is reserved for Bug Reports and Feature Requests. Please use the - Facebook Group ["Marlin Firmware for 3D Printers"](https://www.facebook.com/groups/3Dtechtalk/) - [Marlin Configuration](https://www.youtube.com/results?search_query=marlin+configuration) on YouTube -## Contributing Patches +## Contributors -You can contribute patches by submitting a Pull Request to the ([bugfix-2.1.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.1.x)) branch. +Marlin is constantly improving thanks to a huge number of contributors from all over the world bringing their specialties and talents. Huge thanks are due to [all the contributors](https://github.com/MarlinFirmware/Marlin/graphs/contributors) who regularly patch up bugs, help direct traffic, and basically keep Marlin from falling apart. Marlin's continued existence would not be possible without them. -- We use branches named with a "bugfix" or "dev" prefix to fix bugs and integrate new features. -- Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers. -- Please submit Feature Requests and Bug Reports to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues/new/choose). See above for user support. -- Whenever you add new features, be sure to add one or more build tests to `buildroot/tests`. Any tests added to a PR will be run within that PR on GitHub servers as soon as they are pushed. To minimize iteration be sure to run your new tests locally, if possible. - - Local build tests: - - All: `make tests-config-all-local` - - Single: `make tests-config-single-local TEST_TARGET=...` - - Local build tests in Docker: - - All: `make tests-config-all-local-docker` - - Single: `make tests-config-all-local-docker TEST_TARGET=...` - - To run all unit test suites: - - Using PIO: `platformio run -t test-marlin` - - Using Make: `make unit-test-all-local` - - Using Docker + make: `maker unit-test-all-local-docker` - - To run a single unit test suite: - - Using PIO: `platformio run -t marlin_` - - Using make: `make unit-test-single-local TEST_TARGET=` - - Using Docker + make: `maker unit-test-single-local-docker TEST_TARGET=` -- If your feature can be unit tested, add one or more unit tests. For more information see our documentation on [Unit Tests](test). +## Administration -## Contributors +Regular users can open and close their own issues, but only the administrators can do project-related things like add labels, merge changes, set milestones, and kick trolls. The current Marlin admin team consists of: -Marlin is constantly improving thanks to a huge number of contributors from all over the world bringing their specialties and talents. Huge thanks are due to [all the contributors](https://github.com/MarlinFirmware/Marlin/graphs/contributors) who regularly patch up bugs, help direct traffic, and basically keep Marlin from falling apart. Marlin's continued existence would not be possible without them. + + + +
Project Maintainer
+ + 🇺🇸  **Scott Lahteine** +       [@thinkyhead](https://github.com/thinkyhead) +       [  Donate 💸  ](https://www.thinkyhead.com/donate-to-marlin) + + + + 🇺🇸  **Roxanne Neufeld** +       [@Roxy-3D](https://github.com/Roxy-3D) + + 🇺🇸  **Keith Bennett** +       [@thisiskeithb](https://github.com/thisiskeithb) +       [  Donate 💸  ](https://github.com/sponsors/thisiskeithb) + + 🇺🇸  **Jason Smith** +       [@sjasonsmith](https://github.com/sjasonsmith) + + -## Project Leadership + 🇧🇷  **Victor Oliveira** +       [@rhapsodyv](https://github.com/rhapsodyv) -Name|Role|Link|Donate -----|----|----|---- -🇺🇸 Scott Lahteine|Project Lead|[[@thinkyhead](https://github.com/thinkyhead)]|[💸 Donate](https://www.thinkyhead.com/donate-to-marlin) -🇺🇸 Roxanne Neufeld|Admin|[[@Roxy-3D](https://github.com/Roxy-3D)]| -🇺🇸 Keith Bennett|Admin|[[@thisiskeithb](https://github.com/thisiskeithb)]|[💸 Donate](https://github.com/sponsors/thisiskeithb) -🇺🇸 Jason Smith|Admin|[[@sjasonsmith](https://github.com/sjasonsmith)]| -🇧🇷 Victor Oliveira|Admin|[[@rhapsodyv](https://github.com/rhapsodyv)]| -🇬🇧 Chris Pepper|Admin|[[@p3p](https://github.com/p3p)]| -🇳🇿 Peter Ellens|Admin|[[@ellensp](https://github.com/ellensp)]|[💸 Donate](https://ko-fi.com/ellensp) -🇺🇸 Bob Kuhn|Admin|[[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)]| -🇳🇱 Erik van der Zalm|Founder|[[@ErikZalm](https://github.com/ErikZalm)]|[💸 Donate](https://flattr.com/submit/auto?user_id=ErikZalm&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software) + 🇬🇧  **Chris Pepper** +       [@p3p](https://github.com/p3p) + +🇳🇿  **Peter Ellens** +       [@ellensp](https://github.com/ellensp) +       [  Donate 💸  ](https://ko-fi.com/ellensp) + + + + 🇺🇸  **Bob Kuhn** +       [@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn) + + 🇳🇱  **Erik van der Zalm** +       [@ErikZalm](https://github.com/ErikZalm) + +
## License Marlin is published under the [GPL license](/LICENSE) because we believe in open development. The GPL comes with both rights and obligations. Whether you use Marlin firmware as the driver for your open or closed-source product, you must keep Marlin open, and you must provide your compatible Marlin source code to end users upon request. The most straightforward way to comply with the Marlin license is to make a fork of Marlin on Github, perform your modifications, and direct users to your modified fork. + +While we can't prevent the use of this code in products (3D printers, CNC, etc.) that are closed source or crippled by a patent, we would prefer that you choose another firmware or, better yet, make your own. From 19684f23bc9b4bdf1f38ff353f8b3546789b07f7 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 13 Apr 2024 17:49:08 -0700 Subject: [PATCH 075/111] =?UTF-8?q?=E2=9C=85=20Add=20unit=20tests=20for=20?= =?UTF-8?q?macros.h=20(#26968)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/tests/core/test_macros.cpp | 1215 +++++++++++++++++++++++++++++ 1 file changed, 1215 insertions(+) create mode 100644 Marlin/tests/core/test_macros.cpp diff --git a/Marlin/tests/core/test_macros.cpp b/Marlin/tests/core/test_macros.cpp new file mode 100644 index 000000000000..235334292839 --- /dev/null +++ b/Marlin/tests/core/test_macros.cpp @@ -0,0 +1,1215 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2024 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../test/unit_tests.h" +#include + +// These represent enabled and disabled configuration options for testing. +// They will be used by multiple tests. +#define OPTION_ENABLED 1 +#define OPTION_DISABLED 0 + +MARLIN_TEST(macros_bitwise_8, TEST) { + uint8_t odd_set = 0xAA; + uint8_t even_set = 0x55; + for (uint8_t b = 0; b < 8; ++b) { + TEST_ASSERT_EQUAL((b % 2) != 0, TEST(odd_set, b)); + TEST_ASSERT_EQUAL((b % 2) == 0, TEST(even_set, b)); + } +} + +MARLIN_TEST(macros_bitwise_8, SET_BIT_TO) { + uint8_t n = 0x00; + + // Test LSB + SET_BIT_TO(n, 0, true); + TEST_ASSERT_EQUAL(0x01, n); + SET_BIT_TO(n, 0, false); + TEST_ASSERT_EQUAL(0x00, n); + + // Test MSB + SET_BIT_TO(n, 7, true); + TEST_ASSERT_EQUAL(0x80, n); + SET_BIT_TO(n, 7, false); + TEST_ASSERT_EQUAL(0x00, n); + + // Test a bit in the middle + SET_BIT_TO(n, 3, true); + TEST_ASSERT_EQUAL(0x08, n); + SET_BIT_TO(n, 3, false); + TEST_ASSERT_EQUAL(0x00, n); +} + +MARLIN_TEST(macros_bitwise_8, SBI) { + uint8_t n; + + // Test LSB + n = 0x00; + SBI(n, 0); + TEST_ASSERT_EQUAL(0x01, n); + + // Test MSB + n = 0x00; + SBI(n, 7); + TEST_ASSERT_EQUAL(0x80, n); + + // Test a bit in the middle + n = 0x00; + SBI(n, 3); + TEST_ASSERT_EQUAL(0x08, n); +} + +MARLIN_TEST(macros_bitwise_8, CBI) { + uint8_t n; + + // Test LSB + n = 0xFF; + CBI(n, 0); + TEST_ASSERT_EQUAL(0xFE, n); + + // Test MSB + n = 0xFF; + CBI(n, 7); + TEST_ASSERT_EQUAL(0x7F, n); + + // Test a bit in the middle + n = 0xFF; + CBI(n, 3); + TEST_ASSERT_EQUAL(0xF7, n); +} + +MARLIN_TEST(macros_bitwise_8, TBI) { + uint8_t n; + + // Test LSB + n = 0xAA; + TBI(n, 0); + TEST_ASSERT_EQUAL(0xAB, n); + + // Test MSB + n = 0xAA; + TBI(n, 7); + TEST_ASSERT_EQUAL(0x2A, n); + + // Test a bit in the middle + n = 0xAA; + TBI(n, 3); + TEST_ASSERT_EQUAL(0xA2, n); +} + +// 32-bit BIT operation tests +// These verify the above macros, but specifically with the MSB of a uint32_t. +// This ensures that the macros are not limited to 8-bit operations. + +MARLIN_TEST(macros_bitwise_32, TEST_32bit) { + uint32_t odd_set = 0x80000000; + uint32_t even_set = 0x00000000; + TEST_ASSERT_EQUAL(true, TEST(odd_set, 31)); + TEST_ASSERT_EQUAL(false, TEST(even_set, 31)); +} + +MARLIN_TEST(macros_bitwise_32, SET_BIT_TO_32bit) { + uint32_t n = 0x00000000; + + // Test MSB + SET_BIT_TO(n, 31, true); + TEST_ASSERT_EQUAL(0x80000000, n); + SET_BIT_TO(n, 31, false); + TEST_ASSERT_EQUAL(0x00000000, n); +} + +MARLIN_TEST(macros_bitwise_32, SBI_32bit) { + uint32_t n = 0x00000000; + + // Test MSB + SBI(n, 31); + TEST_ASSERT_EQUAL(0x80000000, n); +} + +MARLIN_TEST(macros_bitwise_32, CBI_32bit) { + uint32_t n = 0xFFFFFFFF; + + // Test MSB + CBI(n, 31); + TEST_ASSERT_EQUAL(0x7FFFFFFF, n); +} + +MARLIN_TEST(macros_bitwise_32, TBI_32bit) { + uint32_t n = 0x7FFFFFFF; + + // Test MSB + TBI(n, 31); + TEST_ASSERT_EQUAL(0xFFFFFFFF, n); +} + +// Geometry macros +MARLIN_TEST(macros_geometry, cu_int) { + TEST_ASSERT_EQUAL(8, cu(2)); + TEST_ASSERT_EQUAL(27, cu(3)); +} + +MARLIN_TEST(macros_geometry, cu_float) { + TEST_ASSERT_FLOAT_WITHIN(0.001f, 8.615f, cu(2.05f)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 28.094f, cu(3.04f)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 13.998f, cu(2.41f)); +} + +MARLIN_TEST(macros_geometry, RADIANS) { + TEST_ASSERT_FLOAT_WITHIN(0.001f, float(M_PI), RADIANS(180.0f)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 0.0f, RADIANS(0.0f)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, float(M_PI) / 4, RADIANS(45.0f)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, float(M_PI) / 2, RADIANS(90.0f)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 3 * float(M_PI) / 2, RADIANS(270.0f)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 4 * float(M_PI), RADIANS(720.0f)); +} + +MARLIN_TEST(macros_geometry, DEGREES) { + TEST_ASSERT_FLOAT_WITHIN(0.001f, 180.0f, DEGREES(float(M_PI))); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 0.0f, DEGREES(0.0f)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 45.0f, DEGREES(float(M_PI) / 4)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 90.0f, DEGREES(float(M_PI) / 2)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 270.0f, DEGREES(3 * float(M_PI) / 2)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 720.0f, DEGREES(4 * float(M_PI))); +} + +MARLIN_TEST(macros_geometry, HYPOT2) { + TEST_ASSERT_EQUAL(25, HYPOT2(3, 4)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 13.0f, HYPOT2(2.0f, 3.0f)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 18.72f, HYPOT2(2.4f, 3.6f)); +} + +MARLIN_TEST(macros_geometry, NORMSQ) { + TEST_ASSERT_EQUAL(14, NORMSQ(1, 2, 3)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 14.0f, NORMSQ(1.0f, 2.0f, 3.0f)); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 20.16f, NORMSQ(1.2f, 2.4f, 3.6f)); +} + +MARLIN_TEST(macros_geometry, CIRCLE_AREA) { + TEST_ASSERT_EQUAL(float(M_PI) * 4, CIRCLE_AREA(2)); +} + +MARLIN_TEST(macros_geometry, CIRCLE_CIRC) { + TEST_ASSERT_EQUAL(2 * float(M_PI) * 3, CIRCLE_CIRC(3)); +} + +MARLIN_TEST(macros_numeric, SIGN) { + TEST_ASSERT_EQUAL(1, SIGN(100)); + TEST_ASSERT_EQUAL(-1, SIGN(-100)); + TEST_ASSERT_EQUAL(0, SIGN(0)); +} + +MARLIN_TEST(macros_numeric, IS_POWER_OF_2) { + TEST_ASSERT_EQUAL(false, IS_POWER_OF_2(0)); + TEST_ASSERT_EQUAL(true, IS_POWER_OF_2(1)); + TEST_ASSERT_EQUAL(true, IS_POWER_OF_2(4)); + TEST_ASSERT_EQUAL(false, IS_POWER_OF_2(5)); + TEST_ASSERT_EQUAL(false, IS_POWER_OF_2(0x80000001)); + TEST_ASSERT_EQUAL(true, IS_POWER_OF_2(0x80000000)); +} + +// Numeric constraints +MARLIN_TEST(macros_numeric, NOLESS_int) { + // Scenario 1: Input was already acceptable + int a = 8; + NOLESS(a, 5); + TEST_ASSERT_EQUAL(8, a); + + // Original scenario: Input was less than the limit + a = 5; + NOLESS(a, 10); + TEST_ASSERT_EQUAL(10, a); + + // Scenario 2: Input is negative, and coerces to a positive number + a = -5; + NOLESS(a, 0); + TEST_ASSERT_EQUAL(0, a); + + // Scenario 3: Input is negative, and coerces to another negative number + a = -10; + NOLESS(a, -5); + TEST_ASSERT_EQUAL(-5, a); +} + +MARLIN_TEST(macros_numeric, NOLESS_uint) { + // Scenario 1: Input was already acceptable + unsigned int b = 8u; + NOLESS(b, 5u); + TEST_ASSERT_EQUAL(8u, b); + + // Original scenario: Input was less than the limit + b = 5u; + NOLESS(b, 10u); + TEST_ASSERT_EQUAL(10u, b); +} + +MARLIN_TEST(macros_numeric, NOLESS_float) { + // Scenario 1: Input was already acceptable + float c = 8.5f; + NOLESS(c, 5.5f); + TEST_ASSERT_EQUAL_FLOAT(8.5f, c); + + // Original scenario: Input was less than the limit + c = 5.5f; + NOLESS(c, 10.5f); + TEST_ASSERT_EQUAL_FLOAT(10.5f, c); + + // Scenario 2: Input is negative, and coerces to a positive number + c = -5.5f; + NOLESS(c, 5.0f); + TEST_ASSERT_EQUAL_FLOAT(5.0f, c); + + // Scenario 3: Input is negative, and coerces to another negative number + c = -10.5f; + NOLESS(c, -5.5f); + TEST_ASSERT_EQUAL_FLOAT(-5.5f, c); + c = -5.5f; + NOLESS(c, -10.5f); + TEST_ASSERT_EQUAL_FLOAT(-5.5f, c); +} + +MARLIN_TEST(macros_numeric, NOMORE_int) { + // Scenario 1: Input was already acceptable + int a = 8; + NOMORE(a, 10); + TEST_ASSERT_EQUAL(8, a); + + // Original scenario: Input was more than the limit + a = 15; + NOMORE(a, 10); + TEST_ASSERT_EQUAL(10, a); + + // Scenario 2: Input is positive, and coerces to a negative number + a = 5; + NOMORE(a, -2); + TEST_ASSERT_EQUAL(-2, a); + + // Scenario 3: Input is negative, and coerces to another negative number + a = -5; + NOMORE(a, -10); + TEST_ASSERT_EQUAL(-10, a); +} + +MARLIN_TEST(macros_numeric, NOMORE_uint) { + // Scenario 1: Input was already acceptable + unsigned int b = 8u; + NOMORE(b, 10u); + TEST_ASSERT_EQUAL(8u, b); + + // Original scenario: Input was more than the limit + b = 15u; + NOMORE(b, 10u); + TEST_ASSERT_EQUAL(10u, b); +} + +MARLIN_TEST(macros_numeric, NOMORE_float) { + // Scenario 1: Input was already acceptable + float c = 8.5f; + NOMORE(c, 10.5f); + TEST_ASSERT_EQUAL_FLOAT(8.5f, c); + + // Original scenario: Input was more than the limit + c = 15.5f; + NOMORE(c, 10.5f); + TEST_ASSERT_EQUAL_FLOAT(10.5f, c); + + // Scenario 2: Input is positive, and coerces to a negative number + c = 5.5f; + NOMORE(c, -1.7f); + TEST_ASSERT_EQUAL_FLOAT(-1.7f, c); + + // Scenario 3: Input is negative, and coerces to another negative number + c = -5.5f; + NOMORE(c, -10.5f); + TEST_ASSERT_EQUAL_FLOAT(-10.5f, c); +} + +MARLIN_TEST(macros_numeric, LIMIT_int) { + int a = 15; + LIMIT(a, 10, 20); + TEST_ASSERT_EQUAL(15, a); + + a = 5; + LIMIT(a, 10, 20); + TEST_ASSERT_EQUAL(10, a); + + a = 25; + LIMIT(a, 10, 20); + TEST_ASSERT_EQUAL(20, a); + + // Scenario: Range is [-10, -5] + a = -8; + LIMIT(a, -10, -5); + TEST_ASSERT_EQUAL(-8, a); + + a = -12; + LIMIT(a, -10, -5); + TEST_ASSERT_EQUAL(-10, a); + + a = -3; + LIMIT(a, -10, -5); + TEST_ASSERT_EQUAL(-5, a); + + // Scenario: Range is [-10, 5] + a = 0; + LIMIT(a, -10, 5); + TEST_ASSERT_EQUAL(0, a); + + a = -12; + LIMIT(a, -10, 5); + TEST_ASSERT_EQUAL(-10, a); + + a = 6; + LIMIT(a, -10, 5); + TEST_ASSERT_EQUAL(5, a); +} + +MARLIN_TEST(macros_numeric, LIMIT_uint) { + unsigned int b = 15u; + LIMIT(b, 10u, 20u); + TEST_ASSERT_EQUAL(15u, b); + + b = 5u; + LIMIT(b, 10u, 20u); + TEST_ASSERT_EQUAL(10u, b); + + b = 25u; + LIMIT(b, 10u, 20u); + TEST_ASSERT_EQUAL(20u, b); +} + +MARLIN_TEST(macros_numeric, LIMIT_float) { + float c = 15.5f; + LIMIT(c, 10.5f, 20.5f); + TEST_ASSERT_EQUAL_FLOAT(15.5f, c); + + c = 5.5f; + LIMIT(c, 10.5f, 20.5f); + TEST_ASSERT_EQUAL_FLOAT(10.5f, c); + + c = 25.5f; + LIMIT(c, 10.5f, 20.5f); + TEST_ASSERT_EQUAL_FLOAT(20.5f, c); + + // Scenario: Range is [-10.5, -5.5] + c = -8.5f; + LIMIT(c, -10.5f, -5.5f); + TEST_ASSERT_EQUAL_FLOAT(-8.5f, c); + + c = -12.5f; + LIMIT(c, -10.5f, -5.5f); + TEST_ASSERT_EQUAL_FLOAT(-10.5f, c); + + c = -3.5f; + LIMIT(c, -10.5f, -5.5f); + TEST_ASSERT_EQUAL_FLOAT(-5.5f, c); + + // Scenario: Range is [-10.5, 5.5] + c = 0.0f; + LIMIT(c, -10.5f, 5.5f); + TEST_ASSERT_EQUAL_FLOAT(0.0f, c); + + c = -12.5f; + LIMIT(c, -10.5f, 5.5f); + TEST_ASSERT_EQUAL_FLOAT(-10.5f, c); + + c = 6.5f; + LIMIT(c, -10.5f, 5.5f); + TEST_ASSERT_EQUAL_FLOAT(5.5f, c); +} + + +// Looping macros +MARLIN_TEST(macros_looping, DO_macro) { + #define _M_1(A) (A) + int sum = DO(M, +, 1, 2, 3, 4, 5); + TEST_ASSERT_EQUAL(15, sum); + + // Test with maximum number of arguments + sum = DO(M, +, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40); + TEST_ASSERT_EQUAL(820, sum); + #undef _M_1 +} + +// Configuration Options +MARLIN_TEST(macros_options, ENABLED_DISABLED) { + #define OPTION_A + #define OPTION_B 1 + #define OPTION_C true + #define OPTION_D 0 + #define OPTION_E false + // #define OPTION_F + + // Test ENABLED macro + TEST_ASSERT_TRUE(ENABLED(OPTION_A)); + TEST_ASSERT_TRUE(ENABLED(OPTION_B)); + TEST_ASSERT_TRUE(ENABLED(OPTION_C)); + TEST_ASSERT_FALSE(ENABLED(OPTION_D)); + TEST_ASSERT_FALSE(ENABLED(OPTION_E)); + TEST_ASSERT_FALSE(ENABLED(OPTION_F)); + + // Test DISABLED macro + TEST_ASSERT_FALSE(DISABLED(OPTION_A)); + TEST_ASSERT_FALSE(DISABLED(OPTION_B)); + TEST_ASSERT_FALSE(DISABLED(OPTION_C)); + TEST_ASSERT_TRUE(DISABLED(OPTION_D)); + TEST_ASSERT_TRUE(DISABLED(OPTION_E)); + TEST_ASSERT_TRUE(DISABLED(OPTION_F)); + + #undef OPTION_A + #undef OPTION_B + #undef OPTION_C + #undef OPTION_D + #undef OPTION_E +} + +MARLIN_TEST(macros_options, ANY) { + TEST_ASSERT_TRUE(ANY(OPTION_DISABLED, OPTION_ENABLED, OPTION_DISABLED)); // Enabled option in the middle + TEST_ASSERT_TRUE(ANY(OPTION_ENABLED, OPTION_DISABLED, OPTION_DISABLED)); // Enabled option at the beginning + TEST_ASSERT_TRUE(ANY(OPTION_DISABLED, OPTION_DISABLED, OPTION_ENABLED)); // Enabled option at the end + TEST_ASSERT_FALSE(ANY(OPTION_DISABLED, OPTION_DISABLED, OPTION_DISABLED)); // All options disabled +} + +MARLIN_TEST(macros_options, ALL) { + TEST_ASSERT_TRUE(ALL(OPTION_ENABLED, OPTION_ENABLED, OPTION_ENABLED)); // All options enabled + TEST_ASSERT_FALSE(ALL(OPTION_ENABLED, OPTION_DISABLED, OPTION_ENABLED)); // Disabled option in the middle + TEST_ASSERT_FALSE(ALL(OPTION_DISABLED, OPTION_ENABLED, OPTION_ENABLED)); // Disabled option at the beginning + TEST_ASSERT_FALSE(ALL(OPTION_ENABLED, OPTION_ENABLED, OPTION_DISABLED)); // Disabled option at the end + TEST_ASSERT_FALSE(ALL(OPTION_DISABLED, OPTION_DISABLED, OPTION_DISABLED)); // All options disabled +} + +MARLIN_TEST(macros_options, NONE) { + TEST_ASSERT_FALSE(NONE(OPTION_ENABLED, OPTION_ENABLED, OPTION_ENABLED)); // All options enabled + TEST_ASSERT_FALSE(NONE(OPTION_ENABLED, OPTION_DISABLED, OPTION_ENABLED)); // Disabled option in the middle + TEST_ASSERT_FALSE(NONE(OPTION_DISABLED, OPTION_ENABLED, OPTION_ENABLED)); // Disabled option at the beginning + TEST_ASSERT_FALSE(NONE(OPTION_ENABLED, OPTION_ENABLED, OPTION_DISABLED)); // Disabled option at the end + TEST_ASSERT_TRUE(NONE(OPTION_DISABLED, OPTION_DISABLED, OPTION_DISABLED)); // All options disabled +} + +MARLIN_TEST(macros_options, COUNT_ENABLED) { + TEST_ASSERT_EQUAL(3, COUNT_ENABLED(OPTION_ENABLED, OPTION_ENABLED, OPTION_ENABLED)); // All options enabled + TEST_ASSERT_EQUAL(2, COUNT_ENABLED(OPTION_ENABLED, OPTION_DISABLED, OPTION_ENABLED)); // Disabled option in the middle + TEST_ASSERT_EQUAL(2, COUNT_ENABLED(OPTION_DISABLED, OPTION_ENABLED, OPTION_ENABLED)); // Disabled option at the beginning + TEST_ASSERT_EQUAL(2, COUNT_ENABLED(OPTION_ENABLED, OPTION_ENABLED, OPTION_DISABLED)); // Disabled option at the end + TEST_ASSERT_EQUAL(0, COUNT_ENABLED(OPTION_DISABLED, OPTION_DISABLED, OPTION_DISABLED)); // All options disabled +} + +MARLIN_TEST(macros_options, MANY) { + TEST_ASSERT_FALSE(MANY(OPTION_ENABLED, OPTION_DISABLED, OPTION_DISABLED)); // Only one option enabled + TEST_ASSERT_TRUE(MANY(OPTION_ENABLED, OPTION_ENABLED, OPTION_DISABLED)); // Two options enabled + TEST_ASSERT_TRUE(MANY(OPTION_ENABLED, OPTION_ENABLED, OPTION_ENABLED)); // All options enabled + TEST_ASSERT_FALSE(MANY(OPTION_DISABLED, OPTION_DISABLED, OPTION_DISABLED)); // No options enabled +} + + +// Ternary macros +MARLIN_TEST(macros_options, TERN) { + TEST_ASSERT_EQUAL(1, TERN(OPTION_ENABLED, 1, 0)); // OPTION_ENABLED is enabled, so it should return '1' + TEST_ASSERT_EQUAL(0, TERN(OPTION_DISABLED, 1, 0)); // OPTION_DISABLED is disabled, so it should return '0' +} + +MARLIN_TEST(macros_options, TERN0) { + TEST_ASSERT_EQUAL(1, TERN0(OPTION_ENABLED, 1)); // OPTION_ENABLED is enabled, so it should return '1' + TEST_ASSERT_EQUAL(0, TERN0(OPTION_DISABLED, 1)); // OPTION_DISABLED is disabled, so it should return '0' +} + +MARLIN_TEST(macros_options, TERN1) { + TEST_ASSERT_EQUAL(0, TERN1(OPTION_ENABLED, 0)); // OPTION_ENABLED is enabled, so it should return '0' + TEST_ASSERT_EQUAL(1, TERN1(OPTION_DISABLED, 0)); // OPTION_DISABLED is disabled, so it should return '1' +} + +MARLIN_TEST(macros_options, TERN_) { + TEST_ASSERT_EQUAL(-1, TERN_(OPTION_ENABLED, -)1); // OPTION_ENABLED is enabled, so it should return '1' + TEST_ASSERT_EQUAL(1, TERN_(OPTION_DISABLED, -)1); // OPTION_DISABLED is disabled, so it should return nothing +} + +MARLIN_TEST(macros_options, IF_DISABLED) { + TEST_ASSERT_EQUAL(1, IF_DISABLED(OPTION_ENABLED, -)1); // OPTION_ENABLED is enabled, so it should return nothing + TEST_ASSERT_EQUAL(-1, IF_DISABLED(OPTION_DISABLED, -)1); // OPTION_DISABLED is disabled, so it should return '1' +} + +MARLIN_TEST(macros_options, OPTITEM) { + int enabledArray[] = {OPTITEM(OPTION_ENABLED, 1, 2)}; + int disabledArray[] = {OPTITEM(OPTION_DISABLED, 1, 2)}; + TEST_ASSERT_EQUAL(2, sizeof(enabledArray) / sizeof(int)); // OPTION_ENABLED is enabled, so it should return an array of size 2 + TEST_ASSERT_EQUAL(0, sizeof(disabledArray) / sizeof(int)); // OPTION_DISABLED is disabled, so it should return an array of size 0 +} + +MARLIN_TEST(macros_options, OPTARG) { + int enabledArgs[] = {0 OPTARG(OPTION_ENABLED, 1, 2)}; + int disabledArgs[] = {0 OPTARG(OPTION_DISABLED, 1, 2)}; + + int sumEnabledArgs = 0; + for (const auto& arg : enabledArgs) { + sumEnabledArgs += arg; + } + + int sumDisabledArgs = 0; + for (const auto& arg : disabledArgs) { + sumDisabledArgs += arg; + } + + TEST_ASSERT_EQUAL(3, sumEnabledArgs); // OPTION_ENABLED is enabled, so it should return 3 + TEST_ASSERT_EQUAL(0, sumDisabledArgs); // OPTION_DISABLED is disabled, so it should return 0 +} + +MARLIN_TEST(macros_options, OPTCODE) { + int enabledCode = 0; OPTCODE(OPTION_ENABLED, enabledCode = 1); + int disabledCode = 0; OPTCODE(OPTION_DISABLED, disabledCode = 1); + TEST_ASSERT_EQUAL(1, enabledCode); // OPTION_ENABLED is enabled, so it should return 1 + TEST_ASSERT_EQUAL(0, disabledCode); // OPTION_DISABLED is disabled, so it should return 0 +} + +MARLIN_TEST(macros_optional_math, PLUS_TERN0) { + int enabledPlus = 5 PLUS_TERN0(OPTION_ENABLED, 2); + int disabledPlus = 5 PLUS_TERN0(OPTION_DISABLED, 2); + TEST_ASSERT_EQUAL(7, enabledPlus); // OPTION_ENABLED is enabled, so it should return 7 + TEST_ASSERT_EQUAL(5, disabledPlus); // OPTION_DISABLED is disabled, so it should return 5 +} + +MARLIN_TEST(macros_optional_math, MINUS_TERN0) { + int enabledMinus = 5 MINUS_TERN0(OPTION_ENABLED, 2); + int disabledMinus = 5 MINUS_TERN0(OPTION_DISABLED, 2); + TEST_ASSERT_EQUAL(3, enabledMinus); // OPTION_ENABLED is enabled, so it should return 3 + TEST_ASSERT_EQUAL(5, disabledMinus); // OPTION_DISABLED is disabled, so it should return 5 +} + +MARLIN_TEST(macros_optional_math, MUL_TERN1) { + int enabledMul = 5 MUL_TERN1(OPTION_ENABLED, 2); + int disabledMul = 5 MUL_TERN1(OPTION_DISABLED, 2); + TEST_ASSERT_EQUAL(10, enabledMul); // OPTION_ENABLED is enabled, so it should return 10 + TEST_ASSERT_EQUAL(5, disabledMul); // OPTION_DISABLED is disabled, so it should return 5 +} + +MARLIN_TEST(macros_optional_math, DIV_TERN1) { + int enabledDiv = 10 DIV_TERN1(OPTION_ENABLED, 2); + int disabledDiv = 10 DIV_TERN1(OPTION_DISABLED, 2); + TEST_ASSERT_EQUAL(5, enabledDiv); // OPTION_ENABLED is enabled, so it should return 5 + TEST_ASSERT_EQUAL(10, disabledDiv); // OPTION_DISABLED is disabled, so it should return 10 +} + +MARLIN_TEST(macros_optional_math, SUM_TERN) { + int enabledSum = SUM_TERN(OPTION_ENABLED, 5, 2); + int disabledSum = SUM_TERN(OPTION_DISABLED, 5, 2); + TEST_ASSERT_EQUAL(7, enabledSum); // OPTION_ENABLED is enabled, so it should return 7 + TEST_ASSERT_EQUAL(5, disabledSum); // OPTION_DISABLED is disabled, so it should return 5 +} + +MARLIN_TEST(macros_optional_math, DIFF_TERN) { + int enabledDiff = DIFF_TERN(OPTION_ENABLED, 5, 2); + int disabledDiff = DIFF_TERN(OPTION_DISABLED, 5, 2); + TEST_ASSERT_EQUAL(3, enabledDiff); // OPTION_ENABLED is enabled, so it should return 3 + TEST_ASSERT_EQUAL(5, disabledDiff); // OPTION_DISABLED is disabled, so it should return 5 +} + +MARLIN_TEST(macros_optional_math, MUL_TERN) { + int enabledMul = MUL_TERN(OPTION_ENABLED, 5, 2); + int disabledMul = MUL_TERN(OPTION_DISABLED, 5, 2); + TEST_ASSERT_EQUAL(10, enabledMul); // OPTION_ENABLED is enabled, so it should return 10 + TEST_ASSERT_EQUAL(5, disabledMul); // OPTION_DISABLED is disabled, so it should return 5 +} + +MARLIN_TEST(macros_optional_math, DIV_TERN) { + int enabledDiv = DIV_TERN(OPTION_ENABLED, 10, 2); + int disabledDiv = DIV_TERN(OPTION_DISABLED, 10, 2); + TEST_ASSERT_EQUAL(5, enabledDiv); // OPTION_ENABLED is enabled, so it should return 5 + TEST_ASSERT_EQUAL(10, disabledDiv); // OPTION_DISABLED is disabled, so it should return 10 +} + +// Mock pin definitions +#define PIN1_PIN 1 +#define PIN2_PIN 2 +#define PIN3_PIN -1 + +MARLIN_TEST(macros_pins, PIN_EXISTS) { + // Test PIN_EXISTS macro + int pin1_exists, pin2_exists, pin3_exists, pin4_exists; + + #if PIN_EXISTS(PIN1) + pin1_exists = 1; + #else + pin1_exists = 0; + #endif + + #if PIN_EXISTS(PIN2) + pin2_exists = 1; + #else + pin2_exists = 0; + #endif + + #if PIN_EXISTS(PIN3) + pin3_exists = 1; + #else + pin3_exists = 0; + #endif + + #if PIN_EXISTS(PIN4) + pin4_exists = 1; + #else + pin4_exists = 0; + #endif + + TEST_ASSERT_TRUE(pin1_exists); + TEST_ASSERT_TRUE(pin2_exists); + TEST_ASSERT_FALSE(pin3_exists); + TEST_ASSERT_FALSE(pin4_exists); +} + +MARLIN_TEST(macros_pins, PINS_EXIST) { + // Test PINS_EXIST macro + int pins1_2_exist, pins1_3_exist; + + #if PINS_EXIST(PIN1, PIN2) + pins1_2_exist = 1; + #else + pins1_2_exist = 0; + #endif + + #if PINS_EXIST(PIN1, PIN3) + pins1_3_exist = 1; + #else + pins1_3_exist = 0; + #endif + + TEST_ASSERT_TRUE(pins1_2_exist); + TEST_ASSERT_FALSE(pins1_3_exist); +} + +MARLIN_TEST(macros_pins, ANY_PIN) { + // Test ANY_PIN macro + int any_pin1_3, any_pin3_4; + + #if ANY_PIN(PIN1, PIN3) + any_pin1_3 = 1; + #else + any_pin1_3 = 0; + #endif + + #if ANY_PIN(PIN3, PIN4) + any_pin3_4 = 1; + #else + any_pin3_4 = 0; + #endif + + TEST_ASSERT_TRUE(any_pin1_3); + TEST_ASSERT_FALSE(any_pin3_4); +} + +// Undefine mock pin definitions +#undef PIN1_PIN +#undef PIN2_PIN +#undef PIN3_PIN + + +// Mock button definitions +#define BTN_BUTTON1 1 +#define BTN_BUTTON2 2 +#define BTN_BUTTON3 -1 + +MARLIN_TEST(macros_buttons, BUTTON_EXISTS) { + // Test BUTTON_EXISTS macro + int button1_exists, button2_exists, button3_exists, button4_exists; + + #if BUTTON_EXISTS(BUTTON1) + button1_exists = 1; + #else + button1_exists = 0; + #endif + + #if BUTTON_EXISTS(BUTTON2) + button2_exists = 1; + #else + button2_exists = 0; + #endif + + #if BUTTON_EXISTS(BUTTON3) + button3_exists = 1; + #else + button3_exists = 0; + #endif + + #if BUTTON_EXISTS(BUTTON4) + button4_exists = 1; + #else + button4_exists = 0; + #endif + + TEST_ASSERT_TRUE(button1_exists); + TEST_ASSERT_TRUE(button2_exists); + TEST_ASSERT_FALSE(button3_exists); + TEST_ASSERT_FALSE(button4_exists); +} + +MARLIN_TEST(macros_buttons, BUTTONS_EXIST) { + // Test BUTTONS_EXIST macro + int buttons1_2_exist, buttons1_3_exist; + + #if BUTTONS_EXIST(BUTTON1, BUTTON2) + buttons1_2_exist = 1; + #else + buttons1_2_exist = 0; + #endif + + #if BUTTONS_EXIST(BUTTON1, BUTTON3) + buttons1_3_exist = 1; + #else + buttons1_3_exist = 0; + #endif + + TEST_ASSERT_TRUE(buttons1_2_exist); + TEST_ASSERT_FALSE(buttons1_3_exist); +} + +MARLIN_TEST(macros_buttons, ANY_BUTTON) { + // Test ANY_BUTTON macro + int any_button1_3, any_button3_4; + + #if ANY_BUTTON(BUTTON1, BUTTON3) + any_button1_3 = 1; + #else + any_button1_3 = 0; + #endif + + #if ANY_BUTTON(BUTTON3, BUTTON4) + any_button3_4 = 1; + #else + any_button3_4 = 0; + #endif + + TEST_ASSERT_TRUE(any_button1_3); + TEST_ASSERT_FALSE(any_button3_4); +} + +// Undefine mock button definitions +#undef BTN_BUTTON1 +#undef BTN_BUTTON2 +#undef BTN_BUTTON3 + + +MARLIN_TEST(macros_value_functions, WITHIN) { + // Test WITHIN macro + TEST_ASSERT_TRUE(WITHIN(5, 1, 10)); // 5 is within 1 and 10 + TEST_ASSERT_TRUE(WITHIN(1, 1, 10)); // Edge case: 1 is the lower limit + TEST_ASSERT_TRUE(WITHIN(10, 1, 10)); // Edge case: 10 is the upper limit + TEST_ASSERT_FALSE(WITHIN(0, 1, 10)); // Edge case: 0 is just below the lower limit + TEST_ASSERT_FALSE(WITHIN(11, 1, 10)); // Edge case: 11 is just above the upper limit + TEST_ASSERT_FALSE(WITHIN(15, 1, 10)); // 15 is not within 1 and 10 +} + +MARLIN_TEST(macros_value_functions, ISEOL) { + // Test ISEOL macro + TEST_ASSERT_TRUE(ISEOL('\n')); // '\n' is an end-of-line character + TEST_ASSERT_TRUE(ISEOL('\r')); // '\r' is an end-of-line character + TEST_ASSERT_FALSE(ISEOL('a')); // 'a' is not an end-of-line character +} + +MARLIN_TEST(macros_value_functions, NUMERIC) { + // Test NUMERIC macro + TEST_ASSERT_TRUE(NUMERIC('0')); // Edge case: '0' is the lowest numeric character + TEST_ASSERT_TRUE(NUMERIC('5')); // '5' is a numeric character + TEST_ASSERT_TRUE(NUMERIC('9')); // Edge case: '9' is the highest numeric character + TEST_ASSERT_FALSE(NUMERIC('0' - 1)); // Edge case: '/' is just before '0' in ASCII + TEST_ASSERT_FALSE(NUMERIC('9' + 1)); // Edge case: ':' is just after '9' in ASCII + TEST_ASSERT_FALSE(NUMERIC('a')); // 'a' is not a numeric character +} + +MARLIN_TEST(macros_value_functions, DECIMAL) { + // Test DECIMAL macro + TEST_ASSERT_TRUE(DECIMAL('0')); // Edge case: '0' is the lowest numeric character + TEST_ASSERT_TRUE(DECIMAL('5')); // '5' is a numeric character + TEST_ASSERT_TRUE(DECIMAL('9')); // Edge case: '9' is the highest numeric character + TEST_ASSERT_TRUE(DECIMAL('.')); // '.' is a decimal character + TEST_ASSERT_FALSE(DECIMAL('0' - 1)); // Edge case: '/' is just before '0' in ASCII + TEST_ASSERT_FALSE(DECIMAL('9' + 1)); // Edge case: ':' is just after '9' in ASCII + TEST_ASSERT_FALSE(DECIMAL('-')); // '-' is not a decimal character, but can appear in numbers + TEST_ASSERT_FALSE(DECIMAL('+')); // '+' is not a decimal character, but can appear in numbers + TEST_ASSERT_FALSE(DECIMAL('e')); // 'e' is not a decimal character, but can appear in scientific notation +} + +MARLIN_TEST(macros_value_functions, HEXCHR) { + // Test HEXCHR macro + TEST_ASSERT_EQUAL(0, HEXCHR('0')); // Edge case: '0' is the lowest numeric character + TEST_ASSERT_EQUAL(9, HEXCHR('9')); // Edge case: '9' is the highest numeric character + TEST_ASSERT_EQUAL(10, HEXCHR('a')); // 'a' is a hex character with value 10 + TEST_ASSERT_EQUAL(10, HEXCHR('A')); // 'A' is a hex character with value 10 + TEST_ASSERT_EQUAL(15, HEXCHR('f')); // Edge case: 'f' is the highest lowercase hex character + TEST_ASSERT_EQUAL(15, HEXCHR('F')); // Edge case: 'F' is the highest uppercase hex character + TEST_ASSERT_EQUAL(-1, HEXCHR('g')); // 'g' is not a hex character +} + +MARLIN_TEST(macros_value_functions, NUMERIC_SIGNED) { + // Test NUMERIC_SIGNED macro + TEST_ASSERT_TRUE(NUMERIC_SIGNED('0')); // Edge case: '0' is the lowest numeric character + TEST_ASSERT_TRUE(NUMERIC_SIGNED('5')); // '5' is a numeric character + TEST_ASSERT_TRUE(NUMERIC_SIGNED('9')); // Edge case: '9' is the highest numeric character + TEST_ASSERT_TRUE(NUMERIC_SIGNED('-')); // '-' is not a numeric character, but can appear in signed numbers + TEST_ASSERT_TRUE(NUMERIC_SIGNED('+')); // '+' is not a numeric character, but can appear in signed numbers + TEST_ASSERT_FALSE(NUMERIC_SIGNED('.')); // '.' is not a numeric character + TEST_ASSERT_FALSE(NUMERIC_SIGNED('0' - 1)); // Edge case: '/' is just before '0' in ASCII + TEST_ASSERT_FALSE(NUMERIC_SIGNED('9' + 1)); // Edge case: ':' is just after '9' in ASCII + TEST_ASSERT_FALSE(NUMERIC_SIGNED('e')); // 'e' is not a numeric character, but can appear in scientific notation +} + +MARLIN_TEST(macros_value_functions, DECIMAL_SIGNED) { + // Test DECIMAL_SIGNED macro + TEST_ASSERT_TRUE(DECIMAL_SIGNED('0')); // Edge case: '0' is the lowest numeric character + TEST_ASSERT_TRUE(DECIMAL_SIGNED('5')); // '5' is a decimal character + TEST_ASSERT_TRUE(DECIMAL_SIGNED('9')); // Edge case: '9' is the highest numeric character + TEST_ASSERT_TRUE(DECIMAL_SIGNED('-')); // '-' is not a numeric character, but can appear in signed numbers + TEST_ASSERT_TRUE(DECIMAL_SIGNED('+')); // '+' is not a numeric character, but can appear in signed numbers + TEST_ASSERT_TRUE(DECIMAL_SIGNED('.')); // '.' is a decimal character + TEST_ASSERT_FALSE(DECIMAL_SIGNED('0' - 1)); // Edge case: '/' is just before '0' in ASCII + TEST_ASSERT_FALSE(DECIMAL_SIGNED('9' + 1)); // Edge case: ':' is just after '9' in ASCII + TEST_ASSERT_FALSE(DECIMAL_SIGNED('e')); // 'e' is not a decimal character, but can appear in scientific notation +} + +MARLIN_TEST(macros_array, COUNT) { + // Test COUNT macro + int array[10]; + TEST_ASSERT_EQUAL(10, COUNT(array)); // The array has 10 elements +} + +MARLIN_TEST(macros_array, ZERO) { + // Test ZERO macro + int array[5] = {1, 2, 3, 4, 5}; + ZERO(array); + for (auto& element : array) { + TEST_ASSERT_EQUAL(0, element); + } +} + +MARLIN_TEST(macros_array, COPY) { + int array1[5] = {1, 2, 3, 4, 5}; + int array2[5] = {0}; + COPY(array2, array1); + for (const auto& element : array1) { + TEST_ASSERT_EQUAL(element, array2[&element - &array1[0]]); // All elements should be equal + } +} + +MARLIN_TEST(macros_expansion, CODE_N) { + int a = 0; + CODE_N(0, a+=1, a+=2, a+=3, a+=4, a+=5, a+=6, a+=7, a+=8, a+=9, a+=10, a+=11, a+=12, a+=13, a+=14, a+=15, a+=16); + TEST_ASSERT_EQUAL(0, a); + + a = 0; + CODE_N(1, a+=1, a+=2, a+=3, a+=4, a+=5, a+=6, a+=7, a+=8, a+=9, a+=10, a+=11, a+=12, a+=13, a+=14, a+=15, a+=16); + TEST_ASSERT_EQUAL(1, a); + + a = 0; + CODE_N(2, a+=1, a+=2, a+=3, a+=4, a+=5, a+=6, a+=7, a+=8, a+=9, a+=10, a+=11, a+=12, a+=13, a+=14, a+=15, a+=16); + TEST_ASSERT_EQUAL(3, a); + + a = 0; + CODE_N(16, a+=1, a+=2, a+=3, a+=4, a+=5, a+=6, a+=7, a+=8, a+=9, a+=10, a+=11, a+=12, a+=13, a+=14, a+=15, a+=16); + TEST_ASSERT_EQUAL(136, a); + + // 16 is the highest number supported by the CODE_N macro +} + +MARLIN_TEST(macros_expansion, GANG_N) { + TEST_ASSERT_EQUAL(0, 0 GANG_N(0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16)); + TEST_ASSERT_EQUAL(1, 0 GANG_N(1, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16)); + TEST_ASSERT_EQUAL(3, 0 GANG_N(2, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16)); + TEST_ASSERT_EQUAL(136, 0 GANG_N(16, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16)); + + // 16 is the highest number supported by the GANG_N macro +} + +MARLIN_TEST(macros_expansion, GANG_N_1) { + // Count by twos to be sure it can't bass by returning N + TEST_ASSERT_EQUAL(0, 0 GANG_N_1(0, +2)); + TEST_ASSERT_EQUAL(2, 0 GANG_N_1(1, +2)); + TEST_ASSERT_EQUAL(4, 0 GANG_N_1(2, +2)); + TEST_ASSERT_EQUAL(32, 0 GANG_N_1(16, +2)); +} + +MARLIN_TEST(macros_expansion, LIST_N) { + std::vector expected, result; + int compare_size; + + expected = {}; + result = {LIST_N(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)}; + TEST_ASSERT_EQUAL(expected.size(), result.size()); + compare_size = _MIN(expected.size(), result.size()); + for (int i = 0; i < compare_size; i++) { + TEST_ASSERT_EQUAL(expected[i], result[i]); + } + + expected = {1}; + result = {LIST_N(1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)}; + TEST_ASSERT_EQUAL(expected.size(), result.size()); + compare_size = _MIN(expected.size(), result.size()); + for (int i = 0; i < compare_size; i++) { + TEST_ASSERT_EQUAL(expected[i], result[i]); + } + + expected = {1, 2}; + result = {LIST_N(2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)}; + TEST_ASSERT_EQUAL(expected.size(), result.size()); + compare_size = _MIN(expected.size(), result.size()); + for (int i = 0; i < compare_size; i++) { + TEST_ASSERT_EQUAL(expected[i], result[i]); + } + + expected = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + result = {LIST_N(16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)}; + TEST_ASSERT_EQUAL(expected.size(), result.size()); + compare_size = _MIN(expected.size(), result.size()); + for (int i = 0; i < compare_size; i++) { + TEST_ASSERT_EQUAL(expected[i], result[i]); + } +} + +MARLIN_TEST(macros_expansion, LIST_N_1) { + std::vector expected, result; + int compare_size; + + expected = {}; + result = {LIST_N_1(0, 1)}; + TEST_ASSERT_EQUAL(expected.size(), result.size()); + compare_size = _MIN(expected.size(), result.size()); + for (int i = 0; i < compare_size; i++) { + TEST_ASSERT_EQUAL(expected[i], result[i]); + } + + expected = {2}; + result = {LIST_N_1(1, 2)}; + TEST_ASSERT_EQUAL(expected.size(), result.size()); + compare_size = _MIN(expected.size(), result.size()); + for (int i = 0; i < compare_size; i++) { + TEST_ASSERT_EQUAL(expected[i], result[i]); + } + + expected = {1, 1}; + result = {LIST_N_1(2, 1)}; + TEST_ASSERT_EQUAL(expected.size(), result.size()); + compare_size = _MIN(expected.size(), result.size()); + for (int i = 0; i < compare_size; i++) { + TEST_ASSERT_EQUAL(expected[i], result[i]); + } + + expected = std::vector(16, 1); + result = {LIST_N_1(16, 1)}; + TEST_ASSERT_EQUAL(expected.size(), result.size()); + compare_size = _MIN(expected.size(), result.size()); + for (int i = 0; i < compare_size; i++) { + TEST_ASSERT_EQUAL(expected[i], result[i]); + } +} + +MARLIN_TEST(macros_expansion, ARRAY_N) { + // Test ARRAY_N macro + std::array expected = {1, 2, 3, 4, 5}; + std::array result = ARRAY_N(5, 1, 2, 3, 4, 5); + TEST_ASSERT_EQUAL(expected.size(), result.size()); + + std::array expected2 = {1, 2, 3}; + std::array result2 = ARRAY_N(3, 1, 2, 3); + TEST_ASSERT_EQUAL(expected2.size(), result2.size()); +} + +MARLIN_TEST(macros_expansion, ARRAY_N_1) { + // Test ARRAY_N_1 macro + std::array expected = {2, 2, 2, 2, 2}; + std::array result = ARRAY_N_1(5, 2); + TEST_ASSERT_EQUAL(expected.size(), result.size()); + + std::array expected2 = {1, 1, 1}; + std::array result2 = ARRAY_N_1(3, 1); + TEST_ASSERT_EQUAL(expected2.size(), result2.size()); +} + +MARLIN_TEST(macros_math, CEILING) { + TEST_ASSERT_EQUAL(2, CEILING(3, 2)); + TEST_ASSERT_EQUAL(5, CEILING(10, 2)); + TEST_ASSERT_EQUAL(0, CEILING(0, 2)); +} + +MARLIN_TEST(macros_math, ABS) { + TEST_ASSERT_EQUAL(5, ABS(-5)); + TEST_ASSERT_EQUAL(5, ABS(5)); + TEST_ASSERT_EQUAL_FLOAT(5.5, ABS(-5.5)); + TEST_ASSERT_EQUAL_FLOAT(5.5, ABS(5.5)); +} + +MARLIN_TEST(macros_float, UNEAR_ZERO) { + TEST_ASSERT_TRUE(UNEAR_ZERO(0.0000009f)); + TEST_ASSERT_FALSE(UNEAR_ZERO(0.000001f)); +} + +MARLIN_TEST(macros_float, NEAR_ZERO) { + TEST_ASSERT_TRUE(NEAR_ZERO(0.0000001f)); + TEST_ASSERT_TRUE(NEAR_ZERO(-0.0000001f)); + TEST_ASSERT_FALSE(NEAR_ZERO(0.0000011f)); + TEST_ASSERT_FALSE(NEAR_ZERO(-0.0000011f)); +} + +MARLIN_TEST(macros_float, NEAR) { + TEST_ASSERT_TRUE(NEAR(0.000001f, 0.000002f)); + TEST_ASSERT_FALSE(NEAR(0.0000009f, 0.000002f)); +} + +MARLIN_TEST(macros_float, RECIPROCAL) { + TEST_ASSERT_EQUAL_FLOAT(1.0f, RECIPROCAL(1.0f)); + TEST_ASSERT_EQUAL_FLOAT(0.0f, RECIPROCAL(0.0f)); + TEST_ASSERT_EQUAL_FLOAT(2.0f, RECIPROCAL(0.5f)); + TEST_ASSERT_EQUAL_FLOAT(-2.0f, RECIPROCAL(-0.5f)); + TEST_ASSERT_EQUAL_FLOAT(0.0f, RECIPROCAL(0.0000001f)); + TEST_ASSERT_EQUAL_FLOAT(0.0f, RECIPROCAL(-0.0000001f)); +} + +MARLIN_TEST(macros_float, FIXFLOAT) { + TEST_ASSERT_EQUAL(0.0000005f, FIXFLOAT(0.0f)); + TEST_ASSERT_EQUAL(-0.0000005f, FIXFLOAT(-0.0f)); +} + +MARLIN_TEST(macros_math, MATH_MACROS) { + // Sanity check of macros typically mapped to compiler functions + TEST_ASSERT_EQUAL_FLOAT(0.0f, ACOS(1.0f)); + TEST_ASSERT_EQUAL_FLOAT(0.785398f, ATAN2(1.0f, 1.0f)); + TEST_ASSERT_EQUAL_FLOAT(8.0f, POW(2.0f, 3.0f)); + TEST_ASSERT_EQUAL_FLOAT(2.0f, SQRT(4.0f)); + TEST_ASSERT_EQUAL_FLOAT(0.5f, RSQRT(4.0f)); + TEST_ASSERT_EQUAL_FLOAT(2.0f, CEIL(1.5f)); + TEST_ASSERT_EQUAL_FLOAT(1.0f, FLOOR(1.5f)); + TEST_ASSERT_EQUAL_FLOAT(1.0f, TRUNC(1.5f)); + TEST_ASSERT_EQUAL(2, LROUND(1.5f)); + TEST_ASSERT_EQUAL_FLOAT(1.0f, FMOD(5.0f, 2.0f)); + TEST_ASSERT_EQUAL_FLOAT(5.0f, HYPOT(3.0f, 4.0f)); +} + +MARLIN_TEST(macros_math, MIN_MAX) { + // _MIN tests + TEST_ASSERT_EQUAL(-1, _MIN(-1, 0)); + TEST_ASSERT_EQUAL(-1, _MIN(0, -1)); + TEST_ASSERT_EQUAL(-1, _MIN(-1, 1)); + TEST_ASSERT_EQUAL(-1, _MIN(1, -1)); + TEST_ASSERT_EQUAL(-1, _MIN(-1, -1)); + TEST_ASSERT_EQUAL(1, _MIN(1, 1)); + TEST_ASSERT_EQUAL_FLOAT(-1.5f, _MIN(-1.5f, 0.5f)); + TEST_ASSERT_EQUAL_FLOAT(-1.5f, _MIN(0.5f, -1.5f)); + + // _MAX tests + TEST_ASSERT_EQUAL(0, _MAX(-1, 0)); + TEST_ASSERT_EQUAL(0, _MAX(0, -1)); + TEST_ASSERT_EQUAL(1, _MAX(-1, 1)); + TEST_ASSERT_EQUAL(1, _MAX(1, -1)); + TEST_ASSERT_EQUAL(-1, _MAX(-1, -1)); + TEST_ASSERT_EQUAL(1, _MAX(1, 1)); + TEST_ASSERT_EQUAL_FLOAT(0.5f, _MAX(-1.5f, 0.5f)); + TEST_ASSERT_EQUAL_FLOAT(0.5f, _MAX(0.5f, -1.5f)); +} + +MARLIN_TEST(macros_math, INCREMENT) { + TEST_ASSERT_EQUAL(1, INCREMENT(0)); + TEST_ASSERT_EQUAL(21, INCREMENT(20)); + // 20 is the highest number supported by the INCREMENT macro +} + +MARLIN_TEST(macros_math, ADD) { + // Test smallest add + TEST_ASSERT_EQUAL(0, ADD0(0)); + TEST_ASSERT_EQUAL(10, ADD0(10)); + + // Test largest add + TEST_ASSERT_EQUAL(10, ADD10(0)); + TEST_ASSERT_EQUAL(20, ADD10(10)); +} + +MARLIN_TEST(macros_math, SUM) { + // Test smallest sum + TEST_ASSERT_EQUAL(3, SUM(0, 3)); + TEST_ASSERT_EQUAL(7, SUM(3, 4)); + + // Test largest sum + TEST_ASSERT_EQUAL(15, SUM(10, 5)); + TEST_ASSERT_EQUAL(19, SUM(9, 10)); +} + +MARLIN_TEST(macros_math, DOUBLE) { + // Test double + TEST_ASSERT_EQUAL(0, DOUBLE(0)); + TEST_ASSERT_EQUAL(2, DOUBLE(1)); + TEST_ASSERT_EQUAL(4, DOUBLE(2)); + TEST_ASSERT_EQUAL(20, DOUBLE(10)); +} + +MARLIN_TEST(macros_math, DECREMENT) { + TEST_ASSERT_EQUAL(0, DECREMENT(1)); + TEST_ASSERT_EQUAL(14, DECREMENT(15)); +} + +MARLIN_TEST(macros_math, SUB) { + // Test smallest subtraction + TEST_ASSERT_EQUAL(0, SUB0(0)); + TEST_ASSERT_EQUAL(10, SUB0(10)); + + // Test subtracting 1 + TEST_ASSERT_EQUAL(0, SUB1(1)); + TEST_ASSERT_EQUAL(5, SUB1(6)); + + // Test largest subtraction + TEST_ASSERT_EQUAL(0, SUB10(10)); + TEST_ASSERT_EQUAL(5, SUB10(15)); +} + + +// Define a helper macro for testing +#define TEST_OP(i) ++counter; +#define TEST_OP2(i, j) counter += j; + +MARLIN_TEST(macros_repeat, REPEAT) { + int counter = 0; + REPEAT(5, TEST_OP); + TEST_ASSERT_EQUAL(5, counter); +} + +MARLIN_TEST(macros_repeat, REPEAT_1) { + int counter = 0; + REPEAT_1(5, TEST_OP); + TEST_ASSERT_EQUAL(5, counter); +} + +MARLIN_TEST(macros_repeat, REPEAT2) { + int counter = 0; + REPEAT2(5, TEST_OP2, 1); + TEST_ASSERT_EQUAL(5, counter); +} + +MARLIN_TEST(macros_repeat, RREPEAT) { + int counter = 0; + RREPEAT(5, TEST_OP); + TEST_ASSERT_EQUAL(5, counter); +} + +MARLIN_TEST(macros_repeat, RREPEAT_1) { + int counter = 0; + RREPEAT_1(5, TEST_OP); + TEST_ASSERT_EQUAL(5, counter); +} + +MARLIN_TEST(macros_repeat, RREPEAT2) { + int counter = 0; + RREPEAT2(5, TEST_OP2, 1); + TEST_ASSERT_EQUAL(5, counter); +} From dca6afc26efb860e60e8c47c2390e11f426dbe16 Mon Sep 17 00:00:00 2001 From: Chris <52449218+shadow578@users.noreply.github.com> Date: Sun, 14 Apr 2024 20:42:57 +0200 Subject: [PATCH 076/111] =?UTF-8?q?=E2=9C=A8=F0=9F=90=9B=20HC32=20-=20Add?= =?UTF-8?q?=20SERIAL=5FDMA,=20fix=20SDIO=20and=20MEATPACK=20(#26845)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix meatpack on hc32 * add support for SERIAL_DMA on HC32 * add additional checks in HC32 HAL * migrate HC32 HAL to use app_config.h * fix memory leak in HC32 sdio HAL https://github.com/MarlinFirmware/Marlin/pull/26845#issuecomment-1980218771 * hc32: fail if both EMERGENCY_PARSER and SERIAL_DMA are enabled --- Marlin/Configuration_adv.h | 2 +- Marlin/src/HAL/HC32/MarlinHAL.cpp | 31 +++++++++++- Marlin/src/HAL/HC32/MarlinSerial.cpp | 26 ++++++++-- Marlin/src/HAL/HC32/MarlinSerial.h | 46 +++++++++++++++--- Marlin/src/HAL/HC32/app_config.h | 70 +++++++++++++++++++++++++++ Marlin/src/HAL/HC32/inc/SanityCheck.h | 29 +++++++++++ Marlin/src/HAL/HC32/sdio.cpp | 43 +++++++++------- Marlin/src/inc/SanityCheck.h | 6 ++- ini/hc32.ini | 27 +++++------ 9 files changed, 233 insertions(+), 47 deletions(-) create mode 100644 Marlin/src/HAL/HC32/app_config.h diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 559eafdbf6a6..95e680a6d43d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2698,7 +2698,7 @@ * This feature is EXPERIMENTAL so use with caution and test thoroughly. * Enable this option to receive data on the serial ports via the onboard DMA * controller for more stable and reliable high-speed serial communication. - * Only some STM32 MCUs are currently supported. + * Support is currently limited to some STM32 MCUs and all HC32 MCUs. * Note: This has no effect on emulated USB serial ports. */ //#define SERIAL_DMA diff --git a/Marlin/src/HAL/HC32/MarlinHAL.cpp b/Marlin/src/HAL/HC32/MarlinHAL.cpp index 1ab374fbf15c..acb96dadc600 100644 --- a/Marlin/src/HAL/HC32/MarlinHAL.cpp +++ b/Marlin/src/HAL/HC32/MarlinHAL.cpp @@ -123,6 +123,11 @@ void MarlinHAL::init() { // Register min serial TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); + + // warn if low memory after init + if (freeMemory() < 1024) { + SERIAL_WARN_MSG("HAL: low memory after init!\n"); + } } void MarlinHAL::init_board() {} @@ -147,7 +152,31 @@ void MarlinHAL::delay_ms(const int ms) { delay(ms); } -void MarlinHAL::idletask() {} +void MarlinHAL::idletask() { + #if ENABLED(MARLIN_DEV_MODE) + // check & print serial RX errors + MSerialT *serials[] = { &MSerial1, &MSerial2 }; + for (int serial = 0; serial < 2; serial++) { + usart_receive_error_t err = serials[serial]->getReceiveError(); + if (err != usart_receive_error_t::None) { + // "Warning: MSerial[n] RX [Framing|Parity|Overrun] Error" + SERIAL_WARN_START(); + SERIAL_ECHOPGM(" MSerial"); + SERIAL_ECHO(serial + 1); + SERIAL_ECHOPGM(" RX "); + switch(err) { + case usart_receive_error_t::FramingError: SERIAL_ECHOPGM("Framing"); break; + case usart_receive_error_t::ParityError: SERIAL_ECHOPGM("Parity"); break; + case usart_receive_error_t::OverrunError: SERIAL_ECHOPGM("Overrun"); break; + case usart_receive_error_t::RxDataDropped: SERIAL_ECHOPGM("DataDropped"); break; + default: break; + } + SERIAL_ECHOPGM(" Error"); + SERIAL_EOL(); + } + } + #endif +} uint8_t MarlinHAL::get_reset_source() { // Query reset cause from RMU diff --git a/Marlin/src/HAL/HC32/MarlinSerial.cpp b/Marlin/src/HAL/HC32/MarlinSerial.cpp index eb203f79d3ba..11d4abfab969 100644 --- a/Marlin/src/HAL/HC32/MarlinSerial.cpp +++ b/Marlin/src/HAL/HC32/MarlinSerial.cpp @@ -46,14 +46,34 @@ constexpr bool serial_handles_emergency(int port) { // // Define serial ports // -#define DEFINE_HWSERIAL_MARLIN(name, n) \ + +// serial port where RX and TX use IRQs +#define DEFINE_IRQ_SERIAL_MARLIN(name, n) \ MSerialT name(serial_handles_emergency(n), \ &USART##n##_config, \ BOARD_USART##n##_TX_PIN, \ BOARD_USART##n##_RX_PIN); -DEFINE_HWSERIAL_MARLIN(MSerial1, 1); -DEFINE_HWSERIAL_MARLIN(MSerial2, 2); +// serial port where RX uses DMA and TX uses IRQs +// all serial ports use DMA1 +// since there are 4 USARTs and 4 DMA channels, we can use the USART number as the DMA channel +#define DEFINE_DMA_SERIAL_MARLIN(name, n) \ + MSerialT name(serial_handles_emergency(n), \ + &USART##n##_config, \ + BOARD_USART##n##_TX_PIN, \ + BOARD_USART##n##_RX_PIN, \ + M4_DMA1, \ + ((en_dma_channel_t)(n - 1))); // map USART1 to DMA channel 0, USART2 to DMA channel 1, etc. + +#define DEFINE_SERIAL_MARLIN(name, n) TERN(SERIAL_DMA, DEFINE_DMA_SERIAL_MARLIN(name, n), DEFINE_IRQ_SERIAL_MARLIN(name, n)) + +DEFINE_SERIAL_MARLIN(MSerial1, 1); +DEFINE_SERIAL_MARLIN(MSerial2, 2); + +// TODO: remove this warning when SERIAL_DMA has been tested some more +#if ENABLED(SERIAL_DMA) + #warning "SERIAL_DMA may be unstable on HC32F460." +#endif // // Serial port assertions diff --git a/Marlin/src/HAL/HC32/MarlinSerial.h b/Marlin/src/HAL/HC32/MarlinSerial.h index 08eeef43951e..b63b069b9dd5 100644 --- a/Marlin/src/HAL/HC32/MarlinSerial.h +++ b/Marlin/src/HAL/HC32/MarlinSerial.h @@ -25,17 +25,42 @@ #include // Optionally set uart IRQ priority to reduce overflow errors -// #define UART_IRQ_PRIO 1 +//#define UART_RX_IRQ_PRIO 1 +//#define UART_TX_IRQ_PRIO 1 +//#define UART_RX_DMA_IRQ_PRIO 1 struct MarlinSerial : public Usart { - MarlinSerial(struct usart_config_t *usart_device, gpio_pin_t tx_pin, gpio_pin_t rx_pin) : Usart(usart_device, tx_pin, rx_pin) {} + MarlinSerial( + struct usart_config_t *usart_device, + gpio_pin_t tx_pin, + gpio_pin_t rx_pin + #if ENABLED(SERIAL_DMA) + , M4_DMA_TypeDef *dma_unit = nullptr, + en_dma_channel_t rx_dma_channel = DmaCh0 + #endif + ) : Usart(usart_device, tx_pin, rx_pin) { + #if ENABLED(SERIAL_DMA) + if (dma_unit != nullptr) { + enableRxDma(dma_unit, rx_dma_channel); + } + #endif + } - #ifdef UART_IRQ_PRIO + #if defined(UART_RX_IRQ_PRIO) || defined(UART_TX_IRQ_PRIO) || defined(UART_RX_DMA_IRQ_PRIO) void setPriority() { - NVIC_SetPriority(c_dev()->interrupts.rx_data_available.interrupt_number, UART_IRQ_PRIO); - NVIC_SetPriority(c_dev()->interrupts.rx_error.interrupt_number, UART_IRQ_PRIO); - NVIC_SetPriority(c_dev()->interrupts.tx_buffer_empty.interrupt_number, UART_IRQ_PRIO); - NVIC_SetPriority(c_dev()->interrupts.tx_complete.interrupt_number, UART_IRQ_PRIO); + #if defined(UART_RX_IRQ_PRIO) + NVIC_SetPriority(c_dev()->interrupts.rx_data_available.interrupt_number, UART_RX_IRQ_PRIO); + NVIC_SetPriority(c_dev()->interrupts.rx_error.interrupt_number, UART_RX_IRQ_PRIO); + #endif + + #if defined(UART_TX_IRQ_PRIO) + NVIC_SetPriority(c_dev()->interrupts.tx_buffer_empty.interrupt_number, UART_TX_IRQ_PRIO); + NVIC_SetPriority(c_dev()->interrupts.tx_complete.interrupt_number, UART_TX_IRQ_PRIO); + #endif + + #if defined(UART_RX_DMA_IRQ_PRIO) && ENABLED(SERIAL_DMA) + NVIC_SetPriority(c_dev()->dma.rx.rx_data_available_dma_btc.interrupt_number, UART_RX_DMA_IRQ_PRIO); + #endif } void begin(uint32_t baud) { @@ -47,7 +72,12 @@ struct MarlinSerial : public Usart { Usart::begin(baud, config); setPriority(); } - #endif + + void begin(uint32_t baud, const stc_usart_uart_init_t *config, const bool rxNoiseFilter = true) { + Usart::begin(baud, config, rxNoiseFilter); + setPriority(); + } + #endif // UART_RX_IRQ_PRIO || UART_TX_IRQ_PRIO || UART_RX_DMA_IRQ_PRIO }; typedef Serial1Class MSerialT; diff --git a/Marlin/src/HAL/HC32/app_config.h b/Marlin/src/HAL/HC32/app_config.h new file mode 100644 index 000000000000..bc9d14b4c6b8 --- /dev/null +++ b/Marlin/src/HAL/HC32/app_config.h @@ -0,0 +1,70 @@ +/** + * app_config.h is included by the hc32f460 arduino build script for every source file. + * it is used to configure the arduino core (and ddl) automatically according + * to the settings in Configuration.h and Configuration_adv.h. + */ +#pragma once +#ifndef _HC32_APP_CONFIG_H_ +#define _HC32_APP_CONFIG_H_ + +#include "../../inc/MarlinConfigPre.h" + +// +// dev mode +// +#if ENABLED(MARLIN_DEV_MODE) + #define __DEBUG 1 + #define __CORE_DEBUG 1 +#endif + +// +// Fault Handlers and Panic +// + +#if ENABLED(POSTMORTEM_DEBUGGING) + // disable arduino core fault handler, as we define our own + #define CORE_DISABLE_FAULT_HANDLER 1 +#endif + +// force-enable panic handler so that we can use our custom one (in MinSerial) +#define PANIC_ENABLE 1 + +// use short filenames in ddl debug and core panic output +#define __DEBUG_SHORT_FILENAMES 1 +#define __PANIC_SHORT_FILENAMES 1 + +// omit panic messages in core panic output +#define __OMIT_PANIC_MESSAGE 1 + +// +// Usart +// + +// disable serial globals (Serial1, Serial2, ...), as we define our own +#define DISABLE_SERIAL_GLOBALS 1 + +// increase the size of the Usart buffers (both RX and TX) +// NOTE: +// the heap usage will increase by (SERIAL_BUFFER_SIZE - 64) * "number of serial ports used" +// if running out of heap, the system may become unstable +//#define SERIAL_BUFFER_SIZE 256 + +// enable support for Usart Clock Divider / Oversampling auto config +#define USART_AUTO_CLKDIV_OS_CONFIG 1 + +// enable USART_RX_DMA_SUPPORT core option when SERIAL_DMA is enabled +#if ENABLED(SERIAL_DMA) + #define USART_RX_DMA_SUPPORT 1 +#endif + +// +// Misc. +// + +// redirect printf to host serial +#define REDIRECT_PRINTF_TO_SERIAL 1 + +// FIXME override F_CPU to PCLK1, as marlin freaks out otherwise +#define F_CPU (SYSTEM_CLOCK_FREQUENCIES.pclk1) + +#endif // _HC32_APP_CONFIG_H_ diff --git a/Marlin/src/HAL/HC32/inc/SanityCheck.h b/Marlin/src/HAL/HC32/inc/SanityCheck.h index ef8d9a997583..0d05448f9815 100644 --- a/Marlin/src/HAL/HC32/inc/SanityCheck.h +++ b/Marlin/src/HAL/HC32/inc/SanityCheck.h @@ -20,6 +20,20 @@ * */ #pragma once +#include + +#if !defined(ARDUINO_CORE_VERSION_INT) || !defined(GET_VERSION_INT) + // version macros were introduced in arduino core version 1.1.0 + // below that version, we polyfill them + #define GET_VERSION_INT(major, minor, patch) ((major * 100000) + (minor * 1000) + patch) + #define ARDUINO_CORE_VERSION_INT GET_VERSION_INT(1, 0, 0) +#endif + +#if ARDUINO_CORE_VERSION_INT < GET_VERSION_INT(1, 1, 0) + // because we use app_config.h introduced in arduino core version 1.1.0, the + // HAL is not compatible with older versions + #error "The HC32 HAL is not compatible with Arduino Core versions < 1.1.0. Consider updating the Arduino Core." +#endif #ifndef BOARD_XTAL_FREQUENCY #error "BOARD_XTAL_FREQUENCY is required for HC32F460." @@ -74,3 +88,18 @@ #error "HC32 HAL uses a custom panic handler. Do not define PANIC_USARTx_TX_PIN." #endif #endif + +#if ENABLED(SERIAL_DMA) + #if !defined(USART_RX_DMA_SUPPORT) + #error "SERIAL_DMA requires USART_RX_DMA_SUPPORT to be enabled in the arduino core." + #endif + + // USART_RX_DMA_SUPPORT does not implement core_hook_usart_rx_irq, which is required for the emergency parser + #if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not supported with SERIAL_DMA. Please disable either SERIAL_DMA or EMERGENCY_PARSER." + #endif + + #if ARDUINO_CORE_VERSION_INT < GET_VERSION_INT(1, 1, 0) + #error "SERIAL_DMA is not supported with arduino core version < 1.1.0." + #endif +#endif diff --git a/Marlin/src/HAL/HC32/sdio.cpp b/Marlin/src/HAL/HC32/sdio.cpp index 4360d715ff19..3c4038f92d4f 100644 --- a/Marlin/src/HAL/HC32/sdio.cpp +++ b/Marlin/src/HAL/HC32/sdio.cpp @@ -54,7 +54,7 @@ fn \ } -stc_sd_handle_t *handle; +stc_sd_handle_t *handle = nullptr; bool SDIO_Init() { // Configure SDIO pins @@ -66,36 +66,45 @@ bool SDIO_Init() { GPIO_SetFunc(BOARD_SDIO_CMD, Func_Sdio); GPIO_SetFunc(BOARD_SDIO_DET, Func_Sdio); + // If a handle is already initialized, free it before creating a new one + // otherwise, we will leak memory, which will eventually crash the system + if (handle != nullptr) { + delete handle->pstcDmaInitCfg; + delete handle->pstcCardInitCfg; + delete handle; + handle = nullptr; + } + // Create DMA configuration stc_sdcard_dma_init_t *dmaConf = new stc_sdcard_dma_init_t; dmaConf->DMAx = SDIO_DMA_PERIPHERAL; dmaConf->enDmaCh = SDIO_DMA_CHANNEL; + // Create card configuration + // This should be a fairly safe configuration for most cards + stc_sdcard_init_t *cardConf = new stc_sdcard_init_t; + cardConf->enBusWidth = SdiocBusWidth4Bit; + cardConf->enClkFreq = SdiocClk400K; + cardConf->enSpeedMode = SdiocNormalSpeedMode; + cardConf->pstcInitCfg = nullptr; + // Create handle in DMA mode handle = new stc_sd_handle_t; handle->SDIOCx = SDIO_PERIPHERAL; handle->enDevMode = SdCardDmaMode; handle->pstcDmaInitCfg = dmaConf; - - // Create card configuration - // This should be a fairly safe configuration for most cards - stc_sdcard_init_t cardConf = { - .enBusWidth = SdiocBusWidth4Bit, - .enClkFreq = SdiocClk400K, - .enSpeedMode = SdiocNormalSpeedMode, - //.pstcInitCfg = NULL, - }; + //handle->pstcCardInitCfg = cardConf; // assigned in SDCARD_Init // Initialize sd card - en_result_t rc = SDCARD_Init(handle, &cardConf); + en_result_t rc = SDCARD_Init(handle, cardConf); if (rc != Ok) printf("SDIO_Init() error (rc=%u)\n", rc); return rc == Ok; } bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) { - CORE_ASSERT(handle != NULL, "SDIO not initialized"); - CORE_ASSERT(dst != NULL, "SDIO_ReadBlock dst is NULL"); + CORE_ASSERT(handle != nullptr, "SDIO not initialized", return false); + CORE_ASSERT(dst != nullptr, "SDIO_ReadBlock dst is NULL", return false); WITH_RETRY(SDIO_READ_RETRIES, { en_result_t rc = SDCARD_ReadBlocks(handle, block, 1, dst, SDIO_READ_TIMEOUT); @@ -107,8 +116,8 @@ bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) { } bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) { - CORE_ASSERT(handle != NULL, "SDIO not initialized"); - CORE_ASSERT(src != NULL, "SDIO_WriteBlock src is NULL"); + CORE_ASSERT(handle != nullptr, "SDIO not initialized", return false); + CORE_ASSERT(src != nullptr, "SDIO_WriteBlock src is NULL", return false); WITH_RETRY(SDIO_WRITE_RETRIES, { en_result_t rc = SDCARD_WriteBlocks(handle, block, 1, (uint8_t *)src, SDIO_WRITE_TIMEOUT); @@ -120,12 +129,12 @@ bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) { } bool SDIO_IsReady() { - CORE_ASSERT(handle != NULL, "SDIO not initialized"); + CORE_ASSERT(handle != nullptr, "SDIO not initialized", return false); return bool(handle->stcCardStatus.READY_FOR_DATA); } uint32_t SDIO_GetCardSize() { - CORE_ASSERT(handle != NULL, "SDIO not initialized"); + CORE_ASSERT(handle != nullptr, "SDIO not initialized", return 0); // Multiply number of blocks with block size to get size in bytes const uint64_t cardSizeBytes = uint64_t(handle->stcSdCardInfo.u32LogBlockNbr) * uint64_t(handle->stcSdCardInfo.u32LogBlockSize); diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 392d75675e2d..5f14c568ae24 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -235,9 +235,11 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "SERIAL_XON_XOFF and SERIAL_STATS_* features not supported on USB-native AVR devices." #endif -// Serial DMA is only available for some STM32 MCUs +// Serial DMA is only available for some STM32 MCUs and HC32 #if ENABLED(SERIAL_DMA) - #if !HAL_STM32 || NONE(STM32F0xx, STM32F1xx, STM32F2xx, STM32F4xx, STM32F7xx) + #if defined(ARDUINO_ARCH_HC32) + // checks for HC32 are located in HAL/HC32/inc/SanityCheck.h + #elif !HAL_STM32 || NONE(STM32F0xx, STM32F1xx, STM32F2xx, STM32F4xx, STM32F7xx) #error "SERIAL_DMA is only available for some STM32 MCUs and requires HAL/STM32." #elif !defined(HAL_UART_MODULE_ENABLED) || defined(HAL_UART_MODULE_ONLY) #error "SERIAL_DMA requires STM32 platform HAL UART (without HAL_UART_MODULE_ONLY)." diff --git a/ini/hc32.ini b/ini/hc32.ini index 9bf15447e2cd..2af761128cae 100644 --- a/ini/hc32.ini +++ b/ini/hc32.ini @@ -33,22 +33,14 @@ build_src_filter = ${common.default_src_filter} + + Date: Sun, 14 Apr 2024 21:04:52 +0100 Subject: [PATCH 077/111] =?UTF-8?q?=E2=9C=A8=20Add=20Dagoma=20D6=20as=20fo?= =?UTF-8?q?und=20in=20DiscoUltimate=20v2=20TMC=20(#26874)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add Dagoma D6 board as used in their DiscoUltimate v2 TMC. Taken from the Dagoma fork of Marlin DU_MC branch where it is called FYSETC_DAGOMA_F5 and explicitly confirmed by Dagoma as being the D6: "the BOARD_FYSETC_DAGOMA_F5 is effectively the definition for the D6" --------- Co-authored-by: thisiskeithb <13375512+thisiskeithb@users.noreply.github.com> Co-authored-by: Orel <37673727+0r31@users.noreply.github.com> --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + Marlin/src/pins/ramps/pins_DAGOMA_D6.h | 124 +++++++++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 Marlin/src/pins/ramps/pins_DAGOMA_D6.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 1dfcabdefb86..cef30c5cd226 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -131,6 +131,7 @@ #define BOARD_PXMALION_CORE_I3 1164 // Pxmalion Core I3 #define BOARD_PANOWIN_CUTLASS 1165 // Panowin Cutlass (as found in the Panowin F1) #define BOARD_KODAMA_BARDO 1166 // Kodama Bardo V1.x (as found in the Kodama Trinus) +#define BOARD_DAGOMA_D6 1167 // Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC) // // RAMBo and derivatives diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 53d31c016819..cdc4fdb7a406 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -224,6 +224,8 @@ #include "ramps/pins_RAMPS_CREALITY.h" // ATmega2560 env:mega2560 #elif MB(DAGOMA_F5) #include "ramps/pins_DAGOMA_F5.h" // ATmega2560 env:mega2560 +#elif MB(DAGOMA_D6) + #include "ramps/pins_DAGOMA_D6.h" // ATmega2560 env:mega2560ext #elif MB(FYSETC_F6_13) #include "ramps/pins_FYSETC_F6_13.h" // ATmega2560 env:FYSETC_F6 #elif MB(FYSETC_F6_14) diff --git a/Marlin/src/pins/ramps/pins_DAGOMA_D6.h b/Marlin/src/pins/ramps/pins_DAGOMA_D6.h new file mode 100644 index 000000000000..de5dbbd9bb00 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_DAGOMA_D6.h @@ -0,0 +1,124 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2024 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "Dagoma3D D6 supports up to 2 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "Dagoma3D D6" + +// +// Trinamic Stallguard pins +// +#define X_DIAG_PIN 43 +#define Y_DIAG_PIN 41 +#define Z_DIAG_PIN 47 +#define E0_DIAG_PIN 21 +#define E1_DIAG_PIN 20 + +// +// Endstops +// +#define X_STOP_PIN 2 +#define Y_STOP_PIN 3 +#define Z_STOP_PIN 15 + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 39 +#endif +#if EXTRUDERS > 1 && !defined(FIL_RUNOUT2_PIN) + #define FIL_RUNOUT2_PIN 14 +#endif + +// Alter timing for graphical display +#if IS_U8GLIB_ST7920 + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 0 + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 250 + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 250 + #endif +#endif + +#define KILL_PIN -1 // NC + +#define LCD_CONTRAST_DEFAULT 255 + +// +// Sensorless homing DIAG pin is not directly connected to the MCU. Close +// the jumper next to the limit switch socket when using sensorless homing. +// +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + */ + #define X_SERIAL_RX_PIN 73 + #define X_SERIAL_TX_PIN 73 + #define Y_SERIAL_RX_PIN 73 + #define Y_SERIAL_TX_PIN 73 + #define Z_SERIAL_RX_PIN 73 + #define Z_SERIAL_TX_PIN 73 + #define E0_SERIAL_RX_PIN 73 + #define E0_SERIAL_TX_PIN 73 + #define E1_SERIAL_RX_PIN 12 + #define E1_SERIAL_TX_PIN 12 + + // Default TMC slave addresses + #ifdef X_SLAVE_ADDRESS + static_assert(X_SLAVE_ADDRESS == 0, "X_SLAVE_ADDRESS must be 0 for BOARD_DAGOMA_D6."); + #else + #define X_SLAVE_ADDRESS 0 + #endif + #ifdef Y_SLAVE_ADDRESS + static_assert(Y_SLAVE_ADDRESS == 1, "Y_SLAVE_ADDRESS must be 1 for BOARD_DAGOMA_D6."); + #else + #define Y_SLAVE_ADDRESS 1 + #endif + #ifdef Z_SLAVE_ADDRESS + static_assert(Z_SLAVE_ADDRESS == 2, "Z_SLAVE_ADDRESS must be 2 for BOARD_DAGOMA_D6."); + #else + #define Z_SLAVE_ADDRESS 2 + #endif + #ifdef E0_SLAVE_ADDRESS + static_assert(E0_SLAVE_ADDRESS == 3, "E0_SLAVE_ADDRESS must be 3 for BOARD_DAGOMA_D6."); + #else + #define E0_SLAVE_ADDRESS 3 + #endif + #ifdef E1_SLAVE_ADDRESS + static_assert(E1_SLAVE_ADDRESS == 3, "E1_SLAVE_ADDRESS must be 3 for BOARD_DAGOMA_D6."); + #else + #define E1_SLAVE_ADDRESS 3 + #endif + +#endif + +// +// Import default RAMPS 1.4 pins +// +#include "pins_RAMPS.h" From 02691060664b1d582ed72c207d0062bd7e5813d4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 14 Apr 2024 16:24:14 -0500 Subject: [PATCH 078/111] =?UTF-8?q?=F0=9F=8E=A8=20Dagoma=20D6=20followup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/ramps/pins_DAGOMA_D6.h | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/Marlin/src/pins/ramps/pins_DAGOMA_D6.h b/Marlin/src/pins/ramps/pins_DAGOMA_D6.h index de5dbbd9bb00..2a89647376e1 100644 --- a/Marlin/src/pins/ramps/pins_DAGOMA_D6.h +++ b/Marlin/src/pins/ramps/pins_DAGOMA_D6.h @@ -90,31 +90,26 @@ #define E1_SERIAL_TX_PIN 12 // Default TMC slave addresses - #ifdef X_SLAVE_ADDRESS - static_assert(X_SLAVE_ADDRESS == 0, "X_SLAVE_ADDRESS must be 0 for BOARD_DAGOMA_D6."); - #else + #ifndef X_SLAVE_ADDRESS #define X_SLAVE_ADDRESS 0 #endif - #ifdef Y_SLAVE_ADDRESS - static_assert(Y_SLAVE_ADDRESS == 1, "Y_SLAVE_ADDRESS must be 1 for BOARD_DAGOMA_D6."); - #else + #ifndef Y_SLAVE_ADDRESS #define Y_SLAVE_ADDRESS 1 #endif - #ifdef Z_SLAVE_ADDRESS - static_assert(Z_SLAVE_ADDRESS == 2, "Z_SLAVE_ADDRESS must be 2 for BOARD_DAGOMA_D6."); - #else + #ifndef Z_SLAVE_ADDRESS #define Z_SLAVE_ADDRESS 2 #endif - #ifdef E0_SLAVE_ADDRESS - static_assert(E0_SLAVE_ADDRESS == 3, "E0_SLAVE_ADDRESS must be 3 for BOARD_DAGOMA_D6."); - #else + #ifndef E0_SLAVE_ADDRESS #define E0_SLAVE_ADDRESS 3 #endif - #ifdef E1_SLAVE_ADDRESS - static_assert(E1_SLAVE_ADDRESS == 3, "E1_SLAVE_ADDRESS must be 3 for BOARD_DAGOMA_D6."); - #else + #ifndef E1_SLAVE_ADDRESS #define E1_SLAVE_ADDRESS 3 #endif + static_assert(X_SLAVE_ADDRESS == 0, "X_SLAVE_ADDRESS must be 0 for BOARD_DAGOMA_D6."); + static_assert(Y_SLAVE_ADDRESS == 1, "Y_SLAVE_ADDRESS must be 1 for BOARD_DAGOMA_D6."); + static_assert(Z_SLAVE_ADDRESS == 2, "Z_SLAVE_ADDRESS must be 2 for BOARD_DAGOMA_D6."); + static_assert(E0_SLAVE_ADDRESS == 3, "E0_SLAVE_ADDRESS must be 3 for BOARD_DAGOMA_D6."); + static_assert(E1_SLAVE_ADDRESS == 3, "E1_SLAVE_ADDRESS must be 3 for BOARD_DAGOMA_D6."); #endif From 3326c749f85ddfab6ba5879526466891f0e598a7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 14 Apr 2024 16:26:16 -0500 Subject: [PATCH 079/111] =?UTF-8?q?=F0=9F=93=9D=20Minor=20README=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 104 +++++++++++++++++++++--------------------------------- 1 file changed, 40 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index 83614ad9ccef..373444a1649a 100644 --- a/README.md +++ b/README.md @@ -39,16 +39,16 @@ To build and upload Marlin you will use one of these tools: Marlin is optimized to build with the **PlatformIO IDE** extension for **Visual Studio Code**. You can still build Marlin with **Arduino IDE**, and we hope to improve the Arduino build experience, but at this time PlatformIO is the better choice. +## 8-Bit AVR Boards + +We intend to continue supporting 8-bit AVR boards in perpetuity, maintaining a single codebase that can apply to all machines. We want casual hobbyists and tinkerers and owners of older machines to benefit from the community's innovations just as much as those with fancier machines. Plus, those old AVR-based machines are often the best for your testing and feedback! + ## Hardware Abstraction Layer (HAL) Marlin includes an abstraction layer to provide a common API for all the platforms it targets. This allows Marlin code to address the details of motion and user interface tasks at the lowest and highest levels with no system overhead, tying all events directly to the hardware clock. Every new HAL opens up a world of hardware. At this time we need HALs for RP2040 and the Duet3D family of boards. A HAL that wraps an RTOS is an interesting concept that could be explored. Did you know that Marlin includes a Simulator that can run on Windows, macOS, and Linux? Join the Discord to help move these sub-projects forward! -## 8-Bit AVR Boards - -A core tenet of this project is to keep supporting 8-bit AVR boards while also maintaining a single codebase that applies equally to all machines. We want casual hobbyists to benefit from the community's innovations as much as possible just as much as those with fancier machines. Plus, those old AVR-based machines are often the best for your testing and feedback! - ### Supported Platforms Platform|MCU|Example Boards @@ -71,22 +71,9 @@ A core tenet of this project is to keep supporting 8-bit AVR boards while also m [Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|ARM® Cortex-M7| Linux Native|x86/ARM/etc.|Raspberry Pi -## Submitting Patches - -Proposed patches should be submitted as a Pull Request against the ([bugfix-2.1.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.1.x)) branch. - -- This branch is for fixing bugs and integrating any new features for the duration of the Marlin 2.1.x life-cycle. -- Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers. -- Please submit Feature Requests and Bug Reports to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues/new/choose). Support resources are also listed there. -- Whenever you add new features, be sure to add tests to `buildroot/tests` and then run your tests locally, if possible. - - It's optional: Running all the tests on Windows might take a long time, and they will run anyway on GitHub. - - If you're running the tests on Linux (or on WSL with the code on a Linux volume) the speed is much faster. - - You can use `make tests-all-local` or `make tests-single-local TEST_TARGET=...`. - - If you prefer Docker you can use `make tests-all-local-docker` or `make tests-all-local-docker TEST_TARGET=...`. - ## Marlin Support -The Issue Queue is reserved for Bug Reports and Feature Requests. To get help with configuration and troubleshooting, please use the following resources: +The Issue Queue is reserved for Bug Reports and Feature Requests. Please use the following resources for help with configuration and troubleshooting: - [Marlin Documentation](https://marlinfw.org) - Official Marlin documentation - [Marlin Discord](https://discord.gg/n5NJ59y) - Discuss issues with Marlin users and developers @@ -95,59 +82,48 @@ The Issue Queue is reserved for Bug Reports and Feature Requests. To get help wi - Facebook Group ["Marlin Firmware for 3D Printers"](https://www.facebook.com/groups/3Dtechtalk/) - [Marlin Configuration](https://www.youtube.com/results?search_query=marlin+configuration) on YouTube -## Contributors - -Marlin is constantly improving thanks to a huge number of contributors from all over the world bringing their specialties and talents. Huge thanks are due to [all the contributors](https://github.com/MarlinFirmware/Marlin/graphs/contributors) who regularly patch up bugs, help direct traffic, and basically keep Marlin from falling apart. Marlin's continued existence would not be possible without them. - -## Administration +## Contributing Patches -Regular users can open and close their own issues, but only the administrators can do project-related things like add labels, merge changes, set milestones, and kick trolls. The current Marlin admin team consists of: +You can contribute patches by submitting a Pull Request to the ([bugfix-2.1.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.1.x)) branch. - - - -
Project Maintainer
- - 🇺🇸  **Scott Lahteine** -       [@thinkyhead](https://github.com/thinkyhead) -       [  Donate 💸  ](https://www.thinkyhead.com/donate-to-marlin) - - - - 🇺🇸  **Roxanne Neufeld** -       [@Roxy-3D](https://github.com/Roxy-3D) - - 🇺🇸  **Keith Bennett** -       [@thisiskeithb](https://github.com/thisiskeithb) -       [  Donate 💸  ](https://github.com/sponsors/thisiskeithb) - - 🇺🇸  **Jason Smith** -       [@sjasonsmith](https://github.com/sjasonsmith) - - - - 🇧🇷  **Victor Oliveira** -       [@rhapsodyv](https://github.com/rhapsodyv) - - 🇬🇧  **Chris Pepper** -       [@p3p](https://github.com/p3p) - -🇳🇿  **Peter Ellens** -       [@ellensp](https://github.com/ellensp) -       [  Donate 💸  ](https://ko-fi.com/ellensp) +- We use branches named with a "bugfix" or "dev" prefix to fix bugs and integrate new features. +- Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers. +- Please submit Feature Requests and Bug Reports to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues/new/choose). See above for user support. +- Whenever you add new features, be sure to add one or more build tests to `buildroot/tests`. Any tests added to a PR will be run within that PR on GitHub servers as soon as they are pushed. To minimize iteration be sure to run your new tests locally, if possible. + - Local build tests: + - All: `make tests-config-all-local` + - Single: `make tests-config-single-local TEST_TARGET=...` + - Local build tests in Docker: + - All: `make tests-config-all-local-docker` + - Single: `make tests-config-all-local-docker TEST_TARGET=...` + - To run all unit test suites: + - Using PIO: `platformio run -t test-marlin` + - Using Make: `make unit-test-all-local` + - Using Docker + make: `maker unit-test-all-local-docker` + - To run a single unit test suite: + - Using PIO: `platformio run -t marlin_` + - Using make: `make unit-test-single-local TEST_TARGET=` + - Using Docker + make: `maker unit-test-single-local-docker TEST_TARGET=` +- If your feature can be unit tested, add one or more unit tests. For more information see our documentation on [Unit Tests](test). - +## Contributors - 🇺🇸  **Bob Kuhn** -       [@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn) +Marlin is constantly improving thanks to a huge number of contributors from all over the world bringing their specialties and talents. Huge thanks are due to [all the contributors](https://github.com/MarlinFirmware/Marlin/graphs/contributors) who regularly patch up bugs, help direct traffic, and basically keep Marlin from falling apart. Marlin's continued existence would not be possible without them. - 🇳🇱  **Erik van der Zalm** -       [@ErikZalm](https://github.com/ErikZalm) +## Project Leadership -
+Name|Role|Link|Donate +----|----|----|---- +🇺🇸 Scott Lahteine|Project Lead|[[@thinkyhead](https://github.com/thinkyhead)]|[💸 Donate](https://marlinfw.org/docs/development/contributing.html#donate) +🇺🇸 Roxanne Neufeld|Admin|[[@Roxy-3D](https://github.com/Roxy-3D)]| +🇺🇸 Keith Bennett|Admin|[[@thisiskeithb](https://github.com/thisiskeithb)]|[💸 Donate](https://github.com/sponsors/thisiskeithb) +🇺🇸 Jason Smith|Admin|[[@sjasonsmith](https://github.com/sjasonsmith)]| +🇧🇷 Victor Oliveira|Admin|[[@rhapsodyv](https://github.com/rhapsodyv)]| +🇬🇧 Chris Pepper|Admin|[[@p3p](https://github.com/p3p)]| +🇳🇿 Peter Ellens|Admin|[[@ellensp](https://github.com/ellensp)]|[💸 Donate](https://ko-fi.com/ellensp) +🇺🇸 Bob Kuhn|Admin|[[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)]| +🇳🇱 Erik van der Zalm|Founder|[[@ErikZalm](https://github.com/ErikZalm)]| ## License Marlin is published under the [GPL license](/LICENSE) because we believe in open development. The GPL comes with both rights and obligations. Whether you use Marlin firmware as the driver for your open or closed-source product, you must keep Marlin open, and you must provide your compatible Marlin source code to end users upon request. The most straightforward way to comply with the Marlin license is to make a fork of Marlin on Github, perform your modifications, and direct users to your modified fork. - -While we can't prevent the use of this code in products (3D printers, CNC, etc.) that are closed source or crippled by a patent, we would prefer that you choose another firmware or, better yet, make your own. From 1f84f50fd8a4c80c9ba56f2e61296e5790ff328b Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 15 Apr 2024 02:38:10 +0000 Subject: [PATCH 080/111] [cron] Bump distribution date (2024-04-15) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 6612c2f640ff..1da31c514e38 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 "2024-04-14" +//#define STRING_DISTRIBUTION_DATE "2024-04-15" /** * 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 ad30d749778c..42225ed00ed4 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 "2024-04-14" + #define STRING_DISTRIBUTION_DATE "2024-04-15" #endif /** From 9342dae8f04cc0e775515ec903dad1357bd7c344 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 16 Apr 2024 12:17:47 -0500 Subject: [PATCH 081/111] =?UTF-8?q?=F0=9F=93=9D=20Remove=20dead=20PDF=20li?= =?UTF-8?q?nks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h | 1 - Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h | 3 +-- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 3 +-- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 3 +-- Marlin/src/pins/lpc1768/pins_EMOTRONIC.h | 3 +-- Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 3 +-- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 2 -- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 3 +-- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 3 +-- Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h | 3 +-- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h | 3 +-- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 5 +---- .../pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h | 3 +-- .../src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 3 +-- .../src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h | 3 +-- Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h | 3 +-- .../src/pins/lpc1769/pins_COHESION3D_REMIX.h | 3 +-- Marlin/src/pins/lpc1769/pins_FLY_CDY.h | 3 +-- Marlin/src/pins/lpc1769/pins_MKS_SGEN.h | 3 +-- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 3 +-- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 3 +-- Marlin/src/pins/mega/pins_ELEFU_3.h | 3 +-- Marlin/src/pins/mega/pins_GT2560_REV_A.h | 3 +-- Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h | 3 +-- Marlin/src/pins/mega/pins_GT2560_REV_B.h | 3 +-- Marlin/src/pins/mega/pins_GT2560_V3.h | 3 +-- Marlin/src/pins/mega/pins_GT2560_V4.h | 4 +--- Marlin/src/pins/mega/pins_GT2560_V41b.h | 3 +-- Marlin/src/pins/mega/pins_MEGACONTROLLER.h | 3 +-- Marlin/src/pins/mega/pins_MEGATRONICS.h | 3 +-- Marlin/src/pins/mega/pins_MEGATRONICS_2.h | 3 +-- Marlin/src/pins/mega/pins_MEGATRONICS_3.h | 2 +- Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 3 +-- Marlin/src/pins/mega/pins_MINITRONICS.h | 6 ++---- Marlin/src/pins/mega/pins_OVERLORD.h | 3 +-- Marlin/src/pins/mega/pins_PICA.h | 3 +-- Marlin/src/pins/mega/pins_PICAOLD.h | 3 +-- .../pins/mega/pins_PROTONEER_CNC_SHIELD_V3.h | 3 +-- Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 3 +-- Marlin/src/pins/rambo/pins_EINSY_RETRO.h | 6 ++---- Marlin/src/pins/rambo/pins_MINIRAMBO.h | 6 ++---- Marlin/src/pins/rambo/pins_RAMBO.h | 3 +-- Marlin/src/pins/ramps/pins_3DRAG.h | 3 +-- Marlin/src/pins/ramps/pins_AZTEEG_X3.h | 3 +-- Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h | 3 +-- Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h | 3 +-- Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h | 3 +-- Marlin/src/pins/ramps/pins_FYSETC_F6_13.h | 3 +-- Marlin/src/pins/ramps/pins_FYSETC_F6_14.h | 3 +-- Marlin/src/pins/ramps/pins_K8200.h | 3 +-- Marlin/src/pins/ramps/pins_K8400.h | 3 +-- Marlin/src/pins/ramps/pins_K8800.h | 3 +-- Marlin/src/pins/ramps/pins_MKS_BASE_10.h | 5 +---- Marlin/src/pins/ramps/pins_MKS_BASE_16.h | 3 +-- Marlin/src/pins/ramps/pins_MKS_GEN_13.h | 3 +-- Marlin/src/pins/ramps/pins_MKS_GEN_L.h | 3 +-- Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h | 3 +-- Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h | 3 +-- Marlin/src/pins/ramps/pins_RUMBA.h | 3 +-- Marlin/src/pins/ramps/pins_TANGO.h | 3 +-- Marlin/src/pins/ramps/pins_ULTIMAIN_2.h | 11 +---------- Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h | 2 -- Marlin/src/pins/ramps/pins_ZRIB_V20.h | 6 ++---- Marlin/src/pins/ramps/pins_ZRIB_V52.h | 3 +-- Marlin/src/pins/sanguino/pins_ANET_10.h | 3 +-- Marlin/src/pins/sanguino/pins_AZTEEG_X1.h | 3 +-- Marlin/src/pins/sanguino/pins_GEN6.h | 3 +-- Marlin/src/pins/sanguino/pins_GEN7_12.h | 12 ++++-------- Marlin/src/pins/sanguino/pins_GEN7_14.h | 6 ++---- Marlin/src/pins/sanguino/pins_MELZI.h | 3 +-- Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h | 3 +-- Marlin/src/pins/sanguino/pins_MELZI_V2.h | 3 +-- .../src/pins/sanguino/pins_SANGUINOLOLU_11.h | 15 +++++---------- .../src/pins/sanguino/pins_SANGUINOLOLU_12.h | 9 +++------ Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 3 +-- Marlin/src/pins/teensy2/pins_5DPRINT.h | 3 +-- Marlin/src/pins/teensy2/pins_BRAINWAVE.h | 3 +-- Marlin/src/pins/teensy2/pins_PRINTRBOARD.h | 12 ++++-------- .../src/pins/teensy2/pins_PRINTRBOARD_REVF.h | 18 ++++++------------ Marlin/src/pins/teensy2/pins_SAV_MKI.h | 3 +-- Marlin/src/pins/teensy2/pins_TEENSYLU.h | 3 +-- 81 files changed, 100 insertions(+), 217 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h index 569c9781d270..6d5a3c70b5a2 100644 --- a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h +++ b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h @@ -23,7 +23,6 @@ /** * AZSMZ MINI pin assignments - * Schematic: http://green-candy.osdn.jp/external/MarlinFW/board_schematics/AZSMZ%20MINI/AZSMZ.svg * Source: https://raw.githubusercontent.com/Rose-Fish/AZSMZ-mini/master/AZSMZ.sch */ diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h index 008fc3d4a0b3..be6da885df10 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h @@ -23,8 +23,7 @@ /** * BigTreeTech SKR 1.1 pin assignments - * Schematic: http://green-candy.osdn.jp/external/MarlinFW/board_schematics/BTT%20SKR%20V1.1/SKR-V1.1SchDoc.pdf - * Origin: https://github.com/bigtreetech/BIGTREETECH-SKR-V1.1/blob/master/hardware/SKR-V1.1SchDoc.pdf + * Schematic: https://github.com/bigtreetech/BIGTREETECH-SKR-V1.1/blob/master/hardware/SKR-V1.1SchDoc.pdf */ #define BOARD_INFO_NAME "BTT SKR V1.1" 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 63496c407daa..664a179c1a90 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -23,8 +23,7 @@ /** * BigTreeTech SKR 1.3 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/BTT%20SKR%20V1.3/SKR-V1.3-SCH.pdf - * Origin: https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.3/hardware/SKR-V1.3-SCH.pdf + * Schematic: https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.3/hardware/SKR-V1.3-SCH.pdf */ #define BOARD_INFO_NAME "BTT SKR V1.3" 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 ea340a9f9f36..60ceab5f89d0 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -23,8 +23,7 @@ /** * BigTreeTech SKR 1.4 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/BTT%20SKR%20V1.4%20+%20Turbo/BTT%20SKR%20V1.4-SCH.pdf - * Origin: https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.4/Hardware/BTT%20SKR%20V1.4-SCH.pdf + * Schematic: https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.4/Hardware/BTT%20SKR%20V1.4-SCH.pdf */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1768/pins_EMOTRONIC.h b/Marlin/src/pins/lpc1768/pins_EMOTRONIC.h index 5c4e8d40e85b..52bf4b0abb82 100644 --- a/Marlin/src/pins/lpc1768/pins_EMOTRONIC.h +++ b/Marlin/src/pins/lpc1768/pins_EMOTRONIC.h @@ -23,8 +23,7 @@ /** * eMotion-Tech eMotronic pin assignments - * Schematic: http://green-candy.osdn.jp/external/MarlinFW/board_schematics/eMotion-Tech%20eMotronic/eMotronic_brd_sources_1.0.4/eMotronic_sch.pdf - * Origin: https://data.emotion-tech.com/ftp/Datasheets_et_sources/Sources/eMotronic_brd_sources_1.0.4.zip + * Schematic: https://data.emotion-tech.com/ftp/Datasheets_et_sources/Sources/eMotronic_brd_sources_1.0.4.zip * * Board pins<->features assignments are based on the * Micro-Delta Rework printer default connections. diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 7aa4aa642349..f785d3b7378c 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -23,8 +23,7 @@ /** * GMARSH X6 Rev.1 pin assignments - * Schematic: http://green-candy.osdn.jp/external/MarlinFW/board_schematics/GMARSH%20X6%20Rev.1/armprinter_2208_1heater.pdf - * Origin: https://github.com/gmarsh/gmarsh_x6/blob/master/armprinter_2208_1heater.pdf + * Schematic: https://github.com/gmarsh/gmarsh_x6/blob/master/armprinter_2208_1heater.pdf */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index 039d906efcad..8a39e2790a73 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -23,8 +23,6 @@ /** * Makerbase MKS SBASE pin assignments - * Schematic (V1.3): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/MKS%20SBASE%20V1.3/MKS%20SBASE%20V1.3_002%20SCH.pdf - * Origin (V1.3): http://green-candy.osdn.jp/external/MarlinFW/board_schematics/MKS%20SBASE%20V1.3/MKS%20SBASE%20V1.3_002%20SCH.pdf */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 8e87ce4d886d..38c7cac3d4b7 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -23,8 +23,7 @@ /** * Makerbase MKS SGEN-L pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/MKS_GEN_L_V1_0/MKS%20Gen_L%20V1.0_008%20SCH.pdf - * Origin: https://github.com/makerbase-mks/SGEN_L/blob/master/Hardware/MKS%20SGEN_L%20V1.0_001/MKS%20SGEN_L%20V1.0_001%20SCH.pdf + * Schematic: https://github.com/makerbase-mks/SGEN_L/blob/master/Hardware/MKS%20SGEN_L%20V1.0_001/MKS%20SGEN_L%20V1.0_001%20SCH.pdf */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 84c2eca91984..8cbe9a7e7e9f 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -23,8 +23,7 @@ /** * Re-ARM with RAMPS v1.4 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Re-ARM%20RAMPS%201.4/Re_ARM_Schematic.pdf - * Origin: https://reprap.org/mediawiki/images/f/fa/Re_ARM_Schematic.pdf + * Schematic: https://reprap.org/mediawiki/images/f/fa/Re_ARM_Schematic.pdf * * Applies to the following boards: * diff --git a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h index 16858c0b566a..2d27b8e0f6ba 100644 --- a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h +++ b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h @@ -23,8 +23,7 @@ /** * Selena Compact pin assignments - * Pinout: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Selena%20Compact/Compact%20Pinout.pdf - * Origin: https://github.com/f61/Selena/blob/master/Compact%20Pinout.pdf + * Schematic: https://github.com/f61/Selena/blob/master/Compact%20Pinout.pdf */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h index 8412f1c12d3b..26f0ff39cec6 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h @@ -23,8 +23,7 @@ /** * Azteeg X5 GT pin assignments - * Wiring diagram: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Azteeg%20X5%20GT/X5%20GT%20Wiring%20Diagram.pdf - * Origin: https://panucattdevices.freshdesk.com/support/solutions/articles/1000244740-support-files + * Schematic: https://panucattdevices.freshdesk.com/support/solutions/articles/1000244740-support-files */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index f1753d0e2b95..5256da2ef22f 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -23,10 +23,7 @@ /** * Azteeg X5 MINI pin assignments - * Schematic (V1): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Azteeg%20X5%20MINI/x5mini_design_files/X5mini_design_files/V1/X5%20Mini%20PUB%20v1.0.pdf - * Schematic (V2): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Azteeg%20X5%20MINI/x5mini_design_files/X5mini_design_files/V2/X5%20Mini%20V2%20SCH%20Pub.pdf - * Schematic (V3): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Azteeg%20X5%20MINI/x5mini_design_files/X5mini_design_files/V3/X5%20Mini%20V3%20SCH%20Pub.pdf - * Origin: http://files.panucatt.com/datasheets/x5mini_design_files.zip + * Schematic: http://files.panucatt.com/datasheets/x5mini_design_files.zip */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h index 74439e4f3d27..fd69efa8e879 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h @@ -23,8 +23,7 @@ /** * Azteeg X5 MINI WIFI pin assignments - * Wiring diagram: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Azteeg%20X5%20MINI%20WIFI/x5mini_wifi_wiring.pdf - * Origin: http://files.panucatt.com/datasheets/x5mini_wifi_wiring.pdf + * Schematic: http://files.panucatt.com/datasheets/x5mini_wifi_wiring.pdf */ #include "env_validate.h" 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 f329636f2b30..a3754a391c37 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -23,8 +23,7 @@ /** * BigTreeTech SKR E3 Turbo pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/BTT%20SKR%20E3%20Turbo/BTT%20SKR%20E3%20Turbo-SCH.pdf - * Origin: https://github.com/bigtreetech/BIGTREETECH-SKR-E3-Turbo/blob/master/Hardware/BTT%20SKR%20E3%20Turbo-SCH.pdf + * Schematic: https://github.com/bigtreetech/BIGTREETECH-SKR-E3-Turbo/blob/master/Hardware/BTT%20SKR%20E3%20Turbo-SCH.pdf */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h index 1bd70d8fb598..2e24197106bd 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h @@ -23,8 +23,7 @@ /** * BigTreeTech SKR 1.4 Turbo pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/BTT%20SKR%20V1.4%20+%20Turbo/BTT%20SKR%20V1.4-SCH.pdf - * Origin: https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.4/Hardware/BTT%20SKR%20V1.4-SCH.pdf + * Schematic: https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.4/Hardware/BTT%20SKR%20V1.4-SCH.pdf */ #define BOARD_INFO_NAME "BTT SKR V1.4 TURBO" diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h index 70781cb0b588..485b3109ad03 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h @@ -23,8 +23,7 @@ /** * Cohesion3D Mini pin assignments - * Pinout: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Cohesion3D%20Mini/c3d-pinout.jpg - * Origin: https://lasergods.com/cohesion3d-mini-pinout-diagram/ + * Schematic: https://lasergods.com/cohesion3d-mini-pinout-diagram/ */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h index a6acde35ffe3..d1ecb0e7dd03 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h @@ -23,8 +23,7 @@ /** * Cohesion3D ReMix pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Cohesion3D%20ReMix/C3D%20ReMix%20rev2.svg - * Origin: https://github.com/Cohesion3D/Cohesion3D-ReMix/blob/master/C3D%20ReMix%20rev2.sch + * Schematic: https://github.com/Cohesion3D/Cohesion3D-ReMix/blob/master/C3D%20ReMix%20rev2.sch */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h index d5a7a38c234d..9b22214a7a1c 100644 --- a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h +++ b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h @@ -23,8 +23,7 @@ /** * FLYmaker FLY-CDY pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/FLYmaker%20FLY-CDY%20V1/FLY_CDY%20SCH.pdf - * Origin: https://github.com/Mellow-3D/FLY-CDY/blob/master/Motherboard%20information/FLY_CDY%20SCH.pdf + * Schematic: https://github.com/Mellow-3D/FLY-CDY/blob/master/Motherboard%20information/FLY_CDY%20SCH.pdf */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h index 5e552353cd31..64abf5212f66 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h @@ -23,8 +23,7 @@ /** * MKS SGen pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/MKS%20SGEN/MKS%20SGEN%20V1.0_001%20SCH.pdf - * Origin: https://github.com/makerbase-mks/MKS-SGen/blob/master/Hardware/MKS%20SGEN%20V1.0_001/MKS%20SGEN%20V1.0_001%20SCH.pdf + * Schematic: https://github.com/makerbase-mks/MKS-SGen/blob/master/Hardware/MKS%20SGEN%20V1.0_001/MKS%20SGEN%20V1.0_001%20SCH.pdf * * Pins diagram: * https://github.com/makerbase-mks/MKS-SGen/blob/master/Hardware/MKS%20SGEN%20V1.0_001/MKS%20SGEN%20V1.0_001%20PIN.pdf 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 613ba19e15ae..aec4240276e7 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -23,8 +23,7 @@ /** * MKS SGen-L V2 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/MKS%20SGEN_L%20V2/MKS%20SGEN_L%20V2.0_003%20SCH.pdf - * Origin: https://github.com/makerbase-mks/MKS-SGEN_L-V2/blob/master/Hardware/MKS%20SGEN_L%20V2.0_003/MKS%20SGEN_L%20V2.0_003%20SCH.pdf + * Schematic: https://github.com/makerbase-mks/MKS-SGEN_L-V2/blob/master/Hardware/MKS%20SGEN_L%20V2.0_003/MKS%20SGEN_L%20V2.0_003%20SCH.pdf */ #include "env_validate.h" diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index 0134e936319d..8856d69720f7 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -23,8 +23,7 @@ /** * Smoothieware Smoothieboard pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Smoothieware%20Smoothieboard%20V1/http.i.imgur.com.oj4zqs3.png - * Origin: http://smoothieware.org/_media///external/http.i.imgur.com.oj4zqs3.png + * Schematic: http://smoothieware.org/_media///external/http.i.imgur.com.oj4zqs3.png */ #include "env_validate.h" diff --git a/Marlin/src/pins/mega/pins_ELEFU_3.h b/Marlin/src/pins/mega/pins_ELEFU_3.h index 71797a30fff8..623b7a0d4335 100644 --- a/Marlin/src/pins/mega/pins_ELEFU_3.h +++ b/Marlin/src/pins/mega/pins_ELEFU_3.h @@ -23,8 +23,7 @@ /** * Elefu RA Board Pin Assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Elefu%20Ra%20v3/schematic.pdf - * Origin: https://github.com/kiyoshigawa/Elefu-RAv3/blob/master/RA_Circuits.zip + * Schematic: https://github.com/kiyoshigawa/Elefu-RAv3/blob/master/RA_Circuits.zip * ATmega2560 */ diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index 55632e97bff4..96e3e5c36ff6 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -25,8 +25,7 @@ * Geeetech GT2560 Revision A board pin assignments, based on the work of * George Robles (https://georges3dprinters.com) and * Richard Smith - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Geeetech%20GT2560%20Revision%20A/GT2560_sch.pdf - * Origin: https://www.geeetech.com/wiki/images/9/90/GT2560_sch.pdf + * Schematic: https://www.geeetech.com/wiki/images/9/90/GT2560_sch.pdf * ATmega2560 */ diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h b/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h index a90c075be57f..a593393f08a7 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h @@ -23,8 +23,7 @@ /** * Geeetech GT2560 Revision A+ board pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Geeetech%20GT2560%20Revision%20A+/Hardware_GT2560_RevA+.pdf - * Origin: https://www.geeetech.com/wiki/images/d/d3/Hardware_GT2560_RevA%2B.pdf + * Schematic: https://www.geeetech.com/wiki/images/d/d3/Hardware_GT2560_RevA%2B.pdf * ATmega2560 */ diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_B.h b/Marlin/src/pins/mega/pins_GT2560_REV_B.h index 0702d14eb8d2..24915ce395e6 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_B.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_B.h @@ -23,8 +23,7 @@ /** * Geeetech GT2560 Rev B Pins - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Geeetech%20GT2560%20Rev%20B/GT2560_REVB.pdf - * Origin: https://www.geeetech.com/wiki/images/7/72/GT2560_REVB.pdf + * Schematic: https://www.geeetech.com/wiki/images/7/72/GT2560_REVB.pdf * ATmega2560 */ diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index b684214c6964..1323ae3c8e24 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -23,8 +23,7 @@ /** * Geeetech GT2560 3.0/3.1 pin assignments - * Schematic (3.0): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Geeetech%20GT2560%203.0/GT2560_V3.0_SCH.pdf - * Origin (3.0): https://github.com/Geeetech3D/Diagram/blob/master/GT2560_V3.0_SCH.pdf + * Schematic (3.0): https://github.com/Geeetech3D/Diagram/blob/master/GT2560_V3.0_SCH.pdf * ATmega2560 * * Also GT2560 RevB and GT2560 4.0/4.1 diff --git a/Marlin/src/pins/mega/pins_GT2560_V4.h b/Marlin/src/pins/mega/pins_GT2560_V4.h index 98f503886f89..f931238f9245 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V4.h +++ b/Marlin/src/pins/mega/pins_GT2560_V4.h @@ -23,9 +23,7 @@ /** * Geeetech GT2560 V4.X Pins - * Schematic (4.0): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Geeetech%20GT2560%20V4.x%20+%20A20/GT2560V4.0SCHA20T.pdf - * Schematic (4.1B): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Geeetech%20GT2560%20V4.x%20+%20A20/GT2560V4.1BSCHA20T.pdf - * Origin: https://www.geeetech.com/download.html?spm=a2g0s.imconversation.0.0.22d23e5fXlQBWv&download_id=45 + * Schematic: https://www.geeetech.com/download.html?spm=a2g0s.imconversation.0.0.22d23e5fXlQBWv&download_id=45 */ #define BOARD_INFO_NAME "GT2560 4.x" diff --git a/Marlin/src/pins/mega/pins_GT2560_V41b.h b/Marlin/src/pins/mega/pins_GT2560_V41b.h index 12d45be9853d..3ffaaabef49e 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V41b.h +++ b/Marlin/src/pins/mega/pins_GT2560_V41b.h @@ -23,8 +23,7 @@ /** * Geeetech GT2560 V4.1b Pins - * Schematic (4.1B): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Geeetech%20GT2560%20V4.x%20+%20A20/GT2560V4.1BSCHA20T.pdf - * Origin: https://www.geeetech.com/download.html?spm=a2g0s.imconversation.0.0.22d23e5fXlQBWv&download_id=45 + * Schematic: https://www.geeetech.com/download.html?spm=a2g0s.imconversation.0.0.22d23e5fXlQBWv&download_id=45 * ATmega2560 */ diff --git a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h index 688c147a6890..514f7b255efb 100644 --- a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h +++ b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h @@ -23,8 +23,7 @@ /** * Mega controller pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Mega%20Controller/Mega_controller.pdf - * Origin: https://reprap.org/mediawiki/images/b/ba/Mega_controller.pdf + * Schematic: https://reprap.org/mediawiki/images/b/ba/Mega_controller.pdf * ATmega2560 */ diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS.h b/Marlin/src/pins/mega/pins_MEGATRONICS.h index 066b577c629b..90d128c9fc02 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS.h @@ -23,8 +23,7 @@ /** * MegaTronics pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/MegaTronics/Megatronics_1_0_sch.pdf - * Origin: https://reprap.org/mediawiki/images/a/a3/Megatronics_1_0_sch.pdf + * Schematic: https://reprap.org/mediawiki/images/a/a3/Megatronics_1_0_sch.pdf * ATmega2560 */ diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h index ff118e732315..285a77b6361a 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h @@ -23,8 +23,7 @@ /** * MegaTronics v2.0 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Megatronics%20v2.0/megatronics%20-%20Project.pdf - * Origin: https://reprap.org/wiki/File:Megatronicsv2PDF.zip + * Schematic: https://reprap.org/wiki/File:Megatronicsv2PDF.zip * ATmega2560 */ diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h index 5e571d5a3fa2..5a7199406306 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h @@ -23,7 +23,7 @@ /** * MegaTronics v3.0 / v3.1 / v3.2 pin assignments - * Schematic Origin: https://github.com/brupje/Megatronics_3/blob/master/Design%20Files/megatronics.sch + * Schematic: https://github.com/brupje/Megatronics_3/blob/master/Design%20Files/megatronics.sch * ATmega2560 */ diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h index 22c14fc5e89e..fb7366081591 100644 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -23,8 +23,7 @@ /** * Mightyboard Rev.E pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Mightyboard%20Rev.E/MakerBot%20MightyBoard%20REVE%20Schematic.pdf - * Origin: https://github.com/sciguy14/HelioWatcher/blob/master/HelioWatcher%20Circuit/MakerBot%20MightyBoard%20REVE%20Schematic.pdf + * Schematic: https://github.com/sciguy14/HelioWatcher/blob/master/HelioWatcher%20Circuit/MakerBot%20MightyBoard%20REVE%20Schematic.pdf * also works for Rev D boards. It's all rev E despite what the silk screen says */ diff --git a/Marlin/src/pins/mega/pins_MINITRONICS.h b/Marlin/src/pins/mega/pins_MINITRONICS.h index c8828faea7ab..e6e24f8886bf 100644 --- a/Marlin/src/pins/mega/pins_MINITRONICS.h +++ b/Marlin/src/pins/mega/pins_MINITRONICS.h @@ -23,10 +23,8 @@ /** * Minitronics v1.0/1.1 pin assignments - * Schematic (1.0): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Minitronics%20v1.0/minitronics%20-%20Project.pdf - * Origin (1.0): https://reprap.org/wiki/File:MinitronicsPDF.zip - * Datasheet (1.1): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Minitronics%20v1.1/datasheet%20minitronics%20v1.1.pdf - * Origin (1.1): https://reprapworld.nl/documentation/datasheet%20minitronics%20v1.1.pdf + * Schematic (1.0): https://reprap.org/wiki/File:MinitronicsPDF.zip + * Schematic (1.1): https://reprapworld.nl/documentation/datasheet%20minitronics%20v1.1.pdf * ATmega1281 */ diff --git a/Marlin/src/pins/mega/pins_OVERLORD.h b/Marlin/src/pins/mega/pins_OVERLORD.h index 332d7d4cb4dc..804aa38e59d6 100644 --- a/Marlin/src/pins/mega/pins_OVERLORD.h +++ b/Marlin/src/pins/mega/pins_OVERLORD.h @@ -23,8 +23,7 @@ /** * Dreammaker Overlord v1.1 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Dreammaker%20Overlord%20v1.1/Schematic.pdf - * Origin: https://github.com/jdpiercy/Overlord-Pro/blob/master/Motherboard/Schematic.pdf + * Schematic: https://github.com/jdpiercy/Overlord-Pro/blob/master/Motherboard/Schematic.pdf * ATmega2560 */ diff --git a/Marlin/src/pins/mega/pins_PICA.h b/Marlin/src/pins/mega/pins_PICA.h index 0a6478439c58..63e14d9bf2d2 100644 --- a/Marlin/src/pins/mega/pins_PICA.h +++ b/Marlin/src/pins/mega/pins_PICA.h @@ -23,8 +23,7 @@ /** * Arduino Mega with PICA pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/PICA/pica_schematic.pdf - * Origin: https://github.com/mjrice/PICA/blob/master/pica_schematic.pdf + * Schematic: https://github.com/mjrice/PICA/blob/master/pica_schematic.pdf * ATmega2560 * * PICA is Power, Interface, and Control Adapter and is open source hardware. diff --git a/Marlin/src/pins/mega/pins_PICAOLD.h b/Marlin/src/pins/mega/pins_PICAOLD.h index 3654a45d3fdd..4a9ab4e6fcf3 100644 --- a/Marlin/src/pins/mega/pins_PICAOLD.h +++ b/Marlin/src/pins/mega/pins_PICAOLD.h @@ -21,8 +21,7 @@ */ #pragma once -// Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/PICAOLD/pica_schematic.pdf -// Origin: https://github.com/mjrice/PICA/blob/97ab9e7771a8e5eef97788f3adcc17a9fa9de9b9/pica_schematic.pdf +// Schematic: https://github.com/mjrice/PICA/blob/97ab9e7771a8e5eef97788f3adcc17a9fa9de9b9/pica_schematic.pdf // ATmega2560 #define HEATER_0_PIN 9 // E0 diff --git a/Marlin/src/pins/mega/pins_PROTONEER_CNC_SHIELD_V3.h b/Marlin/src/pins/mega/pins_PROTONEER_CNC_SHIELD_V3.h index 962fddc19248..4b7d1007be2a 100644 --- a/Marlin/src/pins/mega/pins_PROTONEER_CNC_SHIELD_V3.h +++ b/Marlin/src/pins/mega/pins_PROTONEER_CNC_SHIELD_V3.h @@ -23,8 +23,7 @@ /** * Protoneer v3.00 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Protoneer%20CNC%20Shield%20v3.00/Arduino-CNC-Shield-Scematics-V3.XX_.webp - * Origin: https://i0.wp.com/blog.protoneer.co.nz/wp-content/uploads/2013/07/Arduino-CNC-Shield-Scematics-V3.XX_.jpg + * Schematic: https://i0.wp.com/blog.protoneer.co.nz/wp-content/uploads/2013/07/Arduino-CNC-Shield-Scematics-V3.XX_.jpg * ATmega2560 * * This CNC shield has an UNO pinout and fits all Arduino-compatibles. diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index ada4885752a3..8315de6ee30b 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -23,8 +23,7 @@ /** * Einsy-Rambo pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Einsy-Rambo/Schematic%20Prints_Einsy%20Rambo_1.1a.PDF - * Origin: https://github.com/ultimachine/Einsy-Rambo/blob/1.1a/board/Project%20Outputs/Schematic%20Prints_Einsy%20Rambo_1.1a.PDF + * Schematic: https://github.com/ultimachine/Einsy-Rambo/blob/1.1a/board/Project%20Outputs/Schematic%20Prints_Einsy%20Rambo_1.1a.PDF */ #include "env_validate.h" diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h index 75d0974b0a36..1f5061d4ce15 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -23,10 +23,8 @@ /** * Einsy-Retro pin assignments - * Schematic (1.0b): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Einsy-Retro/Schematic%20Prints_EinsyRetro_1.0b.PDF - * Origin (1.0b): https://github.com/ultimachine/EinsyRetro/blob/master/board/Project%20Outputs/Schematic%20Prints_EinsyRetro_1.0b.PDF - * Schematic (1.0c): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Einsy-Retro/Schematic%20Prints_EinsyRetro_1.0c.PDF - * Origin (1.0c): https://github.com/ultimachine/EinsyRetro/blob/master/board/Project%20Outputs/Schematic%20Prints_EinsyRetro_1.0c.PDF + * Schematic (1.0b): https://github.com/ultimachine/EinsyRetro/blob/master/board/Project%20Outputs/Schematic%20Prints_EinsyRetro_1.0b.PDF + * Schematic (1.0c): https://github.com/ultimachine/EinsyRetro/blob/master/board/Project%20Outputs/Schematic%20Prints_EinsyRetro_1.0c.PDF */ #include "env_validate.h" diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index c0bac9b36328..18f73a81d562 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -23,10 +23,8 @@ /** * Mini-RAMBo pin assignments - * Schematic (1.3a): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Mini%20RAMBo/Mini-Rambo.PDF - * Origin (1.3a): https://github.com/ultimachine/Mini-Rambo/blob/1.3a/board/Project%20Outputs%20for%20Mini-Rambo/Mini-Rambo.PDF - * Schematic (1.0a): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Mini%20RAMBo%201.0a/Mini-Rambo.PDF - * Origin (1.0a): https://github.com/ultimachine/Mini-Rambo/blob/v1.1b/board/Project%20Outputs%20for%20Mini-Rambo/Mini-Rambo.PDF + * Schematic (1.3a): https://github.com/ultimachine/Mini-Rambo/blob/1.3a/board/Project%20Outputs%20for%20Mini-Rambo/Mini-Rambo.PDF + * Schematic (1.0a): https://github.com/ultimachine/Mini-Rambo/blob/v1.1b/board/Project%20Outputs%20for%20Mini-Rambo/Mini-Rambo.PDF */ #include "env_validate.h" diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index 8ea3c15b4620..7e46b171512e 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -39,8 +39,7 @@ /** * Rambo pin assignments - * Schematic (1.1b): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMBo/Rambo1-1-schematic.png - * Origin (1.1b): https://www.reprap.org/wiki/File:Rambo1-1-schematic.png + * Schematic (1.1b): https://www.reprap.org/wiki/File:Rambo1-1-schematic.png */ #include "env_validate.h" diff --git a/Marlin/src/pins/ramps/pins_3DRAG.h b/Marlin/src/pins/ramps/pins_3DRAG.h index 3a2d7ea19561..de4b3cfeb9ac 100644 --- a/Marlin/src/pins/ramps/pins_3DRAG.h +++ b/Marlin/src/pins/ramps/pins_3DRAG.h @@ -24,8 +24,7 @@ /** * 3DRAG (and K8200 / K8400) Arduino Mega with RAMPS v1.4 pin assignments * This may be compatible with the standalone Controller variant. - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/3DRAG%20+%20Controller/Schema_base.jpg - * Origin: https://reprap.org/wiki/File:Schema_base.jpg + * Schematic: https://reprap.org/wiki/File:Schema_base.jpg * ATmega2560, ATmega1280 */ diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h index 17581dca6241..39c25a7fd131 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h @@ -23,8 +23,7 @@ /** * AZTEEG_X3 Arduino Mega with RAMPS v1.4 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/AZTEEG_X3/AZTEEG%20X3%20PUB%20v1.12.pdf - * Origin: http://files.panucatt.com/datasheets/azteegx3_designfiles.zip + * Schematic: http://files.panucatt.com/datasheets/azteegx3_designfiles.zip * ATmega2560 */ diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h index ddd56b28e859..76a29930b0ae 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h @@ -23,8 +23,7 @@ /** * AZTEEG_X3_PRO (Arduino Mega) pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/AZTEEG_X3_PRO/AZTEEG%20X3%20PRO%201.0%20PUB.pdf - * Origin: http://files.panucatt.com/datasheets/x3pro_sch_v1.0.zip + * Schematic: http://files.panucatt.com/datasheets/x3pro_sch_v1.0.zip * ATmega2560 */ diff --git a/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h b/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h index cf237fb9c11e..4f4e31f9a141 100644 --- a/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h +++ b/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h @@ -23,8 +23,7 @@ /** * BAM&DICE Due (Arduino Mega) pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/BAM&DICE%20Due/2PRINTBETA-BAM&DICE-DUE-V1.1-sch.pdf - * Origin: http://www.2printbeta.de/download/2PRINTBETA-BAM&DICE-DUE-V1.1-sch.pdf + * Schematic: http://www.2printbeta.de/download/2PRINTBETA-BAM&DICE-DUE-V1.1-sch.pdf * ATmega2560, ATmega1280 */ diff --git a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h index 08d4492ccb5e..fb6689c0ce01 100644 --- a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h +++ b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h @@ -23,8 +23,7 @@ /** * bq ZUM Mega 3D board definition - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/bq%20ZUM%20Mega%203D/Zum%20Mega%203D.PDF - * Origin: https://github.com/bq/zum/blob/master/zum-mega3d/Zum%20Mega%203D.PDF + * Schematic: https://github.com/bq/zum/blob/master/zum-mega3d/Zum%20Mega%203D.PDF * ATmega2560 */ diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h index 102595363377..59c4c7988421 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -23,8 +23,7 @@ // // FYSETC F6 1.3 (and 1.4) pin assignments -// Schematic (1.3): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/FYSETC%20F6%201.3/F6_V13.pdf -// Origin: https://github.com/FYSETC/FYSETC-F6/blob/master/Hardware/V1.3/F6_V13.pdf +// Schematic: https://github.com/FYSETC/FYSETC-F6/blob/master/Hardware/V1.3/F6_V13.pdf // ATmega2560 // diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h index 9604d0ecbfc1..5fdaa1941959 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h @@ -23,8 +23,7 @@ // // FYSETC F6 v1.4 pin assignments -// Schematic (1.4): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/FYSETC%20F6%20v1.4/F6%20V1.4%20Sch.pdf -// Origin (1.4): https://github.com/FYSETC/FYSETC-F6/blob/master/Hardware/V1.4/F6%20V1.4%20Sch.pdf +// Schematic (1.4): https://github.com/FYSETC/FYSETC-F6/blob/master/Hardware/V1.4/F6%20V1.4%20Sch.pdf // ATmega2560 // diff --git a/Marlin/src/pins/ramps/pins_K8200.h b/Marlin/src/pins/ramps/pins_K8200.h index d2557b26c3ee..b6bed2dc556b 100644 --- a/Marlin/src/pins/ramps/pins_K8200.h +++ b/Marlin/src/pins/ramps/pins_K8200.h @@ -24,8 +24,7 @@ /** * K8200 Arduino Mega with RAMPS v1.3 pin assignments * Identical to 3DRAG - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Velleman%20K8200/K8200diagram.jpg - * Origin: https://www.velleman.eu/images/tmp/K8200diagram.jpg + * Schematic: https://www.velleman.eu/images/tmp/K8200diagram.jpg * ATmega2560 */ diff --git a/Marlin/src/pins/ramps/pins_K8400.h b/Marlin/src/pins/ramps/pins_K8400.h index 048b9656c4af..31912064d061 100644 --- a/Marlin/src/pins/ramps/pins_K8400.h +++ b/Marlin/src/pins/ramps/pins_K8400.h @@ -24,8 +24,7 @@ /** * Velleman K8400 (Vertex) * 3DRAG clone - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Velleman%20K8400/k8400-schema-electronique.jpg - * Origin: https://filimprimante3d.fr/documents/k8400-schema-electronique.jpg + * Schematic: https://filimprimante3d.fr/documents/k8400-schema-electronique.jpg * ATmega2560, ATmega1280 * * K8400 has some minor differences over a normal 3Drag: diff --git a/Marlin/src/pins/ramps/pins_K8800.h b/Marlin/src/pins/ramps/pins_K8800.h index 826e1b206aad..1f477300de73 100644 --- a/Marlin/src/pins/ramps/pins_K8800.h +++ b/Marlin/src/pins/ramps/pins_K8800.h @@ -23,8 +23,7 @@ /** * Velleman K8800 (Vertex) - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Velleman%20K8800/K8800-schematic-V1.4.pdf - * Origin: https://www.velleman.eu/downloads/files/vertex-delta/schematics/K8800-schematic-V1.4.pdf + * Schematic: https://www.velleman.eu/downloads/files/vertex-delta/schematics/K8800-schematic-V1.4.pdf * ATmega2560, ATmega1280 */ diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_10.h b/Marlin/src/pins/ramps/pins_MKS_BASE_10.h index 8d46ac36fa6e..3d58d8ba912d 100644 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_10.h +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_10.h @@ -24,10 +24,7 @@ /** * MKS BASE 1.0 – Arduino Mega2560 with RAMPS v1.4 pin assignments * Schematics: - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/MKS%20BASE%201.0/PAGE1.pdf - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/MKS%20BASE%201.0/PAGE2.pdf - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/MKS%20BASE%201.0/PAGE3.pdf - * Origin: https://reprap.org/wiki/File:MKS_Base_V1.0_source.zip + * Schematic: https://reprap.org/wiki/File:MKS_Base_V1.0_source.zip * ATmega2560 * * Rev B - Override pin definitions for CASE_LIGHT and M3/M4/M5 spindle control diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_16.h b/Marlin/src/pins/ramps/pins_MKS_BASE_16.h index bb6def5ca46f..e5797493116b 100644 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_16.h +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_16.h @@ -23,8 +23,7 @@ /** * MKS BASE v1.6 with A4982 stepper drivers and digital micro-stepping - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/MKS%20BASE%201.6/MKS%20Base%20V1.6_004%20SCH.pdf - * Origin: https://github.com/makerbase-mks/MKS-BASE/blob/master/hardware/MKS%20Base%20V1.6_004/MKS%20Base%20V1.6_004%20SCH.pdf + * Schematic: https://github.com/makerbase-mks/MKS-BASE/blob/master/hardware/MKS%20Base%20V1.6_004/MKS%20Base%20V1.6_004%20SCH.pdf * ATmega2560 */ diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_13.h b/Marlin/src/pins/ramps/pins_MKS_GEN_13.h index 6ef77909d163..5797424c66c9 100644 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_13.h +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_13.h @@ -23,8 +23,7 @@ /** * Arduino Mega with RAMPS v1.4 adjusted pin assignments - * Schematic (1.4): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/MKS%20GEN%20v1.4/MKS%20GEN%20V1.4_004%20SCH.pdf - * Origin (1.4): https://github.com/makerbase-mks/MKS-GEN/blob/master/hardware/MKS%20GEN%20V1.4_004/MKS%20GEN%20V1.4_004%20SCH.pdf + * Schematic (1.4): https://github.com/makerbase-mks/MKS-GEN/blob/master/hardware/MKS%20GEN%20V1.4_004/MKS%20GEN%20V1.4_004%20SCH.pdf * ATmega2560, ATmega1280 * * MKS GEN v1.3 (Extruder, Fan, Bed) diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L.h index 73e7aa577d50..dfd8736c81fe 100644 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_L.h +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L.h @@ -23,8 +23,7 @@ /** * MKS GEN L – Arduino Mega2560 with RAMPS v1.4 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/MKS%20GEN%20L%20v1.0/MKS%20Gen_L%20V1.0_008%20SCH.pdf - * Origin: https://github.com/makerbase-mks/MKS-GEN_L/blob/master/hardware/MKS%20Gen_L%20V1.0_008/MKS%20Gen_L%20V1.0_008%20SCH.pdf + * Schematic: https://github.com/makerbase-mks/MKS-GEN_L/blob/master/hardware/MKS%20Gen_L%20V1.0_008/MKS%20Gen_L%20V1.0_008%20SCH.pdf * ATmega2560, ATmega1280 */ diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h index 931843de7c73..54c739326653 100644 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h @@ -23,8 +23,7 @@ /** * MKS GEN L V2 – Arduino Mega2560 with RAMPS v1.4 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/MKS%20GEN%20L%20V2.0/MKS%20Gen_L%20V2.0_001%20SCH.pdf - * Origin: https://github.com/makerbase-mks/MKS-GEN_L/blob/master/hardware/MKS%20Gen_L%20V2.0_001/MKS%20Gen_L%20V2.0_001%20SCH.pdf + * Schematic: https://github.com/makerbase-mks/MKS-GEN_L/blob/master/hardware/MKS%20Gen_L%20V2.0_001/MKS%20Gen_L%20V2.0_001%20SCH.pdf * ATmega2560 */ diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h index 6cea92c15b78..594be3c5df1d 100644 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h @@ -23,8 +23,7 @@ /** * MKS GEN L V2 – Arduino Mega2560 with RAMPS v1.4 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/MKS%20GEN%20L%20V2.1/MKS%20GEN_L%20V2.1_001%20SCH.pdf - * Origin: https://github.com/makerbase-mks/MKS-GEN_L/blob/master/hardware/MKS%20Gen_L%20V2.1_001/MKS%20GEN_L%20V2.1_001%20SCH.pdf + * Schematic: https://github.com/makerbase-mks/MKS-GEN_L/blob/master/hardware/MKS%20Gen_L%20V2.1_001/MKS%20GEN_L%20V2.1_001%20SCH.pdf * ATmega2560 */ diff --git a/Marlin/src/pins/ramps/pins_RUMBA.h b/Marlin/src/pins/ramps/pins_RUMBA.h index 9a4a384e4ab5..24cc2bada089 100644 --- a/Marlin/src/pins/ramps/pins_RUMBA.h +++ b/Marlin/src/pins/ramps/pins_RUMBA.h @@ -23,8 +23,7 @@ /** * RUMBA pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/RUMBA/RRD-RUMBA_SCHEMATICS.png - * Origin: https://reprap.org/wiki/File:RRD-RUMBA_SCHEMATICS.png + * Schematic: https://reprap.org/wiki/File:RRD-RUMBA_SCHEMATICS.png * ATmega2560 */ diff --git a/Marlin/src/pins/ramps/pins_TANGO.h b/Marlin/src/pins/ramps/pins_TANGO.h index 54dd4433998f..0f8aaca0e2c8 100644 --- a/Marlin/src/pins/ramps/pins_TANGO.h +++ b/Marlin/src/pins/ramps/pins_TANGO.h @@ -23,8 +23,7 @@ /** * BIQU Tango pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/BIQU%20Tango/schematic.png - * Origin: https://github.com/bigtreetech/Tango-3D-Printer-Motherboard/blob/master/Schematic/Tango%20V1.0.SchDoc + * Schematic: https://github.com/bigtreetech/Tango-3D-Printer-Motherboard/blob/master/Schematic/Tango%20V1.0.SchDoc * ATmega2560 */ diff --git a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h index 049e8bc5d80c..ca1b4b883b3a 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h @@ -24,11 +24,6 @@ /** * Ultiboard v2.0 pin assignments * Schematics (2.1.4): - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Ultimaker%202.1.4/schema1.png - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Ultimaker%202.1.4/schema2.png - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Ultimaker%202.1.4/schema3.png - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Ultimaker%202.1.4/schema4.png - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Ultimaker%202.1.4/schema5.png * Origins (2.1.4): * - https://github.com/Ultimaker/Ultimaker2/blob/master/1546%20ultimainboard%20V2.1.4/schema1.SchDoc * - https://github.com/Ultimaker/Ultimaker2/blob/master/1546%20ultimainboard%20V2.1.4/schema2.SchDoc @@ -36,11 +31,7 @@ * - https://github.com/Ultimaker/Ultimaker2/blob/master/1546%20ultimainboard%20V2.1.4/schema4.SchDoc * - https://github.com/Ultimaker/Ultimaker2/blob/master/1546%20ultimainboard%20V2.1.4/schema5.SchDoc * Schematics (Original+): - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Ultimaker%20Original+/Ultimainboard%20rev.%202.1.1%20altium/schema1.png - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Ultimaker%20Original+/Ultimainboard%20rev.%202.1.1%20altium/schema2.png - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Ultimaker%20Original+/Ultimainboard%20rev.%202.1.1%20altium/schema3.png - * - https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Ultimaker%20Original+/Ultimainboard%20rev.%202.1.1%20altium/schema4.png - * Origin (Original+): https://github.com/Ultimaker/Ultimaker-Original-Plus/blob/master/1091_Main_board_v2.1.1_(x1)/Ultimainboard%20rev.%202.1.1%20altium.zip + * Schematic (Original+): https://github.com/Ultimaker/Ultimaker-Original-Plus/blob/master/1091_Main_board_v2.1.1_(x1)/Ultimainboard%20rev.%202.1.1%20altium.zip * ATmega2560 */ diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h index 5cf143a09cf6..c366b152961b 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -23,8 +23,6 @@ /** * Ultimaker pin assignments (Old electronics) - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Ultimaker%201.0/ultipanel%20rev1.1.sch.pdf - * Origin: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/Ultimaker%201.0/ultipanel%20rev1.1.sch.pdf * ATmega2560, ATmega1280 */ diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V20.h b/Marlin/src/pins/ramps/pins_ZRIB_V20.h index d1c80f6a4afc..8218ba12c544 100644 --- a/Marlin/src/pins/ramps/pins_ZRIB_V20.h +++ b/Marlin/src/pins/ramps/pins_ZRIB_V20.h @@ -24,10 +24,8 @@ /** * ZONESTAR ZRIB V2.0 & V3.0 pin assignments * V2 and V3 Boards only differ in USB controller, nothing affecting the pins. - * Schematic (2.0): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/ZONESTAR%20ZRIB%20V2.0/ZRIB_V2_Schematic.pdf - * Origin (2.0): https://github.com/ZONESTAR3D/Control-Board/blob/main/8bit/ZRIB/ZRIB_V2/ZRIB_V2_Schematic.pdf - * Schematic (3.0): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/ZONESTAR%20ZRIB%20V3.0/ZRIB_V3_Schematic.pdf - * Origin (3.0): https://github.com/ZONESTAR3D/Control-Board/blob/main/8bit/ZRIB/ZRIB_V3/ZRIB_V3_Schematic.pdf + * Schematic (2.0): https://github.com/ZONESTAR3D/Control-Board/blob/main/8bit/ZRIB/ZRIB_V2/ZRIB_V2_Schematic.pdf + * Schematic (3.0): https://github.com/ZONESTAR3D/Control-Board/blob/main/8bit/ZRIB/ZRIB_V3/ZRIB_V3_Schematic.pdf * ATmega2560, ATmega1280 */ diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V52.h b/Marlin/src/pins/ramps/pins_ZRIB_V52.h index 5eada31c9cf9..016501241ae9 100644 --- a/Marlin/src/pins/ramps/pins_ZRIB_V52.h +++ b/Marlin/src/pins/ramps/pins_ZRIB_V52.h @@ -23,8 +23,7 @@ /** * ZONESTAR ZRIB V5.2 Based on MKS BASE v1.4 with A4982 stepper drivers and digital micro-stepping - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/RAMPS/ZONESTAR%20ZRIB%20V5.2/ZRIB_V52_Schematic.pdf - * Origin: https://github.com/ZONESTAR3D/Control-Board/blob/main/8bit/ZRIB/ZRIB_V5/ZRIB_V52_Schematic.pdf + * Schematic: https://github.com/ZONESTAR3D/Control-Board/blob/main/8bit/ZRIB/ZRIB_V5/ZRIB_V52_Schematic.pdf * ATmega2560, ATmega1280 */ diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index 8abf0c07e735..ee9fa327742f 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -23,8 +23,7 @@ /** * Anet V1.0 board pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Anet%20V1.0/ANET3D_Board_Schematic.pdf - * Origin: https://github.com/ralf-e/ANET-3D-Board-V1.0/blob/master/ANET3D_Board_Schematic.pdf + * Schematic: https://github.com/ralf-e/ANET-3D-Board-V1.0/blob/master/ANET3D_Board_Schematic.pdf */ /** diff --git a/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h b/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h index 1cbafab432c4..c88b666f6c1c 100644 --- a/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h +++ b/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h @@ -23,8 +23,7 @@ /** * Azteeg X1 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Azteeg%20X1/Azteeg_X1_schematics.pdf - * Origin: https://reprap.org/mediawiki/images/0/07/Azteeg_X1_schematics.pdf + * Schematic: https://reprap.org/mediawiki/images/0/07/Azteeg_X1_schematics.pdf */ #define BOARD_INFO_NAME "Azteeg X1" diff --git a/Marlin/src/pins/sanguino/pins_GEN6.h b/Marlin/src/pins/sanguino/pins_GEN6.h index 4a6136e0810a..3fb1671b7342 100644 --- a/Marlin/src/pins/sanguino/pins_GEN6.h +++ b/Marlin/src/pins/sanguino/pins_GEN6.h @@ -23,8 +23,7 @@ /** * Gen6 pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Gen6/GEN6_Mendel_Circuit.pdf - * Origin: https://reprap.org/mediawiki/images/0/0f/GEN6_Mendel_Circuit.pdf + * Schematic: https://reprap.org/mediawiki/images/0/0f/GEN6_Mendel_Circuit.pdf */ /** diff --git a/Marlin/src/pins/sanguino/pins_GEN7_12.h b/Marlin/src/pins/sanguino/pins_GEN7_12.h index 0bf65c37cd38..503066624523 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_12.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_12.h @@ -23,14 +23,10 @@ /** * Gen7 v1.1, v1.2, v1.3 pin assignments - * Schematic (1.1): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Gen7%20v1.1/Gen7Board%20Schematic.pdf - * Origin (1.1): https://github.com/Traumflug/Generation_7_Electronics/blob/release-1.1/release%20documents/Gen7Board%20Schematic.pdf - * Schematic (1.2): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Gen7%20v1.2/Gen7Board%20Schematic.pdf - * Origin (1.2): https://github.com/Traumflug/Generation_7_Electronics/blob/release-1.2/release%20documents/Gen7Board%20Schematic.pdf - * Schematic (1.3): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Gen7%20v1.3/Gen7Board%20Schematic.pdf - * Origin (1.3): https://github.com/Traumflug/Generation_7_Electronics/blob/release-1.3/release%20documents/Gen7Board%20Schematic.pdf - * Schematic (1.3.1): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Gen7%20v1.3.1/Gen7Board%20Schematic.pdf - * Origin (1.3.1): https://github.com/Traumflug/Generation_7_Electronics/blob/release-1.3.1/release%20documents/Gen7Board%20Schematic.pdf + * Schematic (1.1): https://github.com/Traumflug/Generation_7_Electronics/blob/release-1.1/release%20documents/Gen7Board%20Schematic.pdf + * Schematic (1.2): https://github.com/Traumflug/Generation_7_Electronics/blob/release-1.2/release%20documents/Gen7Board%20Schematic.pdf + * Schematic (1.3): https://github.com/Traumflug/Generation_7_Electronics/blob/release-1.3/release%20documents/Gen7Board%20Schematic.pdf + * Schematic (1.3.1): https://github.com/Traumflug/Generation_7_Electronics/blob/release-1.3.1/release%20documents/Gen7Board%20Schematic.pdf */ /** diff --git a/Marlin/src/pins/sanguino/pins_GEN7_14.h b/Marlin/src/pins/sanguino/pins_GEN7_14.h index db80c45eeefe..10e578496616 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_14.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_14.h @@ -23,10 +23,8 @@ /** * Gen7 v1.4 pin assignments - * Schematic (1.4): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Gen7%20v1.4/Gen7Board%201.4%20Schematic.pdf - * Origin (1.4): https://github.com/Traumflug/Generation_7_Electronics/blob/Gen7Board-1.4/release%20documents/Gen7Board%201.4%20Schematic.pdf - * Schematic (1.4.1): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Gen7%20v1.4.1/Gen7Board%201.4.1%20Schematic.pdf - * Origin (1.4.1): https://github.com/Traumflug/Generation_7_Electronics/blob/Gen7Board-1.4.1/release%20documents/Gen7Board%201.4.1%20Schematic.pdf + * Schematic (1.4): https://github.com/Traumflug/Generation_7_Electronics/blob/Gen7Board-1.4/release%20documents/Gen7Board%201.4%20Schematic.pdf + * Schematic (1.4.1): https://github.com/Traumflug/Generation_7_Electronics/blob/Gen7Board-1.4.1/release%20documents/Gen7Board%201.4.1%20Schematic.pdf */ /** diff --git a/Marlin/src/pins/sanguino/pins_MELZI.h b/Marlin/src/pins/sanguino/pins_MELZI.h index a0c7050a9111..27df72d92226 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI.h +++ b/Marlin/src/pins/sanguino/pins_MELZI.h @@ -23,8 +23,7 @@ /** * Melzi pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Melzi/schematic.pdf - * Origin: https://github.com/mosfet/melzi/blob/master/melzi.sch + * Schematic: https://github.com/mosfet/melzi/blob/master/melzi.sch */ #ifndef BOARD_INFO_NAME diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h index f441523322e3..2915c77d70c9 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h @@ -23,8 +23,7 @@ /** * Melzi (Creality) pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Melzi%20(Creality)/CR-10%20Schematic.pdf - * Origin: https://github.com/Creality3DPrinting/CR10-Melzi-1.1.2/blob/master/Circuit%20diagram/Motherboard/CR-10%20Schematic.pdf + * Schematic: https://github.com/Creality3DPrinting/CR10-Melzi-1.1.2/blob/master/Circuit%20diagram/Motherboard/CR-10%20Schematic.pdf * ATmega1284P * * The Creality board needs a bootloader installed before Marlin can be uploaded. diff --git a/Marlin/src/pins/sanguino/pins_MELZI_V2.h b/Marlin/src/pins/sanguino/pins_MELZI_V2.h index b48e77a5c367..d90cd01af2c8 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_V2.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_V2.h @@ -23,8 +23,7 @@ /** * Melzi V2.0 as found at https://www.reprap.org/wiki/Melzi - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Melzi%20V2/Melzi-circuit.png - * Origin: https://www.reprap.org/mediawiki/images/7/7d/Melzi-circuit.png + * Schematic: https://www.reprap.org/mediawiki/images/7/7d/Melzi-circuit.png * * ATmega644P */ diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index bee2a30e44ab..a381088ecf90 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -23,16 +23,11 @@ /** * Sanguinololu board pin assignments - * Schematic (0.1): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Sanguinololu%20v0.1/schematic.png - * Origin (0.1): https://github.com/mosfet/Sanguinololu/blob/master/rev0.1/sanguinololu.sch - * Schematic (0.6): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Sanguinololu%20v0.6/schematic.jpg - * Origin (0.6): https://github.com/mosfet/Sanguinololu/blob/master/rev0.6/images/schematic.jpg - * Schematic (0.7): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Sanguinololu%20v0.7/schematic.jpg - * Origin (0.7): https://github.com/mosfet/Sanguinololu/blob/master/rev0.7/images/schematic.jpg - * Schematic (1.0): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Sanguinololu%20v1.0/Sanguinololu-schematic.jpg - * Origin (1.0): https://reprap.org/wiki/File:Sanguinololu-schematic.jpg - * Schematic (1.1): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Sanguinololu%20v1.1/schematic.png - * Origin (1.1): https://github.com/mosfet/Sanguinololu/blob/master/rev1.1/sanguinololu.sch + * Schematic (0.1): https://github.com/mosfet/Sanguinololu/blob/master/rev0.1/sanguinololu.sch + * Schematic (0.6): https://github.com/mosfet/Sanguinololu/blob/master/rev0.6/images/schematic.jpg + * Schematic (0.7): https://github.com/mosfet/Sanguinololu/blob/master/rev0.7/images/schematic.jpg + * Schematic (1.0): https://reprap.org/wiki/File:Sanguinololu-schematic.jpg + * Schematic (1.1): https://github.com/mosfet/Sanguinololu/blob/master/rev1.1/sanguinololu.sch */ /** diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h index 37d1e7030b42..a86f2382dbc2 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h @@ -23,12 +23,9 @@ /** * Sanguinololu V1.2 pin assignments - * Schematic (1.2): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Sanguinololu%20v1.2/schematic.png - * Origin (1.2): https://github.com/mosfet/Sanguinololu/blob/master/rev1.2/sanguinololu.sch - * Schematic (1.3): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Sanguinololu%20v1.3/schematic.png - * Origin (1.3): https://github.com/mosfet/Sanguinololu/blob/master/rev1.3/sanguinololu.sch - * Schematic (1.3a): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Sanguinololu%20v1.3a/schematic.png - * Origin (1.3a): https://github.com/mosfet/Sanguinololu/blob/master/rev1.3a/sanguinololu.sch + * Schematic (1.2): https://github.com/mosfet/Sanguinololu/blob/master/rev1.2/sanguinololu.sch + * Schematic (1.3): https://github.com/mosfet/Sanguinololu/blob/master/rev1.3/sanguinololu.sch + * Schematic (1.3a): https://github.com/mosfet/Sanguinololu/blob/master/rev1.3a/sanguinololu.sch * * Applies to the following boards: * diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index ade9c08aa045..39d55d1b2831 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -31,8 +31,7 @@ /** * ZMIB pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/ZONESTAR%20ZMIB%20V2/ZMIB_V2_Schmatic.pdf - * Origin: https://github.com/ZONESTAR3D/Control-Board/blob/main/8bit/ZMIB/ZMIB%20V2/ZMIB_V2_Schmatic.pdf + * Schematic: https://github.com/ZONESTAR3D/Control-Board/blob/main/8bit/ZMIB/ZMIB%20V2/ZMIB_V2_Schmatic.pdf * * The ZMIB board needs a bootloader installed before Marlin can be uploaded. * If you don't have a chip programmer you can use a spare Arduino plus a few diff --git a/Marlin/src/pins/teensy2/pins_5DPRINT.h b/Marlin/src/pins/teensy2/pins_5DPRINT.h index 798f98dae509..1b1bbf122d87 100644 --- a/Marlin/src/pins/teensy2/pins_5DPRINT.h +++ b/Marlin/src/pins/teensy2/pins_5DPRINT.h @@ -64,8 +64,7 @@ /** * 5DPrint D8 Driver board pin assignments - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/5DPrint%20D8/5DPD8_v1.0_OS_schematics.PDF - * Origin: https://bitbucket.org/makible/5dprint-d8-controller-board/src/master/5DPD8_v1.0_OS_schematics.PDF + * Schematic: https://bitbucket.org/makible/5dprint-d8-controller-board/src/master/5DPD8_v1.0_OS_schematics.PDF * * https://bitbucket.org/makible/5dprint-d8-controller-board */ diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h index 900eae6dd49e..8bdd926dda2d 100644 --- a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h +++ b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h @@ -28,8 +28,7 @@ * Requires hardware bundle for Arduino: * https://github.com/unrepentantgeek/brainwave-arduino * - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Brainwave/schematic.pdf - * Origin: https://github.com/unrepentantgeek/Brainwave/blob/master/brainwave/brainwave.sch + * Schematic: https://github.com/unrepentantgeek/Brainwave/blob/master/brainwave/brainwave.sch */ /** diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h index ab4427a8892d..f36ea66cf7a3 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h @@ -26,14 +26,10 @@ * * Converted to Arduino pin numbering * - * Schematic (RevA): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Printrboard%20Rev.A/schematic.png - * Origin (RevA): https://raw.githubusercontent.com/lwalkera/printrboard/revA/Printrboard.sch - * Schematic (RevB): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Printrboard%20Rev.B/schematic.png - * Origin (RevB): https://raw.githubusercontent.com/lwalkera/printrboard/revB/Printrboard.sch - * Schematic (RevC): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Printrboard%20Rev.C/schematic.png - * Origin (RevC): https://raw.githubusercontent.com/lwalkera/printrboard/revC/Printrboard.sch - * Schematic (RevD): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Printrboard%20Rev.D/schematic.png - * Origin (RevD): https://raw.githubusercontent.com/lwalkera/printrboard/RevD/Printrboard.sch + * Schematic (RevA): https://raw.githubusercontent.com/lwalkera/printrboard/revA/Printrboard.sch + * Schematic (RevB): https://raw.githubusercontent.com/lwalkera/printrboard/revB/Printrboard.sch + * Schematic (RevC): https://raw.githubusercontent.com/lwalkera/printrboard/revC/Printrboard.sch + * Schematic (RevD): https://raw.githubusercontent.com/lwalkera/printrboard/RevD/Printrboard.sch */ /** diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index 62922399d827..ef70d1a2cba2 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -26,18 +26,12 @@ * * Converted to Arduino pin numbering * - * Schematic (RevF): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Printrboard%20Rev.F/schematic.png - * Origin (RevF): https://github.com/lwalkera/printrboard/raw/revF/Printrboard.sch - * Schematic (RevF2): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Printrboard%20Rev.F2/schematic.png - * Origin (RevF2): https://raw.githubusercontent.com/lwalkera/printrboard/revF2/Printrboard.sch - * Schematic (RevF3): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Printrboard%20Rev.F3/schematic.png - * Origin (RevF3): https://raw.githubusercontent.com/lwalkera/printrboard/revF3/Printrboard.sch - * Schematic (RevF4): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Printrboard%20Rev.F4/schematic.png - * Origin (RevF4): https://raw.githubusercontent.com/lwalkera/printrboard/revF4/Printrboard.sch - * Schematic (RevF5): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Printrboard%20Rev.F5/schematic.png - * Origin (RevF5): https://raw.githubusercontent.com/lwalkera/printrboard/revF5/Printrboard.sch - * Schematic (RevF6): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Printrboard%20Rev.F6/schematic.png - * Origin (RevF6): https://raw.githubusercontent.com/lwalkera/printrboard/revF6/Printrboard.sch + * Schematic (RevF): https://github.com/lwalkera/printrboard/raw/revF/Printrboard.sch + * Schematic (RevF2): https://raw.githubusercontent.com/lwalkera/printrboard/revF2/Printrboard.sch + * Schematic (RevF3): https://raw.githubusercontent.com/lwalkera/printrboard/revF3/Printrboard.sch + * Schematic (RevF4): https://raw.githubusercontent.com/lwalkera/printrboard/revF4/Printrboard.sch + * Schematic (RevF5): https://raw.githubusercontent.com/lwalkera/printrboard/revF5/Printrboard.sch + * Schematic (RevF6): https://raw.githubusercontent.com/lwalkera/printrboard/revF6/Printrboard.sch */ /** diff --git a/Marlin/src/pins/teensy2/pins_SAV_MKI.h b/Marlin/src/pins/teensy2/pins_SAV_MKI.h index 9f590cbbb4e0..a0d056f85014 100644 --- a/Marlin/src/pins/teensy2/pins_SAV_MKI.h +++ b/Marlin/src/pins/teensy2/pins_SAV_MKI.h @@ -26,8 +26,7 @@ * * Converted to Arduino pin numbering * - * Schematic: https://green-candy.osdn.jp/external/MarlinFW/board_schematics/SAV%20MkI/SAV_MK-I.pdf - * Origin: https://reprap.org/mediawiki/images/3/3c/SAV_MK-I.pdf + * Schematic: https://reprap.org/mediawiki/images/3/3c/SAV_MK-I.pdf */ /** diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h index a6a16f2be158..454aff91fcd8 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h +++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h @@ -25,8 +25,7 @@ * * Converted to Arduino pin numbering * - * Schematic (1.0): https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Teensylu%20v1.0/schematic.png - * Origin (1.0): https://raw.githubusercontent.com/StephS/Teensylu/master/working/Teensylu-1.0.sch + * Schematic (1.0): https://raw.githubusercontent.com/StephS/Teensylu/master/working/Teensylu-1.0.sch * (*) Other versions are discouraged by creator. */ From 245db739291155a48de777ebbdb4023e8975b61e Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 16 Apr 2024 18:06:16 +0000 Subject: [PATCH 082/111] [cron] Bump distribution date (2024-04-16) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 1da31c514e38..698502fa8a44 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 "2024-04-15" +//#define STRING_DISTRIBUTION_DATE "2024-04-16" /** * 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 42225ed00ed4..4516ec0a9fad 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 "2024-04-15" + #define STRING_DISTRIBUTION_DATE "2024-04-16" #endif /** From 07ebb8171f68919e984f5d4f6772f3c9c35a4601 Mon Sep 17 00:00:00 2001 From: Javlon Sodikov <5047093+javlonsodikov@users.noreply.github.com> Date: Wed, 17 Apr 2024 10:25:22 +0500 Subject: [PATCH 083/111] =?UTF-8?q?=F0=9F=A9=B9Fix=20ProUI=20error=20when?= =?UTF-8?q?=20!CASELIGHT=5FUSES=5FBRIGHTNESS=20(#26976)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix the compile error with the case light menu Fix the compile error with the case light menu * Add failing test --------- Co-authored-by: Jason Smith --- Marlin/src/lcd/e3v2/proui/dwin.cpp | 2 +- buildroot/tests/STM32F103RE_creality | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index 4c5f91e03222..a0e2f8898bdd 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -3145,7 +3145,7 @@ void drawControlMenu() { enableLiveCaseLightBrightness = true; // Allow live update of brightness in control menu MENU_ITEM(ICON_CaseLight, MSG_CASE_LIGHT, onDrawSubMenu, drawCaseLightMenu); #else - MENU_ITEM(ICON_CaseLight, MSG_CASE_LIGHT, onDrawChkbMenu, setCaseLight, &caselight.on); + EDIT_ITEM(ICON_CaseLight, MSG_CASE_LIGHT, onDrawChkbMenu, setCaseLight, &caselight.on); #endif #endif #if ENABLED(LED_CONTROL_MENU) diff --git a/buildroot/tests/STM32F103RE_creality b/buildroot/tests/STM32F103RE_creality index 1fea3c963f02..44d818b62400 100755 --- a/buildroot/tests/STM32F103RE_creality +++ b/buildroot/tests/STM32F103RE_creality @@ -28,8 +28,9 @@ opt_disable DWIN_CREALITY_LCD Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN AUTO_BED_LEVELI opt_enable DWIN_LCD_PROUI INDIVIDUAL_AXIS_HOMING_SUBMENU SET_PROGRESS_MANUALLY SET_PROGRESS_PERCENT STATUS_MESSAGE_SCROLLING \ SOUND_MENU_ITEM PRINTCOUNTER NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_SENSOR \ BLTOUCH Z_SAFE_HOMING AUTO_BED_LEVELING_UBL MESH_EDIT_MENU LCD_BED_TRAMMING \ - LIMITED_MAX_FR_EDITING LIMITED_MAX_ACCEL_EDITING LIMITED_JERK_EDITING BAUD_RATE_GCODE -opt_set PREHEAT_3_LABEL '"CUSTOM"' PREHEAT_3_TEMP_HOTEND 240 PREHEAT_3_TEMP_BED 60 PREHEAT_3_FAN_SPEED 128 BOOTSCREEN_TIMEOUT 1100 + LIMITED_MAX_FR_EDITING LIMITED_MAX_ACCEL_EDITING LIMITED_JERK_EDITING BAUD_RATE_GCODE \ + CASE_LIGHT_ENABLE CASE_LIGHT_MENU CASE_LIGHT_NO_BRIGHTNESS +opt_set PREHEAT_3_LABEL '"CUSTOM"' PREHEAT_3_TEMP_HOTEND 240 PREHEAT_3_TEMP_BED 60 PREHEAT_3_FAN_SPEED 128 BOOTSCREEN_TIMEOUT 1100 CASE_LIGHT_PIN 4 exec_test $1 $2 "Ender-3 S1 - ProUI (PIDTEMP)" "$3" restore_configs From d6961b2626c1ec6fd3d3a1b094ef1d433503ca7d Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 17 Apr 2024 06:06:51 +0000 Subject: [PATCH 084/111] [cron] Bump distribution date (2024-04-17) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 698502fa8a44..1f652c6f2a7f 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 "2024-04-16" +//#define STRING_DISTRIBUTION_DATE "2024-04-17" /** * 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 4516ec0a9fad..4b09a73b015d 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 "2024-04-16" + #define STRING_DISTRIBUTION_DATE "2024-04-17" #endif /** From 90667f611410cce5a3771f82962af16bac695622 Mon Sep 17 00:00:00 2001 From: I3DBeeTech <129617321+I3DBeeTech@users.noreply.github.com> Date: Fri, 19 Apr 2024 02:24:17 +0530 Subject: [PATCH 085/111] =?UTF-8?q?=F0=9F=90=9B=20Fix=20BLACKBEEZMINI=20fa?= =?UTF-8?q?n,=20info=20(#26983)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/stm32f4/pins_BLACKBEEZMINI.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_BLACKBEEZMINI.h b/Marlin/src/pins/stm32f4/pins_BLACKBEEZMINI.h index 886dd092fb84..ead1ee5e05ba 100644 --- a/Marlin/src/pins/stm32f4/pins_BLACKBEEZMINI.h +++ b/Marlin/src/pins/stm32f4/pins_BLACKBEEZMINI.h @@ -29,8 +29,8 @@ #include "env_validate.h" -#ifndef DEFAULT_MACHINE_NAME - #define DEFAULT_MACHINE_NAME "I3DBEE BP_01" +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "I3DBEE BP_01" #endif #define TEMP_TIMER 5 @@ -97,7 +97,7 @@ #define HEATER_0_PIN PA2 // HOTEND MOSFET #define HEATER_BED_PIN PA0 // BED MOSFET -#define FAN1_PIN PA1 // FAN1 header on board - PRINT FAN +#define FAN0_PIN PA1 // FAN1 header on board - PRINT FAN // // SD Card From dba0010607b9c27722b2df79c75affa1b51f0e81 Mon Sep 17 00:00:00 2001 From: Andrew <18502096+classicrocker883@users.noreply.github.com> Date: Thu, 18 Apr 2024 19:04:03 -0400 Subject: [PATCH 086/111] =?UTF-8?q?=F0=9F=8E=A8=20Rename=20some=20G-code?= =?UTF-8?q?=20files=20(#26981)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/control/{M10-M11.cpp => M10_M11.cpp} | 5 +++++ Marlin/src/gcode/temp/{M86-M87.cpp => M86_M87.cpp} | 2 +- ini/features.ini | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) rename Marlin/src/gcode/control/{M10-M11.cpp => M10_M11.cpp} (95%) rename Marlin/src/gcode/temp/{M86-M87.cpp => M86_M87.cpp} (98%) diff --git a/Marlin/src/gcode/control/M10-M11.cpp b/Marlin/src/gcode/control/M10_M11.cpp similarity index 95% rename from Marlin/src/gcode/control/M10-M11.cpp rename to Marlin/src/gcode/control/M10_M11.cpp index d5a69dcfccfb..8fd299c5465b 100644 --- a/Marlin/src/gcode/control/M10-M11.cpp +++ b/Marlin/src/gcode/control/M10_M11.cpp @@ -20,6 +20,11 @@ * */ +/** + * gcode/control/M10_M11.cpp + * Air Evacuation + */ + #include "../../inc/MarlinConfig.h" #if ENABLED(AIR_EVACUATION) diff --git a/Marlin/src/gcode/temp/M86-M87.cpp b/Marlin/src/gcode/temp/M86_M87.cpp similarity index 98% rename from Marlin/src/gcode/temp/M86-M87.cpp rename to Marlin/src/gcode/temp/M86_M87.cpp index a64358d21278..502052e87be9 100644 --- a/Marlin/src/gcode/temp/M86-M87.cpp +++ b/Marlin/src/gcode/temp/M86_M87.cpp @@ -21,7 +21,7 @@ */ /** - * gcode/temp/M86-M87.cpp + * gcode/temp/M86_M87.cpp * * Hotend Idle Timeout */ diff --git a/ini/features.ini b/ini/features.ini index 8999c8f23db8..cb3b96c402a2 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -243,7 +243,7 @@ HAS_FANMUX = build_src_filter=+ + FWRETRACT = build_src_filter=+ + HOST_ACTION_COMMANDS = build_src_filter=+ -HOTEND_IDLE_TIMEOUT = build_src_filter=+ + +HOTEND_IDLE_TIMEOUT = build_src_filter=+ + JOYSTICK = build_src_filter=+ BLINKM = build_src_filter=+ HAS_COLOR_LEDS = build_src_filter=+ + @@ -299,7 +299,7 @@ SD_ABORT_ON_ENDSTOP_HIT = build_src_filter=+ HAS_SMART_EFF_MOD = build_src_filter=+ COOLANT_CONTROL|AIR_ASSIST = build_src_filter=+ -AIR_EVACUATION = build_src_filter=+ +AIR_EVACUATION = build_src_filter=+ HAS_SOFTWARE_ENDSTOPS = build_src_filter=+ SERVO_DETACH_GCODE = build_src_filter=+ HAS_DUPLICATION_MODE = build_src_filter=+ From 02ba6f9f3a4be9c38e16c85a56fd33679ed5b772 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 19 Apr 2024 00:21:25 +0000 Subject: [PATCH 087/111] [cron] Bump distribution date (2024-04-19) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 1f652c6f2a7f..d9ddcdd0b836 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 "2024-04-17" +//#define STRING_DISTRIBUTION_DATE "2024-04-19" /** * 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 4b09a73b015d..4a15d226add0 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 "2024-04-17" + #define STRING_DISTRIBUTION_DATE "2024-04-19" #endif /** From b4a95db7dafaa16901c682f648fcdce4e7763929 Mon Sep 17 00:00:00 2001 From: Chris <52449218+shadow578@users.noreply.github.com> Date: Sat, 20 Apr 2024 23:43:31 +0200 Subject: [PATCH 088/111] =?UTF-8?q?=F0=9F=9A=A8Fix=20buffer=20overrun=20wa?= =?UTF-8?q?rning=20in=20UBL=20(#26984)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit to account for null terminator --- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 701d2ae97a54..64c9cc382b4d 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -144,7 +144,7 @@ void _lcd_ubl_custom_mesh() { * UBL Adjust Mesh Height Command */ void _lcd_ubl_adjust_height_cmd() { - char ubl_lcd_gcode[13]; + char ubl_lcd_gcode[14]; const int ind = ubl_height_amount > 0 ? 6 : 7; strcpy_P(ubl_lcd_gcode, PSTR("G29P6C-")); sprintf_P(&ubl_lcd_gcode[ind], PSTR(".%i"), ABS(ubl_height_amount)); From d502e5beaac79b55553ecfc706653805f74d5599 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 21 Apr 2024 09:46:48 +1200 Subject: [PATCH 089/111] =?UTF-8?q?=F0=9F=90=9B=20Fix=20auto-assignment=20?= =?UTF-8?q?errors=20for=20J=20and=20U=20axis=20(#26979)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/pins_postprocess.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/pins_postprocess.h b/Marlin/src/pins/pins_postprocess.h index e6fdac2155d1..ac81eb3f25ba 100644 --- a/Marlin/src/pins/pins_postprocess.h +++ b/Marlin/src/pins/pins_postprocess.h @@ -1247,7 +1247,7 @@ #define J_STEP_PIN _EPIN(J_E_INDEX, STEP) #define J_DIR_PIN _EPIN(J_E_INDEX, DIR) #define J_ENABLE_PIN _EPIN(J_E_INDEX, ENABLE) - #if I_E_INDEX >= MAX_E_STEPPERS || !PIN_EXISTS(J_STEP) + #if J_E_INDEX >= MAX_E_STEPPERS || !PIN_EXISTS(J_STEP) #error "No E stepper plug left for J!" #else #define AUTO_ASSIGNED_J_STEPPER 1 @@ -1417,7 +1417,7 @@ #define U_STEP_PIN _EPIN(U_E_INDEX, STEP) #define U_DIR_PIN _EPIN(U_E_INDEX, DIR) #define U_ENABLE_PIN _EPIN(U_E_INDEX, ENABLE) - #if M_E_INDEX >= MAX_E_STEPPERS || !PIN_EXISTS(U_STEP) + #if U_E_INDEX >= MAX_E_STEPPERS || !PIN_EXISTS(U_STEP) #error "No E stepper plug left for U!" #else #define AUTO_ASSIGNED_U_STEPPER 1 From 58d4494365df50927442ab78b5147969be697575 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 21 Apr 2024 09:48:31 +1200 Subject: [PATCH 090/111] add ui_api.h include (#26977) --- Marlin/src/lcd/e3v2/proui/dwin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index a0e2f8898bdd..fd4e09588581 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -37,6 +37,7 @@ #include "../../utf8.h" #include "../../marlinui.h" +#include "../../extui/ui_api.h" #include "../../../MarlinCore.h" #include "../../../core/serial.h" #include "../../../core/macros.h" From e1ab911c356cb5b0b449fa4e6379dbe0a483c7a0 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 20 Apr 2024 17:58:13 -0400 Subject: [PATCH 091/111] =?UTF-8?q?=F0=9F=93=9DImprove=20Freeze=20Feature?= =?UTF-8?q?=20comment=20(#26959)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix and Improve Freeze Feature comment --- Marlin/Configuration_adv.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 95e680a6d43d..f0066338c177 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -4261,7 +4261,8 @@ /** * Instant freeze / unfreeze functionality - * Potentially useful for emergency stop that allows being resumed. + * Potentially useful for rapid stop that allows being resumed. Halts stepper movement. + * Note this does NOT pause spindles, lasers, fans, heaters or any other auxiliary device. * @section interface */ //#define FREEZE_FEATURE From ca12459b9c014c88d57d0e2178b64f9e3a07b1ff Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 20 Apr 2024 15:55:30 -0700 Subject: [PATCH 092/111] =?UTF-8?q?=E2=9C=85=20Skip=20compile=20tests=20wh?= =?UTF-8?q?en=20editing=20unit=20tests=20(#26991)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-build-tests.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci-build-tests.yml b/.github/workflows/ci-build-tests.yml index ad37100d6031..546faa5f38f6 100644 --- a/.github/workflows/ci-build-tests.yml +++ b/.github/workflows/ci-build-tests.yml @@ -14,6 +14,8 @@ on: - config/** - data/** - docs/** + - test/** + - Marlin/tests/** - '**/*.md' push: branches: @@ -23,6 +25,8 @@ on: - config/** - data/** - docs/** + - test/** + - Marlin/tests/** - '**/*.md' jobs: From 9a8fb80eedde28dc4a32634be4ab55c44a059371 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 20 Apr 2024 17:00:07 -0700 Subject: [PATCH 093/111] =?UTF-8?q?=F0=9F=8E=A8Match=20unit=20test=20folde?= =?UTF-8?q?r=20structure=20to=20code=20(#26990)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/tests/{types => core}/test_types.cpp | 0 .../{runout/test_runout_sensor.cpp => feature/test_runout.cpp} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename Marlin/tests/{types => core}/test_types.cpp (100%) rename Marlin/tests/{runout/test_runout_sensor.cpp => feature/test_runout.cpp} (100%) diff --git a/Marlin/tests/types/test_types.cpp b/Marlin/tests/core/test_types.cpp similarity index 100% rename from Marlin/tests/types/test_types.cpp rename to Marlin/tests/core/test_types.cpp diff --git a/Marlin/tests/runout/test_runout_sensor.cpp b/Marlin/tests/feature/test_runout.cpp similarity index 100% rename from Marlin/tests/runout/test_runout_sensor.cpp rename to Marlin/tests/feature/test_runout.cpp From 24f8831021ff594fcf2fabd169d46bbc3cde5316 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 21 Apr 2024 00:23:15 +0000 Subject: [PATCH 094/111] [cron] Bump distribution date (2024-04-21) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index d9ddcdd0b836..dda34bce9bf0 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 "2024-04-19" +//#define STRING_DISTRIBUTION_DATE "2024-04-21" /** * 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 4a15d226add0..8a34e75115bb 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 "2024-04-19" + #define STRING_DISTRIBUTION_DATE "2024-04-21" #endif /** From bc0d7d7140abc61c89264f718f0797046dbff022 Mon Sep 17 00:00:00 2001 From: Aron List Date: Sun, 21 Apr 2024 03:18:49 +0200 Subject: [PATCH 095/111] =?UTF-8?q?=F0=9F=90=9B=20Fix=20PID=20upon=20enter?= =?UTF-8?q?ing=20PID=5FFUNCTIONAL=5FRANGE=20(#26926)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The PID algorithm did not cache the last seen temperature until it entered the PID_FUNCTIONAL_RANGE. This caused an incorrect output power to be calculated temporarily while the algorithm caught up. This has likely always been a problem for bed and chamber PID. For the hotend this error was introduced in refactoring in commit 54e7b933cdb6d0bf0d69fd661b585100d76e3c88. --- Marlin/src/module/temperature.h | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 088a17ec1b99..16d4a38e0811 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -204,31 +204,35 @@ typedef struct { float p, i, d, c, f; } raw_pidcf_t; float get_pid_output(const float target, const float current) { const float pid_error = target - current; + float output_pow; if (!target || pid_error < -(PID_FUNCTIONAL_RANGE)) { pid_reset = true; - return 0; + output_pow = 0; } else if (pid_error > PID_FUNCTIONAL_RANGE) { pid_reset = true; - return MAX_POW; + output_pow = MAX_POW; } + else { + if (pid_reset) { + pid_reset = false; + temp_iState = 0.0; + work_d = 0.0; + } - if (pid_reset) { - pid_reset = false; - temp_iState = 0.0; - work_d = 0.0; - } + const float max_power_over_i_gain = float(MAX_POW) / Ki - float(MIN_POW); + temp_iState = constrain(temp_iState + pid_error, 0, max_power_over_i_gain); - const float max_power_over_i_gain = float(MAX_POW) / Ki - float(MIN_POW); - temp_iState = constrain(temp_iState + pid_error, 0, max_power_over_i_gain); + work_p = Kp * pid_error; + work_i = Ki * temp_iState; + work_d = work_d + PID_K2 * (Kd * (temp_dState - current) - work_d); - work_p = Kp * pid_error; - work_i = Ki * temp_iState; - work_d = work_d + PID_K2 * (Kd * (temp_dState - current) - work_d); + output_pow = constrain(work_p + work_i + work_d + float(MIN_POW), 0, MAX_POW); + } temp_dState = current; - return constrain(work_p + work_i + work_d + float(MIN_POW), 0, MAX_POW); + return output_pow; } }; From f433b2c4338294bbe3189b58d6223a31a2bebb96 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 20 Apr 2024 21:27:56 -0400 Subject: [PATCH 096/111] =?UTF-8?q?=F0=9F=94=A7=20Add=20RAMPS=20TMC=20SPI?= =?UTF-8?q?=20pins=20when=20!TMC=5FUSE=5FSW=5FSPI=20(#26960)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Allows RAMPS to auto assign HW SPI Pins for TMC --- Marlin/src/pins/ramps/pins_RAMPS.h | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index 0195f3a1bc9a..0e6e33e18e88 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -320,17 +320,29 @@ #endif // -// TMC software SPI +// TMC SPI // #if HAS_TMC_SPI - #ifndef TMC_SPI_MOSI - #define TMC_SPI_MOSI AUX2_09 - #endif - #ifndef TMC_SPI_MISO - #define TMC_SPI_MISO AUX2_07 - #endif - #ifndef TMC_SPI_SCK - #define TMC_SPI_SCK AUX2_05 + #if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SPI_MOSI + #define TMC_SPI_MOSI AUX2_09 + #endif + #ifndef TMC_SPI_MISO + #define TMC_SPI_MISO AUX2_07 + #endif + #ifndef TMC_SPI_SCK + #define TMC_SPI_SCK AUX2_05 + #endif + #else + #ifndef TMC_SPI_MOSI + #define TMC_SPI_MOSI AUX3_04 + #endif + #ifndef TMC_SPI_MISO + #define TMC_SPI_MISO AUX3_03 + #endif + #ifndef TMC_SPI_SCK + #define TMC_SPI_SCK AUX3_05 + #endif #endif #endif From 9e19a6efe101b57ce0419b16318bdb26acbaf27a Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 20 Apr 2024 23:40:26 -0700 Subject: [PATCH 097/111] =?UTF-8?q?=E2=9C=85=20Unit=20test=20improvements?= =?UTF-8?q?=20(#26993)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reset config.ini in restore_configs - Allow running a single configuration of unit tests locally --- Makefile | 30 +++++++++++++----------------- buildroot/bin/restore_configs | 1 + 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 029ab3ada13f..db4eeba378bd 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ SCRIPTS_DIR := buildroot/share/scripts CONTAINER_RT_BIN := docker CONTAINER_RT_OPTS := --rm -v $(PWD):/code -v platformio-cache:/root/.platformio CONTAINER_IMAGE := marlin-dev +UNIT_TEST_CONFIG ?= default help: @echo "Tasks for local development:" @@ -12,12 +13,11 @@ help: @echo "make tests-single-local-docker : Run a single test locally, using docker" @echo "make tests-all-local : Run all tests locally" @echo "make tests-all-local-docker : Run all tests locally, using docker" -# @echo "make unit-test-single-ci : Run a single code test from inside the CI" -# @echo "make unit-test-single-local : Run a single code test locally" -# @echo "make unit-test-single-local-docker : Run a single code test locally, using docker-compose" + @echo "make unit-test-single-local : Run unit tests for a single config locally" + @echo "make unit-test-single-local-docker : Run unit tests for a single config locally, using docker" @echo "make unit-test-all-local : Run all code tests locally" - @echo "make unit-test-all-local-docker : Run all code tests locally, using docker-compose" - @echo "make setup-local-docker : Setup local docker-compose" + @echo "make unit-test-all-local-docker : Run all code tests locally, using docker" + @echo "make setup-local-docker : Setup local docker using buildx" @echo "" @echo "Options for testing:" @echo " TEST_TARGET Set when running tests-single-*, to select the" @@ -27,6 +27,9 @@ help: @echo " run on GitHub CI" @echo " ONLY_TEST Limit tests to only those that contain this, or" @echo " the index of the test (1-based)" + @echo " UNIT_TEST_CONFIG Set the name of the config from the test folder, without" + @echo " the leading number. Default is 'default'". Used with the + @echo " unit-test-single-* tasks" @echo " VERBOSE_PLATFORMIO If you want the full PIO output, set any value" @echo " GIT_RESET_HARD Used by CI: reset all local changes. WARNING:" @echo " THIS WILL UNDO ANY CHANGES YOU'VE MADE!" @@ -59,19 +62,12 @@ tests-all-local-docker: @if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi $(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) -#unit-test-single-ci: -# export GIT_RESET_HARD=true -# $(MAKE) unit-test-single-local TEST_TARGET=$(TEST_TARGET) +unit-test-single-local: + platformio run -t marlin_$(UNIT_TEST_CONFIG) -e linux_native_test -# TODO: How can we limit tests with ONLY_TEST with platformio? -#unit-test-single-local: -# @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET= or use make unit-test-all-local" ; return 1; fi -# platformio run -t marlin_$(TEST_TARGET) - -#unit-test-single-local-docker: -# @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET= or use make unit-test-all-local-docker" ; return 1; fi -# @if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi -# $(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-single-local TEST_TARGET=$(TEST_TARGET) ONLY_TEST="$(ONLY_TEST)" +unit-test-single-local-docker: + @if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi + $(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-single-local UNIT_TEST_CONFIG=$(UNIT_TEST_CONFIG) unit-test-all-local: platformio run -t test-marlin -e linux_native_test diff --git a/buildroot/bin/restore_configs b/buildroot/bin/restore_configs index 51f72c579258..e1a601679bd1 100755 --- a/buildroot/bin/restore_configs +++ b/buildroot/bin/restore_configs @@ -7,5 +7,6 @@ if [[ $1 == '-d' || $1 == '--default' ]]; then else git checkout Marlin/Configuration.h 2>/dev/null git checkout Marlin/Configuration_adv.h 2>/dev/null + git checkout Marlin/config.ini 2>/dev/null git checkout Marlin/src/pins/*/pins_*.h 2>/dev/null fi From 556da2b3fcddd9c5152542a0f5250df0136760e7 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 20 Apr 2024 23:59:43 -0700 Subject: [PATCH 098/111] =?UTF-8?q?=E2=9C=85=20Add=20additional=20unit=20t?= =?UTF-8?q?ests=20for=20types.h=20(#26994)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add more XYval (and similar) unit tests * Add Flags tests, with multiple BUGs identified --- Marlin/tests/core/test_types.cpp | 456 +++++++++++++++++++++++++++++++ 1 file changed, 456 insertions(+) diff --git a/Marlin/tests/core/test_types.cpp b/Marlin/tests/core/test_types.cpp index 11ed19f4c3b1..6e0472a7eb4a 100644 --- a/Marlin/tests/core/test_types.cpp +++ b/Marlin/tests/core/test_types.cpp @@ -39,6 +39,101 @@ MARLIN_TEST(types, XYval_non_const_as_bools) { TEST_ASSERT_FALSE(xy_false); } +MARLIN_TEST(types, XYval_reset) { + XYval xy = {1, 2}; + xy.reset(); + TEST_ASSERT_EQUAL(0, xy.x); + TEST_ASSERT_EQUAL(0, xy.y); +} + +MARLIN_TEST(types, XYval_set) { + XYval xy; + xy.set(3, 4); + TEST_ASSERT_EQUAL(3, xy.x); + TEST_ASSERT_EQUAL(4, xy.y); +} + +MARLIN_TEST(types, XYval_magnitude) { + XYval xy; + + xy.set(3, 4); + TEST_ASSERT_EQUAL(5, xy.magnitude()); + + xy.set(-3, -4); + TEST_ASSERT_EQUAL(5, xy.magnitude()); + + xy.set(-3, 4); + TEST_ASSERT_EQUAL(5, xy.magnitude()); + + xy.set(3, -4); + TEST_ASSERT_EQUAL(5, xy.magnitude()); +} + +MARLIN_TEST(types, XYval_small_large) { + XYval xy; + + xy.set(3, 4); + TEST_ASSERT_EQUAL(3, xy.small()); + TEST_ASSERT_EQUAL(4, xy.large()); + + xy.set(4, 3); + TEST_ASSERT_EQUAL(3, xy.small()); + TEST_ASSERT_EQUAL(4, xy.large()); + + // BUG?: Is this behavior actually correct? + // Does small mean "less than", or should it mean + // "closer to zero"? If the latter, then the following + // tests are incorrect. + xy.set(-3, -4); + TEST_ASSERT_EQUAL(-4, xy.small()); + TEST_ASSERT_EQUAL(-3, xy.large()); + + xy.set(-3, 2); + TEST_ASSERT_EQUAL(-3, xy.small()); + TEST_ASSERT_EQUAL(2, xy.large()); + + xy.set(2, -3); + TEST_ASSERT_EQUAL(-3, xy.small()); + TEST_ASSERT_EQUAL(2, xy.large()); +} + +MARLIN_TEST(types, XYval_operators) { + XYval xy1 = {2, 3}, xy2 = {6, 12}; + XYval xy3 = xy1 + xy2; + TEST_ASSERT_EQUAL(8, xy3.x); + TEST_ASSERT_EQUAL(15, xy3.y); + xy3 = xy1 - xy2; + TEST_ASSERT_EQUAL(-4, xy3.x); + TEST_ASSERT_EQUAL(-9, xy3.y); + xy3 = xy1 * xy2; + TEST_ASSERT_EQUAL(12, xy3.x); + TEST_ASSERT_EQUAL(36, xy3.y); + xy3 = xy2 / xy1; + TEST_ASSERT_EQUAL(3, xy3.x); + TEST_ASSERT_EQUAL(4, xy3.y); +} + +MARLIN_TEST(types, XYval_ABS) { + XYval xy = {-3, -4}; + XYval xy_abs = xy.ABS(); + TEST_ASSERT_EQUAL(3, xy_abs.x); + TEST_ASSERT_EQUAL(4, xy_abs.y); +} + +MARLIN_TEST(types, XYval_ROUNDL) { + XYval xy = {3.3f, 4.7f}; + auto xy_round = xy.ROUNDL(); + TEST_ASSERT_EQUAL(3, xy_round.x); + TEST_ASSERT_EQUAL(5, xy_round.y); +} + +MARLIN_TEST(types, XYval_reciprocal) { + XYval xy = {0.5f, 4.0f}; + XYval xy_reciprocal = xy.reciprocal(); + TEST_ASSERT_EQUAL_FLOAT(2.0f, xy_reciprocal.x); + TEST_ASSERT_EQUAL_FLOAT(0.25f, xy_reciprocal.y); +} + MARLIN_TEST(types, XYZval_const_as_bools) { const XYZval xyz_const_true = {1, 2, 3}; TEST_ASSERT_TRUE(xyz_const_true); @@ -55,6 +150,123 @@ MARLIN_TEST(types, XYZval_non_const_as_bools) { TEST_ASSERT_FALSE(xyz_false); } +MARLIN_TEST(types, XYZval_reset) { + XYZval xyz = {1, 2, 3}; + xyz.reset(); + TEST_ASSERT_EQUAL(0, xyz.x); + TEST_ASSERT_EQUAL(0, xyz.y); + TEST_ASSERT_EQUAL(0, xyz.z); +} + +MARLIN_TEST(types, XYZval_set) { + XYZval xyz; + xyz.set(3, 4, 5); + TEST_ASSERT_EQUAL(3, xyz.x); + TEST_ASSERT_EQUAL(4, xyz.y); + TEST_ASSERT_EQUAL(5, xyz.z); +} + +MARLIN_TEST(types, XYZval_magnitude) { + XYZval xyz; + + xyz.set(3.0f, 4.0f, 5.0f); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 7.071f, xyz.magnitude()); + + xyz.set(-3.0f, -4.0f, -5.0f); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 7.071f, xyz.magnitude()); + + xyz.set(-3.0f, 4.0f, 5.0f); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 7.071f, xyz.magnitude()); + + xyz.set(3.0f, -4.0f, 5.0f); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 7.071f, xyz.magnitude()); + + xyz.set(3.0f, 4.0f, -5.0f); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 7.071f, xyz.magnitude()); +} + +MARLIN_TEST(types, XYZval_small_large) { + XYZval xyz; + + xyz.set(3, 4, 5); + TEST_ASSERT_EQUAL(3, xyz.small()); + TEST_ASSERT_EQUAL(5, xyz.large()); + + xyz.set(5, 4, 3); + TEST_ASSERT_EQUAL(3, xyz.small()); + TEST_ASSERT_EQUAL(5, xyz.large()); + + xyz.set(4, 3, 5); + TEST_ASSERT_EQUAL(3, xyz.small()); + TEST_ASSERT_EQUAL(5, xyz.large()); + + xyz.set(3, 5, 4); + TEST_ASSERT_EQUAL(3, xyz.small()); + TEST_ASSERT_EQUAL(5, xyz.large()); + + // Test with negative numbers + xyz.set(-3, -4, -5); + TEST_ASSERT_EQUAL(-5, xyz.small()); + TEST_ASSERT_EQUAL(-3, xyz.large()); + + // Test with mixed negative/positive numbers + xyz.set(-3, 4, 5); + TEST_ASSERT_EQUAL(-3, xyz.small()); + TEST_ASSERT_EQUAL(5, xyz.large()); + + xyz.set(3, -4, 5); + TEST_ASSERT_EQUAL(-4, xyz.small()); + TEST_ASSERT_EQUAL(5, xyz.large()); + + xyz.set(3, 4, -5); + TEST_ASSERT_EQUAL(-5, xyz.small()); + TEST_ASSERT_EQUAL(4, xyz.large()); +} + +MARLIN_TEST(types, XYZval_operators) { + XYZval xyz1 = {2, 3, 4}, xyz2 = {6, 12, 24}; + XYZval xyz3 = xyz1 + xyz2; + TEST_ASSERT_EQUAL(8, xyz3.x); + TEST_ASSERT_EQUAL(15, xyz3.y); + TEST_ASSERT_EQUAL(28, xyz3.z); + xyz3 = xyz1 - xyz2; + TEST_ASSERT_EQUAL(-4, xyz3.x); + TEST_ASSERT_EQUAL(-9, xyz3.y); + TEST_ASSERT_EQUAL(-20, xyz3.z); + xyz3 = xyz1 * xyz2; + TEST_ASSERT_EQUAL(12, xyz3.x); + TEST_ASSERT_EQUAL(36, xyz3.y); + TEST_ASSERT_EQUAL(96, xyz3.z); + xyz3 = xyz2 / xyz1; + TEST_ASSERT_EQUAL(3, xyz3.x); + TEST_ASSERT_EQUAL(4, xyz3.y); + TEST_ASSERT_EQUAL(6, xyz3.z); +} + +MARLIN_TEST(types, XYZval_ABS) { + XYZval xyz = {-3, -4, -5}; + XYZval xyz_abs = xyz.ABS(); + TEST_ASSERT_EQUAL(3, xyz_abs.x); + TEST_ASSERT_EQUAL(4, xyz_abs.y); + TEST_ASSERT_EQUAL(5, xyz_abs.z); +} + +MARLIN_TEST(types, XYZval_ROUNDL) { + XYZval xyz = {3.3f, 4.7f, 5.5f}; + XYZval xyz_round = xyz.ROUNDL(); + TEST_ASSERT_EQUAL(3, xyz_round.x); + TEST_ASSERT_EQUAL(5, xyz_round.y); + TEST_ASSERT_EQUAL(6, xyz_round.z); +} + +MARLIN_TEST(types, XYZval_reciprocal) { + XYZval xyz = {0.5f, 2.0f, 0.33333f}; + XYZval xyz_reciprocal = xyz.reciprocal(); + TEST_ASSERT_EQUAL_FLOAT(2.0f, xyz_reciprocal.x); + TEST_ASSERT_EQUAL_FLOAT(0.5f, xyz_reciprocal.y); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 3.0f, xyz_reciprocal.z); +} + MARLIN_TEST(types, XYZEval_const_as_bools) { const XYZEval xyze_const_true = {1, 2, 3, 4}; TEST_ASSERT_TRUE(xyze_const_true); @@ -71,6 +283,137 @@ MARLIN_TEST(types, XYZEval_non_const_as_bools) { TEST_ASSERT_FALSE(xyze_false); } +MARLIN_TEST(types, XYZEval_reset) { + XYZEval xyze = {1, 2, 3, 4}; + xyze.reset(); + TEST_ASSERT_EQUAL(0, xyze.x); + TEST_ASSERT_EQUAL(0, xyze.y); + TEST_ASSERT_EQUAL(0, xyze.z); + TEST_ASSERT_EQUAL(0, xyze.e); +} + +MARLIN_TEST(types, XYZEval_set) { + XYZEval xyze; + xyze.set(3, 4, 5, 6); + TEST_ASSERT_EQUAL(3, xyze.x); + TEST_ASSERT_EQUAL(4, xyze.y); + TEST_ASSERT_EQUAL(5, xyze.z); + TEST_ASSERT_EQUAL(6, xyze.e); +} + +MARLIN_TEST(types, XYZEval_magnitude) { + XYZEval xyze; + + xyze.set(3.0f, 4.0f, 5.0f, 6.0f); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 9.274f, xyze.magnitude()); + + xyze.set(-3.0f, -4.0f, -5.0f, -6.0f); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 9.274f, xyze.magnitude()); + + xyze.set(-3.0f, 4.0f, 5.0f, 6.0f); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 9.274f, xyze.magnitude()); + + xyze.set(3.0f, -4.0f, 5.0f, 6.0f); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 9.274f, xyze.magnitude()); + + xyze.set(3.0f, 4.0f, -5.0f, 6.0f); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 9.274f, xyze.magnitude()); + + xyze.set(3.0f, 4.0f, 5.0f, -6.0f); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 9.274f, xyze.magnitude()); +} + +MARLIN_TEST(types, XYZEval_small_large) { + XYZEval xyze; + + xyze.set(3, 4, 5, 6); + TEST_ASSERT_EQUAL(3, xyze.small()); + TEST_ASSERT_EQUAL(6, xyze.large()); + + xyze.set(6, 5, 4, 3); + TEST_ASSERT_EQUAL(3, xyze.small()); + TEST_ASSERT_EQUAL(6, xyze.large()); + + xyze.set(4, 3, 6, 5); + TEST_ASSERT_EQUAL(3, xyze.small()); + TEST_ASSERT_EQUAL(6, xyze.large()); + + xyze.set(3, 6, 5, 4); + TEST_ASSERT_EQUAL(3, xyze.small()); + TEST_ASSERT_EQUAL(6, xyze.large()); + + xyze.set(-3, -4, -5, -6); + TEST_ASSERT_EQUAL(-6, xyze.small()); + TEST_ASSERT_EQUAL(-3, xyze.large()); + + xyze.set(-3, 4, 5, 6); + TEST_ASSERT_EQUAL(-3, xyze.small()); + TEST_ASSERT_EQUAL(6, xyze.large()); + + xyze.set(3, -4, 5, 6); + TEST_ASSERT_EQUAL(-4, xyze.small()); + TEST_ASSERT_EQUAL(6, xyze.large()); + + xyze.set(3, 4, -5, 6); + TEST_ASSERT_EQUAL(-5, xyze.small()); + TEST_ASSERT_EQUAL(6, xyze.large()); + + xyze.set(3, 4, 5, -6); + TEST_ASSERT_EQUAL(-6, xyze.small()); + TEST_ASSERT_EQUAL(5, xyze.large()); +} + +MARLIN_TEST(types, XYZEval_operators) { + XYZEval xyze1 = {2, 3, 4, 5}, xyze2 = {6, 12, 24, 48}; + XYZEval xyze3 = xyze1 + xyze2; + TEST_ASSERT_EQUAL(8, xyze3.x); + TEST_ASSERT_EQUAL(15, xyze3.y); + TEST_ASSERT_EQUAL(28, xyze3.z); + TEST_ASSERT_EQUAL(53, xyze3.e); + xyze3 = xyze1 - xyze2; + TEST_ASSERT_EQUAL(-4, xyze3.x); + TEST_ASSERT_EQUAL(-9, xyze3.y); + TEST_ASSERT_EQUAL(-20, xyze3.z); + TEST_ASSERT_EQUAL(-43, xyze3.e); + xyze3 = xyze1 * xyze2; + TEST_ASSERT_EQUAL(12, xyze3.x); + TEST_ASSERT_EQUAL(36, xyze3.y); + TEST_ASSERT_EQUAL(96, xyze3.z); + TEST_ASSERT_EQUAL(240, xyze3.e); + xyze3 = xyze2 / xyze1; + TEST_ASSERT_EQUAL(3, xyze3.x); + TEST_ASSERT_EQUAL(4, xyze3.y); + TEST_ASSERT_EQUAL(6, xyze3.z); + TEST_ASSERT_EQUAL(9, xyze3.e); +} + +MARLIN_TEST(types, XYZEval_ABS) { + XYZEval xyze = {-3, -4, -5, -6}; + XYZEval xyze_abs = xyze.ABS(); + TEST_ASSERT_EQUAL(3, xyze_abs.x); + TEST_ASSERT_EQUAL(4, xyze_abs.y); + TEST_ASSERT_EQUAL(5, xyze_abs.z); + TEST_ASSERT_EQUAL(6, xyze_abs.e); +} + +MARLIN_TEST(types, XYZEval_ROUNDL) { + XYZEval xyze = {3.3f, 4.7f, 5.5f, 6.6f}; + XYZEval xyze_round = xyze.ROUNDL(); + TEST_ASSERT_EQUAL(3, xyze_round.x); + TEST_ASSERT_EQUAL(5, xyze_round.y); + TEST_ASSERT_EQUAL(6, xyze_round.z); + TEST_ASSERT_EQUAL(7, xyze_round.e); +} + +MARLIN_TEST(types, XYZEval_reciprocal) { + XYZEval xyze = {0.5f, 2.0f, 0.33333f, 0.25f}; + XYZEval xyze_reciprocal = xyze.reciprocal(); + TEST_ASSERT_EQUAL_FLOAT(2.0f, xyze_reciprocal.x); + TEST_ASSERT_EQUAL_FLOAT(0.5f, xyze_reciprocal.y); + TEST_ASSERT_FLOAT_WITHIN(0.001f, 3.0f, xyze_reciprocal.z); + TEST_ASSERT_EQUAL_FLOAT(4.0f, xyze_reciprocal.e); +} + MARLIN_TEST(types, Flags_const_as_bools) { const Flags<32> flags_const_false = {0}; TEST_ASSERT_FALSE(flags_const_false); @@ -87,6 +430,119 @@ MARLIN_TEST(types, Flags_non_const_as_bools) { TEST_ASSERT_TRUE(flags_true); } +MARLIN_TEST(types, Flags_1) { + Flags<1> flags; + + flags.set(0, true); + TEST_ASSERT_EQUAL(1, flags.b); + + flags.reset(); + TEST_ASSERT_EQUAL(0, flags.b); + + flags.set(0, true); + flags.clear(0); + TEST_ASSERT_EQUAL(0, flags.b); + + TEST_ASSERT_EQUAL(false, flags.test(0)); + flags.set(0, true); + TEST_ASSERT_EQUAL(true, flags.test(0)); + + TEST_ASSERT_EQUAL(true, flags[0]); + flags.clear(0); + TEST_ASSERT_EQUAL(false, flags[0]); + + TEST_ASSERT_EQUAL(1, flags.size()); +} + +MARLIN_TEST(types, Flags_8) { + Flags<8> flags; + + flags.reset(); + TEST_ASSERT_EQUAL(0, flags.b); + + flags.set(3, true); + TEST_ASSERT_EQUAL(8, flags.b); + + flags.clear(3); + TEST_ASSERT_EQUAL(0, flags.b); + + flags.set(3, true); + TEST_ASSERT_EQUAL(true, flags.test(3)); + TEST_ASSERT_EQUAL(false, flags.test(2)); + + TEST_ASSERT_EQUAL(true, flags[3]); + TEST_ASSERT_EQUAL(false, flags[2]); + + TEST_ASSERT_EQUAL(1, flags.size()); +} + +MARLIN_TEST(types, Flags_16) { + Flags<16> flags; + + flags.reset(); + TEST_ASSERT_EQUAL(0, flags.b); + + flags.set(0, true); + flags.set(15, true); + // BUG: The storage can only contain 8 bits! + // TEST_ASSERT_EQUAL(32769, flags.b); + TEST_ASSERT_EQUAL(1, flags.b); + + flags.clear(0); + TEST_ASSERT_EQUAL(0, flags.b); + + flags.reset(); + flags.set(7, true); + flags.set(15, true); + TEST_ASSERT_EQUAL(true, flags.test(7)); + // BUG: This can't store a value above bit 7 right now + TEST_ASSERT_EQUAL(false, flags.test(15)); + + TEST_ASSERT_EQUAL(true, flags[7]); + // BUG: This can't store a value above bit 7 right now + TEST_ASSERT_EQUAL(false, flags[15]); + + // BUG: This size should be 2, but is incorrectly 1 + TEST_ASSERT_EQUAL(1, flags.size()); +} + +MARLIN_TEST(types, Flags_32) { + Flags<32> flags; + + flags.reset(); + TEST_ASSERT_EQUAL(0, flags.b); + + flags.set(0, true); + flags.set(31, true); + // BUG: The storage can only contain 8 bits! + //TEST_ASSERT_EQUAL(2147483649, flags.b); + TEST_ASSERT_EQUAL(1, flags.b); + + flags.clear(0); + flags.clear(31); + TEST_ASSERT_EQUAL(0, flags.b); + + flags.set(0, true); + flags.set(31, true); + TEST_ASSERT_EQUAL(true, flags.test(0)); + // BUG: This can't store a value above bit 7 right now + TEST_ASSERT_EQUAL(false, flags.test(31)); + // TEST_ASSERT_EQUAL(true, flags.test(31)); + TEST_ASSERT_EQUAL(false, flags.test(1)); + TEST_ASSERT_EQUAL(false, flags.test(30)); + + TEST_ASSERT_EQUAL(true, flags[0]); + // BUG: This can't store a value above bit 7 right now + TEST_ASSERT_EQUAL(false, flags[31]); + // TEST_ASSERT_EQUAL(true, flags[31]); + TEST_ASSERT_EQUAL(false, flags[1]); + TEST_ASSERT_EQUAL(false, flags[30]); + + // BUG: This size should be 4, but is incorrectly 1 + TEST_ASSERT_EQUAL(1, flags.size()); + // TEST_ASSERT_EQUAL(4, flags.size()); +} + MARLIN_TEST(types, AxisFlags_const_as_bools) { const AxisFlags axis_flags_const_false = {0}; TEST_ASSERT_FALSE(axis_flags_const_false); From d773570cd66997d56c1470bc4724aacbc848f3d8 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 21 Apr 2024 00:24:57 -0700 Subject: [PATCH 099/111] =?UTF-8?q?=F0=9F=90=9B=20Fix=20Flags=20data=20?= =?UTF-8?q?storage=20width=20(#26995)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix Flags and associated unit tests --- Marlin/src/core/types.h | 2 +- Marlin/tests/core/test_types.cpp | 39 ++++++++++++-------------------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index 44805e130a56..85fd517b68d8 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -159,7 +159,7 @@ template struct IF { typedef L type; }; // General Flags for some number of states template struct Flags { - typedef uvalue_t(N) flagbits_t; + typedef bits_t(N) flagbits_t; typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1; } N8; typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1, b8:1, b9:1, b10:1, b11:1, b12:1, b13:1, b14:1, b15:1; } N16; typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1, b8:1, b9:1, b10:1, b11:1, b12:1, b13:1, b14:1, b15:1, diff --git a/Marlin/tests/core/test_types.cpp b/Marlin/tests/core/test_types.cpp index 6e0472a7eb4a..865d35de158c 100644 --- a/Marlin/tests/core/test_types.cpp +++ b/Marlin/tests/core/test_types.cpp @@ -71,7 +71,7 @@ MARLIN_TEST(types, XYval_magnitude) { MARLIN_TEST(types, XYval_small_large) { XYval xy; - + xy.set(3, 4); TEST_ASSERT_EQUAL(3, xy.small()); TEST_ASSERT_EQUAL(4, xy.large()); @@ -187,7 +187,7 @@ MARLIN_TEST(types, XYZval_magnitude) { MARLIN_TEST(types, XYZval_small_large) { XYZval xyz; - + xyz.set(3, 4, 5); TEST_ASSERT_EQUAL(3, xyz.small()); TEST_ASSERT_EQUAL(5, xyz.large()); @@ -325,7 +325,7 @@ MARLIN_TEST(types, XYZEval_magnitude) { MARLIN_TEST(types, XYZEval_small_large) { XYZEval xyze; - + xyze.set(3, 4, 5, 6); TEST_ASSERT_EQUAL(3, xyze.small()); TEST_ASSERT_EQUAL(6, xyze.large()); @@ -484,26 +484,23 @@ MARLIN_TEST(types, Flags_16) { flags.set(0, true); flags.set(15, true); - // BUG: The storage can only contain 8 bits! - // TEST_ASSERT_EQUAL(32769, flags.b); - TEST_ASSERT_EQUAL(1, flags.b); + TEST_ASSERT_EQUAL(32769, flags.b); flags.clear(0); - TEST_ASSERT_EQUAL(0, flags.b); + TEST_ASSERT_EQUAL(32768, flags.b); flags.reset(); flags.set(7, true); flags.set(15, true); TEST_ASSERT_EQUAL(true, flags.test(7)); - // BUG: This can't store a value above bit 7 right now - TEST_ASSERT_EQUAL(false, flags.test(15)); + TEST_ASSERT_EQUAL(false, flags.test(8)); + TEST_ASSERT_EQUAL(true, flags.test(15)); TEST_ASSERT_EQUAL(true, flags[7]); - // BUG: This can't store a value above bit 7 right now - TEST_ASSERT_EQUAL(false, flags[15]); + TEST_ASSERT_EQUAL(false, flags[8]); + TEST_ASSERT_EQUAL(true, flags[15]); - // BUG: This size should be 2, but is incorrectly 1 - TEST_ASSERT_EQUAL(1, flags.size()); + TEST_ASSERT_EQUAL(2, flags.size()); } MARLIN_TEST(types, Flags_32) { @@ -514,9 +511,7 @@ MARLIN_TEST(types, Flags_32) { flags.set(0, true); flags.set(31, true); - // BUG: The storage can only contain 8 bits! - //TEST_ASSERT_EQUAL(2147483649, flags.b); - TEST_ASSERT_EQUAL(1, flags.b); + TEST_ASSERT_EQUAL(2147483649, flags.b); flags.clear(0); flags.clear(31); @@ -525,22 +520,16 @@ MARLIN_TEST(types, Flags_32) { flags.set(0, true); flags.set(31, true); TEST_ASSERT_EQUAL(true, flags.test(0)); - // BUG: This can't store a value above bit 7 right now - TEST_ASSERT_EQUAL(false, flags.test(31)); - // TEST_ASSERT_EQUAL(true, flags.test(31)); + TEST_ASSERT_EQUAL(true, flags.test(31)); TEST_ASSERT_EQUAL(false, flags.test(1)); TEST_ASSERT_EQUAL(false, flags.test(30)); TEST_ASSERT_EQUAL(true, flags[0]); - // BUG: This can't store a value above bit 7 right now - TEST_ASSERT_EQUAL(false, flags[31]); - // TEST_ASSERT_EQUAL(true, flags[31]); + TEST_ASSERT_EQUAL(true, flags[31]); TEST_ASSERT_EQUAL(false, flags[1]); TEST_ASSERT_EQUAL(false, flags[30]); - // BUG: This size should be 4, but is incorrectly 1 - TEST_ASSERT_EQUAL(1, flags.size()); - // TEST_ASSERT_EQUAL(4, flags.size()); + TEST_ASSERT_EQUAL(4, flags.size()); } MARLIN_TEST(types, AxisFlags_const_as_bools) { From 31683ce35b7fd5749da71a6d9b687ad2b7188504 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 22 Apr 2024 00:22:27 +0000 Subject: [PATCH 100/111] [cron] Bump distribution date (2024-04-22) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index dda34bce9bf0..43a95662287b 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 "2024-04-21" +//#define STRING_DISTRIBUTION_DATE "2024-04-22" /** * 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 8a34e75115bb..554ebb394622 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 "2024-04-21" + #define STRING_DISTRIBUTION_DATE "2024-04-22" #endif /** From a955e06259fec45d724ebf6b503c5022bf044130 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 22 Apr 2024 18:58:53 -0500 Subject: [PATCH 101/111] =?UTF-8?q?=F0=9F=8E=A8=20Clean=20up=20after=20rec?= =?UTF-8?q?ent=20PRs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/HC32/MarlinSerial.h | 4 ++-- Marlin/src/HAL/HC32/app_config.h | 4 ++-- Marlin/src/HAL/HC32/inc/SanityCheck.h | 2 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 4 ++-- Marlin/tests/core/test_macros.cpp | 2 +- ini/hc32.ini | 2 +- ini/native.ini | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Marlin/src/HAL/HC32/MarlinSerial.h b/Marlin/src/HAL/HC32/MarlinSerial.h index b63b069b9dd5..bb4630eb1d52 100644 --- a/Marlin/src/HAL/HC32/MarlinSerial.h +++ b/Marlin/src/HAL/HC32/MarlinSerial.h @@ -31,8 +31,8 @@ struct MarlinSerial : public Usart { MarlinSerial( - struct usart_config_t *usart_device, - gpio_pin_t tx_pin, + struct usart_config_t *usart_device, + gpio_pin_t tx_pin, gpio_pin_t rx_pin #if ENABLED(SERIAL_DMA) , M4_DMA_TypeDef *dma_unit = nullptr, diff --git a/Marlin/src/HAL/HC32/app_config.h b/Marlin/src/HAL/HC32/app_config.h index bc9d14b4c6b8..69d7f60646e9 100644 --- a/Marlin/src/HAL/HC32/app_config.h +++ b/Marlin/src/HAL/HC32/app_config.h @@ -1,6 +1,6 @@ /** * app_config.h is included by the hc32f460 arduino build script for every source file. - * it is used to configure the arduino core (and ddl) automatically according + * it is used to configure the arduino core (and ddl) automatically according * to the settings in Configuration.h and Configuration_adv.h. */ #pragma once @@ -44,7 +44,7 @@ #define DISABLE_SERIAL_GLOBALS 1 // increase the size of the Usart buffers (both RX and TX) -// NOTE: +// NOTE: // the heap usage will increase by (SERIAL_BUFFER_SIZE - 64) * "number of serial ports used" // if running out of heap, the system may become unstable //#define SERIAL_BUFFER_SIZE 256 diff --git a/Marlin/src/HAL/HC32/inc/SanityCheck.h b/Marlin/src/HAL/HC32/inc/SanityCheck.h index 0d05448f9815..6b12e4d04718 100644 --- a/Marlin/src/HAL/HC32/inc/SanityCheck.h +++ b/Marlin/src/HAL/HC32/inc/SanityCheck.h @@ -30,7 +30,7 @@ #endif #if ARDUINO_CORE_VERSION_INT < GET_VERSION_INT(1, 1, 0) - // because we use app_config.h introduced in arduino core version 1.1.0, the + // because we use app_config.h introduced in arduino core version 1.1.0, the // HAL is not compatible with older versions #error "The HC32 HAL is not compatible with Arduino Core versions < 1.1.0. Consider updating the Arduino Core." #endif diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 06a234d04d09..1bc55630af38 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -377,10 +377,10 @@ void MarlinUI::draw_kill_screen() { void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop #if HAS_DISPLAY_SLEEP - void MarlinUI::sleep_display(const bool sleep/*=true*/) { + void MarlinUI::sleep_display(const bool sleep/*=true*/) { static bool asleep = false; if (asleep != sleep){ - sleep ? u8g.sleepOn() : u8g.sleepOff(); + sleep ? u8g.sleepOn() : u8g.sleepOff(); asleep = sleep; } } diff --git a/Marlin/tests/core/test_macros.cpp b/Marlin/tests/core/test_macros.cpp index 235334292839..bb269dec2b40 100644 --- a/Marlin/tests/core/test_macros.cpp +++ b/Marlin/tests/core/test_macros.cpp @@ -557,7 +557,7 @@ MARLIN_TEST(macros_options, OPTITEM) { MARLIN_TEST(macros_options, OPTARG) { int enabledArgs[] = {0 OPTARG(OPTION_ENABLED, 1, 2)}; int disabledArgs[] = {0 OPTARG(OPTION_DISABLED, 1, 2)}; - + int sumEnabledArgs = 0; for (const auto& arg : enabledArgs) { sumEnabledArgs += arg; diff --git a/ini/hc32.ini b/ini/hc32.ini index 2af761128cae..c9533bad17a0 100644 --- a/ini/hc32.ini +++ b/ini/hc32.ini @@ -34,7 +34,7 @@ build_type = release build_flags = -D ARDUINO_ARCH_HC32 -D PLATFORM_M997_SUPPORT # Enable M997 command - # note: ddl and arduino debug mode are + # note: ddl and arduino debug mode are # automatically enabled with MARLIN_DEV_MODE #-D __DEBUG # force DDL debug mode #-D __CORE_DEBUG # force Arduino core debug mode diff --git a/ini/native.ini b/ini/native.ini index 9df621172d1b..bbb6724dae14 100644 --- a/ini/native.ini +++ b/ini/native.ini @@ -32,7 +32,7 @@ extra_scripts = ${common.extra_scripts} build_src_filter = ${env:linux_native.build_src_filter} + lib_deps = throwtheswitch/Unity@^2.5.2 test_build_src = true -build_unflags = +build_unflags = build_flags = ${env:linux_native.build_flags} -Werror # From 91ae676b9bbfb45941758e8d837818db59d97bcd Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 23 Apr 2024 00:21:36 +0000 Subject: [PATCH 102/111] [cron] Bump distribution date (2024-04-23) --- 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 43a95662287b..c5e6e7624e43 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 "2024-04-22" +//#define STRING_DISTRIBUTION_DATE "2024-04-23" /** * 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 554ebb394622..7a5e5516c698 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 "2024-04-22" + #define STRING_DISTRIBUTION_DATE "2024-04-23" #endif /** From 247e989377fe7e4a81e5307c1ffdf7e9930c0855 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 22 Apr 2024 19:10:35 -0700 Subject: [PATCH 103/111] =?UTF-8?q?=E2=9C=85=20=20CI=20-=20Validate=20Pins?= =?UTF-8?q?=20Formatting=20(#26996)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-validate-pins.yml | 51 +++++++ Makefile | 12 +- buildroot/share/git/mfhelp | 2 +- buildroot/share/scripts/pinsformat.js | 197 ------------------------- buildroot/share/scripts/pinsformat.py | 24 ++- 5 files changed, 78 insertions(+), 208 deletions(-) create mode 100644 .github/workflows/ci-validate-pins.yml delete mode 100755 buildroot/share/scripts/pinsformat.js diff --git a/.github/workflows/ci-validate-pins.yml b/.github/workflows/ci-validate-pins.yml new file mode 100644 index 000000000000..e093eb92c7b9 --- /dev/null +++ b/.github/workflows/ci-validate-pins.yml @@ -0,0 +1,51 @@ +# +# ci-validate-pins.yml +# Validate that all of the pins files are unchanged by pinsformat.py +# + +name: CI - Validate Pins Files + +on: + pull_request: + branches: + - bugfix-2.1.x + # Cannot be enabled on 2.1.x until it contains the unit test framework + #- 2.1.x + paths: + - 'Marlin/src/pins/*/**' + push: + branches: + - bugfix-2.1.x + # Cannot be enabled on 2.1.x until it contains the unit test framework + #- 2.1.x + paths: + - 'Marlin/src/pins/*/**' + +jobs: + validate_pins_files: + name: Validate Pins Files + if: github.repository == 'MarlinFirmware/Marlin' + + runs-on: ubuntu-latest + + steps: + - name: Check out the PR + uses: actions/checkout@v4 + + - name: Cache pip + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Select Python 3.9 + uses: actions/setup-python@v5 + with: + python-version: '3.9' + architecture: 'x64' + + - name: Validate all pins files + run: | + make validate-pins -j diff --git a/Makefile b/Makefile index db4eeba378bd..ce925a58438c 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,8 @@ UNIT_TEST_CONFIG ?= default help: @echo "Tasks for local development:" @echo "make marlin : Build marlin for the configured board" - @echo "make format-pins : Reformat all pins files" + @echo "make format-pins -j : Reformat all pins files (-j for parallel execution)" + @echo "make validate-pins -j : Validate all pins files, fails if any require reformatting" @echo "make tests-single-ci : Run a single test from inside the CI" @echo "make tests-single-local : Run a single test locally" @echo "make tests-single-local-docker : Run a single test locally, using docker" @@ -81,7 +82,14 @@ setup-local-docker: PINS := $(shell find Marlin/src/pins -mindepth 2 -name '*.h') +.PHONY: $(PINS) format-pins validate-pins + $(PINS): %: - @echo "Formatting $@" && node $(SCRIPTS_DIR)/pinsformat.js $@ + @echo "Formatting $@" + @python $(SCRIPTS_DIR)/pinsformat.py $< $@ format-pins: $(PINS) + +validate-pins: format-pins + @echo "Validating pins files" + @git diff --exit-code || (git status && echo "\nError: Pins files are not formatted correctly. Run \"make format-pins\" to fix.\n" && exit 1) diff --git a/buildroot/share/git/mfhelp b/buildroot/share/git/mfhelp index 46a0ebfc5333..aff34b866f6b 100755 --- a/buildroot/share/git/mfhelp +++ b/buildroot/share/git/mfhelp @@ -41,6 +41,6 @@ Modify Configuration.h / Configuration_adv.h: Modify pins files: pins_set ............. Set the value of a pin in a pins file - pinsformat.js ........ Node.js script to format pins files + pinsformat.py ........ Python script to format pins files THIS diff --git a/buildroot/share/scripts/pinsformat.js b/buildroot/share/scripts/pinsformat.js deleted file mode 100755 index 16e9dcb88f08..000000000000 --- a/buildroot/share/scripts/pinsformat.js +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env node - -// -// Formatter script for pins_MYPINS.h files -// -// Usage: mffmt [infile] [outfile] -// -// With no parameters convert STDIN to STDOUT -// - -const fs = require("fs"); - -var do_log = false -function logmsg(msg, line='') { - if (do_log) console.log(msg, line); -} - -// String lpad / rpad -String.prototype.lpad = function(len, chr) { - if (!len) return this; - if (chr === undefined) chr = ' '; - var s = this+'', need = len - s.length; - if (need > 0) s = new Array(need+1).join(chr) + s; - return s; -}; - -String.prototype.rpad = function(len, chr) { - if (!len) return this; - if (chr === undefined) chr = ' '; - var s = this+'', need = len - s.length; - if (need > 0) s += new Array(need+1).join(chr); - return s; -}; - -// Concatenate a string, adding a space if necessary -// to avoid merging two words -String.prototype.concat_with_space = function(str) { - const c = this.substr(-1), d = str.charAt(0); - if (c !== ' ' && c !== '' && d !== ' ' && d !== '') - str = ' ' + str; - return this + str; -}; - -const mpatt = [ '-?\\d{1,3}', 'P[A-I]\\d+', 'P\\d_\\d+', 'Pin[A-Z]\\d\\b' ], - definePatt = new RegExp(`^\\s*(//)?#define\\s+[A-Z_][A-Z0-9_]+\\s+(${mpatt.join('|')})\\s*(//.*)?$`, 'gm'), - ppad = [ 3, 4, 5, 5 ], - col_comment = 50, - col_value_rj = col_comment - 3; - -var mexpr = []; -for (let m of mpatt) mexpr.push(new RegExp('^' + m + '$')); - -const argv = process.argv.slice(2), argc = argv.length; - -var src_file = 0, dst_file; -if (argc > 0) { - let ind = 0; - if (argv[0] == '-v') { do_log = true; ind++; } - dst_file = src_file = argv[ind++]; - if (ind < argc) dst_file = argv[ind]; -} - -// Read from file or STDIN until it terminates -const filtered = process_text(fs.readFileSync(src_file).toString()); -if (dst_file) - fs.writeFileSync(dst_file, filtered); -else - console.log(filtered); - -// Find the pin pattern so non-pin defines can be skipped -function get_pin_pattern(txt) { - var r, m = 0, match_count = [ 0, 0, 0, 0 ]; - var max_match_count = 0, max_match_index = -1; - definePatt.lastIndex = 0; - while ((r = definePatt.exec(txt)) !== null) { - let ind = -1; - if (mexpr.some((p) => { - ind++; - const didmatch = r[2].match(p); - return r[2].match(p); - }) ) { - const m = ++match_count[ind]; - if (m > max_match_count) { - max_match_count = m; - max_match_index = ind; - } - } - } - if (max_match_index === -1) return null; - - return { match:mpatt[max_match_index], pad:ppad[max_match_index] }; -} - -function process_text(txt) { - if (!txt.length) return '(no text)'; - const patt = get_pin_pattern(txt); - if (!patt) return txt; - const pindefPatt = new RegExp(`^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+(${patt.match})\\s*(//.*)?$`), - noPinPatt = new RegExp(`^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+(-1)\\s*(//.*)?$`), - skipPatt1 = new RegExp('^(\\s*(//)?#define)\\s+(AT90USB|USBCON|(BOARD|DAC|FLASH|HAS|IS|USE)_.+|.+_(ADDRESS|AVAILABLE|BAUDRATE|CLOCK|CONNECTION|DEFAULT|ERROR|EXTRUDERS|FREQ|ITEM|MKS_BASE_VERSION|MODULE|NAME|ONLY|ORIENTATION|PERIOD|RANGE|RATE|READ_RETRIES|SERIAL|SIZE|SPI|STATE|STEP|TIMER|VERSION))\\s+(.+)\\s*(//.*)?$'), - skipPatt2 = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+(0x[0-9A-Fa-f]+|\d+|.+[a-z].+)\\s*(//.*)?$'), - skipPatt3 = /^\s*#e(lse|ndif)\b.*$/, - aliasPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+([A-Z_][A-Z0-9_()]+)\\s*(//.*)?$'), - switchPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s*(//.*)?$'), - undefPatt = new RegExp('^(\\s*(//)?#undef)\\s+([A-Z_][A-Z0-9_]+)\\s*(//.*)?$'), - defPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+([-_\\w]+)\\s*(//.*)?$'), - condPatt = new RegExp('^(\\s*(//)?#(if|ifn?def|elif)(\\s+\\S+)*)\\s+(//.*)$'), - commPatt = new RegExp('^\\s{20,}(//.*)?$'); - const col_value_lj = col_comment - patt.pad - 2; - var r, out = '', check_comment_next = false; - txt.split('\n').forEach((line) => { - if (check_comment_next) - check_comment_next = ((r = commPatt.exec(line)) !== null); - - if (check_comment_next) - // Comments in column 45 - line = ''.rpad(col_comment) + r[1]; - - else if (skipPatt1.exec(line) !== null) { - // - // #define SKIP_ME - // - logmsg("skip:", line); - } - else if ((r = pindefPatt.exec(line)) !== null) { - // - // #define MY_PIN [pin] - // - logmsg("pin:", line); - const pinnum = r[4].charAt(0) == 'P' ? r[4] : r[4].lpad(patt.pad); - line = r[1] + ' ' + r[3]; - line = line.rpad(col_value_lj).concat_with_space(pinnum); - if (r[5]) line = line.rpad(col_comment).concat_with_space(r[5]); - } - else if ((r = noPinPatt.exec(line)) !== null) { - // - // #define MY_PIN -1 - // - logmsg("pin -1:", line); - line = r[1] + ' ' + r[3]; - line = line.rpad(col_value_lj).concat_with_space('-1'); - if (r[5]) line = line.rpad(col_comment).concat_with_space(r[5]); - } - else if (skipPatt2.exec(line) !== null || skipPatt3.exec(line) !== null) { - // - // #define SKIP_ME - // #else, #endif - // - logmsg("skip:", line); - } - else if ((r = aliasPatt.exec(line)) !== null) { - // - // #define ALIAS OTHER - // - logmsg("alias:", line); - line = r[1] + ' ' + r[3]; - line = line.concat_with_space(r[4].lpad(col_value_rj + 1 - line.length)); - if (r[5]) line = line.rpad(col_comment).concat_with_space(r[5]); - } - else if ((r = switchPatt.exec(line)) !== null) { - // - // #define SWITCH - // - logmsg("switch:", line); - line = r[1] + ' ' + r[3]; - if (r[4]) line = line.rpad(col_comment).concat_with_space(r[4]); - check_comment_next = true; - } - else if ((r = defPatt.exec(line)) !== null) { - // - // #define ... - // - logmsg("def:", line); - line = r[1] + ' ' + r[3] + ' '; - line = line.concat_with_space(r[4].lpad(col_value_rj + 1 - line.length)); - if (r[5]) line = line.rpad(col_comment - 1) + ' ' + r[5]; - } - else if ((r = undefPatt.exec(line)) !== null) { - // - // #undef ... - // - logmsg("undef:", line); - line = r[1] + ' ' + r[3]; - if (r[4]) line = line.rpad(col_comment).concat_with_space(r[4]); - } - else if ((r = condPatt.exec(line)) !== null) { - // - // #if, #ifdef, #ifndef, #elif ... - // - logmsg("cond:", line); - line = r[1].rpad(col_comment).concat_with_space(r[5]); - check_comment_next = true; - } - out += line + '\n'; - }); - return out.replace(/\n\n+/g, '\n\n').replace(/\n\n$/g, '\n'); -} diff --git a/buildroot/share/scripts/pinsformat.py b/buildroot/share/scripts/pinsformat.py index b49ae4931d09..e4bd69d855f6 100755 --- a/buildroot/share/scripts/pinsformat.py +++ b/buildroot/share/scripts/pinsformat.py @@ -27,6 +27,13 @@ def rpad(astr, fill, c=' '): need = fill - len(astr) return astr if need <= 0 else astr + (need * c) +# Concatenate a string, adding a space if necessary +# to avoid merging two words +def concat_with_space(s1, s2): + if not s1.endswith(' ') and not s2.startswith(' '): + s1 += ' ' + return s1 + s2 + # Pin patterns mpatt = [ r'-?\d{1,3}', r'P[A-I]\d+', r'P\d_\d+', r'Pin[A-Z]\d\b' ] mstr = '|'.join(mpatt) @@ -45,6 +52,7 @@ def format_pins(argv): scnt = 0 for arg in argv: if arg == '-v': + global do_log do_log = True elif scnt == 0: # Get a source file if specified. Default destination is the same file @@ -135,7 +143,7 @@ def tryPindef(d): logmsg("pin:", line) pinnum = r[4] if r[4][0] == 'P' else lpad(r[4], patt['pad']) line = f'{r[1]} {r[3]}' - line = rpad(line, col_value_lj) + pinnum + line = concat_with_space(rpad(line, col_value_lj), pinnum) if r[5]: line = rpad(line, col_comment) + r[5] d['line'] = line return True @@ -149,7 +157,7 @@ def tryNoPin(d): if r == None: return False logmsg("pin -1:", line) line = f'{r[1]} {r[3]}' - line = rpad(line, col_value_lj) + '-1' + line = concat_with_space(rpad(line, col_value_lj), '-1') if r[5]: line = rpad(line, col_comment) + r[5] d['line'] = line return True @@ -179,8 +187,8 @@ def tryAlias(d): if r == None: return False logmsg("alias:", line) line = f'{r[1]} {r[3]}' - line += lpad(r[4], col_value_rj + 1 - len(line)) - if r[5]: line = rpad(line, col_comment) + r[5] + line = concat_with_space(line, lpad(r[4], col_value_rj + 1 - len(line))) + if r[5]: line = concat_with_space(rpad(line, col_comment), r[5]) d['line'] = line return True @@ -193,7 +201,7 @@ def trySwitch(d): if r == None: return False logmsg("switch:", line) line = f'{r[1]} {r[3]}' - if r[4]: line = rpad(line, col_comment) + r[4] + if r[4]: line = concat_with_space(rpad(line, col_comment), r[4]) d['line'] = line d['check_comment_next'] = True return True @@ -207,7 +215,7 @@ def tryDef(d): if r == None: return False logmsg("def:", line) line = f'{r[1]} {r[3]} ' - line += lpad(r[4], col_value_rj + 1 - len(line)) + line = concat_with_space(line, lpad(r[4], col_value_rj + 1 - len(line))) if r[5]: line = rpad(line, col_comment - 1) + ' ' + r[5] d['line'] = line return True @@ -221,7 +229,7 @@ def tryUndef(d): if r == None: return False logmsg("undef:", line) line = f'{r[1]} {r[3]}' - if r[4]: line = rpad(line, col_comment) + r[4] + if r[4]: line = concat_with_space(rpad(line, col_comment), r[4]) d['line'] = line return True @@ -233,7 +241,7 @@ def tryCond(d): r = condPatt.match(line) if r == None: return False logmsg("cond:", line) - line = rpad(r[1], col_comment) + r[5] + line = concat_with_space(rpad(r[1], col_comment), r[5]) d['line'] = line d['check_comment_next'] = True return True From a36f72e886eb9a8867043173d109295c9ddf2a47 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 23 Apr 2024 14:19:14 -0700 Subject: [PATCH 104/111] =?UTF-8?q?=F0=9F=8E=A8=20Format=20pins=20which=20?= =?UTF-8?q?fail=20validation=20(#27007)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 26 +++++++++---------- Marlin/src/pins/ramps/pins_RAMPS.h | 12 ++++----- .../src/pins/sanguino/pins_MELZI_CREALITY.h | 2 +- .../src/pins/sanguino/pins_SANGUINOLOLU_11.h | 2 +- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index 8a39e2790a73..dbacb0fa26f8 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -211,19 +211,19 @@ * ------ ------ * EXP1 EXP2 */ -#define EXP1_01_PIN P1_31 -#define EXP1_02_PIN P1_30 -#define EXP1_03_PIN P0_18 -#define EXP1_04_PIN P0_16 -#define EXP1_05_PIN P0_15 - -#define EXP2_01_PIN P0_08 -#define EXP2_02_PIN P0_07 -#define EXP2_03_PIN P3_25 -#define EXP2_04_PIN P0_28 -#define EXP2_05_PIN P3_26 -#define EXP2_06_PIN P0_09 -#define EXP2_07_PIN P0_27 +#define EXP1_01_PIN P1_31 +#define EXP1_02_PIN P1_30 +#define EXP1_03_PIN P0_18 +#define EXP1_04_PIN P0_16 +#define EXP1_05_PIN P0_15 + +#define EXP2_01_PIN P0_08 +#define EXP2_02_PIN P0_07 +#define EXP2_03_PIN P3_25 +#define EXP2_04_PIN P0_28 +#define EXP2_05_PIN P3_26 +#define EXP2_06_PIN P0_09 +#define EXP2_07_PIN P0_27 // // LCD / Controller diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index 0e6e33e18e88..38684391021b 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -325,23 +325,23 @@ #if HAS_TMC_SPI #if ENABLED(TMC_USE_SW_SPI) #ifndef TMC_SPI_MOSI - #define TMC_SPI_MOSI AUX2_09 + #define TMC_SPI_MOSI AUX2_09 #endif #ifndef TMC_SPI_MISO - #define TMC_SPI_MISO AUX2_07 + #define TMC_SPI_MISO AUX2_07 #endif #ifndef TMC_SPI_SCK - #define TMC_SPI_SCK AUX2_05 + #define TMC_SPI_SCK AUX2_05 #endif #else #ifndef TMC_SPI_MOSI - #define TMC_SPI_MOSI AUX3_04 + #define TMC_SPI_MOSI AUX3_04 #endif #ifndef TMC_SPI_MISO - #define TMC_SPI_MISO AUX3_03 + #define TMC_SPI_MISO AUX3_03 #endif #ifndef TMC_SPI_SCK - #define TMC_SPI_SCK AUX3_05 + #define TMC_SPI_SCK AUX3_05 #endif #endif #endif diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h index 2915c77d70c9..ba3c6767b261 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h @@ -101,7 +101,7 @@ #endif #if PIN_EXISTS(BEEPER) && (SERVO0_PIN == BEEPER_PIN || FIL_RUNOUT_PIN == BEEPER_PIN) #undef BEEPER_PIN - #define BEEPER_PIN -1 + #define BEEPER_PIN -1 #endif /** diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index a381088ecf90..74d2b5549bc5 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -108,7 +108,7 @@ #endif #define E0_ENABLE_PIN 4 #else - #if !HAS_CUTTER && !ALL(HAS_WIRED_LCD, IS_NEWPANEL) // Use IO Header + #if !HAS_CUTTER && !ALL(HAS_WIRED_LCD, IS_NEWPANEL) // Use IO Header #define CASE_LIGHT_PIN 4 // Hardware PWM - see if IO Header is available #endif #endif From 882421a03e9799c8389a9cd27613704c000f23db Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 23 Apr 2024 17:19:02 -0700 Subject: [PATCH 105/111] =?UTF-8?q?=F0=9F=94=A7=20BIQU=20MicroProbe=20V2?= =?UTF-8?q?=20pull-up=20warning=20(#27008)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/Warnings.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index 2c2a82497839..40a4c9452d2e 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -694,6 +694,10 @@ #error "Z_SAFE_HOMING is recommended when homing with a probe. Enable Z_SAFE_HOMING or comment out this line to continue." #endif +#if ENABLED(BIQU_MICROPROBE_V2) && NONE(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, NO_MICROPROBE_WARNING) + #warning "BIQU MicroProbe V2 detect signal requires a strong pull-up. Some processors have weak internal pull-up capabilities, so we recommended connecting MicroProbe SIGNAL / GND to Z-MIN / Z-STOP instead of the dedicated PROBE port. (Define NO_MICROPROBE_WARNING to suppress this warning.)" +#endif + // // Warn users of potential endstop/DIAG pin conflicts to prevent homing issues when not using sensorless homing // From a1ecea60fdbf4f930f1aff236900b642883dfc6a Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:35:11 +1200 Subject: [PATCH 106/111] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20MPCTEMP=5FSTART=20?= =?UTF-8?q?=3D>=20MPC=5FSTARTED=20(#27002)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/e3v2/proui/dwin.cpp | 10 +++++----- Marlin/src/lcd/e3v2/proui/dwin.h | 2 +- Marlin/src/lcd/e3v2/proui/proui_extui.cpp | 2 +- Marlin/src/module/temperature.cpp | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index fd4e09588581..8aa4b90d1ef5 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -1312,7 +1312,7 @@ void eachMomentUpdate() { TERN_(PIDTEMP, if (hmiValue.tempControl == PIDTEMP_START) { plot.update(thermalManager.wholeDegHotend(0)); }) TERN_(PIDTEMPBED, if (hmiValue.tempControl == PIDTEMPBED_START) { plot.update(thermalManager.wholeDegBed()); }) TERN_(PIDTEMPCHAMBER, if (hmiValue.tempControl == PIDTEMPCHAMBER_START) { plot.update(thermalManager.wholeDegChamber()); }) - TERN_(MPCTEMP, if (hmiValue.tempControl == MPCTEMP_START) { plot.update(thermalManager.wholeDegHotend(0)); }) + TERN_(MPCTEMP, if (hmiValue.tempControl == MPC_STARTED) { plot.update(thermalManager.wholeDegHotend(0)); }) if (hmiFlag.abort_flag || hmiFlag.pause_flag || print_job_timer.isPaused()) { hmiReturnScreen(); } @@ -1567,7 +1567,7 @@ void dwinLevelingDone() { switch (hmiValue.tempControl) { default: return; #if ENABLED(MPC_AUTOTUNE) - case MPCTEMP_START: + case MPC_STARTED: DWINUI::drawCenteredString(hmiData.colorPopupTxt, 70, GET_TEXT_F(MSG_MPC_AUTOTUNE)); DWINUI::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, F("MPC target: Celsius")); DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_NOZZLE)); @@ -1620,7 +1620,7 @@ void dwinLevelingDone() { switch (result) { #if ENABLED(MPCTEMP) - case MPCTEMP_START: + case MPC_STARTED: #elif ENABLED(PIDTEMP) case PIDTEMP_START: #endif @@ -1656,7 +1656,7 @@ void dwinLevelingDone() { void drawHPlot() { TERN_(PIDTEMP, dwinDrawPlot(PIDTEMP_START)); - TERN_(MPCTEMP, dwinDrawPlot(MPCTEMP_START)); + TERN_(MPCTEMP, dwinDrawPlot(MPC_STARTED)); } void drawBPlot() { TERN_(PIDTEMPBED, dwinDrawPlot(PIDTEMPBED_START)); @@ -1742,7 +1742,7 @@ void dwinLevelingDone() { void dwinMPCTuning(tempcontrol_t result) { hmiValue.tempControl = result; switch (result) { - case MPCTEMP_START: + case MPC_STARTED: hmiSaveProcessID(ID_MPCProcess); #if PROUI_TUNING_GRAPH dwinDrawPIDMPCPopup(); diff --git a/Marlin/src/lcd/e3v2/proui/dwin.h b/Marlin/src/lcd/e3v2/proui/dwin.h index 7d264b8b12ed..9ec7b5442182 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.h +++ b/Marlin/src/lcd/e3v2/proui/dwin.h @@ -90,7 +90,7 @@ enum processID : uint8_t { PID_TUNING_TIMEOUT, #endif #if ENABLED(MPC_AUTOTUNE) - MPCTEMP_START, + MPC_STARTED, MPC_TEMP_ERROR, MPC_INTERRUPTED, #endif diff --git a/Marlin/src/lcd/e3v2/proui/proui_extui.cpp b/Marlin/src/lcd/e3v2/proui/proui_extui.cpp index d377ca5fdce3..d7aad208cccc 100644 --- a/Marlin/src/lcd/e3v2/proui/proui_extui.cpp +++ b/Marlin/src/lcd/e3v2/proui/proui_extui.cpp @@ -222,7 +222,7 @@ namespace ExtUI { void onMPCTuning(const mpcresult_t rst) { // Called for temperature MPC tuning result switch (rst) { - case MPC_STARTED: dwinMPCTuning(MPCTEMP_START); break; + case MPC_STARTED: dwinMPCTuning(MPC_STARTED); break; case MPC_TEMP_ERROR: dwinMPCTuning(MPC_TEMP_ERROR); break; case MPC_INTERRUPTED: dwinMPCTuning(MPC_INTERRUPTED); break; case MPC_DONE: dwinMPCTuning(AUTOTUNE_DONE); break; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a1fe14c75df3..87afa2cbdd68 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1195,7 +1195,7 @@ volatile bool Temperature::raw_temps_ready = false; // Determine ambient temperature. SERIAL_ECHOLNPGM(STR_MPC_COOLING_TO_AMBIENT); - TERN_(EXTENSIBLE_UI, ExtUI::onMPCTuning(ExtUI::mpcresult_t::MPCTEMP_START)); + TERN_(EXTENSIBLE_UI, ExtUI::onMPCTuning(ExtUI::mpcresult_t::MPC_STARTED)); TERN(DWIN_LCD_PROUI, LCD_ALERTMESSAGE(MSG_MPC_COOLING_TO_AMBIENT), LCD_MESSAGE(MSG_COOLING)); if (tuner.measure_ambient_temp() != MPC_autotuner::MeasurementState::SUCCESS) return; From 5366362e47daaa85fd819d081843776c98ae059b Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 24 Apr 2024 00:46:36 +0000 Subject: [PATCH 107/111] [cron] Bump distribution date (2024-04-24) --- 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 c5e6e7624e43..49becad70301 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 "2024-04-23" +//#define STRING_DISTRIBUTION_DATE "2024-04-24" /** * 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 7a5e5516c698..8cbe432a0d9c 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 "2024-04-23" + #define STRING_DISTRIBUTION_DATE "2024-04-24" #endif /** From cecc7458440b17340184f9508d0c9da0747ecc72 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Wed, 24 Apr 2024 18:51:08 -0400 Subject: [PATCH 108/111] =?UTF-8?q?=F0=9F=9A=B8=20Fix=20duplicate=20temper?= =?UTF-8?q?ature=20report=20(#26952)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/module/temperature.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 97e7c32bf6a2..2dba3944e5cf 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -266,7 +266,7 @@ PGMSTR(M112_KILL_STR, "M112 Shutdown"); MarlinState marlin_state = MF_INITIALIZING; // For M109 and M190, this flag may be cleared (by M108) to exit the wait loop -bool wait_for_heatup = true; +bool wait_for_heatup = false; // For M0/M1, this flag may be cleared (by M108) to exit the wait-for-user loop #if HAS_RESUME_CONTINUE diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 87afa2cbdd68..1fa7eaae0df3 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -4419,6 +4419,7 @@ void Temperature::isr() { #if ENABLED(AUTO_REPORT_TEMPERATURES) AutoReporter Temperature::auto_reporter; void Temperature::AutoReportTemp::report() { + if (wait_for_heatup) return; print_heater_states(active_extruder OPTARG(HAS_TEMP_REDUNDANT, ENABLED(AUTO_REPORT_REDUNDANT))); SERIAL_EOL(); } From 489ef6e5e1aaf94e1786c50841143c894efe6c2c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Apr 2024 17:46:40 -0500 Subject: [PATCH 109/111] =?UTF-8?q?=F0=9F=A9=B9=20Simple=20IA-Creality=20b?= =?UTF-8?q?abystep=20patch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/MarlinFirmware/Marlin/issues/26896#issuecomment-2015630458 Co-Authored-By: ellensp <530024+ellensp@users.noreply.github.com> --- Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp | 2 +- Marlin/src/lcd/tft/ui_common.cpp | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp index 797b80b0d542..15bbf3dc071c 100644 --- a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp @@ -793,7 +793,7 @@ void RTS::handleData() { tmp_zprobe_offset = (float(recdat.data[0]) - 65536) / 100; else tmp_zprobe_offset = float(recdat.data[0]) / 100; - if (WITHIN((tmp_zprobe_offset), PROBE_OFFSET_ZMIN, PROBE_OFFSET_ZMAX)) { + if (WITHIN(tmp_zprobe_offset, PROBE_OFFSET_ZMIN, PROBE_OFFSET_ZMAX)) { int16_t tmpSteps = mmToWholeSteps(getZOffset_mm() - tmp_zprobe_offset, axis_t(Z)); if (tmpSteps == 0) tmpSteps = getZOffset_mm() < tmp_zprobe_offset ? 1 : -1; smartAdjustAxis_steps(-tmpSteps, axis_t(Z), false); diff --git a/Marlin/src/lcd/tft/ui_common.cpp b/Marlin/src/lcd/tft/ui_common.cpp index 944be77ab5c9..21ae78f53edf 100644 --- a/Marlin/src/lcd/tft/ui_common.cpp +++ b/Marlin/src/lcd/tft/ui_common.cpp @@ -71,12 +71,16 @@ void moveAxis(const AxisEnum axis, const int8_t direction) { } #endif - const float diff = motionAxisState.currentStepSize * direction; + float diff = motionAxisState.currentStepSize * direction; #if HAS_BED_PROBE if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + + diff = 0; + const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; const float bsDiff = planner.mm_per_step[Z_AXIS] * babystep_increment, @@ -97,7 +101,8 @@ void moveAxis(const AxisEnum axis, const int8_t direction) { else drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); - #else + #else // !BABYSTEP_ZPROBE_OFFSET + // Only change probe.offset.z probe.offset.z += diff; if (direction < 0 && current_position.z < PROBE_OFFSET_ZMIN) { @@ -112,7 +117,8 @@ void moveAxis(const AxisEnum axis, const int8_t direction) { drawMessage_P(NUL_STR); // Clear the error drawAxisValue(axis); - #endif + + #endif // !BABYSTEP_ZPROBE_OFFSET } #endif // HAS_BED_PROBE From 2270bf41d7529873ec997e8842c44045c10ef9e4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Apr 2024 18:09:32 -0500 Subject: [PATCH 110/111] =?UTF-8?q?=F0=9F=A9=B9=20IA-Creality=20minor=20cl?= =?UTF-8?q?eanup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/tft/ui_common.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Marlin/src/lcd/tft/ui_common.cpp b/Marlin/src/lcd/tft/ui_common.cpp index 21ae78f53edf..c1c14c3bb510 100644 --- a/Marlin/src/lcd/tft/ui_common.cpp +++ b/Marlin/src/lcd/tft/ui_common.cpp @@ -96,7 +96,6 @@ void moveAxis(const AxisEnum axis, const int8_t direction) { else TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); drawMessage_P(NUL_STR); // Clear the error - drawAxisValue(axis); } else drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); @@ -116,14 +115,12 @@ void moveAxis(const AxisEnum axis, const int8_t direction) { else drawMessage_P(NUL_STR); // Clear the error - drawAxisValue(axis); - #endif // !BABYSTEP_ZPROBE_OFFSET } #endif // HAS_BED_PROBE - if (!ui.manual_move.processing) { + if (diff && !ui.manual_move.processing) { // Get motion limit from software endstops, if any float min, max; soft_endstop.get_manual_axis_limits(axis, min, max); From af8dcc6ee8cdc86b879ce7bc0ee9d799d5597270 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 25 Apr 2024 00:29:51 +0000 Subject: [PATCH 111/111] [cron] Bump distribution date (2024-04-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 49becad70301..0ebed0426e8e 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 "2024-04-24" +//#define STRING_DISTRIBUTION_DATE "2024-04-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 8cbe432a0d9c..6322ced40acd 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 "2024-04-24" + #define STRING_DISTRIBUTION_DATE "2024-04-25" #endif /**