Browse Source

Merge remote-tracking branch 'upstream/bugfix-2.0.x' into 2.0.x

Scott Lahteine 4 years ago
parent
commit
0673f335e1
100 changed files with 1887 additions and 746 deletions
  1. 25
    0
      .github/workflows/bump-date.yml
  2. 100
    0
      .github/workflows/test-builds.yml
  3. 0
    84
      .travis.yml
  4. 9
    3
      Marlin/Configuration.h
  5. 9
    12
      Marlin/Configuration_adv.h
  6. 1
    1
      Marlin/Makefile
  7. 1
    1
      Marlin/src/HAL/HAL_AVR/inc/SanityCheck.h
  8. 7
    0
      Marlin/src/HAL/HAL_AVR/pinsDebug.h
  9. 2
    2
      Marlin/src/HAL/HAL_ESP32/HAL.cpp
  10. 7
    5
      Marlin/src/HAL/HAL_ESP32/WebSocketSerial.h
  11. 63
    0
      Marlin/src/HAL/HAL_ESP32/persistent_store_impl.cpp
  12. 0
    106
      Marlin/src/HAL/HAL_ESP32/persistent_store_spiffs.cpp
  13. 1
    1
      Marlin/src/HAL/HAL_ESP32/spiffs.cpp
  14. 11
    1
      Marlin/src/HAL/HAL_ESP32/watchdog.h
  15. 4
    0
      Marlin/src/HAL/HAL_LPC1768/inc/SanityCheck.h
  16. 1
    1
      Marlin/src/HAL/HAL_SAMD51/inc/SanityCheck.h
  17. 7
    0
      Marlin/src/HAL/HAL_STM32/HAL_SPI.cpp
  18. 14
    9
      Marlin/src/HAL/HAL_STM32/Servo.cpp
  19. 4
    2
      Marlin/src/HAL/HAL_STM32/Servo.h
  20. 1
    1
      Marlin/src/HAL/HAL_STM32/SoftwareSerial.cpp
  21. 265
    0
      Marlin/src/HAL/HAL_STM32/persistent_store_flash.cpp
  22. 2
    23
      Marlin/src/HAL/HAL_STM32/persistent_store_impl.cpp
  23. 45
    25
      Marlin/src/HAL/HAL_STM32F1/persistent_store_flash.cpp
  24. 1
    1
      Marlin/src/Marlin.cpp
  25. 29
    21
      Marlin/src/core/boards.h
  26. 4
    4
      Marlin/src/core/language.h
  27. 1
    1
      Marlin/src/core/serial.h
  28. 2
    0
      Marlin/src/core/utility.cpp
  29. 1
    1
      Marlin/src/feature/binary_protocol.h
  30. 7
    3
      Marlin/src/feature/pause.cpp
  31. 4
    3
      Marlin/src/feature/tmc_util.cpp
  32. 5
    4
      Marlin/src/gcode/bedlevel/abl/G29.cpp
  33. 1
    11
      Marlin/src/gcode/calibrate/G28.cpp
  34. 51
    18
      Marlin/src/gcode/calibrate/G34_M422.cpp
  35. 9
    8
      Marlin/src/gcode/calibrate/M100.cpp
  36. 1
    1
      Marlin/src/gcode/feature/camera/M240.cpp
  37. 3
    1
      Marlin/src/gcode/feature/trinamic/M569.cpp
  38. 2
    2
      Marlin/src/gcode/gcode.cpp
  39. 1
    1
      Marlin/src/gcode/sdcard/M23.cpp
  40. 2
    2
      Marlin/src/gcode/sdcard/M28_M29.cpp
  41. 3
    4
      Marlin/src/gcode/sdcard/M32.cpp
  42. 2
    2
      Marlin/src/inc/Conditionals_LCD.h
  43. 15
    15
      Marlin/src/inc/Conditionals_post.h
  44. 24
    36
      Marlin/src/inc/SanityCheck.h
  45. 14
    0
      Marlin/src/lcd/dogm/dogm_Statusscreen.h
  46. 1
    14
      Marlin/src/lcd/dogm/status_screen_DOGM.cpp
  47. 1
    1
      Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp
  48. 37
    34
      Marlin/src/lcd/dogm/ultralcd_DOGM.cpp
  49. 1
    1
      Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp
  50. 2
    2
      Marlin/src/lcd/extensible_ui/ui_api.cpp
  51. 2
    2
      Marlin/src/lcd/extui_malyan_lcd.cpp
  52. 1
    1
      Marlin/src/lcd/language/language_an.h
  53. 1
    1
      Marlin/src/lcd/language/language_bg.h
  54. 5
    2
      Marlin/src/lcd/language/language_ca.h
  55. 101
    14
      Marlin/src/lcd/language/language_cz.h
  56. 6
    2
      Marlin/src/lcd/language/language_da.h
  57. 4
    1
      Marlin/src/lcd/language/language_de.h
  58. 1
    1
      Marlin/src/lcd/language/language_el.h
  59. 1
    1
      Marlin/src/lcd/language/language_el_gr.h
  60. 4
    7
      Marlin/src/lcd/language/language_en.h
  61. 4
    1
      Marlin/src/lcd/language/language_es.h
  62. 4
    1
      Marlin/src/lcd/language/language_eu.h
  63. 30
    20
      Marlin/src/lcd/language/language_fr.h
  64. 1
    1
      Marlin/src/lcd/language/language_gl.h
  65. 1
    1
      Marlin/src/lcd/language/language_hr.h
  66. 9
    5
      Marlin/src/lcd/language/language_it.h
  67. 4
    1
      Marlin/src/lcd/language/language_jp_kana.h
  68. 5
    2
      Marlin/src/lcd/language/language_nl.h
  69. 5
    2
      Marlin/src/lcd/language/language_pl.h
  70. 1
    1
      Marlin/src/lcd/language/language_pt.h
  71. 1
    1
      Marlin/src/lcd/language/language_pt_br.h
  72. 5
    2
      Marlin/src/lcd/language/language_ru.h
  73. 4
    1
      Marlin/src/lcd/language/language_sk.h
  74. 4
    1
      Marlin/src/lcd/language/language_tr.h
  75. 5
    2
      Marlin/src/lcd/language/language_uk.h
  76. 4
    1
      Marlin/src/lcd/language/language_vi.h
  77. 4
    1
      Marlin/src/lcd/language/language_zh_CN.h
  78. 4
    1
      Marlin/src/lcd/language/language_zh_TW.h
  79. 1
    1
      Marlin/src/lcd/menu/menu_advanced.cpp
  80. 9
    0
      Marlin/src/lcd/menu/menu_main.cpp
  81. 39
    42
      Marlin/src/lcd/ultralcd.cpp
  82. 4
    3
      Marlin/src/lcd/ultralcd.h
  83. 13
    6
      Marlin/src/module/configuration_store.cpp
  84. 7
    5
      Marlin/src/module/planner.cpp
  85. 4
    2
      Marlin/src/module/probe.cpp
  86. 8
    0
      Marlin/src/module/probe.h
  87. 0
    1
      Marlin/src/module/scara.cpp
  88. 98
    61
      Marlin/src/module/stepper.cpp
  89. 33
    20
      Marlin/src/module/stepper.h
  90. 101
    0
      Marlin/src/pins/esp32/pins_MRR_ESPA.h
  91. 154
    0
      Marlin/src/pins/esp32/pins_MRR_ESPE.h
  92. 18
    7
      Marlin/src/pins/lpc1768/pins_BTT_SKR.h
  93. 2
    0
      Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h
  94. 280
    0
      Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h
  95. 70
    46
      Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h
  96. 1
    0
      Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h
  97. 2
    2
      Marlin/src/pins/mega/pins_GT2560_V3.h
  98. 18
    4
      Marlin/src/pins/pins.h
  99. 1
    1
      Marlin/src/pins/ramps/pins_RAMPS.h
  100. 0
    0
      Marlin/src/pins/sam/pins_RADDS.h

+ 25
- 0
.github/workflows/bump-date.yml View File

@@ -0,0 +1,25 @@
1
+#
2
+# bump-date.yml
3
+# Bump the distribution date once per day
4
+#
5
+
6
+name: Bump Distribution Date
7
+
8
+on:
9
+  schedule:
10
+    - cron:  '0 0 * * *'
11
+
12
+jobs:
13
+  bump_date:
14
+
15
+    runs-on: ubuntu-latest
16
+
17
+    steps:
18
+
19
+    - name: Check out bugfix-2.0.x
20
+      uses: actions/checkout@v2
21
+      with:
22
+        ref: bugfix-2.0.x
23
+
24
+    - name: Bump Distribution Date
25
+      run: source ./buildroot/bin/bump_date

+ 100
- 0
.github/workflows/test-builds.yml View File

@@ -0,0 +1,100 @@
1
+#
2
+# test-builds.yml
3
+# Do test builds to catch compile errors
4
+#
5
+
6
+name: CI
7
+
8
+on:
9
+  pull_request:
10
+    branches:
11
+    - bugfix-2.0.x
12
+    - dev-2.1.x
13
+    paths-ignore:
14
+    - config/**
15
+    - data/**
16
+    - docs/**
17
+    - '**/*.md'
18
+
19
+jobs:
20
+  test_builds:
21
+
22
+    runs-on: ubuntu-latest
23
+
24
+    strategy:
25
+      matrix:
26
+        test-platform:
27
+        # Base Environments
28
+
29
+        - DUE
30
+        - esp32
31
+        - linux_native
32
+        - megaatmega2560
33
+        - teensy31
34
+        - teensy35
35
+
36
+        # Extended AVR Environments
37
+
38
+        - FYSETC_F6_13
39
+        - megaatmega1280
40
+        - rambo
41
+        - sanguino_atmega1284p
42
+        - sanguino_atmega644p
43
+
44
+        # Extended STM32 Environments
45
+
46
+        - STM32F103RC_bigtree
47
+        - STM32F103RC_bigtree_USB
48
+        - STM32F103RE_bigtree
49
+        - STM32F103RE_bigtree_USB
50
+        - STM32F103RC_fysetc
51
+        - jgaurora_a5s_a1
52
+        - STM32F103VE_longer
53
+        - STM32F407VE_black
54
+        - BIGTREE_SKR_PRO
55
+        - mks_robin
56
+        - ARMED
57
+
58
+        # Put lengthy tests last
59
+
60
+        - LPC1768
61
+        - LPC1769
62
+
63
+        # STM32 with non-STM framework. both broken for now. they should use HAL_STM32 which is working.
64
+
65
+        #- STM32F4
66
+        #- STM32F7
67
+
68
+        # Non-working environment tests
69
+
70
+        #- BIGTREE_BTT002
71
+        #- at90usb1286_cdc
72
+        #- at90usb1286_dfu
73
+        #- STM32F103CB_malyan
74
+        #- mks_robin_lite
75
+        #- mks_robin_mini
76
+        #- mks_robin_nano
77
+        #- SAMD51_grandcentral_m4
78
+
79
+    steps:
80
+
81
+    - name: Select Python 3.7
82
+      uses: actions/setup-python@v1
83
+      with:
84
+        python-version: '3.7' # Version range or exact version of a Python version to use, using semvers version range syntax.
85
+        architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
86
+
87
+    - name: Install PlatformIO
88
+      run: |
89
+        pip install -U https://github.com/platformio/platformio-core/archive/master.zip
90
+        platformio update
91
+
92
+    - name: Check out the PR
93
+      uses: actions/checkout@v2
94
+
95
+    - name: Run ${{ matrix.test-platform }} Tests
96
+      run: |
97
+        chmod +x buildroot/bin/*
98
+        chmod +x buildroot/share/tests/*
99
+        export PATH=./buildroot/bin/:./buildroot/share/tests/:${PATH}
100
+        run_tests . ${{ matrix.test-platform }}

+ 0
- 84
.travis.yml View File

@@ -1,84 +0,0 @@
1
-dist: bionic
2
-sudo: false
3
-
4
-language: python
5
-python:
6
-  - "3.7"
7
-
8
-notifications:
9
-  email: false
10
-
11
-env:
12
-  # Base Environments
13
-  - TEST_PLATFORM="DUE"
14
-  - TEST_PLATFORM="esp32"
15
-  - TEST_PLATFORM="linux_native"
16
-  - TEST_PLATFORM="megaatmega2560"
17
-  - TEST_PLATFORM="teensy31"
18
-  - TEST_PLATFORM="teensy35"
19
-
20
-  # Extended AVR Environments
21
-  - TEST_PLATFORM="FYSETC_F6_13"
22
-  - TEST_PLATFORM="megaatmega1280"
23
-  - TEST_PLATFORM="rambo"
24
-  - TEST_PLATFORM="sanguino_atmega1284p"
25
-  - TEST_PLATFORM="sanguino_atmega644p"
26
-
27
-  # Extended STM32 Environments
28
-  - TEST_PLATFORM="STM32F103RC_bigtree"
29
-  - TEST_PLATFORM="STM32F103RC_bigtree_USB"
30
-  - TEST_PLATFORM="STM32F103RE_bigtree"
31
-  - TEST_PLATFORM="STM32F103RE_bigtree_USB"
32
-  - TEST_PLATFORM="STM32F103RC_fysetc"
33
-  - TEST_PLATFORM="jgaurora_a5s_a1"
34
-  - TEST_PLATFORM="STM32F103VE_longer"
35
-  - TEST_PLATFORM="STM32F407VE_black"
36
-  - TEST_PLATFORM="BIGTREE_SKR_PRO"
37
-  - TEST_PLATFORM="mks_robin"
38
-  - TEST_PLATFORM="ARMED"
39
-
40
-  # STM32 with non-STM framework. both broken for now. they should use HAL_STM32 which is working.
41
-  #- TEST_PLATFORM="STM32F4"
42
-  #- TEST_PLATFORM="STM32F7"
43
-
44
-  # Put lengthy tests last
45
-  - TEST_PLATFORM="LPC1768"
46
-  - TEST_PLATFORM="LPC1769"
47
-
48
-  # Non-working environment tests
49
-  #- TEST_PLATFORM="BIGTREE_BTT002" this board isn't released yet. we need pinout to be sure about what we do
50
-  #- TEST_PLATFORM="at90usb1286_cdc"
51
-  #- TEST_PLATFORM="at90usb1286_dfu"
52
-  #- TEST_PLATFORM="STM32F103CB_malyan"
53
-  #- TEST_PLATFORM="mks_robin_lite"
54
-  #- TEST_PLATFORM="mks_robin_mini"
55
-  #- TEST_PLATFORM="mks_robin_nano"
56
-  #- TEST_PLATFORM="SAMD51_grandcentral_m4"
57
-
58
-before_install:
59
-  #
60
-  # Fetch the tag information for the current branch
61
-  - git fetch origin --tags
62
-  #
63
-  # Publish the buildroot script folder
64
-  - chmod +x ${TRAVIS_BUILD_DIR}/buildroot/bin/*
65
-  - chmod +x ${TRAVIS_BUILD_DIR}/buildroot/share/tests/*
66
-  - export PATH=${TRAVIS_BUILD_DIR}/buildroot/bin/:${TRAVIS_BUILD_DIR}/buildroot/share/tests/:${PATH}
67
-
68
-install:
69
-  #- pip install -U platformio
70
-  - pip install -U https://github.com/platformio/platformio-core/archive/master.zip
71
-
72
-before_script:
73
-  # Update PlatformIO packages
74
-  - platformio update
75
-  #
76
-  # Change current working directory to the build dir
77
-  - cd ${TRAVIS_BUILD_DIR}
78
-  #
79
-  # Generate custom version include
80
-  - generate_version ${TRAVIS_BUILD_DIR}/Marlin/
81
-  - cat ${TRAVIS_BUILD_DIR}/Marlin/Version.h
82
-  #
83
-script:
84
-  - run_tests ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM}

+ 9
- 3
Marlin/Configuration.h View File

@@ -856,6 +856,12 @@
856 856
 //#define FIX_MOUNTED_PROBE
857 857
 
858 858
 /**
859
+ * Use the nozzle as the probe, as with a conductive
860
+ * nozzle system or a piezo-electric smart effector.
861
+ */
862
+//#define NOZZLE_AS_PROBE
863
+
864
+/**
859 865
  * Z Servo Probe, such as an endstop switch on a rotating arm.
860 866
  */
861 867
 //#define Z_PROBE_SERVO_NR 0       // Defaults to SERVO 0 connector.
@@ -1769,7 +1775,7 @@
1769 1775
 
1770 1776
 //
1771 1777
 // Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller
1772
-// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html
1778
+// https://www.aliexpress.com/item/32765887917.html
1773 1779
 //
1774 1780
 //#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602
1775 1781
 
@@ -1943,7 +1949,7 @@
1943 1949
 
1944 1950
 //
1945 1951
 // Factory display for Creality CR-10
1946
-// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html
1952
+// https://www.aliexpress.com/item/32833148327.html
1947 1953
 //
1948 1954
 // This is RAMPS-compatible using a single 10-pin connector.
1949 1955
 // (For CR-10 owners who want to replace the Melzi Creality board but retain the display)
@@ -1961,7 +1967,7 @@
1961 1967
 
1962 1968
 //
1963 1969
 // AZSMZ 12864 LCD with SD
1964
-// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html
1970
+// https://www.aliexpress.com/item/32837222770.html
1965 1971
 //
1966 1972
 //#define AZSMZ_12864
1967 1973
 

+ 9
- 12
Marlin/Configuration_adv.h View File

@@ -656,7 +656,7 @@
656 656
 //#define Z_STEPPER_AUTO_ALIGN
657 657
 #if ENABLED(Z_STEPPER_AUTO_ALIGN)
658 658
   // Define probe X and Y positions for Z1, Z2 [, Z3]
659
-  #define Z_STEPPER_ALIGN_XY { {  10, 290 }, { 150,  10 }, { 290, 290 } }
659
+  #define Z_STEPPER_ALIGN_XY { {  10, 190 }, { 100,  10 }, { 190, 190 } }
660 660
 
661 661
   // Provide Z stepper positions for more rapid convergence in bed alignment.
662 662
   // Currently requires triple stepper drivers.
@@ -1548,12 +1548,12 @@
1548 1548
 /**
1549 1549
  * Maximum stepping rate (in Hz) the stepper driver allows
1550 1550
  *  If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE)
1551
- *  500000 : Maximum for A4988 stepper driver
1552
- *  400000 : Maximum for TMC2xxx stepper drivers
1553
- *  250000 : Maximum for DRV8825 stepper driver
1554
- *  200000 : Maximum for LV8729 stepper driver
1555
- *  150000 : Maximum for TB6600 stepper driver
1556
- *   15000 : Maximum for TB6560 stepper driver
1551
+ *  5000000 : Maximum for TMC2xxx stepper drivers
1552
+ *  1000000 : Maximum for LV8729 stepper driver
1553
+ *  500000  : Maximum for A4988 stepper driver
1554
+ *  250000  : Maximum for DRV8825 stepper driver
1555
+ *  150000  : Maximum for TB6600 stepper driver
1556
+ *   15000  : Maximum for TB6560 stepper driver
1557 1557
  *
1558 1558
  * Override the default value based on the driver type set in Configuration.h.
1559 1559
  */
@@ -1751,8 +1751,8 @@
1751 1751
   //#define ADVANCED_PAUSE_FANS_PAUSE             // Turn off print-cooling fans while the machine is paused.
1752 1752
 
1753 1753
                                                   // Filament Unload does a Retract, Delay, and Purge first:
1754
-  #define FILAMENT_UNLOAD_RETRACT_LENGTH      13  // (mm) Unload initial retract length.
1755
-  #define FILAMENT_UNLOAD_DELAY             5000  // (ms) Delay for the filament to cool after retract.
1754
+  #define FILAMENT_UNLOAD_PURGE_RETRACT       13  // (mm) Unload initial retract length.
1755
+  #define FILAMENT_UNLOAD_PURGE_DELAY       5000  // (ms) Delay for the filament to cool after retract.
1756 1756
   #define FILAMENT_UNLOAD_PURGE_LENGTH         8  // (mm) An unretract is done, then this length is purged.
1757 1757
 
1758 1758
   #define PAUSE_PARK_NOZZLE_TIMEOUT           45  // (seconds) Time limit before the nozzle is turned off for safety.
@@ -2128,8 +2128,6 @@
2128 2128
    *
2129 2129
    * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when
2130 2130
    * homing and adds a guard period for endstop triggering.
2131
-   *
2132
-   * TMC2209 requires STEALTHCHOP enabled for SENSORLESS_HOMING
2133 2131
    */
2134 2132
   //#define SENSORLESS_HOMING // StallGuard capable drivers only
2135 2133
 
@@ -2148,7 +2146,6 @@
2148 2146
     #define Y_STALL_SENSITIVITY  8
2149 2147
     //#define Z_STALL_SENSITIVITY  8
2150 2148
     //#define SPI_ENDSTOPS              // TMC2130 only
2151
-    //#define HOME_USING_SPREADCYCLE
2152 2149
     //#define IMPROVE_HOMING_RELIABILITY
2153 2150
   #endif
2154 2151
 

+ 1
- 1
Marlin/Makefile View File

@@ -188,7 +188,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1109)
188 188
 else ifeq ($(HARDWARE_MOTHERBOARD),1110)
189 189
 # zrib V2.0 control board (Chinese knock off RAMPS replica)
190 190
 else ifeq ($(HARDWARE_MOTHERBOARD),1111)
191
-# Bigtreetech or BIQU KFB2.0
191
+# BigTreeTech or BIQU KFB2.0
192 192
 else ifeq ($(HARDWARE_MOTHERBOARD),1112)
193 193
 # Felix 2.0+ Electronics Board (RAMPS like)
194 194
 else ifeq ($(HARDWARE_MOTHERBOARD),1113)

+ 1
- 1
Marlin/src/HAL/HAL_AVR/inc/SanityCheck.h View File

@@ -39,7 +39,7 @@
39 39
  * Checks for FAST PWM
40 40
  */
41 41
 #if ENABLED(FAST_PWM_FAN) && (ENABLED(USE_OCR2A_AS_TOP) && defined(TCCR2))
42
-    #error "USE_OCR2A_AS_TOP does not apply to devices with a single output TIMER2"
42
+  #error "USE_OCR2A_AS_TOP does not apply to devices with a single output TIMER2"
43 43
 #endif
44 44
 
45 45
 /**

+ 7
- 0
Marlin/src/HAL/HAL_AVR/pinsDebug.h View File

@@ -26,7 +26,10 @@
26 26
 
27 27
 #define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
28 28
 
29
+#define AVR_ATmega2560_FAMILY_PLUS_70 MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H)
30
+
29 31
 #if AVR_AT90USB1286_FAMILY
32
+
30 33
   // Working with Teensyduino extension so need to re-define some things
31 34
   #include "pinsDebug_Teensyduino.h"
32 35
   // Can't use the "digitalPinToPort" function from the Teensyduino type IDEs
@@ -35,7 +38,9 @@
35 38
   #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
36 39
   #define digitalPinToPort_DEBUG(p) digitalPinToPort_Teensy(p)
37 40
   #define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
41
+
38 42
 #elif AVR_ATmega2560_FAMILY_PLUS_70   // So we can access/display all the pins on boards using more than 70
43
+
39 44
   #include "pinsDebug_plus_70.h"
40 45
   #define digitalPinToTimer_DEBUG(p) digitalPinToTimer_plus_70(p)
41 46
   #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask_plus_70(p)
@@ -43,11 +48,13 @@
43 48
   bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
44 49
 
45 50
 #else
51
+
46 52
   #define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
47 53
   #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
48 54
   #define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
49 55
   bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
50 56
   #define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin)
57
+
51 58
 #endif
52 59
 
53 60
 #define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0)

+ 2
- 2
Marlin/src/HAL/HAL_ESP32/HAL.cpp View File

@@ -30,7 +30,7 @@
30 30
 
31 31
 #include "../../inc/MarlinConfigPre.h"
32 32
 
33
-#if EITHER(EEPROM_SETTINGS, WEBSUPPORT)
33
+#if ENABLED(WEBSUPPORT)
34 34
   #include "spiffs.h"
35 35
 #endif
36 36
 
@@ -83,7 +83,7 @@ void HAL_init() {
83 83
 }
84 84
 
85 85
 void HAL_init_board() {
86
-  #if EITHER(EEPROM_SETTINGS, WEBSUPPORT)
86
+  #if ENABLED(WEBSUPPORT)
87 87
     spiffs_init();
88 88
   #endif
89 89
 

+ 7
- 5
Marlin/src/HAL/HAL_ESP32/WebSocketSerial.h View File

@@ -25,14 +25,16 @@
25 25
 
26 26
 #include <Stream.h>
27 27
 
28
-#ifndef RX_BUFFER_SIZE
29
-  #define RX_BUFFER_SIZE 128
30
-#endif
31 28
 #ifndef TX_BUFFER_SIZE
32 29
   #define TX_BUFFER_SIZE 32
33 30
 #endif
34
-#if TX_BUFFER_SIZE <= 0
35
-  #error "TX_BUFFER_SIZE is required for the WebSocket."
31
+#if ENABLED(WIFISUPPORT)
32
+  #ifndef RX_BUFFER_SIZE
33
+    #define RX_BUFFER_SIZE 128
34
+  #endif
35
+  #if TX_BUFFER_SIZE <= 0
36
+    #error "TX_BUFFER_SIZE is required for the WebSocket."
37
+  #endif
36 38
 #endif
37 39
 
38 40
 typedef uint16_t ring_buffer_pos_t;

+ 63
- 0
Marlin/src/HAL/HAL_ESP32/persistent_store_impl.cpp View File

@@ -0,0 +1,63 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+#ifdef ARDUINO_ARCH_ESP32
24
+
25
+#include "../../inc/MarlinConfig.h"
26
+
27
+#if ENABLED(EEPROM_SETTINGS) && DISABLED(FLASH_EEPROM_EMULATION)
28
+
29
+#include "../shared/persistent_store_api.h"
30
+#include "EEPROM.h"
31
+
32
+#define EEPROM_SIZE 4096
33
+
34
+bool PersistentStore::access_start() {
35
+  return EEPROM.begin(EEPROM_SIZE);
36
+}
37
+
38
+bool PersistentStore::access_finish() {
39
+  EEPROM.end();
40
+  return true;
41
+}
42
+
43
+bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
44
+  for (size_t i = 0; i < size; i++) {
45
+    EEPROM.write(pos++, value[i]);
46
+    crc16(crc, &value[i], 1);
47
+  }
48
+  return false;
49
+}
50
+
51
+bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
52
+  for (size_t i = 0; i < size; i++) {
53
+    uint8_t c = EEPROM.read(pos++);
54
+    if (writing) value[i] = c;
55
+    crc16(crc, &c, 1);
56
+  }
57
+  return false;
58
+}
59
+
60
+size_t PersistentStore::capacity() { return EEPROM_SIZE; }
61
+
62
+#endif // EEPROM_SETTINGS
63
+#endif // ARDUINO_ARCH_ESP32

+ 0
- 106
Marlin/src/HAL/HAL_ESP32/persistent_store_spiffs.cpp View File

@@ -1,106 +0,0 @@
1
-/**
2
- * Marlin 3D Printer Firmware
3
- * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
- *
5
- * Based on Sprinter and grbl.
6
- * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
- *
8
- * This program is free software: you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License as published by
10
- * the Free Software Foundation, either version 3 of the License, or
11
- * (at your option) any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- * GNU General Public License for more details.
17
- *
18
- * You should have received a copy of the GNU General Public License
19
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
- *
21
- */
22
-
23
-#ifdef ARDUINO_ARCH_ESP32
24
-
25
-#include "../../inc/MarlinConfig.h"
26
-
27
-#if ENABLED(EEPROM_SETTINGS) && DISABLED(FLASH_EEPROM_EMULATION)
28
-
29
-#include "../shared/persistent_store_api.h"
30
-
31
-#include <SPIFFS.h>
32
-#include <FS.h>
33
-#include "spiffs.h"
34
-
35
-#define HAL_ESP32_EEPROM_SIZE 4096
36
-#define HAL_ESP32_EEPROM_FILE_PATH "/eeprom.dat"
37
-
38
-File eeprom_file;
39
-
40
-bool PersistentStore::access_start() {
41
-  if (spiffs_initialized) {
42
-    eeprom_file = SPIFFS.open(HAL_ESP32_EEPROM_FILE_PATH, "r+");
43
-
44
-    size_t file_size = eeprom_file.size();
45
-    if (file_size < HAL_ESP32_EEPROM_SIZE) {
46
-      SERIAL_ECHO_MSG("SPIFFS EEPROM settings file " HAL_ESP32_EEPROM_FILE_PATH " is too small or did not exist, expanding.");
47
-      SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR(" file size: ", file_size, ", required size: ", HAL_ESP32_EEPROM_SIZE);
48
-
49
-      // mode r+ does not allow to expand the file (at least on ESP32 SPIFFS9, so we close, reopen "a", append, close, reopen "r+"
50
-      eeprom_file.close();
51
-
52
-      eeprom_file = SPIFFS.open(HAL_ESP32_EEPROM_FILE_PATH, "a");
53
-      for (size_t i = eeprom_file.size(); i < HAL_ESP32_EEPROM_SIZE; i++)
54
-        eeprom_file.write(0xFF);
55
-      eeprom_file.close();
56
-
57
-      eeprom_file = SPIFFS.open(HAL_ESP32_EEPROM_FILE_PATH, "r+");
58
-      file_size = eeprom_file.size();
59
-      if (file_size < HAL_ESP32_EEPROM_SIZE) {
60
-        SERIAL_ERROR_MSG("Failed to expand " HAL_ESP32_EEPROM_FILE_PATH " to required size. SPIFFS partition full?");
61
-        SERIAL_ERROR_START(); SERIAL_ECHOLNPAIR(" file size: ", file_size, ", required size: ", HAL_ESP32_EEPROM_SIZE);
62
-        SERIAL_ERROR_START(); SERIAL_ECHOLNPAIR(" SPIFFS used bytes: ", SPIFFS.usedBytes(), ", total bytes: ", SPIFFS.totalBytes());
63
-      }
64
-    }
65
-    return true;
66
-  }
67
-  return false;
68
-}
69
-
70
-bool PersistentStore::access_finish() {
71
-  eeprom_file.close();
72
-  return true;
73
-}
74
-
75
-bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
76
-  if (!eeprom_file.seek(pos)) return true; // return true for any error
77
-  if (eeprom_file.write(value, size) != size) return true;
78
-
79
-  crc16(crc, value, size);
80
-  pos += size;
81
-
82
-  return false;
83
-}
84
-
85
-bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
86
-  if (!eeprom_file.seek(pos)) return true; // return true for any error
87
-
88
-  if (writing) {
89
-    if (eeprom_file.read(value, size) != size) return true;
90
-    crc16(crc, value, size);
91
-  }
92
-  else {
93
-    uint8_t tmp[size];
94
-    if (eeprom_file.read(tmp, size) != size) return true;
95
-    crc16(crc, tmp, size);
96
-  }
97
-
98
-  pos += size;
99
-
100
-  return false;
101
-}
102
-
103
-size_t PersistentStore::capacity() { return HAL_ESP32_EEPROM_SIZE; }
104
-
105
-#endif // EEPROM_SETTINGS
106
-#endif // ARDUINO_ARCH_ESP32

+ 1
- 1
Marlin/src/HAL/HAL_ESP32/spiffs.cpp View File

@@ -24,7 +24,7 @@
24 24
 
25 25
 #include "../../inc/MarlinConfigPre.h"
26 26
 
27
-#if EITHER(WEBSUPPORT, EEPROM_SETTINGS)
27
+#if ENABLED(WEBSUPPORT)
28 28
 
29 29
 #include "../../core/serial.h"
30 30
 

+ 11
- 1
Marlin/src/HAL/HAL_ESP32/watchdog.h View File

@@ -21,8 +21,18 @@
21 21
  */
22 22
 #pragma once
23 23
 
24
+#ifdef __cplusplus
25
+  extern "C" {
26
+#endif
27
+
28
+    esp_err_t esp_task_wdt_reset();
29
+
30
+#ifdef __cplusplus
31
+  }
32
+#endif
33
+
24 34
 // Initialize watchdog with a 4 second interrupt time
25 35
 void watchdog_init();
26 36
 
27 37
 // Reset watchdog.
28
-inline void HAL_watchdog_refresh() {}
38
+inline void HAL_watchdog_refresh() { esp_task_wdt_reset(); }

+ 4
- 0
Marlin/src/HAL/HAL_LPC1768/inc/SanityCheck.h View File

@@ -68,3 +68,7 @@
68 68
 #if IS_RE_ARM_BOARD && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI)
69 69
   #error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 require TMC_USE_SW_SPI"
70 70
 #endif
71
+
72
+#if ENABLED(BAUD_RATE_GCODE)
73
+  #error "BAUD_RATE_GCODE is not yet supported on LPC176x."
74
+#endif

+ 1
- 1
Marlin/src/HAL/HAL_SAMD51/inc/SanityCheck.h View File

@@ -36,7 +36,7 @@
36 36
 #endif
37 37
 
38 38
 #if ENABLED(SDIO_SUPPORT)
39
-  #error "SDIO_SUPPORT is not supported."
39
+  #error "SDIO_SUPPORT is not supported on SAMD51."
40 40
 #endif
41 41
 
42 42
 #if ENABLED(FAST_PWM_FAN)

+ 7
- 0
Marlin/src/HAL/HAL_STM32/HAL_SPI.cpp View File

@@ -83,6 +83,13 @@ void spiInit(uint8_t spiRate) {
83 83
   }
84 84
   spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0);
85 85
 
86
+  #if ENABLED(CUSTOM_SPI_PINS)
87
+    SPI.setMISO(MISO_PIN);
88
+    SPI.setMOSI(MOSI_PIN);
89
+    SPI.setSCLK(SCK_PIN);
90
+    SPI.setSSEL(SS_PIN);
91
+  #endif
92
+
86 93
   SPI.begin();
87 94
 }
88 95
 

+ 14
- 9
Marlin/src/HAL/HAL_STM32/Servo.cpp View File

@@ -28,25 +28,30 @@
28 28
 
29 29
 #include "Servo.h"
30 30
 
31
-uint8_t servoPin[MAX_SERVOS] = { 0 };
31
+static uint_fast8_t servoCount = 0;
32
+constexpr millis_t servoDelay[] = SERVO_DELAY;
33
+static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
34
+
35
+libServo::libServo()
36
+: delay(servoDelay[servoCount++])
37
+{}
32 38
 
33 39
 int8_t libServo::attach(const int pin) {
34
-  if (servoIndex >= MAX_SERVOS) return -1;
35
-  if (pin > 0) servoPin[servoIndex] = pin;
36
-  return super::attach(servoPin[servoIndex]);
40
+  if (servoCount >= MAX_SERVOS) return -1;
41
+  if (pin > 0) servo_pin = pin;
42
+  return super::attach(servo_pin);
37 43
 }
38 44
 
39 45
 int8_t libServo::attach(const int pin, const int min, const int max) {
40
-  if (pin > 0) servoPin[servoIndex] = pin;
41
-  return super::attach(servoPin[servoIndex], min, max);
46
+  if (servoCount >= MAX_SERVOS) return -1;
47
+  if (pin > 0) servo_pin = pin;
48
+  return super::attach(servo_pin, min, max);
42 49
 }
43 50
 
44 51
 void libServo::move(const int value) {
45
-  constexpr uint16_t servo_delay[] = SERVO_DELAY;
46
-  static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
47 52
   if (attach(0) >= 0) {
48 53
     write(value);
49
-    safe_delay(servo_delay[servoIndex]);
54
+    safe_delay(delay);
50 55
     #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE)
51 56
       detach();
52 57
     #endif

+ 4
- 2
Marlin/src/HAL/HAL_STM32/Servo.h View File

@@ -27,11 +27,13 @@
27 27
 // Inherit and expand on the official library
28 28
 class libServo : public Servo {
29 29
   public:
30
+    libServo();
30 31
     int8_t attach(const int pin);
31 32
     int8_t attach(const int pin, const int min, const int max);
32 33
     void move(const int value);
33 34
   private:
34 35
     typedef Servo super;
35
-    uint16_t min_ticks, max_ticks;
36
-    uint8_t servoIndex;               // index into the channel data for this servo
36
+
37
+    int servo_pin = 0;
38
+    millis_t delay = 0;
37 39
 };

+ 1
- 1
Marlin/src/HAL/HAL_STM32/SoftwareSerial.cpp View File

@@ -34,7 +34,7 @@
34 34
 //
35 35
 // Includes
36 36
 //
37
-#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
37
+#if defined(PLATFORMIO) && defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
38 38
 
39 39
 #include "SoftwareSerial.h"
40 40
 #include "timers.h"

+ 265
- 0
Marlin/src/HAL/HAL_STM32/persistent_store_flash.cpp View File

@@ -0,0 +1,265 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ *
4
+ * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
5
+ * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
6
+ * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
7
+ * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
8
+ *
9
+ * This program is free software: you can redistribute it and/or modify
10
+ * it under the terms of the GNU General Public License as published by
11
+ * the Free Software Foundation, either version 3 of the License, or
12
+ * (at your option) any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
+ * GNU General Public License for more details.
18
+ *
19
+ * You should have received a copy of the GNU General Public License
20
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
+ *
22
+ */
23
+
24
+#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
25
+
26
+#include "../../inc/MarlinConfig.h"
27
+
28
+#if BOTH(EEPROM_SETTINGS, FLASH_EEPROM_EMULATION)
29
+
30
+#include "../shared/persistent_store_api.h"
31
+
32
+
33
+// Only STM32F4 can support wear leveling at this time
34
+#ifndef STM32F4xx
35
+  #undef FLASH_EEPROM_LEVELING
36
+#endif
37
+
38
+/**
39
+ * The STM32 HAL supports chips that deal with "pages" and some with "sectors" and some that
40
+ * even have multiple "banks" of flash.
41
+ *
42
+ * This code is a bit of a mashup of
43
+ *   framework-arduinoststm32/cores/arduino/stm32/stm32_eeprom.c
44
+ *   hal/hal_lpc1768/persistent_store_flash.cpp
45
+ *
46
+ * This has only be written against those that use a single "sector" design.
47
+ *
48
+ * Those that deal with "pages" could be made to work. Looking at the STM32F07 for example, there are
49
+ * 128 "pages", each 2kB in size. If we continued with our EEPROM being 4Kb, we'd always need to operate
50
+ * on 2 of these pages. Each write, we'd use 2 different pages from a pool of pages until we are done.
51
+ */
52
+
53
+#if ENABLED(FLASH_EEPROM_LEVELING)
54
+
55
+  #include "stm32_def.h"
56
+
57
+  #define DEBUG_OUT ENABLED(EEPROM_CHITCHAT)
58
+  #include "src/core/debug_out.h"
59
+
60
+  #ifndef EEPROM_SIZE
61
+    #define EEPROM_SIZE           0x1000  // 4kB
62
+  #endif
63
+
64
+  #ifndef FLASH_SECTOR
65
+    #define FLASH_SECTOR          (FLASH_SECTOR_TOTAL - 1)
66
+  #endif
67
+  #ifndef FLASH_UNIT_SIZE
68
+    #define FLASH_UNIT_SIZE       0x20000 // 128kB
69
+  #endif
70
+
71
+  #define FLASH_ADDRESS_START     (FLASH_END - ((FLASH_SECTOR_TOTAL - FLASH_SECTOR) * FLASH_UNIT_SIZE) + 1)
72
+  #define FLASH_ADDRESS_END       (FLASH_ADDRESS_START + FLASH_UNIT_SIZE  - 1)
73
+
74
+  #define EEPROM_SLOTS            (FLASH_UNIT_SIZE/EEPROM_SIZE)
75
+  #define SLOT_ADDRESS(slot)      (FLASH_ADDRESS_START + (slot * EEPROM_SIZE))
76
+
77
+  #define UNLOCK_FLASH()          if (!flash_unlocked) { \
78
+                                    HAL_FLASH_Unlock(); \
79
+                                    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \
80
+                                                           FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); \
81
+                                    flash_unlocked = true; \
82
+                                  }
83
+  #define LOCK_FLASH()            if (flash_unlocked) { HAL_FLASH_Lock(); flash_unlocked = false; }
84
+
85
+  #define EMPTY_UINT32            ((uint32_t)-1)
86
+  #define EMPTY_UINT8             ((uint8_t)-1)
87
+
88
+  static uint8_t ram_eeprom[EEPROM_SIZE] __attribute__((aligned(4))) = {0};
89
+  static int current_slot = -1;
90
+
91
+  static_assert(0 == EEPROM_SIZE % 4, "EEPROM_SIZE must be a multiple of 4"); // Ensure copying as uint32_t is safe
92
+  static_assert(0 == FLASH_UNIT_SIZE % EEPROM_SIZE, "EEPROM_SIZE must divide evenly into your FLASH_UNIT_SIZE");
93
+  static_assert(FLASH_UNIT_SIZE >= EEPROM_SIZE, "FLASH_UNIT_SIZE must be greater than or equal to your EEPROM_SIZE");
94
+  static_assert(IS_FLASH_SECTOR(FLASH_SECTOR), "FLASH_SECTOR is invalid");
95
+  static_assert(IS_POWER_OF_2(FLASH_UNIT_SIZE), "FLASH_UNIT_SIZE should be a power of 2, please check your chip's spec sheet");
96
+
97
+#endif
98
+
99
+static bool eeprom_data_written = false;
100
+
101
+bool PersistentStore::access_start() {
102
+
103
+  #if ENABLED(FLASH_EEPROM_LEVELING)
104
+
105
+    if (current_slot == -1 || eeprom_data_written) {
106
+      // This must be the first time since power on that we have accessed the storage, or someone
107
+      // loaded and called write_data and never called access_finish.
108
+      // Lets go looking for the slot that holds our configuration.
109
+      if (eeprom_data_written) DEBUG_ECHOLN("Dangling EEPROM write_data");
110
+      uint32_t address = FLASH_ADDRESS_START;
111
+      while (address <= FLASH_ADDRESS_END) {
112
+        uint32_t address_value = (*(__IO uint32_t*)address);
113
+        if (address_value != EMPTY_UINT32) {
114
+          current_slot = (address - FLASH_ADDRESS_START) / EEPROM_SIZE;
115
+          break;
116
+        }
117
+        address += sizeof(uint32_t);
118
+      }
119
+      if (current_slot == -1) {
120
+        // We didn't find anything, so we'll just intialize to empty
121
+        for (int i = 0; i < EEPROM_SIZE; i++) ram_eeprom[i] = EMPTY_UINT8;
122
+        current_slot = EEPROM_SLOTS;
123
+      }
124
+      else {
125
+        // load current settings
126
+        uint8_t *eeprom_data = (uint8_t *)SLOT_ADDRESS(current_slot);
127
+        for (int i = 0; i < EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i];
128
+        DEBUG_ECHOLNPAIR("EEPROM loaded from slot ", current_slot, ".");
129
+      }
130
+      eeprom_data_written = false;
131
+    }
132
+
133
+  #else
134
+    eeprom_buffer_fill();
135
+  #endif
136
+
137
+  return true;
138
+}
139
+
140
+bool PersistentStore::access_finish() {
141
+
142
+  if (eeprom_data_written) {
143
+
144
+    #if ENABLED(FLASH_EEPROM_LEVELING)
145
+
146
+      HAL_StatusTypeDef status = HAL_ERROR;
147
+      bool flash_unlocked = false;
148
+
149
+      if (--current_slot < 0) {
150
+        // all slots have been used, erase everything and start again
151
+
152
+        FLASH_EraseInitTypeDef EraseInitStruct;
153
+        uint32_t SectorError = 0;
154
+
155
+        EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
156
+        EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
157
+        EraseInitStruct.Sector = FLASH_SECTOR;
158
+        EraseInitStruct.NbSectors = 1;
159
+
160
+        current_slot = EEPROM_SLOTS - 1;
161
+        UNLOCK_FLASH();
162
+
163
+        status = HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);
164
+        if (status != HAL_OK) {
165
+          DEBUG_ECHOLNPAIR("HAL_FLASHEx_Erase=", status);
166
+          DEBUG_ECHOLNPAIR("GetError=", HAL_FLASH_GetError());
167
+          DEBUG_ECHOLNPAIR("SectorError=", SectorError);
168
+          LOCK_FLASH();
169
+          return false;
170
+        }
171
+      }
172
+
173
+      UNLOCK_FLASH();
174
+
175
+      uint32_t offset = 0;
176
+      uint32_t address = SLOT_ADDRESS(current_slot);
177
+      uint32_t address_end = address + EEPROM_SIZE;
178
+      uint32_t data = 0;
179
+
180
+      bool success = true;
181
+
182
+      while (address < address_end) {
183
+        memcpy(&data, ram_eeprom + offset, sizeof(uint32_t));
184
+        status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data);
185
+        if (status == HAL_OK) {
186
+          address += sizeof(uint32_t);
187
+          offset += sizeof(uint32_t);
188
+        }
189
+        else {
190
+          DEBUG_ECHOLNPAIR("HAL_FLASH_Program=", status);
191
+          DEBUG_ECHOLNPAIR("GetError=", HAL_FLASH_GetError());
192
+          DEBUG_ECHOLNPAIR("address=", address);
193
+          success = false;
194
+          break;
195
+        }
196
+      }
197
+
198
+      LOCK_FLASH();
199
+
200
+      if (success) {
201
+        eeprom_data_written = false;
202
+        DEBUG_ECHOLNPAIR("EEPROM saved to slot ", current_slot, ".");
203
+      }
204
+
205
+      return success;
206
+
207
+    #else
208
+      eeprom_buffer_flush();
209
+      eeprom_data_written = false;
210
+    #endif
211
+  }
212
+
213
+  return true;
214
+}
215
+
216
+bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
217
+  while (size--) {
218
+    uint8_t v = *value;
219
+    #if ENABLED(FLASH_EEPROM_LEVELING)
220
+      if (v != ram_eeprom[pos]) {
221
+        ram_eeprom[pos] = v;
222
+        eeprom_data_written = true;
223
+      }
224
+    #else
225
+      if (v != eeprom_buffered_read_byte(pos)) {
226
+        eeprom_buffered_write_byte(pos, v);
227
+        eeprom_data_written = true;
228
+      }
229
+    #endif
230
+    crc16(crc, &v, 1);
231
+    pos++;
232
+    value++;
233
+  }
234
+  return false;
235
+}
236
+
237
+bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
238
+  do {
239
+    const uint8_t c = (
240
+      #if ENABLED(FLASH_EEPROM_LEVELING)
241
+        ram_eeprom[pos]
242
+      #else
243
+        eeprom_buffered_read_byte(pos)
244
+      #endif
245
+    );
246
+    if (writing) *value = c;
247
+    crc16(crc, &c, 1);
248
+    pos++;
249
+    value++;
250
+  } while (--size);
251
+  return false;
252
+}
253
+
254
+size_t PersistentStore::capacity() {
255
+  return (
256
+    #if ENABLED(FLASH_EEPROM_LEVELING)
257
+      EEPROM_SIZE
258
+    #else
259
+      E2END + 1
260
+    #endif
261
+  );
262
+}
263
+
264
+#endif // EEPROM_SETTINGS && FLASH_EEPROM_EMULATION
265
+#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC

+ 2
- 23
Marlin/src/HAL/HAL_STM32/persistent_store_impl.cpp View File

@@ -24,29 +24,15 @@
24 24
 
25 25
 #include "../../inc/MarlinConfig.h"
26 26
 
27
-#if ENABLED(EEPROM_SETTINGS) && ANY(FLASH_EEPROM_EMULATION, SRAM_EEPROM_EMULATION, SPI_EEPROM, I2C_EEPROM)
27
+#if ENABLED(EEPROM_SETTINGS) && ANY(SRAM_EEPROM_EMULATION, SPI_EEPROM, I2C_EEPROM)
28 28
 
29 29
 #include "../shared/persistent_store_api.h"
30 30
 
31
-#if ENABLED(FLASH_EEPROM_EMULATION)
32
-  #include <EEPROM.h>
33
-  static bool eeprom_data_written = false;
34
-#endif
35
-
36 31
 bool PersistentStore::access_start() {
37
-  #if ENABLED(FLASH_EEPROM_EMULATION)
38
-    eeprom_buffer_fill();
39
-  #endif
40 32
   return true;
41 33
 }
42 34
 
43 35
 bool PersistentStore::access_finish() {
44
-  #if ENABLED(FLASH_EEPROM_EMULATION)
45
-    if (eeprom_data_written) {
46
-      eeprom_buffer_flush();
47
-      eeprom_data_written = false;
48
-    }
49
-  #endif
50 36
   return true;
51 37
 }
52 38
 
@@ -66,8 +52,6 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
66 52
           return true;
67 53
         }
68 54
       }
69
-    #elif ENABLED(FLASH_EEPROM_EMULATION)
70
-      eeprom_buffered_write_byte(pos, v);
71 55
     #else
72 56
       *(__IO uint8_t *)(BKPSRAM_BASE + (uint8_t * const)pos) = v;
73 57
     #endif
@@ -76,9 +60,6 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
76 60
     pos++;
77 61
     value++;
78 62
   };
79
-  #if ENABLED(FLASH_EEPROM_EMULATION)
80
-    eeprom_data_written = true;
81
-  #endif
82 63
 
83 64
   return false;
84 65
 }
@@ -89,8 +70,6 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t
89 70
     const uint8_t c = (
90 71
       #if EITHER(SPI_EEPROM, I2C_EEPROM)
91 72
         eeprom_read_byte((uint8_t*)pos)
92
-      #elif ENABLED(FLASH_EEPROM_EMULATION)
93
-        eeprom_buffered_read_byte(pos)
94 73
       #else
95 74
         (*(__IO uint8_t *)(BKPSRAM_BASE + ((uint8_t*)pos)))
96 75
       #endif
@@ -114,5 +93,5 @@ size_t PersistentStore::capacity() {
114 93
   );
115 94
 }
116 95
 
117
-#endif // EEPROM_SETTINGS && (FLASH_EEPROM_EMULATION || SRAM_EEPROM_EMULATION || SPI_EEPROM || I2C_EEPROM)
96
+#endif // EEPROM_SETTINGS && (SRAM_EEPROM_EMULATION || SPI_EEPROM || I2C_EEPROM)
118 97
 #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC

+ 45
- 25
Marlin/src/HAL/HAL_STM32F1/persistent_store_flash.cpp View File

@@ -40,53 +40,73 @@
40 40
 #include <EEPROM.h>
41 41
 
42 42
 // Store settings in the last two pages
43
-// Flash pages must be erased before writing, so keep track.
44
-bool firstWrite = false;
43
+#define EEPROM_SIZE (EEPROM_PAGE_SIZE * 2)
44
+#define ACCESS_FINISHED(TF) do{ FLASH_Lock(); eeprom_dirty = false; return TF; }while(0)
45
+
46
+static uint8_t ram_eeprom[EEPROM_SIZE] __attribute__((aligned(4))) = {0};
47
+static bool eeprom_dirty = false;
45 48
 
46 49
 bool PersistentStore::access_start() {
47
-  firstWrite = true;
50
+  const uint32_t* source = reinterpret_cast<const uint32_t*>(EEPROM_PAGE0_BASE);
51
+  uint32_t* destination = reinterpret_cast<uint32_t*>(ram_eeprom);
52
+
53
+  static_assert(0 == EEPROM_SIZE % 4, "EEPROM_SIZE is corrupted. (Must be a multiple of 4.)"); // Ensure copying as uint32_t is safe
54
+  constexpr size_t eeprom_size_u32 = EEPROM_SIZE / 4;
55
+
56
+  for (size_t i = 0; i < eeprom_size_u32; ++i, ++destination, ++source)
57
+    *destination = *source;
58
+
59
+  eeprom_dirty = false;
48 60
   return true;
49 61
 }
50 62
 
51 63
 bool PersistentStore::access_finish() {
52
-  FLASH_Lock();
53
-  firstWrite = false;
54
-  return true;
55
-}
56 64
 
57
-bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
58
-  FLASH_Status status;
65
+  if (eeprom_dirty) {
66
+    FLASH_Status status;
59 67
 
60
-  if (firstWrite) {
68
+    // Instead of erasing all (both) pages, maybe in the loop we check what page we are in, and if the
69
+    // data has changed in that page. We then erase the first time we "detect" a change. In theory, if
70
+    // nothing changed in a page, we wouldn't need to erase/write it.
71
+    // Or, instead of checking at this point, turn eeprom_dirty into an array of bool the size of number
72
+    // of pages. Inside write_data, we set the flag to true at that time if something in that
73
+    // page changes...either way, something to look at later.
61 74
     FLASH_Unlock();
75
+
62 76
     status = FLASH_ErasePage(EEPROM_PAGE0_BASE);
63
-    if (status != FLASH_COMPLETE) return true;
77
+    if (status != FLASH_COMPLETE) ACCESS_FINISHED(true);
64 78
     status = FLASH_ErasePage(EEPROM_PAGE1_BASE);
65
-    if (status != FLASH_COMPLETE) return true;
66
-    firstWrite = false;
67
-  }
79
+    if (status != FLASH_COMPLETE) ACCESS_FINISHED(true);
80
+
81
+    const uint16_t *source = reinterpret_cast<const uint16_t*>(ram_eeprom);
82
+    for (size_t i = 0; i < EEPROM_SIZE; i += 2, ++source) {
83
+      if (FLASH_ProgramHalfWord(EEPROM_PAGE0_BASE + i, *source) != FLASH_COMPLETE)
84
+        ACCESS_FINISHED(false);
85
+    }
68 86
 
69
-  for (size_t i = 0; i < size; i++) {
70
-    if (FLASH_ProgramHalfWord(EEPROM_PAGE0_BASE + (pos + i) * 2, value[i]) != FLASH_COMPLETE)
71
-      return true;
87
+    ACCESS_FINISHED(true);
72 88
   }
73 89
 
90
+  return true;
91
+}
92
+
93
+bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
94
+  for (size_t i = 0; i < size; ++i) ram_eeprom[pos + i] = value[i];
95
+  eeprom_dirty = true;
74 96
   crc16(crc, value, size);
75 97
   pos += size;
76
-  return false;
98
+  return false;  // return true for any error
77 99
 }
78 100
 
79 101
 bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) {
80
-  for (size_t i = 0; i < size; i++) {
81
-    uint8_t v = *(uint16_t *)(EEPROM_PAGE0_BASE + (pos + i) * 2);
82
-    if (writing) value[i] = v;
83
-    crc16(crc, &v, 1);
84
-  }
102
+  const uint8_t * const buff = writing ? &value[0] : &ram_eeprom[pos];
103
+  if (writing) for (size_t i = 0; i < size; i++) value[i] = ram_eeprom[pos + i];
104
+  crc16(crc, buff, size);
85 105
   pos += size;
86
-  return false;
106
+  return false;  // return true for any error
87 107
 }
88 108
 
89
-size_t PersistentStore::capacity() { return size_t(E2END + 1); }
109
+size_t PersistentStore::capacity() { return EEPROM_SIZE; }
90 110
 
91 111
 #endif // EEPROM_SETTINGS && EEPROM FLASH
92 112
 #endif // __STM32F1__

+ 1
- 1
Marlin/src/Marlin.cpp View File

@@ -553,7 +553,7 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
553 553
         bool oldstatus;
554 554
         switch (active_extruder) {
555 555
           default:
556
-          #define _CASE_EN(N) case N: oldstatus = E##N_ENABLE_READ(); enable_E##N(); break;
556
+          #define _CASE_EN(N) case N: oldstatus = E##N##_ENABLE_READ(); enable_E##N(); break;
557 557
           REPEAT(E_STEPPERS, _CASE_EN);
558 558
         }
559 559
       #endif

+ 29
- 21
Marlin/src/core/boards.h View File

@@ -64,7 +64,7 @@
64 64
 #define BOARD_MKS_BASE_HEROIC         1108  // MKS BASE 1.0 with Heroic HR4982 stepper drivers
65 65
 #define BOARD_MKS_GEN_13              1109  // MKS GEN v1.3 or 1.4
66 66
 #define BOARD_MKS_GEN_L               1110  // MKS GEN L
67
-#define BOARD_KFB_2                   1111  // Bigtreetech or BIQU KFB2.0
67
+#define BOARD_KFB_2                   1111  // BigTreeTech or BIQU KFB2.0
68 68
 #define BOARD_ZRIB_V20                1112  // zrib V2.0 control board (Chinese knock off RAMPS replica)
69 69
 #define BOARD_FELIX2                  1113  // Felix 2.0+ Electronics Board (RAMPS like)
70 70
 #define BOARD_RIGIDBOARD              1114  // Invent-A-Part RigidBoard
@@ -208,14 +208,15 @@
208 208
 #define BOARD_COHESION3D_MINI         2011  // Cohesion3D Mini
209 209
 #define BOARD_SMOOTHIEBOARD           2012  // Smoothieboard
210 210
 #define BOARD_AZTEEG_X5_MINI_WIFI     2013  // Azteeg X5 Mini Wifi (Power outputs: Hotend0, Bed, Fan)
211
-#define BOARD_BIGTREE_SKR_V1_1        2014  // BIGTREE SKR_V1.1 (Power outputs: Hotend0,Hotend1, Fan, Bed)
212
-#define BOARD_BIQU_B300_V1_0          2015  // BIQU B300_V1.0 (Power outputs: Hotend0, Fan, Bed, SPI Driver)
213
-#define BOARD_BIGTREE_SKR_V1_3        2016  // BIGTREE SKR_V1.3 (Power outputs: Hotend0, Hotend1, Fan, Bed)
214
-#define BOARD_AZTEEG_X5_MINI          2017  // Azteeg X5 Mini (Power outputs: Hotend0, Bed, Fan)
215
-#define BOARD_MKS_SGEN                2018  // MKS-SGen (Power outputs: Hotend0, Hotend1, Bed, Fan)
216
-#define BOARD_MKS_SGEN_L              2019  // MKS-SGen-L (Power outputs: Hotend0, Hotend1, Bed, Fan)
217
-#define BOARD_TH3D_EZBOARD            2020  // TH3D EZBoard v1.0
218
-#define BOARD_GMARSH_X6_REV1          2021  // GMARSH X6 board, revision 1 prototype
211
+#define BOARD_BIQU_B300_V1_0          2014  // BIQU B300_V1.0 (Power outputs: Hotend0, Fan, Bed, SPI Driver)
212
+#define BOARD_AZTEEG_X5_MINI          2015  // Azteeg X5 Mini (Power outputs: Hotend0, Bed, Fan)
213
+#define BOARD_MKS_SGEN                2016  // MKS-SGen (Power outputs: Hotend0, Hotend1, Bed, Fan)
214
+#define BOARD_MKS_SGEN_L              2017  // MKS-SGen-L (Power outputs: Hotend0, Hotend1, Bed, Fan)
215
+#define BOARD_TH3D_EZBOARD            2018  // TH3D EZBoard v1.0
216
+#define BOARD_GMARSH_X6_REV1          2019  // GMARSH X6 board, revision 1 prototype
217
+#define BOARD_BIGTREE_SKR_V1_1        2020  // BigTreeTech SKR v1.1 (Power outputs: Hotend0, Hotend1, Fan, Bed)
218
+#define BOARD_BIGTREE_SKR_V1_3        2021  // BigTreeTech SKR v1.3 (Power outputs: Hotend0, Hotend1, Fan, Bed)
219
+#define BOARD_BIGTREE_SKR_V1_4        2022  // BigTreeTech SKR v1.4 (Power outputs: Hotend0, Hotend1, Fan, Bed)
219 220
 
220 221
 //
221 222
 // SAM3X8E ARM Cortex M3
@@ -269,18 +270,21 @@
269 270
 #define BOARD_MKS_ROBIN_MINI          4007  // MKS Robin Mini (STM32F103VET6)
270 271
 #define BOARD_MKS_ROBIN_NANO          4008  // MKS Robin Nano (STM32F103VET6)
271 272
 #define BOARD_MKS_ROBIN_LITE          4009  // MKS Robin Lite/Lite2 (STM32F103RCT6)
272
-#define BOARD_BIGTREE_SKR_MINI_V1_1   4010  // BigTreeTech SKR Mini v1.1 (STM32F103RC)
273
-#define BOARD_BTT_SKR_MINI_E3_V1_0    4011  // BigTreeTech SKR Mini E3 (STM32F103RC)
274
-#define BOARD_BTT_SKR_MINI_E3_V1_2    4012  // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC)
275
-#define BOARD_BIGTREE_SKR_E3_DIP      4013  // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE)
276
-#define BOARD_JGAURORA_A5S_A1         4014  // JGAurora A5S A1 (STM32F103ZET6)
277
-#define BOARD_FYSETC_AIO_II           4015  // FYSETC AIO_II
278
-#define BOARD_FYSETC_CHEETAH          4016  // FYSETC Cheetah
279
-#define BOARD_FYSETC_CHEETAH_V12      4017  // FYSETC Cheetah V1.2
280
-#define BOARD_LONGER3D_LK             4018  // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6
281
-#define BOARD_GTM32_MINI              4019  // STM32F103VET6 controller
282
-#define BOARD_GTM32_MINI_A30          4020  // STM32F103VET6 controller
283
-#define BOARD_GTM32_REV_B             4021  // STM32F103VET6 controller
273
+#define BOARD_MKS_ROBIN_LITE3         4010  // MKS Robin Lite3 (STM32F103RCT6)
274
+#define BOARD_MKS_ROBIN_PRO           4011  // MKS Robin Pro (STM32F103ZET6)
275
+#define BOARD_BIGTREE_SKR_MINI_V1_1   4012  // BigTreeTech SKR Mini v1.1 (STM32F103RC)
276
+#define BOARD_BTT_SKR_MINI_E3_V1_0    4013  // BigTreeTech SKR Mini E3 (STM32F103RC)
277
+#define BOARD_BTT_SKR_MINI_E3_V1_2    4014  // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC)
278
+#define BOARD_BIGTREE_SKR_E3_DIP      4015  // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE)
279
+#define BOARD_JGAURORA_A5S_A1         4016  // JGAurora A5S A1 (STM32F103ZET6)
280
+#define BOARD_FYSETC_AIO_II           4017  // FYSETC AIO_II
281
+#define BOARD_FYSETC_CHEETAH          4018  // FYSETC Cheetah
282
+#define BOARD_FYSETC_CHEETAH_V12      4019  // FYSETC Cheetah V1.2
283
+#define BOARD_LONGER3D_LK             4020  // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6
284
+#define BOARD_GTM32_MINI              4021  // STM32F103VET6 controller
285
+#define BOARD_GTM32_MINI_A30          4022  // STM32F103VET6 controller
286
+#define BOARD_GTM32_REV_B             4023  // STM32F103VET6 controller
287
+
284 288
 
285 289
 //
286 290
 // ARM Cortex-M4F
@@ -306,6 +310,8 @@
306 310
 #define BOARD_LERDGE_X                4210  // Lerdge X (STM32F407VE)
307 311
 #define BOARD_VAKE403D                4211  // VAkE 403D (STM32F446VET6)
308 312
 #define BOARD_FYSETC_S6               4212  // FYSETC S6 board
313
+#define BOARD_FLYF407ZG               4213  // FLYF407ZG board (STM32F407ZG)
314
+#define BOARD_MKS_ROBIN2              4214  // MKS_ROBIN2 (STM32F407ZE)
309 315
 
310 316
 //
311 317
 // ARM Cortex M7
@@ -318,6 +324,8 @@
318 324
 // Espressif ESP32 WiFi
319 325
 //
320 326
 #define BOARD_ESPRESSIF_ESP32         6000
327
+#define BOARD_MRR_ESPA                6001
328
+#define BOARD_MRR_ESPE                6002
321 329
 
322 330
 //
323 331
 // Simulations

+ 4
- 4
Marlin/src/core/language.h View File

@@ -252,10 +252,10 @@
252 252
 #define MSG_FILAMENT_CHANGE_INSERT_M108     "Insert filament and send M108"
253 253
 #define MSG_FILAMENT_CHANGE_WAIT_M108       "Send M108 to resume"
254 254
 
255
-#define MSG_STOP_BLTOUCH                    "STOP called because of BLTouch error - restart with M999"
256
-#define MSG_STOP_UNHOMED                    "STOP called because of unhomed error - restart with M999"
257
-#define MSG_KILL_INACTIVE_TIME              "KILL caused by too much inactive time - current command: "
258
-#define MSG_KILL_BUTTON                     "KILL caused by KILL button/pin"
255
+#define MSG_STOP_BLTOUCH                    "!! STOP called because of BLTouch error - restart with M999"
256
+#define MSG_STOP_UNHOMED                    "!! STOP called because of unhomed error - restart with M999"
257
+#define MSG_KILL_INACTIVE_TIME              "!! KILL caused by too much inactive time - current command: "
258
+#define MSG_KILL_BUTTON                     "!! KILL caused by KILL button/pin"
259 259
 
260 260
 // temperature.cpp strings
261 261
 #define MSG_PID_AUTOTUNE_PREFIX             "PID Autotune"

+ 1
- 1
Marlin/src/core/serial.h View File

@@ -75,7 +75,7 @@ extern uint8_t marlin_debug_flags;
75 75
 #define SERIAL_PRINTF(V...)     SERIAL_OUT(printf, V)
76 76
 #define SERIAL_FLUSH()          SERIAL_OUT(flush)
77 77
 
78
-#ifdef __STM32F1__
78
+#ifdef ARDUINO_ARCH_STM32
79 79
   #define SERIAL_FLUSHTX()      SERIAL_OUT(flush)
80 80
 #elif TX_BUFFER_SIZE > 0
81 81
   #define SERIAL_FLUSHTX()      SERIAL_OUT(flushTX)

+ 2
- 0
Marlin/src/core/utility.cpp View File

@@ -59,6 +59,8 @@ void safe_delay(millis_t ms) {
59 59
     SERIAL_ECHOLNPGM("Probe: "
60 60
       #if ENABLED(PROBE_MANUALLY)
61 61
         "PROBE_MANUALLY"
62
+      #elif ENABLED(NOZZLE_AS_PROBE)
63
+        "NOZZLE_AS_PROBE"
62 64
       #elif ENABLED(FIX_MOUNTED_PROBE)
63 65
         "FIX_MOUNTED_PROBE"
64 66
       #elif ENABLED(BLTOUCH)

+ 1
- 1
Marlin/src/feature/binary_protocol.h View File

@@ -77,7 +77,7 @@ private:
77 77
   static bool file_open(char* filename) {
78 78
     if (!dummy_transfer) {
79 79
       card.mount();
80
-      card.openFile(filename, false);
80
+      card.openFileWrite(filename);
81 81
       if (!card.isFileOpen()) return false;
82 82
     }
83 83
     transfer_active = true;

+ 7
- 3
Marlin/src/feature/pause.cpp View File

@@ -345,13 +345,13 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/,
345 345
   #endif
346 346
 
347 347
   // Retract filament
348
-  do_pause_e_move(-(FILAMENT_UNLOAD_RETRACT_LENGTH) * mix_multiplier, (PAUSE_PARK_RETRACT_FEEDRATE) * mix_multiplier);
348
+  do_pause_e_move(-(FILAMENT_UNLOAD_PURGE_RETRACT) * mix_multiplier, (PAUSE_PARK_RETRACT_FEEDRATE) * mix_multiplier);
349 349
 
350 350
   // Wait for filament to cool
351
-  safe_delay(FILAMENT_UNLOAD_DELAY);
351
+  safe_delay(FILAMENT_UNLOAD_PURGE_DELAY);
352 352
 
353 353
   // Quickly purge
354
-  do_pause_e_move((FILAMENT_UNLOAD_RETRACT_LENGTH + FILAMENT_UNLOAD_PURGE_LENGTH) * mix_multiplier,
354
+  do_pause_e_move((FILAMENT_UNLOAD_PURGE_RETRACT + FILAMENT_UNLOAD_PURGE_LENGTH) * mix_multiplier,
355 355
                   planner.settings.max_feedrate_mm_s[E_AXIS] * mix_multiplier);
356 356
 
357 357
   // Unload filament
@@ -694,6 +694,10 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le
694 694
     thermalManager.set_fans_paused(false);
695 695
   #endif
696 696
 
697
+  #if HAS_FILAMENT_SENSOR
698
+    runout.reset();
699
+  #endif
700
+
697 701
   // Resume the print job timer if it was running
698 702
   if (print_job_timer.isPaused()) print_job_timer.start();
699 703
 

+ 4
- 3
Marlin/src/feature/tmc_util.cpp View File

@@ -1022,7 +1022,7 @@
1022 1022
 #if USE_SENSORLESS
1023 1023
 
1024 1024
   bool tmc_enable_stallguard(TMC2130Stepper &st) {
1025
-    bool stealthchop_was_enabled = st.en_pwm_mode();
1025
+    const bool stealthchop_was_enabled = st.en_pwm_mode();
1026 1026
 
1027 1027
     st.TCOOLTHRS(0xFFFFF);
1028 1028
     st.en_pwm_mode(false);
@@ -1038,9 +1038,10 @@
1038 1038
 
1039 1039
   bool tmc_enable_stallguard(TMC2209Stepper &st) {
1040 1040
     st.TCOOLTHRS(0xFFFFF);
1041
-    return true;
1041
+    return !st.en_spreadCycle();
1042 1042
   }
1043
-  void tmc_disable_stallguard(TMC2209Stepper &st, const bool restore_stealth _UNUSED) {
1043
+  void tmc_disable_stallguard(TMC2209Stepper &st, const bool restore_stealth) {
1044
+    st.en_spreadCycle(!restore_stealth);
1044 1045
     st.TCOOLTHRS(0);
1045 1046
   }
1046 1047
 

+ 5
- 4
Marlin/src/gcode/bedlevel/abl/G29.cpp View File

@@ -403,13 +403,14 @@ G29_TYPE GcodeSuite::G29() {
403 403
       }
404 404
       else {
405 405
         probe_position_lf.set(
406
-          parser.seenval('L') ? (int)RAW_X_POSITION(parser.value_linear_units()) : _MAX(X_CENTER - (X_BED_SIZE) / 2,      x_min),
407
-          parser.seenval('F') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : _MAX(Y_CENTER - (Y_BED_SIZE) / 2,      y_min)
406
+          parser.seenval('L') ? (int)RAW_X_POSITION(parser.value_linear_units()) : (_MAX(x_min, X_CENTER - (X_BED_SIZE) / 2)      + MIN_PROBE_EDGE_LEFT),
407
+          parser.seenval('F') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : (_MAX(y_min, Y_CENTER - (Y_BED_SIZE) / 2)      + MIN_PROBE_EDGE_FRONT)
408 408
         );
409 409
         probe_position_rb.set(
410
-          parser.seenval('R') ? (int)RAW_X_POSITION(parser.value_linear_units()) : _MIN(probe_position_lf.x + X_BED_SIZE, x_max),
411
-          parser.seenval('B') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : _MIN(probe_position_lf.y + Y_BED_SIZE, y_max)
410
+          parser.seenval('R') ? (int)RAW_X_POSITION(parser.value_linear_units()) : (_MIN(x_max, probe_position_lf.x + X_BED_SIZE) - MIN_PROBE_EDGE_RIGHT),
411
+          parser.seenval('B') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : (_MIN(y_max, probe_position_lf.y + Y_BED_SIZE) - MIN_PROBE_EDGE_BACK)
412 412
         );
413
+        SERIAL_ECHOLN("Set Trail 1");
413 414
       }
414 415
 
415 416
       if (

+ 1
- 11
Marlin/src/gcode/calibrate/G28.cpp View File

@@ -262,7 +262,7 @@ void GcodeSuite::G28(const bool always_home_all) {
262 262
 
263 263
   #if HAS_HOMING_CURRENT
264 264
     auto debug_current = [](const char * const s, const int16_t a, const int16_t b){
265
-      DEBUG_ECHO(s); DEBUG_ECHOLNPGM(" current: ", a, " -> ", b);
265
+      DEBUG_ECHO(s); DEBUG_ECHOLNPAIR(" current: ", a, " -> ", b);
266 266
     };
267 267
     #if HAS_CURRENT_HOME(X)
268 268
       const int16_t tmc_save_current_X = stepperX.getMilliamps();
@@ -286,11 +286,6 @@ void GcodeSuite::G28(const bool always_home_all) {
286 286
     #endif
287 287
   #endif
288 288
 
289
-  #if BOTH(STEALTHCHOP_XY, HOME_USING_SPREADCYCLE)
290
-    if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Set XY to spreadCycle...");
291
-    process_subcommands_now_P(PSTR("M569S0XY"));
292
-  #endif
293
-
294 289
   #if ENABLED(IMPROVE_HOMING_RELIABILITY)
295 290
     slow_homing_t slow_homing = begin_slow_homing();
296 291
   #endif
@@ -515,11 +510,6 @@ void GcodeSuite::G28(const bool always_home_all) {
515 510
     #endif
516 511
   #endif
517 512
 
518
-  #if BOTH(STEALTHCHOP_XY, HOME_USING_SPREADCYCLE)
519
-    if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Set XY to StealthChop...");
520
-    process_subcommands_now_P(PSTR("M569S1XY"));
521
-  #endif
522
-
523 513
   ui.refresh();
524 514
 
525 515
   report_current_position();

+ 51
- 18
Marlin/src/gcode/calibrate/G34_M422.cpp View File

@@ -45,29 +45,62 @@
45 45
 #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)
46 46
 #include "../../core/debug_out.h"
47 47
 
48
-// Sanity-check the count of Z_STEPPER_ALIGN_XY points
49
-constexpr xy_pos_t sanity_arr_z_align[] = Z_STEPPER_ALIGN_XY;
48
+//
49
+// Sanity check G34 / M422 settings
50
+//
51
+constexpr xy_pos_t test_z_stepper_align_xy[] = Z_STEPPER_ALIGN_XY;
52
+
50 53
 #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
51
-  static_assert(COUNT(sanity_arr_z_align) >= Z_STEPPER_COUNT,
54
+
55
+  static_assert(COUNT(test_z_stepper_align_xy) >= Z_STEPPER_COUNT,
52 56
     "Z_STEPPER_ALIGN_XY requires at least three {X,Y} entries (Z, Z2, Z3, ...)."
53 57
   );
58
+
59
+  constexpr float test_z_stepper_align_stepper_xy[][XY] = Z_STEPPER_ALIGN_STEPPER_XY;
60
+  static_assert(
61
+    COUNT(test_z_stepper_align_stepper_xy) == Z_STEPPER_COUNT,
62
+    "Z_STEPPER_ALIGN_STEPPER_XY requires three {X,Y} entries (one per Z stepper)."
63
+  );
64
+
54 65
 #else
55
-  static_assert(COUNT(sanity_arr_z_align) == Z_STEPPER_COUNT,
66
+
67
+  static_assert(COUNT(test_z_stepper_align_xy) == Z_STEPPER_COUNT,
56 68
     #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS)
57 69
       "Z_STEPPER_ALIGN_XY requires three {X,Y} entries (Z, Z2, and Z3)."
58 70
     #else
59 71
       "Z_STEPPER_ALIGN_XY requires two {X,Y} entries (Z and Z2)."
60 72
     #endif
61 73
   );
74
+
75
+#endif
76
+
77
+constexpr xyz_pos_t dpo = NOZZLE_TO_PROBE_OFFSET;
78
+
79
+#define LTEST(N) (test_z_stepper_align_xy[N].x >= _MAX(X_MIN_BED + MIN_PROBE_EDGE_LEFT,  X_MIN_POS + dpo.x) - 0.00001f)
80
+#define RTEST(N) (test_z_stepper_align_xy[N].x <= _MIN(X_MAX_BED - MIN_PROBE_EDGE_RIGHT, X_MAX_POS + dpo.x) + 0.00001f)
81
+#define FTEST(N) (test_z_stepper_align_xy[N].y >= _MAX(Y_MIN_BED + MIN_PROBE_EDGE_FRONT, Y_MIN_POS + dpo.y) - 0.00001f)
82
+#define BTEST(N) (test_z_stepper_align_xy[N].y <= _MIN(Y_MAX_BED - MIN_PROBE_EDGE_BACK,  Y_MAX_POS + dpo.y) + 0.00001f)
83
+
84
+static_assert(LTEST(0) && RTEST(0), "The 1st Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset.");
85
+static_assert(FTEST(0) && BTEST(0), "The 1st Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset.");
86
+static_assert(LTEST(1) && RTEST(1), "The 2nd Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset.");
87
+static_assert(FTEST(1) && BTEST(1), "The 2nd Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset.");
88
+
89
+#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS)
90
+  static_assert(LTEST(2) && RTEST(2), "The 3rd Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset.");
91
+  static_assert(FTEST(2) && BTEST(2), "The 3rd Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset.");
62 92
 #endif
63 93
 
64
-static xy_pos_t z_auto_align_pos[Z_STEPPER_COUNT] = Z_STEPPER_ALIGN_XY;
94
+//
95
+// G34 / M422 shared data
96
+//
97
+static xy_pos_t z_stepper_align_pos[] = Z_STEPPER_ALIGN_XY;
65 98
 
66 99
 #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
67
-  static xy_pos_t z_stepper_pos[] = Z_STEPPER_ALIGN_STEPPER_XY;
100
+  static xy_pos_t z_stepper_align_stepper_pos[] = Z_STEPPER_ALIGN_STEPPER_XY;
68 101
 #endif
69 102
 
70
-#define G34_PROBE_COUNT COUNT(z_auto_align_pos)
103
+#define G34_PROBE_COUNT COUNT(z_stepper_align_pos)
71 104
 
72 105
 inline void set_all_z_lock(const bool lock) {
73 106
   stepper.set_z_lock(lock);
@@ -155,11 +188,11 @@ void GcodeSuite::G34() {
155 188
     // iteration this will be re-calculated based on the actual bed position
156 189
     float z_probe = Z_BASIC_CLEARANCE + (G34_MAX_GRADE) * 0.01f * (
157 190
       #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS)
158
-         SQRT(_MAX(HYPOT2(z_auto_align_pos[0].x - z_auto_align_pos[0].y, z_auto_align_pos[1].x - z_auto_align_pos[1].y),
159
-                   HYPOT2(z_auto_align_pos[1].x - z_auto_align_pos[1].y, z_auto_align_pos[2].x - z_auto_align_pos[2].y),
160
-                   HYPOT2(z_auto_align_pos[2].x - z_auto_align_pos[2].y, z_auto_align_pos[0].x - z_auto_align_pos[0].y)))
191
+         SQRT(_MAX(HYPOT2(z_stepper_align_pos[0].x - z_stepper_align_pos[0].y, z_stepper_align_pos[1].x - z_stepper_align_pos[1].y),
192
+                   HYPOT2(z_stepper_align_pos[1].x - z_stepper_align_pos[1].y, z_stepper_align_pos[2].x - z_stepper_align_pos[2].y),
193
+                   HYPOT2(z_stepper_align_pos[2].x - z_stepper_align_pos[2].y, z_stepper_align_pos[0].x - z_stepper_align_pos[0].y)))
161 194
       #else
162
-         HYPOT(z_auto_align_pos[0].x - z_auto_align_pos[0].y, z_auto_align_pos[1].x - z_auto_align_pos[1].y)
195
+         HYPOT(z_stepper_align_pos[0].x - z_stepper_align_pos[0].y, z_stepper_align_pos[1].x - z_stepper_align_pos[1].y)
163 196
       #endif
164 197
     );
165 198
 
@@ -194,7 +227,7 @@ void GcodeSuite::G34() {
194 227
         if (iteration == 0 || i > 0) do_blocking_move_to_z(z_probe);
195 228
 
196 229
         // Probe a Z height for each stepper.
197
-        const float z_probed_height = probe_at_point(z_auto_align_pos[iprobe], raise_after, 0, true);
230
+        const float z_probed_height = probe_at_point(z_stepper_align_pos[iprobe], raise_after, 0, true);
198 231
         if (isnan(z_probed_height)) {
199 232
           SERIAL_ECHOLNPGM("Probing failed.");
200 233
           err_break = true;
@@ -235,13 +268,13 @@ void GcodeSuite::G34() {
235 268
         incremental_LSF_reset(&lfd);
236 269
         for (uint8_t i = 0; i < G34_PROBE_COUNT; ++i) {
237 270
           SERIAL_ECHOLNPAIR("PROBEPT_", int(i + 1), ": ", z_measured[i]);
238
-          incremental_LSF(&lfd, z_auto_align_pos[i], z_measured[i]);
271
+          incremental_LSF(&lfd, z_stepper_align_pos[i], z_measured[i]);
239 272
         }
240 273
         finish_incremental_LSF(&lfd);
241 274
 
242 275
         z_measured_min = 100000.0f;
243 276
         for (uint8_t i = 0; i < Z_STEPPER_COUNT; ++i) {
244
-          z_measured[i] = -(lfd.A * z_stepper_pos[i].x + lfd.B * z_stepper_pos[i].y);
277
+          z_measured[i] = -(lfd.A * z_stepper_align_stepper_pos[i].x + lfd.B * z_stepper_align_stepper_pos[i].y);
245 278
           z_measured_min = _MIN(z_measured_min, z_measured[i]);
246 279
         }
247 280
 
@@ -362,10 +395,10 @@ void GcodeSuite::G34() {
362 395
 void GcodeSuite::M422() {
363 396
   if (!parser.seen_any()) {
364 397
     for (uint8_t i = 0; i < G34_PROBE_COUNT; ++i)
365
-      SERIAL_ECHOLNPAIR_P(PSTR("M422 S"), i + 1, SP_X_STR, z_auto_align_pos[i].x, SP_Y_STR, z_auto_align_pos[i].y);
398
+      SERIAL_ECHOLNPAIR_P(PSTR("M422 S"), i + 1, SP_X_STR, z_stepper_align_pos[i].x, SP_Y_STR, z_stepper_align_pos[i].y);
366 399
     #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
367 400
       for (uint8_t i = 0; i < Z_STEPPER_COUNT; ++i)
368
-        SERIAL_ECHOLNPAIR_P(PSTR("M422 W"), i + 1, SP_X_STR, z_stepper_pos[i].x, SP_Y_STR, z_stepper_pos[i].y);
401
+        SERIAL_ECHOLNPAIR_P(PSTR("M422 W"), i + 1, SP_X_STR, z_stepper_align_stepper_pos[i].x, SP_Y_STR, z_stepper_align_stepper_pos[i].y);
369 402
     #endif
370 403
     return;
371 404
   }
@@ -381,9 +414,9 @@ void GcodeSuite::M422() {
381 414
 
382 415
   xy_pos_t *pos_dest = (
383 416
     #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
384
-      !is_probe_point ? z_stepper_pos :
417
+      !is_probe_point ? z_stepper_align_stepper_pos :
385 418
     #endif
386
-    z_auto_align_pos
419
+    z_stepper_align_pos
387 420
   );
388 421
 
389 422
   if (!is_probe_point

+ 9
- 8
Marlin/src/gcode/calibrate/M100.cpp View File

@@ -51,7 +51,7 @@
51 51
  * Also, there are two support functions that can be called from a developer's C code.
52 52
  *
53 53
  *    uint16_t check_for_free_memory_corruption(PGM_P const free_memory_start);
54
- *    void M100_dump_routine(PGM_P const title, char *start, char *end);
54
+ *    void M100_dump_routine(PGM_P const title, const char * const start, const char * const end);
55 55
  *
56 56
  * Initial version by Roxy-3D
57 57
  */
@@ -151,8 +151,8 @@ inline int32_t count_test_bytes(const char * const start_free_memory) {
151 151
     // Start and end the dump on a nice 16 byte boundary
152 152
     // (even though the values are not 16-byte aligned).
153 153
     //
154
-    start_free_memory = (char*)((ptr_int_t)((uint32_t)start_free_memory & 0xFFFFFFF0)); // Align to 16-byte boundary
155
-    end_free_memory  = (char*)((ptr_int_t)((uint32_t)end_free_memory  | 0x0000000F)); // Align end_free_memory to the 15th byte (at or above end_free_memory)
154
+    start_free_memory = (char*)(ptr_int_t(uint32_t(start_free_memory) & ~0xFUL)); // Align to 16-byte boundary
155
+    end_free_memory   = (char*)(ptr_int_t(uint32_t(end_free_memory)   |  0xFUL)); // Align end_free_memory to the 15th byte (at or above end_free_memory)
156 156
 
157 157
     // Dump command main loop
158 158
     while (start_free_memory < end_free_memory) {
@@ -177,15 +177,16 @@ inline int32_t count_test_bytes(const char * const start_free_memory) {
177 177
     }
178 178
   }
179 179
 
180
-  void M100_dump_routine(PGM_P const title, char *start, char *end) {
180
+  void M100_dump_routine(PGM_P const title, const char * const start, const char * const end) {
181 181
     serialprintPGM(title);
182 182
     SERIAL_EOL();
183 183
     //
184 184
     // Round the start and end locations to produce full lines of output
185 185
     //
186
-    start = (char*)((ptr_int_t)((uint32_t)start & 0xFFFFFFF0)); // Align to 16-byte boundary
187
-    end   = (char*)((ptr_int_t)((uint32_t)end   | 0x0000000F)); // Align end_free_memory to the 15th byte (at or above end_free_memory)
188
-    dump_free_memory(start, end);
186
+    dump_free_memory(
187
+      (char*)(ptr_int_t(uint32_t(start) & ~0xFUL)), // Align to 16-byte boundary
188
+      (char*)(ptr_int_t(uint32_t(end)   |  0xFUL))  // Align end_free_memory to the 15th byte (at or above end_free_memory)
189
+    );
189 190
   }
190 191
 
191 192
 #endif // M100_FREE_MEMORY_DUMPER
@@ -211,7 +212,7 @@ inline int check_for_free_memory_corruption(PGM_P const title) {
211 212
     //   idle();
212 213
     serial_delay(20);
213 214
     #if ENABLED(M100_FREE_MEMORY_DUMPER)
214
-      M100_dump_routine(PSTR("   Memory corruption detected with end_free_memory<Heap\n"), (char*)0x1B80, (char*)0x21FF);
215
+      M100_dump_routine(PSTR("   Memory corruption detected with end_free_memory<Heap\n"), (const char*)0x1B80, (const char*)0x21FF);
215 216
     #endif
216 217
   }
217 218
 

+ 1
- 1
Marlin/src/gcode/feature/camera/M240.cpp View File

@@ -31,7 +31,7 @@
31 31
   millis_t chdk_timeout; // = 0
32 32
 #endif
33 33
 
34
-#ifdef PHOTO_POSITION && PHOTO_DELAY_MS > 0
34
+#if defined(PHOTO_POSITION) && PHOTO_DELAY_MS > 0
35 35
   #include "../../../Marlin.h" // for idle()
36 36
 #endif
37 37
 

+ 3
- 1
Marlin/src/gcode/feature/trinamic/M569.cpp View File

@@ -44,7 +44,9 @@ void tmc_set_stealthChop(TMC &st, const bool enable) {
44 44
 static void set_stealth_status(const bool enable, const int8_t target_extruder) {
45 45
   #define TMC_SET_STEALTH(Q) tmc_set_stealthChop(stepper##Q, enable)
46 46
 
47
-  #if AXIS_HAS_STEALTHCHOP(X) || AXIS_HAS_STEALTHCHOP(X2) || AXIS_HAS_STEALTHCHOP(Y) || AXIS_HAS_STEALTHCHOP(Y2) || AXIS_HAS_STEALTHCHOP(Z) || AXIS_HAS_STEALTHCHOP(Z2) || AXIS_HAS_STEALTHCHOP(Z3)
47
+  #if    AXIS_HAS_STEALTHCHOP(X) || AXIS_HAS_STEALTHCHOP(X2) \
48
+      || AXIS_HAS_STEALTHCHOP(Y) || AXIS_HAS_STEALTHCHOP(Y2) \
49
+      || AXIS_HAS_STEALTHCHOP(Z) || AXIS_HAS_STEALTHCHOP(Z2) || AXIS_HAS_STEALTHCHOP(Z3)
48 50
     const uint8_t index = parser.byteval('I');
49 51
   #endif
50 52
 

+ 2
- 2
Marlin/src/gcode/gcode.cpp View File

@@ -209,7 +209,7 @@ void GcodeSuite::dwell(millis_t time) {
209 209
 // Placeholders for non-migrated codes
210 210
 //
211 211
 #if ENABLED(M100_FREE_MEMORY_WATCHER)
212
-  extern void M100_dump_routine(PGM_P const title, char *start, char *end);
212
+  extern void M100_dump_routine(PGM_P const title, const char * const start, const char * const end);
213 213
 #endif
214 214
 
215 215
 /**
@@ -865,7 +865,7 @@ void GcodeSuite::process_next_command() {
865 865
     SERIAL_ECHOLN(current_command);
866 866
     #if ENABLED(M100_FREE_MEMORY_DUMPER)
867 867
       SERIAL_ECHOPAIR("slot:", queue.index_r);
868
-      M100_dump_routine(PSTR("   Command Queue:"), queue.command_buffer, queue.command_buffer + sizeof(queue.command_buffer));
868
+      M100_dump_routine(PSTR("   Command Queue:"), &queue.command_buffer[0][0], &queue.command_buffer[BUFSIZE - 1][MAX_CMD_SIZE - 1]);
869 869
     #endif
870 870
   }
871 871
 

+ 1
- 1
Marlin/src/gcode/sdcard/M23.cpp View File

@@ -36,7 +36,7 @@
36 36
 void GcodeSuite::M23() {
37 37
   // Simplify3D includes the size, so zero out all spaces (#7227)
38 38
   for (char *fn = parser.string_arg; *fn; ++fn) if (*fn == ' ') *fn = '\0';
39
-  card.openFile(parser.string_arg, true);
39
+  card.openFileRead(parser.string_arg);
40 40
 
41 41
   #if ENABLED(LCD_SET_PROGRESS_MANUALLY)
42 42
     ui.set_progress(0);

+ 2
- 2
Marlin/src/gcode/sdcard/M28_M29.cpp View File

@@ -54,11 +54,11 @@ void GcodeSuite::M28() {
54 54
       #endif
55 55
     }
56 56
     else
57
-      card.openFile(p, false);
57
+      card.openFileWrite(p);
58 58
 
59 59
   #else
60 60
 
61
-    card.openFile(parser.string_arg, false);
61
+    card.openFileWrite(parser.string_arg);
62 62
 
63 63
   #endif
64 64
 }

+ 3
- 4
Marlin/src/gcode/sdcard/M32.cpp View File

@@ -26,8 +26,7 @@
26 26
 
27 27
 #include "../gcode.h"
28 28
 #include "../../sd/cardreader.h"
29
-#include "../../module/printcounter.h"
30
-#include "../../module/planner.h"
29
+#include "../../module/planner.h" // for synchronize()
31 30
 
32 31
 #include "../../Marlin.h" // for startOrResumeJob
33 32
 
@@ -45,9 +44,9 @@ void GcodeSuite::M32() {
45 44
   if (IS_SD_PRINTING()) planner.synchronize();
46 45
 
47 46
   if (card.isMounted()) {
48
-    const bool call_procedure = parser.boolval('P');
47
+    const uint8_t call_procedure = parser.boolval('P');
49 48
 
50
-    card.openFile(parser.string_arg, true, call_procedure);
49
+    card.openFileRead(parser.string_arg, call_procedure);
51 50
 
52 51
     if (parser.seenval('S')) card.setIndex(parser.value_long());
53 52
 

+ 2
- 2
Marlin/src/inc/Conditionals_LCD.h View File

@@ -290,7 +290,7 @@
290 290
 
291 291
 #ifndef STD_ENCODER_PULSES_PER_STEP
292 292
   #if ENABLED(TOUCH_BUTTONS)
293
-    #define STD_ENCODER_PULSES_PER_STEP 1
293
+    #define STD_ENCODER_PULSES_PER_STEP 2
294 294
   #else
295 295
     #define STD_ENCODER_PULSES_PER_STEP 5
296 296
   #endif
@@ -496,7 +496,7 @@
496 496
 /**
497 497
  * Set flags for enabled probes
498 498
  */
499
-#define HAS_BED_PROBE (HAS_Z_SERVO_PROBE || ANY(FIX_MOUNTED_PROBE, TOUCH_MI_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, SOLENOID_PROBE, SENSORLESS_PROBING, RACK_AND_PINION_PROBE))
499
+#define HAS_BED_PROBE (HAS_Z_SERVO_PROBE || ANY(FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, SOLENOID_PROBE, SENSORLESS_PROBING, RACK_AND_PINION_PROBE))
500 500
 #define PROBE_SELECTED (HAS_BED_PROBE || EITHER(PROBE_MANUALLY, MESH_BED_LEVELING))
501 501
 
502 502
 #if HAS_BED_PROBE

+ 15
- 15
Marlin/src/inc/Conditionals_post.h View File

@@ -26,12 +26,9 @@
26 26
  * Defines that depend on configuration but are not editable.
27 27
  */
28 28
 
29
-#define AVR_ATmega2560_FAMILY_PLUS_70 ( \
30
-     MB(BQ_ZUM_MEGA_3D)                 \
31
-  || MB(MIGHTYBOARD_REVE)               \
32
-  || MB(MINIRAMBO)                      \
33
-  || MB(SCOOVO_X9H)                     \
34
-)
29
+#ifdef GITHUB_ACTIONS
30
+  // Extras for CI testing
31
+#endif
35 32
 
36 33
 #ifdef TEENSYDUINO
37 34
   #undef max
@@ -259,6 +256,9 @@
259 256
 #elif ENABLED(AZSMZ_12864)
260 257
   #define _LCD_CONTRAST_MIN  120
261 258
   #define _LCD_CONTRAST_INIT 190
259
+#elif ENABLED(MKS_LCD12864B)
260
+  #define _LCD_CONTRAST_MIN  120
261
+  #define _LCD_CONTRAST_INIT 205
262 262
 #elif ENABLED(MKS_MINI_12864)
263 263
   #define _LCD_CONTRAST_MIN  120
264 264
   #define _LCD_CONTRAST_INIT 195
@@ -592,11 +592,7 @@
592 592
   #elif HAS_DRIVER(A4988) || HAS_DRIVER(A5984)
593 593
     #define MINIMUM_STEPPER_PULSE 1
594 594
   #elif TRINAMICS
595
-    #if ENABLED(LIN_ADVANCE) && (HAS_TMC_STANDALONE_E_DRIVER || (HAS_TMC_E_DRIVER && DISABLED(SQUARE_WAVE_STEPPING)))
596
-      #define MINIMUM_STEPPER_PULSE 1
597
-    #else
598
-      #define MINIMUM_STEPPER_PULSE 0
599
-    #endif
595
+    #define MINIMUM_STEPPER_PULSE 0
600 596
   #elif HAS_DRIVER(LV8729)
601 597
     #define MINIMUM_STEPPER_PULSE 0
602 598
   #else
@@ -609,14 +605,14 @@
609 605
     #define MAXIMUM_STEPPER_RATE 15000
610 606
   #elif HAS_DRIVER(TB6600)
611 607
     #define MAXIMUM_STEPPER_RATE 150000
612
-  #elif HAS_DRIVER(LV8729)
613
-    #define MAXIMUM_STEPPER_RATE 200000
614 608
   #elif HAS_DRIVER(DRV8825)
615 609
     #define MAXIMUM_STEPPER_RATE 250000
616
-  #elif TRINAMICS
617
-    #define MAXIMUM_STEPPER_RATE 400000
618 610
   #elif HAS_DRIVER(A4988)
619 611
     #define MAXIMUM_STEPPER_RATE 500000
612
+  #elif HAS_DRIVER(LV8729)
613
+    #define MAXIMUM_STEPPER_RATE 1000000
614
+  #elif TRINAMICS
615
+    #define MAXIMUM_STEPPER_RATE 5000000
620 616
   #else
621 617
     #define MAXIMUM_STEPPER_RATE 250000
622 618
   #endif
@@ -1487,6 +1483,10 @@
1487 1483
   #undef MIN_PROBE_EDGE_RIGHT
1488 1484
   #undef MIN_PROBE_EDGE_FRONT
1489 1485
   #undef MIN_PROBE_EDGE_BACK
1486
+  #define MIN_PROBE_EDGE_LEFT 0
1487
+  #define MIN_PROBE_EDGE_RIGHT 0
1488
+  #define MIN_PROBE_EDGE_FRONT 0
1489
+  #define MIN_PROBE_EDGE_BACK 0
1490 1490
 #else
1491 1491
   #ifndef MIN_PROBE_EDGE_LEFT
1492 1492
     #define MIN_PROBE_EDGE_LEFT MIN_PROBE_EDGE

+ 24
- 36
Marlin/src/inc/SanityCheck.h View File

@@ -418,6 +418,12 @@
418 418
   #error "LULZBOT_TOUCH_UI is now TOUCH_UI_FTDI_EVE. Please update your configuration."
419 419
 #elif defined(PS_DEFAULT_OFF)
420 420
   #error "PS_DEFAULT_OFF is now PSU_DEFAULT_OFF. Please update your configuration."
421
+#elif defined(FILAMENT_UNLOAD_RETRACT_LENGTH)
422
+  #error "FILAMENT_UNLOAD_RETRACT_LENGTH is now FILAMENT_UNLOAD_PURGE_RETRACT. Please update Configuration_adv.h."
423
+#elif defined(FILAMENT_UNLOAD_DELAY)
424
+  #error "FILAMENT_UNLOAD_DELAY is now FILAMENT_UNLOAD_PURGE_DELAY. Please update Configuration_adv.h."
425
+#elif defined(HOME_USING_SPREADCYCLE)
426
+  #error "HOME_USING_SPREADCYCLE is now obsolete. Please remove it from Configuration_adv.h."
421 427
 #endif
422 428
 
423 429
 #define BOARD_MKS_13        -1000
@@ -1076,6 +1082,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1076 1082
 #if 1 < 0 \
1077 1083
   + ENABLED(PROBE_MANUALLY) \
1078 1084
   + ENABLED(FIX_MOUNTED_PROBE) \
1085
+  + ENABLED(NOZZLE_AS_PROBE) \
1079 1086
   + (HAS_Z_SERVO_PROBE && DISABLED(BLTOUCH)) \
1080 1087
   + ENABLED(BLTOUCH) \
1081 1088
   + ENABLED(TOUCH_MI_PROBE) \
@@ -1084,7 +1091,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1084 1091
   + ENABLED(Z_PROBE_SLED) \
1085 1092
   + ENABLED(RACK_AND_PINION_PROBE) \
1086 1093
   + ENABLED(SENSORLESS_PROBING)
1087
-  #error "Please enable only one probe option: PROBE_MANUALLY, SENSORLESS_PROBING, BLTOUCH, FIX_MOUNTED_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo."
1094
+  #error "Please enable only one probe option: PROBE_MANUALLY, SENSORLESS_PROBING, BLTOUCH, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo."
1088 1095
 #endif
1089 1096
 
1090 1097
 #if HAS_BED_PROBE
@@ -1129,7 +1136,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1129 1136
   #if ENABLED(BLTOUCH)
1130 1137
     #if BLTOUCH_DELAY < 200
1131 1138
       #error "BLTOUCH_DELAY less than 200 is unsafe and is not supported."
1132
-    #elif DISABLED(BLTOUCH_SET_5V_MODE) && NONE(ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN, ENDSTOPPULLUP_ZMIN_PROBE)
1139
+    #elif DISABLED(BLTOUCH_SET_5V_MODE) && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN, ENDSTOPPULLUP_ZMIN_PROBE)
1133 1140
       #error "BLTOUCH without BLTOUCH_SET_5V_MODE requires ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN or ENDSTOPPULLUP_ZMIN_PROBE."
1134 1141
     #endif
1135 1142
   #endif
@@ -1215,11 +1222,11 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1215 1222
    * Require some kind of probe for bed leveling and probe testing
1216 1223
    */
1217 1224
   #if HAS_ABL_NOT_UBL && !PROBE_SELECTED
1218
-    #error "Auto Bed Leveling requires one of these: PROBE_MANUALLY, FIX_MOUNTED_PROBE, BLTOUCH, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or a Z Servo."
1225
+    #error "Auto Bed Leveling requires one of these: PROBE_MANUALLY, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, BLTOUCH, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or a Z Servo."
1219 1226
   #endif
1220 1227
 
1221 1228
   #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST)
1222
-    #error "Z_MIN_PROBE_REPEATABILITY_TEST requires a probe: FIX_MOUNTED_PROBE, BLTOUCH, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo."
1229
+    #error "Z_MIN_PROBE_REPEATABILITY_TEST requires a probe: FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, BLTOUCH, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo."
1223 1230
   #endif
1224 1231
 
1225 1232
 #endif
@@ -1953,7 +1960,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1953 1960
 /**
1954 1961
  * Check existing CS pins against enabled TMC SPI drivers.
1955 1962
  */
1956
-#define INVALID_TMC_SPI(ST) (AXIS_HAS_SPI && !PIN_EXISTS(ST##_CS))
1963
+#define INVALID_TMC_SPI(ST) (AXIS_HAS_SPI(ST) && !PIN_EXISTS(ST##_CS))
1957 1964
 #if INVALID_TMC_SPI(X)
1958 1965
   #error "An SPI driven TMC driver on X requires X_CS_PIN."
1959 1966
 #elif INVALID_TMC_SPI(X2)
@@ -2077,6 +2084,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
2077 2084
   #error "TMC2208 Software Serial is supported only on AVR, LPC1768, STM32F1 and STM32F4 platforms."
2078 2085
 #endif
2079 2086
 
2087
+#if ENABLED(DELTA) && (ENABLED(STEALTHCHOP_XY) != ENABLED(STEALTHCHOP_Z))
2088
+  #error "STEALTHCHOP_XY and STEALTHCHOP_Z must be the same on DELTA."
2089
+#endif
2090
+
2080 2091
 #if ENABLED(SENSORLESS_HOMING)
2081 2092
   // Require STEALTHCHOP for SENSORLESS_HOMING on DELTA as the transition from spreadCycle to stealthChop
2082 2093
   // is necessary in order to reset the stallGuard indication between the initial movement of all three
@@ -2091,17 +2102,17 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
2091 2102
 
2092 2103
   #if ENABLED(DELTA) && !BOTH(STEALTHCHOP_XY, STEALTHCHOP_Z)
2093 2104
     #error "SENSORLESS_HOMING on DELTA currently requires STEALTHCHOP_XY and STEALTHCHOP_Z."
2094
-  #elif X_SENSORLESS && X_HOME_DIR < 0 && DISABLED(ENDSTOPPULLUPS, ENDSTOPPULLUP_XMIN)
2105
+  #elif X_SENSORLESS && X_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_XMIN)
2095 2106
     #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_XMIN (or ENDSTOPPULLUPS) when homing to X_MIN."
2096
-  #elif X_SENSORLESS && X_HOME_DIR > 0 && DISABLED(ENDSTOPPULLUPS, ENDSTOPPULLUP_XMAX)
2107
+  #elif X_SENSORLESS && X_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_XMAX)
2097 2108
     #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_XMAX (or ENDSTOPPULLUPS) when homing to X_MAX."
2098
-  #elif Y_SENSORLESS && Y_HOME_DIR < 0 && DISABLED(ENDSTOPPULLUPS, ENDSTOPPULLUP_YMIN)
2109
+  #elif Y_SENSORLESS && Y_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_YMIN)
2099 2110
     #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_YMIN (or ENDSTOPPULLUPS) when homing to Y_MIN."
2100
-  #elif Y_SENSORLESS && Y_HOME_DIR > 0 && DISABLED(ENDSTOPPULLUPS, ENDSTOPPULLUP_YMAX)
2111
+  #elif Y_SENSORLESS && Y_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_YMAX)
2101 2112
     #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_YMAX (or ENDSTOPPULLUPS) when homing to Y_MAX."
2102
-  #elif Z_SENSORLESS && Z_HOME_DIR < 0 && DISABLED(ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN)
2113
+  #elif Z_SENSORLESS && Z_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN)
2103 2114
     #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMIN (or ENDSTOPPULLUPS) when homing to Z_MIN."
2104
-  #elif Z_SENSORLESS && Z_HOME_DIR > 0 && DISABLED(ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMAX)
2115
+  #elif Z_SENSORLESS && Z_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMAX)
2105 2116
     #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMAX (or ENDSTOPPULLUPS) when homing to Z_MAX."
2106 2117
   #elif X_SENSORLESS && X_HOME_DIR < 0 && X_MIN_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING
2107 2118
     #if X_ENDSTOP_INVERTING
@@ -2232,10 +2243,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
2232 2243
 #endif
2233 2244
 #undef IN_CHAIN
2234 2245
 
2235
-#if ENABLED(DELTA) && (ENABLED(STEALTHCHOP_XY) != ENABLED(STEALTHCHOP_Z))
2236
-  #error "STEALTHCHOP_XY and STEALTHCHOP_Z must be the same on DELTA."
2237
-#endif
2238
-
2239 2246
 /**
2240 2247
  * Digipot requirement
2241 2248
  */
@@ -2349,24 +2356,13 @@ static_assert(   _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
2349 2356
 #endif
2350 2357
 
2351 2358
 #if ENABLED(Z_STEPPER_AUTO_ALIGN)
2352
-
2353 2359
   #if !Z_MULTI_STEPPER_DRIVERS
2354 2360
     #error "Z_STEPPER_AUTO_ALIGN requires Z_DUAL_STEPPER_DRIVERS or Z_TRIPLE_STEPPER_DRIVERS."
2355 2361
   #elif !HAS_BED_PROBE
2356 2362
     #error "Z_STEPPER_AUTO_ALIGN requires a Z-bed probe."
2363
+  #elif ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) && DISABLED(Z_TRIPLE_STEPPER_DRIVERS)
2364
+    #error "Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS requires Z_TRIPLE_STEPPER_DRIVERS."
2357 2365
   #endif
2358
-
2359
-  #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
2360
-    #if DISABLED(Z_TRIPLE_STEPPER_DRIVERS)
2361
-      #error "Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS requires Z_TRIPLE_STEPPER_DRIVERS."
2362
-    #endif
2363
-    constexpr float sanity_arr_screw_xy[][2] = Z_STEPPER_ALIGN_STEPPER_XY;
2364
-    static_assert(
2365
-      COUNT(sanity_arr_screw_xy) == Z_STEPPER_COUNT,
2366
-      "Z_STEPPER_ALIGN_STEPPER_XY requires three {X,Y} entries (one per Z stepper)."
2367
-    );
2368
-  #endif
2369
-
2370 2366
 #endif
2371 2367
 
2372 2368
 #if ENABLED(PRINTCOUNTER) && DISABLED(EEPROM_SETTINGS)
@@ -2558,11 +2554,3 @@ static_assert(   _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
2558 2554
     #error "SHOW_REMAINING_TIME currently requires a Graphical LCD."
2559 2555
   #endif
2560 2556
 #endif
2561
-
2562
-#if ENABLED(LIN_ADVANCE) && MINIMUM_STEPPER_PULSE < 1
2563
-  #if HAS_TMC_STANDALONE_E_DRIVER
2564
-    #error "LIN_ADVANCE with TMC standalone driver on extruder requires MIMIMUM_STEPPER_PULSE >= 1"
2565
-  #elif HAS_TMC_E_DRIVER && DISABLED(SQUARE_WAVE_STEPPING)
2566
-    #error "LIN_ADVANCE with TMC driver on extruder requires SQUARE_WAVE_STEPPING or MINIMUM_STEPPER_PULSE >= 1"
2567
-  #endif
2568
-#endif

+ 14
- 0
Marlin/src/lcd/dogm/dogm_Statusscreen.h View File

@@ -1726,3 +1726,17 @@
1726 1726
     #endif
1727 1727
   #endif
1728 1728
 #endif
1729
+
1730
+#define DO_DRAW_LOGO (STATUS_LOGO_WIDTH && ENABLED(CUSTOM_STATUS_SCREEN_IMAGE))
1731
+#define DO_DRAW_HOTENDS (HOTENDS > 0)
1732
+#define DO_DRAW_CUTTER (HAS_CUTTER)
1733
+#define DO_DRAW_BED (HAS_HEATED_BED && STATUS_BED_WIDTH && HOTENDS <= 4)
1734
+#define DO_DRAW_CHAMBER (HAS_TEMP_CHAMBER && STATUS_CHAMBER_WIDTH && HOTENDS <= 4)
1735
+#define DO_DRAW_FAN (HAS_FAN0 && STATUS_FAN_WIDTH && HOTENDS <= 4 && defined(STATUS_FAN_FRAMES))
1736
+
1737
+#define ANIM_HOTEND (HOTENDS && ENABLED(STATUS_HOTEND_ANIM))
1738
+#define ANIM_BED (DO_DRAW_BED && ENABLED(STATUS_BED_ANIM))
1739
+#define ANIM_CHAMBER (DO_DRAW_CHAMBER && ENABLED(STATUS_CHAMBER_ANIM))
1740
+#define ANIM_CUTTER (DO_DRAW_CUTTER && ENABLED(STATUS_CUTTER_ANIM))
1741
+
1742
+#define ANIM_HBCC (ANIM_HOTEND || ANIM_BED || ANIM_CHAMBER || ANIM_CUTTER)

+ 1
- 14
Marlin/src/lcd/dogm/status_screen_DOGM.cpp View File

@@ -67,20 +67,6 @@
67 67
 #define EXTRAS_BASELINE (40 + INFO_FONT_ASCENT)
68 68
 #define STATUS_BASELINE (LCD_PIXEL_HEIGHT - INFO_FONT_DESCENT)
69 69
 
70
-#define DO_DRAW_LOGO (STATUS_LOGO_WIDTH && ENABLED(CUSTOM_STATUS_SCREEN_IMAGE))
71
-#define DO_DRAW_HOTENDS (HOTENDS > 0)
72
-#define DO_DRAW_CUTTER (HAS_CUTTER)
73
-#define DO_DRAW_BED (HAS_HEATED_BED && STATUS_BED_WIDTH && HOTENDS <= 4)
74
-#define DO_DRAW_CHAMBER (HAS_TEMP_CHAMBER && STATUS_CHAMBER_WIDTH && HOTENDS <= 4)
75
-#define DO_DRAW_FAN (HAS_FAN0 && STATUS_FAN_WIDTH && HOTENDS <= 4 && defined(STATUS_FAN_FRAMES))
76
-
77
-#define ANIM_HOTEND (HOTENDS && ENABLED(STATUS_HOTEND_ANIM))
78
-#define ANIM_BED (DO_DRAW_BED && ENABLED(STATUS_BED_ANIM))
79
-#define ANIM_CHAMBER (DO_DRAW_CHAMBER && ENABLED(STATUS_CHAMBER_ANIM))
80
-#define ANIM_CUTTER (DO_DRAW_CUTTER && ENABLED(STATUS_CUTTER_ANIM))
81
-
82
-#define ANIM_HBCC (ANIM_HOTEND || ANIM_BED || ANIM_CHAMBER || ANIM_CUTTER)
83
-
84 70
 #if ANIM_HBCC
85 71
   enum HeatBits : uint8_t {
86 72
     HEATBIT_HOTEND,
@@ -90,6 +76,7 @@
90 76
   };
91 77
   IF<(HEATBIT_CUTTER > 7), uint16_t, uint8_t>::type heat_bits;
92 78
 #endif
79
+
93 80
 #if ANIM_HOTEND
94 81
   #define HOTEND_ALT(N) TEST(heat_bits, HEATBIT_HOTEND + N)
95 82
 #else

+ 1
- 1
Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp View File

@@ -201,7 +201,7 @@ u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_f
201 201
 U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_hw_spi, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_HW_SPI);
202 202
 u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_HW_SPI };
203 203
 
204
-#if NONE(__AVR__, ARDUINO_ARCH_STM32) || defined(U8G_HAL_LINKS)
204
+#if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) || defined(U8G_HAL_LINKS)
205 205
   // Also use this device for HAL version of rrd class. This results in the same device being used
206 206
   // for the ST7920 for HAL systems no matter what is selected in ultralcd_impl_DOGM.h.
207 207
   u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI };

+ 37
- 34
Marlin/src/lcd/dogm/ultralcd_DOGM.cpp View File

@@ -244,48 +244,51 @@ bool MarlinUI::detected() { return true; }
244 244
 
245 245
 // Initialize or re-initialize the LCD
246 246
 void MarlinUI::init_lcd() {
247
+  #if DISABLED(MKS_LCD12864B)
247 248
 
248
-  #if PIN_EXISTS(LCD_BACKLIGHT)
249
-    OUT_WRITE(LCD_BACKLIGHT_PIN, (
250
-      #if ENABLED(DELAYED_BACKLIGHT_INIT)
251
-        LOW  // Illuminate after reset
252
-      #else
253
-        HIGH // Illuminate right away
249
+    #if PIN_EXISTS(LCD_BACKLIGHT)
250
+      OUT_WRITE(LCD_BACKLIGHT_PIN, (
251
+        #if ENABLED(DELAYED_BACKLIGHT_INIT)
252
+          LOW  // Illuminate after reset
253
+        #else
254
+          HIGH // Illuminate right away
255
+        #endif
256
+      ));
257
+    #endif
258
+
259
+    #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306)
260
+      SET_OUTPUT(LCD_PINS_DC);
261
+      #ifndef LCD_RESET_PIN
262
+        #define LCD_RESET_PIN LCD_PINS_RS
254 263
       #endif
255
-    ));
256
-  #endif
264
+    #endif
257 265
 
258
-  #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306)
259
-    SET_OUTPUT(LCD_PINS_DC);
260
-    #ifndef LCD_RESET_PIN
261
-      #define LCD_RESET_PIN LCD_PINS_RS
266
+    #if PIN_EXISTS(LCD_RESET)
267
+      // Perform a clean hardware reset with needed delays
268
+      OUT_WRITE(LCD_RESET_PIN, LOW);
269
+      _delay_ms(5);
270
+      WRITE(LCD_RESET_PIN, HIGH);
271
+      _delay_ms(5);
272
+      u8g.begin();
262 273
     #endif
263
-  #endif
264 274
 
265
-  #if PIN_EXISTS(LCD_RESET)
266
-    // Perform a clean hardware reset with needed delays
267
-    OUT_WRITE(LCD_RESET_PIN, LOW);
268
-    _delay_ms(5);
269
-    WRITE(LCD_RESET_PIN, HIGH);
270
-    _delay_ms(5);
271
-    u8g.begin();
272
-  #endif
275
+    #if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT)
276
+      WRITE(LCD_BACKLIGHT_PIN, HIGH);
277
+    #endif
273 278
 
274
-  #if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT)
275
-    WRITE(LCD_BACKLIGHT_PIN, HIGH);
276
-  #endif
279
+    #if HAS_LCD_CONTRAST
280
+      refresh_contrast();
281
+    #endif
277 282
 
278
-  #if HAS_LCD_CONTRAST
279
-    refresh_contrast();
280
-  #endif
283
+    #if ENABLED(LCD_SCREEN_ROT_90)
284
+      u8g.setRot90();
285
+    #elif ENABLED(LCD_SCREEN_ROT_180)
286
+      u8g.setRot180();
287
+    #elif ENABLED(LCD_SCREEN_ROT_270)
288
+      u8g.setRot270();
289
+    #endif
281 290
 
282
-  #if ENABLED(LCD_SCREEN_ROT_90)
283
-    u8g.setRot90();
284
-  #elif ENABLED(LCD_SCREEN_ROT_180)
285
-    u8g.setRot180();
286
-  #elif ENABLED(LCD_SCREEN_ROT_270)
287
-    u8g.setRot270();
288
-  #endif
291
+  #endif // !MKS_LCD12864B
289 292
 
290 293
   uxg_SetUtf8Fonts(g_fontinfo, COUNT(g_fontinfo));
291 294
 }

+ 1
- 1
Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp View File

@@ -25,7 +25,7 @@
25 25
 
26 26
 #include "../../inc/MarlinConfigPre.h"
27 27
 
28
-#if !defined(U8G_HAL_LINKS) && ANY(__AVR__, ARDUINO_ARCH_STM32)
28
+#if !defined(U8G_HAL_LINKS) && ANY(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32)
29 29
 
30 30
 #include "../../inc/MarlinConfig.h"
31 31
 

+ 2
- 2
Marlin/src/lcd/extensible_ui/ui_api.cpp View File

@@ -773,7 +773,7 @@ namespace ExtUI {
773 773
     #if HAS_BED_PROBE
774 774
       return probe_offset.z;
775 775
     #elif ENABLED(BABYSTEP_DISPLAY_TOTAL)
776
-      return babystep.axis_total[BS_TOTAL_AXIS(Z_AXIS) + 1];
776
+      return (planner.steps_to_mm[Z_AXIS] * babystep.axis_total[BS_TODO_AXIS(Z_AXIS)]);
777 777
     #else
778 778
       return 0.0;
779 779
     #endif
@@ -784,7 +784,7 @@ namespace ExtUI {
784 784
       if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX))
785 785
         probe_offset.z = value;
786 786
     #elif ENABLED(BABYSTEP_DISPLAY_TOTAL)
787
-      babystep.add_mm(Z_AXIS, (value - babystep.axis_total[BS_TOTAL_AXIS(Z_AXIS) + 1]));
787
+      babystep.add_mm(Z_AXIS, (value - getZOffset_mm()));
788 788
     #else
789 789
       UNUSED(value);
790 790
     #endif

+ 2
- 2
Marlin/src/lcd/extui_malyan_lcd.cpp View File

@@ -396,8 +396,8 @@ void update_usb_status(const bool forceUpdate) {
396 396
   // This is mildly different than stock, which
397 397
   // appears to use the usb discovery status.
398 398
   // This is more logical.
399
-  if (last_usb_connected_status != SerialUSB || forceUpdate) {
400
-    last_usb_connected_status = SerialUSB;
399
+  if (last_usb_connected_status != MYSERIAL0 || forceUpdate) {
400
+    last_usb_connected_status = MYSERIAL0;
401 401
     write_to_lcd_P(last_usb_connected_status ? PSTR("{R:UC}\r\n") : PSTR("{R:UD}\r\n"));
402 402
   }
403 403
 }

+ 1
- 1
Marlin/src/lcd/language/language_an.h View File

@@ -119,7 +119,7 @@ namespace Language_an {
119 119
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Temperatura");
120 120
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Movimiento");
121 121
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Filamento");
122
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E in mm3");
122
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E in mm³");
123 123
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Fil. Dia.");
124 124
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Fil. Dia. *");
125 125
   PROGMEM Language_Str MSG_CONTRAST                        = _UxGT("Contraste");

+ 1
- 1
Marlin/src/lcd/language/language_bg.h View File

@@ -104,7 +104,7 @@ namespace Language_bg {
104 104
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Температура");
105 105
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Движение");
106 106
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Нишка");
107
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E in mm3");
107
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E in mm³");
108 108
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Диам. нишка");
109 109
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Диам. нишка *");
110 110
   PROGMEM Language_Str MSG_CONTRAST                        = _UxGT("LCD контраст");

+ 5
- 2
Marlin/src/lcd/language/language_ca.h View File

@@ -114,7 +114,7 @@ namespace Language_ca {
114 114
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Temperatura");
115 115
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Moviment");
116 116
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Filament");
117
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E en mm3");
117
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E en mm³");
118 118
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Diam. Fil.");
119 119
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Diam. Fil. *");
120 120
   PROGMEM Language_Str MSG_CONTRAST                        = _UxGT("Contrast de LCD");
@@ -204,7 +204,10 @@ namespace Language_ca {
204 204
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Font alimentacio");
205 205
 
206 206
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Força motor");
207
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Driver %");
207
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Driver %");
208
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Driver %");
209
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Driver %");
210
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Driver %");
208 211
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("DAC EEPROM Write");
209 212
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME   = _UxGT("Repren impressió");
210 213
 

+ 101
- 14
Marlin/src/lcd/language/language_cz.h View File

@@ -46,8 +46,14 @@ namespace Language_cz {
46 46
   PROGMEM Language_Str MSG_YES                             = _UxGT("ANO");
47 47
   PROGMEM Language_Str MSG_NO                              = _UxGT("NE");
48 48
   PROGMEM Language_Str MSG_BACK                            = _UxGT("Zpět");
49
-  PROGMEM Language_Str MSG_MEDIA_INSERTED                  = _UxGT("Karta vložena");
50
-  PROGMEM Language_Str MSG_MEDIA_REMOVED                   = _UxGT("Karta vyjmuta");
49
+  PROGMEM Language_Str MSG_MEDIA_ABORTING                  = _UxGT("Rušení...");
50
+  PROGMEM Language_Str MSG_MEDIA_INSERTED                  = _UxGT("Médium vloženo");
51
+  PROGMEM Language_Str MSG_MEDIA_REMOVED                   = _UxGT("Médium vyjmuto");
52
+  PROGMEM Language_Str MSG_MEDIA_RELEASED                  = _UxGT("Médium uvolněno");
53
+  PROGMEM Language_Str MSG_MEDIA_WAITING                   = _UxGT("Čekání na médium");
54
+  PROGMEM Language_Str MSG_MEDIA_READ_ERROR                = _UxGT("Chyba čtení média");
55
+  PROGMEM Language_Str MSG_MEDIA_USB_REMOVED               = _UxGT("USB odstraněno");
56
+  PROGMEM Language_Str MSG_MEDIA_USB_FAILED                = _UxGT("Chyba USB");
51 57
   PROGMEM Language_Str MSG_LCD_ENDSTOPS                    = _UxGT("Endstopy"); // max 8 znaku
52 58
   PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS               = _UxGT("Soft Endstopy");
53 59
   PROGMEM Language_Str MSG_MAIN                            = _UxGT("Hlavní nabídka");
@@ -94,6 +100,10 @@ namespace Language_cz {
94 100
   PROGMEM Language_Str MSG_LASER_OFF                       = _UxGT("Vypnout laser");
95 101
   PROGMEM Language_Str MSG_LASER_ON                        = _UxGT("Zapnout laser");
96 102
   PROGMEM Language_Str MSG_LASER_POWER                     = _UxGT("Výkon laseru");
103
+  PROGMEM Language_Str MSG_SPINDLE_MENU                    = _UxGT("Vřeteno ovládání");
104
+  PROGMEM Language_Str MSG_SPINDLE_OFF                     = _UxGT("Vřeteno vyp");
105
+  PROGMEM Language_Str MSG_SPINDLE_ON                      = _UxGT("Vřeteno zap");
106
+  PROGMEM Language_Str MSG_SPINDLE_POWER                   = _UxGT("Vřeteno výkon");
97 107
   PROGMEM Language_Str MSG_SPINDLE_REVERSE                 = _UxGT("Vřeteno opačně");
98 108
   PROGMEM Language_Str MSG_SWITCH_PS_ON                    = _UxGT("Zapnout napájení");
99 109
   PROGMEM Language_Str MSG_SWITCH_PS_OFF                   = _UxGT("Vypnout napájení");
@@ -104,13 +114,18 @@ namespace Language_cz {
104 114
   PROGMEM Language_Str MSG_LEVEL_BED                       = _UxGT("Vyrovnat podložku");
105 115
   PROGMEM Language_Str MSG_LEVEL_CORNERS                   = _UxGT("Vyrovnat rohy");
106 116
   PROGMEM Language_Str MSG_NEXT_CORNER                     = _UxGT("Další roh");
117
+  PROGMEM Language_Str MSG_MESH_EDITOR                     = _UxGT("Editor sítě");
107 118
   PROGMEM Language_Str MSG_EDIT_MESH                       = _UxGT("Upravit síť bodů");
108 119
   PROGMEM Language_Str MSG_EDITING_STOPPED                 = _UxGT("Konec úprav sítě");
120
+  PROGMEM Language_Str MSG_PROBING_MESH                    = _UxGT("Měření bodu");
109 121
   PROGMEM Language_Str MSG_MESH_X                          = _UxGT("Index X");
110 122
   PROGMEM Language_Str MSG_MESH_Y                          = _UxGT("Index Y");
111 123
   PROGMEM Language_Str MSG_MESH_EDIT_Z                     = _UxGT("Hodnota Z");
112 124
 
113 125
   PROGMEM Language_Str MSG_USER_MENU                       = _UxGT("Vlastní příkazy");
126
+  PROGMEM Language_Str MSG_M48_TEST                        = _UxGT("M48 test sondy");
127
+  PROGMEM Language_Str MSG_M48_POINT                       = _UxGT("M48 bod");
128
+  PROGMEM Language_Str MSG_M48_DEVIATION                   = _UxGT("Odchylka");
114 129
   PROGMEM Language_Str MSG_IDEX_MENU                       = _UxGT("Režim IDEX");
115 130
   PROGMEM Language_Str MSG_OFFSETS_MENU                    = _UxGT("Ofsety nástrojů");
116 131
   PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK              = _UxGT("Auto-Park");
@@ -124,6 +139,7 @@ namespace Language_cz {
124 139
   PROGMEM Language_Str MSG_UBL_DOING_G29                   = _UxGT("Provádím G29");
125 140
   PROGMEM Language_Str MSG_UBL_TOOLS                       = _UxGT("UBL nástroje");
126 141
   PROGMEM Language_Str MSG_UBL_LEVEL_BED                   = _UxGT("Unified Bed Leveling");
142
+  PROGMEM Language_Str MSG_LCD_TILTING_MESH                = _UxGT("Vyrovnání bodu");
127 143
   PROGMEM Language_Str MSG_UBL_MANUAL_MESH                 = _UxGT("Manuální síť bodů");
128 144
   PROGMEM Language_Str MSG_UBL_BC_INSERT                   = _UxGT("Vložte kartu, změřte");
129 145
   PROGMEM Language_Str MSG_UBL_BC_INSERT2                  = _UxGT("Změřte");
@@ -150,6 +166,13 @@ namespace Language_cz {
150 166
   PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1            = _UxGT("Kontrola sítě ") PREHEAT_1_LABEL;
151 167
   PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2            = _UxGT("Kontrola sítě ") PREHEAT_2_LABEL;
152 168
   PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH        = _UxGT("Kontrola vlast. sítě");
169
+  PROGMEM Language_Str MSG_G26_HEATING_BED                 = _UxGT("G26 zahřívání podl.");
170
+  PROGMEM Language_Str MSG_G26_HEATING_NOZZLE              = _UxGT("G26 zařívání trysky");
171
+  PROGMEM Language_Str MSG_G26_MANUAL_PRIME                = _UxGT("Ruční zavedení...");
172
+  PROGMEM Language_Str MSG_G26_FIXED_LENGTH                = _UxGT("Pevné zavední");
173
+  PROGMEM Language_Str MSG_G26_PRIME_DONE                  = _UxGT("Done Priming");
174
+  PROGMEM Language_Str MSG_G26_CANCELED                    = _UxGT("G26 Canceled");
175
+  PROGMEM Language_Str MSG_G26_LEAVING                     = _UxGT("Leaving G26");
153 176
   PROGMEM Language_Str MSG_UBL_CONTINUE_MESH               = _UxGT("Pokračovat v síťi");
154 177
   PROGMEM Language_Str MSG_UBL_MESH_LEVELING               = _UxGT("Síťové rovnání");
155 178
   PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING        = _UxGT("3-bodové rovnání");
@@ -179,7 +202,8 @@ namespace Language_cz {
179 202
   PROGMEM Language_Str MSG_UBL_NO_STORAGE                  = _UxGT("Nedostatek místa");
180 203
   PROGMEM Language_Str MSG_UBL_SAVE_ERROR                  = _UxGT("Ch.: Uložit UBL");
181 204
   PROGMEM Language_Str MSG_UBL_RESTORE_ERROR               = _UxGT("Ch.: Obnovit UBL");
182
-  PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED            = _UxGT("Konec Z-Offsetu");
205
+  PROGMEM Language_Str MSG_UBL_Z_OFFSET                    = _UxGT("Z-ofset: ");
206
+  PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED            = _UxGT("Konec Z-ofsetu");
183 207
   PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU           = _UxGT("UBL Postupně");
184 208
   PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH           = _UxGT("1. Studená síť bodů");
185 209
   PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN              = _UxGT("2. Chytrá hustota");
@@ -228,23 +252,51 @@ namespace Language_cz {
228 252
   PROGMEM Language_Str MSG_CHAMBER                         = _UxGT("Komora");
229 253
   PROGMEM Language_Str MSG_FAN_SPEED                       = _UxGT("Rychlost vent.");
230 254
   PROGMEM Language_Str MSG_FAN_SPEED_N                     = _UxGT("Rychlost vent. =");
255
+  PROGMEM Language_Str MSG_STORED_FAN_N                    = _UxGT("Ulož. vent. =");
231 256
   PROGMEM Language_Str MSG_EXTRA_FAN_SPEED                 = _UxGT("Rychlost ex. vent.");
232 257
   PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N               = _UxGT("Rychlost ex. vent. =");
233 258
   PROGMEM Language_Str MSG_FLOW                            = _UxGT("Průtok");
234 259
   PROGMEM Language_Str MSG_FLOW_N                          = _UxGT("Průtok ~");
235 260
   PROGMEM Language_Str MSG_CONTROL                         = _UxGT("Ovládaní");
236
-  PROGMEM Language_Str MSG_MIN                             = " " LCD_STR_THERMOMETER _UxGT(" Min");
237
-  PROGMEM Language_Str MSG_MAX                             = " " LCD_STR_THERMOMETER _UxGT(" Max");
238
-  PROGMEM Language_Str MSG_FACTOR                          = " " LCD_STR_THERMOMETER _UxGT(" Fakt");
261
+  PROGMEM Language_Str MSG_MIN                             = " " LCD_STR_THERMOMETER _UxGT(" min");
262
+  PROGMEM Language_Str MSG_MAX                             = " " LCD_STR_THERMOMETER _UxGT(" max");
263
+  PROGMEM Language_Str MSG_FACTOR                          = " " LCD_STR_THERMOMETER _UxGT(" fakt");
239 264
   PROGMEM Language_Str MSG_AUTOTEMP                        = _UxGT("Autoteplota");
240 265
   PROGMEM Language_Str MSG_LCD_ON                          = _UxGT("Zap");
241 266
   PROGMEM Language_Str MSG_LCD_OFF                         = _UxGT("Vyp");
267
+  PROGMEM Language_Str MSG_PID_AUTOTUNE                    = _UxGT("PID automatika");
268
+  PROGMEM Language_Str MSG_PID_AUTOTUNE_E                  = _UxGT("PID automatika *");
269
+  PROGMEM Language_Str MSG_PID_P                           = _UxGT("PID-P");
270
+  PROGMEM Language_Str MSG_PID_P_E                         = _UxGT("PID-P *");
271
+  PROGMEM Language_Str MSG_PID_I                           = _UxGT("PID-I");
272
+  PROGMEM Language_Str MSG_PID_I_E                         = _UxGT("PID-I *");
273
+  PROGMEM Language_Str MSG_PID_D                           = _UxGT("PID-D");
274
+  PROGMEM Language_Str MSG_PID_D_E                         = _UxGT("PID-D *");
275
+  PROGMEM Language_Str MSG_PID_C                           = _UxGT("PID-C");
276
+  PROGMEM Language_Str MSG_PID_C_E                         = _UxGT("PID-C *");
242 277
   PROGMEM Language_Str MSG_SELECT                          = _UxGT("Vybrat");
243 278
   PROGMEM Language_Str MSG_SELECT_E                        = _UxGT("Vybrat *");
244 279
   PROGMEM Language_Str MSG_ACC                             = _UxGT("Zrychl");
280
+  PROGMEM Language_Str MSG_JERK                            = _UxGT("Jerk");
281
+  PROGMEM Language_Str MSG_VA_JERK                         = _UxGT("V") LCD_STR_A _UxGT("-jerk");
282
+  PROGMEM Language_Str MSG_VB_JERK                         = _UxGT("V") LCD_STR_B _UxGT("-jerk");
283
+  PROGMEM Language_Str MSG_VC_JERK                         = _UxGT("V") LCD_STR_C _UxGT("-jerk");
284
+  PROGMEM Language_Str MSG_VE_JERK                         = _UxGT("Ve-Jerk");
245 285
   PROGMEM Language_Str MSG_JUNCTION_DEVIATION              = _UxGT("Odchylka spoje");
246 286
   PROGMEM Language_Str MSG_VELOCITY                        = _UxGT("Rychlost");
287
+  PROGMEM Language_Str MSG_VMAX_A                          = _UxGT("Vmax ") LCD_STR_A;
288
+  PROGMEM Language_Str MSG_VMAX_B                          = _UxGT("Vmax ") LCD_STR_B;
289
+  PROGMEM Language_Str MSG_VMAX_C                          = _UxGT("Vmax ") LCD_STR_C;
290
+  PROGMEM Language_Str MSG_VMAX_E                          = _UxGT("Vmax ") LCD_STR_E;
291
+  PROGMEM Language_Str MSG_VMAX_EN                         = _UxGT("Vmax *");
292
+  PROGMEM Language_Str MSG_VMIN                            = _UxGT("Vmin");
293
+  PROGMEM Language_Str MSG_VTRAV_MIN                       = _UxGT("VTrav Min");
247 294
   PROGMEM Language_Str MSG_ACCELERATION                    = _UxGT("Akcelerace");
295
+  PROGMEM Language_Str MSG_AMAX_A                          = _UxGT("Amax ") LCD_STR_A;
296
+  PROGMEM Language_Str MSG_AMAX_B                          = _UxGT("Amax ") LCD_STR_B;
297
+  PROGMEM Language_Str MSG_AMAX_C                          = _UxGT("Amax ") LCD_STR_C;
298
+  PROGMEM Language_Str MSG_AMAX_E                          = _UxGT("Amax ") LCD_STR_E;
299
+  PROGMEM Language_Str MSG_AMAX_EN                         = _UxGT("Amax *");
248 300
   PROGMEM Language_Str MSG_A_RETRACT                       = _UxGT("A-retrakt");
249 301
   PROGMEM Language_Str MSG_A_TRAVEL                        = _UxGT("A-přejezd");
250 302
   PROGMEM Language_Str MSG_STEPS_PER_MM                    = _UxGT("Kroků/mm");
@@ -256,7 +308,7 @@ namespace Language_cz {
256 308
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Teplota");
257 309
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Pohyb");
258 310
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Filament");
259
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E na mm3");
311
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E na mm³");
260 312
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Fil. Prum.");
261 313
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Fil. Prum. *");
262 314
   PROGMEM Language_Str MSG_FILAMENT_UNLOAD                 = _UxGT("Vysunout mm");
@@ -275,11 +327,21 @@ namespace Language_cz {
275 327
   PROGMEM Language_Str MSG_PREPARE                         = _UxGT("Připrava tisku");
276 328
   PROGMEM Language_Str MSG_TUNE                            = _UxGT("Doladění tisku");
277 329
   PROGMEM Language_Str MSG_START_PRINT                     = _UxGT("Spustit tisk");
330
+  PROGMEM Language_Str MSG_BUTTON_NEXT                     = _UxGT("Další");
331
+  PROGMEM Language_Str MSG_BUTTON_INIT                     = _UxGT("Inicializace");
332
+  PROGMEM Language_Str MSG_BUTTON_STOP                     = _UxGT("Stop");
278 333
   PROGMEM Language_Str MSG_BUTTON_PRINT                    = _UxGT("Tisk");
334
+  PROGMEM Language_Str MSG_BUTTON_RESET                    = _UxGT("Reset");
279 335
   PROGMEM Language_Str MSG_BUTTON_CANCEL                   = _UxGT("Zrušit");
336
+  PROGMEM Language_Str MSG_BUTTON_DONE                     = _UxGT("Hotovo");
337
+  PROGMEM Language_Str MSG_BUTTON_BACK                     = _UxGT("Zpět");
338
+  PROGMEM Language_Str MSG_BUTTON_PROCEED                  = _UxGT("Pokračovat");
280 339
   PROGMEM Language_Str MSG_PAUSE_PRINT                     = _UxGT("Pozastavit tisk");
281 340
   PROGMEM Language_Str MSG_RESUME_PRINT                    = _UxGT("Obnovit tisk");
282 341
   PROGMEM Language_Str MSG_STOP_PRINT                      = _UxGT("Zastavit tisk");
342
+  PROGMEM Language_Str MSG_PRINTING_OBJECT                 = _UxGT("Tisk objektu");
343
+  PROGMEM Language_Str MSG_CANCEL_OBJECT                   = _UxGT("Zrušit objekt");
344
+  PROGMEM Language_Str MSG_CANCEL_OBJECT_N                 = _UxGT("Zrušit objekt =");
283 345
   PROGMEM Language_Str MSG_OUTAGE_RECOVERY                 = _UxGT("Obnova výpadku");
284 346
   PROGMEM Language_Str MSG_MEDIA_MENU                      = _UxGT("Tisknout z SD");
285 347
   PROGMEM Language_Str MSG_NO_MEDIA                        = _UxGT("Žádná SD karta");
@@ -301,6 +363,7 @@ namespace Language_cz {
301 363
   PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF   = _UxGT("S UnRet V");
302 364
   PROGMEM Language_Str MSG_AUTORETRACT                     = _UxGT("AutoRetr.");
303 365
   PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH            = _UxGT("Délka retrakce");
366
+  PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH           = _UxGT("Délka zavedení");
304 367
   PROGMEM Language_Str MSG_TOOL_CHANGE                     = _UxGT("Výměna nástroje");
305 368
   PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT               = _UxGT("Zdvih Z");
306 369
   PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD          = _UxGT("Rychlost primár.");
@@ -314,18 +377,29 @@ namespace Language_cz {
314 377
   PROGMEM Language_Str MSG_FILAMENTUNLOAD_E                = _UxGT("Vysunout filament *");
315 378
   PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL              = _UxGT("Vysunout vše");
316 379
 
317
-  PROGMEM Language_Str MSG_INIT_MEDIA                      = _UxGT("Načíst SD kartu");
318
-  PROGMEM Language_Str MSG_CHANGE_MEDIA                    = _UxGT("Vyměnit SD kartu");
380
+  PROGMEM Language_Str MSG_INIT_MEDIA                      = _UxGT("Načíst médium");
381
+  PROGMEM Language_Str MSG_CHANGE_MEDIA                    = _UxGT("Vyměnit médium");
382
+  PROGMEM Language_Str MSG_RELEASE_MEDIA                   = _UxGT("Vysunout médium");
319 383
   PROGMEM Language_Str MSG_ZPROBE_OUT                      = _UxGT("Sonda Z mimo podl");
320 384
   PROGMEM Language_Str MSG_SKEW_FACTOR                     = _UxGT("Faktor zkosení");
321 385
   PROGMEM Language_Str MSG_BLTOUCH                         = _UxGT("BLTouch");
322 386
   PROGMEM Language_Str MSG_BLTOUCH_SELFTEST                = _UxGT("BLTouch self-test");
323 387
   PROGMEM Language_Str MSG_BLTOUCH_RESET                   = _UxGT("BLTouch reset");
388
+  PROGMEM Language_Str MSG_BLTOUCH_STOW                    = _UxGT("BLTouch zasunout");
324 389
   PROGMEM Language_Str MSG_BLTOUCH_DEPLOY                  = _UxGT("BLTouch vysunout");
325 390
   PROGMEM Language_Str MSG_BLTOUCH_SW_MODE                 = _UxGT("SW výsun BLTouch");
326 391
   PROGMEM Language_Str MSG_BLTOUCH_5V_MODE                 = _UxGT("BLTouch 5V režim");
327 392
   PROGMEM Language_Str MSG_BLTOUCH_OD_MODE                 = _UxGT("BLTouch OD režim");
328
-  PROGMEM Language_Str MSG_BLTOUCH_STOW                    = _UxGT("BLTouch zasunout");
393
+  PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE              = _UxGT("Uložit režim");
394
+  PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V           = _UxGT("Nastavit 5V");
395
+  PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD           = _UxGT("Nastacit OD");
396
+  PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO               = _UxGT("Vypsat nastavení");
397
+  PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE             = _UxGT("VAROVANÍ: Špatné nastavení může způsobit škody! Pokračovat?");
398
+  PROGMEM Language_Str MSG_TOUCHMI_PROBE                   = _UxGT("TouchMI");
399
+  PROGMEM Language_Str MSG_TOUCHMI_INIT                    = _UxGT("Inic. TouchMI");
400
+  PROGMEM Language_Str MSG_TOUCHMI_ZTEST                   = _UxGT("Test Z Ofsetu");
401
+  PROGMEM Language_Str MSG_TOUCHMI_SAVE                    = _UxGT("Uložiy");
402
+  PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI           = _UxGT("vysunout TouchMI");
329 403
   PROGMEM Language_Str MSG_MANUAL_DEPLOY                   = _UxGT("Vysunout Z-sondu");
330 404
   PROGMEM Language_Str MSG_MANUAL_STOW                     = _UxGT("Zasunout Z-sondu");
331 405
   PROGMEM Language_Str MSG_HOME_FIRST                      = _UxGT("Domů %s%s%s první");
@@ -337,9 +411,11 @@ namespace Language_cz {
337 411
   PROGMEM Language_Str MSG_ENDSTOP_ABORT                   = _UxGT("Endstop abort");
338 412
   PROGMEM Language_Str MSG_HEATING_FAILED_LCD              = _UxGT("Chyba zahřívání");
339 413
   PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED          = _UxGT("Chyba zahř.podl.");
414
+  PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER      = _UxGT("Chyba zahř.komory");
340 415
   PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP              = _UxGT("REDUND. TEPLOTA");
341 416
   PROGMEM Language_Str MSG_THERMAL_RUNAWAY                 = _UxGT("TEPLOTNÍ ÚNIK");
342 417
   PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED             = _UxGT("TEPL. ÚNIK PODL.");
418
+  PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER         = _UxGT("TEPL. ÚNIK KOMORA");
343 419
   PROGMEM Language_Str MSG_ERR_MAXTEMP                     = _UxGT("VYSOKÁ TEPLOTA");
344 420
   PROGMEM Language_Str MSG_ERR_MINTEMP                     = _UxGT("NÍZKA TEPLOTA");
345 421
   PROGMEM Language_Str MSG_ERR_MAXTEMP_BED                 = _UxGT("VYS. TEPL. PODL.");
@@ -364,6 +440,8 @@ namespace Language_cz {
364 440
   #else
365 441
     PROGMEM Language_Str MSG_BED_COOLING                   = _UxGT("Chlazení podl.");
366 442
   #endif
443
+  PROGMEM Language_Str MSG_CHAMBER_HEATING                 = _UxGT("Zahřívání komory...");
444
+  PROGMEM Language_Str MSG_CHAMBER_COOLING                 = _UxGT("Chlazení komory...");
367 445
   PROGMEM Language_Str MSG_DELTA_CALIBRATE                 = _UxGT("Delta Kalibrace");
368 446
   PROGMEM Language_Str MSG_DELTA_CALIBRATE_X               = _UxGT("Kalibrovat X");
369 447
   PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y               = _UxGT("Kalibrovat Y");
@@ -389,8 +467,12 @@ namespace Language_cz {
389 467
   PROGMEM Language_Str MSG_INFO_EXTRUDERS                  = _UxGT("Extrudéry");
390 468
   PROGMEM Language_Str MSG_INFO_BAUDRATE                   = _UxGT("Rychlost");
391 469
   PROGMEM Language_Str MSG_INFO_PROTOCOL                   = _UxGT("Protokol");
470
+  PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF                = _UxGT("Sledování úniku: VYP");
471
+  PROGMEM Language_Str MSG_INFO_RUNAWAY_ON                 = _UxGT("Sledování úniku: ZAP");
472
+
392 473
   PROGMEM Language_Str MSG_CASE_LIGHT                      = _UxGT("Osvětlení");
393 474
   PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS           = _UxGT("Jas světla");
475
+  PROGMEM Language_Str MSG_EXPECTED_PRINTER                = _UxGT("NESPRÁVNÁ TISKÁRNA");
394 476
 
395 477
   #if LCD_WIDTH >= 20
396 478
     PROGMEM Language_Str MSG_INFO_PRINT_COUNT              = _UxGT("Počet tisků");
@@ -410,8 +492,12 @@ namespace Language_cz {
410 492
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Teplota max");
411 493
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Nap. zdroj");
412 494
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Buzení motorů");
413
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Motor %");
414
-  PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("Uložit do EEPROM");
495
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Motor %");
496
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Motor %");
497
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Motor %");
498
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Motor %");
499
+  PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("DAC uložit EEPROM");
500
+  PROGMEM Language_Str MSG_ERROR_TMC                       = _UxGT("TMC CHYBA SPOJENÍ");
415 501
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER          = _UxGT("VÝMĚNA FILAMENTU");
416 502
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE    = _UxGT("TISK POZASTAVEN");
417 503
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD     = _UxGT("ZAVEDENÍ FILAMENTU");
@@ -421,6 +507,7 @@ namespace Language_cz {
421 507
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME   = _UxGT("Obnovit tisk");
422 508
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE          = _UxGT("  Tryska: ");
423 509
   PROGMEM Language_Str MSG_RUNOUT_SENSOR                   = _UxGT("Senzor filamentu");
510
+  PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM              = _UxGT("Délka mm senz.fil.");
424 511
   PROGMEM Language_Str MSG_LCD_HOMING_FAILED               = _UxGT("Parkování selhalo");
425 512
   PROGMEM Language_Str MSG_LCD_PROBING_FAILED              = _UxGT("Kalibrace selhala");
426 513
   PROGMEM Language_Str MSG_M600_TOO_COLD                   = _UxGT("M600: Moc studený");
@@ -474,13 +561,13 @@ namespace Language_cz {
474 561
   #endif
475 562
   PROGMEM Language_Str MSG_START_Z                         = _UxGT("Počáteční Z:");
476 563
   PROGMEM Language_Str MSG_END_Z                           = _UxGT("  Koncové Z:");
564
+
565
+  PROGMEM Language_Str MSG_GAMES                           = _UxGT("Hry");
477 566
   PROGMEM Language_Str MSG_BRICKOUT                        = _UxGT("Brickout");
478 567
   PROGMEM Language_Str MSG_INVADERS                        = _UxGT("Invaders");
479 568
   PROGMEM Language_Str MSG_SNAKE                           = _UxGT("Sn4k3");
480 569
   PROGMEM Language_Str MSG_MAZE                            = _UxGT("Bludiště");
481 570
 
482
-  PROGMEM Language_Str MSG_EXPECTED_PRINTER                = _UxGT("Nesprávná tiskárna");
483
-
484 571
   #if LCD_HEIGHT >= 4
485 572
     // Up to 3 lines allowed
486 573
     PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING        = _UxGT(MSG_2_LINE("Stikněte tlačítko", "pro obnovení tisku"));

+ 6
- 2
Marlin/src/lcd/language/language_da.h View File

@@ -99,7 +99,7 @@ namespace Language_da {
99 99
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Temperatur");
100 100
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Bevægelse");
101 101
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Filament");
102
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E i mm3");
102
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E i mm³");
103 103
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Fil. Dia.");
104 104
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Fil. Dia. *");
105 105
   PROGMEM Language_Str MSG_CONTRAST                        = _UxGT("LCD kontrast");
@@ -176,7 +176,11 @@ namespace Language_da {
176 176
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Strømfors.");
177 177
 
178 178
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Driv Styrke");
179
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Driv %");
179
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Driv %");
180
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Driv %");
181
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Driv %");
182
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Driv %");
183
+
180 184
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("DAC EEPROM Skriv");
181 185
 
182 186
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME   = _UxGT("Forsæt print");

+ 4
- 1
Marlin/src/lcd/language/language_de.h View File

@@ -456,7 +456,10 @@ namespace Language_de {
456 456
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Max Temp");
457 457
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Netzteil");
458 458
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Motorleistung");
459
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Treiber %");
459
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Treiber %");
460
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Treiber %");
461
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Treiber %");
462
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Treiber %");
460 463
   PROGMEM Language_Str MSG_ERROR_TMC                       = _UxGT("TMC Verbindungsfehler");
461 464
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("Werte speichern");
462 465
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER          = _UxGT("FILAMENT WECHSEL");

+ 1
- 1
Marlin/src/lcd/language/language_el.h View File

@@ -130,7 +130,7 @@ namespace Language_el {
130 130
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Θερμοκρασία");
131 131
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Κίνηση");
132 132
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Νήμα");
133
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("Ε σε μμ3");
133
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("Ε σε μμ³");
134 134
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Διάμετρος νήματος");
135 135
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Διάμετρος νήματος *");
136 136
   PROGMEM Language_Str MSG_CONTRAST                        = _UxGT("Κοντράστ LCD");

+ 1
- 1
Marlin/src/lcd/language/language_el_gr.h View File

@@ -140,7 +140,7 @@ namespace Language_el_gr {
140 140
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Θερμοκρασία");
141 141
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Κίνηση");
142 142
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Νήμα");
143
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("Ε σε μμ3");
143
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("Ε σε μμ³");
144 144
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Διάμετρος νήματος");
145 145
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Διάμετρος νήματος *");
146 146
   PROGMEM Language_Str MSG_CONTRAST                        = _UxGT("Κοντράστ LCD");

+ 4
- 7
Marlin/src/lcd/language/language_en.h View File

@@ -39,12 +39,6 @@ namespace Language_en {
39 39
   constexpr uint8_t    CHARSIZE                            = 2;
40 40
   PROGMEM Language_Str LANGUAGE                            = _UxGT("English");
41 41
 
42
-  #ifdef NOT_EXTENDED_ISO10646_1_5X7
43
-    PROGMEM Language_Str MSG_CUBED                         = _UxGT("^3");
44
-  #else
45
-    PROGMEM Language_Str MSG_CUBED                         = _UxGT("³");
46
-  #endif
47
-
48 42
   PROGMEM Language_Str WELCOME_MSG                         = MACHINE_NAME _UxGT(" Ready.");
49 43
   PROGMEM Language_Str MSG_YES                             = _UxGT("YES");
50 44
   PROGMEM Language_Str MSG_NO                              = _UxGT("NO");
@@ -480,7 +474,10 @@ namespace Language_en {
480 474
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Max Temp");
481 475
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("PSU");
482 476
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Drive Strength");
483
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Driver %");
477
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Driver %");
478
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Driver %");
479
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Driver %");
480
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Driver %");
484 481
   PROGMEM Language_Str MSG_ERROR_TMC                       = _UxGT("TMC CONNECTION ERROR");
485 482
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("DAC EEPROM Write");
486 483
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER          = _UxGT("FILAMENT CHANGE");

+ 4
- 1
Marlin/src/lcd/language/language_es.h View File

@@ -441,7 +441,10 @@ namespace Language_es {
441 441
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Temp. Máxima");
442 442
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Fuente alimentación");
443 443
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Fuerza de empuje");
444
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Driver %");
444
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Driver %");
445
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Driver %");
446
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Driver %");
447
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Driver %");
445 448
   PROGMEM Language_Str MSG_ERROR_TMC                       = _UxGT("ERROR CONEX. TMC");
446 449
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("Escribe DAC EEPROM");
447 450
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER          = _UxGT("CAMBIAR FILAMENTO");

+ 4
- 1
Marlin/src/lcd/language/language_eu.h View File

@@ -295,7 +295,10 @@ namespace Language_eu {
295 295
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Tenp. Maximoa");
296 296
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Elikadura-iturria");
297 297
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Driver-aren potentzia");
298
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Driver %");
298
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Driver %");
299
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Driver %");
300
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Driver %");
301
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Driver %");
299 302
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("Idatzi DAC EEPROM");
300 303
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE    = _UxGT("HARIZPIA ALDATU");
301 304
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD     = _UxGT("HARIZPIA KARGATU");

+ 30
- 20
Marlin/src/lcd/language/language_fr.h View File

@@ -85,7 +85,7 @@ namespace Language_fr {
85 85
   PROGMEM Language_Str MSG_PREHEAT_2_ALL                   = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" Tout");
86 86
   PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY               = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" lit");
87 87
   PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS              = _UxGT("Régler préch. ") PREHEAT_2_LABEL;
88
-  PROGMEM Language_Str MSG_PREHEAT_CUSTOM                  = _UxGT("Préchauffage perso");
88
+  PROGMEM Language_Str MSG_PREHEAT_CUSTOM                  = _UxGT("Préchauf. perso");
89 89
   PROGMEM Language_Str MSG_COOLDOWN                        = _UxGT("Refroidir");
90 90
   PROGMEM Language_Str MSG_LASER_MENU                      = _UxGT("Contrôle Laser");
91 91
   PROGMEM Language_Str MSG_LASER_POWER                     = _UxGT("Puissance");
@@ -93,7 +93,7 @@ namespace Language_fr {
93 93
   PROGMEM Language_Str MSG_SWITCH_PS_ON                    = _UxGT("Allumer alim.");
94 94
   PROGMEM Language_Str MSG_SWITCH_PS_OFF                   = _UxGT("Eteindre alim.");
95 95
   PROGMEM Language_Str MSG_EXTRUDE                         = _UxGT("Extrusion");
96
-  PROGMEM Language_Str MSG_RETRACT                         = _UxGT("Rétractation");
96
+  PROGMEM Language_Str MSG_RETRACT                         = _UxGT("Rétraction");
97 97
   PROGMEM Language_Str MSG_MOVE_AXIS                       = _UxGT("Déplacer un axe");
98 98
   PROGMEM Language_Str MSG_BED_LEVELING                    = _UxGT("Régler Niv. lit");
99 99
   PROGMEM Language_Str MSG_LEVEL_BED                       = _UxGT("Niveau du lit");
@@ -234,8 +234,9 @@ namespace Language_fr {
234 234
   PROGMEM Language_Str MSG_NOZZLE_N                        = _UxGT("Buse ~");
235 235
   PROGMEM Language_Str MSG_BED                             = _UxGT("Lit");
236 236
   PROGMEM Language_Str MSG_CHAMBER                         = _UxGT("Caisson");
237
-  PROGMEM Language_Str MSG_FAN_SPEED                       = _UxGT("Vit.  ventil.  ");
237
+  PROGMEM Language_Str MSG_FAN_SPEED                       = _UxGT("Vit.  ventil.  "); // 15 car. max
238 238
   PROGMEM Language_Str MSG_FAN_SPEED_N                     = _UxGT("Vit.  ventil. =");
239
+  PROGMEM Language_Str MSG_STORED_FAN_N                    = _UxGT("Vit.  enreg.  =");
239 240
   PROGMEM Language_Str MSG_EXTRA_FAN_SPEED                 = _UxGT("Extra ventil.  ");
240 241
   PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N               = _UxGT("Extra ventil. =");
241 242
 
@@ -258,10 +259,10 @@ namespace Language_fr {
258 259
   PROGMEM Language_Str MSG_VE_JERK                         = _UxGT("Ve jerk");
259 260
   PROGMEM Language_Str MSG_VELOCITY                        = _UxGT("Vélocité");
260 261
   PROGMEM Language_Str MSG_JUNCTION_DEVIATION              = _UxGT("Déviat. jonct.");
261
-  PROGMEM Language_Str MSG_VTRAV_MIN                       = _UxGT("V dépl. min");
262
+  PROGMEM Language_Str MSG_VTRAV_MIN                       = _UxGT("Vmin course");
262 263
   PROGMEM Language_Str MSG_ACCELERATION                    = _UxGT("Accélération");
263
-  PROGMEM Language_Str MSG_A_RETRACT                       = _UxGT("A retrait");
264
-  PROGMEM Language_Str MSG_A_TRAVEL                        = _UxGT("A dépl.");
264
+  PROGMEM Language_Str MSG_A_RETRACT                       = _UxGT("Acc.rétraction");
265
+  PROGMEM Language_Str MSG_A_TRAVEL                        = _UxGT("Acc.course");
265 266
   PROGMEM Language_Str MSG_STEPS_PER_MM                    = _UxGT("Pas/mm");
266 267
   PROGMEM Language_Str MSG_A_STEPS                         = LCD_STR_A _UxGT(" pas/mm");
267 268
   PROGMEM Language_Str MSG_B_STEPS                         = LCD_STR_B _UxGT(" pas/mm");
@@ -271,7 +272,7 @@ namespace Language_fr {
271 272
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Température");
272 273
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Mouvement");
273 274
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Filament");
274
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E en mm3");
275
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E en mm³");
275 276
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Diamètre fil.");
276 277
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Diamètre fil. *");
277 278
   PROGMEM Language_Str MSG_FILAMENT_UNLOAD                 = _UxGT("Retrait mm");
@@ -297,10 +298,15 @@ namespace Language_fr {
297 298
   PROGMEM Language_Str MSG_BUTTON_RESET                    = _UxGT("Reset");
298 299
   PROGMEM Language_Str MSG_BUTTON_CANCEL                   = _UxGT("Annuler");
299 300
   PROGMEM Language_Str MSG_BUTTON_DONE                     = _UxGT("Terminé");
301
+  PROGMEM Language_Str MSG_BUTTON_BACK                     = _UxGT("Retour");
302
+  PROGMEM Language_Str MSG_BUTTON_PROCEED                  = _UxGT("Procéder");
300 303
   PROGMEM Language_Str MSG_PAUSE_PRINT                     = _UxGT("Pause impression");
301 304
   PROGMEM Language_Str MSG_RESUME_PRINT                    = _UxGT("Reprendre impr.");
302 305
   PROGMEM Language_Str MSG_STOP_PRINT                      = _UxGT("Arrêter impr.");
303
-  PROGMEM Language_Str MSG_OUTAGE_RECOVERY                 = _UxGT("Récupér. coupure");
306
+  PROGMEM Language_Str MSG_PRINTING_OBJECT                 = _UxGT("Impression objet");
307
+  PROGMEM Language_Str MSG_CANCEL_OBJECT                   = _UxGT("Annuler objet");
308
+  PROGMEM Language_Str MSG_CANCEL_OBJECT_N                 = _UxGT("Annuler objet =");
309
+  PROGMEM Language_Str MSG_OUTAGE_RECOVERY                 = _UxGT("Récup. coup.");
304 310
   PROGMEM Language_Str MSG_MEDIA_MENU                      = _UxGT("Impression SD");
305 311
   PROGMEM Language_Str MSG_NO_MEDIA                        = _UxGT("Pas de média");
306 312
   PROGMEM Language_Str MSG_DWELL                           = _UxGT("Repos...");
@@ -311,28 +317,29 @@ namespace Language_fr {
311 317
   PROGMEM Language_Str MSG_NO_MOVE                         = _UxGT("Moteurs bloqués");
312 318
   PROGMEM Language_Str MSG_KILLED                          = _UxGT("KILLED");
313 319
   PROGMEM Language_Str MSG_STOPPED                         = _UxGT("STOPPÉ");
314
-  PROGMEM Language_Str MSG_CONTROL_RETRACT                 = _UxGT("Retrait mm");
315
-  PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP            = _UxGT("Ech. Retr. mm");
316
-  PROGMEM Language_Str MSG_CONTROL_RETRACTF                = _UxGT("Retrait V");
320
+  PROGMEM Language_Str MSG_CONTROL_RETRACT                 = _UxGT("Rétraction mm");
321
+  PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP            = _UxGT("Ech. tr. mm");
322
+  PROGMEM Language_Str MSG_CONTROL_RETRACTF                = _UxGT("Vit. rétract°");
317 323
   PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP            = _UxGT("Saut Z mm");
318
-  PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER         = _UxGT("Rappel mm");
319
-  PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP    = _UxGT("Ech. Rappel mm");
320
-  PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF        = _UxGT("Rappel V");
321
-  PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF   = _UxGT("Ech. Rappel V");
322
-  PROGMEM Language_Str MSG_AUTORETRACT                     = _UxGT("Retrait auto");
324
+  PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER         = _UxGT("Rét.reprise mm");
325
+  PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP    = _UxGT("Ech.reprise mm");
326
+  PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF        = _UxGT("V.rét. reprise");
327
+  PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF   = _UxGT("V.éch. reprise");
328
+  PROGMEM Language_Str MSG_AUTORETRACT                     = _UxGT("Rétraction auto");
323 329
   PROGMEM Language_Str MSG_TOOL_CHANGE                     = _UxGT("Changement outil");
324 330
   PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT               = _UxGT("Augmenter Z");
325 331
   PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD          = _UxGT("Vitesse primaire");
326
-  PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD        = _UxGT("Vitesse retrait");
332
+  PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD        = _UxGT("Vitesse rétract°");
327 333
   PROGMEM Language_Str MSG_NOZZLE_STANDBY                  = _UxGT("Attente buse");
328
-  PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH            = _UxGT("Distance retrait");
334
+  PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH            = _UxGT("Longueur retrait");
329 335
   PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH           = _UxGT("Longueur de purge");
330 336
   PROGMEM Language_Str MSG_FILAMENTCHANGE                  = _UxGT("Changer filament");
331 337
   PROGMEM Language_Str MSG_FILAMENTCHANGE_E                = _UxGT("Changer filament *");
332 338
   PROGMEM Language_Str MSG_FILAMENTLOAD                    = _UxGT("Charger filament");
333 339
   PROGMEM Language_Str MSG_FILAMENTLOAD_E                  = _UxGT("Charger filament *");
340
+  PROGMEM Language_Str MSG_FILAMENTUNLOAD                  = _UxGT("Retrait filament");
334 341
   PROGMEM Language_Str MSG_FILAMENTUNLOAD_E                = _UxGT("Retrait filament *");
335
-  PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL              = _UxGT("Décharger tout");
342
+  PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL              = _UxGT("Retirer tout");
336 343
   PROGMEM Language_Str MSG_INIT_MEDIA                      = _UxGT("Charger le média");
337 344
   PROGMEM Language_Str MSG_CHANGE_MEDIA                    = _UxGT("Actualiser média");
338 345
   PROGMEM Language_Str MSG_RELEASE_MEDIA                   = _UxGT("Retirer le média");
@@ -429,7 +436,10 @@ namespace Language_fr {
429 436
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Temp Max");
430 437
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Alimentation");
431 438
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Puiss. moteur ");
432
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Driver %");
439
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Driver %");
440
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Driver %");
441
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Driver %");
442
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Driver %");
433 443
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("DAC EEPROM sauv.");
434 444
   PROGMEM Language_Str MSG_ERROR_TMC                       = _UxGT("ERREUR CONNEXION TMC");
435 445
 

+ 1
- 1
Marlin/src/lcd/language/language_gl.h View File

@@ -111,7 +111,7 @@ namespace Language_gl {
111 111
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Temperatura");
112 112
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Movemento");
113 113
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Filamento");
114
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E en mm3");
114
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E en mm³");
115 115
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Diam. fil.");
116 116
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Diam. fil. *");
117 117
   PROGMEM Language_Str MSG_CONTRAST                        = _UxGT("Constraste LCD");

+ 1
- 1
Marlin/src/lcd/language/language_hr.h View File

@@ -92,7 +92,7 @@ namespace Language_hr {
92 92
   PROGMEM Language_Str MSG_SELECT_E                        = _UxGT("Odaberi *");
93 93
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Temperature");
94 94
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Gibanje");
95
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E in mm3");
95
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E in mm³");
96 96
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Fil. Dia.");
97 97
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Fil. Dia. *");
98 98
   PROGMEM Language_Str MSG_CONTRAST                        = _UxGT("Kontrast LCD-a");

+ 9
- 5
Marlin/src/lcd/language/language_it.h View File

@@ -239,10 +239,11 @@ namespace Language_it {
239 239
   PROGMEM Language_Str MSG_NOZZLE_N                        = _UxGT("Ugello ~");
240 240
   PROGMEM Language_Str MSG_BED                             = _UxGT("Piatto");
241 241
   PROGMEM Language_Str MSG_CHAMBER                         = _UxGT("Camera");
242
-  PROGMEM Language_Str MSG_FAN_SPEED                       = _UxGT("Vel. ventola"); // Max 15 characters
243
-  PROGMEM Language_Str MSG_FAN_SPEED_N                     = _UxGT("Vel. ventola ="); // Max 15 characters
244
-  PROGMEM Language_Str MSG_EXTRA_FAN_SPEED                 = _UxGT("Extra vel.vent."); // Max 15 characters
245
-  PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N               = _UxGT("Extra v.vent. ="); // Max 15 characters
242
+  PROGMEM Language_Str MSG_FAN_SPEED                       = _UxGT("Vel. ventola");     // Max 15 characters
243
+  PROGMEM Language_Str MSG_FAN_SPEED_N                     = _UxGT("Vel. ventola =");   // Max 15 characters
244
+  PROGMEM Language_Str MSG_STORED_FAN_N                    = _UxGT("Ventola mem. =");   // Max 15 characters
245
+  PROGMEM Language_Str MSG_EXTRA_FAN_SPEED                 = _UxGT("Extra vel.vent.");  // Max 15 characters
246
+  PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N               = _UxGT("Extra v.vent. =");  // Max 15 characters
246 247
   PROGMEM Language_Str MSG_FLOW                            = _UxGT("Flusso");
247 248
   PROGMEM Language_Str MSG_FLOW_N                          = _UxGT("Flusso ~");
248 249
   PROGMEM Language_Str MSG_CONTROL                         = _UxGT("Controllo");
@@ -467,7 +468,10 @@ namespace Language_it {
467 468
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Temp max");
468 469
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Alimentatore");
469 470
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Potenza Drive");
470
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Driver %");
471
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Driver %");
472
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Driver %");
473
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Driver %");
474
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Driver %");
471 475
   PROGMEM Language_Str MSG_ERROR_TMC                       = _UxGT("ERR.CONNESSIONE TMC");
472 476
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("Scrivi DAC EEPROM");
473 477
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER          = _UxGT("CAMBIO FILAMENTO");

+ 4
- 1
Marlin/src/lcd/language/language_jp_kana.h View File

@@ -223,7 +223,10 @@ namespace Language_jp_kana {
223 223
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("セッテイサイコウオン");              // "Max Temp"
224 224
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("デンゲンシュベツ");                // "Power Supply"
225 225
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("モータークドウリョク");              // "Drive Strength"
226
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("DACシュツリョク %");               // "Driver %"
226
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X DACシュツリョク %");               // "X Driver %"
227
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y DACシュツリョク %");               // "Y Driver %"
228
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z DACシュツリョク %");               // "Z Driver %"
229
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E DACシュツリョク %");               // "E Driver %"
227 230
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("EEPROMヘホゾン");               // "Store memory"
228 231
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE    = _UxGT("イチジテイシ");
229 232
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME   = _UxGT("プリントサイカイ");                // "Resume print"

+ 5
- 2
Marlin/src/lcd/language/language_nl.h View File

@@ -117,7 +117,7 @@ namespace Language_nl {
117 117
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Filament");
118 118
   PROGMEM Language_Str MSG_ADVANCE_K                       = _UxGT("Advance K");        //accepted english dutch
119 119
   PROGMEM Language_Str MSG_ADVANCE_K_E                     = _UxGT("Advance K *"); //accepted english dutch
120
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E in mm3");
120
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E in mm³");
121 121
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Fil. Dia.");
122 122
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Fil. Dia. *");
123 123
   PROGMEM Language_Str MSG_CONTRAST                        = _UxGT("LCD contrast");
@@ -214,7 +214,10 @@ namespace Language_nl {
214 214
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("PSU");  //accepted English term in Dutch
215 215
 
216 216
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Motorstroom");
217
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Driver %");  //accepted English term in Dutch
217
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Driver %");  //accepted English term in Dutch
218
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Driver %");  //accepted English term in Dutch
219
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Driver %");  //accepted English term in Dutch
220
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Driver %");  //accepted English term in Dutch
218 221
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("DAC Opslaan");
219 222
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME   = _UxGT("Hervat print");
220 223
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE          = _UxGT(" Nozzle: "); //accepeted English term

+ 5
- 2
Marlin/src/lcd/language/language_pl.h View File

@@ -296,7 +296,7 @@ namespace Language_pl {
296 296
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Temperatura");
297 297
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Ruch");
298 298
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Filament");
299
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E w mm3");
299
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E w mm³");
300 300
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Śr. fil.");
301 301
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Śr. fil. *");
302 302
   PROGMEM Language_Str MSG_FILAMENT_UNLOAD                 = _UxGT("Wyładuj mm");
@@ -465,7 +465,10 @@ namespace Language_pl {
465 465
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Max Temp");
466 466
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Zasilacz");
467 467
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Siła silnika");
468
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Siła %");
468
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Siła %");
469
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Siła %");
470
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Siła %");
471
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Siła %");
469 472
   PROGMEM Language_Str MSG_ERROR_TMC                       = _UxGT("TMC BŁĄD POŁĄCZENIA");
470 473
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("Zapisz DAC EEPROM");
471 474
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER          = _UxGT("ZMIEŃ FILAMENT");

+ 1
- 1
Marlin/src/lcd/language/language_pt.h View File

@@ -107,7 +107,7 @@ namespace Language_pt {
107 107
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Temperatura");
108 108
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Movimento");
109 109
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Filamento");
110
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E em mm3");
110
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E em mm³");
111 111
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Fil. Diam.");
112 112
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Fil. Diam. *");
113 113
   PROGMEM Language_Str MSG_CONTRAST                        = _UxGT("Contraste");

+ 1
- 1
Marlin/src/lcd/language/language_pt_br.h View File

@@ -242,7 +242,7 @@ namespace Language_pt_br {
242 242
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Temperatura");
243 243
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Movimento");
244 244
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Filamento");
245
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("Extrusão em mm3");
245
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("Extrusão em mm³");
246 246
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Diâmetro Fil.");
247 247
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Diâmetro Fil. *");
248 248
   PROGMEM Language_Str MSG_FILAMENT_UNLOAD                 = _UxGT("Descarr. mm");

+ 5
- 2
Marlin/src/lcd/language/language_ru.h View File

@@ -258,7 +258,7 @@ namespace Language_ru {
258 258
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Температура");
259 259
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Движение");
260 260
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Филамент");
261
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E в мм3");
261
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E в мм³");
262 262
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Диаметр филамента");
263 263
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Диаметр филамента *");
264 264
   PROGMEM Language_Str MSG_FILAMENT_UNLOAD                 = _UxGT("Загрузка мм");
@@ -408,7 +408,10 @@ namespace Language_ru {
408 408
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Макс. Т");
409 409
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("БП");
410 410
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Сила привода");
411
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Привод %");
411
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Привод %");
412
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Привод %");
413
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Привод %");
414
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Привод %");
412 415
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("Запись DAC EEPROM");
413 416
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE    = _UxGT("ПЕЧАТЬ НА ПАУЗЕ");
414 417
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD     = _UxGT("ЗАГРУЗКА ФИЛАМЕНТА");

+ 4
- 1
Marlin/src/lcd/language/language_sk.h View File

@@ -474,7 +474,10 @@ namespace Language_sk {
474 474
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Teplota max");
475 475
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Nap. zdroj");
476 476
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Budenie motorov");
477
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Motor %");
477
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Motor %");
478
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Motor %");
479
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Motor %");
480
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Motor %");
478 481
   PROGMEM Language_Str MSG_ERROR_TMC                       = _UxGT("CHYBA KOMUNIKÁ. TMC");
479 482
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("Uložiť do EEPROM");
480 483
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER          = _UxGT("VÝMENA FILAMENTU");

+ 4
- 1
Marlin/src/lcd/language/language_tr.h View File

@@ -391,7 +391,10 @@ namespace Language_tr {
391 391
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Max Sıc.");
392 392
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Güç Kaynağı");
393 393
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Sürücü Gücü");
394
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("Sürücü %");
394
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X Sürücü %");
395
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y Sürücü %");
396
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z Sürücü %");
397
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E Sürücü %");
395 398
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("DAC EEPROM Yaz");
396 399
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE    = _UxGT("BASKI DURAKLATILDI");
397 400
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD     = _UxGT("FILAMAN YüKLE");

+ 5
- 2
Marlin/src/lcd/language/language_uk.h View File

@@ -141,7 +141,7 @@ namespace Language_uk {
141 141
   PROGMEM Language_Str MSG_TEMPERATURE                     = _UxGT("Температура");
142 142
   PROGMEM Language_Str MSG_MOTION                          = _UxGT("Рух");
143 143
   PROGMEM Language_Str MSG_FILAMENT                        = _UxGT("Волокно");
144
-  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E в мм3");
144
+  PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED              = _UxGT("E в мм³");
145 145
   PROGMEM Language_Str MSG_FILAMENT_DIAM                   = _UxGT("Діам. волок.");
146 146
   PROGMEM Language_Str MSG_FILAMENT_DIAM_E                 = _UxGT("Діам. волок. *");
147 147
   PROGMEM Language_Str MSG_CONTRAST                        = _UxGT("контраст LCD");
@@ -223,7 +223,10 @@ namespace Language_uk {
223 223
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Джерело жив.");
224 224
 
225 225
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Сила мотору");
226
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("% мотору");
226
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X % мотору");
227
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y % мотору");
228
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z % мотору");
229
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E % мотору");
227 230
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("Запис ЦАП на ПЗП");
228 231
 
229 232
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME   = _UxGT("Відновити друк");

+ 4
- 1
Marlin/src/lcd/language/language_vi.h View File

@@ -398,7 +398,10 @@ namespace Language_vi {
398 398
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("Nhiệt độ tối đa");                      // Max temp
399 399
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("Bộ nguồn");                             // PSU
400 400
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("Sức mạnh ổ đĩa");                       // Drive Strength
401
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("% trình điều khiển");                   // Driver %
401
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X % trình điều khiển");                 // X Driver %
402
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y % trình điều khiển");                 // Y Driver %
403
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z % trình điều khiển");                 // Z Driver %
404
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E % trình điều khiển");                 // E Driver %
402 405
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("Ghi DAC EEPROM");                       // DAC EEPROM Write
403 406
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE    = _UxGT("In tạm dừng");                          // PRINT PAUSED
404 407
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD     = _UxGT("Nạp dây nhựa");

+ 4
- 1
Marlin/src/lcd/language/language_zh_CN.h View File

@@ -359,7 +359,10 @@ namespace Language_zh_CN {
359 359
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("最高温度");     //"Max Temp"
360 360
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("电源供应");     //"Power Supply"
361 361
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("驱动力度");     // "Drive Strength"
362
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("驱动 %");     // "Driver %"
362
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X 驱动 %");     // "X Driver %"
363
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y 驱动 %");     // "Y Driver %"
364
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z 驱动 %");     // "Z Driver %"
365
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E 驱动 %");     // "E Driver %"
363 366
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("保存驱动设置");     // "DAC EEPROM Write"
364 367
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE    = _UxGT("打印已暂停");     // "PRINT PAUSED"
365 368
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD     = _UxGT("装载丝料");     // "LOAD FILAMENT"

+ 4
- 1
Marlin/src/lcd/language/language_zh_TW.h View File

@@ -359,7 +359,10 @@ namespace Language_zh_TW {
359 359
   PROGMEM Language_Str MSG_INFO_MAX_TEMP                   = _UxGT("最高溫度");     //"Max Temp"
360 360
   PROGMEM Language_Str MSG_INFO_PSU                        = _UxGT("電源供應");     //"Power Supply"
361 361
   PROGMEM Language_Str MSG_DRIVE_STRENGTH                  = _UxGT("驅動力度");     // "Drive Strength"
362
-  PROGMEM Language_Str MSG_DAC_PERCENT                     = _UxGT("驅動 %");     // "Driver %"
362
+  PROGMEM Language_Str MSG_DAC_PERCENT_X                   = _UxGT("X 驅動 %");     // "X Driver %"
363
+  PROGMEM Language_Str MSG_DAC_PERCENT_Y                   = _UxGT("Y 驅動 %");     // "Y Driver %"
364
+  PROGMEM Language_Str MSG_DAC_PERCENT_Z                   = _UxGT("Z 驅動 %");     // "Z Driver %"
365
+  PROGMEM Language_Str MSG_DAC_PERCENT_E                   = _UxGT("E 驅動 %");     // "E Driver %"
363 366
   PROGMEM Language_Str MSG_DAC_EEPROM_WRITE                = _UxGT("保存驅動設置");     // "DAC EEPROM Write"
364 367
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE    = _UxGT("列印已暫停");     // "PRINT PAUSED"
365 368
   PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD     = _UxGT("裝載絲料");     // "LOAD FILAMENT"

+ 1
- 1
Marlin/src/lcd/menu/menu_advanced.cpp View File

@@ -65,7 +65,7 @@ void menu_cancelobject();
65 65
     LOOP_XYZE(i) driverPercent[i] = dac_current_get_percent((AxisEnum)i);
66 66
     START_MENU();
67 67
     BACK_ITEM(MSG_ADVANCED_SETTINGS);
68
-    #define EDIT_DAC_PERCENT(A) EDIT_ITEM_P(uint8, PSTR(MSG_##A " " MSG_DAC_PERCENT), &driverPercent[_AXIS(A)], 0, 100, []{ dac_current_set_percents(driverPercent); })
68
+    #define EDIT_DAC_PERCENT(A) EDIT_ITEM(uint8, MSG_DAC_PERCENT_##A, &driverPercent[_AXIS(A)], 0, 100, []{ dac_current_set_percents(driverPercent); })
69 69
     EDIT_DAC_PERCENT(X);
70 70
     EDIT_DAC_PERCENT(Y);
71 71
     EDIT_DAC_PERCENT(Z);

+ 9
- 0
Marlin/src/lcd/menu/menu_main.cpp View File

@@ -106,7 +106,11 @@ void menu_main() {
106 106
     SUBMENU(MSG_TUNE, menu_tune);
107 107
   }
108 108
   else {
109
+
109 110
     #if !HAS_ENCODER_WHEEL && ENABLED(SDSUPPORT)
111
+
112
+      // *** IF THIS SECTION IS CHANGED, REPRODUCE BELOW ***
113
+
110 114
       //
111 115
       // Autostart
112 116
       //
@@ -134,6 +138,7 @@ void menu_main() {
134 138
           ACTION_ITEM(MSG_MEDIA_RELEASED, nullptr);
135 139
         #endif
136 140
       }
141
+
137 142
     #endif // !HAS_ENCODER_WHEEL && SDSUPPORT
138 143
 
139 144
     #if MACHINE_CAN_PAUSE
@@ -197,6 +202,9 @@ void menu_main() {
197 202
   #endif
198 203
 
199 204
   #if HAS_ENCODER_WHEEL && ENABLED(SDSUPPORT)
205
+
206
+    // *** IF THIS SECTION IS CHANGED, REPRODUCE ABOVE ***
207
+
200 208
     //
201 209
     // Autostart
202 210
     //
@@ -224,6 +232,7 @@ void menu_main() {
224 232
         ACTION_ITEM(MSG_MEDIA_RELEASED, nullptr);
225 233
       #endif
226 234
     }
235
+
227 236
   #endif // HAS_ENCODER_WHEEL && SDSUPPORT
228 237
 
229 238
   #if HAS_SERVICE_INTERVALS

+ 39
- 42
Marlin/src/lcd/ultralcd.cpp View File

@@ -200,6 +200,7 @@ millis_t MarlinUI::next_button_update_ms; // = 0
200 200
   #endif
201 201
 
202 202
   #if ENABLED(TOUCH_BUTTONS)
203
+    uint8_t MarlinUI::touch_buttons;
203 204
     uint8_t MarlinUI::repeat_delay;
204 205
   #endif
205 206
 
@@ -778,58 +779,46 @@ void MarlinUI::update() {
778 779
 
779 780
     #if ENABLED(TOUCH_BUTTONS)
780 781
 
781
-      #define TOUCH_MENU_MASK 0x80
782
-
783
-      static bool arrow_pressed; // = false
784
-
785
-      // Handle touch events which are slow to read
786
-      if (ELAPSED(ms, next_button_update_ms)) {
787
-        uint8_t touch_buttons = touch.read_buttons();
788
-        if (touch_buttons) {
789
-          RESET_STATUS_TIMEOUT();
790
-          if (touch_buttons & TOUCH_MENU_MASK) {        // Processing Menu Area touch?
791
-            if (!wait_for_unclick) {                    // If not waiting for a debounce release:
792
-              wait_for_unclick = true;                  //  - Set debounce flag to ignore continous clicks
793
-              wait_for_user = false;                    //  - Any click clears wait for user
794
-              // TODO for next PR.
795
-              //uint8_t tpos = touch_buttons & ~(TOUCH_MENU_MASK);  // Safe 7bit touched screen coordinate
796
-              next_button_update_ms = ms + 500;         // Defer next check for 1/2 second
797
-              #if HAS_LCD_MENU
798
-                refresh();
799
-              #endif
800
-            }
801
-            touch_buttons = 0;                          // Swallow the touch
802
-          }
803
-          buttons |= (touch_buttons & (EN_C | EN_D));   // Pass on Click and Back buttons
804
-          if (touch_buttons & (EN_A | EN_B)) {          // A and/or B button?
782
+      if (touch_buttons) {
783
+        RESET_STATUS_TIMEOUT();
784
+        if (buttons & (EN_A | EN_B)) {                    // Menu arrows, in priority
785
+          if (ELAPSED(ms, next_button_update_ms)) {
805 786
             encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * (ENCODER_PULSES_PER_STEP) * encoderDirection;
806
-            if (touch_buttons & EN_A) encoderDiff *= -1;
807
-            next_button_update_ms = ms + repeat_delay;  // Assume the repeat delay
808
-            if (!wait_for_unclick && !arrow_pressed) {  // On click prepare for repeat
809
-              next_button_update_ms += 250;             // Longer delay on first press
810
-              arrow_pressed = true;                     // Mark arrow as pressed
787
+            if (buttons & EN_A) encoderDiff *= -1;
788
+            next_button_update_ms = ms + repeat_delay;    // Assume the repeat delay
789
+            if (!wait_for_unclick) {
790
+              next_button_update_ms += 250;               // Longer delay on first press
791
+              wait_for_unclick = true;                    // Avoid Back/Select click while repeating
811 792
               #if HAS_BUZZER
812 793
                 buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ);
813 794
               #endif
814 795
             }
815 796
           }
816 797
         }
817
-        if (!(touch_buttons & (EN_A | EN_B))) arrow_pressed = false;
798
+        else if (!wait_for_unclick && (buttons & EN_C)) { // OK button, if not waiting for a debounce release:
799
+          wait_for_unclick = true;                        //  - Set debounce flag to ignore continous clicks
800
+          lcd_clicked = !wait_for_user && !no_reentry;    //  - Keep the click if not waiting for a user-click
801
+          wait_for_user = false;                          //  - Any click clears wait for user
802
+          quick_feedback();                               //  - Always make a click sound
803
+        }
818 804
       }
805
+      else // keep wait_for_unclick value
819 806
 
820 807
     #endif // TOUCH_BUTTONS
821 808
 
822
-    // Integrated LCD click handling via button_pressed
823
-    if (!external_control && button_pressed()) {
824
-      if (!wait_for_unclick) {                        // If not waiting for a debounce release:
825
-        wait_for_unclick = true;                      //  - Set debounce flag to ignore continous clicks
826
-        lcd_clicked = !wait_for_user && !no_reentry;  //  - Keep the click if not waiting for a user-click
827
-        wait_for_user = false;                        //  - Any click clears wait for user
828
-        quick_feedback();                             //  - Always make a click sound
809
+      {
810
+        // Integrated LCD click handling via button_pressed
811
+        if (!external_control && button_pressed()) {
812
+          if (!wait_for_unclick) {                        // If not waiting for a debounce release:
813
+            wait_for_unclick = true;                      //  - Set debounce flag to ignore continous clicks
814
+            lcd_clicked = !wait_for_user && !no_reentry;  //  - Keep the click if not waiting for a user-click
815
+            wait_for_user = false;                        //  - Any click clears wait for user
816
+            quick_feedback();                             //  - Always make a click sound
817
+          }
818
+        }
819
+        else
820
+          wait_for_unclick = false;
829 821
       }
830
-    }
831
-    else
832
-      wait_for_unclick = false;
833 822
 
834 823
     if (LCD_BACK_CLICKED()) {
835 824
       quick_feedback();
@@ -894,8 +883,13 @@ void MarlinUI::update() {
894 883
     next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL;
895 884
 
896 885
     #if ENABLED(TOUCH_BUTTONS)
897
-      if (on_status_screen())
898
-        next_lcd_update_ms += (LCD_UPDATE_INTERVAL) * 2;
886
+
887
+      if (on_status_screen()) next_lcd_update_ms += (LCD_UPDATE_INTERVAL) * 2;
888
+
889
+      #if HAS_ENCODER_ACTION
890
+        touch_buttons = touch.read_buttons();
891
+      #endif
892
+
899 893
     #endif
900 894
 
901 895
     #if ENABLED(LCD_HAS_STATUS_INDICATORS)
@@ -1249,6 +1243,9 @@ void MarlinUI::update() {
1249 1243
           #if HAS_SLOW_BUTTONS
1250 1244
             | slow_buttons
1251 1245
           #endif
1246
+          #if ENABLED(TOUCH_BUTTONS) && HAS_ENCODER_ACTION
1247
+            | touch_buttons
1248
+          #endif
1252 1249
         );
1253 1250
 
1254 1251
       #elif HAS_ADC_BUTTONS

+ 4
- 3
Marlin/src/lcd/ultralcd.h View File

@@ -27,10 +27,10 @@
27 27
   #include "../libs/buzzer.h"
28 28
 #endif
29 29
 
30
-#define HAS_DIGITAL_BUTTONS (!HAS_ADC_BUTTONS && ENABLED(NEWPANEL) || BUTTON_EXISTS(EN1, EN2) || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT))
31
-#define HAS_SHIFT_ENCODER   (!HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_SPI_LCD && DISABLED(NEWPANEL))))
32
-#define HAS_ENCODER_WHEEL  ((!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)) || BUTTON_EXISTS(EN1, EN2))
33 30
 #define HAS_ENCODER_ACTION (HAS_LCD_MENU || ENABLED(ULTIPANEL_FEEDMULTIPLY))
31
+#define HAS_ENCODER_WHEEL  ((!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)) || BUTTON_EXISTS(EN1, EN2))
32
+#define HAS_DIGITAL_BUTTONS (HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT))
33
+#define HAS_SHIFT_ENCODER   (!HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_SPI_LCD && DISABLED(NEWPANEL))))
34 34
 
35 35
 // I2C buttons must be read in the main thread
36 36
 #define HAS_SLOW_BUTTONS EITHER(LCD_I2C_VIKI, LCD_I2C_PANELOLU2)
@@ -425,6 +425,7 @@ public:
425 425
   #if HAS_LCD_MENU
426 426
 
427 427
     #if ENABLED(TOUCH_BUTTONS)
428
+      static uint8_t touch_buttons;
428 429
       static uint8_t repeat_delay;
429 430
     #endif
430 431
 

+ 13
- 6
Marlin/src/module/configuration_store.cpp View File

@@ -788,11 +788,16 @@ void MarlinSettings::postprocess() {
788 788
       _FIELD_TEST(hotendPID);
789 789
       HOTEND_LOOP() {
790 790
         PIDCF_t pidcf = {
791
-                       PID_PARAM(Kp, e),
792
-          unscalePID_i(PID_PARAM(Ki, e)),
793
-          unscalePID_d(PID_PARAM(Kd, e)),
794
-                       PID_PARAM(Kc, e),
795
-                       PID_PARAM(Kf, e)
791
+          #if DISABLED(PIDTEMP)
792
+            DUMMY_PID_VALUE, DUMMY_PID_VALUE, DUMMY_PID_VALUE,
793
+            DUMMY_PID_VALUE, DUMMY_PID_VALUE
794
+          #else
795
+                         PID_PARAM(Kp, e),
796
+            unscalePID_i(PID_PARAM(Ki, e)),
797
+            unscalePID_d(PID_PARAM(Kd, e)),
798
+                         PID_PARAM(Kc, e),
799
+                         PID_PARAM(Kf, e)
800
+          #endif
796 801
         };
797 802
         EEPROM_WRITE(pidcf);
798 803
       }
@@ -2872,10 +2877,12 @@ void MarlinSettings::reset() {
2872 2877
           for (uint8_t py = 0; py < GRID_MAX_POINTS_Y; py++) {
2873 2878
             for (uint8_t px = 0; px < GRID_MAX_POINTS_X; px++) {
2874 2879
               CONFIG_ECHO_START();
2875
-              SERIAL_ECHOPAIR_P(PSTR("  G29 S3 X"), (int)px + 1, SP_Y_STR, (int)py + 1);
2880
+              SERIAL_ECHOPAIR_P(PSTR("  G29 S3 I"), (int)px, PSTR(" J"), (int)py);
2876 2881
               SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(mbl.z_values[px][py]), 5);
2877 2882
             }
2878 2883
           }
2884
+          CONFIG_ECHO_START();
2885
+          SERIAL_ECHOLNPAIR_F_P(PSTR("  G29 S4 Z"), LINEAR_UNIT(mbl.z_offset), 5);
2879 2886
         }
2880 2887
 
2881 2888
       #elif ENABLED(AUTO_BED_LEVELING_UBL)

+ 7
- 5
Marlin/src/module/planner.cpp View File

@@ -2620,13 +2620,15 @@ bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, con
2620 2620
     if (mm == 0.0)
2621 2621
       mm = (delta_mm_cart.x != 0.0 || delta_mm_cart.y != 0.0) ? delta_mm_cart.magnitude() : ABS(delta_mm_cart.z);
2622 2622
 
2623
+    // Cartesian XYZ to kinematic ABC, stored in global 'delta'
2623 2624
     inverse_kinematics(machine);
2624 2625
 
2625 2626
     #if ENABLED(SCARA_FEEDRATE_SCALING)
2626 2627
       // For SCARA scale the feed rate from mm/s to degrees/s
2627 2628
       // i.e., Complete the angular vector in the given time.
2628 2629
       const float duration_recip = inv_duration ?: fr_mm_s / mm;
2629
-      const feedRate_t feedrate = HYPOT(delta.a - position_float.a, delta.b - position_float.b) * duration_recip;
2630
+      const xyz_pos_t diff = delta - position_float;
2631
+      const feedRate_t feedrate = diff.magnitude() * duration_recip;
2630 2632
     #else
2631 2633
       const feedRate_t feedrate = fr_mm_s;
2632 2634
     #endif
@@ -2762,8 +2764,8 @@ void Planner::set_max_acceleration(const uint8_t axis, float targetValue) {
2762 2764
       constexpr xyze_float_t max_accel_edit = MAX_ACCEL_EDIT_VALUES;
2763 2765
       const xyze_float_t &max_acc_edit_scaled = max_accel_edit;
2764 2766
     #else
2765
-      constexpr xyze_float_t max_accel_edit = DEFAULT_MAX_ACCELERATION,
2766
-                             max_acc_edit_scaled = max_accel_edit * 2;
2767
+      constexpr xyze_float_t max_accel_edit = DEFAULT_MAX_ACCELERATION;
2768
+      const xyze_float_t max_acc_edit_scaled = max_accel_edit * 2;
2767 2769
     #endif
2768 2770
     limit_and_warn(targetValue, axis, PSTR("Acceleration"), max_acc_edit_scaled);
2769 2771
   #endif
@@ -2779,8 +2781,8 @@ void Planner::set_max_feedrate(const uint8_t axis, float targetValue) {
2779 2781
       constexpr xyze_float_t max_fr_edit = MAX_FEEDRATE_EDIT_VALUES;
2780 2782
       const xyze_float_t &max_fr_edit_scaled = max_fr_edit;
2781 2783
     #else
2782
-      constexpr xyze_float_t max_fr_edit = DEFAULT_MAX_FEEDRATE,
2783
-                             max_fr_edit_scaled = max_fr_edit * 2;
2784
+      constexpr xyze_float_t max_fr_edit = DEFAULT_MAX_FEEDRATE;
2785
+      const xyze_float_t max_fr_edit_scaled = max_fr_edit * 2;
2784 2786
     #endif
2785 2787
     limit_and_warn(targetValue, axis, PSTR("Feedrate"), max_fr_edit_scaled);
2786 2788
   #endif

+ 4
- 2
Marlin/src/module/probe.cpp View File

@@ -113,7 +113,9 @@ xyz_pos_t probe_offset; // Initialized by settings.load()
113 113
 
114 114
   // Move to the magnet to unlock the probe
115 115
   void run_deploy_moves_script() {
116
-    #if TOUCH_MI_DEPLOY_XPOS > X_MAX_BED
116
+    #ifndef TOUCH_MI_DEPLOY_XPOS
117
+      #define TOUCH_MI_DEPLOY_XPOS X_MIN_POS
118
+    #elif TOUCH_MI_DEPLOY_XPOS > X_MAX_BED
117 119
       TemporaryGlobalEndstopsState unlock_x(false);
118 120
     #endif
119 121
     #if TOUCH_MI_DEPLOY_YPOS > Y_MAX_BED
@@ -356,7 +358,7 @@ bool set_probe_deployed(const bool deploy) {
356 358
   // Make room for probe to deploy (or stow)
357 359
   // Fix-mounted probe should only raise for deploy
358 360
   // unless PAUSE_BEFORE_DEPLOY_STOW is enabled
359
-  #if ENABLED(FIX_MOUNTED_PROBE) && DISABLED(PAUSE_BEFORE_DEPLOY_STOW)
361
+  #if EITHER(FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE) && DISABLED(PAUSE_BEFORE_DEPLOY_STOW)
360 362
     const bool deploy_stow_condition = deploy;
361 363
   #else
362 364
     constexpr bool deploy_stow_condition = true;

+ 8
- 0
Marlin/src/module/probe.h View File

@@ -85,6 +85,8 @@
85 85
     return (
86 86
       #if IS_KINEMATIC
87 87
         (X_CENTER) - probe_radius()
88
+      #elif ENABLED(NOZZLE_AS_PROBE)
89
+        _MAX(MIN_PROBE_EDGE_LEFT, X_MIN_POS)
88 90
       #else
89 91
         _MAX((X_MIN_BED) + (MIN_PROBE_EDGE_LEFT), (X_MIN_POS) + probe_offset.x)
90 92
       #endif
@@ -94,6 +96,8 @@
94 96
     return (
95 97
       #if IS_KINEMATIC
96 98
         (X_CENTER) + probe_radius()
99
+      #elif ENABLED(NOZZLE_AS_PROBE)
100
+        _MAX(MIN_PROBE_EDGE_RIGHT, X_MAX_POS)
97 101
       #else
98 102
         _MIN((X_MAX_BED) - (MIN_PROBE_EDGE_RIGHT), (X_MAX_POS) + probe_offset.x)
99 103
       #endif
@@ -103,6 +107,8 @@
103 107
     return (
104 108
       #if IS_KINEMATIC
105 109
         (Y_CENTER) - probe_radius()
110
+      #elif ENABLED(NOZZLE_AS_PROBE)
111
+        _MIN(MIN_PROBE_EDGE_FRONT, Y_MIN_POS)
106 112
       #else
107 113
         _MAX((Y_MIN_BED) + (MIN_PROBE_EDGE_FRONT), (Y_MIN_POS) + probe_offset.y)
108 114
       #endif
@@ -112,6 +118,8 @@
112 118
     return (
113 119
       #if IS_KINEMATIC
114 120
         (Y_CENTER) + probe_radius()
121
+      #elif ENABLED(NOZZLE_AS_PROBE)
122
+        _MAX(MIN_PROBE_EDGE_BACK, Y_MAX_POS)
115 123
       #else
116 124
         _MIN((Y_MAX_BED) - (MIN_PROBE_EDGE_BACK), (Y_MAX_POS) + probe_offset.y)
117 125
       #endif

+ 0
- 1
Marlin/src/module/scara.cpp View File

@@ -95,7 +95,6 @@ void forward_kinematics_SCARA(const float &a, const float &b) {
95 95
 void inverse_kinematics(const xyz_pos_t &raw) {
96 96
 
97 97
   #if ENABLED(MORGAN_SCARA)
98
-
99 98
     /**
100 99
      * Morgan SCARA Inverse Kinematics. Results in 'delta'.
101 100
      *

+ 98
- 61
Marlin/src/module/stepper.cpp View File

@@ -339,6 +339,24 @@ xyze_int8_t Stepper::count_direction{0};
339 339
   #define E_APPLY_STEP(v,Q) E_STEP_WRITE(stepper_extruder, v)
340 340
 #endif
341 341
 
342
+#define CYCLES_TO_NS(CYC) (1000UL * (CYC) / ((F_CPU) / 1000000))
343
+constexpr uint32_t NS_PER_PULSE_TIMER_TICK = 1000000000UL / (STEPPER_TIMER_RATE);
344
+
345
+// Round up when converting from ns to timer ticks
346
+constexpr uint32_t NS_TO_PULSE_TIMER_TICKS(uint32_t NS) { return (NS + (NS_PER_PULSE_TIMER_TICK) / 2) / (NS_PER_PULSE_TIMER_TICK); }
347
+
348
+#define TIMER_SETUP_NS (CYCLES_TO_NS(TIMER_READ_ADD_AND_STORE_CYCLES))
349
+
350
+#define PULSE_HIGH_TICK_COUNT hal_timer_t(NS_TO_PULSE_TIMER_TICKS(_MIN_PULSE_HIGH_NS - _MIN(_MIN_PULSE_HIGH_NS, TIMER_SETUP_NS)))
351
+#define PULSE_LOW_TICK_COUNT hal_timer_t(NS_TO_PULSE_TIMER_TICKS(_MIN_PULSE_LOW_NS - _MIN(_MIN_PULSE_LOW_NS, TIMER_SETUP_NS)))
352
+
353
+#define START_TIMED_PULSE(DIR) (end_tick_count = HAL_timer_get_count(PULSE_TIMER_NUM) + PULSE_##DIR##_TICK_COUNT)
354
+#define AWAIT_TIMED_PULSE() while (HAL_timer_get_count(PULSE_TIMER_NUM) < end_tick_count) { }
355
+#define START_HIGH_PULSE()  START_TIMED_PULSE(HIGH)
356
+#define START_LOW_PULSE()   START_TIMED_PULSE(LOW)
357
+#define AWAIT_HIGH_PULSE()  AWAIT_TIMED_PULSE()
358
+#define AWAIT_LOW_PULSE()   AWAIT_TIMED_PULSE()
359
+
342 360
 void Stepper::wake_up() {
343 361
   // TCNT1 = 0;
344 362
   ENABLE_STEPPER_DRIVER_INTERRUPT();
@@ -1416,47 +1434,50 @@ void Stepper::stepper_pulse_phase_isr() {
1416 1434
   // Just update the value we will get at the end of the loop
1417 1435
   step_events_completed += events_to_do;
1418 1436
 
1419
-  // Get the timer count and estimate the end of the pulse
1420
-  hal_timer_t pulse_end = HAL_timer_get_count(PULSE_TIMER_NUM) + hal_timer_t(MIN_PULSE_TICKS);
1421
-
1422
-  const hal_timer_t added_step_ticks = hal_timer_t(ADDED_STEP_TICKS);
1423
-
1424 1437
   // Take multiple steps per interrupt (For high speed moves)
1425
-  do {
1438
+  bool firstStep = true;
1439
+  xyze_bool_t step_needed{0};
1440
+  hal_timer_t end_tick_count = 0;
1426 1441
 
1442
+  do {
1427 1443
     #define _APPLY_STEP(AXIS) AXIS ##_APPLY_STEP
1428 1444
     #define _INVERT_STEP_PIN(AXIS) INVERT_## AXIS ##_STEP_PIN
1429 1445
 
1446
+    // Determine if pulses are needed
1447
+    #define PULSE_PREP(AXIS) do{ \
1448
+      delta_error[_AXIS(AXIS)] += advance_dividend[_AXIS(AXIS)]; \
1449
+      step_needed[_AXIS(AXIS)] = (delta_error[_AXIS(AXIS)] >= 0); \
1450
+      if (step_needed[_AXIS(AXIS)]) { \
1451
+        count_position[_AXIS(AXIS)] += count_direction[_AXIS(AXIS)]; \
1452
+        delta_error[_AXIS(AXIS)] -= advance_divisor; \
1453
+      } \
1454
+    }while(0)
1455
+
1430 1456
     // Start an active pulse, if Bresenham says so, and update position
1431 1457
     #define PULSE_START(AXIS) do{ \
1432
-      delta_error[_AXIS(AXIS)] += advance_dividend[_AXIS(AXIS)]; \
1433
-      if (delta_error[_AXIS(AXIS)] >= 0) { \
1458
+      if (step_needed[_AXIS(AXIS)]) { \
1434 1459
         _APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS), 0); \
1435
-        count_position[_AXIS(AXIS)] += count_direction[_AXIS(AXIS)]; \
1436 1460
       } \
1437 1461
     }while(0)
1438 1462
 
1439 1463
     // Stop an active pulse, if any, and adjust error term
1440 1464
     #define PULSE_STOP(AXIS) do { \
1441
-      if (delta_error[_AXIS(AXIS)] >= 0) { \
1442
-        delta_error[_AXIS(AXIS)] -= advance_divisor; \
1465
+      if (step_needed[_AXIS(AXIS)]) { \
1443 1466
         _APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS), 0); \
1444 1467
       } \
1445 1468
     }while(0)
1446 1469
 
1447
-    // Pulse start
1470
+    // Determine if pulses are needed
1448 1471
     #if HAS_X_STEP
1449
-      PULSE_START(X);
1472
+      PULSE_PREP(X);
1450 1473
     #endif
1451 1474
     #if HAS_Y_STEP
1452
-      PULSE_START(Y);
1475
+      PULSE_PREP(Y);
1453 1476
     #endif
1454 1477
     #if HAS_Z_STEP
1455
-      PULSE_START(Z);
1478
+      PULSE_PREP(Z);
1456 1479
     #endif
1457 1480
 
1458
-    // Pulse Extruders
1459
-    // Tick the E axis, correct error term and update position
1460 1481
     #if EITHER(LIN_ADVANCE, MIXING_EXTRUDER)
1461 1482
       delta_error.e += advance_dividend.e;
1462 1483
       if (delta_error.e >= 0) {
@@ -1465,14 +1486,36 @@ void Stepper::stepper_pulse_phase_isr() {
1465 1486
           delta_error.e -= advance_divisor;
1466 1487
           // Don't step E here - But remember the number of steps to perform
1467 1488
           motor_direction(E_AXIS) ? --LA_steps : ++LA_steps;
1468
-        #else // !LIN_ADVANCE && MIXING_EXTRUDER
1469
-          // Don't adjust delta_error.e here!
1470
-          // Being positive is the criteria for ending the pulse.
1471
-          E_STEP_WRITE(mixer.get_next_stepper(), !INVERT_E_STEP_PIN);
1489
+        #else
1490
+          step_needed[E_AXIS] = delta_error.e >= 0;
1472 1491
         #endif
1473 1492
       }
1474
-    #else // !LIN_ADVANCE && !MIXING_EXTRUDER
1475
-      #if HAS_E0_STEP
1493
+    #elif HAS_E0_STEP
1494
+      PULSE_PREP(E);
1495
+    #endif
1496
+
1497
+    #if (MINIMUM_STEPPER_PULSE || MAXIMUM_STEPPER_RATE) && DISABLED(I2S_STEPPER_STREAM)
1498
+      if (firstStep)
1499
+        firstStep = false;
1500
+      else
1501
+        AWAIT_LOW_PULSE();
1502
+    #endif
1503
+
1504
+    // Pulse start
1505
+    #if HAS_X_STEP
1506
+      PULSE_START(X);
1507
+    #endif
1508
+    #if HAS_Y_STEP
1509
+      PULSE_START(Y);
1510
+    #endif
1511
+    #if HAS_Z_STEP
1512
+      PULSE_START(Z);
1513
+    #endif
1514
+
1515
+    #if DISABLED(LIN_ADVANCE)
1516
+      #if ENABLED(MIXING_EXTRUDER)
1517
+        if (step_needed[E_AXIS]) E_STEP_WRITE(mixer.get_next_stepper(), !INVERT_E_STEP_PIN);
1518
+      #elif HAS_E0_STEP
1476 1519
         PULSE_START(E);
1477 1520
       #endif
1478 1521
     #endif
@@ -1482,14 +1525,11 @@ void Stepper::stepper_pulse_phase_isr() {
1482 1525
     #endif
1483 1526
 
1484 1527
     // TODO: need to deal with MINIMUM_STEPPER_PULSE over i2s
1485
-    #if MINIMUM_STEPPER_PULSE && DISABLED(I2S_STEPPER_STREAM)
1486
-      // Just wait for the requested pulse duration
1487
-      while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
1528
+    #if (MINIMUM_STEPPER_PULSE || MAXIMUM_STEPPER_RATE) && DISABLED(I2S_STEPPER_STREAM)
1529
+      START_HIGH_PULSE();
1530
+      AWAIT_HIGH_PULSE();
1488 1531
     #endif
1489 1532
 
1490
-    // Add the delay needed to ensure the maximum driver rate is enforced
1491
-    if (signed(added_step_ticks) > 0) pulse_end += hal_timer_t(added_step_ticks);
1492
-
1493 1533
     // Pulse stop
1494 1534
     #if HAS_X_STEP
1495 1535
       PULSE_STOP(X);
@@ -1503,31 +1543,26 @@ void Stepper::stepper_pulse_phase_isr() {
1503 1543
 
1504 1544
     #if DISABLED(LIN_ADVANCE)
1505 1545
       #if ENABLED(MIXING_EXTRUDER)
1546
+
1506 1547
         if (delta_error.e >= 0) {
1507 1548
           delta_error.e -= advance_divisor;
1508 1549
           E_STEP_WRITE(mixer.get_stepper(), INVERT_E_STEP_PIN);
1509 1550
         }
1551
+
1510 1552
       #else // !MIXING_EXTRUDER
1553
+
1511 1554
         #if HAS_E0_STEP
1512 1555
           PULSE_STOP(E);
1513 1556
         #endif
1514
-      #endif
1515
-    #endif // !LIN_ADVANCE
1516 1557
 
1517
-    // Decrement the count of pending pulses to do
1518
-    --events_to_do;
1558
+      #endif  // !MIXING_EXTRUDER
1559
+    #endif // !LIN_ADVANCE
1519 1560
 
1520
-    // For minimum pulse time wait after stopping pulses also
1521
-    if (events_to_do) {
1522
-      // Just wait for the requested pulse duration
1523
-      while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
1524
-      #if MINIMUM_STEPPER_PULSE
1525
-        // Add to the value, the time that the pulse must be active (to be used on the next loop)
1526
-        pulse_end += hal_timer_t(MIN_PULSE_TICKS);
1527
-      #endif
1528
-    }
1561
+    #if (MINIMUM_STEPPER_PULSE || MAXIMUM_STEPPER_RATE) && DISABLED(I2S_STEPPER_STREAM)
1562
+      if (events_to_do) START_LOW_PULSE();
1563
+    #endif
1529 1564
 
1530
-  } while (events_to_do);
1565
+  } while (--events_to_do);
1531 1566
 }
1532 1567
 
1533 1568
 // This is the last half of the stepper interrupt: This one processes and
@@ -1909,13 +1944,19 @@ uint32_t Stepper::stepper_block_phase_isr() {
1909 1944
       DELAY_NS(MINIMUM_STEPPER_POST_DIR_DELAY);
1910 1945
     #endif
1911 1946
 
1912
-    // Get the timer count and estimate the end of the pulse
1913
-    hal_timer_t pulse_end = HAL_timer_get_count(PULSE_TIMER_NUM) + hal_timer_t(MIN_PULSE_TICKS);
1914
-
1915
-    const hal_timer_t added_step_ticks = hal_timer_t(ADDED_STEP_TICKS);
1947
+    //const hal_timer_t added_step_ticks = hal_timer_t(ADDED_STEP_TICKS);
1916 1948
 
1917 1949
     // Step E stepper if we have steps
1950
+    bool firstStep = true;
1951
+    hal_timer_t end_tick_count = 0;
1952
+
1918 1953
     while (LA_steps) {
1954
+      #if (MINIMUM_STEPPER_PULSE || MAXIMUM_STEPPER_RATE) && DISABLED(I2S_STEPPER_STREAM)
1955
+        if (firstStep)
1956
+          firstStep = false;
1957
+        else
1958
+          AWAIT_LOW_PULSE();
1959
+      #endif
1919 1960
 
1920 1961
       // Set the STEP pulse ON
1921 1962
       #if ENABLED(MIXING_EXTRUDER)
@@ -1925,16 +1966,16 @@ uint32_t Stepper::stepper_block_phase_isr() {
1925 1966
       #endif
1926 1967
 
1927 1968
       // Enforce a minimum duration for STEP pulse ON
1928
-      #if MINIMUM_STEPPER_PULSE
1929
-        // Just wait for the requested pulse duration
1930
-        while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
1969
+      #if (MINIMUM_STEPPER_PULSE || MAXIMUM_STEPPER_RATE)
1970
+        START_HIGH_PULSE();
1931 1971
       #endif
1932 1972
 
1933
-      // Add the delay needed to ensure the maximum driver rate is enforced
1934
-      if (signed(added_step_ticks) > 0) pulse_end += hal_timer_t(added_step_ticks);
1935
-
1936 1973
       LA_steps < 0 ? ++LA_steps : --LA_steps;
1937 1974
 
1975
+      #if (MINIMUM_STEPPER_PULSE || MAXIMUM_STEPPER_RATE)
1976
+        AWAIT_HIGH_PULSE();
1977
+      #endif
1978
+
1938 1979
       // Set the STEP pulse OFF
1939 1980
       #if ENABLED(MIXING_EXTRUDER)
1940 1981
         E_STEP_WRITE(mixer.get_stepper(), INVERT_E_STEP_PIN);
@@ -1944,13 +1985,9 @@ uint32_t Stepper::stepper_block_phase_isr() {
1944 1985
 
1945 1986
       // For minimum pulse time wait before looping
1946 1987
       // Just wait for the requested pulse duration
1947
-      if (LA_steps) {
1948
-        while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
1949
-        #if MINIMUM_STEPPER_PULSE
1950
-          // Add to the value, the time that the pulse must be active (to be used on the next loop)
1951
-          pulse_end += hal_timer_t(MIN_PULSE_TICKS);
1952
-        #endif
1953
-      }
1988
+      #if (MINIMUM_STEPPER_PULSE || MAXIMUM_STEPPER_RATE)
1989
+        if (LA_steps) START_LOW_PULSE();
1990
+      #endif
1954 1991
     } // LA_steps
1955 1992
 
1956 1993
     return interval;
@@ -2239,7 +2276,7 @@ void Stepper::endstop_triggered(const AxisEnum axis) {
2239 2276
       (axis == CORE_AXIS_2
2240 2277
         ? CORESIGN(count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2])
2241 2278
         : count_position[CORE_AXIS_1] + count_position[CORE_AXIS_2]
2242
-      ) * 0.5f
2279
+      ) * double(0.5)
2243 2280
     #else // !IS_CORE
2244 2281
       count_position[axis]
2245 2282
     #endif

+ 33
- 20
Marlin/src/module/stepper.h View File

@@ -56,7 +56,24 @@
56 56
 // Estimate the amount of time the Stepper ISR will take to execute
57 57
 //
58 58
 
59
+/**
60
+ * The method of calculating these cycle-constants is unclear.
61
+ * Most of them are no longer used directly for pulse timing, and exist
62
+ * only to estimate a maximum step rate based on the user's configuration.
63
+ * As 32-bit processors continue to diverge, maintaining cycle counts
64
+ * will become increasingly difficult and error-prone.
65
+ */
66
+
59 67
 #ifdef CPU_32_BIT
68
+  /**
69
+   * Duration of START_TIMED_PULSE
70
+   * 
71
+   * ...as measured on an LPC1768 with a scope and converted to cycles.
72
+   * Not applicable to other 32-bit processors, but as long as others
73
+   * take longer, pulses will be longer. For example the SKR Pro
74
+   * (stm32f407zgt6) requires ~60 cyles.
75
+   */
76
+  #define TIMER_READ_ADD_AND_STORE_CYCLES 34UL
60 77
 
61 78
   // The base ISR takes 792 cycles
62 79
   #define ISR_BASE_CYCLES  792UL
@@ -85,6 +102,8 @@
85 102
   #define ISR_STEPPER_CYCLES 16UL
86 103
 
87 104
 #else
105
+  // Cycles to perform actions in START_TIMED_PULSE
106
+  #define TIMER_READ_ADD_AND_STORE_CYCLES 13UL
88 107
 
89 108
   // The base ISR takes 752 cycles
90 109
   #define ISR_BASE_CYCLES  752UL
@@ -116,43 +135,32 @@
116 135
 
117 136
 // Add time for each stepper
118 137
 #if HAS_X_STEP
119
-  #define ISR_START_X_STEPPER_CYCLES ISR_START_STEPPER_CYCLES
120 138
   #define ISR_X_STEPPER_CYCLES       ISR_STEPPER_CYCLES
121 139
 #else
122
-  #define ISR_START_X_STEPPER_CYCLES 0UL
123 140
   #define ISR_X_STEPPER_CYCLES       0UL
124 141
 #endif
125 142
 #if HAS_Y_STEP
126
-  #define ISR_START_Y_STEPPER_CYCLES ISR_START_STEPPER_CYCLES
127 143
   #define ISR_Y_STEPPER_CYCLES       ISR_STEPPER_CYCLES
128 144
 #else
129 145
   #define ISR_START_Y_STEPPER_CYCLES 0UL
130 146
   #define ISR_Y_STEPPER_CYCLES       0UL
131 147
 #endif
132 148
 #if HAS_Z_STEP
133
-  #define ISR_START_Z_STEPPER_CYCLES ISR_START_STEPPER_CYCLES
134 149
   #define ISR_Z_STEPPER_CYCLES       ISR_STEPPER_CYCLES
135 150
 #else
136
-  #define ISR_START_Z_STEPPER_CYCLES 0UL
137 151
   #define ISR_Z_STEPPER_CYCLES       0UL
138 152
 #endif
139 153
 
140 154
 // E is always interpolated, even for mixing extruders
141
-#define ISR_START_E_STEPPER_CYCLES   ISR_START_STEPPER_CYCLES
142 155
 #define ISR_E_STEPPER_CYCLES         ISR_STEPPER_CYCLES
143 156
 
144 157
 // If linear advance is disabled, the loop also handles them
145 158
 #if DISABLED(LIN_ADVANCE) && ENABLED(MIXING_EXTRUDER)
146
-  #define ISR_START_MIXING_STEPPER_CYCLES ((MIXING_STEPPERS) * (ISR_START_STEPPER_CYCLES))
147 159
   #define ISR_MIXING_STEPPER_CYCLES ((MIXING_STEPPERS) * (ISR_STEPPER_CYCLES))
148 160
 #else
149
-  #define ISR_START_MIXING_STEPPER_CYCLES 0UL
150 161
   #define ISR_MIXING_STEPPER_CYCLES  0UL
151 162
 #endif
152 163
 
153
-// Calculate the minimum time to start all stepper pulses in the ISR loop
154
-#define MIN_ISR_START_LOOP_CYCLES (ISR_START_X_STEPPER_CYCLES + ISR_START_Y_STEPPER_CYCLES + ISR_START_Z_STEPPER_CYCLES + ISR_START_E_STEPPER_CYCLES + ISR_START_MIXING_STEPPER_CYCLES)
155
-
156 164
 // And the total minimum loop time, not including the base
157 165
 #define MIN_ISR_LOOP_CYCLES (ISR_X_STEPPER_CYCLES + ISR_Y_STEPPER_CYCLES + ISR_Z_STEPPER_CYCLES + ISR_E_STEPPER_CYCLES + ISR_MIXING_STEPPER_CYCLES)
158 166
 
@@ -166,18 +174,23 @@
166 174
   #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES(1UL)
167 175
 #endif
168 176
 
169
-// Calculate the minimum ticks of the PULSE timer that must elapse with the step pulse enabled
170
-// adding the "start stepper pulse" code section execution cycles to account for that not all
171
-// pulses start at the beginning of the loop, so an extra time must be added to compensate so
172
-// the last generated pulse (usually the extruder stepper) has the right length
173
-#if HAS_DRIVER(LV8729) && MINIMUM_STEPPER_PULSE == 0
174
-  #define MIN_PULSE_TICKS ((((PULSE_TIMER_TICKS_PER_US) + 1) / 2) + ((MIN_ISR_START_LOOP_CYCLES) / uint32_t(PULSE_TIMER_PRESCALE)))
177
+// Calculate the minimum pulse times (high and low)
178
+#if MINIMUM_STEPPER_PULSE && MAXIMUM_STEPPER_RATE
179
+  constexpr uint32_t _MIN_STEP_PERIOD_NS = 1000000000UL / MAXIMUM_STEPPER_RATE;
180
+  constexpr uint32_t _MIN_PULSE_HIGH_NS = 1000UL * MINIMUM_STEPPER_PULSE;
181
+  constexpr uint32_t _MIN_PULSE_LOW_NS = _MAX((_MIN_STEP_PERIOD_NS - _MIN(_MIN_STEP_PERIOD_NS, _MIN_PULSE_HIGH_NS)), _MIN_PULSE_HIGH_NS);
182
+#elif MINIMUM_STEPPER_PULSE
183
+  // Assume 50% duty cycle
184
+  constexpr uint32_t _MIN_PULSE_HIGH_NS = 1000UL * MINIMUM_STEPPER_PULSE;
185
+  constexpr uint32_t _MIN_PULSE_LOW_NS = _MIN_PULSE_HIGH_NS;
186
+#elif MAXIMUM_STEPPER_RATE
187
+  // Assume 50% duty cycle
188
+  constexpr uint32_t _MIN_PULSE_HIGH_NS = 500000000UL / MAXIMUM_STEPPER_RATE;
189
+  constexpr uint32_t _MIN_PULSE_LOW_NS = _MIN_PULSE_HIGH_NS;
175 190
 #else
176
-  #define MIN_PULSE_TICKS (((PULSE_TIMER_TICKS_PER_US) * uint32_t(MINIMUM_STEPPER_PULSE)) + ((MIN_ISR_START_LOOP_CYCLES) / uint32_t(PULSE_TIMER_PRESCALE)))
191
+  #error "Expected at least one of MINIMUM_STEPPER_PULSE or MAXIMUM_STEPPER_RATE to be defined"
177 192
 #endif
178 193
 
179
-// Calculate the extra ticks of the PULSE timer between step pulses
180
-#define ADDED_STEP_TICKS (((MIN_STEPPER_PULSE_CYCLES) / (PULSE_TIMER_PRESCALE)) - (MIN_PULSE_TICKS))
181 194
 
182 195
 // But the user could be enforcing a minimum time, so the loop time is
183 196
 #define ISR_LOOP_CYCLES (ISR_LOOP_BASE_CYCLES + _MAX(MIN_STEPPER_PULSE_CYCLES, MIN_ISR_LOOP_CYCLES))

+ 101
- 0
Marlin/src/pins/esp32/pins_MRR_ESPA.h View File

@@ -0,0 +1,101 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+#pragma once
23
+
24
+/**
25
+ * MRR ESPA pin assignments
26
+ * MRR ESPA is a 3D printer control board based on the ESP32 microcontroller.
27
+ * Supports 4 stepper drivers, heated bed, single hotend.
28
+ */
29
+
30
+#ifndef ARDUINO_ARCH_ESP32
31
+  #error "Oops! Select an ESP32 board in 'Tools > Board.'"
32
+#elif EXTRUDERS > 1 || E_STEPPERS > 1
33
+  #error "MRR ESPA only supports one E Stepper. Comment out this line to continue."
34
+#elif HOTENDS > 1
35
+  #error "MRR ESPA currently supports only one hotend. Comment out this line to continue."
36
+#endif
37
+
38
+#define BOARD_INFO_NAME       "MRR ESPA"
39
+#define BOARD_WEBSITE_URL     "github.com/maplerainresearch/MRR_ESPA"
40
+#define DEFAULT_MACHINE_NAME  BOARD_INFO_NAME
41
+
42
+//
43
+// Disable I2S stepper stream
44
+//
45
+#ifdef I2S_STEPPER_STREAM
46
+  #undef I2S_STEPPER_STREAM
47
+#endif
48
+#define I2S_WS              -1
49
+#define I2S_BCK             -1
50
+#define I2S_DATA            -1
51
+
52
+//
53
+// Limit Switches
54
+//
55
+#define X_STOP_PIN         34
56
+#define Y_STOP_PIN         35
57
+#define Z_STOP_PIN         15
58
+
59
+//
60
+// Steppers
61
+//
62
+#define X_STEP_PIN         27
63
+#define X_DIR_PIN          26
64
+#define X_ENABLE_PIN       25
65
+//#define X_CS_PIN           21
66
+
67
+#define Y_STEP_PIN         33
68
+#define Y_DIR_PIN          32
69
+#define Y_ENABLE_PIN       X_ENABLE_PIN
70
+//#define Y_CS_PIN           22
71
+
72
+#define Z_STEP_PIN         14
73
+#define Z_DIR_PIN          12
74
+#define Z_ENABLE_PIN       X_ENABLE_PIN
75
+//#define Z_CS_PIN            5 // SS_PIN
76
+
77
+#define E0_STEP_PIN        16
78
+#define E0_DIR_PIN         17
79
+#define E0_ENABLE_PIN      X_ENABLE_PIN
80
+//#define E0_CS_PIN          21
81
+
82
+//
83
+// Temperature Sensors
84
+//
85
+#define TEMP_0_PIN         36   // Analog Input
86
+#define TEMP_BED_PIN       39   // Analog Input
87
+
88
+//
89
+// Heaters / Fans
90
+//
91
+#define HEATER_0_PIN        2
92
+#define FAN_PIN            13
93
+#define HEATER_BED_PIN      4
94
+
95
+//
96
+// MicroSD card
97
+//
98
+#define MOSI_PIN           23
99
+#define MISO_PIN           19
100
+#define SCK_PIN            18
101
+#define SDSS                5

+ 154
- 0
Marlin/src/pins/esp32/pins_MRR_ESPE.h View File

@@ -0,0 +1,154 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+#pragma once
23
+
24
+/**
25
+ * MRR ESPE pin assignments
26
+ * MRR ESPE is a 3D printer control board based on the ESP32 microcontroller.
27
+ * Supports 5 stepper drivers (using I2S stepper stream), heated bed,
28
+ * single hotend, and LCD controller.
29
+ */
30
+
31
+#ifndef ARDUINO_ARCH_ESP32
32
+  #error "Oops! Select an ESP32 board in 'Tools > Board.'"
33
+#elif EXTRUDERS > 2 || E_STEPPERS > 2
34
+  #error "MRR ESPE only supports two E Steppers. Comment out this line to continue."
35
+#elif HOTENDS > 1
36
+  #error "MRR ESPE currently supports only one hotend. Comment out this line to continue."
37
+#endif
38
+
39
+#define BOARD_INFO_NAME      "MRR ESPE"
40
+#define BOARD_WEBSITE_URL    "github.com/maplerainresearch/MRR_ESPE"
41
+#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME
42
+
43
+//
44
+// Limit Switches
45
+//
46
+#define X_STOP_PIN         35
47
+#define Y_STOP_PIN         32
48
+#define Z_STOP_PIN         33
49
+
50
+//
51
+// Enable I2S stepper stream
52
+//
53
+#undef I2S_STEPPER_STREAM
54
+#define I2S_STEPPER_STREAM
55
+
56
+#undef LIN_ADVANCE  // Currently, I2S stream does not work with linear advance
57
+
58
+#define I2S_WS             26
59
+#define I2S_BCK            25
60
+#define I2S_DATA           27
61
+
62
+//
63
+// Steppers
64
+//
65
+#define X_STEP_PIN        129
66
+#define X_DIR_PIN         130
67
+#define X_ENABLE_PIN      128
68
+//#define X_CS_PIN           21
69
+
70
+#define Y_STEP_PIN        132
71
+#define Y_DIR_PIN         133
72
+#define Y_ENABLE_PIN      131
73
+//#define Y_CS_PIN           22
74
+
75
+#define Z_STEP_PIN        135
76
+#define Z_DIR_PIN         136
77
+#define Z_ENABLE_PIN      134
78
+//#define Z_CS_PIN            5 // SS_PIN
79
+
80
+#define E0_STEP_PIN       138
81
+#define E0_DIR_PIN        139
82
+#define E0_ENABLE_PIN     137
83
+//#define E0_CS_PIN          21
84
+
85
+#define E1_STEP_PIN       141
86
+#define E1_DIR_PIN        142
87
+#define E1_ENABLE_PIN     140
88
+//#define E1_CS_PIN          22
89
+
90
+#define Z2_STEP_PIN       141
91
+#define Z2_DIR_PIN        142
92
+#define Z2_ENABLE_PIN     140
93
+//#define Z2_CS_PIN            5
94
+
95
+//
96
+// Temperature Sensors
97
+//
98
+#define TEMP_0_PIN         36   // Analog Input
99
+#define TEMP_1_PIN         34   // Analog Input
100
+#define TEMP_BED_PIN       39   // Analog Input
101
+
102
+//
103
+// Heaters / Fans
104
+//
105
+#define HEATER_0_PIN      145 // 2
106
+#define FAN_PIN           146 // 15
107
+#define HEATER_BED_PIN    144 // 4
108
+
109
+#define CONTROLLER_FAN_PIN 147
110
+//#define E0_AUTO_FAN_PIN 148 // need to update Configuration_adv.h @section extruder 
111
+//#define E1_AUTO_FAN_PIN 149 // need to update Configuration_adv.h @section extruder 
112
+#define FAN1_PIN 149
113
+
114
+//
115
+// MicroSD card
116
+//
117
+#define MOSI_PIN           23
118
+#define MISO_PIN           19
119
+#define SCK_PIN            18
120
+#define SDSS                5
121
+
122
+//////////////////////////
123
+// LCDs and Controllers //
124
+//////////////////////////
125
+
126
+#if HAS_GRAPHICAL_LCD
127
+
128
+  #define LCD_PINS_RS        13
129
+  #define LCD_PINS_ENABLE    17
130
+  #define LCD_PINS_D4        16
131
+
132
+  #if ENABLED(CR10_STOCKDISPLAY)
133
+
134
+    #define BEEPER_PIN      151
135
+
136
+  #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
137
+
138
+    #define BEEPER_PIN      152
139
+
140
+    //#define LCD_PINS_D5     150
141
+    //#define LCD_PINS_D6     151
142
+    //#define LCD_PINS_D7     153
143
+
144
+  #else
145
+
146
+    #error "Only CR10_STOCKDISPLAY and REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER are currently supported. Comment out this line to continue."
147
+
148
+  #endif
149
+
150
+  #define BTN_EN1             0
151
+  #define BTN_EN2            12
152
+  #define BTN_ENC            14
153
+
154
+#endif // HAS_GRAPHICAL_LCD

+ 18
- 7
Marlin/src/pins/lpc1768/pins_BTT_SKR.h View File

@@ -31,18 +31,29 @@
31 31
 //
32 32
 // Steppers
33 33
 //
34
-
35
-#define E1_STEP_PIN        P0_01
36
-#define E1_DIR_PIN         P0_00
37
-#define E1_ENABLE_PIN      P0_10
34
+#ifndef E1_STEP_PIN
35
+  #define E1_STEP_PIN      P0_01
36
+#endif
37
+#ifndef E1_DIR_PIN
38
+  #define E1_DIR_PIN       P0_00
39
+#endif
40
+#ifndef E1_ENABLE_PIN
41
+  #define E1_ENABLE_PIN    P0_10
42
+#endif
38 43
 
39 44
 //
40 45
 // Temperature Sensors
41 46
 //  3.3V max when defined as an analog input
42 47
 //
43
-#define TEMP_BED_PIN       P0_23_A0   // A0 (T0) - (67) - TEMP_BED_PIN
44
-#define TEMP_0_PIN         P0_24_A1   // A1 (T1) - (68) - TEMP_0_PIN
45
-#define TEMP_1_PIN         P0_25_A2   // A2 (T2) - (69) - TEMP_1_PIN
48
+#ifndef TEMP_0_PIN
49
+  #define TEMP_0_PIN       P0_24_A1   // A1 (T1) - (68) - TEMP_0_PIN
50
+#endif
51
+#ifndef TEMP_1_PIN
52
+  #define TEMP_1_PIN       P0_25_A2   // A2 (T2) - (69) - TEMP_1_PIN
53
+#endif
54
+#ifndef TEMP_BED_PIN
55
+  #define TEMP_BED_PIN     P0_23_A0   // A0 (T0) - (67) - TEMP_BED_PIN
56
+#endif
46 57
 
47 58
 //
48 59
 // Heaters / Fans

+ 2
- 0
Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h View File

@@ -53,6 +53,8 @@
53 53
   #define Z_MAX_PIN          P1_25   // Z_MIN
54 54
 #endif
55 55
 
56
+#define ONBOARD_ENDSTOPPULLUPS     // Board has built-in pullups
57
+
56 58
 //
57 59
 // Servos
58 60
 //

+ 280
- 0
Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h View File

@@ -0,0 +1,280 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+#pragma once
23
+
24
+#define BOARD_INFO_NAME "BIGTREE SKR 1.4"
25
+
26
+//
27
+// SD Connection
28
+//
29
+#ifndef SDCARD_CONNECTION
30
+  #define SDCARD_CONNECTION LCD
31
+#endif
32
+
33
+//
34
+// Servos
35
+//
36
+#define SERVO0_PIN         P2_00
37
+
38
+//
39
+// Limit Switches
40
+//
41
+#define X_STOP_PIN         P1_29
42
+#define Y_STOP_PIN         P1_28
43
+#define Z_STOP_PIN         P1_27
44
+
45
+//
46
+// Z Probe (when not Z_MIN_PIN)
47
+//
48
+#ifndef Z_MIN_PROBE_PIN
49
+  #define Z_MIN_PROBE_PIN  P0_10
50
+#endif
51
+
52
+//
53
+// Filament Runout Sensor
54
+//
55
+#define FIL_RUNOUT_PIN     P1_26
56
+#define FIL_RUNOUT2_PIN    P1_25
57
+
58
+//
59
+// Power Supply Control
60
+//
61
+#ifndef PS_ON_PIN
62
+  #define PS_ON_PIN        P1_00
63
+#endif
64
+
65
+//
66
+// Power Loss Detection
67
+//
68
+#ifndef POWER_LOSS_PIN
69
+  #define POWER_LOSS_PIN   P1_00
70
+#endif
71
+
72
+//
73
+// Steppers
74
+//
75
+#define X_STEP_PIN         P2_02
76
+#define X_DIR_PIN          P2_06
77
+#define X_ENABLE_PIN       P2_01
78
+#ifndef X_CS_PIN
79
+  #define X_CS_PIN         P1_10
80
+#endif
81
+
82
+#define Y_STEP_PIN         P0_19
83
+#define Y_DIR_PIN          P0_20
84
+#define Y_ENABLE_PIN       P2_08
85
+#ifndef Y_CS_PIN
86
+  #define Y_CS_PIN         P1_09
87
+#endif
88
+
89
+#define Z_STEP_PIN         P0_22
90
+#define Z_DIR_PIN          P2_11
91
+#define Z_ENABLE_PIN       P0_21
92
+#ifndef Z_CS_PIN
93
+  #define Z_CS_PIN         P1_08
94
+#endif
95
+
96
+#define E0_STEP_PIN        P2_13
97
+#define E0_DIR_PIN         P0_11
98
+#define E0_ENABLE_PIN      P2_12
99
+#ifndef E0_CS_PIN
100
+  #define E0_CS_PIN        P1_04
101
+#endif
102
+
103
+#define E1_STEP_PIN        P1_15
104
+#define E1_DIR_PIN         P1_14
105
+#define E1_ENABLE_PIN      P1_16
106
+#ifndef E1_CS_PIN
107
+  #define E1_CS_PIN        P1_01
108
+#endif
109
+
110
+#define TEMP_1_PIN         P0_23_A0   // A2 (T2) - (69) - TEMP_1_PIN
111
+#define TEMP_BED_PIN       P0_25_A2   // A0 (T0) - (67) - TEMP_BED_PIN
112
+
113
+//
114
+// Include common SKR pins
115
+//
116
+#include "pins_BTT_SKR.h"
117
+
118
+//
119
+// Software SPI pins for TMC2130 stepper drivers
120
+//
121
+#if ENABLED(TMC_USE_SW_SPI)
122
+  #ifndef TMC_SW_MOSI
123
+    #define TMC_SW_MOSI    P1_17
124
+  #endif
125
+  #ifndef TMC_SW_MISO
126
+    #define TMC_SW_MISO    P0_05
127
+  #endif
128
+  #ifndef TMC_SW_SCK
129
+    #define TMC_SW_SCK     P0_04
130
+  #endif
131
+#endif
132
+
133
+#if HAS_TMC220x
134
+  /**
135
+   * TMC2208/TMC2209 stepper drivers
136
+   *
137
+   * Hardware serial communication ports.
138
+   * If undefined software serial is used according to the pins below
139
+   */
140
+  //#define X_HARDWARE_SERIAL  Serial
141
+  //#define X2_HARDWARE_SERIAL Serial1
142
+  //#define Y_HARDWARE_SERIAL  Serial1
143
+  //#define Y2_HARDWARE_SERIAL Serial1
144
+  //#define Z_HARDWARE_SERIAL  Serial1
145
+  //#define Z2_HARDWARE_SERIAL Serial1
146
+  //#define E0_HARDWARE_SERIAL Serial1
147
+  //#define E1_HARDWARE_SERIAL Serial1
148
+  //#define E2_HARDWARE_SERIAL Serial1
149
+  //#define E3_HARDWARE_SERIAL Serial1
150
+  //#define E4_HARDWARE_SERIAL Serial1
151
+
152
+  //
153
+  // Software serial
154
+  //
155
+  #define X_SERIAL_TX_PIN  P1_10
156
+  #define X_SERIAL_RX_PIN  P1_10
157
+
158
+  #define Y_SERIAL_TX_PIN  P1_09
159
+  #define Y_SERIAL_RX_PIN  P1_09
160
+
161
+  #define Z_SERIAL_TX_PIN  P1_08
162
+  #define Z_SERIAL_RX_PIN  P1_08
163
+
164
+  #define E0_SERIAL_TX_PIN P1_04
165
+  #define E0_SERIAL_RX_PIN P1_04
166
+
167
+  #define E1_SERIAL_TX_PIN P1_01
168
+  #define E1_SERIAL_RX_PIN P1_01
169
+
170
+  #define Z2_SERIAL_TX_PIN P1_01
171
+  #define Z2_SERIAL_RX_PIN P1_01
172
+
173
+  // Reduce baud rate to improve software serial reliability
174
+  #define TMC_BAUD_RATE 19200
175
+#endif
176
+
177
+//
178
+// SD Connection
179
+//
180
+#if SD_CONNECTION_IS(LCD)
181
+  #define SS_PIN           P0_16
182
+#endif
183
+
184
+/**
185
+ *              _____                                             _____
186
+ *          NC | · · | GND                                    5V | · · | GND
187
+ *       RESET | · · | 1.31(SD_DETECT)             (LCD_D7) 1.23 | · · | 1.22 (LCD_D6)
188
+ *  (MOSI)0.18 | · · | 3.25(BTN_EN2)               (LCD_D5) 1.21 | · · | 1.20 (LCD_D4)
189
+ * (SD_SS)0.16 | · · | 3.26(BTN_EN1)               (LCD_RS) 1.19 | · · | 1.18 (LCD_EN)
190
+ *   (SCK)0.15 | · · | 0.17(MISO)                 (BTN_ENC) 0.28 | · · | 1.30 (BEEPER)
191
+ *              -----                                             -----
192
+ *              EXP2                                              EXP1
193
+ */
194
+#if HAS_SPI_LCD
195
+  #define BTN_ENC          P0_28   // (58) open-drain
196
+
197
+  #if ENABLED(CR10_STOCKDISPLAY)
198
+    #define LCD_PINS_RS    P1_22
199
+
200
+    #define BTN_EN1        P1_18
201
+    #define BTN_EN2        P1_20
202
+
203
+    #define LCD_PINS_ENABLE P1_23
204
+    #define LCD_PINS_D4    P1_21
205
+
206
+  #else
207
+    #define LCD_PINS_RS    P1_19
208
+
209
+    #define BTN_EN1        P3_26   // (31) J3-2 & AUX-4
210
+    #define BTN_EN2        P3_25   // (33) J3-4 & AUX-4
211
+
212
+    #define LCD_PINS_ENABLE P1_18
213
+    #define LCD_PINS_D4    P1_20
214
+
215
+    #define LCD_SDSS       P0_16   // (16) J3-7 & AUX-4
216
+    #define SD_DETECT_PIN  P1_31   // (49) (NOT 5V tolerant)
217
+
218
+    #if ENABLED(FYSETC_MINI_12864)
219
+      #define DOGLCD_CS    P1_18
220
+      #define DOGLCD_A0    P1_19
221
+      #define DOGLCD_SCK   P0_15
222
+      #define DOGLCD_MOSI  P0_18
223
+
224
+      #define LCD_BACKLIGHT_PIN -1
225
+
226
+      #define FORCE_SOFT_SPI      // Use this if default of hardware SPI causes display problems
227
+                                  //   results in LCD soft SPI mode 3, SD soft SPI mode 0
228
+
229
+      #define LCD_RESET_PIN P1_20   // Must be high or open for LCD to operate normally.
230
+
231
+      #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0)
232
+        #ifndef RGB_LED_R_PIN
233
+          #define RGB_LED_R_PIN P1_21
234
+        #endif
235
+        #ifndef RGB_LED_G_PIN
236
+          #define RGB_LED_G_PIN P1_22
237
+        #endif
238
+        #ifndef RGB_LED_B_PIN
239
+          #define RGB_LED_B_PIN P1_23
240
+        #endif
241
+      #elif ENABLED(FYSETC_MINI_12864_2_1)
242
+        #define NEOPIXEL_PIN    P1_21
243
+      #endif
244
+
245
+    #else // !FYSETC_MINI_12864
246
+
247
+      #if ENABLED(MKS_MINI_12864)
248
+        #define DOGLCD_CS   P1_21
249
+        #define DOGLCD_A0   P1_22
250
+        #define DOGLCD_SCK  P0_15
251
+        #define DOGLCD_MOSI P0_18
252
+        #define FORCE_SOFT_SPI
253
+      #endif
254
+
255
+      #if ENABLED(ULTIPANEL)
256
+        #define LCD_PINS_D5 P1_21
257
+        #define LCD_PINS_D6 P1_22
258
+        #define LCD_PINS_D7 P1_23
259
+      #endif
260
+
261
+    #endif // !FYSETC_MINI_12864
262
+
263
+  #endif
264
+
265
+#endif // HAS_SPI_LCD
266
+
267
+//
268
+// Neopixel LED
269
+//
270
+#ifndef NEOPIXEL_PIN
271
+  #define NEOPIXEL_PIN      P1_24
272
+#endif
273
+
274
+/**
275
+ * Special pins
276
+ *   P1_30  (37) (NOT 5V tolerant)
277
+ *   P1_31  (49) (NOT 5V tolerant)
278
+ *   P0_27  (57) (Open collector)
279
+ *   P0_28  (58) (Open collector)
280
+ */

+ 70
- 46
Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h View File

@@ -166,7 +166,15 @@
166 166
 //
167 167
 #define HEATER_BED_PIN     P2_05
168 168
 #define HEATER_0_PIN       P2_07
169
-#define HEATER_1_PIN       P2_06
169
+#if HOTENDS == 1
170
+  #ifndef FAN1_PIN
171
+    #define FAN1_PIN       P2_06
172
+  #endif
173
+#else
174
+  #ifndef HEATER_1_PIN
175
+    #define HEATER_1_PIN   P2_06
176
+  #endif
177
+#endif
170 178
 #ifndef FAN_PIN
171 179
   #define FAN_PIN          P2_04
172 180
 #endif
@@ -203,60 +211,77 @@
203 211
     #define LCD_PINS_D4    P0_17
204 212
 
205 213
   #else
206
-    #define LCD_PINS_RS    P0_16
207 214
 
208 215
     #define BTN_EN1        P3_25
209 216
     #define BTN_EN2        P3_26
210 217
 
211
-    #define LCD_PINS_ENABLE P0_18
212
-    #define LCD_PINS_D4    P0_15
213
-
214 218
     #define LCD_SDSS       P0_28
215
-    #define SD_DETECT_PIN  P0_27
216 219
 
217
-    #if ENABLED(FYSETC_MINI_12864)
218
-      #define DOGLCD_CS    P0_18
219
-      #define DOGLCD_A0    P0_16
220
-      #define DOGLCD_SCK   P0_07
221
-      #define DOGLCD_MOSI  P1_20
220
+    #if ENABLED(MKS_12864OLED_SSD1306)
222 221
 
223
-      #define LCD_BACKLIGHT_PIN -1
222
+      #define LCD_PINS_DC  P0_17
223
+      #define DOGLCD_CS    P0_16
224
+      #define DOGLCD_A0    LCD_PINS_DC
225
+      #define DOGLCD_SCK   P0_15
226
+      #define DOGLCD_MOSI  P0_18
224 227
 
225
-      #define FORCE_SOFT_SPI      // Use this if default of hardware SPI causes display problems
226
-                                  //   results in LCD soft SPI mode 3, SD soft SPI mode 0
228
+      #define LCD_PINS_RS  P1_00
229
+      #define LCD_PINS_D7  P1_22
230
+      #define KILL_PIN     -1 // NC
227 231
 
228
-      #define LCD_RESET_PIN P0_15   // Must be high or open for LCD to operate normally.
232
+    #else // !MKS_12864OLED_SSD1306
229 233
 
230
-      #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0)
231
-        #ifndef RGB_LED_R_PIN
232
-          #define RGB_LED_R_PIN P0_17
233
-        #endif
234
-        #ifndef RGB_LED_G_PIN
235
-          #define RGB_LED_G_PIN P1_00
236
-        #endif
237
-        #ifndef RGB_LED_B_PIN
238
-          #define RGB_LED_B_PIN P1_22
234
+      #define LCD_PINS_RS  P0_16
235
+
236
+      #define LCD_PINS_ENABLE P0_18
237
+      #define LCD_PINS_D4  P0_15
238
+
239
+      #if ENABLED(FYSETC_MINI_12864)
240
+
241
+        #define DOGLCD_CS  P0_18
242
+        #define DOGLCD_A0  P0_16
243
+        #define DOGLCD_SCK P0_07
244
+        #define DOGLCD_MOSI P1_20
245
+
246
+        #define LCD_BACKLIGHT_PIN -1
247
+
248
+        #define FORCE_SOFT_SPI      // Use this if default of hardware SPI causes display problems
249
+                                    //   results in LCD soft SPI mode 3, SD soft SPI mode 0
250
+
251
+        #define LCD_RESET_PIN P0_15   // Must be high or open for LCD to operate normally.
252
+
253
+        #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0)
254
+          #ifndef RGB_LED_R_PIN
255
+            #define RGB_LED_R_PIN P0_17
256
+          #endif
257
+          #ifndef RGB_LED_G_PIN
258
+            #define RGB_LED_G_PIN P1_00
259
+          #endif
260
+          #ifndef RGB_LED_B_PIN
261
+            #define RGB_LED_B_PIN P1_22
262
+          #endif
263
+        #elif ENABLED(FYSETC_MINI_12864_2_1)
264
+          #define NEOPIXEL_PIN    P0_17
239 265
         #endif
240
-      #elif ENABLED(FYSETC_MINI_12864_2_1)
241
-        #define NEOPIXEL_PIN    P0_17
242
-      #endif
243 266
 
244
-    #else // !FYSETC_MINI_12864
267
+      #else // !FYSETC_MINI_12864
268
+
269
+        #if ENABLED(MKS_MINI_12864)
270
+          #define DOGLCD_CS  P0_17
271
+          #define DOGLCD_A0  P1_00
272
+        #endif
245 273
 
246
-      #if ENABLED(MKS_MINI_12864)
247
-        #define DOGLCD_CS  P0_17
248
-        #define DOGLCD_A0  P1_00
249
-      #endif
274
+        #if ENABLED(ULTIPANEL)
275
+          #define LCD_PINS_D5 P0_17
276
+          #define LCD_PINS_D6 P1_00
277
+          #define LCD_PINS_D7 P1_22
278
+        #endif
250 279
 
251
-      #if ENABLED(ULTIPANEL)
252
-        #define LCD_PINS_D5 P0_17
253
-        #define LCD_PINS_D6 P1_00
254
-        #define LCD_PINS_D7 P1_22
255
-      #endif
280
+      #endif // !FYSETC_MINI_12864
256 281
 
257
-    #endif // !FYSETC_MINI_12864
282
+    #endif // !MKS_12864OLED_SSD1306
258 283
 
259
-  #endif
284
+  #endif // !CR10_STOCKDISPLAY
260 285
 
261 286
 #endif // HAS_SPI_LCD
262 287
 
@@ -266,17 +291,16 @@
266 291
 
267 292
 #define ONBOARD_SD_CS_PIN  P0_06   // Chip select for "System" SD card
268 293
 
269
-#if SD_CONNECTION_IS(LCD)
270
-  #define SCK_PIN          P0_07
271
-  #define MISO_PIN         P0_08
272
-  #define MOSI_PIN         P0_09
273
-  #define SS_PIN           P0_28
274
-#elif SD_CONNECTION_IS(ONBOARD)
294
+#if SD_CONNECTION_IS(LCD) || SD_CONNECTION_IS(ONBOARD)
275 295
   #define SD_DETECT_PIN    P0_27
276 296
   #define SCK_PIN          P0_07
277 297
   #define MISO_PIN         P0_08
278 298
   #define MOSI_PIN         P0_09
279
-  #define SS_PIN           ONBOARD_SD_CS_PIN
299
+  #if SD_CONNECTION_IS(ONBOARD)
300
+    #define SS_PIN         ONBOARD_SD_CS_PIN
301
+  #else
302
+    #define SS_PIN         P0_28
303
+  #endif
280 304
 #elif SD_CONNECTION_IS(CUSTOM_CABLE)
281 305
   #error "No custom SD drive cable defined for this board."
282 306
 #endif

+ 1
- 0
Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h View File

@@ -59,6 +59,7 @@
59 59
 #define Y_MAX_PIN          P1_27   // (15) 10k pullup to 3.3V, 1K series
60 60
 #define Z_MIN_PIN          P1_29   // (18) 10k pullup to 3.3V, 1K series
61 61
 #define Z_MAX_PIN          P1_28   // (19) 10k pullup to 3.3V, 1K series
62
+#define ONBOARD_ENDSTOPPULLUPS     // Board has built-in pullups
62 63
 
63 64
 //
64 65
 // Steppers

+ 2
- 2
Marlin/src/pins/mega/pins_GT2560_V3.h View File

@@ -132,8 +132,8 @@
132 132
 #define HEATER_2_PIN        1
133 133
 #define HEATER_BED_PIN      4
134 134
 #define FAN_PIN             9
135
-//#define FAN1_PIN          8
136
-//#define FAN2_PIN          7
135
+#define FAN1_PIN            8
136
+#define FAN2_PIN            7
137 137
 
138 138
 //
139 139
 // Misc. Functions

+ 18
- 4
Marlin/src/pins/pins.h View File

@@ -354,14 +354,16 @@
354 354
   #include "lpc1768/pins_BIQU_BQ111_A4.h"       // LPC1768                                env:LPC1768
355 355
 #elif MB(SELENA_COMPACT)
356 356
   #include "lpc1768/pins_SELENA_COMPACT.h"      // LPC1768                                env:LPC1768
357
-#elif MB(BIGTREE_SKR_V1_1)
358
-  #include "lpc1768/pins_BTT_SKR_V1_1.h"        // LPC1768                                env:LPC1768
359 357
 #elif MB(BIQU_B300_V1_0)
360 358
   #include "lpc1768/pins_BIQU_B300_V1.0.h"      // LPC1768                                env:LPC1768
361
-#elif MB(BIGTREE_SKR_V1_3)
362
-  #include "lpc1768/pins_BTT_SKR_V1_3.h"        // LPC1768                                env:LPC1768
363 359
 #elif MB(GMARSH_X6_REV1)
364 360
   #include "lpc1768/pins_GMARSH_X6_REV1.h"      // LPC1768                                env:LPC1768
361
+#elif MB(BIGTREE_SKR_V1_1)
362
+  #include "lpc1768/pins_BTT_SKR_V1_1.h"        // LPC1768                                env:LPC1768
363
+#elif MB(BIGTREE_SKR_V1_3)
364
+  #include "lpc1768/pins_BTT_SKR_V1_3.h"        // LPC1768                                env:LPC1768
365
+#elif MB(BIGTREE_SKR_V1_4)
366
+  #include "lpc1768/pins_BTT_SKR_V1_4.h"        // LPC1768                                env:LPC1768
365 367
 
366 368
 //
367 369
 // LPC1769 ARM Cortex M3
@@ -493,6 +495,10 @@
493 495
   #include "stm32/pins_FYSETC_CHEETAH_V12.h"    // STM32F1                                env:STM32F103RC_fysetc
494 496
 #elif MB(LONGER3D_LK)
495 497
   #include "stm32/pins_LONGER3D_LK.h"           // STM32F1                                env:STM32F103VE_longer
498
+#elif MB(MKS_ROBIN_LITE3)
499
+  #include "stm32/pins_MKS_ROBIN_LITE3.h"       // STM32F1                                env:mks_robin_lite3
500
+#elif MB(MKS_ROBIN_PRO)
501
+  #include "stm32/pins_MKS_ROBIN_PRO.h"         // STM32F1                                env:mks_robin_pro
496 502
 
497 503
 //
498 504
 // ARM Cortex-M4F
@@ -531,6 +537,10 @@
531 537
   #include "stm32/pins_VAKE403D.h"              // STM32F4                                env:STM32F4
532 538
 #elif MB(FYSETC_S6)
533 539
   #include "stm32/pins_FYSETC_S6.h"             // STM32F4                                env:FYSETC_S6
540
+#elif MB(FLYF407ZG)
541
+  #include "stm32/pins_FLYF407ZG.h"             // STM32F4                                env:FLYF407ZG
542
+#elif MB(MKS_ROBIN2)
543
+  #include "pins_MKS_ROBIN2.h"                  // STM32F4                                env:MKS_ROBIN2
534 544
 
535 545
 //
536 546
 // ARM Cortex M7
@@ -548,6 +558,10 @@
548 558
 #elif MB(ESPRESSIF_ESP32)
549 559
 
550 560
   #include "esp32/pins_ESP32.h"                 // ESP32                                  env:esp32
561
+#elif MB(MRR_ESPA)
562
+  #include "esp32/pins_MRR_ESPA.h"              // ESP32                                  env:esp32
563
+#elif MB(MRR_ESPE)
564
+  #include "esp32/pins_MRR_ESPE.h"              // ESP32                                  env:esp32
551 565
 
552 566
 //
553 567
 // Linux Native Debug board

+ 1
- 1
Marlin/src/pins/ramps/pins_RAMPS.h View File

@@ -593,7 +593,7 @@
593 593
         //#define LCD_SCREEN_ROT_270
594 594
 
595 595
         // not connected to a pin
596
-        #define LCD_BACKLIGHT_PIN 65   // backlight LED on A11/D65
596
+        #define LCD_BACKLIGHT_PIN -1  // 65 (MKS mini12864 can't adjust backlight by software!)
597 597
 
598 598
         #define BTN_EN1         31
599 599
         #define BTN_EN2         33

+ 0
- 0
Marlin/src/pins/sam/pins_RADDS.h View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save