瀏覽代碼

Merge branch 'bugfix-2.0.x' of https://github.com/MarlinFirmware/Marlin into bugfix-2.0.x

Bob-the-Kuhn 6 年之前
父節點
當前提交
73726d56b3
共有 100 個檔案被更改,包括 1099 行新增523 行删除
  1. 7
    0
      Marlin/Configuration.h
  2. 40
    4
      Marlin/src/HAL/HAL_DUE/HAL_spi_Due.cpp
  3. 38
    2
      Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_st7920_sw_spi.cpp
  4. 15
    4
      Marlin/src/HAL/HAL_ESP32/HAL.cpp
  5. 5
    0
      Marlin/src/HAL/HAL_ESP32/HAL.h
  6. 9
    4
      Marlin/src/HAL/HAL_ESP32/fastio_ESP32.h
  7. 10
    1
      Marlin/src/HAL/HAL_ESP32/i2s.cpp
  8. 2
    0
      Marlin/src/HAL/HAL_ESP32/i2s.h
  9. 1
    1
      Marlin/src/HAL/HAL_ESP32/spi_pins.h
  10. 3
    0
      Marlin/src/HAL/HAL_LPC1768/HAL.h
  11. 1
    6
      Marlin/src/HAL/HAL_LPC1768/SanityCheck.h
  12. 36
    0
      Marlin/src/HAL/shared/HAL_ST7920.h
  13. 1
    0
      Marlin/src/core/debug_out.h
  14. 0
    1
      Marlin/src/core/language.h
  15. 6
    0
      Marlin/src/gcode/calibrate/G34_M422.cpp
  16. 0
    13
      Marlin/src/gcode/eeprom/M500-M504.cpp
  17. 12
    2
      Marlin/src/gcode/feature/trinamic/M906.cpp
  18. 8
    2
      Marlin/src/inc/Conditionals_LCD.h
  19. 1
    3
      Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp
  20. 13
    0
      Marlin/src/lcd/dogm/HAL_LCD_class_defines.h
  21. 1
    31
      Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp
  22. 7
    5
      Marlin/src/lcd/dogm/status_screen_lite_ST7920.h
  23. 38
    33
      Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp
  24. 3
    5
      Marlin/src/lcd/dogm/ultralcd_DOGM.cpp
  25. 2
    2
      Marlin/src/lcd/dogm/ultralcd_DOGM.h
  26. 9
    0
      Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp
  27. 2
    0
      Marlin/src/lcd/language/language_de.h
  28. 21
    0
      Marlin/src/lcd/language/language_en.h
  29. 156
    29
      Marlin/src/lcd/language/language_fr.h
  30. 2
    0
      Marlin/src/lcd/language/language_it.h
  31. 14
    3
      Marlin/src/lcd/menu/menu.cpp
  32. 7
    4
      Marlin/src/lcd/menu/menu.h
  33. 6
    9
      Marlin/src/lcd/menu/menu_advanced.cpp
  34. 17
    17
      Marlin/src/lcd/menu/menu_bed_corners.cpp
  35. 2
    0
      Marlin/src/lcd/menu/menu_job_recovery.cpp
  36. 1
    4
      Marlin/src/lcd/menu/menu_main.cpp
  37. 10
    10
      Marlin/src/lcd/menu/menu_mixer.cpp
  38. 5
    11
      Marlin/src/lcd/menu/menu_sdcard.cpp
  39. 17
    37
      Marlin/src/lcd/menu/menu_service.cpp
  40. 42
    42
      Marlin/src/lcd/menu/menu_tmc.cpp
  41. 4
    2
      Marlin/src/lcd/menu/menu_ubl.cpp
  42. 25
    8
      Marlin/src/lcd/ultralcd.cpp
  43. 7
    1
      Marlin/src/lcd/ultralcd.h
  44. 19
    1
      Marlin/src/module/configuration_store.cpp
  45. 48
    20
      Marlin/src/module/temperature.cpp
  46. 53
    78
      Marlin/src/module/tool_change.cpp
  47. 55
    13
      Marlin/src/pins/pins_BIGTREE_SKR_V1.3.h
  48. 3
    0
      Marlin/src/pins/pins_ESP32.h
  49. 6
    6
      Marlin/src/pins/pins_FORMBOT_RAPTOR.h
  50. 13
    10
      Marlin/src/pins/pins_FORMBOT_TREX2PLUS.h
  51. 4
    2
      Marlin/src/pins/pins_FORMBOT_TREX3.h
  52. 40
    28
      Marlin/src/pins/pins_FYSETC_F6_13.h
  53. 1
    1
      Marlin/src/pins/pins_GEN7_13.h
  54. 32
    9
      Marlin/src/pins/pins_RAMPS.h
  55. 59
    22
      Marlin/src/pins/pins_RAMPS_FD_V1.h
  56. 1
    0
      Marlin/src/pins/pins_RAMPS_RE_ARM.h
  57. 54
    20
      Marlin/src/pins/pins_RURAMPS4D_11.h
  58. 48
    14
      Marlin/src/pins/pins_RURAMPS4D_13.h
  59. 5
    3
      README.md
  60. 1
    0
      config/default/Configuration.h
  61. 1
    0
      config/examples/3DFabXYZ/Migbot/Configuration.h
  62. 1
    0
      config/examples/AlephObjects/TAZ4/Configuration.h
  63. 1
    0
      config/examples/AliExpress/CL-260/Configuration.h
  64. 1
    0
      config/examples/AliExpress/UM2pExt/Configuration.h
  65. 1
    0
      config/examples/Anet/A2/Configuration.h
  66. 1
    0
      config/examples/Anet/A2plus/Configuration.h
  67. 1
    0
      config/examples/Anet/A6/Configuration.h
  68. 1
    0
      config/examples/Anet/A8/Configuration.h
  69. 1
    0
      config/examples/AnyCubic/i3/Configuration.h
  70. 1
    0
      config/examples/ArmEd/Configuration.h
  71. 1
    0
      config/examples/Azteeg/X5GT/Configuration.h
  72. 1
    0
      config/examples/BIBO/TouchX/cyclops/Configuration.h
  73. 1
    0
      config/examples/BIBO/TouchX/default/Configuration.h
  74. 1
    0
      config/examples/BQ/Hephestos/Configuration.h
  75. 1
    0
      config/examples/BQ/Hephestos_2/Configuration.h
  76. 1
    0
      config/examples/BQ/WITBOX/Configuration.h
  77. 1
    0
      config/examples/Cartesio/Configuration.h
  78. 1
    0
      config/examples/Creality/CR-10/Configuration.h
  79. 1
    0
      config/examples/Creality/CR-10S/Configuration.h
  80. 1
    0
      config/examples/Creality/CR-10_5S/Configuration.h
  81. 1
    0
      config/examples/Creality/CR-10mini/Configuration.h
  82. 1
    0
      config/examples/Creality/CR-8/Configuration.h
  83. 1
    0
      config/examples/Creality/Ender-2/Configuration.h
  84. 1
    0
      config/examples/Creality/Ender-3/Configuration.h
  85. 1
    0
      config/examples/Creality/Ender-4/Configuration.h
  86. 1
    0
      config/examples/Einstart-S/Configuration.h
  87. 1
    0
      config/examples/Felix/Configuration.h
  88. 1
    0
      config/examples/Felix/DUAL/Configuration.h
  89. 1
    0
      config/examples/FlashForge/CreatorPro/Configuration.h
  90. 1
    0
      config/examples/FolgerTech/i3-2020/Configuration.h
  91. 1
    0
      config/examples/Formbot/Raptor/Configuration.h
  92. 7
    0
      config/examples/Formbot/T_Rex_2+/Configuration.h
  93. 7
    0
      config/examples/Formbot/T_Rex_3/Configuration.h
  94. 1
    0
      config/examples/Geeetech/A10M/Configuration.h
  95. 1
    0
      config/examples/Geeetech/A20M/Configuration.h
  96. 1
    0
      config/examples/Geeetech/GT2560/Configuration.h
  97. 1
    0
      config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h
  98. 1
    0
      config/examples/Geeetech/MeCreator2/Configuration.h
  99. 1
    0
      config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h
  100. 0
    0
      config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h

+ 7
- 0
Marlin/Configuration.h 查看文件

1910
 // https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8
1910
 // https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8
1911
 //
1911
 //
1912
 //#define FYSETC_MINI_12864
1912
 //#define FYSETC_MINI_12864
1913
+#ifdef FYSETC_MINI_12864
1914
+  #define FYSETC_MINI_12864_REV_1_2              //  types C, D, E & F  back light is monochrome (always on) - discrete RGB signals
1915
+  //#define FYSETC_MINI_12864_REV_2_0            //  types A & B  back light is RGB - requires LED_USER_PRESET_STARTUP - discrete RGB signals
1916
+  //#define FYSETC_MINI_12864_REV_2_1            //  types A & B  back light is RGB - requires LED_USER_PRESET_STARTUP -  RGB
1917
+  //#define FYSETC_MINI_12864_REV_2_1            //  types A & B  back light is RGB - requires LED_USER_PRESET_STARTUP - Neopixel
1918
+#endif
1913
 
1919
 
1914
 //
1920
 //
1915
 // Factory display for Creality CR-10
1921
 // Factory display for Creality CR-10
2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2019
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2014
 // However, control resolution will be halved for each increment;
2020
 // However, control resolution will be halved for each increment;
2015
 // at zero value, there are 128 effective control positions.
2021
 // at zero value, there are 128 effective control positions.
2022
+// :[0,1,2,3,4,5,6,7]
2016
 #define SOFT_PWM_SCALE 0
2023
 #define SOFT_PWM_SCALE 0
2017
 
2024
 
2018
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2025
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 40
- 4
Marlin/src/HAL/HAL_DUE/HAL_spi_Due.cpp 查看文件

53
 // Public functions
53
 // Public functions
54
 // --------------------------------------------------------------------------
54
 // --------------------------------------------------------------------------
55
 
55
 
56
-#if ENABLED(DUE_SOFTWARE_SPI)
56
+#if EITHER(DUE_SOFTWARE_SPI, FORCE_SOFT_SPI)
57
 
57
 
58
   // --------------------------------------------------------------------------
58
   // --------------------------------------------------------------------------
59
   // software SPI
59
   // software SPI
739
     #define SPI_MODE_2_DUE_HW 0
739
     #define SPI_MODE_2_DUE_HW 0
740
     #define SPI_MODE_3_DUE_HW 1
740
     #define SPI_MODE_3_DUE_HW 1
741
 
741
 
742
+    /**
743
+     *  The DUE SPI controller is set up so the upper word of the longword
744
+     *  written to the transmit data register selects which SPI Chip Select
745
+     *  Register is used. This allows different streams to have different SPI
746
+     *  settings.
747
+     *
748
+     *  In practice it's spooky. Some combinations hang the system, while others
749
+     *  upset the peripheral device.
750
+     *
751
+     *  SPI mode should be the same for all streams. The FYSETC_MINI_12864 gets
752
+     *  upset if the clock phase changes after chip select goes active.
753
+     *
754
+     *  SPI_CSR_CSAAT should be set for all streams. If not the WHILE_TX(0)
755
+     *  macro returns immediately which can result in the SPI chip select going
756
+     *  inactive before all the data has been sent.
757
+     *
758
+     *  The TMC2130 library uses SPI0->SPI_CSR[3].
759
+     *
760
+     *  The U8G hardware SPI uses SPI0->SPI_CSR[0]. The system hangs and/or the
761
+     *  FYSETC_MINI_12864 gets upset if lower baud rates are used and the SD card
762
+     *  is inserted or removed.
763
+     *
764
+     *  The SD card uses SPI0->SPI_CSR[3]. Efforts were made to use [1] and [2]
765
+     *  but they all resulted in hangs or garbage on the LCD.
766
+     *
767
+     *  The SPI controlled chip selects are NOT enabled in the GPIO controller.
768
+     *  The application must control the chip select.
769
+     *
770
+     *  All of the above can be avoided by defining FORCE_SOFT_SPI to force the
771
+     *  display to use software SPI.
772
+     *
773
+     */
774
+
742
     void spiInit(uint8_t spiRate=6) {  // Default to slowest rate if not specified)
775
     void spiInit(uint8_t spiRate=6) {  // Default to slowest rate if not specified)
776
+                                       // Also sets U8G SPI rate to 4MHz and the SPI mode to 3
777
+
743
       // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz
778
       // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz
744
       constexpr int spiDivider[] = { 10, 21, 42, 84, 168, 255, 255 };
779
       constexpr int spiDivider[] = { 10, 21, 42, 84, 168, 255, 255 };
745
       if (spiRate > 6) spiRate = 1;
780
       if (spiRate > 6) spiRate = 1;
760
       // TMC2103 compatible setup
795
       // TMC2103 compatible setup
761
       // Master mode, no fault detection, PCS bits in data written to TDR select CSR register
796
       // Master mode, no fault detection, PCS bits in data written to TDR select CSR register
762
       SPI0->SPI_MR = SPI_MR_MSTR | SPI_MR_PS | SPI_MR_MODFDIS;
797
       SPI0->SPI_MR = SPI_MR_MSTR | SPI_MR_PS | SPI_MR_MODFDIS;
763
-      // SPI mode 0, 8 Bit data transfer, baud rate
764
-      SPI0->SPI_CSR[3] = SPI_CSR_SCBR(spiDivider[spiRate]) | SPI_CSR_CSAAT | SPI_MODE_0_DUE_HW;  // use same CSR as TMC2130
798
+      // SPI mode 3, 8 Bit data transfer, baud rate
799
+      SPI0->SPI_CSR[3] = SPI_CSR_SCBR(spiDivider[spiRate]) | SPI_CSR_CSAAT | SPI_MODE_3_DUE_HW;  // use same CSR as TMC2130
800
+      SPI0->SPI_CSR[0] = SPI_CSR_SCBR(spiDivider[1]) | SPI_CSR_CSAAT | SPI_MODE_3_DUE_HW;  // U8G default to 4MHz
765
     }
801
     }
766
 
802
 
767
     void spiBegin() { spiInit(); }
803
     void spiBegin() { spiInit(); }
768
 
804
 
769
     static uint8_t spiTransfer(uint8_t data) {
805
     static uint8_t spiTransfer(uint8_t data) {
770
       WHILE_TX(0);
806
       WHILE_TX(0);
771
-      SPI0->SPI_TDR = (uint32_t)data | 0x00070000UL;  // Add TMC2130 PCS bits to every byte
807
+      SPI0->SPI_TDR = (uint32_t)data | 0x00070000UL;  // Add TMC2130 PCS bits to every byte (use SPI0->SPI_CSR[3])
772
       WHILE_TX(0);
808
       WHILE_TX(0);
773
       WHILE_RX(0);
809
       WHILE_RX(0);
774
       return SPI0->SPI_RDR;
810
       return SPI0->SPI_RDR;

+ 38
- 2
Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_st7920_sw_spi.cpp 查看文件

99
     spiSend_sw_DUE(rs ? 0x0FA : 0x0F8); // Command or Data
99
     spiSend_sw_DUE(rs ? 0x0FA : 0x0F8); // Command or Data
100
     DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe
100
     DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe
101
   }
101
   }
102
-  spiSend_sw_DUE(val & 0x0F0);
102
+  spiSend_sw_DUE(val & 0xF0);
103
   spiSend_sw_DUE(val << 4);
103
   spiSend_sw_DUE(val << 4);
104
 }
104
 }
105
 
105
 
168
   return 1;
168
   return 1;
169
 }
169
 }
170
 
170
 
171
-#endif // HAS_GRAPHICAL_LCD
171
+#if ENABLED(LIGHTWEIGHT_UI)
172
+  #include "../../lcd/ultralcd.h"
173
+  #include "../shared/HAL_ST7920.h"
174
+
175
+  #define ST7920_CS_PIN LCD_PINS_RS
176
+
177
+  #if DOGM_SPI_DELAY_US > 0
178
+    #define U8G_DELAY() DELAY_US(DOGM_SPI_DELAY_US)
179
+  #else
180
+    #define U8G_DELAY() DELAY_US(10)
181
+  #endif
182
+
183
+  void ST7920_cs() {
184
+    WRITE(ST7920_CS_PIN, HIGH);
185
+    U8G_DELAY();
186
+  }
187
+
188
+  void ST7920_ncs() {
189
+    WRITE(ST7920_CS_PIN, LOW);
190
+  }
172
 
191
 
192
+  void ST7920_set_cmd() {
193
+    spiSend_sw_DUE(0xF8);
194
+    DELAY_US(40);
195
+  }
196
+
197
+  void ST7920_set_dat() {
198
+    spiSend_sw_DUE(0xFA);
199
+    DELAY_US(40);
200
+  }
201
+
202
+  void ST7920_write_byte(const uint8_t val) {
203
+    spiSend_sw_DUE(val & 0xF0);
204
+    spiSend_sw_DUE(val << 4);
205
+  }
206
+#endif // LIGHTWEIGHT_UI
207
+
208
+#endif // HAS_GRAPHICAL_LCD
173
 #endif // ARDUINO_ARCH_SAM
209
 #endif // ARDUINO_ARCH_SAM

+ 15
- 4
Marlin/src/HAL/HAL_ESP32/HAL.cpp 查看文件

133
 // --------------------------------------------------------------------------
133
 // --------------------------------------------------------------------------
134
 // ADC
134
 // ADC
135
 // --------------------------------------------------------------------------
135
 // --------------------------------------------------------------------------
136
-#define ADC1_CHANNEL(pin) ADC1_GPIO##pin_CHANNEL
136
+#define ADC1_CHANNEL(pin) ADC1_GPIO ## pin ## _CHANNEL
137
 
137
 
138
 adc1_channel_t get_channel(int pin) {
138
 adc1_channel_t get_channel(int pin) {
139
   switch (pin) {
139
   switch (pin) {
140
-    case 36: return ADC1_GPIO36_CHANNEL;
141
-    case 39: return ADC1_GPIO39_CHANNEL;
140
+    case 39: return ADC1_CHANNEL(39);
141
+    case 36: return ADC1_CHANNEL(36);
142
+    case 35: return ADC1_CHANNEL(35);
143
+    case 34: return ADC1_CHANNEL(34);
144
+    case 33: return ADC1_CHANNEL(33);
145
+    case 32: return ADC1_CHANNEL(32);
142
   }
146
   }
143
 
147
 
144
   return ADC1_CHANNEL_MAX;
148
   return ADC1_CHANNEL_MAX;
147
 void HAL_adc_init() {
151
 void HAL_adc_init() {
148
   // Configure ADC
152
   // Configure ADC
149
   adc1_config_width(ADC_WIDTH_12Bit);
153
   adc1_config_width(ADC_WIDTH_12Bit);
150
-  adc1_config_channel_atten(get_channel(36), ADC_ATTEN_11db);
151
   adc1_config_channel_atten(get_channel(39), ADC_ATTEN_11db);
154
   adc1_config_channel_atten(get_channel(39), ADC_ATTEN_11db);
155
+  adc1_config_channel_atten(get_channel(36), ADC_ATTEN_11db);
156
+  adc1_config_channel_atten(get_channel(35), ADC_ATTEN_11db);
157
+  adc1_config_channel_atten(get_channel(34), ADC_ATTEN_11db);
158
+  adc1_config_channel_atten(get_channel(33), ADC_ATTEN_11db);
159
+  adc1_config_channel_atten(get_channel(32), ADC_ATTEN_11db);
160
+
161
+  // Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail.
162
+  // That's why we're not setting it up here.
152
 
163
 
153
   // Calculate ADC characteristics i.e. gain and offset factors
164
   // Calculate ADC characteristics i.e. gain and offset factors
154
   esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, V_REF, &characteristics);
165
   esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, V_REF, &characteristics);

+ 5
- 0
Marlin/src/HAL/HAL_ESP32/HAL.h 查看文件

30
 
30
 
31
 #include <stdint.h>
31
 #include <stdint.h>
32
 
32
 
33
+// these are going to be re-defined in Arduino.h
33
 #undef DISABLED
34
 #undef DISABLED
34
 #undef M_PI
35
 #undef M_PI
36
+#undef _BV
35
 
37
 
36
 #include <Arduino.h>
38
 #include <Arduino.h>
37
 
39
 
40
+// revert back to the correct (old) definition
38
 #undef DISABLED
41
 #undef DISABLED
39
 #define DISABLED(V...) DO(DIS,&&,V)
42
 #define DISABLED(V...) DO(DIS,&&,V)
43
+// re-define in case Arduino.h has been skipped due to earlier inclusion (i.e. in Marlin\src\HAL\HAL_ESP32\i2s.cpp)
44
+#define _BV(b) (1UL << (b))
40
 
45
 
41
 #include "../shared/math_32bit.h"
46
 #include "../shared/math_32bit.h"
42
 #include "../shared/HAL_SPI.h"
47
 #include "../shared/HAL_SPI.h"

+ 9
- 4
Marlin/src/HAL/HAL_ESP32/fastio_ESP32.h 查看文件

27
  * Utility functions
27
  * Utility functions
28
  */
28
  */
29
 
29
 
30
+// I2S expander pin mapping.
31
+#define IS_I2S_EXPANDER_PIN(IO) TEST(IO, 7)
32
+#define I2S_EXPANDER_PIN_INDEX(IO) (IO & 0x7F)
33
+
30
 // Set pin as input
34
 // Set pin as input
31
 #define _SET_INPUT(IO)          pinMode(IO, INPUT)
35
 #define _SET_INPUT(IO)          pinMode(IO, INPUT)
32
 
36
 
37
 #define _PULLUP(IO, v)          pinMode(IO, v ? INPUT_PULLUP : INPUT)
41
 #define _PULLUP(IO, v)          pinMode(IO, v ? INPUT_PULLUP : INPUT)
38
 
42
 
39
 // Read a pin wrapper
43
 // Read a pin wrapper
40
-#define READ(IO)                digitalRead(IO)
44
+#define READ(IO)                (IS_I2S_EXPANDER_PIN(IO) ? i2s_state(I2S_EXPANDER_PIN_INDEX(IO)) : digitalRead(IO))
41
 
45
 
42
 // Write to a pin wrapper
46
 // Write to a pin wrapper
43
-#define WRITE(IO, v)            (TEST(IO, 7) ? i2s_write(IO & 0x7F, v) : digitalWrite(IO, v))
47
+#define WRITE(IO, v)            (IS_I2S_EXPANDER_PIN(IO) ? i2s_write(I2S_EXPANDER_PIN_INDEX(IO), v) : digitalWrite(IO, v))
44
 
48
 
45
 // Set pin as input wrapper
49
 // Set pin as input wrapper
46
 #define SET_INPUT(IO)           _SET_INPUT(IO)
50
 #define SET_INPUT(IO)           _SET_INPUT(IO)
61
 #define extDigitalRead(IO)      digitalRead(IO)
65
 #define extDigitalRead(IO)      digitalRead(IO)
62
 #define extDigitalWrite(IO,V)   digitalWrite(IO,V)
66
 #define extDigitalWrite(IO,V)   digitalWrite(IO,V)
63
 
67
 
64
-#define PWM_PIN(P)              true
65
-#define USEABLE_HARDWARE_PWM(P) PWM_PIN(P)
68
+// PWM outputs
69
+#define PWM_PIN(P)              (P < 34) // NOTE Pins >= 34 are input only on ESP32, so they can't be used for output.
70
+#define USEABLE_HARDWARE_PWM(P) (!IS_I2S_EXPANDER_PIN(P) && PWM_PIN(P))
66
 
71
 
67
 // Toggle pin value
72
 // Toggle pin value
68
 #define TOGGLE(IO)              WRITE(IO, !READ(IO))
73
 #define TOGGLE(IO)              WRITE(IO, !READ(IO))

+ 10
- 1
Marlin/src/HAL/HAL_ESP32/i2s.cpp 查看文件

21
  */
21
  */
22
 #ifdef ARDUINO_ARCH_ESP32
22
 #ifdef ARDUINO_ARCH_ESP32
23
 
23
 
24
-#include <Arduino.h> // replace that with the proper imports
24
+// replace that with the proper imports, then cleanup workarounds in Marlin\src\HAL\HAL_ESP32\HAL.h
25
+#include <Arduino.h>
26
+// revert back to the correct definition
27
+#undef DISABLED
28
+#define DISABLED(V...) DO(DIS,&&,V)
29
+
25
 #include "i2s.h"
30
 #include "i2s.h"
26
 #include "../../core/macros.h"
31
 #include "../../core/macros.h"
27
 #include "driver/periph_ctrl.h"
32
 #include "driver/periph_ctrl.h"
315
   SET_BIT_TO(i2s_port_data, pin, val);
320
   SET_BIT_TO(i2s_port_data, pin, val);
316
 }
321
 }
317
 
322
 
323
+uint8_t i2s_state(uint8_t pin) {
324
+  return TEST(i2s_port_data, pin);
325
+}
326
+
318
 void i2s_push_sample() {
327
 void i2s_push_sample() {
319
   dma.current[dma.rw_pos++] = i2s_port_data;
328
   dma.current[dma.rw_pos++] = i2s_port_data;
320
 }
329
 }

+ 2
- 0
Marlin/src/HAL/HAL_ESP32/i2s.h 查看文件

26
 
26
 
27
 int i2s_init();
27
 int i2s_init();
28
 
28
 
29
+uint8_t i2s_state(uint8_t pin);
30
+
29
 void i2s_write(uint8_t pin, uint8_t val);
31
 void i2s_write(uint8_t pin, uint8_t val);
30
 
32
 
31
 void i2s_push_sample();
33
 void i2s_push_sample();

+ 1
- 1
Marlin/src/HAL/HAL_ESP32/spi_pins.h 查看文件

18
  */
18
  */
19
 #pragma once
19
 #pragma once
20
 
20
 
21
-#define SS_PIN    5
21
+#define SS_PIN   SDSS
22
 #define SCK_PIN  18
22
 #define SCK_PIN  18
23
 #define MISO_PIN 19
23
 #define MISO_PIN 19
24
 #define MOSI_PIN 23
24
 #define MOSI_PIN 23

+ 3
- 0
Marlin/src/HAL/HAL_LPC1768/HAL.h 查看文件

147
 #define HAL_READ_ADC()         FilteredADC::get_result()
147
 #define HAL_READ_ADC()         FilteredADC::get_result()
148
 #define HAL_ADC_READY()        FilteredADC::finished_conversion()
148
 #define HAL_ADC_READY()        FilteredADC::finished_conversion()
149
 
149
 
150
+// A grace period for the ADC readings to stabilize before they start causing thermal protection errors.
151
+#define THERMAL_PROTECTION_GRACE_PERIOD 500
152
+
150
 // Parse a G-code word into a pin index
153
 // Parse a G-code word into a pin index
151
 int16_t PARSED_PIN_INDEX(const char code, const int16_t dval);
154
 int16_t PARSED_PIN_INDEX(const char code, const int16_t dval);
152
 // P0.6 thru P0.9 are for the onboard SD card
155
 // P0.6 thru P0.9 are for the onboard SD card

+ 1
- 6
Marlin/src/HAL/HAL_LPC1768/SanityCheck.h 查看文件

66
   #endif
66
   #endif
67
 #endif // SPINDLE_LASER_ENABLE
67
 #endif // SPINDLE_LASER_ENABLE
68
 
68
 
69
-#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI) \
70
-    && (MB(RAMPS_14_RE_ARM_EFB) \
71
-    ||  MB(RAMPS_14_RE_ARM_EEB) \
72
-    ||  MB(RAMPS_14_RE_ARM_EFF) \
73
-    ||  MB(RAMPS_14_RE_ARM_EEF) \
74
-    ||  MB(RAMPS_14_RE_ARM_SF))
69
+#if IS_RE_ARM_BOARD && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI)
75
   #error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 require TMC_USE_SW_SPI"
70
   #error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 require TMC_USE_SW_SPI"
76
 #endif
71
 #endif
77
 
72
 

+ 36
- 0
Marlin/src/HAL/shared/HAL_ST7920.h 查看文件

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
+ * HAL/HAL_ST7920.h
26
+ * For the HALs that provide direct access to the ST7920 display
27
+ * (bypassing U8G), it will allow the LIGHTWEIGHT_UI to operate.
28
+ */
29
+
30
+#if HAS_GRAPHICAL_LCD && ENABLED(LIGHTWEIGHT_UI)
31
+  void ST7920_cs();
32
+  void ST7920_ncs();
33
+  void ST7920_set_cmd();
34
+  void ST7920_set_dat();
35
+  void ST7920_write_byte(const uint8_t data);
36
+#endif

+ 1
- 0
Marlin/src/core/debug_out.h 查看文件

26
 //  (or not) in a given .cpp file
26
 //  (or not) in a given .cpp file
27
 //
27
 //
28
 
28
 
29
+#undef DEBUG_PRINT_P
29
 #undef DEBUG_ECHO_START
30
 #undef DEBUG_ECHO_START
30
 #undef DEBUG_ERROR_START
31
 #undef DEBUG_ERROR_START
31
 #undef DEBUG_CHAR
32
 #undef DEBUG_CHAR

+ 0
- 1
Marlin/src/core/language.h 查看文件

344
 #define MSG_LCD_N3 " 4"
344
 #define MSG_LCD_N3 " 4"
345
 #define MSG_LCD_N4 " 5"
345
 #define MSG_LCD_N4 " 5"
346
 #define MSG_LCD_N5 " 6"
346
 #define MSG_LCD_N5 " 6"
347
-#define MSG_E0 "E0"
348
 #define MSG_E1 "E1"
347
 #define MSG_E1 "E1"
349
 #define MSG_E2 "E2"
348
 #define MSG_E2 "E2"
350
 #define MSG_E3 "E3"
349
 #define MSG_E3 "E3"

+ 6
- 0
Marlin/src/gcode/calibrate/G34_M422.cpp 查看文件

126
       extruder_duplication_enabled = false;
126
       extruder_duplication_enabled = false;
127
     #endif
127
     #endif
128
 
128
 
129
+    // Before moving other axes raise Z, if needed. Never lower Z.
130
+    if (current_position[Z_AXIS] < Z_CLEARANCE_BETWEEN_PROBES) {
131
+      if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before moving to probe pos) to ", Z_CLEARANCE_BETWEEN_PROBES);
132
+      do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES);
133
+    }
134
+
129
     // Remember corrections to determine errors on each iteration
135
     // Remember corrections to determine errors on each iteration
130
     float last_z_align_move[Z_STEPPER_COUNT] = ARRAY_N(Z_STEPPER_COUNT, 10000.0f, 10000.0f, 10000.0f),
136
     float last_z_align_move[Z_STEPPER_COUNT] = ARRAY_N(Z_STEPPER_COUNT, 10000.0f, 10000.0f, 10000.0f),
131
           z_measured[Z_STEPPER_COUNT] = { 0 };
137
           z_measured[Z_STEPPER_COUNT] = { 0 };

+ 0
- 13
Marlin/src/gcode/eeprom/M500-M504.cpp 查看文件

25
 #include "../../core/serial.h"
25
 #include "../../core/serial.h"
26
 #include "../../inc/MarlinConfig.h"
26
 #include "../../inc/MarlinConfig.h"
27
 
27
 
28
-#if ENABLED(EXTENSIBLE_UI)
29
-  #include "../../lcd/extensible_ui/ui_api.h"
30
-#endif
31
-
32
 /**
28
 /**
33
  * M500: Store settings in EEPROM
29
  * M500: Store settings in EEPROM
34
  */
30
  */
35
 void GcodeSuite::M500() {
31
 void GcodeSuite::M500() {
36
   (void)settings.save();
32
   (void)settings.save();
37
-  #if ENABLED(EXTENSIBLE_UI)
38
-    ExtUI::onStoreSettings();
39
-  #endif
40
 }
33
 }
41
 
34
 
42
 /**
35
 /**
44
  */
37
  */
45
 void GcodeSuite::M501() {
38
 void GcodeSuite::M501() {
46
   (void)settings.load();
39
   (void)settings.load();
47
-  #if ENABLED(EXTENSIBLE_UI)
48
-    ExtUI::onLoadSettings();
49
-  #endif
50
 }
40
 }
51
 
41
 
52
 /**
42
 /**
54
  */
44
  */
55
 void GcodeSuite::M502() {
45
 void GcodeSuite::M502() {
56
   (void)settings.reset();
46
   (void)settings.reset();
57
-  #if ENABLED(EXTENSIBLE_UI)
58
-    ExtUI::onFactoryReset();
59
-  #endif
60
 }
47
 }
61
 
48
 
62
 #if DISABLED(DISABLE_M503)
49
 #if DISABLED(DISABLE_M503)

+ 12
- 2
Marlin/src/gcode/feature/trinamic/M906.cpp 查看文件

29
 #include "../../../module/stepper_indirection.h"
29
 #include "../../../module/stepper_indirection.h"
30
 
30
 
31
 /**
31
 /**
32
- * M906: Set motor current in milliamps using axis codes X, Y, Z, E
33
- * Report driver currents when no axis specified
32
+ * M906: Set motor current in milliamps.
33
+ *
34
+ * Parameters:
35
+ *   X[current]  - Set mA current for X driver(s)
36
+ *   Y[current]  - Set mA current for Y driver(s)
37
+ *   Z[current]  - Set mA current for Z driver(s)
38
+ *   E[current]  - Set mA current for E driver(s)
39
+ *
40
+ *   I[index]    - Axis sub-index (Omit or 0 for X, Y, Z; 1 for X2, Y2, Z2; 2 for Z3.)
41
+ *   T[index]    - Extruder index (Zero-based. Omit for E0 only.)
42
+ *
43
+ * With no parameters report driver currents.
34
  */
44
  */
35
 void GcodeSuite::M906() {
45
 void GcodeSuite::M906() {
36
   #define TMC_SAY_CURRENT(Q) tmc_get_current(stepper##Q)
46
   #define TMC_SAY_CURRENT(Q) tmc_get_current(stepper##Q)

+ 8
- 2
Marlin/src/inc/Conditionals_LCD.h 查看文件

138
 #elif ENABLED(MKS_MINI_12864)
138
 #elif ENABLED(MKS_MINI_12864)
139
 
139
 
140
   #define MINIPANEL
140
   #define MINIPANEL
141
+  #define DEFAULT_LCD_CONTRAST 150
142
+  #define LCD_CONTRAST_MAX 255
141
 
143
 
142
 #elif ENABLED(FYSETC_MINI_12864)
144
 #elif ENABLED(FYSETC_MINI_12864)
143
 
145
 
153
 #if EITHER(MAKRPANEL, MINIPANEL)
155
 #if EITHER(MAKRPANEL, MINIPANEL)
154
   #define DOGLCD
156
   #define DOGLCD
155
   #define ULTIPANEL
157
   #define ULTIPANEL
156
-  #define DEFAULT_LCD_CONTRAST 17
158
+  #ifndef DEFAULT_LCD_CONTRAST
159
+    #define DEFAULT_LCD_CONTRAST 17
160
+  #endif
157
 #endif
161
 #endif
158
 
162
 
159
 #if ENABLED(ULTI_CONTROLLER)
163
 #if ENABLED(ULTI_CONTROLLER)
325
 /**
329
 /**
326
  * Default LCD contrast for Graphical LCD displays
330
  * Default LCD contrast for Graphical LCD displays
327
  */
331
  */
328
-#define HAS_LCD_CONTRAST HAS_GRAPHICAL_LCD && defined(DEFAULT_LCD_CONTRAST)
332
+#define HAS_LCD_CONTRAST (HAS_GRAPHICAL_LCD && defined(DEFAULT_LCD_CONTRAST))
329
 #if HAS_LCD_CONTRAST
333
 #if HAS_LCD_CONTRAST
330
   #ifndef LCD_CONTRAST_MIN
334
   #ifndef LCD_CONTRAST_MIN
331
     #define LCD_CONTRAST_MIN 0
335
     #define LCD_CONTRAST_MIN 0
562
 #if ENABLED(SLIM_LCD_MENUS)
566
 #if ENABLED(SLIM_LCD_MENUS)
563
   #define BOOT_MARLIN_LOGO_SMALL
567
   #define BOOT_MARLIN_LOGO_SMALL
564
 #endif
568
 #endif
569
+
570
+#define IS_RE_ARM_BOARD (MB(RAMPS_14_RE_ARM_EFB) || MB(RAMPS_14_RE_ARM_EEB) || MB(RAMPS_14_RE_ARM_EFF) || MB(RAMPS_14_RE_ARM_EEF) || MB(RAMPS_14_RE_ARM_SF))

+ 1
- 3
Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp 查看文件

1038
   }
1038
   }
1039
 
1039
 
1040
   void draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff) {
1040
   void draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff) {
1041
-    SETCURSOR(0, 0); lcd_put_u8str_P(pref);
1042
-    if (string) wrap_string(1, string);
1043
-    if (suff) lcd_put_u8str_P(suff);
1041
+    ui.draw_select_screen_prompt(pref, string, suff);
1044
     SETCURSOR(0, LCD_HEIGHT - 1);
1042
     SETCURSOR(0, LCD_HEIGHT - 1);
1045
     lcd_put_wchar(yesno ? ' ' : '['); lcd_put_u8str_P(no); lcd_put_wchar(yesno ? ' ' : ']');
1043
     lcd_put_wchar(yesno ? ' ' : '['); lcd_put_u8str_P(no); lcd_put_wchar(yesno ? ' ' : ']');
1046
     SETCURSOR_RJ(utf8_strlen_P(yes) + 2, LCD_HEIGHT - 1);
1044
     SETCURSOR_RJ(utf8_strlen_P(yes) + 2, LCD_HEIGHT - 1);

+ 13
- 0
Marlin/src/lcd/dogm/HAL_LCD_class_defines.h 查看文件

94
   : U8GLIB(&u8g_dev_tft_320x240_upscale_from_128x64, cs, rs, reset)
94
   : U8GLIB(&u8g_dev_tft_320x240_upscale_from_128x64, cs, rs, reset)
95
   { }
95
   { }
96
 };
96
 };
97
+
98
+
99
+extern u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, u8g_dev_uc1701_mini12864_HAL_2x_hw_spi;
100
+
101
+class U8GLIB_MINI12864_2X_HAL : public U8GLIB {
102
+public:
103
+  U8GLIB_MINI12864_2X_HAL(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
104
+    : U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, sck, mosi, cs, a0, reset)
105
+    { }
106
+  U8GLIB_MINI12864_2X_HAL(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
107
+    : U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_hw_spi, cs, a0, reset)
108
+    { }
109
+};

+ 1
- 31
Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp 查看文件

158
 // function for scroll_or_addr_select()
158
 // function for scroll_or_addr_select()
159
 void ST7920_Lite_Status_Screen::_scroll_or_addr_select(const bool sa) {
159
 void ST7920_Lite_Status_Screen::_scroll_or_addr_select(const bool sa) {
160
   extended_function_set(true);
160
   extended_function_set(true);
161
-  cmd(0b00100010 |
162
-    (sa   ? 0b000001 : 0)
163
-  );
161
+  cmd(0b00000010 | (sa ? 0b00000001 : 0));
164
   current_bits.sa = sa;
162
   current_bits.sa = sa;
165
 }
163
 }
166
 
164
 
907
   ncs();
905
   ncs();
908
 }
906
 }
909
 
907
 
910
-#if ENABLED(U8GLIB_ST7920) && !defined(U8G_HAL_LINKS) && !defined(__SAM3X8E__)
911
-
912
-  #include "ultralcd_st7920_u8glib_rrd_AVR.h"
913
-
914
-  void ST7920_Lite_Status_Screen::cs() {
915
-    ST7920_CS();
916
-    current_bits.synced = false;
917
-  }
918
-
919
-  void ST7920_Lite_Status_Screen::ncs() {
920
-    ST7920_NCS();
921
-    current_bits.synced = false;
922
-  }
923
-
924
-  void ST7920_Lite_Status_Screen::sync_cmd() {
925
-    ST7920_SET_CMD();
926
-  }
927
-
928
-  void ST7920_Lite_Status_Screen::sync_dat() {
929
-    ST7920_SET_DAT();
930
-  }
931
-
932
-  void ST7920_Lite_Status_Screen::write_byte(const uint8_t data) {
933
-    ST7920_WRITE_BYTE(data);
934
-  }
935
-
936
-#endif
937
-
938
 void MarlinUI::draw_status_screen() {
908
 void MarlinUI::draw_status_screen() {
939
   ST7920_Lite_Status_Screen::update(false);
909
   ST7920_Lite_Status_Screen::update(false);
940
 }
910
 }

+ 7
- 5
Marlin/src/lcd/dogm/status_screen_lite_ST7920.h 查看文件

15
  */
15
  */
16
 #pragma once
16
 #pragma once
17
 
17
 
18
+#include "../../HAL/shared/HAL_ST7920.h"
19
+
18
 #include "../../core/macros.h"
20
 #include "../../core/macros.h"
19
 #include "../../libs/duration_t.h"
21
 #include "../../libs/duration_t.h"
20
 
22
 
28
       uint8_t sa       : 1;
30
       uint8_t sa       : 1;
29
     } current_bits;
31
     } current_bits;
30
 
32
 
31
-    static void cs();
32
-    static void ncs();
33
-    static void sync_cmd();
34
-    static void sync_dat();
35
-    static void write_byte(const uint8_t w);
33
+    static void cs()                        { ST7920_cs(); current_bits.synced = false; }
34
+    static void ncs()                       { ST7920_cs(); current_bits.synced = false; }
35
+    static void sync_cmd()                  { ST7920_set_cmd(); }
36
+    static void sync_dat()                  { ST7920_set_dat(); }
37
+    static void write_byte(const uint8_t w) { ST7920_write_byte(w); }
36
 
38
 
37
     FORCE_INLINE static void write_word(const uint16_t w) {
39
     FORCE_INLINE static void write_word(const uint16_t w) {
38
       write_byte((w >> 8) & 0xFF);
40
       write_byte((w >> 8) & 0xFF);

+ 38
- 33
Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp 查看文件

66
 #define PAGE_HEIGHT 8
66
 #define PAGE_HEIGHT 8
67
 
67
 
68
 static const uint8_t u8g_dev_uc1701_mini12864_HAL_init_seq[] PROGMEM = {
68
 static const uint8_t u8g_dev_uc1701_mini12864_HAL_init_seq[] PROGMEM = {
69
-  U8G_ESC_CS(0),             /* disable chip */
70
-  U8G_ESC_ADR(0),           /* instruction mode */
71
-  U8G_ESC_RST(1),           /* do reset low pulse with (1*16)+2 milliseconds */
72
-  U8G_ESC_CS(1),             /* enable chip */
73
-
74
-  0x0E2,            /* soft reset */
75
-  0x040,    /* set display start line to 0 */
76
-  0x0A0,    /* ADC set to reverse */
77
-  0x0C8,    /* common output mode */
78
-  0x0A6,    /* display normal, bit val 0: LCD pixel off. */
79
-  0x0A2,    /* LCD bias 1/9 */
80
-  0x02F,    /* all power  control circuits on */
81
-  0x0F8,    /* set booster ratio to */
82
-  0x000,    /* 4x */
83
-  0x023,    /* set V0 voltage resistor ratio to large */
84
-  0x081,    /* set contrast */
85
-  0x027,    /* contrast value */
86
-  0x0AC,    /* indicator */
87
-  0x000,    /* disable */
88
-  0x0AF,    /* display on */
89
-
90
-  U8G_ESC_DLY(100),       /* delay 100 ms */
91
-  0x0A5,                    /* display all points, ST7565 */
92
-  U8G_ESC_DLY(100),       /* delay 100 ms */
93
-  U8G_ESC_DLY(100),       /* delay 100 ms */
94
-  0x0A4,                    /* normal display */
95
-  U8G_ESC_CS(0),             /* disable chip */
96
-  U8G_ESC_END                /* end of sequence */
69
+  U8G_ESC_CS(0),              /* disable chip */
70
+  U8G_ESC_ADR(0),             /* instruction mode */
71
+  U8G_ESC_RST(1),             /* do reset low pulse with (1*16)+2 milliseconds */
72
+  U8G_ESC_CS(1),              /* enable chip */
73
+
74
+  0x0E2,                      /* soft reset */
75
+  0x040,                      /* set display start line to 0 */
76
+  0x0A0,                      /* ADC set to reverse */
77
+  0x0C8,                      /* common output mode */
78
+  0x0A6,                      /* display normal, bit val 0: LCD pixel off. */
79
+  0x0A2,                      /* LCD bias 1/9 */
80
+  0x02F,                      /* all power control circuits on */
81
+  0x0F8,                      /* set booster ratio to */
82
+  0x000,                      /* 4x */
83
+  0x023,                      /* set V0 voltage resistor ratio to large */
84
+  0x081,                      /* set contrast */
85
+  0x027,                      /* contrast value */
86
+  0x0AC,                      /* indicator */
87
+  0x000,                      /* disable */
88
+  0x0AF,                      /* display on */
89
+
90
+  U8G_ESC_CS(0),              /* disable chip */
91
+  U8G_ESC_DLY(100),           /* delay 100 ms */
92
+  U8G_ESC_CS(1),              /* enable chip */
93
+
94
+  0x0A5,                      /* display all points, ST7565 */
95
+  U8G_ESC_CS(0),              /* disable chip */
96
+  U8G_ESC_DLY(100),           /* delay 100 ms */
97
+  U8G_ESC_DLY(100),           /* delay 100 ms */
98
+  U8G_ESC_CS(1),              /* enable chip */
99
+  0x0A4,                      /* normal display */
100
+  U8G_ESC_CS(0),              /* disable chip */
101
+  U8G_ESC_END                 /* end of sequence */
97
 };
102
 };
98
 
103
 
99
 static const uint8_t u8g_dev_uc1701_mini12864_HAL_data_start[] PROGMEM = {
104
 static const uint8_t u8g_dev_uc1701_mini12864_HAL_data_start[] PROGMEM = {
100
-  U8G_ESC_ADR(0),           /* instruction mode */
101
-  U8G_ESC_CS(1),             /* enable chip */
102
-  0x010,    /* set upper 4 bit of the col adr to 0 */
103
-  0x000,    /* set lower 4 bit of the col adr to 4  */
104
-  U8G_ESC_END                /* end of sequence */
105
+  U8G_ESC_ADR(0),             /* instruction mode */
106
+  U8G_ESC_CS(1),              /* enable chip */
107
+  0x010,                      /* set upper 4 bit of the col adr to 0 */
108
+  0x000,                      /* set lower 4 bit of the col adr to 4 */
109
+  U8G_ESC_END                 /* end of sequence */
105
 };
110
 };
106
 
111
 
107
 uint8_t u8g_dev_uc1701_mini12864_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
112
 uint8_t u8g_dev_uc1701_mini12864_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {

+ 3
- 5
Marlin/src/lcd/dogm/ultralcd_DOGM.cpp 查看文件

175
 
175
 
176
     // Can the text fit to the right of the bitmap?
176
     // Can the text fit to the right of the bitmap?
177
     if (text_max_width < rspace) {
177
     if (text_max_width < rspace) {
178
-      constexpr uint8_t inter = (width - text_max_width - (START_BMPWIDTH)) / 3; // Evenly distribute horizontal space
178
+      constexpr int8_t inter = (width - text_max_width - (START_BMPWIDTH)) / 3; // Evenly distribute horizontal space
179
       offx = inter;                             // First the boot logo...
179
       offx = inter;                             // First the boot logo...
180
       offy = (height - (START_BMPHEIGHT)) / 2;  // ...V-aligned in the full height
180
       offy = (height - (START_BMPHEIGHT)) / 2;  // ...V-aligned in the full height
181
       txt_offx_1 = txt_offx_2 = inter + (START_BMPWIDTH) + inter; // Text right of the bitmap
181
       txt_offx_1 = txt_offx_2 = inter + (START_BMPWIDTH) + inter; // Text right of the bitmap
182
       txt_base = (height + MENU_FONT_ASCENT + text_total_height - (MENU_FONT_HEIGHT)) / 2; // Text vertical center
182
       txt_base = (height + MENU_FONT_ASCENT + text_total_height - (MENU_FONT_HEIGHT)) / 2; // Text vertical center
183
     }
183
     }
184
     else {
184
     else {
185
-      constexpr uint8_t inter = (height - text_total_height - (START_BMPHEIGHT)) / 3; // Evenly distribute vertical space
185
+      constexpr int8_t inter = (height - text_total_height - (START_BMPHEIGHT)) / 3; // Evenly distribute vertical space
186
       offy = inter;                             // V-align boot logo proportionally
186
       offy = inter;                             // V-align boot logo proportionally
187
       offx = rspace / 2;                        // Center the boot logo in the whole space
187
       offx = rspace / 2;                        // Center the boot logo in the whole space
188
       txt_offx_1 = (width - text_width_1) / 2;  // Text 1 centered
188
       txt_offx_1 = (width - text_width_1) / 2;  // Text 1 centered
439
   }
439
   }
440
 
440
 
441
   void draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff) {
441
   void draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff) {
442
-    SETCURSOR(0, 0); lcd_put_u8str_P(pref);
443
-    if (string) wrap_string(1, string);
444
-    if (suff) lcd_put_u8str_P(suff);
442
+    ui.draw_select_screen_prompt(pref, string, suff);
445
     draw_boxed_string(1, LCD_HEIGHT - 1, no, !yesno);
443
     draw_boxed_string(1, LCD_HEIGHT - 1, no, !yesno);
446
     draw_boxed_string(LCD_WIDTH - (utf8_strlen_P(yes) + 1), LCD_HEIGHT - 1, yes, yesno);
444
     draw_boxed_string(LCD_WIDTH - (utf8_strlen_P(yes) + 1), LCD_HEIGHT - 1, yes, yesno);
447
   }
445
   }

+ 2
- 2
Marlin/src/lcd/dogm/ultralcd_DOGM.h 查看文件

111
   // The MINIPanel display
111
   // The MINIPanel display
112
   //#define U8G_CLASS U8GLIB_MINI12864
112
   //#define U8G_CLASS U8GLIB_MINI12864
113
   //#define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // 8 stripes
113
   //#define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // 8 stripes
114
-  #define U8G_CLASS U8GLIB_MINI12864_2X
115
-  #if EITHER(FYSETC_MINI_12864, TARGET_LPC1768)
114
+  #define U8G_CLASS U8GLIB_MINI12864_2X_HAL
115
+  #if BOTH(FYSETC_MINI_12864, FORCE_SOFT_SPI)
116
     #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0   // 4 stripes SW-SPI
116
     #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0   // 4 stripes SW-SPI
117
   #else
117
   #else
118
     #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // 4 stripes HW-SPI
118
     #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // 4 stripes HW-SPI

+ 9
- 0
Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp 查看文件

134
 
134
 
135
 #pragma GCC reset_options
135
 #pragma GCC reset_options
136
 
136
 
137
+#if ENABLED(LIGHTWEIGHT_UI)
138
+  #include "../../HAL/shared/HAL_ST7920.h"
139
+  void ST7920_cs()                          { ST7920_CS(); }
140
+  void ST7920_ncs()                         { ST7920_NCS(); }
141
+  void ST7920_set_cmd()                     { ST7920_SET_CMD(); }
142
+  void ST7920_set_dat()                     { ST7920_SET_DAT(); }
143
+  void ST7920_write_byte(const uint8_t val) { ST7920_WRITE_BYTE(val); }
144
+#endif
145
+
137
 #endif // U8GLIB_ST7920 && !U8G_HAL_LINKS && !__SAM3X8E__
146
 #endif // U8GLIB_ST7920 && !U8G_HAL_LINKS && !__SAM3X8E__

+ 2
- 0
Marlin/src/lcd/language/language_de.h 查看文件

332
 #define MSG_ENDSTOP_ABORT                   _UxGT("Endstopp Abbr.")
332
 #define MSG_ENDSTOP_ABORT                   _UxGT("Endstopp Abbr.")
333
 #define MSG_HEATING_FAILED_LCD              _UxGT("HEIZEN ERFOLGLOS")
333
 #define MSG_HEATING_FAILED_LCD              _UxGT("HEIZEN ERFOLGLOS")
334
 #define MSG_HEATING_FAILED_LCD_BED          _UxGT("Bett heizen fehlge.")
334
 #define MSG_HEATING_FAILED_LCD_BED          _UxGT("Bett heizen fehlge.")
335
+#define MSG_HEATING_FAILED_LCD_CHAMBER      _UxGT("Geh. heizen fehlge.")
335
 #define MSG_ERR_REDUNDANT_TEMP              _UxGT("REDUND. TEMP-ABWEI.")
336
 #define MSG_ERR_REDUNDANT_TEMP              _UxGT("REDUND. TEMP-ABWEI.")
336
 #define MSG_THERMAL_RUNAWAY                 LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT")
337
 #define MSG_THERMAL_RUNAWAY                 LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT")
337
 #define MSG_THERMAL_RUNAWAY_BED             _UxGT("BETT") MSG_THERMAL_RUNAWAY
338
 #define MSG_THERMAL_RUNAWAY_BED             _UxGT("BETT") MSG_THERMAL_RUNAWAY
339
+#define MSG_THERMAL_RUNAWAY_CHAMBER         _UxGT("GEH.") MSG_THERMAL_RUNAWAY
338
 #define MSG_ERR_MAXTEMP                     LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN")
340
 #define MSG_ERR_MAXTEMP                     LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN")
339
 #define MSG_ERR_MINTEMP                     LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN")
341
 #define MSG_ERR_MINTEMP                     LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN")
340
 #define MSG_ERR_MAXTEMP_BED                 _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN")
342
 #define MSG_ERR_MAXTEMP_BED                 _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN")

+ 21
- 0
Marlin/src/lcd/language/language_en.h 查看文件

753
 #ifndef MSG_START_PRINT
753
 #ifndef MSG_START_PRINT
754
   #define MSG_START_PRINT                     _UxGT("Start print")
754
   #define MSG_START_PRINT                     _UxGT("Start print")
755
 #endif
755
 #endif
756
+#ifndef MSG_BUTTON_NEXT
757
+  #define MSG_BUTTON_NEXT                     _UxGT("Next")
758
+#endif
759
+#ifndef MSG_BUTTON_INIT
760
+  #define MSG_BUTTON_INIT                     _UxGT("Init")
761
+#endif
762
+#ifndef MSG_BUTTON_STOP
763
+  #define MSG_BUTTON_STOP                     _UxGT("Stop")
764
+#endif
756
 #ifndef MSG_BUTTON_PRINT
765
 #ifndef MSG_BUTTON_PRINT
757
   #define MSG_BUTTON_PRINT                    _UxGT("Print")
766
   #define MSG_BUTTON_PRINT                    _UxGT("Print")
758
 #endif
767
 #endif
768
+#ifndef MSG_BUTTON_RESET
769
+  #define MSG_BUTTON_RESET                    _UxGT("Reset")
770
+#endif
759
 #ifndef MSG_BUTTON_CANCEL
771
 #ifndef MSG_BUTTON_CANCEL
760
   #define MSG_BUTTON_CANCEL                   _UxGT("Cancel")
772
   #define MSG_BUTTON_CANCEL                   _UxGT("Cancel")
761
 #endif
773
 #endif
774
+#ifndef MSG_BUTTON_DONE
775
+  #define MSG_BUTTON_DONE                     _UxGT("Done")
776
+#endif
762
 #ifndef MSG_PAUSE_PRINT
777
 #ifndef MSG_PAUSE_PRINT
763
   #define MSG_PAUSE_PRINT                     _UxGT("Pause print")
778
   #define MSG_PAUSE_PRINT                     _UxGT("Pause print")
764
 #endif
779
 #endif
930
 #ifndef MSG_HEATING_FAILED_LCD_BED
945
 #ifndef MSG_HEATING_FAILED_LCD_BED
931
   #define MSG_HEATING_FAILED_LCD_BED          _UxGT("Bed heating failed")
946
   #define MSG_HEATING_FAILED_LCD_BED          _UxGT("Bed heating failed")
932
 #endif
947
 #endif
948
+#ifndef MSG_HEATING_FAILED_LCD_CHAMBER
949
+  #define MSG_HEATING_FAILED_LCD_CHAMBER      _UxGT("Chamber heating fail")
950
+#endif
933
 #ifndef MSG_ERR_REDUNDANT_TEMP
951
 #ifndef MSG_ERR_REDUNDANT_TEMP
934
   #define MSG_ERR_REDUNDANT_TEMP              _UxGT("Err: REDUNDANT TEMP")
952
   #define MSG_ERR_REDUNDANT_TEMP              _UxGT("Err: REDUNDANT TEMP")
935
 #endif
953
 #endif
939
 #ifndef MSG_THERMAL_RUNAWAY_BED
957
 #ifndef MSG_THERMAL_RUNAWAY_BED
940
   #define MSG_THERMAL_RUNAWAY_BED             _UxGT("BED THERMAL RUNAWAY")
958
   #define MSG_THERMAL_RUNAWAY_BED             _UxGT("BED THERMAL RUNAWAY")
941
 #endif
959
 #endif
960
+#ifndef MSG_THERMAL_RUNAWAY_CHAMBER
961
+  #define MSG_THERMAL_RUNAWAY_CHAMBER         _UxGT("CHAMBER T. RUNAWAY")
962
+#endif
942
 #ifndef MSG_ERR_MAXTEMP
963
 #ifndef MSG_ERR_MAXTEMP
943
   #define MSG_ERR_MAXTEMP                     _UxGT("Err: MAXTEMP")
964
   #define MSG_ERR_MAXTEMP                     _UxGT("Err: MAXTEMP")
944
 #endif
965
 #endif

+ 156
- 29
Marlin/src/lcd/language/language_fr.h 查看文件

33
 #define CHARSIZE 2
33
 #define CHARSIZE 2
34
 
34
 
35
 #define WELCOME_MSG                         MACHINE_NAME _UxGT(" prête.")
35
 #define WELCOME_MSG                         MACHINE_NAME _UxGT(" prête.")
36
+#define MSG_YES                             _UxGT("Oui")
37
+#define MSG_NO                              _UxGT("Non")
36
 #define MSG_BACK                            _UxGT("Retour")
38
 #define MSG_BACK                            _UxGT("Retour")
37
 #define MSG_SD_INSERTED                     _UxGT("Carte insérée")
39
 #define MSG_SD_INSERTED                     _UxGT("Carte insérée")
38
 #define MSG_SD_REMOVED                      _UxGT("Carte retirée")
40
 #define MSG_SD_REMOVED                      _UxGT("Carte retirée")
39
-#define MSG_LCD_ENDSTOPS                    _UxGT("Butées") // Max length 8 characters
41
+#define MSG_LCD_ENDSTOPS                    _UxGT("Butées")
42
+#define MSG_LCD_SOFT_ENDSTOPS               _UxGT("Butées SW")
40
 #define MSG_MAIN                            _UxGT("Menu principal")
43
 #define MSG_MAIN                            _UxGT("Menu principal")
41
-#define MSG_AUTOSTART                       _UxGT("Demarrage auto")
44
+#define MSG_ADVANCED_SETTINGS               _UxGT("Config. avancée")
45
+#define MSG_CONFIGURATION                   _UxGT("Configuration")
46
+#define MSG_AUTOSTART                       _UxGT("Exéc. auto#.gcode")
42
 #define MSG_DISABLE_STEPPERS                _UxGT("Arrêter moteurs")
47
 #define MSG_DISABLE_STEPPERS                _UxGT("Arrêter moteurs")
43
 #define MSG_DEBUG_MENU                      _UxGT("Menu debug")
48
 #define MSG_DEBUG_MENU                      _UxGT("Menu debug")
44
 #define MSG_PROGRESS_BAR_TEST               _UxGT("Test barre progress.")
49
 #define MSG_PROGRESS_BAR_TEST               _UxGT("Test barre progress.")
45
 #define MSG_AUTO_HOME                       _UxGT("Origine auto.")
50
 #define MSG_AUTO_HOME                       _UxGT("Origine auto.")
46
-#define MSG_AUTO_HOME_X                     _UxGT("Origine X Auto.")
47
-#define MSG_AUTO_HOME_Y                     _UxGT("Origine Y Auto.")
48
-#define MSG_AUTO_HOME_Z                     _UxGT("Origine Z Auto.")
51
+#define MSG_AUTO_HOME_X                     _UxGT("Origine X auto.")
52
+#define MSG_AUTO_HOME_Y                     _UxGT("Origine Y auto.")
53
+#define MSG_AUTO_HOME_Z                     _UxGT("Origine Z auto.")
54
+#define MSG_AUTO_Z_ALIGN                    _UxGT("Align. Z auto.")
49
 #define MSG_LEVEL_BED_HOMING                _UxGT("Origine XYZ")
55
 #define MSG_LEVEL_BED_HOMING                _UxGT("Origine XYZ")
50
 #define MSG_LEVEL_BED_WAITING               _UxGT("Clic pour commencer")
56
 #define MSG_LEVEL_BED_WAITING               _UxGT("Clic pour commencer")
51
 #define MSG_LEVEL_BED_NEXT_POINT            _UxGT("Point suivant")
57
 #define MSG_LEVEL_BED_NEXT_POINT            _UxGT("Point suivant")
59
 #define MSG_PREHEAT_1_ALL                   _UxGT("Préch. " PREHEAT_1_LABEL " Tout")
65
 #define MSG_PREHEAT_1_ALL                   _UxGT("Préch. " PREHEAT_1_LABEL " Tout")
60
 #define MSG_PREHEAT_1_END                   MSG_PREHEAT_1 _UxGT(" buse")
66
 #define MSG_PREHEAT_1_END                   MSG_PREHEAT_1 _UxGT(" buse")
61
 #define MSG_PREHEAT_1_BEDONLY               _UxGT("Préch. " PREHEAT_1_LABEL " lit")
67
 #define MSG_PREHEAT_1_BEDONLY               _UxGT("Préch. " PREHEAT_1_LABEL " lit")
62
-#define MSG_PREHEAT_1_SETTINGS              _UxGT("Régl. prech. " PREHEAT_1_LABEL)
68
+#define MSG_PREHEAT_1_SETTINGS              _UxGT("Régl. préch. " PREHEAT_1_LABEL)
63
 #define MSG_PREHEAT_2                       _UxGT("Préchauffage " PREHEAT_2_LABEL)
69
 #define MSG_PREHEAT_2                       _UxGT("Préchauffage " PREHEAT_2_LABEL)
64
 #define MSG_PREHEAT_2_N                     _UxGT("Préchauff. " PREHEAT_2_LABEL " ")
70
 #define MSG_PREHEAT_2_N                     _UxGT("Préchauff. " PREHEAT_2_LABEL " ")
65
 #define MSG_PREHEAT_2_ALL                   _UxGT("Préch. " PREHEAT_2_LABEL " Tout")
71
 #define MSG_PREHEAT_2_ALL                   _UxGT("Préch. " PREHEAT_2_LABEL " Tout")
66
 #define MSG_PREHEAT_2_END                   MSG_PREHEAT_2 _UxGT(" buse")
72
 #define MSG_PREHEAT_2_END                   MSG_PREHEAT_2 _UxGT(" buse")
67
 #define MSG_PREHEAT_2_BEDONLY               _UxGT("Préch. " PREHEAT_2_LABEL " lit")
73
 #define MSG_PREHEAT_2_BEDONLY               _UxGT("Préch. " PREHEAT_2_LABEL " lit")
68
-#define MSG_PREHEAT_2_SETTINGS              _UxGT("Régl. prech. " PREHEAT_2_LABEL)
74
+#define MSG_PREHEAT_2_SETTINGS              _UxGT("Régl. préch. " PREHEAT_2_LABEL)
75
+#define MSG_PREHEAT_CUSTOM                  _UxGT("Préchauff. perso.")
69
 #define MSG_COOLDOWN                        _UxGT("Refroidir")
76
 #define MSG_COOLDOWN                        _UxGT("Refroidir")
77
+#define MSG_LASER_MENU                      _UxGT("Contrôle Laser")
78
+#define MSG_LASER_OFF                       _UxGT("Laser Off")
79
+#define MSG_LASER_ON                        _UxGT("Laser On")
80
+#define MSG_LASER_POWER                     _UxGT("Puissance")
81
+#define MSG_SPINDLE_REVERSE                 _UxGT("Inverser broches")
70
 #define MSG_SWITCH_PS_ON                    _UxGT("Allumer alim.")
82
 #define MSG_SWITCH_PS_ON                    _UxGT("Allumer alim.")
71
 #define MSG_SWITCH_PS_OFF                   _UxGT("Eteindre alim.")
83
 #define MSG_SWITCH_PS_OFF                   _UxGT("Eteindre alim.")
72
 #define MSG_EXTRUDE                         _UxGT("Extrusion")
84
 #define MSG_EXTRUDE                         _UxGT("Extrusion")
77
 #define MSG_LEVEL_CORNERS                   _UxGT("Niveau coins")
89
 #define MSG_LEVEL_CORNERS                   _UxGT("Niveau coins")
78
 #define MSG_NEXT_CORNER                     _UxGT("Coin suivant")
90
 #define MSG_NEXT_CORNER                     _UxGT("Coin suivant")
79
 #define MSG_EDITING_STOPPED                 _UxGT("Arrêt édit. maillage")
91
 #define MSG_EDITING_STOPPED                 _UxGT("Arrêt édit. maillage")
80
-#define MSG_USER_MENU                       _UxGT("Commandes perso")
92
+#define MSG_MESH_X                          _UxGT("Index X")
93
+#define MSG_MESH_Y                          _UxGT("Index Y")
94
+#define MSG_MESH_EDIT_Z                     _UxGT("Valeur Z")
95
+#define MSG_USER_MENU                       _UxGT("Commandes perso.")
81
 
96
 
82
 #define MSG_UBL_DOING_G29                   _UxGT("G29 en cours")
97
 #define MSG_UBL_DOING_G29                   _UxGT("G29 en cours")
83
 #define MSG_UBL_UNHOMED                     _UxGT("Origine XYZ d'abord")
98
 #define MSG_UBL_UNHOMED                     _UxGT("Origine XYZ d'abord")
84
 #define MSG_UBL_TOOLS                       _UxGT("Outils UBL")
99
 #define MSG_UBL_TOOLS                       _UxGT("Outils UBL")
85
 #define MSG_UBL_LEVEL_BED                   _UxGT("Niveau lit unifié")
100
 #define MSG_UBL_LEVEL_BED                   _UxGT("Niveau lit unifié")
101
+#define MSG_IDEX_MENU                       _UxGT("Mode IDEX")
102
+#define MSG_IDEX_MODE_AUTOPARK              _UxGT("Auto-Park")
103
+#define MSG_IDEX_MODE_DUPLICATE             _UxGT("Duplication")
104
+#define MSG_IDEX_MODE_MIRRORED_COPY         _UxGT("Copie miroir")
105
+#define MSG_IDEX_MODE_FULL_CTRL             _UxGT("Contrôle complet")
106
+#define MSG_OFFSETS_MENU                    _UxGT("Offsets Outil")
107
+#define MSG_X_OFFSET                        _UxGT("Buse 2 X")
108
+#define MSG_Y_OFFSET                        _UxGT("Buse 2 Y")
109
+#define MSG_Z_OFFSET                        _UxGT("Buse 2 Z")
86
 #define MSG_UBL_MANUAL_MESH                 _UxGT("Maillage manuel")
110
 #define MSG_UBL_MANUAL_MESH                 _UxGT("Maillage manuel")
87
 #define MSG_UBL_BC_INSERT                   _UxGT("Poser câle & mesurer")
111
 #define MSG_UBL_BC_INSERT                   _UxGT("Poser câle & mesurer")
88
 #define MSG_UBL_BC_INSERT2                  _UxGT("Mesure")
112
 #define MSG_UBL_BC_INSERT2                  _UxGT("Mesure")
167
 #define MSG_MOVE_Y                          _UxGT("Dépl. Y")
191
 #define MSG_MOVE_Y                          _UxGT("Dépl. Y")
168
 #define MSG_MOVE_Z                          _UxGT("Dépl. Z")
192
 #define MSG_MOVE_Z                          _UxGT("Dépl. Z")
169
 #define MSG_MOVE_E                          _UxGT("Extrudeur")
193
 #define MSG_MOVE_E                          _UxGT("Extrudeur")
194
+#define MSG_HOTEND_TOO_COLD                 _UxGT("Buse trop froide")
170
 #define MSG_MOVE_01MM                       _UxGT("Dépl. 0.1mm")
195
 #define MSG_MOVE_01MM                       _UxGT("Dépl. 0.1mm")
171
 #define MSG_MOVE_1MM                        _UxGT("Dépl. 1mm")
196
 #define MSG_MOVE_1MM                        _UxGT("Dépl. 1mm")
172
 #define MSG_MOVE_10MM                       _UxGT("Dépl. 10mm")
197
 #define MSG_MOVE_10MM                       _UxGT("Dépl. 10mm")
174
 #define MSG_BED_Z                           _UxGT("Lit Z")
199
 #define MSG_BED_Z                           _UxGT("Lit Z")
175
 #define MSG_NOZZLE                          _UxGT("Buse")
200
 #define MSG_NOZZLE                          _UxGT("Buse")
176
 #define MSG_BED                             _UxGT("Lit")
201
 #define MSG_BED                             _UxGT("Lit")
202
+#define MSG_CHAMBER                         _UxGT("Caisson")
177
 #define MSG_FAN_SPEED                       _UxGT("Vitesse ventil.")
203
 #define MSG_FAN_SPEED                       _UxGT("Vitesse ventil.")
178
 #define MSG_EXTRA_FAN_SPEED                 _UxGT("Extra V ventil.")
204
 #define MSG_EXTRA_FAN_SPEED                 _UxGT("Extra V ventil.")
179
 
205
 
203
 #endif
229
 #endif
204
 #define MSG_VE_JERK                         _UxGT("Ve jerk")
230
 #define MSG_VE_JERK                         _UxGT("Ve jerk")
205
 #define MSG_VELOCITY                        _UxGT("Vélocité")
231
 #define MSG_VELOCITY                        _UxGT("Vélocité")
232
+#define MSG_JUNCTION_DEVIATION              _UxGT("Déviat. jonct.")
206
 #define MSG_VMAX                            _UxGT("Vmax ")
233
 #define MSG_VMAX                            _UxGT("Vmax ")
207
 #define MSG_VMIN                            _UxGT("Vmin ")
234
 #define MSG_VMIN                            _UxGT("Vmin ")
208
 #define MSG_VTRAV_MIN                       _UxGT("V dépl. min")
235
 #define MSG_VTRAV_MIN                       _UxGT("V dépl. min")
240
 #define MSG_LOAD_EEPROM                     _UxGT("Lire config")
267
 #define MSG_LOAD_EEPROM                     _UxGT("Lire config")
241
 #define MSG_RESTORE_FAILSAFE                _UxGT("Restaurer défauts")
268
 #define MSG_RESTORE_FAILSAFE                _UxGT("Restaurer défauts")
242
 #define MSG_INIT_EEPROM                     _UxGT("Initialiser EEPROM")
269
 #define MSG_INIT_EEPROM                     _UxGT("Initialiser EEPROM")
270
+#define MSG_SD_UPDATE                       _UxGT("MàJ. SD")
271
+#define MSG_RESET_PRINTER                   _UxGT("RàZ. imprimante")
243
 #define MSG_REFRESH                         _UxGT("Actualiser")
272
 #define MSG_REFRESH                         _UxGT("Actualiser")
244
 #define MSG_WATCH                           _UxGT("Surveiller")
273
 #define MSG_WATCH                           _UxGT("Surveiller")
245
 #define MSG_PREPARE                         _UxGT("Préparer")
274
 #define MSG_PREPARE                         _UxGT("Préparer")
246
 #define MSG_TUNE                            _UxGT("Régler")
275
 #define MSG_TUNE                            _UxGT("Régler")
276
+#define MSG_START_PRINT                     _UxGT("Démarrer Impr.")
277
+#define MSG_BUTTON_PRINT                    _UxGT("Imprimer")
278
+#define MSG_BUTTON_CANCEL                   _UxGT("Annuler")
247
 #define MSG_PAUSE_PRINT                     _UxGT("Interrompre impr.")
279
 #define MSG_PAUSE_PRINT                     _UxGT("Interrompre impr.")
248
 #define MSG_RESUME_PRINT                    _UxGT("Reprendre impr.")
280
 #define MSG_RESUME_PRINT                    _UxGT("Reprendre impr.")
249
 #define MSG_STOP_PRINT                      _UxGT("Arrêter impr.")
281
 #define MSG_STOP_PRINT                      _UxGT("Arrêter impr.")
282
+#define MSG_OUTAGE_RECOVERY                 _UxGT("Récupér. coupure")
250
 #define MSG_CARD_MENU                       _UxGT("Impr. depuis SD")
283
 #define MSG_CARD_MENU                       _UxGT("Impr. depuis SD")
251
 #define MSG_NO_CARD                         _UxGT("Pas de carte")
284
 #define MSG_NO_CARD                         _UxGT("Pas de carte")
252
 #define MSG_DWELL                           _UxGT("Repos...")
285
 #define MSG_DWELL                           _UxGT("Repos...")
253
-#define MSG_USERWAIT                        _UxGT("Atten. de l'util.")
286
+#define MSG_USERWAIT                        _UxGT("Attente utilis.")
254
 #define MSG_PRINT_PAUSED                    _UxGT("Impr. en pause")
287
 #define MSG_PRINT_PAUSED                    _UxGT("Impr. en pause")
255
-#define MSG_PRINT_ABORTED                   _UxGT("Impr. Annulée")
288
+#define MSG_PRINTING                        _UxGT("Impression")
289
+#define MSG_PRINT_ABORTED                   _UxGT("Impr. annulée")
256
 #define MSG_NO_MOVE                         _UxGT("Moteurs bloqués.")
290
 #define MSG_NO_MOVE                         _UxGT("Moteurs bloqués.")
257
 #define MSG_KILLED                          _UxGT("MORT.")
291
 #define MSG_KILLED                          _UxGT("MORT.")
258
 #define MSG_STOPPED                         _UxGT("STOPPÉ.")
292
 #define MSG_STOPPED                         _UxGT("STOPPÉ.")
264
 #define MSG_CONTROL_RETRACT_RECOVER_SWAP    _UxGT("Ech. Rappel mm")
298
 #define MSG_CONTROL_RETRACT_RECOVER_SWAP    _UxGT("Ech. Rappel mm")
265
 #define MSG_CONTROL_RETRACT_RECOVERF        _UxGT("Rappel V")
299
 #define MSG_CONTROL_RETRACT_RECOVERF        _UxGT("Rappel V")
266
 #define MSG_CONTROL_RETRACT_RECOVER_SWAPF   _UxGT("Ech. Rappel V")
300
 #define MSG_CONTROL_RETRACT_RECOVER_SWAPF   _UxGT("Ech. Rappel V")
267
-#define MSG_AUTORETRACT                     _UxGT("Retrait. Auto.")
301
+#define MSG_AUTORETRACT                     _UxGT("Retrait auto.")
302
+#define MSG_TOOL_CHANGE                     _UxGT("Changement outil")
303
+#define MSG_TOOL_CHANGE_ZLIFT               _UxGT("Augmenter Z")
304
+#define MSG_SINGLENOZZLE_PRIME_SPD          _UxGT("Vitesse primaire")
305
+#define MSG_SINGLENOZZLE_RETRACT_SPD        _UxGT("Vitesse retrait")
306
+#define MSG_NOZZLE_STANDBY                  _UxGT("Attente buse")
307
+#define MSG_FILAMENT_SWAP_LENGTH            _UxGT("Distance retrait")
268
 #define MSG_FILAMENTCHANGE                  _UxGT("Changer filament")
308
 #define MSG_FILAMENTCHANGE                  _UxGT("Changer filament")
269
 #define MSG_FILAMENTLOAD                    _UxGT("Charger fil.")
309
 #define MSG_FILAMENTLOAD                    _UxGT("Charger fil.")
270
 #define MSG_FILAMENTUNLOAD                  _UxGT("Décharger fil.")
310
 #define MSG_FILAMENTUNLOAD                  _UxGT("Décharger fil.")
271
 #define MSG_FILAMENTUNLOAD_ALL              _UxGT("Décharger tout")
311
 #define MSG_FILAMENTUNLOAD_ALL              _UxGT("Décharger tout")
272
 #define MSG_INIT_SDCARD                     _UxGT("Init. la carte SD")
312
 #define MSG_INIT_SDCARD                     _UxGT("Init. la carte SD")
273
 #define MSG_CHANGE_SDCARD                   _UxGT("Changer de carte")
313
 #define MSG_CHANGE_SDCARD                   _UxGT("Changer de carte")
274
-#define MSG_ZPROBE_OUT                      _UxGT("Z sonde hors lit")
314
+#define MSG_ZPROBE_OUT                      _UxGT("Sonde Z hors lit")
275
 #define MSG_SKEW_FACTOR                     _UxGT("Facteur écart")
315
 #define MSG_SKEW_FACTOR                     _UxGT("Facteur écart")
276
 #define MSG_BLTOUCH                         _UxGT("BLTouch")
316
 #define MSG_BLTOUCH                         _UxGT("BLTouch")
277
 #define MSG_BLTOUCH_SELFTEST                _UxGT("Autotest BLTouch")
317
 #define MSG_BLTOUCH_SELFTEST                _UxGT("Autotest BLTouch")
278
 #define MSG_BLTOUCH_RESET                   _UxGT("RaZ BLTouch")
318
 #define MSG_BLTOUCH_RESET                   _UxGT("RaZ BLTouch")
279
 #define MSG_BLTOUCH_DEPLOY                  _UxGT("Déployer BLTouch")
319
 #define MSG_BLTOUCH_DEPLOY                  _UxGT("Déployer BLTouch")
320
+#define MSG_BLTOUCH_SW_MODE                 _UxGT("Mode BLTouch SW")
321
+#define MSG_BLTOUCH_5V_MODE                 _UxGT("Mode BLTouch 5V")
322
+#define MSG_BLTOUCH_OD_MODE                 _UxGT("Mode BLTouch OD")
280
 #define MSG_BLTOUCH_STOW                    _UxGT("Ranger BLTouch")
323
 #define MSG_BLTOUCH_STOW                    _UxGT("Ranger BLTouch")
324
+#define MSG_MANUAL_DEPLOY                   _UxGT("Déployer Sonde Z")
325
+#define MSG_MANUAL_STOW                     _UxGT("Ranger Sonde Z")
281
 #define MSG_HOME                            _UxGT("Origine")  // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST
326
 #define MSG_HOME                            _UxGT("Origine")  // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST
282
 #define MSG_FIRST                           _UxGT("Premier")
327
 #define MSG_FIRST                           _UxGT("Premier")
283
 #define MSG_ZPROBE_ZOFFSET                  _UxGT("Décalage Z")
328
 #define MSG_ZPROBE_ZOFFSET                  _UxGT("Décalage Z")
284
 #define MSG_BABYSTEP_X                      _UxGT("Babystep X")
329
 #define MSG_BABYSTEP_X                      _UxGT("Babystep X")
285
 #define MSG_BABYSTEP_Y                      _UxGT("Babystep Y")
330
 #define MSG_BABYSTEP_Y                      _UxGT("Babystep Y")
286
 #define MSG_BABYSTEP_Z                      _UxGT("Babystep Z")
331
 #define MSG_BABYSTEP_Z                      _UxGT("Babystep Z")
332
+#define MSG_BABYSTEP_TOTAL                  _UxGT("Total")
287
 #define MSG_ENDSTOP_ABORT                   _UxGT("Butée abandon")
333
 #define MSG_ENDSTOP_ABORT                   _UxGT("Butée abandon")
288
 #define MSG_HEATING_FAILED_LCD              _UxGT("Erreur de chauffe")
334
 #define MSG_HEATING_FAILED_LCD              _UxGT("Erreur de chauffe")
335
+#define MSG_HEATING_FAILED_LCD_BED          _UxGT("Erreur de chauffe lit")
289
 #define MSG_ERR_REDUNDANT_TEMP              _UxGT("Err: TEMP. REDONDANTE")
336
 #define MSG_ERR_REDUNDANT_TEMP              _UxGT("Err: TEMP. REDONDANTE")
290
 #define MSG_THERMAL_RUNAWAY                 _UxGT("EMBALLEMENT THERM.")
337
 #define MSG_THERMAL_RUNAWAY                 _UxGT("EMBALLEMENT THERM.")
338
+#define MSG_THERMAL_RUNAWAY_BED             _UxGT("ERREUR THERMIQUE LIT")
291
 #define MSG_ERR_MAXTEMP                     _UxGT("Err: TEMP. MAX")
339
 #define MSG_ERR_MAXTEMP                     _UxGT("Err: TEMP. MAX")
292
 #define MSG_ERR_MINTEMP                     _UxGT("Err: TEMP. MIN")
340
 #define MSG_ERR_MINTEMP                     _UxGT("Err: TEMP. MIN")
293
 #define MSG_ERR_MAXTEMP_BED                 _UxGT("Err: TEMP. MAX LIT")
341
 #define MSG_ERR_MAXTEMP_BED                 _UxGT("Err: TEMP. MAX LIT")
294
 #define MSG_ERR_MINTEMP_BED                 _UxGT("Err: TEMP. MIN LIT")
342
 #define MSG_ERR_MINTEMP_BED                 _UxGT("Err: TEMP. MIN LIT")
343
+#define MSG_ERR_MAXTEMP_CHAMBER             _UxGT("Err: MAXTEMP CAISSON")
344
+#define MSG_ERR_MINTEMP_CHAMBER             _UxGT("Err: MINTEMP CAISSON")
295
 #define MSG_ERR_Z_HOMING                    MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST
345
 #define MSG_ERR_Z_HOMING                    MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST
296
 
346
 
297
 #define MSG_HALTED                          _UxGT("IMPR. STOPPÉE")
347
 #define MSG_HALTED                          _UxGT("IMPR. STOPPÉE")
301
 #define MSG_SHORT_MINUTE                    _UxGT("m") // One character only
351
 #define MSG_SHORT_MINUTE                    _UxGT("m") // One character only
302
 
352
 
303
 #define MSG_HEATING                         _UxGT("En chauffe...")
353
 #define MSG_HEATING                         _UxGT("En chauffe...")
354
+#define MSG_COOLING                         _UxGT("Refroidissement")
304
 #define MSG_BED_HEATING                     _UxGT("Lit en chauffe...")
355
 #define MSG_BED_HEATING                     _UxGT("Lit en chauffe...")
356
+#define MSG_BED_COOLING                     _UxGT("Refroid. du lit...")
305
 #define MSG_DELTA_CALIBRATE                 _UxGT("Calibration Delta")
357
 #define MSG_DELTA_CALIBRATE                 _UxGT("Calibration Delta")
306
 #define MSG_DELTA_CALIBRATE_X               _UxGT("Calibrer X")
358
 #define MSG_DELTA_CALIBRATE_X               _UxGT("Calibrer X")
307
 #define MSG_DELTA_CALIBRATE_Y               _UxGT("Calibrer Y")
359
 #define MSG_DELTA_CALIBRATE_Y               _UxGT("Calibrer Y")
310
 #define MSG_DELTA_SETTINGS                  _UxGT("Réglages Delta")
362
 #define MSG_DELTA_SETTINGS                  _UxGT("Réglages Delta")
311
 #define MSG_DELTA_AUTO_CALIBRATE            _UxGT("Calibration Auto")
363
 #define MSG_DELTA_AUTO_CALIBRATE            _UxGT("Calibration Auto")
312
 #define MSG_DELTA_HEIGHT_CALIBRATE          _UxGT("Hauteur Delta")
364
 #define MSG_DELTA_HEIGHT_CALIBRATE          _UxGT("Hauteur Delta")
365
+#define MSG_DELTA_Z_OFFSET_CALIBRATE        _UxGT("Delta Z sonde")
313
 #define MSG_DELTA_DIAG_ROD                  _UxGT("Diagonale")
366
 #define MSG_DELTA_DIAG_ROD                  _UxGT("Diagonale")
314
 #define MSG_DELTA_HEIGHT                    _UxGT("Hauteur")
367
 #define MSG_DELTA_HEIGHT                    _UxGT("Hauteur")
315
 #define MSG_DELTA_RADIUS                    _UxGT("Rayon")
368
 #define MSG_DELTA_RADIUS                    _UxGT("Rayon")
323
 #define MSG_MESH_LEVELING                   _UxGT("Niveau maillage")
376
 #define MSG_MESH_LEVELING                   _UxGT("Niveau maillage")
324
 #define MSG_INFO_STATS_MENU                 _UxGT("Stats. imprimante")
377
 #define MSG_INFO_STATS_MENU                 _UxGT("Stats. imprimante")
325
 #define MSG_INFO_BOARD_MENU                 _UxGT("Infos carte")
378
 #define MSG_INFO_BOARD_MENU                 _UxGT("Infos carte")
326
-#define MSG_INFO_THERMISTOR_MENU            _UxGT("Thermistors")
379
+#define MSG_INFO_THERMISTOR_MENU            _UxGT("Thermistances")
327
 #define MSG_INFO_EXTRUDERS                  _UxGT("Extrudeurs")
380
 #define MSG_INFO_EXTRUDERS                  _UxGT("Extrudeurs")
328
-#define MSG_INFO_BAUDRATE                   _UxGT("Baud")
381
+#define MSG_INFO_BAUDRATE                   _UxGT("Bauds")
329
 #define MSG_INFO_PROTOCOL                   _UxGT("Protocole")
382
 #define MSG_INFO_PROTOCOL                   _UxGT("Protocole")
330
 #define MSG_CASE_LIGHT                      _UxGT("Lumière caisson")
383
 #define MSG_CASE_LIGHT                      _UxGT("Lumière caisson")
331
 #define MSG_CASE_LIGHT_BRIGHTNESS           _UxGT("Luminosité")
384
 #define MSG_CASE_LIGHT_BRIGHTNESS           _UxGT("Luminosité")
358
 #define MSG_FILAMENT_CHANGE_OPTION_PURGE    _UxGT("Purger encore")
411
 #define MSG_FILAMENT_CHANGE_OPTION_PURGE    _UxGT("Purger encore")
359
 #define MSG_FILAMENT_CHANGE_OPTION_RESUME   _UxGT("Reprendre impr.")
412
 #define MSG_FILAMENT_CHANGE_OPTION_RESUME   _UxGT("Reprendre impr.")
360
 #define MSG_FILAMENT_CHANGE_NOZZLE          _UxGT("  Buse: ")
413
 #define MSG_FILAMENT_CHANGE_NOZZLE          _UxGT("  Buse: ")
414
+#define MSG_RUNOUT_SENSOR                   _UxGT("Capteur Fil.")
361
 #define MSG_ERR_HOMING_FAILED               _UxGT("Echec origine")
415
 #define MSG_ERR_HOMING_FAILED               _UxGT("Echec origine")
362
 #define MSG_ERR_PROBING_FAILED              _UxGT("Echec sonde")
416
 #define MSG_ERR_PROBING_FAILED              _UxGT("Echec sonde")
363
 #define MSG_M600_TOO_COLD                   _UxGT("M600: Trop froid")
417
 #define MSG_M600_TOO_COLD                   _UxGT("M600: Trop froid")
418
+#define MSG_MMU2_FILAMENT_CHANGE_HEADER     _UxGT("CHANGER FILAMENT")
419
+#define MSG_MMU2_CHOOSE_FILAMENT_HEADER     _UxGT("CHOISIR FILAMENT")
420
+#define MSG_MMU2_MENU                       _UxGT("MMU")
421
+#define MSG_MMU2_WRONG_FIRMWARE             _UxGT("Update MMU firmware!")
422
+#define MSG_MMU2_NOT_RESPONDING             _UxGT("MMU ne répond plus")
423
+#define MSG_MMU2_RESUME                     _UxGT("Continuer impr.")
424
+#define MSG_MMU2_RESUMING                   _UxGT("Reprise...")
425
+#define MSG_MMU2_LOAD_FILAMENT              _UxGT("Charger filament")
426
+#define MSG_MMU2_LOAD_ALL                   _UxGT("Charger tous")
427
+#define MSG_MMU2_LOAD_TO_NOZZLE             _UxGT("Charger dans buse")
428
+#define MSG_MMU2_EJECT_FILAMENT             _UxGT("Ejecter filament")
429
+#define MSG_MMU2_EJECT_FILAMENT0            _UxGT("Ejecter fil. 1")
430
+#define MSG_MMU2_EJECT_FILAMENT1            _UxGT("Ejecter fil. 2")
431
+#define MSG_MMU2_EJECT_FILAMENT2            _UxGT("Ejecter fil. 3")
432
+#define MSG_MMU2_EJECT_FILAMENT3            _UxGT("Ejecter fil. 4")
433
+#define MSG_MMU2_EJECT_FILAMENT4            _UxGT("Ejecter fil. 5")
434
+#define MSG_MMU2_UNLOAD_FILAMENT            _UxGT("Retrait filament")
435
+#define MSG_MMU2_LOADING_FILAMENT           _UxGT("Chargem. fil. %i...")
436
+#define MSG_MMU2_EJECTING_FILAMENT          _UxGT("Ejection fil...")
437
+#define MSG_MMU2_UNLOADING_FILAMENT         _UxGT("Retrait fil....")
438
+#define MSG_MMU2_ALL                        _UxGT("Tous")
439
+#define MSG_MMU2_FILAMENT0                  _UxGT("Filament 1")
440
+#define MSG_MMU2_FILAMENT1                  _UxGT("Filament 2")
441
+#define MSG_MMU2_FILAMENT2                  _UxGT("Filament 3")
442
+#define MSG_MMU2_FILAMENT3                  _UxGT("Filament 4")
443
+#define MSG_MMU2_FILAMENT4                  _UxGT("Filament 5")
444
+#define MSG_MMU2_RESET                      _UxGT("Réinit. MMU")
445
+#define MSG_MMU2_RESETTING                  _UxGT("Réinit. MMU...")
446
+#define MSG_MMU2_EJECT_RECOVER              _UxGT("Retrait, click")
447
+
448
+#define MSG_MIX                             _UxGT("Mix")
449
+#define MSG_MIX_COMPONENT                   _UxGT("Composante")
450
+#define MSG_MIXER                           _UxGT("Mixeur")
451
+#define MSG_GRADIENT                        _UxGT("Dégradé")
452
+#define MSG_FULL_GRADIENT                   _UxGT("Dégradé complet")
453
+#define MSG_TOGGLE_MIX                      _UxGT("Toggle mix")
454
+#define MSG_CYCLE_MIX                       _UxGT("Cycle mix")
455
+#define MSG_GRADIENT_MIX                    _UxGT("Mix dégradé")
456
+#define MSG_REVERSE_GRADIENT                _UxGT("Inverser dégradé")
457
+#define MSG_ACTIVE_VTOOL                    _UxGT("Active V-tool")
458
+#define MSG_START_VTOOL                     _UxGT("Début V-tool")
459
+#define MSG_END_VTOOL                       _UxGT("  Fin V-tool")
460
+#define MSG_GRADIENT_ALIAS                  _UxGT("Alias V-tool")
461
+#define MSG_RESET_VTOOLS                    _UxGT("Réinit. V-tools")
462
+#define MSG_COMMIT_VTOOL                    _UxGT("Valider Mix V-tool")
463
+#define MSG_VTOOLS_RESET                    _UxGT("V-tools réinit. ok")
464
+#define MSG_START_Z                         _UxGT("Début Z")
465
+#define MSG_END_Z                           _UxGT("  Fin Z")
466
+#define MSG_BRICKOUT                        _UxGT("Casse-briques")
467
+#define MSG_INVADERS                        _UxGT("Invaders")
468
+#define MSG_SNAKE                           _UxGT("Sn4k3")
469
+#define MSG_MAZE                            _UxGT("Labyrinthe")
364
 
470
 
365
 #if LCD_HEIGHT >= 4
471
 #if LCD_HEIGHT >= 4
366
   // Up to 3 lines allowed
472
   // Up to 3 lines allowed
367
-  #define MSG_FILAMENT_CHANGE_INIT_1        _UxGT("Attente Démarrage")
368
-  #define MSG_FILAMENT_CHANGE_INIT_2        _UxGT("du filament")
369
-  #define MSG_FILAMENT_CHANGE_INIT_3        _UxGT("changer")
370
-  #define MSG_FILAMENT_CHANGE_UNLOAD_1      _UxGT("Attente de")
371
-  #define MSG_FILAMENT_CHANGE_UNLOAD_2      _UxGT("décharger filament")
473
+  #define MSG_ADVANCED_PAUSE_WAITING_1      _UxGT("Presser bouton")
474
+  #define MSG_ADVANCED_PAUSE_WAITING_2      _UxGT("pour reprendre")
475
+  #define MSG_PAUSE_PRINT_INIT_1            _UxGT("Parking...")
476
+  #define MSG_FILAMENT_CHANGE_INIT_1        _UxGT("Attente filament")
477
+  #define MSG_FILAMENT_CHANGE_INIT_2        _UxGT("pour démarrer")
372
   #define MSG_FILAMENT_CHANGE_INSERT_1      _UxGT("Insérer filament")
478
   #define MSG_FILAMENT_CHANGE_INSERT_1      _UxGT("Insérer filament")
373
   #define MSG_FILAMENT_CHANGE_INSERT_2      _UxGT("et app. bouton")
479
   #define MSG_FILAMENT_CHANGE_INSERT_2      _UxGT("et app. bouton")
374
   #define MSG_FILAMENT_CHANGE_INSERT_3      _UxGT("pour continuer...")
480
   #define MSG_FILAMENT_CHANGE_INSERT_3      _UxGT("pour continuer...")
375
   #define MSG_FILAMENT_CHANGE_HEAT_1        _UxGT("Presser le bouton...")
481
   #define MSG_FILAMENT_CHANGE_HEAT_1        _UxGT("Presser le bouton...")
376
-  #define MSG_FILAMENT_CHANGE_HEAT_2        _UxGT("Pr chauffer la buse")
482
+  #define MSG_FILAMENT_CHANGE_HEAT_2        _UxGT("pr chauffer la buse")
377
   #define MSG_FILAMENT_CHANGE_HEATING_1     _UxGT("Buse en chauffe")
483
   #define MSG_FILAMENT_CHANGE_HEATING_1     _UxGT("Buse en chauffe")
378
-  #define MSG_FILAMENT_CHANGE_HEATING_2     _UxGT("Patientez SVP...")
379
-  #define MSG_FILAMENT_CHANGE_LOAD_1        _UxGT("Attente de")
380
-  #define MSG_FILAMENT_CHANGE_LOAD_2        _UxGT("Chargement filament")
484
+  #define MSG_FILAMENT_CHANGE_HEATING_2     _UxGT("Patienter SVP...")
485
+  #define MSG_FILAMENT_CHANGE_UNLOAD_1      _UxGT("Attente")
486
+  #define MSG_FILAMENT_CHANGE_UNLOAD_2      _UxGT("retrait du filament")
487
+  #define MSG_FILAMENT_CHANGE_LOAD_1        _UxGT("Attente")
488
+  #define MSG_FILAMENT_CHANGE_LOAD_2        _UxGT("chargement filament")
381
   #define MSG_FILAMENT_CHANGE_PURGE_1       _UxGT("Attente")
489
   #define MSG_FILAMENT_CHANGE_PURGE_1       _UxGT("Attente")
382
-  #define MSG_FILAMENT_CHANGE_PURGE_2       _UxGT("Purger filament")
383
-  #define MSG_FILAMENT_CHANGE_RESUME_1      _UxGT("Attente impression")
384
-  #define MSG_FILAMENT_CHANGE_RESUME_2      _UxGT("pour reprendre")
490
+  #define MSG_FILAMENT_CHANGE_PURGE_2       _UxGT("Purge filament")
491
+  #define MSG_FILAMENT_CHANGE_CONT_PURGE_1  _UxGT("Presser pour finir")
492
+  #define MSG_FILAMENT_CHANGE_CONT_PURGE_2  _UxGT("la purge du filament")
493
+  #define MSG_FILAMENT_CHANGE_RESUME_1      _UxGT("Attente reprise")
494
+  #define MSG_FILAMENT_CHANGE_RESUME_2      _UxGT("impression")
385
 #else // LCD_HEIGHT < 4
495
 #else // LCD_HEIGHT < 4
386
   // Up to 2 lines allowed
496
   // Up to 2 lines allowed
387
-  #define MSG_FILAMENT_CHANGE_INIT_1        _UxGT("Patientez...")
388
-  #define MSG_FILAMENT_CHANGE_UNLOAD_1      _UxGT("Ejection...")
389
-  #define MSG_FILAMENT_CHANGE_INSERT_1      _UxGT("Insérer et clic")
497
+  #define MSG_ADVANCED_PAUSE_WAITING_1      _UxGT("Presser pr continuer")
498
+  #define MSG_FILAMENT_CHANGE_INIT_1        _UxGT("Patience...")
499
+  #define MSG_FILAMENT_CHANGE_INSERT_1      _UxGT("Insérer fil.")
500
+  #define MSG_FILAMENT_CHANGE_HEAT_1        _UxGT("Chauffer ?")
501
+  #define MSG_FILAMENT_CHANGE_HEATING_1     _UxGT("Chauffage...")
502
+  #define MSG_FILAMENT_CHANGE_UNLOAD_1      _UxGT("Ejecting...")
390
   #define MSG_FILAMENT_CHANGE_LOAD_1        _UxGT("Chargement...")
503
   #define MSG_FILAMENT_CHANGE_LOAD_1        _UxGT("Chargement...")
504
+  #define MSG_FILAMENT_CHANGE_PURGE_1       _UxGT("Purge...")
505
+  #define MSG_FILAMENT_CHANGE_CONT_PURGE_1  _UxGT("Terminer ?")
391
   #define MSG_FILAMENT_CHANGE_RESUME_1      _UxGT("Reprise...")
506
   #define MSG_FILAMENT_CHANGE_RESUME_1      _UxGT("Reprise...")
392
 #endif // LCD_HEIGHT < 4
507
 #endif // LCD_HEIGHT < 4
508
+
509
+#define MSG_TMC_DRIVERS                     _UxGT("Drivers TMC")
510
+#define MSG_TMC_CURRENT                     _UxGT("Courant driver")
511
+#define MSG_TMC_HYBRID_THRS                 _UxGT("Seuil hybride")
512
+#define MSG_TMC_HOMING_THRS                 _UxGT("Home sans capteur")
513
+#define MSG_TMC_STEPPING_MODE               _UxGT("Mode pas à pas")
514
+#define MSG_TMC_STEALTH_ENABLED             _UxGT("StealthChop activé")
515
+#define MSG_SERVICE_RESET                   _UxGT("Réinit.")
516
+#define MSG_SERVICE_IN                      _UxGT("  dans:")
517
+#define MSG_BACKLASH                        _UxGT("Backlash")
518
+#define MSG_BACKLASH_CORRECTION             _UxGT("Correction")
519
+#define MSG_BACKLASH_SMOOTHING              _UxGT("Lissage")

+ 2
- 0
Marlin/src/lcd/language/language_it.h 查看文件

330
 #define MSG_ENDSTOP_ABORT                   _UxGT("Finecorsa annullati")
330
 #define MSG_ENDSTOP_ABORT                   _UxGT("Finecorsa annullati")
331
 #define MSG_HEATING_FAILED_LCD              _UxGT("Riscald. Fallito")
331
 #define MSG_HEATING_FAILED_LCD              _UxGT("Riscald. Fallito")
332
 #define MSG_HEATING_FAILED_LCD_BED          _UxGT("Risc. piatto fallito")
332
 #define MSG_HEATING_FAILED_LCD_BED          _UxGT("Risc. piatto fallito")
333
+#define MSG_HEATING_FAILED_LCD_CHAMBER      _UxGT("Risc. camera fallito")
333
 #define MSG_ERR_REDUNDANT_TEMP              _UxGT("Err: TEMP RIDONDANTE")
334
 #define MSG_ERR_REDUNDANT_TEMP              _UxGT("Err: TEMP RIDONDANTE")
334
 #define MSG_THERMAL_RUNAWAY                 _UxGT("TEMP FUORI CONTROLLO")
335
 #define MSG_THERMAL_RUNAWAY                 _UxGT("TEMP FUORI CONTROLLO")
335
 #define MSG_THERMAL_RUNAWAY_BED             _UxGT("TEMP PIAT.FUORI CTRL")
336
 #define MSG_THERMAL_RUNAWAY_BED             _UxGT("TEMP PIAT.FUORI CTRL")
337
+#define MSG_THERMAL_RUNAWAY_CHAMBER         _UxGT("T.CAMERA FUORI CTRL")
336
 #define MSG_ERR_MAXTEMP                     _UxGT("Err: TEMP MASSIMA")
338
 #define MSG_ERR_MAXTEMP                     _UxGT("Err: TEMP MASSIMA")
337
 #define MSG_ERR_MINTEMP                     _UxGT("Err: TEMP MINIMA")
339
 #define MSG_ERR_MINTEMP                     _UxGT("Err: TEMP MINIMA")
338
 #define MSG_ERR_MAXTEMP_BED                 _UxGT("Err: TEMP MAX PIATTO")
340
 #define MSG_ERR_MAXTEMP_BED                 _UxGT("Err: TEMP MAX PIATTO")

+ 14
- 3
Marlin/src/lcd/menu/menu.cpp 查看文件

268
     #if HAS_GRAPHICAL_LCD
268
     #if HAS_GRAPHICAL_LCD
269
       drawing_screen = false;
269
       drawing_screen = false;
270
     #endif
270
     #endif
271
+
272
+    set_ui_selection(false);
271
   }
273
   }
272
 }
274
 }
273
 
275
 
436
   void _lcd_toggle_bed_leveling() { set_bed_leveling_enabled(!planner.leveling_active); }
438
   void _lcd_toggle_bed_leveling() { set_bed_leveling_enabled(!planner.leveling_active); }
437
 #endif
439
 #endif
438
 
440
 
439
-void do_select_screen(PGM_P const yes, PGM_P const no, bool &yesno, PGM_P const pref, const char * const string, PGM_P const suff) {
441
+//
442
+// Selection screen presents a prompt and two options
443
+//
444
+bool ui_selection; // = false
445
+void set_ui_selection(const bool sel) { ui_selection = sel; }
446
+void do_select_screen(PGM_P const yes, PGM_P const no, selectFunc_t yesFunc, selectFunc_t noFunc, PGM_P const pref, const char * const string/*=NULL*/, PGM_P const suff/*=NULL*/) {
440
   if (ui.encoderPosition) {
447
   if (ui.encoderPosition) {
441
-    yesno = int16_t(ui.encoderPosition) > 0;
448
+    ui_selection = int16_t(ui.encoderPosition) > 0;
442
     ui.encoderPosition = 0;
449
     ui.encoderPosition = 0;
443
   }
450
   }
444
-  draw_select_screen(yes, no, yesno, pref, string, suff);
451
+  const bool got_click = ui.use_click();
452
+  if (got_click || ui.should_draw()) {
453
+    draw_select_screen(yes, no, ui_selection, pref, string, suff);
454
+    if (got_click) { ui_selection ? yesFunc() : noFunc(); }
455
+  }
445
 }
456
 }
446
 
457
 
447
 #endif // HAS_LCD_MENU
458
 #endif // HAS_LCD_MENU

+ 7
- 4
Marlin/src/lcd/menu/menu.h 查看文件

65
 ///////// Menu Item Draw Functions /////////
65
 ///////// Menu Item Draw Functions /////////
66
 ////////////////////////////////////////////
66
 ////////////////////////////////////////////
67
 
67
 
68
-void draw_edit_screen(PGM_P const pstr, const char* const value=NULL);
68
+typedef void (*selectFunc_t)();
69
 void draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff);
69
 void draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff);
70
-void do_select_screen(PGM_P const yes, PGM_P const no, bool &yesno, PGM_P const pref, const char * const string=NULL, PGM_P const suff=NULL);
71
-inline void do_select_screen_yn(bool &yesno, PGM_P const pref, const char * const string, PGM_P const suff) {
72
-  do_select_screen(PSTR(MSG_YES), PSTR(MSG_NO), yesno, pref, string, suff);
70
+void set_ui_selection(const bool sel);
71
+void do_select_screen(PGM_P const yes, PGM_P const no, selectFunc_t yesFunc, selectFunc_t noFunc, PGM_P const pref, const char * const string=NULL, PGM_P const suff=NULL);
72
+inline void do_select_screen_yn(selectFunc_t yesFunc, selectFunc_t noFunc, PGM_P const pref, const char * const string=NULL, PGM_P const suff=NULL) {
73
+  do_select_screen(PSTR(MSG_YES), PSTR(MSG_NO), yesFunc, noFunc, pref, string, suff);
73
 }
74
 }
75
+
76
+void draw_edit_screen(PGM_P const pstr, const char* const value=NULL);
74
 void draw_menu_item(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char);
77
 void draw_menu_item(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char);
75
 void draw_menu_item_static(const uint8_t row, PGM_P const pstr, const bool center=true, const bool invert=false, const char *valstr=NULL);
78
 void draw_menu_item_static(const uint8_t row, PGM_P const pstr, const bool center=true, const bool invert=false, const char *valstr=NULL);
76
 void _draw_menu_item_edit(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm);
79
 void _draw_menu_item_edit(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm);

+ 6
- 9
Marlin/src/lcd/menu/menu_advanced.cpp 查看文件

604
 
604
 
605
     #include "../../module/configuration_store.h"
605
     #include "../../module/configuration_store.h"
606
 
606
 
607
-    static void lcd_init_eeprom() {
608
-      ui.completion_feedback(settings.init_eeprom());
609
-      ui.goto_previous_screen();
610
-    }
611
-
612
     static void lcd_init_eeprom_confirm() {
607
     static void lcd_init_eeprom_confirm() {
613
-      START_MENU();
614
-      MENU_BACK(MSG_ADVANCED_SETTINGS);
615
-      MENU_ITEM(function, MSG_INIT_EEPROM, lcd_init_eeprom);
616
-      END_MENU();
608
+      do_select_screen(
609
+        PSTR(MSG_BUTTON_INIT), PSTR(MSG_BUTTON_CANCEL),
610
+        []{ ui.completion_feedback(settings.init_eeprom()); },
611
+        ui.goto_previous_screen,
612
+        PSTR(MSG_INIT_EEPROM), NULL, PSTR("?")
613
+      );
617
     }
614
     }
618
 
615
 
619
   #endif
616
   #endif

+ 17
- 17
Marlin/src/lcd/menu/menu_bed_corners.cpp 查看文件

50
   static bool leveling_was_active = false;
50
   static bool leveling_was_active = false;
51
 #endif
51
 #endif
52
 
52
 
53
-static inline void _lcd_level_bed_corners_back() {
54
-  #if HAS_LEVELING
55
-    set_bed_leveling_enabled(leveling_was_active);
56
-  #endif
57
-  ui.goto_previous_screen_no_defer();
58
-}
59
-
60
 /**
53
 /**
61
  * Level corners, starting in the front-left corner.
54
  * Level corners, starting in the front-left corner.
62
  */
55
  */
94
 }
87
 }
95
 
88
 
96
 static inline void menu_level_bed_corners() {
89
 static inline void menu_level_bed_corners() {
97
-  START_MENU();
98
-  MENU_ITEM(function,
99
-    #if ENABLED(LEVEL_CENTER_TOO)
100
-      MSG_LEVEL_BED_NEXT_POINT
101
-    #else
102
-      MSG_NEXT_CORNER
103
-    #endif
104
-    , _lcd_goto_next_corner
90
+  do_select_screen(
91
+    PSTR(MSG_BUTTON_NEXT), PSTR(MSG_BUTTON_DONE),
92
+    _lcd_goto_next_corner,
93
+    []{
94
+      #if HAS_LEVELING
95
+        set_bed_leveling_enabled(leveling_was_active);
96
+      #endif
97
+      ui.goto_previous_screen_no_defer();
98
+    },
99
+    PSTR(
100
+      #if ENABLED(LEVEL_CENTER_TOO)
101
+        MSG_LEVEL_BED_NEXT_POINT
102
+      #else
103
+        MSG_NEXT_CORNER
104
+      #endif
105
+    ), NULL, PSTR("?")
105
   );
106
   );
106
-  MENU_ITEM(function, MSG_BACK, _lcd_level_bed_corners_back);
107
-  END_MENU();
108
 }
107
 }
109
 
108
 
110
 static inline void _lcd_level_bed_corners_homing() {
109
 static inline void _lcd_level_bed_corners_homing() {
112
   if (all_axes_homed()) {
111
   if (all_axes_homed()) {
113
     bed_corner = 0;
112
     bed_corner = 0;
114
     ui.goto_screen(menu_level_bed_corners);
113
     ui.goto_screen(menu_level_bed_corners);
114
+    set_ui_selection(true);
115
     _lcd_goto_next_corner();
115
     _lcd_goto_next_corner();
116
   }
116
   }
117
 }
117
 }

+ 2
- 0
Marlin/src/lcd/menu/menu_job_recovery.cpp 查看文件

44
   ui.return_to_status();
44
   ui.return_to_status();
45
 }
45
 }
46
 
46
 
47
+// TODO: Display long filename with Cancel/Resume buttons
48
+//       Requires supporting methods in PLR class.
47
 void menu_job_recovery() {
49
 void menu_job_recovery() {
48
   ui.defer_status_screen();
50
   ui.defer_status_screen();
49
   START_MENU();
51
   START_MENU();

+ 1
- 4
Marlin/src/lcd/menu/menu_main.cpp 查看文件

101
   }
101
   }
102
 
102
 
103
   void menu_abort_confirm() {
103
   void menu_abort_confirm() {
104
-    START_MENU();
105
-    MENU_BACK(MSG_MAIN);
106
-    MENU_ITEM(function, MSG_STOP_PRINT, lcd_abort_job);
107
-    END_MENU();
104
+    do_select_screen(PSTR(MSG_BUTTON_STOP), PSTR(MSG_BACK), lcd_abort_job, ui.goto_previous_screen, PSTR(MSG_STOP_PRINT), NULL, PSTR("?"));
108
   }
105
   }
109
 
106
 
110
 #endif // MACHINE_CAN_STOP
107
 #endif // MACHINE_CAN_STOP

+ 10
- 10
Marlin/src/lcd/menu/menu_mixer.cpp 查看文件

250
 //
250
 //
251
 // Reset All V-Tools
251
 // Reset All V-Tools
252
 //
252
 //
253
-inline void _lcd_reset_vtools() {
254
-  LCD_MESSAGEPGM(MSG_VTOOLS_RESET);
255
-  ui.return_to_status();
256
-  mixer.reset_vtools();
257
-}
258
-
259
 void menu_mixer_vtools_reset_confirm() {
253
 void menu_mixer_vtools_reset_confirm() {
260
-  START_MENU();
261
-  MENU_BACK(MSG_BACK);
262
-  MENU_ITEM(function, MSG_RESET_VTOOLS, _lcd_reset_vtools);
263
-  END_MENU();
254
+  do_select_screen(
255
+    PSTR(MSG_BUTTON_RESET), PSTR(MSG_BUTTON_CANCEL),
256
+    []{
257
+      mixer.reset_vtools();
258
+      LCD_MESSAGEPGM(MSG_VTOOLS_RESET);
259
+      ui.return_to_status();
260
+    },
261
+    ui.goto_previous_screen,
262
+    PSTR(MSG_RESET_VTOOLS), NULL, PSTR("?")
263
+  );
264
 }
264
 }
265
 
265
 
266
 void menu_mixer() {
266
 void menu_mixer() {

+ 5
- 11
Marlin/src/lcd/menu/menu_sdcard.cpp 查看文件

81
 
81
 
82
 #if ENABLED(SD_MENU_CONFIRM_START)
82
 #if ENABLED(SD_MENU_CONFIRM_START)
83
 
83
 
84
-  bool do_print_file;
85
   void menu_sd_confirm() {
84
   void menu_sd_confirm() {
86
-    if (ui.should_draw())
87
-      do_select_screen(PSTR(MSG_BUTTON_PRINT), PSTR(MSG_BUTTON_CANCEL), do_print_file, PSTR(MSG_START_PRINT " "), card.longest_filename(), PSTR("?"));
88
-
89
-    if (ui.use_click()) {
90
-      if (do_print_file)
91
-        sdcard_start_selected_file();
92
-      else
93
-        ui.goto_previous_screen();
94
-    }
85
+    do_select_screen(
86
+      PSTR(MSG_BUTTON_PRINT), PSTR(MSG_BUTTON_CANCEL),
87
+      sdcard_start_selected_file, ui.goto_previous_screen,
88
+      PSTR(MSG_START_PRINT " "), card.longest_filename(), PSTR("?")
89
+    );
95
   }
90
   }
96
 
91
 
97
 #endif
92
 #endif
106
         sd_items = screen_items;
101
         sd_items = screen_items;
107
       #endif
102
       #endif
108
       #if ENABLED(SD_MENU_CONFIRM_START)
103
       #if ENABLED(SD_MENU_CONFIRM_START)
109
-        do_print_file = false;
110
         MenuItem_submenu::action(menu_sd_confirm);
104
         MenuItem_submenu::action(menu_sd_confirm);
111
       #else
105
       #else
112
         sdcard_start_selected_file();
106
         sdcard_start_selected_file();

+ 17
- 37
Marlin/src/lcd/menu/menu_service.cpp 查看文件

31
 #include "menu.h"
31
 #include "menu.h"
32
 #include "../../module/printcounter.h"
32
 #include "../../module/printcounter.h"
33
 
33
 
34
-inline void _lcd_reset_service(const int index) {
35
-  print_job_timer.resetServiceInterval(index);
36
-  BUZZ(200, 404);
37
-  ui.reset_status();
38
-  ui.return_to_status();
34
+inline void _menu_service(const int index, PGM_P const name) {
35
+  char sram[30];
36
+  strncpy_P(sram, name, 29);
37
+  do_select_screen(
38
+    PSTR(MSG_BUTTON_RESET), PSTR(MSG_BUTTON_CANCEL),
39
+    []{
40
+      print_job_timer.resetServiceInterval(index);
41
+      ui.completion_feedback(true);
42
+      ui.reset_status();
43
+      ui.return_to_status();
44
+    },
45
+    ui.goto_previous_screen,
46
+    PSTR(MSG_SERVICE_RESET), sram, PSTR("?")
47
+  );
39
 }
48
 }
40
 
49
 
41
 #if SERVICE_INTERVAL_1 > 0
50
 #if SERVICE_INTERVAL_1 > 0
42
-  void menu_action_reset_service1() { _lcd_reset_service(1); }
51
+  void menu_service1() { _menu_service(1, PSTR(SERVICE_NAME_1)); }
43
 #endif
52
 #endif
44
 
53
 
45
 #if SERVICE_INTERVAL_2 > 0
54
 #if SERVICE_INTERVAL_2 > 0
46
-  void menu_action_reset_service2() { _lcd_reset_service(2); }
55
+  void menu_service2() { _menu_service(2, PSTR(SERVICE_NAME_2)); }
47
 #endif
56
 #endif
48
 
57
 
49
 #if SERVICE_INTERVAL_3 > 0
58
 #if SERVICE_INTERVAL_3 > 0
50
-  void menu_action_reset_service3() { _lcd_reset_service(3); }
51
-#endif
52
-
53
-inline void _menu_service(const int index) {
54
-  START_MENU();
55
-  MENU_BACK(MSG_MAIN);
56
-  switch (index) {
57
-    #if SERVICE_INTERVAL_1 > 0
58
-      case 1: MENU_ITEM(function, MSG_SERVICE_RESET, menu_action_reset_service1); break;
59
-    #endif
60
-    #if SERVICE_INTERVAL_2 > 0
61
-      case 2: MENU_ITEM(function, MSG_SERVICE_RESET, menu_action_reset_service2); break;
62
-    #endif
63
-    #if SERVICE_INTERVAL_3 > 0
64
-      case 3: MENU_ITEM(function, MSG_SERVICE_RESET, menu_action_reset_service3); break;
65
-    #endif
66
-  }
67
-  END_MENU();
68
-}
69
-
70
-#if SERVICE_INTERVAL_1 > 0
71
-  void menu_service1() { _menu_service(1); }
72
-#endif
73
-
74
-#if SERVICE_INTERVAL_2 > 0
75
-  void menu_service2() { _menu_service(2); }
76
-#endif
77
-
78
-#if SERVICE_INTERVAL_3 > 0
79
-  void menu_service3() { _menu_service(3); }
59
+  void menu_service3() { _menu_service(3, PSTR(SERVICE_NAME_3)); }
80
 #endif
60
 #endif
81
 
61
 
82
 #endif // HAS_LCD_MENU && HAS_SERVICE_INTERVALS && PRINTCOUNTER
62
 #endif // HAS_LCD_MENU && HAS_SERVICE_INTERVALS && PRINTCOUNTER

+ 42
- 42
Marlin/src/lcd/menu/menu_tmc.cpp 查看文件

32
 #include "../../module/stepper_indirection.h"
32
 #include "../../module/stepper_indirection.h"
33
 #include "../../feature/tmc_util.h"
33
 #include "../../feature/tmc_util.h"
34
 
34
 
35
-#define TMC_EDIT_STORED_I_RMS(ST) MENU_ITEM_EDIT_CALLBACK(uint16_4, MSG_##ST, &stepper##ST.val_mA, 100, 3000, refresh_stepper_current_##ST)
35
+#define TMC_EDIT_STORED_I_RMS(ST,MSG) MENU_ITEM_EDIT_CALLBACK(uint16_4, MSG, &stepper##ST.val_mA, 100, 3000, refresh_stepper_current_##ST)
36
 
36
 
37
 #if AXIS_IS_TMC(X)
37
 #if AXIS_IS_TMC(X)
38
   void refresh_stepper_current_X()  { stepperX.refresh_stepper_current();  }
38
   void refresh_stepper_current_X()  { stepperX.refresh_stepper_current();  }
78
   START_MENU();
78
   START_MENU();
79
   MENU_BACK(MSG_TMC_DRIVERS);
79
   MENU_BACK(MSG_TMC_DRIVERS);
80
   #if AXIS_IS_TMC(X)
80
   #if AXIS_IS_TMC(X)
81
-    TMC_EDIT_STORED_I_RMS(X);
81
+    TMC_EDIT_STORED_I_RMS(X, MSG_X);
82
   #endif
82
   #endif
83
   #if AXIS_IS_TMC(Y)
83
   #if AXIS_IS_TMC(Y)
84
-    TMC_EDIT_STORED_I_RMS(Y);
84
+    TMC_EDIT_STORED_I_RMS(Y, MSG_Y);
85
   #endif
85
   #endif
86
   #if AXIS_IS_TMC(Z)
86
   #if AXIS_IS_TMC(Z)
87
-    TMC_EDIT_STORED_I_RMS(Z);
87
+    TMC_EDIT_STORED_I_RMS(Z, MSG_Z);
88
   #endif
88
   #endif
89
   #if AXIS_IS_TMC(X2)
89
   #if AXIS_IS_TMC(X2)
90
-    TMC_EDIT_STORED_I_RMS(X2);
90
+    TMC_EDIT_STORED_I_RMS(X2, MSG_X2);
91
   #endif
91
   #endif
92
   #if AXIS_IS_TMC(Y2)
92
   #if AXIS_IS_TMC(Y2)
93
-    TMC_EDIT_STORED_I_RMS(Y2);
93
+    TMC_EDIT_STORED_I_RMS(Y2, MSG_Y2);
94
   #endif
94
   #endif
95
   #if AXIS_IS_TMC(Z2)
95
   #if AXIS_IS_TMC(Z2)
96
-    TMC_EDIT_STORED_I_RMS(Z2);
96
+    TMC_EDIT_STORED_I_RMS(Z2, MSG_Z2);
97
   #endif
97
   #endif
98
   #if AXIS_IS_TMC(Z3)
98
   #if AXIS_IS_TMC(Z3)
99
-    TMC_EDIT_STORED_I_RMS(Z3);
99
+    TMC_EDIT_STORED_I_RMS(Z3, MSG_Z3);
100
   #endif
100
   #endif
101
   #if AXIS_IS_TMC(E0)
101
   #if AXIS_IS_TMC(E0)
102
-    TMC_EDIT_STORED_I_RMS(E0);
102
+    TMC_EDIT_STORED_I_RMS(E0, MSG_E1);
103
   #endif
103
   #endif
104
   #if AXIS_IS_TMC(E1)
104
   #if AXIS_IS_TMC(E1)
105
-    TMC_EDIT_STORED_I_RMS(E1);
105
+    TMC_EDIT_STORED_I_RMS(E1, MSG_E2);
106
   #endif
106
   #endif
107
   #if AXIS_IS_TMC(E2)
107
   #if AXIS_IS_TMC(E2)
108
-    TMC_EDIT_STORED_I_RMS(E2);
108
+    TMC_EDIT_STORED_I_RMS(E2, MSG_E3);
109
   #endif
109
   #endif
110
   #if AXIS_IS_TMC(E3)
110
   #if AXIS_IS_TMC(E3)
111
-    TMC_EDIT_STORED_I_RMS(E3);
111
+    TMC_EDIT_STORED_I_RMS(E3, MSG_E4);
112
   #endif
112
   #endif
113
   #if AXIS_IS_TMC(E4)
113
   #if AXIS_IS_TMC(E4)
114
-    TMC_EDIT_STORED_I_RMS(E4);
114
+    TMC_EDIT_STORED_I_RMS(E4, MSG_E5);
115
   #endif
115
   #endif
116
   #if AXIS_IS_TMC(E5)
116
   #if AXIS_IS_TMC(E5)
117
-    TMC_EDIT_STORED_I_RMS(E5);
117
+    TMC_EDIT_STORED_I_RMS(E5, MSG_E6);
118
   #endif
118
   #endif
119
   END_MENU();
119
   END_MENU();
120
 }
120
 }
121
 
121
 
122
 #if ENABLED(HYBRID_THRESHOLD)
122
 #if ENABLED(HYBRID_THRESHOLD)
123
 
123
 
124
-  #define TMC_EDIT_STORED_HYBRID_THRS(ST) MENU_ITEM_EDIT_CALLBACK(uint8, MSG_##ST, &stepper##ST.stored.hybrid_thrs, 0, 255, refresh_hybrid_thrs_##ST);
124
+  #define TMC_EDIT_STORED_HYBRID_THRS(ST, MSG) MENU_ITEM_EDIT_CALLBACK(uint8, MSG, &stepper##ST.stored.hybrid_thrs, 0, 255, refresh_hybrid_thrs_##ST);
125
 
125
 
126
   #if AXIS_HAS_STEALTHCHOP(X)
126
   #if AXIS_HAS_STEALTHCHOP(X)
127
     void refresh_hybrid_thrs_X()  {  stepperX.refresh_hybrid_thrs(planner.settings.axis_steps_per_mm[X_AXIS]); }
127
     void refresh_hybrid_thrs_X()  {  stepperX.refresh_hybrid_thrs(planner.settings.axis_steps_per_mm[X_AXIS]); }
167
     START_MENU();
167
     START_MENU();
168
     MENU_BACK(MSG_TMC_DRIVERS);
168
     MENU_BACK(MSG_TMC_DRIVERS);
169
     #if AXIS_HAS_STEALTHCHOP(X)
169
     #if AXIS_HAS_STEALTHCHOP(X)
170
-      TMC_EDIT_STORED_HYBRID_THRS(X);
170
+      TMC_EDIT_STORED_HYBRID_THRS(X, MSG_X);
171
     #endif
171
     #endif
172
     #if AXIS_HAS_STEALTHCHOP(Y)
172
     #if AXIS_HAS_STEALTHCHOP(Y)
173
-      TMC_EDIT_STORED_HYBRID_THRS(Y);
173
+      TMC_EDIT_STORED_HYBRID_THRS(Y, MSG_Y);
174
     #endif
174
     #endif
175
     #if AXIS_HAS_STEALTHCHOP(Z)
175
     #if AXIS_HAS_STEALTHCHOP(Z)
176
-      TMC_EDIT_STORED_HYBRID_THRS(Z);
176
+      TMC_EDIT_STORED_HYBRID_THRS(Z, MSG_Z);
177
     #endif
177
     #endif
178
     #if AXIS_HAS_STEALTHCHOP(X2)
178
     #if AXIS_HAS_STEALTHCHOP(X2)
179
-      TMC_EDIT_STORED_HYBRID_THRS(X2);
179
+      TMC_EDIT_STORED_HYBRID_THRS(X2, MSG_X2);
180
     #endif
180
     #endif
181
     #if AXIS_HAS_STEALTHCHOP(Y2)
181
     #if AXIS_HAS_STEALTHCHOP(Y2)
182
-      TMC_EDIT_STORED_HYBRID_THRS(Y2);
182
+      TMC_EDIT_STORED_HYBRID_THRS(Y2, MSG_Y2);
183
     #endif
183
     #endif
184
     #if AXIS_HAS_STEALTHCHOP(Z2)
184
     #if AXIS_HAS_STEALTHCHOP(Z2)
185
-      TMC_EDIT_STORED_HYBRID_THRS(Z2);
185
+      TMC_EDIT_STORED_HYBRID_THRS(Z2, MSG_Z2);
186
     #endif
186
     #endif
187
     #if AXIS_HAS_STEALTHCHOP(Z3)
187
     #if AXIS_HAS_STEALTHCHOP(Z3)
188
-      TMC_EDIT_STORED_HYBRID_THRS(Z3);
188
+      TMC_EDIT_STORED_HYBRID_THRS(Z3, MSG_Z3);
189
     #endif
189
     #endif
190
     #if AXIS_HAS_STEALTHCHOP(E0)
190
     #if AXIS_HAS_STEALTHCHOP(E0)
191
-      TMC_EDIT_STORED_HYBRID_THRS(E0);
191
+      TMC_EDIT_STORED_HYBRID_THRS(E0, MSG_E1);
192
     #endif
192
     #endif
193
     #if AXIS_HAS_STEALTHCHOP(E1)
193
     #if AXIS_HAS_STEALTHCHOP(E1)
194
-      TMC_EDIT_STORED_HYBRID_THRS(E1);
194
+      TMC_EDIT_STORED_HYBRID_THRS(E1, MSG_E2);
195
     #endif
195
     #endif
196
     #if AXIS_HAS_STEALTHCHOP(E2)
196
     #if AXIS_HAS_STEALTHCHOP(E2)
197
-      TMC_EDIT_STORED_HYBRID_THRS(E2);
197
+      TMC_EDIT_STORED_HYBRID_THRS(E2, MSG_E3);
198
     #endif
198
     #endif
199
     #if AXIS_HAS_STEALTHCHOP(E3)
199
     #if AXIS_HAS_STEALTHCHOP(E3)
200
-      TMC_EDIT_STORED_HYBRID_THRS(E3);
200
+      TMC_EDIT_STORED_HYBRID_THRS(E3, MSG_E4);
201
     #endif
201
     #endif
202
     #if AXIS_HAS_STEALTHCHOP(E4)
202
     #if AXIS_HAS_STEALTHCHOP(E4)
203
-      TMC_EDIT_STORED_HYBRID_THRS(E4);
203
+      TMC_EDIT_STORED_HYBRID_THRS(E4, MSG_E5);
204
     #endif
204
     #endif
205
     #if AXIS_HAS_STEALTHCHOP(E5)
205
     #if AXIS_HAS_STEALTHCHOP(E5)
206
-      TMC_EDIT_STORED_HYBRID_THRS(E5);
206
+      TMC_EDIT_STORED_HYBRID_THRS(E5, MSG_E6);
207
     #endif
207
     #endif
208
     END_MENU();
208
     END_MENU();
209
   }
209
   }
243
 
243
 
244
 #if HAS_STEALTHCHOP
244
 #if HAS_STEALTHCHOP
245
 
245
 
246
-  #define TMC_EDIT_STEP_MODE(ST) MENU_ITEM_EDIT_CALLBACK(bool, MSG_##ST, &stepper##ST.stored.stealthChop_enabled, refresh_stepping_mode_##ST)
246
+  #define TMC_EDIT_STEP_MODE(ST, MSG) MENU_ITEM_EDIT_CALLBACK(bool, MSG, &stepper##ST.stored.stealthChop_enabled, refresh_stepping_mode_##ST)
247
 
247
 
248
   #if AXIS_HAS_STEALTHCHOP(X)
248
   #if AXIS_HAS_STEALTHCHOP(X)
249
     void refresh_stepping_mode_X()  { stepperX.refresh_stepping_mode();  }
249
     void refresh_stepping_mode_X()  { stepperX.refresh_stepping_mode();  }
290
     STATIC_ITEM(MSG_TMC_STEALTH_ENABLED);
290
     STATIC_ITEM(MSG_TMC_STEALTH_ENABLED);
291
     MENU_BACK(MSG_TMC_DRIVERS);
291
     MENU_BACK(MSG_TMC_DRIVERS);
292
     #if AXIS_HAS_STEALTHCHOP(X)
292
     #if AXIS_HAS_STEALTHCHOP(X)
293
-      TMC_EDIT_STEP_MODE(X);
293
+      TMC_EDIT_STEP_MODE(X, MSG_X);
294
     #endif
294
     #endif
295
     #if AXIS_HAS_STEALTHCHOP(Y)
295
     #if AXIS_HAS_STEALTHCHOP(Y)
296
-      TMC_EDIT_STEP_MODE(Y);
296
+      TMC_EDIT_STEP_MODE(Y, MSG_Y);
297
     #endif
297
     #endif
298
     #if AXIS_HAS_STEALTHCHOP(Z)
298
     #if AXIS_HAS_STEALTHCHOP(Z)
299
-      TMC_EDIT_STEP_MODE(Z);
299
+      TMC_EDIT_STEP_MODE(Z, MSG_Z);
300
     #endif
300
     #endif
301
     #if AXIS_HAS_STEALTHCHOP(X2)
301
     #if AXIS_HAS_STEALTHCHOP(X2)
302
-      TMC_EDIT_STEP_MODE(X2);
302
+      TMC_EDIT_STEP_MODE(X2, MSG_X2);
303
     #endif
303
     #endif
304
     #if AXIS_HAS_STEALTHCHOP(Y2)
304
     #if AXIS_HAS_STEALTHCHOP(Y2)
305
-      TMC_EDIT_STEP_MODE(Y2);
305
+      TMC_EDIT_STEP_MODE(Y2, MSG_Y2);
306
     #endif
306
     #endif
307
     #if AXIS_HAS_STEALTHCHOP(Z2)
307
     #if AXIS_HAS_STEALTHCHOP(Z2)
308
-      TMC_EDIT_STEP_MODE(Z2);
308
+      TMC_EDIT_STEP_MODE(Z2, MSG_Z2);
309
     #endif
309
     #endif
310
     #if AXIS_HAS_STEALTHCHOP(Z3)
310
     #if AXIS_HAS_STEALTHCHOP(Z3)
311
-      TMC_EDIT_STEP_MODE(Z3);
311
+      TMC_EDIT_STEP_MODE(Z3, MSG_Z3);
312
     #endif
312
     #endif
313
     #if AXIS_HAS_STEALTHCHOP(E0)
313
     #if AXIS_HAS_STEALTHCHOP(E0)
314
-      TMC_EDIT_STEP_MODE(E0);
314
+      TMC_EDIT_STEP_MODE(E0, MSG_E1);
315
     #endif
315
     #endif
316
     #if AXIS_HAS_STEALTHCHOP(E1)
316
     #if AXIS_HAS_STEALTHCHOP(E1)
317
-      TMC_EDIT_STEP_MODE(E1);
317
+      TMC_EDIT_STEP_MODE(E1, MSG_E2);
318
     #endif
318
     #endif
319
     #if AXIS_HAS_STEALTHCHOP(E2)
319
     #if AXIS_HAS_STEALTHCHOP(E2)
320
-      TMC_EDIT_STEP_MODE(E2);
320
+      TMC_EDIT_STEP_MODE(E2, MSG_E3);
321
     #endif
321
     #endif
322
     #if AXIS_HAS_STEALTHCHOP(E3)
322
     #if AXIS_HAS_STEALTHCHOP(E3)
323
-      TMC_EDIT_STEP_MODE(E3);
323
+      TMC_EDIT_STEP_MODE(E3, MSG_E4);
324
     #endif
324
     #endif
325
     #if AXIS_HAS_STEALTHCHOP(E4)
325
     #if AXIS_HAS_STEALTHCHOP(E4)
326
-      TMC_EDIT_STEP_MODE(E4);
326
+      TMC_EDIT_STEP_MODE(E4, MSG_E5);
327
     #endif
327
     #endif
328
     #if AXIS_HAS_STEALTHCHOP(E5)
328
     #if AXIS_HAS_STEALTHCHOP(E5)
329
-      TMC_EDIT_STEP_MODE(E5);
329
+      TMC_EDIT_STEP_MODE(E5, MSG_E6);
330
     #endif
330
     #endif
331
     END_MENU();
331
     END_MENU();
332
   }
332
   }

+ 4
- 2
Marlin/src/lcd/menu/menu_ubl.cpp 查看文件

615
 void _lcd_ubl_level_bed() {
615
 void _lcd_ubl_level_bed() {
616
   START_MENU();
616
   START_MENU();
617
   MENU_BACK(MSG_MOTION);
617
   MENU_BACK(MSG_MOTION);
618
-  MENU_ITEM(gcode, MSG_UBL_ACTIVATE_MESH, PSTR("G29 A"));
619
-  MENU_ITEM(gcode, MSG_UBL_DEACTIVATE_MESH, PSTR("G29 D"));
618
+  if (planner.leveling_active)
619
+    MENU_ITEM(gcode, MSG_UBL_DEACTIVATE_MESH, PSTR("G29 D"));
620
+  else
621
+    MENU_ITEM(gcode, MSG_UBL_ACTIVATE_MESH, PSTR("G29 A"));
620
   MENU_ITEM(submenu, MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step);
622
   MENU_ITEM(submenu, MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step);
621
   MENU_ITEM(function, MSG_UBL_MESH_EDIT, _lcd_ubl_output_map_lcd_cmd);
623
   MENU_ITEM(function, MSG_UBL_MESH_EDIT, _lcd_ubl_output_map_lcd_cmd);
622
   MENU_ITEM(submenu, MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh);
624
   MENU_ITEM(submenu, MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh);

+ 25
- 8
Marlin/src/lcd/ultralcd.cpp 查看文件

192
 
192
 
193
   #endif
193
   #endif
194
 
194
 
195
-  void wrap_string(uint8_t y, const char * const string) {
196
-    uint8_t x = LCD_WIDTH;
195
+  void _wrap_string(uint8_t &x, uint8_t &y, const char * const string, read_byte_cb_t cb_read_byte) {
196
+    SETCURSOR(x, y);
197
     if (string) {
197
     if (string) {
198
       uint8_t *p = (uint8_t*)string;
198
       uint8_t *p = (uint8_t*)string;
199
       for (;;) {
199
       for (;;) {
200
-        if (x >= LCD_WIDTH) {
201
-          x = 0;
202
-          SETCURSOR(0, y++);
203
-        }
204
         wchar_t ch;
200
         wchar_t ch;
205
-        p = get_utf8_value_cb(p, read_byte_ram, &ch);
201
+        p = get_utf8_value_cb(p, cb_read_byte, &ch);
206
         if (!ch) break;
202
         if (!ch) break;
207
         lcd_put_wchar(ch);
203
         lcd_put_wchar(ch);
208
         x++;
204
         x++;
205
+        if (x >= LCD_WIDTH) {
206
+          x = 0; y++;
207
+          SETCURSOR(0, y);
208
+        }
209
       }
209
       }
210
     }
210
     }
211
   }
211
   }
212
 
212
 
213
+  void MarlinUI::draw_select_screen_prompt(PGM_P const pref, const char * const string/*=NULL*/, PGM_P const suff/*=NULL*/) {
214
+    const uint8_t plen = utf8_strlen_P(pref), slen = suff ? utf8_strlen_P(suff) : 0;
215
+    uint8_t x = 0, y = 0;
216
+    if (!string && plen + slen <= LCD_WIDTH) {
217
+      x = (LCD_WIDTH - plen - slen) / 2;
218
+      y = LCD_HEIGHT > 3 ? 1 : 0;
219
+    }
220
+    wrap_string_P(x, y, pref);
221
+    if (string) {
222
+      if (x) { x = 0; y++; } // Move to the start of the next line
223
+      wrap_string(x, y, string);
224
+    }
225
+    if (suff) wrap_string_P(x, y, suff);
226
+  }
227
+
213
 #endif // HAS_LCD_MENU
228
 #endif // HAS_LCD_MENU
214
 
229
 
215
 void MarlinUI::init() {
230
 void MarlinUI::init() {
668
 
683
 
669
   static uint16_t max_display_update_time = 0;
684
   static uint16_t max_display_update_time = 0;
670
   static millis_t next_lcd_update_ms;
685
   static millis_t next_lcd_update_ms;
686
+  millis_t ms = millis();
671
 
687
 
672
   #if HAS_LCD_MENU
688
   #if HAS_LCD_MENU
673
 
689
 
729
 
745
 
730
       refresh();
746
       refresh();
731
       init_lcd(); // May revive the LCD if static electricity killed it
747
       init_lcd(); // May revive the LCD if static electricity killed it
748
+      ms = millis();
749
+      next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL;  // delay LCD update until after SD activity completes
732
     }
750
     }
733
 
751
 
734
   #endif // SDSUPPORT && SD_DETECT_PIN
752
   #endif // SDSUPPORT && SD_DETECT_PIN
735
 
753
 
736
-  const millis_t ms = millis();
737
   if (ELAPSED(ms, next_lcd_update_ms)
754
   if (ELAPSED(ms, next_lcd_update_ms)
738
     #if HAS_GRAPHICAL_LCD
755
     #if HAS_GRAPHICAL_LCD
739
       || drawing_screen
756
       || drawing_screen

+ 7
- 1
Marlin/src/lcd/ultralcd.h 查看文件

72
       #define LCDWRITE(c) lcd_put_wchar(c)
72
       #define LCDWRITE(c) lcd_put_wchar(c)
73
     #endif
73
     #endif
74
 
74
 
75
-    void wrap_string(uint8_t y, const char * const string);
75
+    #include "fontutils.h"
76
+
77
+    void _wrap_string(uint8_t &x, uint8_t &y, const char * const string, read_byte_cb_t cb_read_byte);
78
+    inline void wrap_string_P(uint8_t &x, uint8_t &y, PGM_P const pstr) { _wrap_string(x, y, pstr, read_byte_rom); }
79
+    inline void wrap_string(uint8_t &x, uint8_t &y, const char * const string) { _wrap_string(x, y, string, read_byte_ram); }
76
 
80
 
77
     #if ENABLED(SDSUPPORT)
81
     #if ENABLED(SDSUPPORT)
78
       #include "../sd/cardreader.h"
82
       #include "../sd/cardreader.h"
457
       static void ubl_plot(const uint8_t x, const uint8_t inverted_y);
461
       static void ubl_plot(const uint8_t x, const uint8_t inverted_y);
458
     #endif
462
     #endif
459
 
463
 
464
+    static void draw_select_screen_prompt(PGM_P const pref, const char * const string=NULL, PGM_P const suff=NULL);
465
+
460
   #elif HAS_SPI_LCD
466
   #elif HAS_SPI_LCD
461
 
467
 
462
     static constexpr bool lcd_clicked = false;
468
     static constexpr bool lcd_clicked = false;

+ 19
- 1
Marlin/src/module/configuration_store.cpp 查看文件

64
   #include "../feature/bedlevel/bedlevel.h"
64
   #include "../feature/bedlevel/bedlevel.h"
65
 #endif
65
 #endif
66
 
66
 
67
+#if ENABLED(EXTENSIBLE_UI)
68
+  #include "../lcd/extensible_ui/ui_api.h"
69
+#endif
70
+
67
 #if HAS_SERVOS
71
 #if HAS_SERVOS
68
   #include "servo.h"
72
   #include "servo.h"
69
 #endif
73
 #endif
1120
         store_mesh(ubl.storage_slot);
1124
         store_mesh(ubl.storage_slot);
1121
     #endif
1125
     #endif
1122
 
1126
 
1127
+    #if ENABLED(EXTENSIBLE_UI)
1128
+      if (!eeprom_error) ExtUI::onStoreSettings();
1129
+    #endif
1130
+
1123
     return !eeprom_error;
1131
     return !eeprom_error;
1124
   }
1132
   }
1125
 
1133
 
1874
   }
1882
   }
1875
 
1883
 
1876
   bool MarlinSettings::load() {
1884
   bool MarlinSettings::load() {
1877
-    if (validate()) return _load();
1885
+    if (validate()) {
1886
+      const bool success = _load();
1887
+      #if ENABLED(EXTENSIBLE_UI)
1888
+        if (success) ExtUI::onLoadSettings();
1889
+      #endif
1890
+      return success;
1891
+    }
1878
     reset();
1892
     reset();
1879
     return true;
1893
     return true;
1880
   }
1894
   }
2290
 
2304
 
2291
   DEBUG_ECHO_START();
2305
   DEBUG_ECHO_START();
2292
   DEBUG_ECHOLNPGM("Hardcoded Default Settings Loaded");
2306
   DEBUG_ECHOLNPGM("Hardcoded Default Settings Loaded");
2307
+
2308
+  #if ENABLED(EXTENSIBLE_UI)
2309
+    ExtUI::onFactoryReset();
2310
+  #endif
2293
 }
2311
 }
2294
 
2312
 
2295
 #if DISABLED(DISABLE_M503)
2313
 #if DISABLED(DISABLE_M503)

+ 48
- 20
Marlin/src/module/temperature.cpp 查看文件

86
  */
86
  */
87
 
87
 
88
 #if HAS_HEATED_BED
88
 #if HAS_HEATED_BED
89
-  #define _BED_PSTR(E) (E) == -1 ? PSTR(MSG ## _BED) :
89
+  #define _BED_PSTR(M,E) (E) == -1 ? PSTR(M) :
90
 #else
90
 #else
91
-  #define _BED_PSTR(E)
91
+  #define _BED_PSTR(M,E)
92
 #endif
92
 #endif
93
 #if HAS_HEATED_CHAMBER
93
 #if HAS_HEATED_CHAMBER
94
-  #define _CHAMBER_PSTR(E) (E) == -2 ? PSTR(MSG ## _CHAMBER) :
94
+  #define _CHAMBER_PSTR(M,E) (E) == -2 ? PSTR(M) :
95
 #else
95
 #else
96
-  #define _CHAMBER_PSTR(E)
96
+  #define _CHAMBER_PSTR(M,E)
97
 #endif
97
 #endif
98
-#define _E_PSTR(M,E,N) (HOTENDS >= (N) && (E) == (N)-1) ? PSTR(MSG_E##N " " M) :
99
-#define TEMP_ERR_PSTR(M,E) _BED_PSTR(E) _CHAMBER_PSTR(E) _E_PSTR(M,E,2) _E_PSTR(M,E,3) _E_PSTR(M,E,4) _E_PSTR(M,E,5) _E_PSTR(M,E,6) PSTR(MSG_E1 " " M)
98
+#define _E_PSTR(M,E,N) ((HOTENDS) >= (N) && (E) == (N)-1) ? PSTR(MSG_E##N " " M) :
99
+#define TEMP_ERR_PSTR(M,E) _BED_PSTR(M##_BED,E) _CHAMBER_PSTR(M##_CHAMBER,E) _E_PSTR(M,E,2) _E_PSTR(M,E,3) _E_PSTR(M,E,4) _E_PSTR(M,E,5) _E_PSTR(M,E,6) PSTR(MSG_E1 " " M)
100
 
100
 
101
 // public:
101
 // public:
102
 
102
 
944
     if (temp_hotend[1].current < MAX(HEATER_1_MINTEMP, HEATER_1_MAX6675_TMIN + .01)) min_temp_error(1);
944
     if (temp_hotend[1].current < MAX(HEATER_1_MINTEMP, HEATER_1_MAX6675_TMIN + .01)) min_temp_error(1);
945
   #endif
945
   #endif
946
 
946
 
947
-  #if WATCH_HOTENDS || WATCH_BED || DISABLED(PIDTEMPBED) || HAS_AUTO_FAN || HEATER_IDLE_HANDLER || WATCH_CHAMBER
947
+  #define HAS_THERMAL_PROTECTION (ENABLED(THERMAL_PROTECTION_HOTENDS) || HAS_THERMALLY_PROTECTED_BED || ENABLED(THERMAL_PROTECTION_CHAMBER))
948
+
949
+  #if HAS_THERMAL_PROTECTION || DISABLED(PIDTEMPBED) || HAS_AUTO_FAN || HEATER_IDLE_HANDLER
948
     millis_t ms = millis();
950
     millis_t ms = millis();
949
   #endif
951
   #endif
950
 
952
 
953
+  #if HAS_THERMAL_PROTECTION
954
+    #ifndef THERMAL_PROTECTION_GRACE_PERIOD
955
+      #define THERMAL_PROTECTION_GRACE_PERIOD 0 // No grace period needed on well-behaved boards
956
+    #endif
957
+    #if THERMAL_PROTECTION_GRACE_PERIOD > 0
958
+      static millis_t grace_period = ms + THERMAL_PROTECTION_GRACE_PERIOD;
959
+      if (ELAPSED(ms, grace_period)) grace_period = 0UL;
960
+    #else
961
+      static constexpr millis_t grace_period = 0UL;
962
+    #endif
963
+  #endif
964
+
951
   HOTEND_LOOP() {
965
   HOTEND_LOOP() {
966
+    #if ENABLED(THERMAL_PROTECTION_HOTENDS)
967
+      if (!grace_period && degHotend(e) > temp_range[e].maxtemp)
968
+        _temp_error(e, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, e));
969
+    #endif
952
 
970
 
953
     #if HEATER_IDLE_HANDLER
971
     #if HEATER_IDLE_HANDLER
954
       hotend_idle[e].update(ms);
972
       hotend_idle[e].update(ms);
1001
 
1019
 
1002
   #if HAS_HEATED_BED
1020
   #if HAS_HEATED_BED
1003
 
1021
 
1022
+    #if ENABLED(THERMAL_PROTECTION_BED)
1023
+      if (!grace_period && degBed() > BED_MAXTEMP)
1024
+        _temp_error(-1, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, -1));
1025
+    #endif
1026
+
1004
     #if WATCH_BED
1027
     #if WATCH_BED
1005
       // Make sure temperature is increasing
1028
       // Make sure temperature is increasing
1006
       if (watch_bed.elapsed(ms)) {        // Time to check the bed?
1029
       if (watch_bed.elapsed(ms)) {        // Time to check the bed?
1071
 
1094
 
1072
     #if HAS_HEATED_CHAMBER
1095
     #if HAS_HEATED_CHAMBER
1073
 
1096
 
1097
+      #if ENABLED(THERMAL_PROTECTION_CHAMBER)
1098
+        if (!grace_period && degChamber() > CHAMBER_MAXTEMP)
1099
+          _temp_error(-2, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, -2));
1100
+      #endif
1101
+
1074
       #if WATCH_CHAMBER
1102
       #if WATCH_CHAMBER
1075
         // Make sure temperature is increasing
1103
         // Make sure temperature is increasing
1076
         if (watch_chamber.elapsed(ms)) {                  // Time to check the chamber?
1104
         if (watch_chamber.elapsed(ms)) {                  // Time to check the chamber?
1602
   }
1630
   }
1603
 #endif
1631
 #endif
1604
 
1632
 
1605
-#if ENABLED(THERMAL_PROTECTION_HOTENDS) || HAS_THERMALLY_PROTECTED_BED || ENABLED(THERMAL_PROTECTION_CHAMBER)
1633
+#if HAS_THERMAL_PROTECTION
1606
 
1634
 
1607
   #if ENABLED(THERMAL_PROTECTION_HOTENDS)
1635
   #if ENABLED(THERMAL_PROTECTION_HOTENDS)
1608
     Temperature::tr_state_machine_t Temperature::tr_state_machine[HOTENDS]; // = { { TRInactive, 0 } };
1636
     Temperature::tr_state_machine_t Temperature::tr_state_machine[HOTENDS]; // = { { TRInactive, 0 } };
1619
     static float tr_target_temperature[HOTENDS + 1] = { 0.0 };
1647
     static float tr_target_temperature[HOTENDS + 1] = { 0.0 };
1620
 
1648
 
1621
     /**
1649
     /**
1622
-        SERIAL_ECHO_START();
1623
-        SERIAL_ECHOPGM("Thermal Thermal Runaway Running. Heater ID: ");
1624
-        if (heater_id == -2) SERIAL_ECHOPGM("chamber");
1625
-        if (heater_id < 0) SERIAL_ECHOPGM("bed"); else SERIAL_ECHO(heater_id);
1626
-        SERIAL_ECHOPAIR(" ;  State:", sm.state, " ;  Timer:", sm.timer, " ;  Temperature:", current, " ;  Target Temp:", target);
1627
-        if (heater_id >= 0)
1628
-          SERIAL_ECHOPAIR(" ;  Idle Timeout:", hotend_idle[heater_id].timed_out);
1629
-        else
1630
-          SERIAL_ECHOPAIR(" ;  Idle Timeout:", bed_idle.timed_out);
1631
-        SERIAL_EOL();
1632
-    */
1650
+      SERIAL_ECHO_START();
1651
+      SERIAL_ECHOPGM("Thermal Thermal Runaway Running. Heater ID: ");
1652
+      if (heater_id == -2) SERIAL_ECHOPGM("chamber");
1653
+      if (heater_id < 0) SERIAL_ECHOPGM("bed"); else SERIAL_ECHO(heater_id);
1654
+      SERIAL_ECHOPAIR(" ;  State:", sm.state, " ;  Timer:", sm.timer, " ;  Temperature:", current, " ;  Target Temp:", target);
1655
+      if (heater_id >= 0)
1656
+        SERIAL_ECHOPAIR(" ;  Idle Timeout:", hotend_idle[heater_id].timed_out);
1657
+      else
1658
+        SERIAL_ECHOPAIR(" ;  Idle Timeout:", bed_idle.timed_out);
1659
+      SERIAL_EOL();
1660
+    //*/
1633
 
1661
 
1634
     const int heater_index = heater_id >= 0 ? heater_id : HOTENDS;
1662
     const int heater_index = heater_id >= 0 ? heater_id : HOTENDS;
1635
 
1663
 
2647
     void Temperature::set_heating_message(const uint8_t e) {
2675
     void Temperature::set_heating_message(const uint8_t e) {
2648
       const bool heating = isHeatingHotend(e);
2676
       const bool heating = isHeatingHotend(e);
2649
       #if HOTENDS > 1
2677
       #if HOTENDS > 1
2650
-        ui.status_printf_P(0, heating ? PSTR("E%i " MSG_HEATING) : PSTR("E%i " MSG_COOLING), int(e + 1));
2678
+        ui.status_printf_P(0, heating ? PSTR("E%c " MSG_HEATING) : PSTR("E%c " MSG_COOLING), '1' + e);
2651
       #else
2679
       #else
2652
         ui.set_status_P(heating ? PSTR("E " MSG_HEATING) : PSTR("E " MSG_COOLING));
2680
         ui.set_status_P(heating ? PSTR("E " MSG_HEATING) : PSTR("E " MSG_COOLING));
2653
       #endif
2681
       #endif

+ 53
- 78
Marlin/src/module/tool_change.cpp 查看文件

280
                   grabpos = parkingposx[tmp_extruder] + (tmp_extruder ? PARKING_EXTRUDER_GRAB_DISTANCE : -(PARKING_EXTRUDER_GRAB_DISTANCE)) + x_offset;
280
                   grabpos = parkingposx[tmp_extruder] + (tmp_extruder ? PARKING_EXTRUDER_GRAB_DISTANCE : -(PARKING_EXTRUDER_GRAB_DISTANCE)) + x_offset;
281
 
281
 
282
       /**
282
       /**
283
-       * 1. Raise Z-Axis to give enough clearance
284
-       * 2. Move to park position of old extruder
285
-       * 3. Disengage magnetic field, wait for delay
286
-       * 4. Move near new extruder
287
-       * 5. Engage magnetic field for new extruder
288
-       * 6. Move to parking incl. offset of new extruder
289
-       * 7. Lower Z-Axis
283
+       * 1. Move to park position of old extruder
284
+       * 2. Disengage magnetic field, wait for delay
285
+       * 3. Move near new extruder
286
+       * 4. Engage magnetic field for new extruder
287
+       * 5. Move to parking incl. offset of new extruder
288
+       * 6. Lower Z-Axis
290
        */
289
        */
291
 
290
 
292
       // STEP 1
291
       // STEP 1
293
 
292
 
294
       if (DEBUGGING(LEVELING)) DEBUG_POS("Start Autopark", current_position);
293
       if (DEBUGGING(LEVELING)) DEBUG_POS("Start Autopark", current_position);
295
 
294
 
296
-      current_position[Z_AXIS] += toolchange_settings.z_raise;
297
-
298
-      if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position);
299
-
300
-      fast_line_to_current(Z_AXIS);
301
-      planner.synchronize();
302
-
303
-      // STEP 2
304
-
305
       current_position[X_AXIS] = parkingposx[active_extruder] + x_offset;
295
       current_position[X_AXIS] = parkingposx[active_extruder] + x_offset;
306
 
296
 
307
       if (DEBUGGING(LEVELING)) {
297
       if (DEBUGGING(LEVELING)) {
308
-        DEBUG_ECHOLNPAIR("(2) Park extruder ", int(active_extruder));
298
+        DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder));
309
         DEBUG_POS("Moving ParkPos", current_position);
299
         DEBUG_POS("Moving ParkPos", current_position);
310
       }
300
       }
311
 
301
 
312
       fast_line_to_current(X_AXIS);
302
       fast_line_to_current(X_AXIS);
313
       planner.synchronize();
303
       planner.synchronize();
314
 
304
 
315
-      // STEP 3
305
+      // STEP 2
316
 
306
 
317
-      if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(3) Disengage magnet ");
307
+      if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(2) Disengage magnet ");
318
 
308
 
319
       pe_deactivate_solenoid(active_extruder);
309
       pe_deactivate_solenoid(active_extruder);
320
 
310
 
321
-      // STEP 4
311
+      // STEP 3
322
 
312
 
323
-      if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(4) Move to position near new extruder");
313
+      if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(3) Move to position near new extruder");
324
 
314
 
325
       current_position[X_AXIS] += active_extruder ? -10 : 10; // move 10mm away from parked extruder
315
       current_position[X_AXIS] += active_extruder ? -10 : 10; // move 10mm away from parked extruder
326
 
316
 
329
       fast_line_to_current(X_AXIS);
319
       fast_line_to_current(X_AXIS);
330
       planner.synchronize();
320
       planner.synchronize();
331
 
321
 
332
-      // STEP 5
333
-      if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(5) Engage magnetic field");
322
+      // STEP 4
323
+      if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(4) Engage magnetic field");
334
 
324
 
335
       #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT)
325
       #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT)
336
         pe_activate_solenoid(active_extruder); //just save power for inverted magnets
326
         pe_activate_solenoid(active_extruder); //just save power for inverted magnets
338
 
328
 
339
       pe_activate_solenoid(tmp_extruder);
329
       pe_activate_solenoid(tmp_extruder);
340
 
330
 
341
-      // STEP 6
331
+      // STEP 5
342
 
332
 
343
       current_position[X_AXIS] = grabpos + (tmp_extruder ? -10 : 10);
333
       current_position[X_AXIS] = grabpos + (tmp_extruder ? -10 : 10);
344
       fast_line_to_current(X_AXIS);
334
       fast_line_to_current(X_AXIS);
345
       current_position[X_AXIS] = grabpos;
335
       current_position[X_AXIS] = grabpos;
346
-      if (DEBUGGING(LEVELING)) DEBUG_POS("(6) Unpark extruder", current_position);
336
+      if (DEBUGGING(LEVELING)) DEBUG_POS("(5) Unpark extruder", current_position);
347
       planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS] * 0.5, active_extruder);
337
       planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS] * 0.5, active_extruder);
348
       planner.synchronize();
338
       planner.synchronize();
349
 
339
 
350
-      // STEP 7
340
+      // STEP 6
351
 
341
 
352
       current_position[X_AXIS] = midpos
342
       current_position[X_AXIS] = midpos
353
         #if HAS_HOTEND_OFFSET
343
         #if HAS_HOTEND_OFFSET
355
         #endif
345
         #endif
356
       ;
346
       ;
357
 
347
 
358
-      if (DEBUGGING(LEVELING)) DEBUG_POS("(7) Move midway between hotends", current_position);
348
+      if (DEBUGGING(LEVELING)) DEBUG_POS("(6) Move midway between hotends", current_position);
359
 
349
 
360
       fast_line_to_current(X_AXIS);
350
       fast_line_to_current(X_AXIS);
361
       planner.synchronize();
351
       planner.synchronize();
385
                 grabxpos = toolheadposx[tmp_extruder];
375
                 grabxpos = toolheadposx[tmp_extruder];
386
 
376
 
387
     /**
377
     /**
388
-     * 1. Raise Z to give enough clearance
389
-     * 2. Move to switch position of current toolhead
390
-     * 3. Unlock tool and drop it in the dock
391
-     * 4. Move to the new toolhead
392
-     * 5. Grab and lock the new toolhead
378
+     * 1. Move to switch position of current toolhead
379
+     * 2. Unlock tool and drop it in the dock
380
+     * 3. Move to the new toolhead
381
+     * 4. Grab and lock the new toolhead
393
      */
382
      */
394
 
383
 
395
-    // 1. Raise Z to give enough clearance
384
+    // 1. Move to switch position of current toolhead
396
 
385
 
397
     if (DEBUGGING(LEVELING)) DEBUG_POS("Starting Toolhead change", current_position);
386
     if (DEBUGGING(LEVELING)) DEBUG_POS("Starting Toolhead change", current_position);
398
 
387
 
399
-    current_position[Z_AXIS] += toolchange_settings.z_raise;
400
-
401
-    if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position);
402
-
403
-    fast_line_to_current(Z_AXIS);
404
-    planner.synchronize();
405
-
406
-    // 2. Move to switch position of current toolhead
407
-
408
     current_position[X_AXIS] = placexpos;
388
     current_position[X_AXIS] = placexpos;
409
 
389
 
410
     if (DEBUGGING(LEVELING)) {
390
     if (DEBUGGING(LEVELING)) {
411
-      DEBUG_ECHOLNPAIR("(2) Place old tool ", int(active_extruder));
391
+      DEBUG_ECHOLNPAIR("(1) Place old tool ", int(active_extruder));
412
       DEBUG_POS("Move X SwitchPos", current_position);
392
       DEBUG_POS("Move X SwitchPos", current_position);
413
     }
393
     }
414
 
394
 
422
     fast_line_to_current(Y_AXIS);
402
     fast_line_to_current(Y_AXIS);
423
     planner.synchronize();
403
     planner.synchronize();
424
 
404
 
425
-    // 3. Unlock tool and drop it in the dock
405
+    // 2. Unlock tool and drop it in the dock
426
 
406
 
427
-    if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(3) Unlock and Place Toolhead");
407
+    if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(2) Unlock and Place Toolhead");
428
 
408
 
429
     MOVE_SERVO(SWITCHING_TOOLHEAD_SERVO_NR, angles[1]);
409
     MOVE_SERVO(SWITCHING_TOOLHEAD_SERVO_NR, angles[1]);
430
     safe_delay(500);
410
     safe_delay(500);
443
     fast_line_to_current(Y_AXIS); // move away from docked toolhead
423
     fast_line_to_current(Y_AXIS); // move away from docked toolhead
444
     planner.synchronize();
424
     planner.synchronize();
445
 
425
 
446
-    // 4. Move to the new toolhead
426
+    // 3. Move to the new toolhead
447
 
427
 
448
-    if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(4) Move to new toolhead position");
428
+    if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(3) Move to new toolhead position");
449
 
429
 
450
     current_position[X_AXIS] = grabxpos;
430
     current_position[X_AXIS] = grabxpos;
451
 
431
 
460
     fast_line_to_current(Y_AXIS);
440
     fast_line_to_current(Y_AXIS);
461
     planner.synchronize();
441
     planner.synchronize();
462
 
442
 
463
-    // 5. Grab and lock the new toolhead
443
+    // 4. Grab and lock the new toolhead
464
 
444
 
465
-    if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(5) Grab and lock new toolhead ");
445
+    if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(4) Grab and lock new toolhead ");
466
 
446
 
467
     current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS;
447
     current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS;
468
 
448
 
497
                 grabxpos = toolheadposx[tmp_extruder];
477
                 grabxpos = toolheadposx[tmp_extruder];
498
 
478
 
499
     /**
479
     /**
500
-     * 1. Raise Z to give enough clearance
501
-     * 2. Move to switch position of current toolhead
502
-     * 3. Release and place toolhead in the dock
503
-     * 4. Move to the new toolhead
504
-     * 5. Grab the new toolhead and move to security position
480
+     * 1. Move to switch position of current toolhead
481
+     * 2. Release and place toolhead in the dock
482
+     * 3. Move to the new toolhead
483
+     * 4. Grab the new toolhead and move to security position
505
      */
484
      */
506
 
485
 
507
     if (DEBUGGING(LEVELING)) DEBUG_POS("Starting Toolhead change", current_position);
486
     if (DEBUGGING(LEVELING)) DEBUG_POS("Starting Toolhead change", current_position);
508
 
487
 
509
-    // 1. Raise Z to give enough clearance
510
-
511
-    current_position[Z_AXIS] += toolchange_settings.z_raise;
512
-
513
-    if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position);
514
-
515
-    planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder);
516
-    planner.synchronize();
517
-
518
-    // 2. Move to switch position current toolhead
488
+    // 1. Move to switch position current toolhead
519
 
489
 
520
     current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR;
490
     current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR;
521
 
491
 
522
     if (DEBUGGING(LEVELING)) {
492
     if (DEBUGGING(LEVELING)) {
523
-      SERIAL_ECHOLNPAIR("(2) Place old tool ", int(active_extruder));
493
+      SERIAL_ECHOLNPAIR("(1) Place old tool ", int(active_extruder));
524
       DEBUG_POS("Move Y SwitchPos + Security", current_position);
494
       DEBUG_POS("Move Y SwitchPos + Security", current_position);
525
     }
495
     }
526
 
496
 
548
     planner.buffer_line(current_position, (planner.settings.max_feedrate_mm_s[X_AXIS] * 0.25), active_extruder);
518
     planner.buffer_line(current_position, (planner.settings.max_feedrate_mm_s[X_AXIS] * 0.25), active_extruder);
549
     planner.synchronize();
519
     planner.synchronize();
550
 
520
 
551
-    // 3. Release and place toolhead in the dock
521
+    // 2. Release and place toolhead in the dock
552
 
522
 
553
-    if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(3) Release and Place Toolhead");
523
+    if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(2) Release and Place Toolhead");
554
 
524
 
555
     current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE;
525
     current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE;
556
 
526
 
566
     planner.buffer_line(current_position, (planner.settings.max_feedrate_mm_s[Y_AXIS]), active_extruder);
536
     planner.buffer_line(current_position, (planner.settings.max_feedrate_mm_s[Y_AXIS]), active_extruder);
567
     planner.synchronize();
537
     planner.synchronize();
568
 
538
 
569
-    // 4. Move to new toolhead position
539
+    // 3. Move to new toolhead position
570
 
540
 
571
-    if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(4) Move to new toolhead position");
541
+    if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(3) Move to new toolhead position");
572
 
542
 
573
     current_position[X_AXIS] = grabxpos;
543
     current_position[X_AXIS] = grabxpos;
574
 
544
 
577
     planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], active_extruder);
547
     planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], active_extruder);
578
     planner.synchronize();
548
     planner.synchronize();
579
 
549
 
580
-    // 5. Grab the new toolhead and move to security position
550
+    // 4. Grab the new toolhead and move to security position
581
 
551
 
582
-    if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(5) Grab new toolhead and move to security position");
552
+    if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(4) Grab new toolhead and move to security position");
583
 
553
 
584
     current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE;
554
     current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE;
585
 
555
 
732
     if (tmp_extruder >= EXTRUDERS)
702
     if (tmp_extruder >= EXTRUDERS)
733
       return invalid_extruder_error(tmp_extruder);
703
       return invalid_extruder_error(tmp_extruder);
734
 
704
 
735
-    if (!no_move && !all_axes_homed()) {
705
+    if (!no_move && (!all_axes_homed()
706
+      #if ENABLED(DUAL_X_CARRIAGE)
707
+        || dual_x_carriage_mode == DXC_FULL_CONTROL_MODE
708
+      #endif
709
+    )) {
736
       no_move = true;
710
       no_move = true;
737
       if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("No move on toolchange");
711
       if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("No move on toolchange");
738
     }
712
     }
785
       if (!no_move) {
759
       if (!no_move) {
786
         #if DISABLED(SWITCHING_NOZZLE)
760
         #if DISABLED(SWITCHING_NOZZLE)
787
           // Do a small lift to avoid the workpiece in the move back (below)
761
           // Do a small lift to avoid the workpiece in the move back (below)
788
-          #if ENABLED(TOOLCHANGE_PARK)
789
-            current_position[X_AXIS] = toolchange_settings.change_point.x;
790
-            current_position[Y_AXIS] = toolchange_settings.change_point.y;
791
-          #endif
792
           current_position[Z_AXIS] += toolchange_settings.z_raise;
762
           current_position[Z_AXIS] += toolchange_settings.z_raise;
793
           #if HAS_SOFTWARE_ENDSTOPS
763
           #if HAS_SOFTWARE_ENDSTOPS
794
             NOMORE(current_position[Z_AXIS], soft_endstop[Z_AXIS].max);
764
             NOMORE(current_position[Z_AXIS], soft_endstop[Z_AXIS].max);
795
           #endif
765
           #endif
766
+          fast_line_to_current(Z_AXIS);
767
+          #if ENABLED(TOOLCHANGE_PARK)
768
+            current_position[X_AXIS] = toolchange_settings.change_point.x;
769
+            current_position[Y_AXIS] = toolchange_settings.change_point.y;
770
+          #endif
796
           planner.buffer_line(current_position, feedrate_mm_s, active_extruder);
771
           planner.buffer_line(current_position, feedrate_mm_s, active_extruder);
797
         #endif
772
         #endif
798
         planner.synchronize();
773
         planner.synchronize();
875
         #if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
850
         #if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
876
           if (should_swap && !too_cold) {
851
           if (should_swap && !too_cold) {
877
             #if ENABLED(ADVANCED_PAUSE_FEATURE)
852
             #if ENABLED(ADVANCED_PAUSE_FEATURE)
878
-              do_pause_e_move(toolchange_settings.swap_length + TOOLCHANGE_FIL_EXTRA_PRIME, toolchange_settings.prime_speed);
853
+              do_pause_e_move(toolchange_settings.swap_length + TOOLCHANGE_FIL_EXTRA_PRIME, MMM_TO_MMS(toolchange_settings.prime_speed));
879
             #else
854
             #else
880
               current_position[E_AXIS] += (toolchange_settings.swap_length + TOOLCHANGE_FIL_EXTRA_PRIME) / planner.e_factor[tmp_extruder];
855
               current_position[E_AXIS] += (toolchange_settings.swap_length + TOOLCHANGE_FIL_EXTRA_PRIME) / planner.e_factor[tmp_extruder];
881
-              planner.buffer_line(current_position, toolchange_settings.prime_speed, tmp_extruder);
856
+              planner.buffer_line(current_position, MMM_TO_MMS(toolchange_settings.prime_speed), tmp_extruder);
882
             #endif
857
             #endif
883
             planner.synchronize();
858
             planner.synchronize();
884
 
859
 

+ 55
- 13
Marlin/src/pins/pins_BIGTREE_SKR_V1.3.h 查看文件

190
     #define LCD_PINS_D4     P1_21
190
     #define LCD_PINS_D4     P1_21
191
 
191
 
192
   #else
192
   #else
193
-
194
     #define LCD_PINS_RS     P1_19
193
     #define LCD_PINS_RS     P1_19
195
 
194
 
196
     #define BTN_EN1         P3_26   // (31) J3-2 & AUX-4
195
     #define BTN_EN1         P3_26   // (31) J3-2 & AUX-4
197
     #define BTN_EN2         P3_25   // (33) J3-4 & AUX-4
196
     #define BTN_EN2         P3_25   // (33) J3-4 & AUX-4
198
-    #define SD_DETECT_PIN   P1_31   // (49) (NOT 5V tolerant)
199
-
200
-    #define LCD_SDSS        P0_16   // (16) J3-7 & AUX-4
201
 
197
 
202
     #define LCD_PINS_ENABLE P1_18
198
     #define LCD_PINS_ENABLE P1_18
203
     #define LCD_PINS_D4     P1_20
199
     #define LCD_PINS_D4     P1_20
204
 
200
 
205
-    #if ENABLED(ULTIPANEL)
206
-      #define LCD_PINS_D5   P1_21
207
-      #define LCD_PINS_D6   P1_22
208
-      #define LCD_PINS_D7   P1_23
209
-    #endif
201
+    #define LCD_SDSS        P0_16   // (16) J3-7 & AUX-4
202
+    #define SD_DETECT_PIN   P1_31   // (49) (NOT 5V tolerant)
210
 
203
 
211
-    #if ENABLED(MKS_MINI_12864)
212
-      #define DOGLCD_CS     P1_21
213
-      #define DOGLCD_A0     P1_22
214
-    #endif
204
+    #if ENABLED(FYSETC_MINI_12864)
205
+      #define DOGLCD_CS     P1_18
206
+      #define DOGLCD_A0     P1_19
207
+
208
+      #define LCD_BACKLIGHT_PIN -1
209
+
210
+      #define LCD_RESET_PIN P1_20   // Must be high or open for LCD to operate normally.
211
+                                    // Seems to work best if left open.
212
+
213
+      #define FYSETC_MINI_12864_REV_1_2
214
+      //#define FYSETC_MINI_12864_REV_2_0
215
+      //#define FYSETC_MINI_12864_REV_2_1
216
+      #if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
217
+        #define RGB_LED
218
+        #ifndef RGB_LED_R_PIN
219
+          #define RGB_LED_R_PIN P1_21
220
+        #endif
221
+        #ifndef RGB_LED_G_PIN
222
+          #define RGB_LED_G_PIN P1_22
223
+        #endif
224
+        #ifndef RGB_LED_B_PIN
225
+          #define RGB_LED_B_PIN P1_23
226
+        #endif
227
+      #elif defined(FYSETC_MINI_12864_REV_2_1)
228
+        #define NEOPIXEL_LED
229
+        #define NEOPIXEL_TYPE   NEO_GRB  // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
230
+        #define NEOPIXEL_PIN    P1_21    // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
231
+        #define NEOPIXEL_PIXELS  3       // Number of LEDs in the strip
232
+        #define NEOPIXEL_IS_SEQUENTIAL   // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
233
+        #define NEOPIXEL_BRIGHTNESS 127  // Initial brightness (0-255)
234
+        #define NEOPIXEL_STARTUP_TEST    // Cycle through colors at startup
235
+      #else
236
+        #error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
237
+      #endif
238
+
239
+      #if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
240
+        #error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
241
+      #endif
242
+
243
+    #else // !FYSETC_MINI_12864
244
+
245
+      #if ENABLED(MKS_MINI_12864)
246
+        #define DOGLCD_CS     P1_21
247
+        #define DOGLCD_A0     P1_22
248
+      #endif
249
+
250
+      #if ENABLED(ULTIPANEL)
251
+        #define LCD_PINS_D5   P1_21
252
+        #define LCD_PINS_D6   P1_22
253
+        #define LCD_PINS_D7   P1_23
254
+      #endif
255
+
256
+    #endif // !FYSETC_MINI_12864
215
 
257
 
216
   #endif
258
   #endif
217
 
259
 

+ 3
- 0
Marlin/src/pins/pins_ESP32.h 查看文件

72
 #define HEATER_0_PIN         2
72
 #define HEATER_0_PIN         2
73
 #define FAN_PIN             13
73
 #define FAN_PIN             13
74
 #define HEATER_BED_PIN       4
74
 #define HEATER_BED_PIN       4
75
+
76
+// SPI
77
+#define SDSS                 5

+ 6
- 6
Marlin/src/pins/pins_FORMBOT_RAPTOR.h 查看文件

181
 // Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER
181
 // Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER
182
 //
182
 //
183
 #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
183
 #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
184
-  #define LCD_PINS_RS      16
185
-  #define LCD_PINS_ENABLE  17
186
-  #define LCD_PINS_D4      23
187
-  #define LCD_PINS_D5      25
188
-  #define LCD_PINS_D6      27
189
-  #define LCD_PINS_D7      29
190
   #define BEEPER_PIN       37
184
   #define BEEPER_PIN       37
191
   #define BTN_EN1          31
185
   #define BTN_EN1          31
192
   #define BTN_EN2          33
186
   #define BTN_EN2          33
193
   #define BTN_ENC          35
187
   #define BTN_ENC          35
194
   #define SD_DETECT_PIN    49
188
   #define SD_DETECT_PIN    49
195
   #define KILL_PIN         41
189
   #define KILL_PIN         41
190
+  #define LCD_PINS_RS      16
191
+  #define LCD_PINS_ENABLE  17
192
+  #define LCD_PINS_D4      23
193
+  #define LCD_PINS_D5      25
194
+  #define LCD_PINS_D6      27
195
+  #define LCD_PINS_D7      29
196
 #endif
196
 #endif

+ 13
- 10
Marlin/src/pins/pins_FORMBOT_TREX2PLUS.h 查看文件

155
 //
155
 //
156
 // Misc. Functions
156
 // Misc. Functions
157
 //
157
 //
158
-#define CASE_LIGHT_PIN      8
159
 #define SDSS               53
158
 #define SDSS               53
160
-#ifndef ROXYs_TRex
159
+#ifndef LED_PIN
161
   #define LED_PIN          13   // The Formbot v 1 board has almost no unassigned pins on it.  The Board's LED
160
   #define LED_PIN          13   // The Formbot v 1 board has almost no unassigned pins on it.  The Board's LED
162
 #endif                          // is a good place to get a signal to control the Max7219 LED Matrix.
161
 #endif                          // is a good place to get a signal to control the Max7219 LED Matrix.
163
 
162
 
168
   #define PS_ON_PIN        12
167
   #define PS_ON_PIN        12
169
 #endif
168
 #endif
170
 
169
 
170
+#define CASE_LIGHT_PIN      8
171
+
171
 //
172
 //
172
 // LCD / Controller
173
 // LCD / Controller
173
 //
174
 //
174
 // Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER
175
 // Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER
175
 //
176
 //
176
 #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
177
 #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
177
-  #define LCD_PINS_RS      16
178
-  #define LCD_PINS_ENABLE  17
179
-  #define LCD_PINS_D4      23
180
-  #define LCD_PINS_D5      25
181
-  #define LCD_PINS_D6      27
182
-  #define LCD_PINS_D7      29
178
+  #ifndef BEEPER_PIN
179
+    #define BEEPER_PIN     37
180
+  #endif
183
   #define BTN_EN1          31
181
   #define BTN_EN1          31
184
   #define BTN_EN2          33
182
   #define BTN_EN2          33
185
   #define BTN_ENC          35
183
   #define BTN_ENC          35
186
   #define SD_DETECT_PIN    49
184
   #define SD_DETECT_PIN    49
187
-  #ifndef ROXYs_TRex
185
+  #ifndef KILL_PIN
188
     #define KILL_PIN       41
186
     #define KILL_PIN       41
189
-    #define BEEPER_PIN     37
190
   #endif
187
   #endif
188
+  #define LCD_PINS_RS      16
189
+  #define LCD_PINS_ENABLE  17
190
+  #define LCD_PINS_D4      23
191
+  #define LCD_PINS_D5      25
192
+  #define LCD_PINS_D6      27
193
+  #define LCD_PINS_D7      29
191
 #endif
194
 #endif

+ 4
- 2
Marlin/src/pins/pins_FORMBOT_TREX3.h 查看文件

139
 //
139
 //
140
 #define CASE_LIGHT_PIN      5
140
 #define CASE_LIGHT_PIN      5
141
 #define SDSS               53
141
 #define SDSS               53
142
-#ifndef ROXYs_TRex
142
+#ifndef LED_PIN
143
   #define LED_PIN          13
143
   #define LED_PIN          13
144
 #endif
144
 #endif
145
 
145
 
165
   #define BTN_EN2          33
165
   #define BTN_EN2          33
166
   #define BTN_ENC          35
166
   #define BTN_ENC          35
167
   #define SD_DETECT_PIN    49
167
   #define SD_DETECT_PIN    49
168
-  #ifndef ROXYs_TRex
168
+  #ifndef KILL_PIN
169
     #define KILL_PIN       41
169
     #define KILL_PIN       41
170
+  #endif
171
+  #ifndef BEEPER_PIN
170
     #define BEEPER_PIN     37
172
     #define BEEPER_PIN     37
171
   #endif
173
   #endif
172
 #endif
174
 #endif

+ 40
- 28
Marlin/src/pins/pins_FYSETC_F6_13.h 查看文件

28
   #error "Oops! Select 'FYSETC F6' in 'Tools > Board.'"
28
   #error "Oops! Select 'FYSETC F6' in 'Tools > Board.'"
29
 #endif
29
 #endif
30
 
30
 
31
-#ifdef SD_DETECT_INVERTED
32
-  #error "SD_DETECT_INVERTED must be disabled for the FYSETC_F6_13 board."
31
+#if ENABLED(SD_DETECT_INVERTED)
32
+  //#error "SD_DETECT_INVERTED must be disabled for the FYSETC_F6_13 board."
33
 #endif
33
 #endif
34
 
34
 
35
 #define BOARD_NAME "FYSETC F6 1.3"
35
 #define BOARD_NAME "FYSETC F6 1.3"
184
 #define BEEPER_PIN         37
184
 #define BEEPER_PIN         37
185
 #define SD_DETECT_PIN      49
185
 #define SD_DETECT_PIN      49
186
 
186
 
187
-#if ENABLED(MKS_MINI_12864)
188
-  #define DOGLCD_A0        27
189
-  #define DOGLCD_CS        25
190
-#endif
191
-
192
 #if ENABLED(FYSETC_MINI_12864)
187
 #if ENABLED(FYSETC_MINI_12864)
193
   //
188
   //
194
   // See https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8
189
   // See https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8
195
   //
190
   //
196
   #define DOGLCD_A0        16
191
   #define DOGLCD_A0        16
197
   #define DOGLCD_CS        17
192
   #define DOGLCD_CS        17
198
-  #ifndef RGB_LED_R_PIN
199
-    #define RGB_LED_R_PIN  25
200
-  #endif
201
-  #ifndef RGB_LED_G_PIN
202
-    #define RGB_LED_G_PIN  27
193
+
194
+  #define LCD_BACKLIGHT_PIN -1
195
+  #define KILL_PIN         41
196
+
197
+  #define LCD_RESET_PIN    23   // Must be high or open for LCD to operate normally.
198
+                                // Seems to work best if left open.
199
+
200
+  #define FYSETC_MINI_12864_REV_1_2
201
+  //#define FYSETC_MINI_12864_REV_2_0
202
+  //#define FYSETC_MINI_12864_REV_2_1
203
+  #if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
204
+    #ifndef RGB_LED_R_PIN
205
+      #define RGB_LED_R_PIN 25
206
+    #endif
207
+    #ifndef RGB_LED_G_PIN
208
+      #define RGB_LED_G_PIN 27
209
+    #endif
210
+    #ifndef RGB_LED_B_PIN
211
+      #define RGB_LED_B_PIN 29
212
+    #endif
213
+  #elif defined(FYSETC_MINI_12864_REV_2_1)
214
+    #define NEOPIXEL_LED
215
+    #define NEOPIXEL_TYPE   NEO_GRB  // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
216
+    #define NEOPIXEL_PIN    25       // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
217
+    #define NEOPIXEL_PIXELS  3       // Number of LEDs in the strip
218
+    #define NEOPIXEL_IS_SEQUENTIAL   // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
219
+    #define NEOPIXEL_BRIGHTNESS 127  // Initial brightness (0-255)
220
+    #define NEOPIXEL_STARTUP_TEST    // Cycle through colors at startup
221
+  #else
222
+    #error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
203
   #endif
223
   #endif
204
-  #ifndef RGB_LED_B_PIN
205
-    #define RGB_LED_B_PIN  29
224
+
225
+  #if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
226
+    #error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
206
   #endif
227
   #endif
207
 
228
 
208
 #elif HAS_GRAPHICAL_LCD
229
 #elif HAS_GRAPHICAL_LCD
214
   #define LCD_PINS_D6      27
235
   #define LCD_PINS_D6      27
215
   #define LCD_PINS_D7      29
236
   #define LCD_PINS_D7      29
216
 
237
 
238
+  #if ENABLED(MKS_MINI_12864)
239
+    #define DOGLCD_CS      25
240
+    #define DOGLCD_A0      27
241
+  #endif
242
+
217
 #endif
243
 #endif
218
 
244
 
219
 #if ENABLED(NEWPANEL)
245
 #if ENABLED(NEWPANEL)
222
   #define BTN_ENC          35
248
   #define BTN_ENC          35
223
 #endif
249
 #endif
224
 
250
 
225
-#if ENABLED(FYSETC_MINI_12864)
226
-  #define LCD_BACKLIGHT_PIN -1
227
-  #define LCD_RESET_PIN    23
228
-  #define KILL_PIN         41
229
-  #ifndef RGB_LED_R_PIN
230
-    #define RGB_LED_R_PIN  25
231
-  #endif
232
-  #ifndef RGB_LED_G_PIN
233
-    #define RGB_LED_G_PIN  27
234
-  #endif
235
-  #ifndef RGB_LED_B_PIN
236
-    #define RGB_LED_B_PIN  29
237
-  #endif
238
-#endif
239
 #ifndef RGB_LED_R_PIN
251
 #ifndef RGB_LED_R_PIN
240
   #define RGB_LED_R_PIN     3
252
   #define RGB_LED_R_PIN     3
241
 #endif
253
 #endif

+ 1
- 1
Marlin/src/pins/pins_GEN7_13.h 查看文件

24
  * Gen7 v1.3 pin assignments
24
  * Gen7 v1.3 pin assignments
25
  */
25
  */
26
 
26
 
27
- /**
27
+/**
28
  * Rev B    26 DEC 2016
28
  * Rev B    26 DEC 2016
29
  *
29
  *
30
  * added pointer to a current Arduino IDE extension
30
  * added pointer to a current Arduino IDE extension

+ 32
- 9
Marlin/src/pins/pins_RAMPS.h 查看文件

436
       #endif
436
       #endif
437
 
437
 
438
       #define BTN_ENC           35
438
       #define BTN_ENC           35
439
-      #define SD_DETECT_PIN     49
439
+      #ifndef SD_DETECT_PIN
440
+        #define SD_DETECT_PIN   49
441
+      #endif
440
       #define KILL_PIN          41
442
       #define KILL_PIN          41
441
 
443
 
442
       #if ENABLED(BQ_LCD_SMART_CONTROLLER)
444
       #if ENABLED(BQ_LCD_SMART_CONTROLLER)
526
 
528
 
527
       // From https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8
529
       // From https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8
528
       #define BEEPER_PIN        37
530
       #define BEEPER_PIN        37
529
-      #define LCD_RESET_PIN     23
530
 
531
 
531
       #define DOGLCD_A0         16
532
       #define DOGLCD_A0         16
532
       #define DOGLCD_CS         17
533
       #define DOGLCD_CS         17
537
 
538
 
538
       #define SD_DETECT_PIN     49
539
       #define SD_DETECT_PIN     49
539
 
540
 
540
-      #ifndef RGB_LED_R_PIN
541
-        #define RGB_LED_R_PIN   25
542
-      #endif
543
-      #ifndef RGB_LED_G_PIN
544
-        #define RGB_LED_G_PIN   27
541
+      #define LCD_RESET_PIN     23   // Must be high or open for LCD to operate normally.
542
+                                     // Seems to work best if left open.
543
+
544
+      #define FYSETC_MINI_12864_REV_1_2
545
+      //#define FYSETC_MINI_12864_REV_2_0
546
+      //#define FYSETC_MINI_12864_REV_2_1
547
+      #if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
548
+        #ifndef RGB_LED_R_PIN
549
+          #define RGB_LED_R_PIN 25
550
+        #endif
551
+        #ifndef RGB_LED_G_PIN
552
+          #define RGB_LED_G_PIN 27
553
+        #endif
554
+        #ifndef RGB_LED_B_PIN
555
+          #define RGB_LED_B_PIN 29
556
+        #endif
557
+      #elif defined(FYSETC_MINI_12864_REV_2_1)
558
+        #define NEOPIXEL_LED
559
+        #define NEOPIXEL_TYPE   NEO_GRB  // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
560
+        #define NEOPIXEL_PIN    25       // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
561
+        #define NEOPIXEL_PIXELS  3       // Number of LEDs in the strip
562
+        #define NEOPIXEL_IS_SEQUENTIAL   // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
563
+        #define NEOPIXEL_BRIGHTNESS 127  // Initial brightness (0-255)
564
+        #define NEOPIXEL_STARTUP_TEST    // Cycle through colors at startup
565
+      #else
566
+        #error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
545
       #endif
567
       #endif
546
-      #ifndef RGB_LED_B_PIN
547
-        #define RGB_LED_B_PIN   29
568
+
569
+      #if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
570
+        #error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
548
       #endif
571
       #endif
549
 
572
 
550
     #elif ENABLED(MINIPANEL)
573
     #elif ENABLED(MINIPANEL)

+ 59
- 22
Marlin/src/pins/pins_RAMPS_FD_V1.h 查看文件

150
   #if ENABLED(NEWPANEL)
150
   #if ENABLED(NEWPANEL)
151
     #define LCD_PINS_RS    16
151
     #define LCD_PINS_RS    16
152
     #define LCD_PINS_ENABLE 17
152
     #define LCD_PINS_ENABLE 17
153
-    #define LCD_PINS_D4    23
154
-    #define LCD_PINS_D5    25
155
-    #define LCD_PINS_D6    27
156
-    #define LCD_PINS_D7    29
157
   #endif
153
   #endif
158
 
154
 
159
   #if ENABLED(FYSETC_MINI_12864)
155
   #if ENABLED(FYSETC_MINI_12864)
160
     #define DOGLCD_CS      LCD_PINS_ENABLE
156
     #define DOGLCD_CS      LCD_PINS_ENABLE
161
     #define DOGLCD_A0      LCD_PINS_RS
157
     #define DOGLCD_A0      LCD_PINS_RS
162
-  #elif ENABLED(MINIPANEL)
163
-    #define DOGLCD_CS      25
164
-    #define DOGLCD_A0      27
158
+
159
+    //#define FORCE_SOFT_SPI    // Use this if default of hardware SPI causes problems
160
+
161
+    #define LCD_RESET_PIN  23   // Must be high or open for LCD to operate normally.
162
+                                // Seems to work best if left open.
163
+
164
+    #define FYSETC_MINI_12864_REV_1_2
165
+    //#define FYSETC_MINI_12864_REV_2_0
166
+    //#define FYSETC_MINI_12864_REV_2_1
167
+    #if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
168
+      #ifndef RGB_LED_R_PIN
169
+        #define RGB_LED_R_PIN 25
170
+      #endif
171
+      #ifndef RGB_LED_G_PIN
172
+        #define RGB_LED_G_PIN 27
173
+      #endif
174
+      #ifndef RGB_LED_B_PIN
175
+        #define RGB_LED_B_PIN 29
176
+      #endif
177
+    #elif defined(FYSETC_MINI_12864_REV_2_1)
178
+      #define NEOPIXEL_LED
179
+      #define NEOPIXEL_TYPE NEO_GRB    // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
180
+      #define NEOPIXEL_PIN    25       // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
181
+      #define NEOPIXEL_PIXELS  3       // Number of LEDs in the strip
182
+      #define NEOPIXEL_IS_SEQUENTIAL   // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
183
+      #define NEOPIXEL_BRIGHTNESS 127  // Initial brightness (0-255)
184
+      #define NEOPIXEL_STARTUP_TEST    // Cycle through colors at startup
185
+    #else
186
+      #error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
187
+    #endif
188
+
189
+    #if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
190
+      #error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
191
+    #endif
192
+
193
+  #elif ENABLED(NEWPANEL)
194
+
195
+    #define LCD_PINS_D4    23
196
+    #define LCD_PINS_D5    25
197
+    #define LCD_PINS_D6    27
198
+    #define LCD_PINS_D7    29
199
+
200
+    #if ENABLED(MINIPANEL)
201
+      #define DOGLCD_CS    25
202
+      #define DOGLCD_A0    27
203
+    #endif
204
+
165
   #endif
205
   #endif
166
 
206
 
167
   #if ANY(VIKI2, miniVIKI)
207
   #if ANY(VIKI2, miniVIKI)
168
-    #define DOGLCD_A0           16
169
-    #define KILL_PIN            51
170
-    #define STAT_LED_BLUE_PIN   29
171
-    #define STAT_LED_RED_PIN    23
172
-    #define DOGLCD_CS           17
173
-    #define DOGLCD_SCK          76   // SCK_PIN   - These are required for DUE Hardware SPI
174
-    #define DOGLCD_MOSI         75   // MOSI_PIN
175
-    #define DOGLCD_MISO         74   // MISO_PIN
208
+    #define DOGLCD_A0      16
209
+    #define KILL_PIN       51
210
+    #define STAT_LED_BLUE_PIN 29
211
+    #define STAT_LED_RED_PIN 23
212
+    #define DOGLCD_CS      17
213
+    #define DOGLCD_SCK     76   // SCK_PIN   - Required for DUE Hardware SPI
214
+    #define DOGLCD_MOSI    75   // MOSI_PIN
215
+    #define DOGLCD_MISO    74   // MISO_PIN
176
   #endif
216
   #endif
177
 
217
 
178
-
179
 #endif // ULTRA_LCD
218
 #endif // ULTRA_LCD
180
 
219
 
181
 #if HAS_DRIVER(TMC2208)
220
 #if HAS_DRIVER(TMC2208)
201
 //
240
 //
202
 // M3/M4/M5 - Spindle/Laser Control
241
 // M3/M4/M5 - Spindle/Laser Control
203
 //
242
 //
204
-#if ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENA)
205
-  #if HOTENDS < 3
206
-    #define SPINDLE_LASER_ENA_PIN     45   // Use E2 ENA
207
-    #define SPINDLE_LASER_PWM_PIN     12   // MUST BE HARDWARE PWM
208
-    #define SPINDLE_DIR_PIN           47   // Use E2 DIR
209
-  #endif
243
+#if HOTENDS < 3 && ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENA)
244
+  #define SPINDLE_LASER_ENA_PIN 45   // Use E2 ENA
245
+  #define SPINDLE_LASER_PWM_PIN 12   // MUST BE HARDWARE PWM
246
+  #define SPINDLE_DIR_PIN       47   // Use E2 DIR
210
 #endif
247
 #endif

+ 1
- 0
Marlin/src/pins/pins_RAMPS_RE_ARM.h 查看文件

320
       #define DOGLCD_MOSI  P0_18
320
       #define DOGLCD_MOSI  P0_18
321
       #define DOGLCD_CS    P1_09  // use Ethernet connector for EXP1 cable signals
321
       #define DOGLCD_CS    P1_09  // use Ethernet connector for EXP1 cable signals
322
       #define DOGLCD_A0    P1_14
322
       #define DOGLCD_A0    P1_14
323
+      #define FORCE_SOFT_SPI      // required on a Re-ARM system
323
     #else
324
     #else
324
       #define DOGLCD_CS    P0_26   // (63) J5-3 & AUX-2
325
       #define DOGLCD_CS    P0_26   // (63) J5-3 & AUX-2
325
       #define DOGLCD_A0    P2_06   // (59) J3-8 & AUX-2
326
       #define DOGLCD_A0    P2_06   // (59) J3-8 & AUX-2

+ 54
- 20
Marlin/src/pins/pins_RURAMPS4D_11.h 查看文件

202
 //
202
 //
203
 #if ENABLED(ULTRA_LCD)
203
 #if ENABLED(ULTRA_LCD)
204
 
204
 
205
-  #if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER)
206
-
205
+  #if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
207
     #define BEEPER_PIN      62
206
     #define BEEPER_PIN      62
208
-
209
-    #define LCD_PINS_RS     63
210
-    #define LCD_PINS_ENABLE 64
211
     #define LCD_PINS_D4     48
207
     #define LCD_PINS_D4     48
212
     #define LCD_PINS_D5     50
208
     #define LCD_PINS_D5     50
213
     #define LCD_PINS_D6     52
209
     #define LCD_PINS_D6     52
214
     #define LCD_PINS_D7     53
210
     #define LCD_PINS_D7     53
215
-
216
     #define SD_DETECT_PIN   51
211
     #define SD_DETECT_PIN   51
212
+  #endif
217
 
213
 
218
-  #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
214
+  #if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER)
219
 
215
 
220
-    #define BEEPER_PIN      62
216
+    #define LCD_PINS_RS     63
217
+    #define LCD_PINS_ENABLE 64
218
+
219
+  #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
221
 
220
 
222
     #define LCD_PINS_RS     52
221
     #define LCD_PINS_RS     52
223
     #define LCD_PINS_ENABLE 53
222
     #define LCD_PINS_ENABLE 53
224
-    #define LCD_PINS_D4     48
225
-    #define LCD_PINS_D5     50
226
-    #define LCD_PINS_D6     52
227
-    #define LCD_PINS_D7     53
228
-
229
-    #define SD_DETECT_PIN   51
230
 
223
 
231
   #elif HAS_SSD1306_OLED_I2C
224
   #elif HAS_SSD1306_OLED_I2C
232
 
225
 
234
     #define LCD_SDSS        10
227
     #define LCD_SDSS        10
235
     #define SD_DETECT_PIN   51
228
     #define SD_DETECT_PIN   51
236
 
229
 
230
+  #elif ENABLED(FYSETC_MINI_12864)
231
+
232
+    #define BEEPER_PIN      62
233
+    #define DOGLCD_CS       64
234
+    #define DOGLCD_A0       63
235
+
236
+    //#define FORCE_SOFT_SPI     // Use this if default of hardware SPI causes problems
237
+
238
+    #define LCD_RESET_PIN   48   // Must be high or open for LCD to operate normally.
239
+                                 // Seems to work best if left open.
240
+
241
+    #define FYSETC_MINI_12864_REV_1_2
242
+    //#define FYSETC_MINI_12864_REV_2_0
243
+    //#define FYSETC_MINI_12864_REV_2_1
244
+    #if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
245
+      #define RGB_LED
246
+      #ifndef RGB_LED_R_PIN
247
+        #define RGB_LED_R_PIN 50   // D5
248
+      #endif
249
+      #ifndef RGB_LED_G_PIN
250
+        #define RGB_LED_G_PIN 52   // D6
251
+      #endif
252
+      #ifndef RGB_LED_B_PIN
253
+        #define RGB_LED_B_PIN 53   // D7
254
+      #endif
255
+    #elif defined(FYSETC_MINI_12864_REV_2_1)
256
+      #define NEOPIXEL_LED
257
+      #define NEOPIXEL_TYPE   NEO_GRB  // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
258
+      #define NEOPIXEL_PIN  50         // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
259
+      #define NEOPIXEL_PIXELS  3       // Number of LEDs in the strip
260
+      #define NEOPIXEL_IS_SEQUENTIAL   // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
261
+      #define NEOPIXEL_BRIGHTNESS 127  // Initial brightness (0-255)
262
+      #define NEOPIXEL_STARTUP_TEST    // Cycle through colors at startup
263
+    #else
264
+      #error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
265
+    #endif
266
+
267
+    #if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
268
+      #error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
269
+    #endif
270
+
237
   #elif ENABLED(SPARK_FULL_GRAPHICS)
271
   #elif ENABLED(SPARK_FULL_GRAPHICS)
238
 
272
 
239
     //http://doku.radds.org/dokumentation/other-electronics/sparklcd/
273
     //http://doku.radds.org/dokumentation/other-electronics/sparklcd/
240
     #error "Oops! SPARK_FULL_GRAPHICS not supported with RURAMPS4D."
274
     #error "Oops! SPARK_FULL_GRAPHICS not supported with RURAMPS4D."
241
-    //#define LCD_PINS_D4     29//?
242
-    //#define LCD_PINS_ENABLE 27//?
243
-    //#define LCD_PINS_RS     25//?
244
-    //#define BTN_EN1         35//?
245
-    //#define BTN_EN2         33//?
246
-    //#define BTN_ENC         37//?
275
+    //#define LCD_PINS_D4     29   //?
276
+    //#define LCD_PINS_ENABLE 27   //?
277
+    //#define LCD_PINS_RS     25   //?
278
+    //#define BTN_EN1         35   //?
279
+    //#define BTN_EN2         33   //?
280
+    //#define BTN_ENC         37   //?
247
 
281
 
248
   #endif // SPARK_FULL_GRAPHICS
282
   #endif // SPARK_FULL_GRAPHICS
249
 
283
 

+ 48
- 14
Marlin/src/pins/pins_RURAMPS4D_13.h 查看文件

188
 //
188
 //
189
 #if ENABLED(ULTRA_LCD)
189
 #if ENABLED(ULTRA_LCD)
190
 
190
 
191
-  #if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER)
192
-
191
+  #if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
193
     #define BEEPER_PIN      62
192
     #define BEEPER_PIN      62
194
-
195
-    #define LCD_PINS_RS     63
196
-    #define LCD_PINS_ENABLE 64
197
     #define LCD_PINS_D4     48
193
     #define LCD_PINS_D4     48
198
     #define LCD_PINS_D5     50
194
     #define LCD_PINS_D5     50
199
     #define LCD_PINS_D6     52
195
     #define LCD_PINS_D6     52
200
     #define LCD_PINS_D7     53
196
     #define LCD_PINS_D7     53
201
-
202
     #define SD_DETECT_PIN   51
197
     #define SD_DETECT_PIN   51
198
+  #endif
203
 
199
 
204
-  #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
200
+  #if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER)
205
 
201
 
206
-    #define BEEPER_PIN      62
202
+    #define LCD_PINS_RS     63
203
+    #define LCD_PINS_ENABLE 64
204
+
205
+  #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
207
 
206
 
208
     #define LCD_PINS_RS     52
207
     #define LCD_PINS_RS     52
209
     #define LCD_PINS_ENABLE 53
208
     #define LCD_PINS_ENABLE 53
210
-    #define LCD_PINS_D4     48
211
-    #define LCD_PINS_D5     50
212
-    #define LCD_PINS_D6     52
213
-    #define LCD_PINS_D7     53
214
-
215
-    #define SD_DETECT_PIN   51
216
 
209
 
217
   #elif HAS_SSD1306_OLED_I2C
210
   #elif HAS_SSD1306_OLED_I2C
218
 
211
 
220
     #define LCD_SDSS        10
213
     #define LCD_SDSS        10
221
     #define SD_DETECT_PIN   51
214
     #define SD_DETECT_PIN   51
222
 
215
 
216
+  #elif ENABLED(FYSETC_MINI_12864)
217
+
218
+    #define BEEPER_PIN      62
219
+    #define DOGLCD_CS       64
220
+    #define DOGLCD_A0       63
221
+
222
+    //#define FORCE_SOFT_SPI     // Use this if default of hardware SPI causes problems
223
+
224
+    #define LCD_RESET_PIN   48   // Must be high or open for LCD to operate normally.
225
+                                 // Seems to work best if left open.
226
+
227
+    #define FYSETC_MINI_12864_REV_1_2
228
+    //#define FYSETC_MINI_12864_REV_2_0
229
+    //#define FYSETC_MINI_12864_REV_2_1
230
+    #if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
231
+      #define RGB_LED
232
+      #ifndef RGB_LED_R_PIN
233
+        #define RGB_LED_R_PIN 50   // D5
234
+      #endif
235
+      #ifndef RGB_LED_G_PIN
236
+        #define RGB_LED_G_PIN 52   // D6
237
+      #endif
238
+      #ifndef RGB_LED_B_PIN
239
+        #define RGB_LED_B_PIN 53   // D7
240
+      #endif
241
+    #elif defined(FYSETC_MINI_12864_REV_2_1)
242
+      #define NEOPIXEL_LED
243
+      #define NEOPIXEL_TYPE   NEO_GRB  // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
244
+      #define NEOPIXEL_PIN  50         // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
245
+      #define NEOPIXEL_PIXELS  3       // Number of LEDs in the strip
246
+      #define NEOPIXEL_IS_SEQUENTIAL   // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
247
+      #define NEOPIXEL_BRIGHTNESS 127  // Initial brightness (0-255)
248
+      #define NEOPIXEL_STARTUP_TEST    // Cycle through colors at startup
249
+    #else
250
+      #error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
251
+    #endif
252
+
253
+    #if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
254
+      #error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
255
+    #endif
256
+
223
   #elif ENABLED(MKS_MINI_12864)
257
   #elif ENABLED(MKS_MINI_12864)
224
 
258
 
225
     #define ORIG_BEEPER_PIN 62
259
     #define ORIG_BEEPER_PIN 62

+ 5
- 3
README.md 查看文件

1
 # Marlin 3D Printer Firmware
1
 # Marlin 3D Printer Firmware
2
 
2
 
3
-[![Build Status](https://travis-ci.org/MarlinFirmware/Marlin.svg?branch=RCBugFix)](https://travis-ci.org/MarlinFirmware/Marlin)
4
-[![Coverity Scan Build Status](https://scan.coverity.com/projects/2224/badge.svg)](https://scan.coverity.com/projects/2224)
3
+[![Build Status](https://travis-ci.org/MarlinFirmware/Marlin.svg?branch=bugfix-2.0.x)](https://travis-ci.org/MarlinFirmware/Marlin)
4
+![GitHub](https://img.shields.io/github/license/marlinfirmware/marlin.svg)
5
+![GitHub contributors](https://img.shields.io/github/contributors/marlinfirmware/marlin.svg)
6
+![GitHub Release Date](https://img.shields.io/github/release-date/marlinfirmware/marlin.svg)
5
 
7
 
6
 <img align="top" width=175 src="buildroot/share/pixmaps/logo/marlin-250.png" />
8
 <img align="top" width=175 src="buildroot/share/pixmaps/logo/marlin-250.png" />
7
 
9
 
65
  - Roxanne Neufeld [[@Roxy-3D](https://github.com/Roxy-3D)] - USA
67
  - Roxanne Neufeld [[@Roxy-3D](https://github.com/Roxy-3D)] - USA
66
  - Bob Kuhn [[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)] - USA
68
  - Bob Kuhn [[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)] - USA
67
  - Chris Pepper [[@p3p](https://github.com/p3p)] - UK
69
  - Chris Pepper [[@p3p](https://github.com/p3p)] - UK
68
- - João Brazio [[@jbrazio](https://github.com/jbrazio)] - Brazil
70
+ - João Brazio [[@jbrazio](https://github.com/jbrazio)] - Portugal
69
  - Erik van der Zalm [[@ErikZalm](https://github.com/ErikZalm)] - Netherlands &nbsp; [![Flattr Erik](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=ErikZalm&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software)
71
  - Erik van der Zalm [[@ErikZalm](https://github.com/ErikZalm)] - Netherlands &nbsp; [![Flattr Erik](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=ErikZalm&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software)
70
 
72
 
71
 ## License
73
 ## License

+ 1
- 0
config/default/Configuration.h 查看文件

2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2014
 // However, control resolution will be halved for each increment;
2014
 // However, control resolution will be halved for each increment;
2015
 // at zero value, there are 128 effective control positions.
2015
 // at zero value, there are 128 effective control positions.
2016
+// :[0,1,2,3,4,5,6,7]
2016
 #define SOFT_PWM_SCALE 0
2017
 #define SOFT_PWM_SCALE 0
2017
 
2018
 
2018
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2019
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/3DFabXYZ/Migbot/Configuration.h 查看文件

2044
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2044
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2045
 // However, control resolution will be halved for each increment;
2045
 // However, control resolution will be halved for each increment;
2046
 // at zero value, there are 128 effective control positions.
2046
 // at zero value, there are 128 effective control positions.
2047
+// :[0,1,2,3,4,5,6,7]
2047
 #define SOFT_PWM_SCALE 0
2048
 #define SOFT_PWM_SCALE 0
2048
 
2049
 
2049
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2050
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/AlephObjects/TAZ4/Configuration.h 查看文件

2033
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2033
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2034
 // However, control resolution will be halved for each increment;
2034
 // However, control resolution will be halved for each increment;
2035
 // at zero value, there are 128 effective control positions.
2035
 // at zero value, there are 128 effective control positions.
2036
+// :[0,1,2,3,4,5,6,7]
2036
 #define SOFT_PWM_SCALE 0
2037
 #define SOFT_PWM_SCALE 0
2037
 
2038
 
2038
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2039
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/AliExpress/CL-260/Configuration.h 查看文件

2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2014
 // However, control resolution will be halved for each increment;
2014
 // However, control resolution will be halved for each increment;
2015
 // at zero value, there are 128 effective control positions.
2015
 // at zero value, there are 128 effective control positions.
2016
+// :[0,1,2,3,4,5,6,7]
2016
 #define SOFT_PWM_SCALE 0
2017
 #define SOFT_PWM_SCALE 0
2017
 
2018
 
2018
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2019
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/AliExpress/UM2pExt/Configuration.h 查看文件

2024
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2024
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2025
 // However, control resolution will be halved for each increment;
2025
 // However, control resolution will be halved for each increment;
2026
 // at zero value, there are 128 effective control positions.
2026
 // at zero value, there are 128 effective control positions.
2027
+// :[0,1,2,3,4,5,6,7]
2027
 #define SOFT_PWM_SCALE 0
2028
 #define SOFT_PWM_SCALE 0
2028
 
2029
 
2029
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2030
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Anet/A2/Configuration.h 查看文件

2015
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2015
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2016
 // However, control resolution will be halved for each increment;
2016
 // However, control resolution will be halved for each increment;
2017
 // at zero value, there are 128 effective control positions.
2017
 // at zero value, there are 128 effective control positions.
2018
+// :[0,1,2,3,4,5,6,7]
2018
 #define SOFT_PWM_SCALE 0
2019
 #define SOFT_PWM_SCALE 0
2019
 
2020
 
2020
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2021
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Anet/A2plus/Configuration.h 查看文件

2015
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2015
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2016
 // However, control resolution will be halved for each increment;
2016
 // However, control resolution will be halved for each increment;
2017
 // at zero value, there are 128 effective control positions.
2017
 // at zero value, there are 128 effective control positions.
2018
+// :[0,1,2,3,4,5,6,7]
2018
 #define SOFT_PWM_SCALE 0
2019
 #define SOFT_PWM_SCALE 0
2019
 
2020
 
2020
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2021
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Anet/A6/Configuration.h 查看文件

2167
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2167
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2168
 // However, control resolution will be halved for each increment;
2168
 // However, control resolution will be halved for each increment;
2169
 // at zero value, there are 128 effective control positions.
2169
 // at zero value, there are 128 effective control positions.
2170
+// :[0,1,2,3,4,5,6,7]
2170
 #define SOFT_PWM_SCALE 0
2171
 #define SOFT_PWM_SCALE 0
2171
 
2172
 
2172
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2173
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Anet/A8/Configuration.h 查看文件

2028
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2028
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2029
 // However, control resolution will be halved for each increment;
2029
 // However, control resolution will be halved for each increment;
2030
 // at zero value, there are 128 effective control positions.
2030
 // at zero value, there are 128 effective control positions.
2031
+// :[0,1,2,3,4,5,6,7]
2031
 #define SOFT_PWM_SCALE 0
2032
 #define SOFT_PWM_SCALE 0
2032
 
2033
 
2033
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2034
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/AnyCubic/i3/Configuration.h 查看文件

2023
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2023
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2024
 // However, control resolution will be halved for each increment;
2024
 // However, control resolution will be halved for each increment;
2025
 // at zero value, there are 128 effective control positions.
2025
 // at zero value, there are 128 effective control positions.
2026
+// :[0,1,2,3,4,5,6,7]
2026
 #define SOFT_PWM_SCALE 0
2027
 #define SOFT_PWM_SCALE 0
2027
 
2028
 
2028
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2029
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/ArmEd/Configuration.h 查看文件

2014
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2014
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2015
 // However, control resolution will be halved for each increment;
2015
 // However, control resolution will be halved for each increment;
2016
 // at zero value, there are 128 effective control positions.
2016
 // at zero value, there are 128 effective control positions.
2017
+// :[0,1,2,3,4,5,6,7]
2017
 #define SOFT_PWM_SCALE 0
2018
 #define SOFT_PWM_SCALE 0
2018
 
2019
 
2019
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2020
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Azteeg/X5GT/Configuration.h 查看文件

2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2014
 // However, control resolution will be halved for each increment;
2014
 // However, control resolution will be halved for each increment;
2015
 // at zero value, there are 128 effective control positions.
2015
 // at zero value, there are 128 effective control positions.
2016
+// :[0,1,2,3,4,5,6,7]
2016
 #define SOFT_PWM_SCALE 0
2017
 #define SOFT_PWM_SCALE 0
2017
 
2018
 
2018
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2019
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/BIBO/TouchX/cyclops/Configuration.h 查看文件

2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2014
 // However, control resolution will be halved for each increment;
2014
 // However, control resolution will be halved for each increment;
2015
 // at zero value, there are 128 effective control positions.
2015
 // at zero value, there are 128 effective control positions.
2016
+// :[0,1,2,3,4,5,6,7]
2016
 #define SOFT_PWM_SCALE 0
2017
 #define SOFT_PWM_SCALE 0
2017
 
2018
 
2018
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2019
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/BIBO/TouchX/default/Configuration.h 查看文件

2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2014
 // However, control resolution will be halved for each increment;
2014
 // However, control resolution will be halved for each increment;
2015
 // at zero value, there are 128 effective control positions.
2015
 // at zero value, there are 128 effective control positions.
2016
+// :[0,1,2,3,4,5,6,7]
2016
 #define SOFT_PWM_SCALE 0
2017
 #define SOFT_PWM_SCALE 0
2017
 
2018
 
2018
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2019
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/BQ/Hephestos/Configuration.h 查看文件

2001
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2001
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2002
 // However, control resolution will be halved for each increment;
2002
 // However, control resolution will be halved for each increment;
2003
 // at zero value, there are 128 effective control positions.
2003
 // at zero value, there are 128 effective control positions.
2004
+// :[0,1,2,3,4,5,6,7]
2004
 #define SOFT_PWM_SCALE 0
2005
 #define SOFT_PWM_SCALE 0
2005
 
2006
 
2006
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2007
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/BQ/Hephestos_2/Configuration.h 查看文件

2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2013
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2014
 // However, control resolution will be halved for each increment;
2014
 // However, control resolution will be halved for each increment;
2015
 // at zero value, there are 128 effective control positions.
2015
 // at zero value, there are 128 effective control positions.
2016
+// :[0,1,2,3,4,5,6,7]
2016
 #define SOFT_PWM_SCALE 0
2017
 #define SOFT_PWM_SCALE 0
2017
 
2018
 
2018
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2019
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/BQ/WITBOX/Configuration.h 查看文件

2001
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2001
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2002
 // However, control resolution will be halved for each increment;
2002
 // However, control resolution will be halved for each increment;
2003
 // at zero value, there are 128 effective control positions.
2003
 // at zero value, there are 128 effective control positions.
2004
+// :[0,1,2,3,4,5,6,7]
2004
 #define SOFT_PWM_SCALE 0
2005
 #define SOFT_PWM_SCALE 0
2005
 
2006
 
2006
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2007
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Cartesio/Configuration.h 查看文件

2012
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2012
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2013
 // However, control resolution will be halved for each increment;
2013
 // However, control resolution will be halved for each increment;
2014
 // at zero value, there are 128 effective control positions.
2014
 // at zero value, there are 128 effective control positions.
2015
+// :[0,1,2,3,4,5,6,7]
2015
 #define SOFT_PWM_SCALE 0
2016
 #define SOFT_PWM_SCALE 0
2016
 
2017
 
2017
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2018
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Creality/CR-10/Configuration.h 查看文件

2023
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2023
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2024
 // However, control resolution will be halved for each increment;
2024
 // However, control resolution will be halved for each increment;
2025
 // at zero value, there are 128 effective control positions.
2025
 // at zero value, there are 128 effective control positions.
2026
+// :[0,1,2,3,4,5,6,7]
2026
 #define SOFT_PWM_SCALE 0
2027
 #define SOFT_PWM_SCALE 0
2027
 
2028
 
2028
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2029
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Creality/CR-10S/Configuration.h 查看文件

2014
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2014
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2015
 // However, control resolution will be halved for each increment;
2015
 // However, control resolution will be halved for each increment;
2016
 // at zero value, there are 128 effective control positions.
2016
 // at zero value, there are 128 effective control positions.
2017
+// :[0,1,2,3,4,5,6,7]
2017
 #define SOFT_PWM_SCALE 0
2018
 #define SOFT_PWM_SCALE 0
2018
 
2019
 
2019
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2020
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Creality/CR-10_5S/Configuration.h 查看文件

2016
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2016
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2017
 // However, control resolution will be halved for each increment;
2017
 // However, control resolution will be halved for each increment;
2018
 // at zero value, there are 128 effective control positions.
2018
 // at zero value, there are 128 effective control positions.
2019
+// :[0,1,2,3,4,5,6,7]
2019
 #define SOFT_PWM_SCALE 0
2020
 #define SOFT_PWM_SCALE 0
2020
 
2021
 
2021
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2022
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Creality/CR-10mini/Configuration.h 查看文件

2032
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2032
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2033
 // However, control resolution will be halved for each increment;
2033
 // However, control resolution will be halved for each increment;
2034
 // at zero value, there are 128 effective control positions.
2034
 // at zero value, there are 128 effective control positions.
2035
+// :[0,1,2,3,4,5,6,7]
2035
 #define SOFT_PWM_SCALE 0
2036
 #define SOFT_PWM_SCALE 0
2036
 
2037
 
2037
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2038
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Creality/CR-8/Configuration.h 查看文件

2023
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2023
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2024
 // However, control resolution will be halved for each increment;
2024
 // However, control resolution will be halved for each increment;
2025
 // at zero value, there are 128 effective control positions.
2025
 // at zero value, there are 128 effective control positions.
2026
+// :[0,1,2,3,4,5,6,7]
2026
 #define SOFT_PWM_SCALE 0
2027
 #define SOFT_PWM_SCALE 0
2027
 
2028
 
2028
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2029
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Creality/Ender-2/Configuration.h 查看文件

2017
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2017
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2018
 // However, control resolution will be halved for each increment;
2018
 // However, control resolution will be halved for each increment;
2019
 // at zero value, there are 128 effective control positions.
2019
 // at zero value, there are 128 effective control positions.
2020
+// :[0,1,2,3,4,5,6,7]
2020
 #define SOFT_PWM_SCALE 0
2021
 #define SOFT_PWM_SCALE 0
2021
 
2022
 
2022
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2023
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Creality/Ender-3/Configuration.h 查看文件

2017
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2017
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2018
 // However, control resolution will be halved for each increment;
2018
 // However, control resolution will be halved for each increment;
2019
 // at zero value, there are 128 effective control positions.
2019
 // at zero value, there are 128 effective control positions.
2020
+// :[0,1,2,3,4,5,6,7]
2020
 #define SOFT_PWM_SCALE 0
2021
 #define SOFT_PWM_SCALE 0
2021
 
2022
 
2022
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2023
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Creality/Ender-4/Configuration.h 查看文件

2023
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2023
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2024
 // However, control resolution will be halved for each increment;
2024
 // However, control resolution will be halved for each increment;
2025
 // at zero value, there are 128 effective control positions.
2025
 // at zero value, there are 128 effective control positions.
2026
+// :[0,1,2,3,4,5,6,7]
2026
 #define SOFT_PWM_SCALE 0
2027
 #define SOFT_PWM_SCALE 0
2027
 
2028
 
2028
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2029
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Einstart-S/Configuration.h 查看文件

2019
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2019
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2020
 // However, control resolution will be halved for each increment;
2020
 // However, control resolution will be halved for each increment;
2021
 // at zero value, there are 128 effective control positions.
2021
 // at zero value, there are 128 effective control positions.
2022
+// :[0,1,2,3,4,5,6,7]
2022
 #define SOFT_PWM_SCALE 0
2023
 #define SOFT_PWM_SCALE 0
2023
 
2024
 
2024
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2025
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Felix/Configuration.h 查看文件

1995
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
1995
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
1996
 // However, control resolution will be halved for each increment;
1996
 // However, control resolution will be halved for each increment;
1997
 // at zero value, there are 128 effective control positions.
1997
 // at zero value, there are 128 effective control positions.
1998
+// :[0,1,2,3,4,5,6,7]
1998
 #define SOFT_PWM_SCALE 0
1999
 #define SOFT_PWM_SCALE 0
1999
 
2000
 
2000
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2001
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Felix/DUAL/Configuration.h 查看文件

1995
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
1995
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
1996
 // However, control resolution will be halved for each increment;
1996
 // However, control resolution will be halved for each increment;
1997
 // at zero value, there are 128 effective control positions.
1997
 // at zero value, there are 128 effective control positions.
1998
+// :[0,1,2,3,4,5,6,7]
1998
 #define SOFT_PWM_SCALE 0
1999
 #define SOFT_PWM_SCALE 0
1999
 
2000
 
2000
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2001
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/FlashForge/CreatorPro/Configuration.h 查看文件

2004
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2004
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2005
 // However, control resolution will be halved for each increment;
2005
 // However, control resolution will be halved for each increment;
2006
 // at zero value, there are 128 effective control positions.
2006
 // at zero value, there are 128 effective control positions.
2007
+// :[0,1,2,3,4,5,6,7]
2007
 #define SOFT_PWM_SCALE 0
2008
 #define SOFT_PWM_SCALE 0
2008
 
2009
 
2009
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2010
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/FolgerTech/i3-2020/Configuration.h 查看文件

2019
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2019
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2020
 // However, control resolution will be halved for each increment;
2020
 // However, control resolution will be halved for each increment;
2021
 // at zero value, there are 128 effective control positions.
2021
 // at zero value, there are 128 effective control positions.
2022
+// :[0,1,2,3,4,5,6,7]
2022
 #define SOFT_PWM_SCALE 0
2023
 #define SOFT_PWM_SCALE 0
2023
 
2024
 
2024
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2025
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Formbot/Raptor/Configuration.h 查看文件

2118
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2118
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2119
 // However, control resolution will be halved for each increment;
2119
 // However, control resolution will be halved for each increment;
2120
 // at zero value, there are 128 effective control positions.
2120
 // at zero value, there are 128 effective control positions.
2121
+// :[0,1,2,3,4,5,6,7]
2121
 #define SOFT_PWM_SCALE 0
2122
 #define SOFT_PWM_SCALE 0
2122
 
2123
 
2123
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2124
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 7
- 0
config/examples/Formbot/T_Rex_2+/Configuration.h 查看文件

2048
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2048
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2049
 // However, control resolution will be halved for each increment;
2049
 // However, control resolution will be halved for each increment;
2050
 // at zero value, there are 128 effective control positions.
2050
 // at zero value, there are 128 effective control positions.
2051
+// :[0,1,2,3,4,5,6,7]
2051
 #define SOFT_PWM_SCALE 0
2052
 #define SOFT_PWM_SCALE 0
2052
 
2053
 
2053
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2054
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2159
 
2160
 
2160
 // Allow servo angle to be edited and saved to EEPROM
2161
 // Allow servo angle to be edited and saved to EEPROM
2161
 //#define EDITABLE_SERVO_ANGLES
2162
 //#define EDITABLE_SERVO_ANGLES
2163
+
2164
+#ifdef ROXYs_TRex
2165
+  #define LED_PIN     -1
2166
+  #define BEEPER_PIN  -1
2167
+  #define KILL_PIN    -1
2168
+#endif

+ 7
- 0
config/examples/Formbot/T_Rex_3/Configuration.h 查看文件

2041
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2041
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2042
 // However, control resolution will be halved for each increment;
2042
 // However, control resolution will be halved for each increment;
2043
 // at zero value, there are 128 effective control positions.
2043
 // at zero value, there are 128 effective control positions.
2044
+// :[0,1,2,3,4,5,6,7]
2044
 #define SOFT_PWM_SCALE 0
2045
 #define SOFT_PWM_SCALE 0
2045
 
2046
 
2046
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2047
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2152
 
2153
 
2153
 // Allow servo angle to be edited and saved to EEPROM
2154
 // Allow servo angle to be edited and saved to EEPROM
2154
 //#define EDITABLE_SERVO_ANGLES
2155
 //#define EDITABLE_SERVO_ANGLES
2156
+
2157
+#ifdef ROXYs_TRex
2158
+  #define LED_PIN     -1
2159
+  #define BEEPER_PIN  -1
2160
+  #define KILL_PIN    -1
2161
+#endif

+ 1
- 0
config/examples/Geeetech/A10M/Configuration.h 查看文件

1998
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
1998
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
1999
 // However, control resolution will be halved for each increment;
1999
 // However, control resolution will be halved for each increment;
2000
 // at zero value, there are 128 effective control positions.
2000
 // at zero value, there are 128 effective control positions.
2001
+// :[0,1,2,3,4,5,6,7]
2001
 #define SOFT_PWM_SCALE 0
2002
 #define SOFT_PWM_SCALE 0
2002
 
2003
 
2003
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2004
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Geeetech/A20M/Configuration.h 查看文件

2002
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2002
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2003
 // However, control resolution will be halved for each increment;
2003
 // However, control resolution will be halved for each increment;
2004
 // at zero value, there are 128 effective control positions.
2004
 // at zero value, there are 128 effective control positions.
2005
+// :[0,1,2,3,4,5,6,7]
2005
 #define SOFT_PWM_SCALE 0
2006
 #define SOFT_PWM_SCALE 0
2006
 
2007
 
2007
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2008
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Geeetech/GT2560/Configuration.h 查看文件

2028
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2028
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2029
 // However, control resolution will be halved for each increment;
2029
 // However, control resolution will be halved for each increment;
2030
 // at zero value, there are 128 effective control positions.
2030
 // at zero value, there are 128 effective control positions.
2031
+// :[0,1,2,3,4,5,6,7]
2031
 #define SOFT_PWM_SCALE 0
2032
 #define SOFT_PWM_SCALE 0
2032
 
2033
 
2033
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2034
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h 查看文件

2002
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2002
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2003
 // However, control resolution will be halved for each increment;
2003
 // However, control resolution will be halved for each increment;
2004
 // at zero value, there are 128 effective control positions.
2004
 // at zero value, there are 128 effective control positions.
2005
+// :[0,1,2,3,4,5,6,7]
2005
 #define SOFT_PWM_SCALE 0
2006
 #define SOFT_PWM_SCALE 0
2006
 
2007
 
2007
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2008
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Geeetech/MeCreator2/Configuration.h 查看文件

2020
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2020
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2021
 // However, control resolution will be halved for each increment;
2021
 // However, control resolution will be halved for each increment;
2022
 // at zero value, there are 128 effective control positions.
2022
 // at zero value, there are 128 effective control positions.
2023
+// :[0,1,2,3,4,5,6,7]
2023
 #define SOFT_PWM_SCALE 0
2024
 #define SOFT_PWM_SCALE 0
2024
 
2025
 
2025
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2026
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 1
- 0
config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h 查看文件

2029
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2029
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
2030
 // However, control resolution will be halved for each increment;
2030
 // However, control resolution will be halved for each increment;
2031
 // at zero value, there are 128 effective control positions.
2031
 // at zero value, there are 128 effective control positions.
2032
+// :[0,1,2,3,4,5,6,7]
2032
 #define SOFT_PWM_SCALE 0
2033
 #define SOFT_PWM_SCALE 0
2033
 
2034
 
2034
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
2035
 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

+ 0
- 0
config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h 查看文件


部分文件因文件數量過多而無法顯示

Loading…
取消
儲存