From 34b9df8addc0bf73e7448f5414074ac907b13c5b Mon Sep 17 00:00:00 2001
From: makerbase-mks <4146049@qq.com>
Date: Tue, 28 Jul 2020 17:58:01 +0800
Subject: [PATCH 01/33] Support MKS SGEN_L V2 board
---
Marlin/src/core/boards.h | 1 +
Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 364 +++++++++++++++++++
Marlin/src/pins/pins.h | 2 +
3 files changed, 367 insertions(+)
create mode 100644 Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index 6e57a43747f0..f502d614e690 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -234,6 +234,7 @@
#define BOARD_SMOOTHIEBOARD 2506 // Smoothieboard
#define BOARD_TH3D_EZBOARD 2507 // TH3D EZBoard v1.0
#define BOARD_BTT_SKR_V1_4_TURBO 2508 // BigTreeTech SKR v1.4 TURBO (Power outputs: Hotend0, Hotend1, Fan, Bed)
+#define BOARD_MKS_SGEN_L_V2 2509 // MKS SGEN_L V2 (Power outputs: Hotend0, Hotend1, Bed, Fan)
//
// SAM3X8E ARM Cortex M3
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
new file mode 100644
index 000000000000..96c0937307b0
--- /dev/null
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
@@ -0,0 +1,364 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * MKS SGen pin assignments
+ */
+
+#ifndef MCU_LPC1769
+ #error "Oops! Make sure you have the LPC1769 environment selected in your IDE."
+#endif
+
+#define BOARD_INFO_NAME "MKS SGEN_L V2"
+#define BOARD_WEBSITE_URL "github.com/makerbase-mks"
+
+//
+// EEPROM, MKS SGEN_L V2.0 hardware has 4K EEPROM on the board
+//
+#define FLASH_EEPROM_EMULATION
+//#define SDCARD_EEPROM_EMULATION
+//#define SDCARD_EEPROM_EMULATION
+//#define I2C_EEPROM // AT24C32
+//#define E2END 0xFFF // 4KB
+
+//
+// Servos
+//
+#define SERVO0_PIN P1_23 // SERVO P1.23
+#define SERVO1_PIN P2_00 // SERVO P2.0
+
+//
+// Trinamic Stallguard pins, can connect or disconnect by jumpers cap on the board
+//
+#define X_DIAG_PIN P1_29 // X-
+#define Y_DIAG_PIN P1_27 // Y-
+#define Z_DIAG_PIN P1_25 // Z-
+#define E0_DIAG_PIN P1_28 // X+
+#define E1_DIAG_PIN P1_26 // Y+
+
+//
+// Limit Switches
+//
+#if X_STALL_SENSITIVITY
+ #define X_STOP_PIN X_DIAG_PIN
+ #if X_HOME_DIR < 0
+ #define X_MAX_PIN P1_28 // X+
+ #else
+ #define X_MIN_PIN P1_28 // X+
+ #endif
+#else
+ #define X_MIN_PIN P1_29 // X-
+ #define X_MAX_PIN P1_28 // X+
+#endif
+
+#if Y_STALL_SENSITIVITY
+ #define Y_STOP_PIN Y_DIAG_PIN
+ #if Y_HOME_DIR < 0
+ #define Y_MAX_PIN P1_26 // Y+
+ #else
+ #define Y_MIN_PIN P1_26 // Y+
+ #endif
+#else
+ #define Y_MIN_PIN P1_27 // Y-
+ #define Y_MAX_PIN P1_26 // Y+
+#endif
+
+#if Z_STALL_SENSITIVITY
+ #define Z_STOP_PIN Z_DIAG_PIN
+ #if Z_HOME_DIR < 0
+ #define Z_MAX_PIN P1_24 // Z+
+ #else
+ #define Z_MIN_PIN P1_24 // Z+
+ #endif
+#else
+ #define Z_MIN_PIN P1_25 // Z-
+ #define Z_MAX_PIN P1_24 // Z+
+#endif
+
+//
+// Z Probe (when not Z_MIN_PIN)
+//
+#ifndef Z_MIN_PROBE_PIN
+ #define Z_MIN_PROBE_PIN P1_24
+#endif
+
+//
+// Steppers
+//
+#define X_STEP_PIN P2_02
+#define X_DIR_PIN P2_03
+#define X_ENABLE_PIN P2_01
+#ifndef X_CS_PIN
+ #define X_CS_PIN P1_01
+#endif
+
+#define Y_STEP_PIN P0_19
+#define Y_DIR_PIN P0_20
+#define Y_ENABLE_PIN P2_08
+#ifndef Y_CS_PIN
+ #define Y_CS_PIN P1_08
+#endif
+
+#define Z_STEP_PIN P0_22
+#define Z_DIR_PIN P2_11
+#define Z_ENABLE_PIN P0_21
+#ifndef Z_CS_PIN
+ #define Z_CS_PIN P1_10
+#endif
+
+#define E0_STEP_PIN P2_13
+#define E0_DIR_PIN P0_11
+#define E0_ENABLE_PIN P2_12
+#ifndef E0_CS_PIN
+ #define E0_CS_PIN P1_15
+#endif
+
+#define E1_STEP_PIN P1_09
+#define E1_DIR_PIN P1_14
+#define E1_ENABLE_PIN P0_10
+#ifndef E1_CS_PIN
+ #define E1_CS_PIN P1_17
+#endif
+
+//
+// Software SPI pins for TMC2130 stepper drivers
+//
+#if ENABLED(TMC_USE_SW_SPI)
+ #ifndef TMC_SW_MOSI
+ #define TMC_SW_MOSI P1_16
+ #endif
+ #ifndef TMC_SW_MISO
+ #define TMC_SW_MISO P0_05
+ #endif
+ #ifndef TMC_SW_SCK
+ #define TMC_SW_SCK P0_04
+ #endif
+#endif
+
+#if HAS_TMC_UART
+ /**
+ * TMC2208/TMC2209 stepper drivers
+ *
+ * Hardware serial communication ports.
+ * If undefined software serial is used according to the pins below
+ */
+ //#define X_HARDWARE_SERIAL Serial
+ //#define X2_HARDWARE_SERIAL Serial1
+ //#define Y_HARDWARE_SERIAL Serial1
+ //#define Y2_HARDWARE_SERIAL Serial1
+ //#define Z_HARDWARE_SERIAL Serial1
+ //#define Z2_HARDWARE_SERIAL Serial1
+ //#define E0_HARDWARE_SERIAL Serial1
+ //#define E1_HARDWARE_SERIAL Serial1
+ //#define E2_HARDWARE_SERIAL Serial1
+ //#define E3_HARDWARE_SERIAL Serial1
+ //#define E4_HARDWARE_SERIAL Serial1
+
+ //
+ // Software serial
+ //
+
+ #define X_SERIAL_TX_PIN P1_01
+ #define X_SERIAL_RX_PIN P1_01
+
+ #define Y_SERIAL_TX_PIN P1_08
+ #define Y_SERIAL_RX_PIN P1_08
+
+ #define Z_SERIAL_TX_PIN P1_10
+ #define Z_SERIAL_RX_PIN P1_10
+
+ #define E0_SERIAL_TX_PIN P1_15
+ #define E0_SERIAL_RX_PIN P1_15
+
+ #define E1_SERIAL_TX_PIN P1_17
+ #define E1_SERIAL_RX_PIN P1_17
+
+ #define Z2_SERIAL_TX_PIN P1_17
+ #define Z2_SERIAL_RX_PIN P1_17
+
+ // Reduce baud rate to improve software serial reliability
+ #define TMC_BAUD_RATE 19200
+#endif // TMC2208 || TMC2209
+
+//
+// Temperature Sensors
+// 3.3V max when defined as an analog input
+//
+#define TEMP_0_PIN P0_23_A0 // Analog Input A0 (TH1)
+#define TEMP_BED_PIN P0_24_A1 // Analog Input A1 (TB)
+#define TEMP_1_PIN P0_25_A2 // Analog Input A2 (TH2)
+#define TEMP_2_PIN P0_26_A3 // Analog Input A3 (P0.26, No pull up)
+
+//
+// Heaters / Fans
+//
+#define HEATER_BED_PIN P2_05
+#define HEATER_0_PIN P2_07
+#if HOTENDS == 1
+ #ifndef FAN1_PIN
+ #define FAN1_PIN P2_06
+ #endif
+#else
+ #ifndef HEATER_1_PIN
+ #define HEATER_1_PIN P2_06
+ #endif
+#endif
+#ifndef FAN_PIN
+ #define FAN_PIN P2_04
+#endif
+#ifndef FAN2_PIN
+ #define FAN2_PIN P1_04
+#endif
+
+//
+// Misc. Functions
+//
+#define LED_PIN P1_18 // Used as a status indicator
+#define LED2_PIN P1_19
+#define LED3_PIN P1_20
+#define LED4_PIN P1_21
+
+/**
+ * _____ _____
+ * (BEEPER) 1.31 | · · | 1.30 (BTN_ENC) (MISO) 0.8 | · · | 0.7 (SD_SCK)
+ * (LCD_EN) 0.18 | · · | 0.16 (LCD_RS) (BTN_EN1) 3.25 | · · | 0.28 (SD_CS2)
+ * (LCD_D4) 0.15 | · ·| 0.17 (LCD_D5) (BTN_EN2) 3.26 | · ·| 0.9 (SD_MOSI)
+ * (LCD_D6) 1.0 | · · | 1.22 (LCD_D7) (SD_DETECT) 0.27 | · · | RST
+ * GND | · · | 5V GND | · · | NC
+ * ----- -----
+ * EXP1 EXP2
+ */
+#if HAS_SPI_LCD
+ #define BEEPER_PIN P1_31
+ #define BTN_ENC P1_30
+
+ #if ENABLED(CR10_STOCKDISPLAY)
+ #define LCD_PINS_RS P1_00
+
+ #define BTN_EN1 P0_18
+ #define BTN_EN2 P0_15
+
+ #define LCD_PINS_ENABLE P1_22
+ #define LCD_PINS_D4 P0_17
+
+ #else
+
+ #define BTN_EN1 P3_25
+ #define BTN_EN2 P3_26
+
+ #define LCD_SDSS P0_28
+
+ #if ENABLED(MKS_12864OLED_SSD1306)
+
+ #define LCD_PINS_DC P0_17
+ #define DOGLCD_CS P0_16
+ #define DOGLCD_A0 LCD_PINS_DC
+ #define DOGLCD_SCK P0_15
+ #define DOGLCD_MOSI P0_18
+
+ #define LCD_PINS_RS P1_00
+ #define LCD_PINS_D7 P1_22
+ #define KILL_PIN -1 // NC
+
+ #else // !MKS_12864OLED_SSD1306
+
+ #define LCD_PINS_RS P0_16
+
+ #define LCD_PINS_ENABLE P0_18
+ #define LCD_PINS_D4 P0_15
+
+ #if ENABLED(FYSETC_MINI_12864)
+
+ #define DOGLCD_CS P0_18
+ #define DOGLCD_A0 P0_16
+ #define DOGLCD_SCK P0_07
+ #define DOGLCD_MOSI P1_20
+
+ #define LCD_BACKLIGHT_PIN -1
+
+ #define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems
+ // results in LCD soft SPI mode 3, SD soft SPI mode 0
+
+ #define LCD_RESET_PIN P0_15 // Must be high or open for LCD to operate normally.
+
+ #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0)
+ #ifndef RGB_LED_R_PIN
+ #define RGB_LED_R_PIN P0_17
+ #endif
+ #ifndef RGB_LED_G_PIN
+ #define RGB_LED_G_PIN P1_00
+ #endif
+ #ifndef RGB_LED_B_PIN
+ #define RGB_LED_B_PIN P1_22
+ #endif
+ #elif ENABLED(FYSETC_MINI_12864_2_1)
+ #define NEOPIXEL_PIN P0_17
+ #endif
+
+ #else // !FYSETC_MINI_12864
+
+ #if ENABLED(MKS_MINI_12864)
+ #define DOGLCD_CS P0_17
+ #define DOGLCD_A0 P1_00
+ #endif
+
+ #if ENABLED(ULTIPANEL)
+ #define LCD_PINS_D5 P0_17
+ #define LCD_PINS_D6 P1_00
+ #define LCD_PINS_D7 P1_22
+ #endif
+
+ #endif // !FYSETC_MINI_12864
+
+ #endif // !MKS_12864OLED_SSD1306
+
+ #endif // !CR10_STOCKDISPLAY
+
+#endif // HAS_SPI_LCD
+
+#ifndef SDCARD_CONNECTION
+ #define SDCARD_CONNECTION ONBOARD
+#endif
+
+#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card
+
+#if SD_CONNECTION_IS(LCD) || SD_CONNECTION_IS(ONBOARD)
+ #define SD_DETECT_PIN P0_27
+ #define SCK_PIN P0_07
+ #define MISO_PIN P0_08
+ #define MOSI_PIN P0_09
+ #if SD_CONNECTION_IS(ONBOARD)
+ #define SS_PIN ONBOARD_SD_CS_PIN
+ #else
+ #define SS_PIN P0_28
+ #endif
+#elif SD_CONNECTION_IS(CUSTOM_CABLE)
+ #error "No custom SD drive cable defined for this board."
+#endif
+
+//
+// Other Pins
+//
+//#define PIN_P0_02 P0_02 // AUX1 (Interrupt Capable/ADC/Serial Port 0)
+//#define PIN_P0_03 P0_03 // AUX1 (Interrupt Capable/ADC/Serial Port 0)
+//#define PS_ON_PIN P1_23 // SERVO P1.23
\ No newline at end of file
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index 1b78b0f769ad..9f8088fe4331 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -408,6 +408,8 @@
#include "lpc1769/pins_TH3D_EZBOARD.h" // LPC1769 env:LPC1769
#elif MB(BTT_SKR_V1_4_TURBO)
#include "lpc1769/pins_BTT_SKR_V1_4_TURBO.h" // LPC1769 env:LPC1769
+#elif MB(MKS_SGEN_L_V2)
+ #include "lpc1769/pins_MKS_SGEN_L_V2.h" // LPC1769 env:LPC1769
//
// Due (ATSAM) boards
From a3b0f9dda4c3d3292ed5120a9ff780263de6354b Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Tue, 28 Jul 2020 20:04:33 -0500
Subject: [PATCH 02/33] Update pins_MKS_SGEN_L_V2.h
---
Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
index 96c0937307b0..1c6fd7dcf717 100644
--- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
@@ -16,7 +16,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
+ * along with this program. If not, see .
*
*/
#pragma once
@@ -37,9 +37,8 @@
//
#define FLASH_EEPROM_EMULATION
//#define SDCARD_EEPROM_EMULATION
-//#define SDCARD_EEPROM_EMULATION
-//#define I2C_EEPROM // AT24C32
-//#define E2END 0xFFF // 4KB
+//#define I2C_EEPROM // AT24C32
+//#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
//
// Servos
@@ -198,7 +197,7 @@
// Reduce baud rate to improve software serial reliability
#define TMC_BAUD_RATE 19200
-#endif // TMC2208 || TMC2209
+#endif // HAS_TMC_UART
//
// Temperature Sensors
@@ -361,4 +360,4 @@
//
//#define PIN_P0_02 P0_02 // AUX1 (Interrupt Capable/ADC/Serial Port 0)
//#define PIN_P0_03 P0_03 // AUX1 (Interrupt Capable/ADC/Serial Port 0)
-//#define PS_ON_PIN P1_23 // SERVO P1.23
\ No newline at end of file
+//#define PS_ON_PIN P1_23 // SERVO P1.23
From bf9ee2e185f6987137d4481f9ff739c87ae5d91b Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Tue, 28 Jul 2020 20:08:33 -0500
Subject: [PATCH 03/33] Update pins_MKS_SGEN_L_V2.h
---
Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
index 1c6fd7dcf717..1f46b48f6183 100644
--- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
@@ -35,10 +35,12 @@
//
// EEPROM, MKS SGEN_L V2.0 hardware has 4K EEPROM on the board
//
-#define FLASH_EEPROM_EMULATION
-//#define SDCARD_EEPROM_EMULATION
-//#define I2C_EEPROM // AT24C32
-//#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
+#if NO_EEPROM_SELECTED
+ #define FLASH_EEPROM_EMULATION
+ //#define SDCARD_EEPROM_EMULATION
+ //#define I2C_EEPROM // AT24C32
+ //#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
+#endif
//
// Servos
From 2d959198d285b47e61535cbb74c45b98c86e59d8 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Tue, 28 Jul 2020 20:10:35 -0500
Subject: [PATCH 04/33] 4K size stated
---
Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
index 1f46b48f6183..438a76e9f0da 100644
--- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
@@ -36,10 +36,10 @@
// EEPROM, MKS SGEN_L V2.0 hardware has 4K EEPROM on the board
//
#if NO_EEPROM_SELECTED
- #define FLASH_EEPROM_EMULATION
//#define SDCARD_EEPROM_EMULATION
//#define I2C_EEPROM // AT24C32
- //#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
+ #define FLASH_EEPROM_EMULATION
+ #define MARLIN_EEPROM_SIZE 0x1000 // 4KB
#endif
//
From 4bdaec14dbb68006ef9067307143d45ea0080996 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Tue, 1 Sep 2020 18:17:58 -0500
Subject: [PATCH 05/33] Update pins_MKS_SGEN_L_V2.h
---
Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 8 --------
1 file changed, 8 deletions(-)
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
index 438a76e9f0da..d112cc5d5080 100644
--- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
@@ -178,25 +178,17 @@
//
// Software serial
//
-
#define X_SERIAL_TX_PIN P1_01
#define X_SERIAL_RX_PIN P1_01
-
#define Y_SERIAL_TX_PIN P1_08
#define Y_SERIAL_RX_PIN P1_08
-
#define Z_SERIAL_TX_PIN P1_10
#define Z_SERIAL_RX_PIN P1_10
-
#define E0_SERIAL_TX_PIN P1_15
#define E0_SERIAL_RX_PIN P1_15
-
#define E1_SERIAL_TX_PIN P1_17
#define E1_SERIAL_RX_PIN P1_17
- #define Z2_SERIAL_TX_PIN P1_17
- #define Z2_SERIAL_RX_PIN P1_17
-
// Reduce baud rate to improve software serial reliability
#define TMC_BAUD_RATE 19200
#endif // HAS_TMC_UART
From 8a8da49a7cd39abc1449a452554abe5faafa9166 Mon Sep 17 00:00:00 2001
From: makerbase-mks <4146049@qq.com>
Date: Sat, 5 Sep 2020 19:03:29 +0800
Subject: [PATCH 06/33] Fix MKS LCD12864A/B display on MKS Robin E3/E3D and MKS
SGEN_L
---
Marlin/Configuration.h | 1 +
Marlin/src/MarlinCore.cpp | 12 +++++++++---
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 52af1375a509..93f65fca86c8 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -2054,6 +2054,7 @@
// MKS LCD12864A/B with graphic controller and SD support. Follows MKS_MINI_12864 pinout.
// https://www.aliexpress.com/item/33018110072.html
//
+
//#define MKS_LCD12864
//
diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index e703eaf8d999..86e7fefebf98 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -1019,9 +1019,15 @@ void setup() {
#endif
SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.)
#endif
-
- #if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION)
- SETUP_RUN(card.mount()); // Mount media with settings before first_load
+
+ #if ENABLED(MKS_LCD12864) || ENABLED(MKS_MINI_12864)
+ #if ENABLED(SDSUPPORT)
+ SETUP_RUN(card.mount()); // Mount media with settings before first_load
+ #endif
+ #else
+ #if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION)
+ SETUP_RUN(card.mount()); // Mount media with settings before first_load
+ #endif
#endif
SETUP_RUN(settings.first_load()); // Load data from EEPROM if available (or use defaults)
From a96c6de3c806755488f4eb7116e501e85b02846e Mon Sep 17 00:00:00 2001
From: makerbase-mks <4146049@qq.com>
Date: Wed, 9 Sep 2020 11:48:45 +0800
Subject: [PATCH 07/33] Add support for MKS GEN_L V2.1
---
Marlin/src/core/boards.h | 1 +
Marlin/src/pins/pins.h | 2 +
Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h | 89 ++++++++++++++++++++++
3 files changed, 92 insertions(+)
create mode 100644 Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index e280d955b800..b807ed9f1ee6 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -107,6 +107,7 @@
#define BOARD_COPYMASTER_3D 1151 // Copymaster 3D
#define BOARD_ORTUR_4 1152 // Ortur 4
#define BOARD_TENLOG_D3_HERO 1153 // Tenlog D3 Hero IDEX printer
+#define BOARD_MKS_GEN_L_V21 1154 // MKS GEN L V2.1
//
// RAMBo and derivatives
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index 2dfb2b53b8ea..e9b93ea427dd 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -196,6 +196,8 @@
#include "ramps/pins_ORTUR_4.h" // ATmega2560 env:mega2560
#elif MB(TENLOG_D3_HERO)
#include "ramps/pins_TENLOG_D3_HERO.h" // ATmega2560 env:mega2560
+#elif MB(MKS_GEN_L_V21)
+ #include "ramps/pins_MKS_GEN_L_V21.h" // ATmega2560 env:mega2560
//
// RAMBo and derivatives
diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
new file mode 100644
index 000000000000..52721c684e3b
--- /dev/null
+++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
@@ -0,0 +1,89 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * MKS GEN L V2 – Arduino Mega2560 with RAMPS v1.4 pin assignments
+ */
+
+#if HOTENDS > 2 || E_STEPPERS > 2
+ #error "MKS GEN L V2.1 supports up to 2 hotends / E-steppers. Comment out this line to continue."
+#endif
+
+#define BOARD_INFO_NAME "MKS GEN L V2"
+
+//
+// Heaters / Fans
+//
+// Power outputs EFBF or EFBE
+#define MOSFET_D_PIN 7
+
+//
+// CS Pins wired to avoid conflict with the LCD
+// See https://www.thingiverse.com/asset:66604
+//
+
+#ifndef X_CS_PIN
+ #define X_CS_PIN 63
+#endif
+
+#ifndef Y_CS_PIN
+ #define Y_CS_PIN 64
+#endif
+
+#ifndef Z_CS_PIN
+ #define Z_CS_PIN 65
+#endif
+
+#ifndef E0_CS_PIN
+ #define E0_CS_PIN 66
+#endif
+
+#ifndef E1_CS_PIN
+ #define E1_CS_PIN 12
+#endif
+
+// TMC2130 Diag Pins (currently just for reference)
+#define X_DIAG_PIN 3
+#define Y_DIAG_PIN 14
+#define Z_DIAG_PIN 18
+#define E0_DIAG_PIN 2
+#define E1_DIAG_PIN 15
+
+#ifndef SERVO1_PIN
+ #define SERVO1_PIN 12
+#endif
+#ifndef SERVO2_PIN
+ #define SERVO2_PIN 39
+#endif
+#ifndef SERVO3_PIN
+ #define SERVO3_PIN 32
+#endif
+
+#ifndef E1_SERIAL_TX_PIN
+ #define E1_SERIAL_TX_PIN 20
+#endif
+#ifndef E1_SERIAL_RX_PIN
+ #define E1_SERIAL_RX_PIN 12
+#endif
+
+#include "pins_RAMPS.h"
From 7c622f3711062518d6137b46a2798482450181e5 Mon Sep 17 00:00:00 2001
From: makerbase-mks <4146049@qq.com>
Date: Wed, 9 Sep 2020 12:00:53 +0800
Subject: [PATCH 08/33] Add support for MKS Gen-L V2.1
---
Marlin/src/MarlinCore.cpp | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index bc965f79fce8..cc7f479e8201 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -1020,14 +1020,8 @@ void setup() {
SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.)
#endif
- #if ENABLED(MKS_LCD12864) || ENABLED(MKS_MINI_12864)
- #if ENABLED(SDSUPPORT)
- SETUP_RUN(card.mount()); // Mount media with settings before first_load
- #endif
- #else
- #if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION)
- SETUP_RUN(card.mount()); // Mount media with settings before first_load
- #endif
+ #if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION)
+ SETUP_RUN(card.mount()); // Mount media with settings before first_load
#endif
SETUP_RUN(settings.first_load()); // Load data from EEPROM if available (or use defaults)
From 1c8c01882245c42998d2b174dbf5495ac5397eee Mon Sep 17 00:00:00 2001
From: makerbase <4164049@qq.com>
Date: Wed, 9 Sep 2020 12:04:17 +0800
Subject: [PATCH 09/33] Update pins_MKS_GEN_L_V21.h
---
Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
index 52721c684e3b..d88d97b04595 100644
--- a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
+++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
@@ -29,7 +29,7 @@
#error "MKS GEN L V2.1 supports up to 2 hotends / E-steppers. Comment out this line to continue."
#endif
-#define BOARD_INFO_NAME "MKS GEN L V2"
+#define BOARD_INFO_NAME "MKS GEN L V2.1"
//
// Heaters / Fans
From 453f220fe47365a1fe5ccc985212f12747b719cb Mon Sep 17 00:00:00 2001
From: makerbase <4164049@qq.com>
Date: Wed, 9 Sep 2020 12:12:27 +0800
Subject: [PATCH 10/33] Update pins_MKS_GEN_L_V21.h
---
Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
index d88d97b04595..79e1ea241e67 100644
--- a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
+++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
@@ -70,7 +70,7 @@
#define E1_DIAG_PIN 15
#ifndef SERVO1_PIN
- #define SERVO1_PIN 12
+ #define SERVO1_PIN 21
#endif
#ifndef SERVO2_PIN
#define SERVO2_PIN 39
From cd14a9640a7b973580d8929a9978e277a392e5cf Mon Sep 17 00:00:00 2001
From: makerbase <4164049@qq.com>
Date: Wed, 9 Sep 2020 12:13:18 +0800
Subject: [PATCH 11/33] Update MarlinCore.cpp
---
Marlin/src/MarlinCore.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index cc7f479e8201..8545a8801e13 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -1019,7 +1019,6 @@ void setup() {
#endif
SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.)
#endif
-
#if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION)
SETUP_RUN(card.mount()); // Mount media with settings before first_load
#endif
From bc5d3164ed5d22f412206ccea60d4248458ef006 Mon Sep 17 00:00:00 2001
From: makerbase <4164049@qq.com>
Date: Wed, 9 Sep 2020 12:14:18 +0800
Subject: [PATCH 12/33] Update Configuration.h
---
Marlin/Configuration.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 93f65fca86c8..52af1375a509 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -2054,7 +2054,6 @@
// MKS LCD12864A/B with graphic controller and SD support. Follows MKS_MINI_12864 pinout.
// https://www.aliexpress.com/item/33018110072.html
//
-
//#define MKS_LCD12864
//
From 07b33a9e851075860e055a145fc630245723c70e Mon Sep 17 00:00:00 2001
From: makerbase <4164049@qq.com>
Date: Wed, 9 Sep 2020 12:14:46 +0800
Subject: [PATCH 13/33] Update MarlinCore.cpp
---
Marlin/src/MarlinCore.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index 8545a8801e13..cc7f479e8201 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -1019,6 +1019,7 @@ void setup() {
#endif
SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.)
#endif
+
#if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION)
SETUP_RUN(card.mount()); // Mount media with settings before first_load
#endif
From 4cb7f4abbfcd9b5220c903a2c4ddf99558ab3ef4 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Wed, 9 Sep 2020 21:43:16 -0500
Subject: [PATCH 14/33] Update MarlinCore.cpp
---
Marlin/src/MarlinCore.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index cc7f479e8201..89791c90820b 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -1019,7 +1019,7 @@ void setup() {
#endif
SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.)
#endif
-
+
#if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION)
SETUP_RUN(card.mount()); // Mount media with settings before first_load
#endif
From 8b08e955c8dfc9c3fcf7df7211ddf23d01cad921 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Wed, 9 Sep 2020 21:47:45 -0500
Subject: [PATCH 15/33] Add Makefile, clean up
---
Marlin/Makefile | 8 +++++---
Marlin/src/core/boards.h | 8 ++++----
Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h | 4 ----
3 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/Marlin/Makefile b/Marlin/Makefile
index 5ab0d1eefd11..9f2d18d268d7 100644
--- a/Marlin/Makefile
+++ b/Marlin/Makefile
@@ -268,12 +268,14 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1148)
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
# MKS GEN L V2
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
-# Copymaster 3D
+# MKS GEN L V2.1
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
-# Ortur 4
+# Copymaster 3D
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
-# Tenlog D3 Hero
+# Ortur 4
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
+# Tenlog D3 Hero
+else ifeq ($(HARDWARE_MOTHERBOARD),1154)
#
# RAMBo and derivatives
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index aa42da068e56..abe5a54335c5 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -104,10 +104,10 @@
#define BOARD_HJC2560C_REV2 1148 // ADIMLab Gantry v2
#define BOARD_TANGO 1149 // BIQU Tango V1
#define BOARD_MKS_GEN_L_V2 1150 // MKS GEN L V2
-#define BOARD_COPYMASTER_3D 1151 // Copymaster 3D
-#define BOARD_ORTUR_4 1152 // Ortur 4
-#define BOARD_TENLOG_D3_HERO 1153 // Tenlog D3 Hero IDEX printer
-#define BOARD_MKS_GEN_L_V21 1154 // MKS GEN L V2.1
+#define BOARD_MKS_GEN_L_V21 1151 // MKS GEN L V2.1
+#define BOARD_COPYMASTER_3D 1152 // Copymaster 3D
+#define BOARD_ORTUR_4 1153 // Ortur 4
+#define BOARD_TENLOG_D3_HERO 1154 // Tenlog D3 Hero IDEX printer
//
// RAMBo and derivatives
diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
index 79e1ea241e67..24e04a39ff1f 100644
--- a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
+++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h
@@ -45,19 +45,15 @@
#ifndef X_CS_PIN
#define X_CS_PIN 63
#endif
-
#ifndef Y_CS_PIN
#define Y_CS_PIN 64
#endif
-
#ifndef Z_CS_PIN
#define Z_CS_PIN 65
#endif
-
#ifndef E0_CS_PIN
#define E0_CS_PIN 66
#endif
-
#ifndef E1_CS_PIN
#define E1_CS_PIN 12
#endif
From ceb896f866fe89b11b6015b8990ec43e569ec14f Mon Sep 17 00:00:00 2001
From: makerbase-mks <4146049@qq.com>
Date: Wed, 16 Sep 2020 15:48:29 +0800
Subject: [PATCH 16/33] fix Makefile and board file
---
Marlin/Makefile | 106 +++++++++++++++++++-------------------
Marlin/src/core/boards.h | 108 +++++++++++++++++++++------------------
2 files changed, 111 insertions(+), 103 deletions(-)
diff --git a/Marlin/Makefile b/Marlin/Makefile
index 9f2d18d268d7..68dd05bdfbad 100644
--- a/Marlin/Makefile
+++ b/Marlin/Makefile
@@ -170,112 +170,114 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1100)
else ifeq ($(HARDWARE_MOTHERBOARD),1101)
# Velleman K8400 Controller (derived from 3Drag Controller)
else ifeq ($(HARDWARE_MOTHERBOARD),1102)
-# Velleman K8600 Controller (derived from 3Drag Controller)
+# Velleman K8600 Controller (Vertex Nano)
else ifeq ($(HARDWARE_MOTHERBOARD),1103)
-# 2PrintBeta BAM&DICE with STK drivers
+# Velleman K8800 Controller (Vertex Delta)
else ifeq ($(HARDWARE_MOTHERBOARD),1104)
-# 2PrintBeta BAM&DICE Due with STK drivers
+# 2PrintBeta BAM&DICE with STK drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1105)
-# MKS BASE v1.0
+# 2PrintBeta BAM&DICE Due with STK drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1106)
-# MKS v1.4 with A4982 stepper drivers
+# MKS BASE v1.0
else ifeq ($(HARDWARE_MOTHERBOARD),1107)
-# MKS v1.5 with Allegro A4982 stepper drivers
+# MKS v1.4 with A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1108)
-# MKS v1.6 with Allegro A4982 stepper drivers
+# MKS v1.5 with Allegro A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1109)
-# MKS BASE 1.0 with Heroic HR4982 stepper drivers
+# MKS v1.6 with Allegro A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1110)
-# MKS GEN v1.3 or 1.4
+# MKS BASE 1.0 with Heroic HR4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1111)
-# MKS GEN L
+# MKS GEN v1.3 or 1.4
else ifeq ($(HARDWARE_MOTHERBOARD),1112)
-# zrib V2.0 control board (Chinese knock off RAMPS replica)
+# MKS GEN L
else ifeq ($(HARDWARE_MOTHERBOARD),1113)
-# BigTreeTech or BIQU KFB2.0
+# zrib V2.0 control board (Chinese knock off RAMPS replica)
else ifeq ($(HARDWARE_MOTHERBOARD),1114)
-# Felix 2.0+ Electronics Board (RAMPS like)
+# BigTreeTech or BIQU KFB2.0
else ifeq ($(HARDWARE_MOTHERBOARD),1115)
-# Invent-A-Part RigidBoard
+# Felix 2.0+ Electronics Board (RAMPS like)
else ifeq ($(HARDWARE_MOTHERBOARD),1116)
-# Invent-A-Part RigidBoard V2
+# Invent-A-Part RigidBoard
else ifeq ($(HARDWARE_MOTHERBOARD),1117)
-# Sainsmart 2-in-1 board
+# Invent-A-Part RigidBoard V2
else ifeq ($(HARDWARE_MOTHERBOARD),1118)
-# Ultimaker
+# Sainsmart 2-in-1 board
else ifeq ($(HARDWARE_MOTHERBOARD),1119)
-# Ultimaker (Older electronics. Pre 1.5.4. This is rare)
+# Ultimaker
else ifeq ($(HARDWARE_MOTHERBOARD),1120)
+# Ultimaker (Older electronics. Pre 1.5.4. This is rare)
+else ifeq ($(HARDWARE_MOTHERBOARD),1121)
MCU ?= atmega1280
# Azteeg X3
-else ifeq ($(HARDWARE_MOTHERBOARD),1121)
-# Azteeg X3 Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1122)
-# Ultimainboard 2.x (Uses TEMP_SENSOR 20)
+# Azteeg X3 Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1123)
-# Rumba
+# Ultimainboard 2.x (Uses TEMP_SENSOR 20)
else ifeq ($(HARDWARE_MOTHERBOARD),1124)
-# Raise3D Rumba
+# Rumba
else ifeq ($(HARDWARE_MOTHERBOARD),1125)
-# Rapide Lite RL200 Rumba
+# Raise3D Rumba
else ifeq ($(HARDWARE_MOTHERBOARD),1126)
-# Formbot T-Rex 2 Plus
+# Rapide Lite RL200 Rumba
else ifeq ($(HARDWARE_MOTHERBOARD),1127)
-# Formbot T-Rex 3
+# Formbot T-Rex 2 Plus
else ifeq ($(HARDWARE_MOTHERBOARD),1128)
-# Formbot Raptor
+# Formbot T-Rex 3
else ifeq ($(HARDWARE_MOTHERBOARD),1129)
-# Formbot Raptor 2
+# Formbot Raptor
else ifeq ($(HARDWARE_MOTHERBOARD),1130)
-# bq ZUM Mega 3D
+# Formbot Raptor 2
else ifeq ($(HARDWARE_MOTHERBOARD),1131)
-# MakeBoard Mini v2.1.2 is a control board sold by MicroMake
+# bq ZUM Mega 3D
else ifeq ($(HARDWARE_MOTHERBOARD),1132)
-# TriGorilla Anycubic version 1.3 based on RAMPS EFB
+# MakeBoard Mini v2.1.2 is a control board sold by MicroMake
else ifeq ($(HARDWARE_MOTHERBOARD),1133)
-# TriGorilla Anycubic version 1.4 based on RAMPS EFB
+# TriGorilla Anycubic version 1.3 based on RAMPS EFB
else ifeq ($(HARDWARE_MOTHERBOARD),1134)
-# TriGorilla Anycubic version 1.4 Rev 1.1
+# TriGorilla Anycubic version 1.4 based on RAMPS EFB
else ifeq ($(HARDWARE_MOTHERBOARD),1135)
-# Creality: Ender-4, CR-8
+# TriGorilla Anycubic version 1.4 Rev 1.1
else ifeq ($(HARDWARE_MOTHERBOARD),1136)
-# Creality: CR10S, CR20, CR-X
+# Creality: Ender-4, CR-8
else ifeq ($(HARDWARE_MOTHERBOARD),1137)
-# Dagoma F5
+# Creality: CR10S, CR20, CR-X
else ifeq ($(HARDWARE_MOTHERBOARD),1138)
-# FYSETC F6 1.3
+# Dagoma F5
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
-# FYSETC F6 1.5
+# FYSETC F6 1.3
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
-# Duplicator i3 Plus
+# FYSETC F6 1.5
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
-# VORON
+# Duplicator i3 Plus
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
-# TRONXY V3 1.0
+# VORON
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
-# Z-Bolt X Series
+# TRONXY V3 1.0
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
-# TT OSCAR
+# Z-Bolt X Series
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
-# Overlord/Overlord Pro
+# TT OSCAR
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
-# ADIMLab Gantry v1
+# Overlord/Overlord Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
-# ADIMLab Gantry v2
+# ADIMLab Gantry v1
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
-# BIQU Tango V1
+# ADIMLab Gantry v2
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
-# MKS GEN L V2
+# BIQU Tango V1
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
-# MKS GEN L V2.1
+# MKS GEN L V2
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
-# Copymaster 3D
+# MKS GEN L V2.1
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
-# Ortur 4
+# Copymaster 3D
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
-# Tenlog D3 Hero
+# Ortur 4
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
+# Tenlog D3 Hero
+else ifeq ($(HARDWARE_MOTHERBOARD),1155)
#
# RAMBo and derivatives
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index abe5a54335c5..581c801feb88 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -57,57 +57,58 @@
#define BOARD_K8200 1101 // Velleman K8200 Controller (derived from 3Drag Controller)
#define BOARD_K8400 1102 // Velleman K8400 Controller (derived from 3Drag Controller)
#define BOARD_K8600 1103 // Velleman K8600 Controller (Vertex Nano)
-#define BOARD_BAM_DICE 1104 // 2PrintBeta BAM&DICE with STK drivers
-#define BOARD_BAM_DICE_DUE 1105 // 2PrintBeta BAM&DICE Due with STK drivers
-#define BOARD_MKS_BASE 1106 // MKS BASE v1.0
-#define BOARD_MKS_BASE_14 1107 // MKS BASE v1.4 with Allegro A4982 stepper drivers
-#define BOARD_MKS_BASE_15 1108 // MKS BASE v1.5 with Allegro A4982 stepper drivers
-#define BOARD_MKS_BASE_16 1109 // MKS BASE v1.6 with Allegro A4982 stepper drivers
-#define BOARD_MKS_BASE_HEROIC 1110 // MKS BASE 1.0 with Heroic HR4982 stepper drivers
-#define BOARD_MKS_GEN_13 1111 // MKS GEN v1.3 or 1.4
-#define BOARD_MKS_GEN_L 1112 // MKS GEN L
-#define BOARD_KFB_2 1113 // BigTreeTech or BIQU KFB2.0
-#define BOARD_ZRIB_V20 1114 // zrib V2.0 control board (Chinese knock off RAMPS replica)
-#define BOARD_FELIX2 1115 // Felix 2.0+ Electronics Board (RAMPS like)
-#define BOARD_RIGIDBOARD 1116 // Invent-A-Part RigidBoard
-#define BOARD_RIGIDBOARD_V2 1117 // Invent-A-Part RigidBoard V2
-#define BOARD_SAINSMART_2IN1 1118 // Sainsmart 2-in-1 board
-#define BOARD_ULTIMAKER 1119 // Ultimaker
-#define BOARD_ULTIMAKER_OLD 1120 // Ultimaker (Older electronics. Pre 1.5.4. This is rare)
-#define BOARD_AZTEEG_X3 1121 // Azteeg X3
-#define BOARD_AZTEEG_X3_PRO 1122 // Azteeg X3 Pro
-#define BOARD_ULTIMAIN_2 1123 // Ultimainboard 2.x (Uses TEMP_SENSOR 20)
-#define BOARD_RUMBA 1124 // Rumba
-#define BOARD_RUMBA_RAISE3D 1125 // Raise3D N series Rumba derivative
-#define BOARD_RL200 1126 // Rapide Lite 200 (v1, low-cost RUMBA clone with drv)
-#define BOARD_FORMBOT_TREX2PLUS 1127 // Formbot T-Rex 2 Plus
-#define BOARD_FORMBOT_TREX3 1128 // Formbot T-Rex 3
-#define BOARD_FORMBOT_RAPTOR 1129 // Formbot Raptor
-#define BOARD_FORMBOT_RAPTOR2 1130 // Formbot Raptor 2
-#define BOARD_BQ_ZUM_MEGA_3D 1131 // bq ZUM Mega 3D
-#define BOARD_MAKEBOARD_MINI 1132 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake
-#define BOARD_TRIGORILLA_13 1133 // TriGorilla Anycubic version 1.3-based on RAMPS EFB
-#define BOARD_TRIGORILLA_14 1134 // ... Ver 1.4
-#define BOARD_TRIGORILLA_14_11 1135 // ... Rev 1.1 (new servo pin order)
-#define BOARD_RAMPS_ENDER_4 1136 // Creality: Ender-4, CR-8
-#define BOARD_RAMPS_CREALITY 1137 // Creality: CR10S, CR20, CR-X
-#define BOARD_RAMPS_DAGOMA 1138 // Dagoma F5
-#define BOARD_FYSETC_F6_13 1139 // FYSETC F6 1.3
-#define BOARD_FYSETC_F6_14 1140 // FYSETC F6 1.4
-#define BOARD_DUPLICATOR_I3_PLUS 1141 // Wanhao Duplicator i3 Plus
-#define BOARD_VORON 1142 // VORON Design
-#define BOARD_TRONXY_V3_1_0 1143 // Tronxy TRONXY-V3-1.0
-#define BOARD_Z_BOLT_X_SERIES 1144 // Z-Bolt X Series
-#define BOARD_TT_OSCAR 1145 // TT OSCAR
-#define BOARD_OVERLORD 1146 // Overlord/Overlord Pro
-#define BOARD_HJC2560C_REV1 1147 // ADIMLab Gantry v1
-#define BOARD_HJC2560C_REV2 1148 // ADIMLab Gantry v2
-#define BOARD_TANGO 1149 // BIQU Tango V1
-#define BOARD_MKS_GEN_L_V2 1150 // MKS GEN L V2
-#define BOARD_MKS_GEN_L_V21 1151 // MKS GEN L V2.1
-#define BOARD_COPYMASTER_3D 1152 // Copymaster 3D
-#define BOARD_ORTUR_4 1153 // Ortur 4
-#define BOARD_TENLOG_D3_HERO 1154 // Tenlog D3 Hero IDEX printer
+#define BOARD_K8800 1104 // Velleman K8800 Controller (Vertex Delta)
+#define BOARD_BAM_DICE 1105 // 2PrintBeta BAM&DICE with STK drivers
+#define BOARD_BAM_DICE_DUE 1106 // 2PrintBeta BAM&DICE Due with STK drivers
+#define BOARD_MKS_BASE 1107 // MKS BASE v1.0
+#define BOARD_MKS_BASE_14 1108 // MKS BASE v1.4 with Allegro A4982 stepper drivers
+#define BOARD_MKS_BASE_15 1109 // MKS BASE v1.5 with Allegro A4982 stepper drivers
+#define BOARD_MKS_BASE_16 1110 // MKS BASE v1.6 with Allegro A4982 stepper drivers
+#define BOARD_MKS_BASE_HEROIC 1111 // MKS BASE 1.0 with Heroic HR4982 stepper drivers
+#define BOARD_MKS_GEN_13 1112 // MKS GEN v1.3 or 1.4
+#define BOARD_MKS_GEN_L 1113 // MKS GEN L
+#define BOARD_KFB_2 1114 // BigTreeTech or BIQU KFB2.0
+#define BOARD_ZRIB_V20 1115 // zrib V2.0 control board (Chinese knock off RAMPS replica)
+#define BOARD_FELIX2 1116 // Felix 2.0+ Electronics Board (RAMPS like)
+#define BOARD_RIGIDBOARD 1117 // Invent-A-Part RigidBoard
+#define BOARD_RIGIDBOARD_V2 1118 // Invent-A-Part RigidBoard V2
+#define BOARD_SAINSMART_2IN1 1119 // Sainsmart 2-in-1 board
+#define BOARD_ULTIMAKER 1120 // Ultimaker
+#define BOARD_ULTIMAKER_OLD 1121 // Ultimaker (Older electronics. Pre 1.5.4. This is rare)
+#define BOARD_AZTEEG_X3 1122 // Azteeg X3
+#define BOARD_AZTEEG_X3_PRO 1123 // Azteeg X3 Pro
+#define BOARD_ULTIMAIN_2 1124 // Ultimainboard 2.x (Uses TEMP_SENSOR 20)
+#define BOARD_RUMBA 1125 // Rumba
+#define BOARD_RUMBA_RAISE3D 1126 // Raise3D N series Rumba derivative
+#define BOARD_RL200 1127 // Rapide Lite 200 (v1, low-cost RUMBA clone with drv)
+#define BOARD_FORMBOT_TREX2PLUS 1128 // Formbot T-Rex 2 Plus
+#define BOARD_FORMBOT_TREX3 1129 // Formbot T-Rex 3
+#define BOARD_FORMBOT_RAPTOR 1130 // Formbot Raptor
+#define BOARD_FORMBOT_RAPTOR2 1131 // Formbot Raptor 2
+#define BOARD_BQ_ZUM_MEGA_3D 1132 // bq ZUM Mega 3D
+#define BOARD_MAKEBOARD_MINI 1133 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake
+#define BOARD_TRIGORILLA_13 1134 // TriGorilla Anycubic version 1.3-based on RAMPS EFB
+#define BOARD_TRIGORILLA_14 1135 // ... Ver 1.4
+#define BOARD_TRIGORILLA_14_11 1136 // ... Rev 1.1 (new servo pin order)
+#define BOARD_RAMPS_ENDER_4 1137 // Creality: Ender-4, CR-8
+#define BOARD_RAMPS_CREALITY 1138 // Creality: CR10S, CR20, CR-X
+#define BOARD_RAMPS_DAGOMA 1139 // Dagoma F5
+#define BOARD_FYSETC_F6_13 1140 // FYSETC F6 1.3
+#define BOARD_FYSETC_F6_14 1141 // FYSETC F6 1.4
+#define BOARD_DUPLICATOR_I3_PLUS 1142 // Wanhao Duplicator i3 Plus
+#define BOARD_VORON 1143 // VORON Design
+#define BOARD_TRONXY_V3_1_0 1144 // Tronxy TRONXY-V3-1.0
+#define BOARD_Z_BOLT_X_SERIES 1145 // Z-Bolt X Series
+#define BOARD_TT_OSCAR 1146 // TT OSCAR
+#define BOARD_OVERLORD 1147 // Overlord/Overlord Pro
+#define BOARD_HJC2560C_REV1 1148 // ADIMLab Gantry v1
+#define BOARD_HJC2560C_REV2 1149 // ADIMLab Gantry v2
+#define BOARD_TANGO 1150 // BIQU Tango V1
+#define BOARD_MKS_GEN_L_V2 1151 // MKS GEN L V2
+#define BOARD_MKS_GEN_L_V21 1152 // MKS GEN L V2.1
+#define BOARD_COPYMASTER_3D 1153 // Copymaster 3D
+#define BOARD_ORTUR_4 1154 // Ortur 4
+#define BOARD_TENLOG_D3_HERO 1155 // Tenlog D3 Hero IDEX printer
//
// RAMBo and derivatives
@@ -357,10 +358,13 @@
#define BOARD_THE_BORG 5000 // THE-BORG (Power outputs: Hotend0, Hotend1, Bed, Fan)
#define BOARD_REMRAM_V1 5001 // RemRam v1
+#define BOARD_TEENSY41 5002 // Teensy4.0 and Teensy4.1
+#define BOARD_T41U5XBB 5003 // T41U5XBB Teensy4.1 breakout board
//
// Espressif ESP32 WiFi
//
+
#define BOARD_ESPRESSIF_ESP32 6000 // Generic ESP32
#define BOARD_MRR_ESPA 6001 // MRR ESPA board based on ESP32 (native pins only)
#define BOARD_MRR_ESPE 6002 // MRR ESPE board based on ESP32 (with I2S stepper stream)
@@ -369,11 +373,13 @@
//
// SAMD51 ARM Cortex M4
//
+
#define BOARD_AGCM4_RAMPS_144 6100 // RAMPS 1.4.4
//
// Custom board
//
+
#define BOARD_CUSTOM 9998 // Custom pins definition for development and/or rare boards
//
From ff8a7e2d31678b629b5197c19aea0f39d391637f Mon Sep 17 00:00:00 2001
From: makerbase-mks <4146049@qq.com>
Date: Mon, 21 Sep 2020 12:02:18 +0800
Subject: [PATCH 17/33] Fix MKS SGEN_L V2 FAN pins
---
Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
index 2d09fe1feae5..7ebbca5742dc 100644
--- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
@@ -208,8 +208,8 @@
#define HEATER_BED_PIN P2_05
#define HEATER_0_PIN P2_07
#if HOTENDS == 1
- #ifndef FAN1_PIN
- #define FAN1_PIN P2_06
+ #ifndef FAN2_PIN
+ #define FAN2_PIN P2_06 //HE1 for FAN3
#endif
#else
#ifndef HEATER_1_PIN
@@ -217,10 +217,10 @@
#endif
#endif
#ifndef FAN_PIN
- #define FAN_PIN P2_04
+ #define FAN_PIN P2_04 //FAN1
#endif
-#ifndef FAN2_PIN
- #define FAN2_PIN P1_04
+#ifndef FAN1_PIN
+ #define FAN1_PIN P1_04 //FAN2
#endif
//
From fe2f3cdbdeec0f4b7c203b141b4672877dc9be52 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Tue, 22 Sep 2020 15:55:42 -0500
Subject: [PATCH 18/33] Update pins_MKS_SGEN_L_V2.h
---
Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
index 7ebbca5742dc..b6f11a133daf 100644
--- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
@@ -207,20 +207,20 @@
//
#define HEATER_BED_PIN P2_05
#define HEATER_0_PIN P2_07
-#if HOTENDS == 1
- #ifndef FAN2_PIN
- #define FAN2_PIN P2_06 //HE1 for FAN3
- #endif
-#else
+#if HAS_MULTI_HOTEND
#ifndef HEATER_1_PIN
#define HEATER_1_PIN P2_06
#endif
+#else
+ #ifndef FAN2_PIN
+ #define FAN2_PIN P2_06 // HE1 for FAN3
+ #endif
#endif
#ifndef FAN_PIN
- #define FAN_PIN P2_04 //FAN1
+ #define FAN_PIN P2_04 // FAN1
#endif
#ifndef FAN1_PIN
- #define FAN1_PIN P1_04 //FAN2
+ #define FAN1_PIN P1_04 // FAN2
#endif
//
From b39f490c4f570aaae1d8c74206f92cb89618ff78 Mon Sep 17 00:00:00 2001
From: mks-viva <1224833100@qq.com>
Date: Fri, 16 Oct 2020 09:38:49 +0800
Subject: [PATCH 19/33] Add RGB LED pin define for MKS SGEN_L V2
---
Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
index e18f938dc45e..26cd094255df 100644
--- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
@@ -227,9 +227,18 @@
// Misc. Functions
//
#define LED_PIN P1_18 // Used as a status indicator
-#define LED2_PIN P1_19
-#define LED3_PIN P1_20
-#define LED4_PIN P1_21
+//#define LED2_PIN P1_19
+//#define LED3_PIN P1_20
+//#define LED4_PIN P1_21
+
+//
+// RGB LED
+//
+#if ENABLED(RGB_LED)
+ #define RGB_LED_R_PIN P1_19
+ #define RGB_LED_G_PIN P1_20
+ #define RGB_LED_B_PIN P1_21
+#endif
/**
* _____ _____
From b7ae0f9a96046124d579d9c3735ab08a5c35dd4a Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Fri, 16 Oct 2020 02:15:12 -0500
Subject: [PATCH 20/33] Update pins_MKS_SGEN_L_V2.h
---
Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
index 26cd094255df..1a558075b60e 100644
--- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
@@ -227,17 +227,24 @@
// Misc. Functions
//
#define LED_PIN P1_18 // Used as a status indicator
-//#define LED2_PIN P1_19
-//#define LED3_PIN P1_20
-//#define LED4_PIN P1_21
//
// RGB LED
//
#if ENABLED(RGB_LED)
- #define RGB_LED_R_PIN P1_19
- #define RGB_LED_G_PIN P1_20
- #define RGB_LED_B_PIN P1_21
+ #ifndef RGB_LED_R_PIN
+ #define RGB_LED_R_PIN P1_19
+ #endif
+ #ifndef RGB_LED_G_PIN
+ #define RGB_LED_G_PIN P1_20
+ #endif
+ #ifndef RGB_LED_B_PIN
+ #define RGB_LED_B_PIN P1_21
+ #endif
+#else
+ #define LED2_PIN P1_19 // Initialized by HAL/LPC1768/main.cpp
+ #define LED3_PIN P1_20
+ #define LED4_PIN P1_21
#endif
/**
From e64c05552adf2fe0aab799be2d45b84ddb624a36 Mon Sep 17 00:00:00 2001
From: mks-viva <1224833100@qq.com>
Date: Fri, 20 Nov 2020 14:23:57 +0800
Subject: [PATCH 21/33] Add support for MKS Robin E3/E3D V1.1 motherboard
---
Marlin/Configuration.h | 2 +-
Marlin/src/core/boards.h | 2 +
Marlin/src/pins/pins.h | 4 +
.../pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h | 67 +++++++
.../src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h | 36 ++++
.../stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h | 187 ++++++++++++++++++
6 files changed, 297 insertions(+), 1 deletion(-)
create mode 100644 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
create mode 100644 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
create mode 100644 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 9d2dd0b710ba..4d4decf70a6d 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -1743,7 +1743,7 @@
* SD Card support is disabled by default. If your controller has an SD slot,
* you must uncomment the following option or it won't work.
*/
-//#define SDSUPPORT
+#define SDSUPPORT
/**
* SD CARD: SPI SPEED
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index e68ba196ee81..4193849df1ad 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -329,6 +329,8 @@
#define BOARD_TRIGORILLA_PRO 4037 // Trigorilla Pro (STM32F103ZET6)
#define BOARD_FLY_MINI 4038 // FLY MINI (STM32F103RCT6)
#define BOARD_FLSUN_HISPEED 4039 // FLSUN HiSpeedV1 (STM32F103VET6)
+#define BOARD_MKS_ROBIN_E3_V1_1 4040 // MKS Robin E3 V1.1 (STM32F103RCT6)
+#define BOARD_MKS_ROBIN_E3D_V1_1 4041 // MKS Robin E3D V1.1 (STM32F103RCT6)
//
// ARM Cortex-M4F
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index af3b72475660..d6882ebe9b24 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -554,6 +554,10 @@
#include "stm32f1/pins_MKS_ROBIN_E3.h" // STM32F1 env:mks_robin_e3
#elif MB(MKS_ROBIN_E3D)
#include "stm32f1/pins_MKS_ROBIN_E3D.h" // STM32F1 env:mks_robin_e3
+#elif MB(MKS_ROBIN_E3_V1_1)
+ #include "stm32f1/pins_MKS_ROBIN_E3_V1_1.h" // STM32F1 env:mks_robin_e3
+#elif MB(MKS_ROBIN_E3D_V1_1)
+ #include "stm32f1/pins_MKS_ROBIN_E3D_V1_1.h" // STM32F1 env:mks_robin_e3
#elif MB(MKS_ROBIN_E3P)
#include "stm32f1/pins_MKS_ROBIN_E3P.h" // STM32F1 env:mks_robin_e3p
#elif MB(BTT_SKR_MINI_V1_1)
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
new file mode 100644
index 000000000000..18b52b76203e
--- /dev/null
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
@@ -0,0 +1,67 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * MKS Robin E3D (STM32F103RCT6) board pin assignments
+ */
+
+#if HOTENDS > 1 || E_STEPPERS > 1
+ #error "MKS Robin E3D supports up to 1 hotends / E-steppers. Comment out this line to continue."
+#endif
+
+#ifndef BOARD_INFO_NAME
+ #define BOARD_INFO_NAME "MKS Robin E3D V1.1"
+#endif
+
+//
+// Steppers
+//
+#ifndef X_CS_PIN
+ #define X_CS_PIN PC7
+#endif
+#ifndef Y_CS_PIN
+ #define Y_CS_PIN PD2
+#endif
+#ifndef Z_CS_PIN
+ #define Z_CS_PIN PC12
+#endif
+#ifndef E0_CS_PIN
+ #define E0_CS_PIN PC11
+#endif
+
+//
+// Software SPI pins for TMC2130 stepper drivers
+//
+#if ENABLED(TMC_USE_SW_SPI)
+ #ifndef TMC_SW_MOSI
+ #define TMC_SW_MOSI PB15
+ #endif
+ #ifndef TMC_SW_MISO
+ #define TMC_SW_MISO PB14
+ #endif
+ #ifndef TMC_SW_SCK
+ #define TMC_SW_SCK PB13
+ #endif
+#endif
+
+#include "pins_MKS_ROBIN_E3_V1_1_common.h"
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
new file mode 100644
index 000000000000..aef4c9956627
--- /dev/null
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
@@ -0,0 +1,36 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * MKS Robin E3 (STM32F103RCT6) board pin assignments
+ */
+
+#if HOTENDS > 1 || E_STEPPERS > 1
+ #error "MKS Robin E3 supports up to 1 hotends / E-steppers. Comment out this line to continue."
+#endif
+
+#ifndef BOARD_INFO_NAME
+ #define BOARD_INFO_NAME "MKS Robin E3 V1.1"
+#endif
+
+#include "pins_MKS_ROBIN_E3_V1_1_common.h"
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h
new file mode 100644
index 000000000000..2da5a3300442
--- /dev/null
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h
@@ -0,0 +1,187 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * MKS Robin E3 & E3D (STM32F103RCT6) common board pin assignments
+ */
+
+#if NOT_TARGET(__STM32F1__)
+ #error "Oops! Select an STM32F1 board in 'Tools > Board.'"
+#endif
+
+#define BOARD_NO_NATIVE_USB
+
+#define BOARD_WEBSITE_URL "github.com/makerbase-mks"
+
+//#define DISABLE_DEBUG
+#define DISABLE_JTAG
+
+//
+// EEPROM
+//
+// Onboard I2C EEPROM
+#if NO_EEPROM_SELECTED
+ #define I2C_EEPROM
+ #define MARLIN_EEPROM_SIZE 0x1000// 4KB
+ #undef NO_EEPROM_SELECTED
+#endif
+
+//
+// Servos
+//
+#define SERVO0_PIN PA3
+
+//
+// Limit Switches
+//
+#define X_STOP_PIN PA12
+#define Y_STOP_PIN PA11
+#define Z_MIN_PIN PC6
+#define Z_MAX_PIN PB1
+
+//
+// Steppers
+//
+#define X_STEP_PIN PC0
+#define X_DIR_PIN PB2
+#define X_ENABLE_PIN PC13
+
+#define Y_STEP_PIN PC2
+#define Y_DIR_PIN PB9
+#define Y_ENABLE_PIN PB12
+
+#define Z_STEP_PIN PC14
+#define Z_DIR_PIN PC15
+#define Z_ENABLE_PIN PB8
+
+#define E0_STEP_PIN PB4
+#define E0_DIR_PIN PB3
+#define E0_ENABLE_PIN PB5
+
+#if HAS_TMC220x
+ /**
+ * TMC2208/TMC2209 stepper drivers
+ *
+ * Hardware serial communication ports.
+ * If undefined software serial is used according to the pins below
+ */
+ //#define X_HARDWARE_SERIAL MSerial1
+ //#define Y_HARDWARE_SERIAL MSerial1
+ //#define Z_HARDWARE_SERIAL MSerial1
+ //#define E0_HARDWARE_SERIAL MSerial1
+
+ //
+ // Software serial
+ //
+ #define X_SERIAL_TX_PIN PC7
+ #define X_SERIAL_RX_PIN PC7
+
+ #define Y_SERIAL_TX_PIN PD2
+ #define Y_SERIAL_RX_PIN PD2
+
+ #define Z_SERIAL_TX_PIN PC12
+ #define Z_SERIAL_RX_PIN PC12
+
+ #define E0_SERIAL_TX_PIN PC11
+ #define E0_SERIAL_RX_PIN PC11
+
+ // Reduce baud rate to improve software serial reliability
+ #define TMC_BAUD_RATE 19200
+#endif
+
+//
+// Heaters 0,1 / Fans / Bed
+//
+#define HEATER_0_PIN PC9
+#define FAN_PIN PA8
+#define HEATER_BED_PIN PC8
+
+//
+// Temperature Sensors
+//
+#define TEMP_BED_PIN PA1 // TB
+#define TEMP_0_PIN PA0 // TH1
+
+#define FIL_RUNOUT_PIN PB10 // MT_DET
+
+/**
+ * _____ _____ _____
+ * (BEEPER) PC1 | 1 2 | PC3 (BTN_ENC) (MISO) PB14 | 1 2 | PB13 (SD_SCK) 5V | 1 2 | GND
+ * (LCD_EN) PA4 | 3 4 | PA5 (LCD_RS) (BTN_EN1) PB11 | 3 4 | PA15 (SD_SS) (LCD_EN) PA4 | 3 4 | PA5 (LCD_RS)
+ * (LCD_D4) PA6 | 5 6 PA7 (LCD_D5) (BTN_EN2) PB0 | 5 6 PB15 (SD_MOSI) (LCD_D4) PA6 | 5 6 PB0 (BTN_EN2)
+ * (LCD_D6) PC4 | 7 8 | PC5 (LCD_D7) (SD_DETECT) PC10 | 7 8 | RESET RESET | 7 8 | PB11 (BTN_EN1)
+ * GND | 9 10| 5V GND | 9 10| NC (BTN_ENC) PC3 | 9 10| PC1 (BEEPER)
+ * ----- ----- -----
+ * EXP1 EXP2 EXP3
+ */
+#if HAS_WIRED_LCD
+
+ #define BEEPER_PIN PC1
+ #define BTN_ENC PC3
+ #define LCD_PINS_ENABLE PA4
+ #define LCD_PINS_RS PA5
+ #define BTN_EN1 PB11
+ #define BTN_EN2 PB0
+
+ // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor)
+ #if ENABLED(MKS_MINI_12864)
+
+ #define LCD_BACKLIGHT_PIN -1
+ #define LCD_RESET_PIN -1
+ #define DOGLCD_A0 PC4
+ #define DOGLCD_CS PA7
+ #define DOGLCD_SCK PB13
+ #define DOGLCD_MOSI PB15
+
+ #else
+
+ #define LCD_PINS_D4 PA6
+ #if IS_ULTIPANEL
+ #define LCD_PINS_D5 PA7
+ #define LCD_PINS_D6 PC4
+ #define LCD_PINS_D7 PC5
+ #endif
+
+ #endif // !MKS_MINI_12864
+
+#endif // HAS_WIRED_LCD
+
+//
+// SD Card
+//
+#define SPI_DEVICE 2
+#define SD_DETECT_PIN PC10
+#define SCK_PIN PB13
+#define MISO_PIN PB14
+#define MOSI_PIN PB15
+#define SS_PIN PA15
+
+#ifndef BOARD_ST7920_DELAY_1
+ #define BOARD_ST7920_DELAY_1 DELAY_NS(125)
+#endif
+#ifndef BOARD_ST7920_DELAY_2
+ #define BOARD_ST7920_DELAY_2 DELAY_NS(125)
+#endif
+#ifndef BOARD_ST7920_DELAY_3
+ #define BOARD_ST7920_DELAY_3 DELAY_NS(125)
+#endif
From 60a264a11a152e296157caa13ad12d520ed6c26e Mon Sep 17 00:00:00 2001
From: mks-viva <1224833100@qq.com>
Date: Fri, 20 Nov 2020 14:50:42 +0800
Subject: [PATCH 22/33] Update Configuration.h
---
Marlin/Configuration.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 4d4decf70a6d..9d2dd0b710ba 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -1743,7 +1743,7 @@
* SD Card support is disabled by default. If your controller has an SD slot,
* you must uncomment the following option or it won't work.
*/
-#define SDSUPPORT
+//#define SDSUPPORT
/**
* SD CARD: SPI SPEED
From 0657f35bc05555a3f7a5736e2b61d63a75bd3328 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Thu, 26 Nov 2020 00:52:23 -0600
Subject: [PATCH 23/33] Update pins.h
---
Marlin/src/pins/pins.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index 909a44491b00..676e1133102a 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -552,10 +552,10 @@
#include "stm32f1/pins_MKS_ROBIN_PRO.h" // STM32F1 env:mks_robin_pro
#elif MB(MKS_ROBIN_E3)
#include "stm32f1/pins_MKS_ROBIN_E3.h" // STM32F1 env:mks_robin_e3
-#elif MB(MKS_ROBIN_E3D)
- #include "stm32f1/pins_MKS_ROBIN_E3D.h" // STM32F1 env:mks_robin_e3
#elif MB(MKS_ROBIN_E3_V1_1)
#include "stm32f1/pins_MKS_ROBIN_E3_V1_1.h" // STM32F1 env:mks_robin_e3
+#elif MB(MKS_ROBIN_E3D)
+ #include "stm32f1/pins_MKS_ROBIN_E3D.h" // STM32F1 env:mks_robin_e3
#elif MB(MKS_ROBIN_E3D_V1_1)
#include "stm32f1/pins_MKS_ROBIN_E3D_V1_1.h" // STM32F1 env:mks_robin_e3
#elif MB(MKS_ROBIN_E3P)
From 0a9b678b620553592b93e678328942c7d5b7783a Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Thu, 26 Nov 2020 01:06:24 -0600
Subject: [PATCH 24/33] Consolidate pins
---
.../pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h | 2 +-
.../src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h | 2 +-
.../stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h | 152 +-----------------
.../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 10 +-
4 files changed, 11 insertions(+), 155 deletions(-)
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
index 18b52b76203e..5739c2184018 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
@@ -26,7 +26,7 @@
*/
#if HOTENDS > 1 || E_STEPPERS > 1
- #error "MKS Robin E3D supports up to 1 hotends / E-steppers. Comment out this line to continue."
+ #error "MKS Robin E3D v1.1 only supports one hotend / E-stepper. Comment out this line to continue."
#endif
#ifndef BOARD_INFO_NAME
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
index aef4c9956627..bb134eb794ff 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
@@ -26,7 +26,7 @@
*/
#if HOTENDS > 1 || E_STEPPERS > 1
- #error "MKS Robin E3 supports up to 1 hotends / E-steppers. Comment out this line to continue."
+ #error "MKS Robin E3 v1.1 only supports one hotend / E-stepper. Comment out this line to continue."
#endif
#ifndef BOARD_INFO_NAME
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h
index 2da5a3300442..4eaf2e946939 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h
@@ -21,21 +21,6 @@
*/
#pragma once
-/**
- * MKS Robin E3 & E3D (STM32F103RCT6) common board pin assignments
- */
-
-#if NOT_TARGET(__STM32F1__)
- #error "Oops! Select an STM32F1 board in 'Tools > Board.'"
-#endif
-
-#define BOARD_NO_NATIVE_USB
-
-#define BOARD_WEBSITE_URL "github.com/makerbase-mks"
-
-//#define DISABLE_DEBUG
-#define DISABLE_JTAG
-
//
// EEPROM
//
@@ -46,142 +31,9 @@
#undef NO_EEPROM_SELECTED
#endif
-//
-// Servos
-//
-#define SERVO0_PIN PA3
-
-//
-// Limit Switches
-//
-#define X_STOP_PIN PA12
-#define Y_STOP_PIN PA11
-#define Z_MIN_PIN PC6
-#define Z_MAX_PIN PB1
-
-//
-// Steppers
-//
-#define X_STEP_PIN PC0
-#define X_DIR_PIN PB2
-#define X_ENABLE_PIN PC13
-
-#define Y_STEP_PIN PC2
-#define Y_DIR_PIN PB9
-#define Y_ENABLE_PIN PB12
-
#define Z_STEP_PIN PC14
#define Z_DIR_PIN PC15
-#define Z_ENABLE_PIN PB8
-
-#define E0_STEP_PIN PB4
-#define E0_DIR_PIN PB3
-#define E0_ENABLE_PIN PB5
-
-#if HAS_TMC220x
- /**
- * TMC2208/TMC2209 stepper drivers
- *
- * Hardware serial communication ports.
- * If undefined software serial is used according to the pins below
- */
- //#define X_HARDWARE_SERIAL MSerial1
- //#define Y_HARDWARE_SERIAL MSerial1
- //#define Z_HARDWARE_SERIAL MSerial1
- //#define E0_HARDWARE_SERIAL MSerial1
-
- //
- // Software serial
- //
- #define X_SERIAL_TX_PIN PC7
- #define X_SERIAL_RX_PIN PC7
-
- #define Y_SERIAL_TX_PIN PD2
- #define Y_SERIAL_RX_PIN PD2
-
- #define Z_SERIAL_TX_PIN PC12
- #define Z_SERIAL_RX_PIN PC12
-
- #define E0_SERIAL_TX_PIN PC11
- #define E0_SERIAL_RX_PIN PC11
- // Reduce baud rate to improve software serial reliability
- #define TMC_BAUD_RATE 19200
-#endif
-
-//
-// Heaters 0,1 / Fans / Bed
-//
-#define HEATER_0_PIN PC9
-#define FAN_PIN PA8
-#define HEATER_BED_PIN PC8
-
-//
-// Temperature Sensors
-//
-#define TEMP_BED_PIN PA1 // TB
-#define TEMP_0_PIN PA0 // TH1
-
-#define FIL_RUNOUT_PIN PB10 // MT_DET
-
-/**
- * _____ _____ _____
- * (BEEPER) PC1 | 1 2 | PC3 (BTN_ENC) (MISO) PB14 | 1 2 | PB13 (SD_SCK) 5V | 1 2 | GND
- * (LCD_EN) PA4 | 3 4 | PA5 (LCD_RS) (BTN_EN1) PB11 | 3 4 | PA15 (SD_SS) (LCD_EN) PA4 | 3 4 | PA5 (LCD_RS)
- * (LCD_D4) PA6 | 5 6 PA7 (LCD_D5) (BTN_EN2) PB0 | 5 6 PB15 (SD_MOSI) (LCD_D4) PA6 | 5 6 PB0 (BTN_EN2)
- * (LCD_D6) PC4 | 7 8 | PC5 (LCD_D7) (SD_DETECT) PC10 | 7 8 | RESET RESET | 7 8 | PB11 (BTN_EN1)
- * GND | 9 10| 5V GND | 9 10| NC (BTN_ENC) PC3 | 9 10| PC1 (BEEPER)
- * ----- ----- -----
- * EXP1 EXP2 EXP3
- */
-#if HAS_WIRED_LCD
-
- #define BEEPER_PIN PC1
- #define BTN_ENC PC3
- #define LCD_PINS_ENABLE PA4
- #define LCD_PINS_RS PA5
- #define BTN_EN1 PB11
- #define BTN_EN2 PB0
+#define BTN_ENC_EN -1
- // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor)
- #if ENABLED(MKS_MINI_12864)
-
- #define LCD_BACKLIGHT_PIN -1
- #define LCD_RESET_PIN -1
- #define DOGLCD_A0 PC4
- #define DOGLCD_CS PA7
- #define DOGLCD_SCK PB13
- #define DOGLCD_MOSI PB15
-
- #else
-
- #define LCD_PINS_D4 PA6
- #if IS_ULTIPANEL
- #define LCD_PINS_D5 PA7
- #define LCD_PINS_D6 PC4
- #define LCD_PINS_D7 PC5
- #endif
-
- #endif // !MKS_MINI_12864
-
-#endif // HAS_WIRED_LCD
-
-//
-// SD Card
-//
-#define SPI_DEVICE 2
-#define SD_DETECT_PIN PC10
-#define SCK_PIN PB13
-#define MISO_PIN PB14
-#define MOSI_PIN PB15
-#define SS_PIN PA15
-
-#ifndef BOARD_ST7920_DELAY_1
- #define BOARD_ST7920_DELAY_1 DELAY_NS(125)
-#endif
-#ifndef BOARD_ST7920_DELAY_2
- #define BOARD_ST7920_DELAY_2 DELAY_NS(125)
-#endif
-#ifndef BOARD_ST7920_DELAY_3
- #define BOARD_ST7920_DELAY_3 DELAY_NS(125)
-#endif
+#include "pins_MKS_ROBIN_E3_common.h"
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h
index c2b7e52067c1..1362d2208619 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h
@@ -70,8 +70,12 @@
#define Y_DIR_PIN PB9
#define Y_ENABLE_PIN PB12
-#define Z_STEP_PIN PB7
-#define Z_DIR_PIN PB6
+#ifndef Z_STEP_PIN
+ #define Z_STEP_PIN PB7
+#endif
+#ifndef Z_DIR_PIN
+ #define Z_DIR_PIN PB6
+#endif
#define Z_ENABLE_PIN PB8
#define E0_STEP_PIN PB4
@@ -161,7 +165,7 @@
#define LCD_PINS_D6 PC4
#define LCD_PINS_D7 PC5
- #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
+ #if !defined(BTN_ENC_EN) && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
#define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder
#endif
From 9a2066358f8ee5391f77f7628a58a92aa170f8d7 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Thu, 26 Nov 2020 01:10:18 -0600
Subject: [PATCH 25/33] Tweak comments
---
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h | 2 +-
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
index 5739c2184018..0d927cf7cb6a 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
@@ -22,7 +22,7 @@
#pragma once
/**
- * MKS Robin E3D (STM32F103RCT6) board pin assignments
+ * MKS Robin E3D v1.1 (STM32F103RCT6) board pin assignments
*/
#if HOTENDS > 1 || E_STEPPERS > 1
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
index bb134eb794ff..002c35fe54c1 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
@@ -22,7 +22,7 @@
#pragma once
/**
- * MKS Robin E3 (STM32F103RCT6) board pin assignments
+ * MKS Robin E3 v1.1 (STM32F103RCT6) board pin assignments
*/
#if HOTENDS > 1 || E_STEPPERS > 1
From c05e1ce0c8f522e157fbf80a043d1c75a9cdaf2e Mon Sep 17 00:00:00 2001
From: mks-viva <1224833100@qq.com>
Date: Fri, 22 Jan 2021 14:45:35 +0800
Subject: [PATCH 26/33] Update to the latest marlin
---
.github/workflows/test-builds.yml | 2 +-
.gitignore | 4 +-
Makefile | 4 -
Marlin/Configuration.h | 146 +-
Marlin/Configuration_adv.h | 159 +-
Marlin/Version.h | 4 +-
Marlin/src/HAL/AVR/HAL.h | 7 +
Marlin/src/HAL/AVR/HAL_SPI.cpp | 28 +-
Marlin/src/HAL/AVR/endstop_interrupts.h | 34 +-
Marlin/src/HAL/AVR/spi_pins.h | 16 +-
Marlin/src/HAL/DUE/HAL.h | 18 +-
Marlin/src/HAL/DUE/HAL_SPI.cpp | 88 +-
.../dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp | 15 +-
.../HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp | 3 -
Marlin/src/HAL/DUE/fastio.h | 2 +-
Marlin/src/HAL/DUE/inc/SanityCheck.h | 2 +-
Marlin/src/HAL/DUE/spi_pins.h | 20 +-
Marlin/src/HAL/DUE/timers.cpp | 2 +-
Marlin/src/HAL/ESP32/HAL.h | 11 +-
Marlin/src/HAL/ESP32/HAL_SPI.cpp | 6 +-
Marlin/src/HAL/ESP32/Servo.h | 2 +-
Marlin/src/HAL/ESP32/Tone.cpp | 59 +
Marlin/src/HAL/ESP32/spi_pins.h | 8 +-
Marlin/src/HAL/ESP32/timers.cpp | 2 +-
Marlin/src/HAL/ESP32/timers.h | 9 +
Marlin/src/HAL/LINUX/HAL.h | 5 -
Marlin/src/HAL/LINUX/include/Arduino.h | 21 -
Marlin/src/HAL/LINUX/main.cpp | 1 -
Marlin/src/HAL/LINUX/spi_pins.h | 33 +-
Marlin/src/HAL/LPC1768/HAL.h | 18 +-
Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 41 +-
Marlin/src/HAL/LPC1768/eeprom_flash.cpp | 2 +-
Marlin/src/HAL/LPC1768/endstop_interrupts.h | 26 +-
Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 10 +-
Marlin/src/HAL/LPC1768/main.cpp | 6 +-
Marlin/src/HAL/LPC1768/spi_pins.h | 28 +-
Marlin/src/HAL/LPC1768/tft/xpt2046.h | 8 +-
Marlin/src/HAL/LPC1768/timers.h | 2 +-
.../u8g/u8g_com_HAL_LPC1768_hw_spi.cpp | 16 +-
.../u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp | 8 +-
.../u8g/u8g_com_HAL_LPC1768_sw_spi.cpp | 8 +-
Marlin/src/HAL/SAMD51/HAL.h | 10 +
Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp | 8 +-
Marlin/src/HAL/SAMD51/fastio.h | 2 +-
Marlin/src/HAL/SAMD51/spi_pins.h | 16 +-
Marlin/src/HAL/SAMD51/timers.cpp | 2 +-
Marlin/src/HAL/STM32/HAL.h | 37 +-
Marlin/src/HAL/STM32/HAL_SPI.cpp | 27 +-
Marlin/src/HAL/STM32/MarlinSPI.cpp | 13 +-
Marlin/src/HAL/STM32/MarlinSerial.cpp | 5 +-
.../src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 64 +-
Marlin/src/HAL/STM32/eeprom_flash.cpp | 17 +-
Marlin/src/HAL/STM32/eeprom_sdcard.cpp | 5 +-
Marlin/src/HAL/STM32/fast_pwm.cpp | 2 +
Marlin/src/HAL/STM32/fastio.h | 2 +-
Marlin/src/HAL/STM32/inc/SanityCheck.h | 4 +
Marlin/src/HAL/STM32/pinsDebug.h | 142 +-
Marlin/src/HAL/STM32/spi_pins.h | 16 +-
Marlin/src/HAL/STM32/tft/tft_fsmc.cpp | 67 +-
Marlin/src/HAL/STM32/tft/tft_fsmc.h | 51 +-
Marlin/src/HAL/STM32/tft/tft_spi.cpp | 113 +-
Marlin/src/HAL/STM32/tft/tft_spi.h | 7 +
Marlin/src/HAL/STM32/tft/xpt2046.cpp | 24 +-
Marlin/src/HAL/STM32/tft/xpt2046.h | 10 +-
Marlin/src/HAL/STM32/timers.cpp | 185 +-
Marlin/src/HAL/STM32/usb_host.cpp | 117 +
Marlin/src/HAL/STM32/usb_host.h | 60 +
Marlin/src/HAL/STM32/usb_serial.cpp | 3 +-
Marlin/src/HAL/STM32/watchdog.cpp | 1 -
Marlin/src/HAL/STM32F1/HAL.h | 45 +-
Marlin/src/HAL/STM32F1/HAL_SPI.cpp | 4 +-
Marlin/src/HAL/STM32F1/Servo.cpp | 2 +-
.../STM32F1/dogm/u8g_com_stm32duino_swspi.cpp | 12 +-
Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp | 3 +-
Marlin/src/HAL/STM32F1/eeprom_wired.cpp | 1 -
Marlin/src/HAL/STM32F1/fastio.h | 6 +-
Marlin/src/HAL/STM32F1/spi_pins.h | 20 +-
Marlin/src/HAL/STM32F1/tft/xpt2046.h | 8 +-
Marlin/src/HAL/TEENSY31_32/HAL.h | 11 -
Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp | 14 +-
Marlin/src/HAL/TEENSY31_32/fastio.h | 2 +-
Marlin/src/HAL/TEENSY31_32/spi_pins.h | 8 +-
Marlin/src/HAL/TEENSY35_36/HAL.h | 11 -
Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp | 14 +-
Marlin/src/HAL/TEENSY35_36/fastio.h | 2 +-
Marlin/src/HAL/TEENSY35_36/spi_pins.h | 8 +-
Marlin/src/HAL/TEENSY40_41/HAL.h | 11 -
Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp | 14 +-
Marlin/src/HAL/TEENSY40_41/spi_pins.h | 8 +-
Marlin/src/HAL/shared/Marduino.h | 16 +-
.../src/HAL/shared/backtrace/unwarm_arm.cpp | 5 +-
.../src/HAL/shared/backtrace/unwarm_thumb.cpp | 5 +-
.../src/HAL/shared/backtrace/unwarmbytab.cpp | 69 +-
Marlin/src/HAL/shared/progmem.h | 189 ++
Marlin/src/MarlinCore.cpp | 157 +-
Marlin/src/MarlinCore.h | 13 -
Marlin/src/core/boards.h | 42 +-
Marlin/src/core/language.h | 4 +-
Marlin/src/core/macros.h | 14 +-
Marlin/src/core/multi_language.h | 29 +-
Marlin/src/core/types.h | 1 -
Marlin/src/feature/backlash.cpp | 10 +-
Marlin/src/feature/bedlevel/abl/abl.cpp | 2 +-
Marlin/src/feature/bedlevel/bedlevel.h | 4 +
.../bedlevel/mbl/mesh_bed_leveling.cpp | 4 +-
Marlin/src/feature/bedlevel/ubl/ubl.cpp | 35 +-
Marlin/src/feature/bedlevel/ubl/ubl.h | 63 +-
Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 27 +-
.../src/feature/bedlevel/ubl/ubl_motion.cpp | 45 +-
Marlin/src/feature/bltouch.cpp | 11 +-
Marlin/src/feature/bltouch.h | 17 +-
Marlin/src/feature/dac/dac_dac084s085.cpp | 2 +-
.../src/feature/digipot/digipot_mcp4018.cpp | 18 +-
Marlin/src/feature/direct_stepping.h | 4 +-
Marlin/src/feature/e_parser.h | 2 -
Marlin/src/feature/encoder_i2c.cpp | 11 +-
Marlin/src/feature/fwretract.cpp | 2 +-
Marlin/src/feature/joystick.cpp | 6 +-
Marlin/src/feature/joystick.h | 1 -
Marlin/src/feature/leds/leds.h | 2 +-
Marlin/src/feature/leds/neopixel.h | 3 +
Marlin/src/feature/leds/pca9632.cpp | 48 +-
Marlin/src/feature/mmu/mmu2.cpp | 19 +-
Marlin/src/feature/pause.cpp | 69 +-
Marlin/src/feature/pause.h | 6 +-
Marlin/src/feature/power.cpp | 2 +-
Marlin/src/feature/power_monitor.cpp | 4 +-
Marlin/src/feature/power_monitor.h | 4 +-
Marlin/src/feature/powerloss.cpp | 68 +-
Marlin/src/feature/powerloss.h | 8 +-
Marlin/src/feature/repeat.cpp | 81 +
Marlin/src/feature/repeat.h | 53 +
Marlin/src/feature/runout.cpp | 3 +-
Marlin/src/feature/runout.h | 8 +-
Marlin/src/feature/solenoid.cpp | 45 +-
Marlin/src/feature/spindle_laser.cpp | 26 +-
Marlin/src/feature/spindle_laser.h | 43 +-
Marlin/src/feature/spindle_laser_types.h | 18 +-
Marlin/src/feature/tmc_util.cpp | 8 +-
Marlin/src/feature/tramming.cpp | 69 +
Marlin/src/feature/tramming.h | 23 +-
Marlin/src/feature/twibus.cpp | 10 +
Marlin/src/feature/twibus.h | 13 +
Marlin/src/feature/z_stepper_align.cpp | 26 +-
Marlin/src/gcode/bedlevel/G35.cpp | 27 +-
Marlin/src/gcode/bedlevel/abl/G29.cpp | 41 +-
Marlin/src/gcode/bedlevel/mbl/G29.cpp | 2 +-
Marlin/src/gcode/calibrate/G28.cpp | 37 +-
Marlin/src/gcode/calibrate/G34.cpp | 7 +-
Marlin/src/gcode/calibrate/G34_M422.cpp | 35 +-
Marlin/src/gcode/calibrate/G425.cpp | 8 +-
Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 36 +-
Marlin/src/gcode/calibrate/M48.cpp | 1 +
Marlin/src/gcode/config/M220.cpp | 8 +-
Marlin/src/gcode/control/M108_M112_M410.cpp | 3 +-
Marlin/src/gcode/control/M226.cpp | 2 +
Marlin/src/gcode/control/M3-M5.cpp | 2 +-
Marlin/src/gcode/control/M42.cpp | 4 +
Marlin/src/gcode/control/T.cpp | 18 +-
.../src/gcode/feature/controllerfan/M710.cpp | 4 +-
.../src/gcode/feature/filwidth/M404-M407.cpp | 1 -
Marlin/src/gcode/feature/i2c/M260_M261.cpp | 2 +-
Marlin/src/gcode/feature/pause/G61.cpp | 11 +-
Marlin/src/gcode/feature/pause/M125.cpp | 9 +-
Marlin/src/gcode/feature/pause/M600.cpp | 11 +-
Marlin/src/gcode/feature/pause/M701_M702.cpp | 25 +-
.../src/gcode/feature/power_monitor/M430.cpp | 4 +-
Marlin/src/gcode/gcode.cpp | 41 +-
Marlin/src/gcode/gcode.h | 12 +-
Marlin/src/gcode/host/M115.cpp | 3 +
Marlin/src/gcode/host/M118.cpp | 2 +-
Marlin/src/gcode/lcd/M414.cpp | 44 +
Marlin/src/gcode/motion/G2_G3.cpp | 45 +-
Marlin/src/gcode/motion/M290.cpp | 1 -
Marlin/src/gcode/probe/M401_M402.cpp | 1 +
Marlin/src/gcode/queue.cpp | 35 +-
Marlin/src/gcode/sd/M1001.cpp | 18 +-
Marlin/src/gcode/sd/M21_M22.cpp | 6 +-
Marlin/src/gcode/sd/M808.cpp | 51 +
Marlin/src/gcode/temp/M104_M109.cpp | 6 +-
Marlin/src/inc/Conditionals_LCD.h | 76 +-
Marlin/src/inc/Conditionals_adv.h | 33 +-
Marlin/src/inc/Conditionals_post.h | 80 +-
Marlin/src/inc/MarlinConfig.h | 2 +
Marlin/src/inc/SanityCheck.h | 104 +-
Marlin/src/inc/Version.h | 6 +-
Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 20 +-
Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 39 +-
Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h | 11 +-
Marlin/src/lcd/buttons.h | 234 ++
Marlin/src/lcd/dogm/HAL_LCD_class_defines.h | 13 +
Marlin/src/lcd/dogm/HAL_LCD_com_defines.h | 2 +
Marlin/src/lcd/dogm/dogm_Bootscreen.h | 15 +
Marlin/src/lcd/dogm/fontdata/langdata_sk.h | 9 +-
Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 51 +-
Marlin/src/lcd/dogm/marlinui_DOGM.h | 22 +-
Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 29 +-
.../lcd/dogm/status_screen_lite_ST7920.cpp | 11 +-
.../u8g_dev_ssd1306_sh1106_128x64_I2C.cpp | 3 +-
Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp | 128 +
.../dogm/u8g_dev_tft_upscale_from_128x64.cpp | 22 +-
Marlin/src/lcd/dwin/dwin_lcd.cpp | 15 +-
Marlin/src/lcd/dwin/e3v2/dwin.cpp | 188 +-
Marlin/src/lcd/dwin/e3v2/dwin.h | 4 +-
Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp | 144 +-
Marlin/src/lcd/dwin/e3v2/rotary_encoder.h | 24 +-
Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp | 9 +
Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp | 19 +-
Marlin/src/lcd/extui/dgus_lcd.cpp | 10 +
Marlin/src/lcd/extui/example.cpp | 16 +-
.../lib/anycubic_chiron/FileNavigator.cpp | 2 +
.../extui/lib/anycubic_chiron/chiron_tft.cpp | 29 +-
.../lib/anycubic_chiron/chiron_tft_defs.h | 4 +-
.../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 33 +-
Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 2 -
Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 5 +-
.../extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp | 2 +-
.../extui/lib/dgus/hiprecy/DGUSDisplayDef.h | 2 +
.../extui/lib/dgus/origin/DGUSDisplayDef.cpp | 2 +-
.../extui/lib/dgus/origin/DGUSDisplayDef.h | 2 +
.../archim2-flash/media_file_reader.cpp | 2 +-
.../ftdi_eve_lib/basic/commands.cpp | 8 +
.../ftdi_eve_lib/basic/commands.h | 1 +
.../ftdi_eve_lib/basic/resolutions.h | 2 +-
.../ftdi_eve_lib/basic/spi.cpp | 2 +-
.../ftdi_eve_touch_ui/ftdi_eve_lib/compat.h | 4 +
.../extended/command_processor.cpp | 2 +-
.../ftdi_eve_lib/extended/command_processor.h | 10 +-
.../ftdi_eve_lib/extended/dl_cache.cpp | 2 +-
.../ftdi_eve_lib/extended/event_loop.cpp | 2 +-
.../ftdi_eve_lib/extended/ftdi_extended.h | 3 +-
.../ftdi_eve_lib/extended/grid_layout.h | 2 +-
.../ftdi_eve_lib/extended/polygon.h | 2 +-
.../ftdi_eve_lib/extended/screen_types.cpp | 2 +-
.../ftdi_eve_lib/extended/screen_types.h | 6 +-
.../ftdi_eve_lib/extended/sound_player.cpp | 6 +-
.../ftdi_eve_lib/extended/text_box.cpp | 4 +-
.../ftdi_eve_lib/extended/text_ellipsis.cpp | 25 +-
.../ftdi_eve_lib/extended/tiny_timer.cpp | 14 +-
.../extended/unicode/cyrillic_char_set.cpp | 139 +
.../extended/unicode/cyrillic_char_set.h | 32 +
.../unicode/cyrillic_char_set_bitmap_31.h | 2529 +++++++++++++++++
.../extended/unicode/font_bitmaps.cpp | 8 +-
.../extended/unicode/font_bitmaps.h | 2 +-
.../cyrillic_char_set_bitmap_31.png | Bin 0 -> 34122 bytes
.../cyrillic_char_set_bitmap_31.svg | 535 ++++
.../unicode/font_bitmaps/romfont_31.png | Bin 0 -> 16643 bytes
.../extended/unicode/standard_char_set.cpp | 3 +-
.../extended/unicode/standard_char_set.h | 2 +-
.../ftdi_eve_lib/extended/unicode/unicode.cpp | 25 +-
.../ftdi_eve_lib/extended/unicode/unicode.h | 15 +-
.../extended/unicode/western_char_set.cpp | 27 +-
.../extended/unicode/western_char_set.h | 4 +-
.../ftdi_eve_lib/extras/bitmap2cpp.py | 10 +-
.../ftdi_eve_touch_ui/language/language_en.h | 26 +-
.../lib/ftdi_eve_touch_ui/marlin_events.cpp | 13 +-
.../screens/advanced_settings_menu.cpp | 36 +-
.../screens/alert_dialog_box.cpp | 6 +-
.../base_numeric_adjustment_screen.cpp | 34 +-
.../screens/bed_mesh_screen.cpp | 57 +-
.../screens/bio_advanced_settings.cpp | 28 +-
.../screens/bio_main_menu.cpp | 18 +-
.../screens/bio_printing_dialog_box.cpp | 2 +-
.../screens/bio_status_screen.cpp | 187 +-
.../screens/bio_tune_menu.cpp | 14 +-
.../ftdi_eve_touch_ui/screens/boot_screen.cpp | 8 +-
.../screens/change_filament_screen.cpp | 209 +-
.../cocoa_press_advanced_settings_menu.cpp | 102 +
.../screens/cocoa_press_load_chocolate.cpp | 101 +
.../screens/cocoa_press_main_menu.cpp | 89 +
.../screens/cocoa_press_move_e_screen.cpp | 62 +
.../screens/cocoa_press_move_xyz_screen.cpp | 53 +
..._menu.cpp => cocoa_press_preheat_menu.cpp} | 74 +-
...een.cpp => cocoa_press_preheat_screen.cpp} | 74 +-
.../screens/cocoa_press_status_screen.cpp | 307 ++
.../screens/cocoa_press_ui.h | 54 +
.../screens/cocoa_press_unload_cartridge.cpp | 101 +
.../confirm_start_print_dialog_box.cpp | 4 +-
.../confirm_user_request_alert_box.cpp | 14 +-
.../screens/custom_user_menus.cpp | 215 ++
.../screens/default_acceleration_screen.cpp | 2 +-
.../screens/developer_menu.cpp | 38 +-
.../screens/dialog_box_base_class.cpp | 8 +-
.../screens/endstop_state_screen.cpp | 4 +-
.../screens/filament_menu.cpp | 2 +-
.../screens/files_screen.cpp | 76 +-
.../screens/interface_settings_screen.cpp | 22 +-
.../screens/interface_sounds_screen.cpp | 10 +-
.../screens/leveling_menu.cpp | 21 +-
.../ftdi_eve_touch_ui/screens/lock_screen.cpp | 24 +-
.../ftdi_eve_touch_ui/screens/main_menu.cpp | 86 +-
.../screens/media_player_screen.cpp | 2 +-
.../screens/move_axis_screen.cpp | 44 +-
.../screens/nudge_nozzle_screen.cpp | 36 +-
.../ftdi_eve_touch_ui/screens/screen_data.h | 26 +-
.../lib/ftdi_eve_touch_ui/screens/screens.cpp | 135 +-
.../lib/ftdi_eve_touch_ui/screens/screens.h | 265 +-
.../screens/spinner_dialog_box.cpp | 8 +-
.../screens/status_screen.cpp | 201 +-
.../screens/stress_test_screen.cpp | 14 +-
.../screens/temperature_screen.cpp | 19 +-
.../screens/touch_calibration_screen.cpp | 3 +
.../screens/touch_registers_screen.cpp | 26 +-
.../ftdi_eve_touch_ui/screens/tune_menu.cpp | 36 +-
.../screens/widget_demo_screen.cpp | 4 +-
.../screens/z_offset_screen.cpp | 2 +-
.../extui/lib/ftdi_eve_touch_ui/theme/fonts.h | 6 +-
.../lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 2 -
Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp | 2 -
.../src/lcd/extui/lib/mks_ui/draw_about.cpp | 11 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_about.h | 3 +-
.../lib/mks_ui/draw_acceleration_settings.cpp | 10 +-
.../lib/mks_ui/draw_acceleration_settings.h | 2 +-
.../lib/mks_ui/draw_advance_settings.cpp | 2 +-
.../extui/lib/mks_ui/draw_advance_settings.h | 2 +-
.../draw_auto_level_offset_settings.cpp | 2 +-
.../mks_ui/draw_auto_level_offset_settings.h | 2 +-
.../extui/lib/mks_ui/draw_baby_stepping.cpp | 5 +-
.../lcd/extui/lib/mks_ui/draw_baby_stepping.h | 3 +-
.../extui/lib/mks_ui/draw_change_speed.cpp | 18 +-
.../lcd/extui/lib/mks_ui/draw_change_speed.h | 3 +-
.../lcd/extui/lib/mks_ui/draw_cloud_bind.cpp | 205 ++
.../extui/lib/mks_ui/draw_cloud_bind.h} | 23 +-
.../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 118 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h | 3 +-
.../extui/lib/mks_ui/draw_eeprom_settings.cpp | 2 +-
.../extui/lib/mks_ui/draw_eeprom_settings.h | 2 +-
.../lib/mks_ui/draw_encoder_settings.cpp | 2 +-
.../extui/lib/mks_ui/draw_encoder_settings.h | 2 +-
.../extui/lib/mks_ui/draw_error_message.cpp | 23 -
.../lcd/extui/lib/mks_ui/draw_error_message.h | 1 -
.../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 16 +-
.../src/lcd/extui/lib/mks_ui/draw_extrusion.h | 3 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 29 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h | 3 +-
.../extui/lib/mks_ui/draw_filament_change.cpp | 14 +-
.../extui/lib/mks_ui/draw_filament_change.h | 3 +-
.../lib/mks_ui/draw_filament_settings.cpp | 10 +-
.../extui/lib/mks_ui/draw_filament_settings.h | 2 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 22 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_home.h | 3 +-
.../draw_homing_sensitivity_settings.cpp | 2 +-
.../mks_ui/draw_homing_sensitivity_settings.h | 2 +-
.../extui/lib/mks_ui/draw_jerk_settings.cpp | 2 +-
.../lcd/extui/lib/mks_ui/draw_jerk_settings.h | 2 +-
.../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 23 +-
.../lcd/extui/lib/mks_ui/draw_language.cpp | 6 +-
.../src/lcd/extui/lib/mks_ui/draw_language.h | 3 +-
.../extui/lib/mks_ui/draw_level_settings.cpp | 7 +-
.../extui/lib/mks_ui/draw_level_settings.h | 2 +-
.../extui/lib/mks_ui/draw_machine_para.cpp | 2 +-
.../lcd/extui/lib/mks_ui/draw_machine_para.h | 2 +-
.../lib/mks_ui/draw_machine_settings.cpp | 2 +-
.../extui/lib/mks_ui/draw_machine_settings.h | 2 +-
.../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 70 +-
.../lcd/extui/lib/mks_ui/draw_manuaLevel.h | 3 +-
.../mks_ui/draw_manual_level_pos_settings.cpp | 38 +-
.../mks_ui/draw_manual_level_pos_settings.h | 2 +-
.../lib/mks_ui/draw_max_feedrate_settings.cpp | 32 +-
.../lib/mks_ui/draw_max_feedrate_settings.h | 2 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp | 170 ++
Marlin/src/lcd/extui/lib/mks_ui/draw_more.h | 33 +
.../extui/lib/mks_ui/draw_motor_settings.cpp | 8 +-
.../extui/lib/mks_ui/draw_motor_settings.h | 2 +-
.../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 114 +-
.../lcd/extui/lib/mks_ui/draw_move_motor.h | 3 +-
.../lcd/extui/lib/mks_ui/draw_number_key.cpp | 7 +-
.../lcd/extui/lib/mks_ui/draw_number_key.h | 2 +-
.../lcd/extui/lib/mks_ui/draw_operation.cpp | 11 +-
.../src/lcd/extui/lib/mks_ui/draw_operation.h | 3 +-
.../extui/lib/mks_ui/draw_pause_message.cpp | 4 -
.../lcd/extui/lib/mks_ui/draw_pause_message.h | 1 -
.../extui/lib/mks_ui/draw_pause_position.cpp | 13 +-
.../extui/lib/mks_ui/draw_pause_position.h | 2 +-
.../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 8 +-
.../src/lcd/extui/lib/mks_ui/draw_preHeat.h | 3 +-
.../lcd/extui/lib/mks_ui/draw_print_file.cpp | 28 +-
.../lcd/extui/lib/mks_ui/draw_print_file.h | 12 +-
.../lcd/extui/lib/mks_ui/draw_printing.cpp | 27 +-
.../src/lcd/extui/lib/mks_ui/draw_printing.h | 3 +-
.../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 61 +-
.../lcd/extui/lib/mks_ui/draw_ready_print.h | 3 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 40 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_set.h | 3 +-
.../extui/lib/mks_ui/draw_step_settings.cpp | 31 +-
.../lcd/extui/lib/mks_ui/draw_step_settings.h | 2 +-
.../lib/mks_ui/draw_tmc_current_settings.cpp | 33 +-
.../lib/mks_ui/draw_tmc_current_settings.h | 2 +-
.../mks_ui/draw_tmc_step_mode_settings.cpp | 14 +-
.../lib/mks_ui/draw_tmc_step_mode_settings.h | 2 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 35 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h | 3 +-
.../lib/mks_ui/draw_touch_calibration.cpp | 4 +-
.../extui/lib/mks_ui/draw_touch_calibration.h | 1 -
Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 515 +---
Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 68 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp | 61 +-
Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h | 2 +-
.../lcd/extui/lib/mks_ui/draw_wifi_list.cpp | 9 +-
.../src/lcd/extui/lib/mks_ui/draw_wifi_list.h | 2 +-
.../extui/lib/mks_ui/draw_wifi_settings.cpp | 2 +-
.../lcd/extui/lib/mks_ui/draw_wifi_settings.h | 2 +-
.../lcd/extui/lib/mks_ui/draw_wifi_tips.cpp | 2 +-
.../src/lcd/extui/lib/mks_ui/draw_wifi_tips.h | 2 +-
.../lcd/extui/lib/mks_ui/gb2312_puhui16.cpp | 10 -
.../src/lcd/extui/lib/mks_ui/irq_overrid.cpp | 20 +-
.../extui/lib/mks_ui/mks_hardware_test.cpp | 20 +-
.../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 75 +-
Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 4 +-
.../extui/lib/mks_ui/printer_operation.cpp | 21 +-
.../lcd/extui/lib/mks_ui/tft_Language_en.h | 55 +-
.../lcd/extui/lib/mks_ui/tft_Language_fr.h | 38 +-
.../lcd/extui/lib/mks_ui/tft_Language_it.h | 28 +-
.../lcd/extui/lib/mks_ui/tft_Language_ru.h | 200 +-
.../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 123 +-
.../lcd/extui/lib/mks_ui/tft_Language_sp.h | 59 +-
.../lcd/extui/lib/mks_ui/tft_Language_t_cn.h | 25 +-
.../lib/mks_ui/tft_lvgl_configuration.cpp | 134 +-
.../extui/lib/mks_ui/tft_lvgl_configuration.h | 8 +-
.../extui/lib/mks_ui/tft_multi_language.cpp | 349 ++-
.../lcd/extui/lib/mks_ui/tft_multi_language.h | 53 +-
.../src/lcd/extui/lib/mks_ui/wifiSerial.cpp | 29 +-
Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h | 10 +-
.../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 745 ++---
Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h | 27 +-
.../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 480 ++--
Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h | 8 +-
Marlin/src/lcd/extui/malyan_lcd.cpp | 13 +-
Marlin/src/lcd/extui/ui_api.cpp | 24 +-
Marlin/src/lcd/extui/ui_api.h | 20 +-
Marlin/src/lcd/language/language_an.h | 2 +-
Marlin/src/lcd/language/language_bg.h | 2 +-
Marlin/src/lcd/language/language_ca.h | 2 +-
Marlin/src/lcd/language/language_cz.h | 6 +-
Marlin/src/lcd/language/language_da.h | 2 +-
Marlin/src/lcd/language/language_de.h | 16 +-
Marlin/src/lcd/language/language_el.h | 2 +-
Marlin/src/lcd/language/language_el_gr.h | 2 +-
Marlin/src/lcd/language/language_en.h | 41 +-
Marlin/src/lcd/language/language_es.h | 16 +-
Marlin/src/lcd/language/language_eu.h | 2 +-
Marlin/src/lcd/language/language_fi.h | 2 +-
Marlin/src/lcd/language/language_fr.h | 37 +-
Marlin/src/lcd/language/language_gl.h | 16 +-
Marlin/src/lcd/language/language_hr.h | 2 +-
Marlin/src/lcd/language/language_hu.h | 34 +-
Marlin/src/lcd/language/language_it.h | 100 +-
Marlin/src/lcd/language/language_jp_kana.h | 2 +-
Marlin/src/lcd/language/language_nl.h | 2 +-
Marlin/src/lcd/language/language_pl.h | 6 +-
Marlin/src/lcd/language/language_pt.h | 16 +-
Marlin/src/lcd/language/language_pt_br.h | 16 +-
Marlin/src/lcd/language/language_ro.h | 16 +-
Marlin/src/lcd/language/language_ru.h | 93 +-
Marlin/src/lcd/language/language_sk.h | 20 +-
Marlin/src/lcd/language/language_sv.h | 681 +++++
Marlin/src/lcd/language/language_tr.h | 16 +-
Marlin/src/lcd/language/language_uk.h | 322 ++-
Marlin/src/lcd/language/language_zh_CN.h | 16 +-
Marlin/src/lcd/language/language_zh_TW.h | 6 +-
Marlin/src/lcd/lcdprint.cpp | 1 +
Marlin/src/lcd/lcdprint.h | 18 +-
Marlin/src/lcd/marlinui.cpp | 172 +-
Marlin/src/lcd/marlinui.h | 229 +-
Marlin/src/lcd/menu/menu.cpp | 3 +-
Marlin/src/lcd/menu/menu.h | 2 +
Marlin/src/lcd/menu/menu_advanced.cpp | 26 +-
Marlin/src/lcd/menu/menu_bed_corners.cpp | 292 +-
Marlin/src/lcd/menu/menu_bed_leveling.cpp | 12 +-
Marlin/src/lcd/menu/menu_configuration.cpp | 4 +-
Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 2 +
Marlin/src/lcd/menu/menu_filament.cpp | 8 +-
Marlin/src/lcd/menu/menu_item.h | 4 +-
Marlin/src/lcd/menu/menu_language.cpp | 59 +
Marlin/src/lcd/menu/menu_main.cpp | 23 +-
Marlin/src/lcd/menu/menu_mixer.cpp | 9 +
Marlin/src/lcd/menu/menu_motion.cpp | 28 +-
Marlin/src/lcd/menu/menu_power_monitor.cpp | 4 +-
Marlin/src/lcd/menu/menu_probe_offset.cpp | 34 +-
Marlin/src/lcd/menu/menu_spindle_laser.cpp | 32 +-
Marlin/src/lcd/menu/menu_temperature.cpp | 4 +-
Marlin/src/lcd/menu/menu_tmc.cpp | 2 +-
Marlin/src/lcd/menu/menu_tramming.cpp | 37 +-
Marlin/src/lcd/menu/menu_tune.cpp | 10 +-
Marlin/src/lcd/menu/menu_ubl.cpp | 82 +-
Marlin/src/lcd/tft/canvas.cpp | 2 +-
Marlin/src/lcd/tft/tft.h | 11 +
Marlin/src/lcd/tft/tft_image.cpp | 14 +-
Marlin/src/lcd/tft/tft_image.h | 16 +-
Marlin/src/lcd/tft/tft_queue.cpp | 28 +-
Marlin/src/lcd/tft/ui_320x240.cpp | 88 +-
Marlin/src/lcd/tft/ui_320x240.h | 2 +-
Marlin/src/lcd/tft/ui_480x320.cpp | 154 +-
Marlin/src/lcd/tft/ui_480x320.h | 15 +-
Marlin/src/lcd/tft_io/ssd1963.h | 6 +-
Marlin/src/lcd/tft_io/tft_io.h | 16 +-
Marlin/src/lcd/tft_io/touch_calibration.cpp | 44 +-
Marlin/src/lcd/tft_io/touch_calibration.h | 6 +
Marlin/src/lcd/touch/touch_buttons.cpp | 8 +-
Marlin/src/libs/BL24CXX.cpp | 1 -
Marlin/src/libs/L64XX/L64XX_Marlin.cpp | 15 +-
Marlin/src/libs/L64XX/README.md | 2 +-
Marlin/src/libs/W25Qxx.cpp | 117 +-
Marlin/src/libs/buzzer.h | 1 +
.../src/libs/heatshrink/heatshrink_common.h | 2 +-
Marlin/src/libs/nozzle.cpp | 17 +
Marlin/src/libs/numtostr.cpp | 16 +-
Marlin/src/libs/numtostr.h | 5 +-
Marlin/src/libs/private_spi.h | 8 +-
Marlin/src/module/endstops.cpp | 25 +-
Marlin/src/module/endstops.h | 8 +
Marlin/src/module/motion.cpp | 184 +-
Marlin/src/module/motion.h | 74 +-
Marlin/src/module/planner.cpp | 17 +-
Marlin/src/module/planner.h | 4 +-
Marlin/src/module/probe.cpp | 159 +-
Marlin/src/module/probe.h | 111 +-
Marlin/src/module/settings.cpp | 88 +-
Marlin/src/module/stepper.cpp | 12 +-
Marlin/src/module/stepper/indirection.h | 8 +-
Marlin/src/module/temperature.cpp | 88 +-
Marlin/src/module/temperature.h | 14 +-
Marlin/src/module/thermistor/thermistors.h | 2 +
Marlin/src/module/tool_change.cpp | 219 +-
Marlin/src/module/tool_change.h | 18 +-
Marlin/src/pins/esp32/pins_E4D.h | 8 +-
Marlin/src/pins/esp32/pins_FYSETC_E4.h | 8 +-
Marlin/src/pins/esp32/pins_MRR_ESPA.h | 8 +-
Marlin/src/pins/esp32/pins_MRR_ESPE.h | 12 +-
Marlin/src/pins/linux/pins_RAMPS_LINUX.h | 14 +-
Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h | 16 +-
Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h | 10 +-
Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h | 10 +-
Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h | 2 +-
Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 2 +-
Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 187 +-
Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 108 +-
Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 16 +-
Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 39 +-
Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 12 +-
Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 39 +-
Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 34 +-
.../src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 16 +-
.../src/pins/lpc1769/pins_COHESION3D_REMIX.h | 21 +-
Marlin/src/pins/lpc1769/pins_FLY_CDY.h | 25 +-
Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 10 +-
Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 8 +-
Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h | 8 +-
Marlin/src/pins/mega/pins_CNCONTROLS_11.h | 6 +-
Marlin/src/pins/mega/pins_CNCONTROLS_12.h | 6 +-
Marlin/src/pins/mega/pins_GT2560_REV_A.h | 8 +-
Marlin/src/pins/mega/pins_HJC2560C_REV2.h | 8 +-
Marlin/src/pins/mega/pins_MEGATRONICS_2.h | 8 +-
Marlin/src/pins/mega/pins_MEGATRONICS_3.h | 8 +-
Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 1 +
Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h | 4 +-
Marlin/src/pins/pins.h | 130 +-
Marlin/src/pins/pinsDebug_list.h | 24 +-
Marlin/src/pins/rambo/pins_RAMBO.h | 8 +-
Marlin/src/pins/ramps/pins_3DRAG.h | 2 +-
Marlin/src/pins/ramps/pins_AZTEEG_X3.h | 2 +-
.../src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h | 6 +-
Marlin/src/pins/ramps/pins_FYSETC_F6_13.h | 3 +-
Marlin/src/pins/ramps/pins_K8200.h | 2 +-
Marlin/src/pins/ramps/pins_K8600.h | 4 +-
Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h | 118 +
Marlin/src/pins/ramps/pins_RAMPS.h | 14 +-
Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h | 2 +-
Marlin/src/pins/ramps/pins_RAMPS_S_12.h | 2 +-
Marlin/src/pins/ramps/pins_TT_OSCAR.h | 14 +-
Marlin/src/pins/ramps/pins_ULTIMAIN_2.h | 2 +-
Marlin/src/pins/ramps/pins_ULTIMAKER.h | 10 +-
Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h | 10 +-
Marlin/src/pins/ramps/pins_ZRIB_V20.h | 6 +-
Marlin/src/pins/sam/pins_ARCHIM1.h | 6 +-
Marlin/src/pins/sam/pins_ARCHIM2.h | 6 +-
Marlin/src/pins/sam/pins_CNCONTROLS_15D.h | 6 +-
Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h | 6 +-
Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h | 6 +-
Marlin/src/pins/samd/pins_RAMPS_144.h | 14 +-
Marlin/src/pins/sanguino/pins_ANET_10.h | 6 -
.../src/pins/sanguino/pins_MELZI_CREALITY.h | 8 +-
.../src/pins/sanguino/pins_SANGUINOLOLU_11.h | 8 +-
Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 12 +-
Marlin/src/pins/stm32f0/pins_MALYAN_M300.h | 2 +-
Marlin/src/pins/stm32f1/pins_BEAST.h | 146 +-
Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h | 183 ++
Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 12 +-
.../pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h | 14 +
.../pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h | 4 +-
.../pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h | 30 +-
.../stm32f1/pins_BTT_SKR_MINI_E3_common.h | 16 +-
.../src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 16 +-
.../src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 10 +-
Marlin/src/pins/stm32f1/pins_CHITU3D.h | 14 +-
Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 8 +-
Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 8 +-
Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 50 +-
Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h | 208 ++
Marlin/src/pins/stm32f1/pins_CREALITY_V427.h | 8 +-
Marlin/src/pins/stm32f1/pins_CREALITY_V431.h | 39 +
Marlin/src/pins/stm32f1/pins_CREALITY_V452.h | 38 +
Marlin/src/pins/stm32f1/pins_CREALITY_V453.h | 38 +
Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h | 113 +
Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 110 +-
Marlin/src/pins/stm32f1/pins_FLY_MINI.h | 10 +-
Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 18 +-
Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 24 +-
Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 18 +-
Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 18 +-
Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 18 +-
Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 18 +-
.../src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 4 +-
Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 +-
Marlin/src/pins/stm32f1/pins_MALYAN_M200.h | 2 +-
Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 175 +-
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h | 2 +-
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h | 2 +-
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 16 +-
.../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 10 +-
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 10 +-
.../src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 8 +-
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 14 +-
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 17 +-
.../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 13 +-
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 10 +-
Marlin/src/pins/stm32f1/pins_MORPHEUS.h | 3 +-
Marlin/src/pins/stm32f1/pins_STM32F1R.h | 147 +-
Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 148 +-
Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 20 +-
Marlin/src/pins/stm32f4/pins_ANET_ET4.h | 222 ++
Marlin/src/pins/stm32f4/pins_ANET_ET4P.h | 34 +
.../src/pins/stm32f4/pins_BLACK_STM32F407VE.h | 6 +-
.../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 10 +-
Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 62 +-
.../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 9 +-
Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 16 +-
Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 68 +-
Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h | 1 -
Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 12 +-
Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 100 +-
Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 14 +-
.../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 358 +++
.../src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 371 +++
Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 8 +-
.../src/pins/stm32f4/pins_STEVAL_3DP001V1.h | 18 +-
Marlin/src/pins/stm32f4/pins_VAKE403D.h | 14 +-
Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h | 13 +-
Marlin/src/pins/stm32f7/pins_REMRAM_V1.h | 2 +-
Marlin/src/pins/teensy2/pins_SAV_MKI.h | 2 +-
Marlin/src/pins/teensy3/pins_TEENSY35_36.h | 6 +-
Marlin/src/sd/SdBaseFile.cpp | 8 +-
Marlin/src/sd/cardreader.cpp | 128 +-
Marlin/src/sd/cardreader.h | 17 +-
.../sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 20 +-
.../sd/usb_flashdrive/Sd2Card_FlashDrive.h | 41 +-
.../sd/usb_flashdrive/lib-uhs2/usbhost.cpp | 8 +-
.../lib-uhs3/UHS_host/UHS_macros.h | 164 +-
.../share/PlatformIO/boards/fysetc_f6.json | 34 +
.../boards/genericSTM32F407VGT6.json | 56 +
.../PlatformIO/scripts/anet_et4_openblt.py | 14 +
.../PlatformIO/scripts/common-dependencies.py | 52 +-
.../PlatformIO/scripts/stm32_bootloader.py | 10 +-
.../variants/BIGTREE_GTR_V1/hal_conf_extra.h | 2 +-
.../BIGTREE_SKR_PRO_1v1/hal_conf_extra.h | 2 +-
.../variants/CHITU_F103/board/board.h | 3 -
.../variants/MARLIN_F4x7Vx/PeripheralPins.c | 408 +++
.../variants/MARLIN_F4x7Vx/PinNamesVar.h | 50 +
.../variants/MARLIN_F4x7Vx/hal_conf_extra.h | 495 ++++
.../variants/MARLIN_F4x7Vx/ldscript.ld | 203 ++
.../variants/MARLIN_F4x7Vx/variant.cpp | 275 ++
.../variants/MARLIN_F4x7Vx/variant.h | 199 ++
.../variants/MARLIN_FYSETC_S6/variant.h | 4 +-
buildroot/share/fonts/genallfont.sh | 4 +-
buildroot/share/git/mftest | 11 +-
buildroot/test-gcode/M808-loops.gcode | 16 +
buildroot/tests/BIGTREE_GTR_V1_0-tests | 3 +-
buildroot/tests/BIGTREE_SKR_PRO-tests | 9 +
buildroot/tests/DUE-tests | 3 +-
buildroot/tests/FYSETC_F6-tests | 80 +
buildroot/tests/FYSETC_F6_13-tests | 18 -
buildroot/tests/LPC1768-tests | 3 +-
buildroot/tests/LPC1769-tests | 21 +-
buildroot/tests/STM32F103RC_btt-tests | 4 -
buildroot/tests/STM32F103RET6_creality-tests | 14 +
buildroot/tests/STM32F103RE_btt_USB-tests | 12 +
buildroot/tests/STM32F103VE_longer-tests | 11 +-
buildroot/tests/mega2560-tests | 125 +-
buildroot/tests/mks_robin-tests | 8 +
buildroot/tests/mks_robin_nano35-tests | 15 +-
buildroot/tests/rambo-tests | 54 +-
buildroot/tests/sanguino1284p-tests | 6 +-
platformio.ini | 312 +-
693 files changed, 19429 insertions(+), 8626 deletions(-)
create mode 100644 Marlin/src/HAL/ESP32/Tone.cpp
create mode 100644 Marlin/src/HAL/STM32/usb_host.cpp
create mode 100644 Marlin/src/HAL/STM32/usb_host.h
create mode 100644 Marlin/src/HAL/shared/progmem.h
create mode 100644 Marlin/src/feature/repeat.cpp
create mode 100644 Marlin/src/feature/repeat.h
create mode 100644 Marlin/src/feature/tramming.cpp
create mode 100644 Marlin/src/gcode/lcd/M414.cpp
create mode 100644 Marlin/src/gcode/sd/M808.cpp
create mode 100644 Marlin/src/lcd/buttons.h
create mode 100644 Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.h
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set_bitmap_31.h
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.png
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.svg
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.png
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.cpp
rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/{preheat_menu.cpp => cocoa_press_preheat_menu.cpp} (54%)
rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/{preheat_timer_screen.cpp => cocoa_press_preheat_screen.cpp} (53%)
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.cpp
create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp
create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp
rename Marlin/src/{pins/ramps/pins_LONGER3D_LK4PRO.h => lcd/extui/lib/mks_ui/draw_cloud_bind.h} (71%)
create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp
create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_more.h
create mode 100644 Marlin/src/lcd/language/language_sv.h
create mode 100644 Marlin/src/lcd/menu/menu_language.cpp
create mode 100644 Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h
create mode 100644 Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h
create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h
create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V431.h
create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V452.h
create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V453.h
create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h
create mode 100644 Marlin/src/pins/stm32f4/pins_ANET_ET4.h
create mode 100644 Marlin/src/pins/stm32f4/pins_ANET_ET4P.h
create mode 100644 Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h
create mode 100644 Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h
create mode 100644 buildroot/share/PlatformIO/boards/fysetc_f6.json
create mode 100644 buildroot/share/PlatformIO/boards/genericSTM32F407VGT6.json
create mode 100644 buildroot/share/PlatformIO/scripts/anet_et4_openblt.py
create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c
create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PinNamesVar.h
create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h
create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld
create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.cpp
create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h
create mode 100644 buildroot/test-gcode/M808-loops.gcode
create mode 100644 buildroot/tests/FYSETC_F6-tests
delete mode 100644 buildroot/tests/FYSETC_F6_13-tests
diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml
index 53ffbe0c08b1..7549e3defcbb 100644
--- a/.github/workflows/test-builds.yml
+++ b/.github/workflows/test-builds.yml
@@ -48,7 +48,7 @@ jobs:
# Extended AVR Environments
- - FYSETC_F6_13
+ - FYSETC_F6
- mega1280
- rambo
- sanguino1284p
diff --git a/.gitignore b/.gitignore
index 62f73a7c0d00..f7d49cc1ed28 100755
--- a/.gitignore
+++ b/.gitignore
@@ -19,9 +19,9 @@
# along with this program. If not, see .
#
-# Our automatic versioning scheme generates the following file
-# NEVER put it in the repository
+# Generated files
_Version.h
+bdf2u8g
#
# OS
diff --git a/Makefile b/Makefile
index 8e1c77aa9935..ebcdf25e2d6a 100644
--- a/Makefile
+++ b/Makefile
@@ -27,8 +27,6 @@ tests-single-ci:
tests-single-local:
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET= or use make tests-all-local" ; return 1; fi
- chmod +x buildroot/bin/*
- chmod +x buildroot/tests/*
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
&& run_tests . $(TEST_TARGET) "$(ONLY_TEST)"
@@ -40,8 +38,6 @@ tests-single-local-docker:
.PHONY: tests-single-local-docker
tests-all-local:
- chmod +x buildroot/bin/*
- chmod +x buildroot/tests/*
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
&& for TEST_TARGET in $$(./get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index c64569d2bf91..d86c4484417c 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -56,15 +56,15 @@
//===========================================================================
//============================= DELTA Printer ===============================
//===========================================================================
-// For a Delta printer start with one of the configuration files in the
-// config/examples/delta directory and customize for your machine.
+// For a Delta printer, start with one of the configuration files in the config/examples/delta directory
+// from https://github.com/MarlinFirmware/Configurations/branches/all and customize for your machine.
//
//===========================================================================
//============================= SCARA Printer ===============================
//===========================================================================
-// For a SCARA printer start with the configuration files in
-// config/examples/SCARA and customize for your machine.
+// For a SCARA printer, start with one of the configuration files in the config/examples/SCARA directory
+// from https://github.com/MarlinFirmware/Configurations/branches/all and customize for your machine.
//
// @section info
@@ -896,11 +896,6 @@
*/
//#define BLTOUCH
-/**
- * Pressure sensor with a BLTouch-like interface
- */
-//#define CREALITY_TOUCH
-
/**
* Touch-MI Probe by hotends.fr
*
@@ -954,10 +949,20 @@
/**
* Nozzle-to-Probe offsets { X, Y, Z }
*
- * - Use a caliper or ruler to measure the distance from the tip of
+ * X and Y offset
+ * Use a caliper or ruler to measure the distance from the tip of
* the Nozzle to the center-point of the Probe in the X and Y axes.
+ *
+ * Z offset
* - For the Z offset use your best known value and adjust at runtime.
- * - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc.
+ * - Common probes trigger below the nozzle and have negative values for Z offset.
+ * - Probes triggering above the nozzle height are uncommon but do exist. When using
+ * probes such as this, carefully set Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES
+ * to avoid collisions during probing.
+ *
+ * Tune and Adjust
+ * - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc.
+ * - PROBE_OFFSET_WIZARD (configuration_adv.h) can be used for setting the Z offset.
*
* Assuming the typical work area orientation:
* - Probe to RIGHT of the Nozzle has a Positive X offset
@@ -991,11 +996,38 @@
#define XY_PROBE_SPEED (133*60)
// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2)
-#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z
+#define Z_PROBE_SPEED_FAST (4*60)
// Feedrate (mm/min) for the "accurate" probe of each point
#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2)
+/**
+ * Probe Activation Switch
+ * A switch indicating proper deployment, or an optical
+ * switch triggered when the carriage is near the bed.
+ */
+//#define PROBE_ACTIVATION_SWITCH
+#if ENABLED(PROBE_ACTIVATION_SWITCH)
+ #define PROBE_ACTIVATION_SWITCH_STATE LOW // State indicating probe is active
+ //#define PROBE_ACTIVATION_SWITCH_PIN PC6 // Override default pin
+#endif
+
+/**
+ * Tare Probe (determine zero-point) prior to each probe.
+ * Useful for a strain gauge or piezo sensor that needs to factor out
+ * elements such as cables pulling on the carriage.
+ */
+//#define PROBE_TARE
+#if ENABLED(PROBE_TARE)
+ #define PROBE_TARE_TIME 200 // (ms) Time to hold tare pin
+ #define PROBE_TARE_DELAY 200 // (ms) Delay after tare before
+ #define PROBE_TARE_STATE HIGH // State to write pin for tare
+ //#define PROBE_TARE_PIN PA5 // Override default pin
+ #if ENABLED(PROBE_ACTIVATION_SWITCH)
+ //#define PROBE_TARE_ONLY_WHILE_INACTIVE // Fail to tare/probe if PROBE_ACTIVATION_SWITCH is active
+ #endif
+#endif
+
/**
* Multiple Probing
*
@@ -1057,6 +1089,13 @@
//#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing
//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors
+// Require minimum nozzle and/or bed temperature for probing
+//#define PREHEAT_BEFORE_PROBING
+#if ENABLED(PREHEAT_BEFORE_PROBING)
+ #define PROBING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time
+ #define PROBING_BED_TEMP 50
+#endif
+
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
// :{ 0:'Low', 1:'High' }
#define X_ENABLE_ON 0
@@ -1099,8 +1138,8 @@
// @section homing
-//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed
-
+//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed. Also enable HOME_AFTER_DEACTIVATE for extra safety.
+//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated. Also enable NO_MOTION_BEFORE_HOMING for extra safety.
//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off.
//#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ...
@@ -1274,10 +1313,21 @@
//#define MESH_BED_LEVELING
/**
- * Normally G28 leaves leveling disabled on completion. Enable
- * this option to have G28 restore the prior leveling state.
+ * Normally G28 leaves leveling disabled on completion. Enable one of
+ * these options to restore the prior leveling state or to always enable
+ * leveling immediately after G28.
*/
//#define RESTORE_LEVELING_AFTER_G28
+//#define ENABLE_LEVELING_AFTER_G28
+
+/**
+ * Auto-leveling needs preheating
+ */
+//#define PREHEAT_BEFORE_LEVELING
+#if ENABLED(PREHEAT_BEFORE_LEVELING)
+ #define LEVELING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time
+ #define LEVELING_BED_TEMP 50
+#endif
/**
* Enable detailed logging of G28, G29, M48, etc.
@@ -1291,6 +1341,9 @@
// at which point movement will be level to the machine's XY plane.
// The height can be set with M420 Z
#define ENABLE_LEVELING_FADE_HEIGHT
+ #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
+ #define DEFAULT_LEVELING_FADE_HEIGHT 10.0 // (mm) Default fade height.
+ #endif
// For Cartesian machines, instead of dividing moves on mesh boundaries,
// split up moves into short segments like a Delta. This follows the
@@ -1392,6 +1445,31 @@
#define LEVEL_CORNERS_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points
#define LEVEL_CORNERS_Z_HOP 4.0 // (mm) Z height of nozzle between leveling points
//#define LEVEL_CENTER_TOO // Move to the center after the last corner
+ //#define LEVEL_CORNERS_USE_PROBE
+ #if ENABLED(LEVEL_CORNERS_USE_PROBE)
+ #define LEVEL_CORNERS_PROBE_TOLERANCE 0.1
+ #define LEVEL_CORNERS_VERIFY_RAISED // After adjustment triggers the probe, re-probe to verify
+ //#define LEVEL_CORNERS_AUDIO_FEEDBACK
+ #endif
+
+ /**
+ * Corner Leveling Order
+ *
+ * Set 2 or 4 points. When 2 points are given, the 3rd is the center of the opposite edge.
+ *
+ * LF Left-Front RF Right-Front
+ * LB Left-Back RB Right-Back
+ *
+ * Examples:
+ *
+ * Default {LF,RB,LB,RF} {LF,RF} {LB,LF}
+ * LB --------- RB LB --------- RB LB --------- RB LB --------- RB
+ * | 4 3 | | 3 2 | | <3> | | 1 |
+ * | | | | | | | <3>|
+ * | 1 2 | | 1 4 | | 1 2 | | 2 |
+ * LF --------- RF LF --------- RF LF --------- RF LF --------- RF
+ */
+ #define LEVEL_CORNERS_LEVELING_ORDER { LF, RF, RB, LB }
#endif
/**
@@ -1428,8 +1506,7 @@
#endif
// Homing speeds (mm/min)
-#define HOMING_FEEDRATE_XY (50*60)
-#define HOMING_FEEDRATE_Z (4*60)
+#define HOMING_FEEDRATE_MM_M { (50*60), (50*60), (4*60) }
// Validate that endstops are triggered on homing moves
#define VALIDATE_HOMING_ENDSTOPS
@@ -1637,6 +1714,10 @@
// For a purge/clean station mounted on the X axis
//#define NOZZLE_CLEAN_NO_Y
+ // Require a minimum hotend temperature for cleaning
+ #define NOZZLE_CLEAN_MIN_TEMP 170
+ //#define NOZZLE_CLEAN_HEATUP // Heat up the nozzle instead of skipping wipe
+
// Explicit wipe G-code script applies to a G12 with no arguments.
//#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0"
@@ -1716,9 +1797,9 @@
* Select the language to display on the LCD. These languages are available:
*
* en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, hu, it,
- * jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, tr, uk, vi, zh_CN, zh_TW, test
+ * jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, sv, tr, uk, vi, zh_CN, zh_TW
*
- * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' }
+ * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'sv':'Swedish', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)' }
*/
#define LCD_LANGUAGE en
@@ -1761,16 +1842,6 @@
*/
//#define SDSUPPORT
-/**
- * SD CARD: SPI SPEED
- *
- * Enable one of the following items for a slower SPI transfer speed.
- * This may be required to resolve "volume init" errors.
- */
-//#define SPI_SPEED SPI_HALF_SPEED
-//#define SPI_SPEED SPI_QUARTER_SPEED
-//#define SPI_SPEED SPI_EIGHTH_SPEED
-
/**
* SD CARD: ENABLE CRC
*
@@ -2301,6 +2372,16 @@
//
//#define LONGER_LK_TFT28
+//
+// 320x240, 2.8", FSMC Stock Display from ET4
+//
+//#define ANET_ET4_TFT28
+
+//
+// 480x320, 3.5", FSMC Stock Display from ET5
+//
+//#define ANET_ET5_TFT35
+
//
// Generic TFT with detailed options
//
@@ -2333,6 +2414,10 @@
//#define TFT_COLOR_UI
//#define TFT_LVGL_UI
+#if ENABLED(TFT_LVGL_UI)
+ //#define MKS_WIFI_MODULE // MKS WiFi module
+#endif
+
/**
* TFT Rotation. Set to one of the following values:
*
@@ -2366,6 +2451,7 @@
//#define TOUCH_CALIBRATION_Y -8981
//#define TOUCH_OFFSET_X -43
//#define TOUCH_OFFSET_Y 257
+ //#define TOUCH_ORIENTATION TOUCH_LANDSCAPE
#if ENABLED(TFT_COLOR_UI)
//#define SINGLE_TOUCH_NAVIGATION
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 7c8f2da948c6..714150d240cc 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -552,7 +552,7 @@
//#define X_DUAL_STEPPER_DRIVERS
#if ENABLED(X_DUAL_STEPPER_DRIVERS)
- #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions
+ //#define INVERT_X2_VS_X_DIR // Enable if X2 direction signal is opposite to X
//#define X_DUAL_ENDSTOPS
#if ENABLED(X_DUAL_ENDSTOPS)
#define X2_USE_ENDSTOP _XMAX_
@@ -562,7 +562,7 @@
//#define Y_DUAL_STEPPER_DRIVERS
#if ENABLED(Y_DUAL_STEPPER_DRIVERS)
- #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions
+ //#define INVERT_Y2_VS_Y_DIR // Enable if Y2 direction signal is opposite to Y
//#define Y_DUAL_ENDSTOPS
#if ENABLED(Y_DUAL_ENDSTOPS)
#define Y2_USE_ENDSTOP _YMAX_
@@ -576,6 +576,11 @@
#define NUM_Z_STEPPER_DRIVERS 1 // (1-4) Z options change based on how many
#if NUM_Z_STEPPER_DRIVERS > 1
+ // Enable if Z motor direction signals are the opposite of Z1
+ //#define INVERT_Z2_VS_Z_DIR
+ //#define INVERT_Z3_VS_Z_DIR
+ //#define INVERT_Z4_VS_Z_DIR
+
//#define Z_MULTI_ENDSTOPS
#if ENABLED(Z_MULTI_ENDSTOPS)
#define Z2_USE_ENDSTOP _XMAX_
@@ -801,10 +806,10 @@
//#define ASSISTED_TRAMMING
#if ENABLED(ASSISTED_TRAMMING)
- // Define positions for probing points, use the hotend as reference not the sensor.
- #define TRAMMING_POINT_XY { { 20, 20 }, { 200, 20 }, { 200, 200 }, { 20, 200 } }
+ // Define positions for probe points.
+ #define TRAMMING_POINT_XY { { 20, 20 }, { 180, 20 }, { 180, 180 }, { 20, 180 } }
- // Define positions names for probing points.
+ // Define position names for probe points.
#define TRAMMING_POINT_NAME_1 "Front-Left"
#define TRAMMING_POINT_NAME_2 "Front-Right"
#define TRAMMING_POINT_NAME_3 "Back-Right"
@@ -813,8 +818,8 @@
#define RESTORE_LEVELING_AFTER_G35 // Enable to restore leveling setup after operation
//#define REPORT_TRAMMING_MM // Report Z deviation (mm) for each point relative to the first
- //#define ASSISTED_TRAMMING_MENU_ITEM // Add a menu item to run G35 Assisted Tramming (MarlinUI)
- //#define ASSISTED_TRAMMING_WIZARD // Make the menu item open a Tramming Wizard sub-menu
+ //#define ASSISTED_TRAMMING_WIZARD // Add a Tramming Wizard to the LCD menu
+
//#define ASSISTED_TRAMMING_WAIT_POSITION { X_CENTER, Y_CENTER, 30 } // Move the nozzle out of the way for adjustment
/**
@@ -854,8 +859,6 @@
// If the Nozzle or Bed falls when the Z stepper is disabled, set its resting position here.
//#define Z_AFTER_DEACTIVATE Z_HOME_POS
-//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated
-
// Default Minimum Feedrates for printing and travel moves
#define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S.
#define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T.
@@ -1024,7 +1027,7 @@
/**
* I2C-based DIGIPOTs (e.g., Azteeg X3 Pro)
*/
-//#define DIGIPOT_MCP4018 // Requires https://github.com/stawel/SlowSoftI2CMaster
+//#define DIGIPOT_MCP4018 // Requires https://github.com/felias-fogg/SlowSoftI2CMaster
//#define DIGIPOT_MCP4451
#if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451)
#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT:4 AZTEEG_X3_PRO:8 MKS_SBASE:5 MIGHTYBOARD_REVE:5
@@ -1057,7 +1060,7 @@
#if EITHER(IS_ULTIPANEL, EXTENSIBLE_UI)
#define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel
- #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm)
+ #define FINE_MANUAL_MOVE 0.025 // (mm) Smallest manual move (< 0.1mm) applying to Z on most machines
#if IS_ULTIPANEL
#define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position"
#define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen
@@ -1086,7 +1089,8 @@
#if ENABLED(PROBE_OFFSET_WIZARD)
//
// Enable to init the Probe Z-Offset when starting the Wizard.
- // Use the estimated nozzle-to-probe Z offset, plus a little more.
+ // Use a height slightly above the estimated nozzle-to-probe Z offset.
+ // For example, with an offset of -5, consider a starting height of -4.
//
//#define PROBE_OFFSET_WIZARD_START_Z -4.0
@@ -1135,33 +1139,38 @@
#endif // HAS_LCD_MENU
-// Scroll a longer status message into view
-//#define STATUS_MESSAGE_SCROLLING
+#if HAS_DISPLAY
+ // The timeout (in ms) to return to the status screen from sub-menus
+ //#define LCD_TIMEOUT_TO_STATUS 15000
-// On the Info Screen, display XY with one decimal place when possible
-//#define LCD_DECIMAL_SMALL_XY
+ #if ENABLED(SHOW_BOOTSCREEN)
+ #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s)
+ #if EITHER(HAS_MARLINUI_U8GLIB, TFT_COLOR_UI)
+ #define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash)
+ #endif
+ #endif
-// The timeout (in ms) to return to the status screen from sub-menus
-//#define LCD_TIMEOUT_TO_STATUS 15000
+ // Scroll a longer status message into view
+ //#define STATUS_MESSAGE_SCROLLING
-// Add an 'M73' G-code to set the current percentage
-//#define LCD_SET_PROGRESS_MANUALLY
+ // On the Info Screen, display XY with one decimal place when possible
+ //#define LCD_DECIMAL_SMALL_XY
-// Show the E position (filament used) during printing
-//#define LCD_SHOW_E_TOTAL
+ // Add an 'M73' G-code to set the current percentage
+ //#define LCD_SET_PROGRESS_MANUALLY
-#if ENABLED(SHOW_BOOTSCREEN)
- #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s)
+ // Show the E position (filament used) during printing
+ //#define LCD_SHOW_E_TOTAL
#endif
-#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && ANY(HAS_MARLINUI_U8GLIB, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL)
+#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && ANY(HAS_MARLINUI_U8GLIB, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL, EXTENSIBLE_UI)
//#define SHOW_REMAINING_TIME // Display estimated time to completion
#if ENABLED(SHOW_REMAINING_TIME)
//#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation
//#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time
#endif
- #if HAS_MARLINUI_U8GLIB
+ #if EITHER(HAS_MARLINUI_U8GLIB, EXTENSIBLE_UI)
//#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits
#endif
@@ -1178,6 +1187,16 @@
#endif
#if ENABLED(SDSUPPORT)
+ /**
+ * SD Card SPI Speed
+ * May be required to resolve "volume init" errors.
+ *
+ * Enable and set to SPI_HALF_SPEED, SPI_QUARTER_SPEED, or SPI_EIGHTH_SPEED
+ * otherwise full speed will be applied.
+ *
+ * :['SPI_HALF_SPEED', 'SPI_QUARTER_SPEED', 'SPI_EIGHTH_SPEED']
+ */
+ //#define SD_SPI_SPEED SPI_HALF_SPEED
// The standard SD detect circuit reads LOW when media is inserted and HIGH when empty.
// Enable this option and set to HIGH if your SD cards are incorrectly detected.
@@ -1186,6 +1205,8 @@
//#define SD_IGNORE_AT_STARTUP // Don't mount the SD card when starting up
//#define SDCARD_READONLY // Read-only SD card (to save over 2K of flash)
+ //#define GCODE_REPEAT_MARKERS // Enable G-code M808 to set repeat markers and do looping
+
#define SD_PROCEDURE_DEPTH 1 // Increase if you need more nested M32 calls
#define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished
@@ -1197,6 +1218,7 @@
#define SD_MENU_CONFIRM_START // Confirm the selected SD file before printing
+ //#define NO_SD_AUTOSTART // Remove auto#.g file support completely to save some Flash, SRAM
//#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files
//#define BROWSE_MEDIA_ON_INSERT // Open the file browser when media is inserted
@@ -1319,9 +1341,6 @@
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
- #define USB_CS_PIN SDSS
- #define USB_INTR_PIN SD_DETECT_PIN
-
/**
* USB Host Shield Library
*
@@ -1332,7 +1351,18 @@
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
+ //#define USE_UHS2_USB
//#define USE_UHS3_USB
+
+ /**
+ * Native USB Host supported by some boards (USB OTG)
+ */
+ //#define USE_OTG_USB_HOST
+
+ #if DISABLED(USE_OTG_USB_HOST)
+ #define USB_CS_PIN SDSS
+ #define USB_INTR_PIN SD_DETECT_PIN
+ #endif
#endif
/**
@@ -1358,13 +1388,16 @@
* Set this option to one of the following (or the board's defaults apply):
*
* LCD - Use the SD drive in the external LCD controller.
- * ONBOARD - Use the SD drive on the control board. (No SD_DETECT_PIN. M21 to init.)
+ * ONBOARD - Use the SD drive on the control board.
* CUSTOM_CABLE - Use a custom cable to access the SD (as defined in a pins file).
*
* :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ]
*/
//#define SDCARD_CONNECTION LCD
+ // Enable if SD detect is rendered useless (e.g., by using an SD extender)
+ //#define NO_SD_DETECT
+
#endif // SDSUPPORT
/**
@@ -1446,7 +1479,6 @@
//#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap
//#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames
//#define STATUS_HEAT_PERCENT // Show heating in a progress bar
- //#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving 399 bytes of flash)
//#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of PROGMEM.
// Frivolous Game Options
@@ -1494,6 +1526,16 @@
#endif
#endif // HAS_DGUS_LCD
+//
+// Specify additional languages for the UI. Default specified by LCD_LANGUAGE.
+//
+#if EITHER(DOGLCD, TOUCH_UI_FTDI_EVE)
+ //#define LCD_LANGUAGE_2 fr
+ //#define LCD_LANGUAGE_3 de
+ //#define LCD_LANGUAGE_4 es
+ //#define LCD_LANGUAGE_5 it
+#endif
+
//
// Touch UI for the FTDI Embedded Video Engine (EVE)
//
@@ -1561,18 +1603,14 @@
//#define TOUCH_UI_UTF8_FRACTIONS // ¼ ½ ¾
//#define TOUCH_UI_UTF8_SYMBOLS // µ ¶ ¦ § ¬
#endif
+
+ // Cyrillic character set, costs about 27KiB of flash
+ //#define TOUCH_UI_UTF8_CYRILLIC_CHARSET
#endif
// Use a smaller font when labels don't fit buttons
#define TOUCH_UI_FIT_TEXT
- // Allow language selection from menu at run-time (otherwise use LCD_LANGUAGE)
- //#define LCD_LANGUAGE_1 en
- //#define LCD_LANGUAGE_2 fr
- //#define LCD_LANGUAGE_3 de
- //#define LCD_LANGUAGE_4 es
- //#define LCD_LANGUAGE_5 it
-
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE
@@ -1732,6 +1770,10 @@
//#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET)
#endif
+#if BOTH(AUTO_BED_LEVELING_UBL, EEPROM_SETTINGS)
+ //#define OPTIMIZED_MESH_STORAGE // Store mesh with less precision to save EEPROM space
+#endif
+
/**
* Repeatedly attempt G29 leveling until it succeeds.
* Stop after G29_MAX_RETRIES attempts.
@@ -2471,22 +2513,22 @@
* Set *_SERIAL_TX_PIN and *_SERIAL_RX_PIN to match for all drivers
* on the same serial port, either here or in your board's pins file.
*/
- #define X_SLAVE_ADDRESS 0
- #define Y_SLAVE_ADDRESS 0
- #define Z_SLAVE_ADDRESS 0
- #define X2_SLAVE_ADDRESS 0
- #define Y2_SLAVE_ADDRESS 0
- #define Z2_SLAVE_ADDRESS 0
- #define Z3_SLAVE_ADDRESS 0
- #define Z4_SLAVE_ADDRESS 0
- #define E0_SLAVE_ADDRESS 0
- #define E1_SLAVE_ADDRESS 0
- #define E2_SLAVE_ADDRESS 0
- #define E3_SLAVE_ADDRESS 0
- #define E4_SLAVE_ADDRESS 0
- #define E5_SLAVE_ADDRESS 0
- #define E6_SLAVE_ADDRESS 0
- #define E7_SLAVE_ADDRESS 0
+ //#define X_SLAVE_ADDRESS 0
+ //#define Y_SLAVE_ADDRESS 0
+ //#define Z_SLAVE_ADDRESS 0
+ //#define X2_SLAVE_ADDRESS 0
+ //#define Y2_SLAVE_ADDRESS 0
+ //#define Z2_SLAVE_ADDRESS 0
+ //#define Z3_SLAVE_ADDRESS 0
+ //#define Z4_SLAVE_ADDRESS 0
+ //#define E0_SLAVE_ADDRESS 0
+ //#define E1_SLAVE_ADDRESS 0
+ //#define E2_SLAVE_ADDRESS 0
+ //#define E3_SLAVE_ADDRESS 0
+ //#define E4_SLAVE_ADDRESS 0
+ //#define E5_SLAVE_ADDRESS 0
+ //#define E6_SLAVE_ADDRESS 0
+ //#define E7_SLAVE_ADDRESS 0
/**
* Software enable
@@ -3019,6 +3061,10 @@
#define SPEED_POWER_MAX 100 // (%) 0-100
#define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments)
+ // Define the minimum and maximum test pulse time values for a laser test fire function
+ #define LASER_TEST_PULSE_MIN 1 // Used with Laser Control Menu
+ #define LASER_TEST_PULSE_MAX 999 // Caution: Menu may not show more than 3 characters
+
/**
* Enable inline laser power to be handled in the planner / stepper routines.
* Inline power is specified by the I (inline) flag in an M3 command (e.g., M3 S20 I)
@@ -3301,7 +3347,7 @@
//#define USER_SCRIPT_RETURN // Return to status screen after a script
#define USER_DESC_1 "Home & UBL Info"
- #define USER_GCODE_1 "G28\nG29 W"
+ #define USER_GCODE_1 "G28\nG29W"
#define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL
#define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
@@ -3558,10 +3604,7 @@
//#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs
#elif HAS_PRUSA_MMU2
// Serial port used for communication with MMU2.
- // For AVR enable the UART port used for the MMU. (e.g., mmuSerial)
- // For 32-bit boards check your HAL for available serial ports. (e.g., Serial2)
#define MMU2_SERIAL_PORT 2
- #define MMU2_SERIAL mmuSerial
// Use hardware reset for MMU if a pin is defined for it
//#define MMU2_RST_PIN 23
diff --git a/Marlin/Version.h b/Marlin/Version.h
index fe0724fbfcb1..eb2f9f9a14d4 100644
--- a/Marlin/Version.h
+++ b/Marlin/Version.h
@@ -54,7 +54,7 @@
* has a distinct Github fork— the Source Code URL should just be the main
* Marlin repository.
*/
-//#define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin"
+//#define SOURCE_CODE_URL "github.com/MarlinFirmware/Marlin"
/**
* Default generic printer UUID.
@@ -65,7 +65,7 @@
* The WEBSITE_URL is the location where users can get more information such as
* documentation about a specific Marlin release.
*/
-//#define WEBSITE_URL "https://marlinfw.org"
+//#define WEBSITE_URL "marlinfw.org"
/**
* Set the vendor info the serial USB interface, if changable
diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h
index aa6a32132032..8b95acb0acbc 100644
--- a/Marlin/src/HAL/AVR/HAL.h
+++ b/Marlin/src/HAL/AVR/HAL.h
@@ -97,6 +97,13 @@ typedef int8_t pin_t;
#endif
#endif
+#ifdef MMU2_SERIAL_PORT
+ #if !WITHIN(MMU2_SERIAL_PORT, -1, 3)
+ #error "MMU2_SERIAL_PORT must be from -1 to 3. Please update your configuration."
+ #endif
+ #define MMU2_SERIAL mmuSerial
+#endif
+
#ifdef LCD_SERIAL_PORT
#if !WITHIN(LCD_SERIAL_PORT, -1, 3)
#error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
diff --git a/Marlin/src/HAL/AVR/HAL_SPI.cpp b/Marlin/src/HAL/AVR/HAL_SPI.cpp
index 31e589746cf2..3e5572e559fa 100644
--- a/Marlin/src/HAL/AVR/HAL_SPI.cpp
+++ b/Marlin/src/HAL/AVR/HAL_SPI.cpp
@@ -34,17 +34,17 @@
#include "../../inc/MarlinConfig.h"
void spiBegin() {
- OUT_WRITE(SS_PIN, HIGH);
- SET_OUTPUT(SCK_PIN);
- SET_INPUT(MISO_PIN);
- SET_OUTPUT(MOSI_PIN);
+ OUT_WRITE(SD_SS_PIN, HIGH);
+ SET_OUTPUT(SD_SCK_PIN);
+ SET_INPUT(SD_MISO_PIN);
+ SET_OUTPUT(SD_MOSI_PIN);
#if DISABLED(SOFTWARE_SPI)
// SS must be in output mode even it is not chip select
- //SET_OUTPUT(SS_PIN);
+ //SET_OUTPUT(SD_SS_PIN);
// set SS high - may be chip select for another SPI device
//#if SET_SPI_SS_HIGH
- //WRITE(SS_PIN, HIGH);
+ //WRITE(SD_SS_PIN, HIGH);
//#endif
// set a default rate
spiInit(1);
@@ -195,19 +195,19 @@ void spiBegin() {
// no interrupts during byte receive - about 8µs
cli();
// output pin high - like sending 0xFF
- WRITE(MOSI_PIN, HIGH);
+ WRITE(SD_MOSI_PIN, HIGH);
LOOP_L_N(i, 8) {
- WRITE(SCK_PIN, HIGH);
+ WRITE(SD_SCK_PIN, HIGH);
nop; // adjust so SCK is nice
nop;
data <<= 1;
- if (READ(MISO_PIN)) data |= 1;
+ if (READ(SD_MISO_PIN)) data |= 1;
- WRITE(SCK_PIN, LOW);
+ WRITE(SD_SCK_PIN, LOW);
}
sei();
@@ -225,10 +225,10 @@ void spiBegin() {
// no interrupts during byte send - about 8µs
cli();
LOOP_L_N(i, 8) {
- WRITE(SCK_PIN, LOW);
- WRITE(MOSI_PIN, data & 0x80);
+ WRITE(SD_SCK_PIN, LOW);
+ WRITE(SD_MOSI_PIN, data & 0x80);
data <<= 1;
- WRITE(SCK_PIN, HIGH);
+ WRITE(SD_SCK_PIN, HIGH);
}
nop; // hold SCK high for a few ns
@@ -236,7 +236,7 @@ void spiBegin() {
nop;
nop;
- WRITE(SCK_PIN, LOW);
+ WRITE(SD_SCK_PIN, LOW);
sei();
}
diff --git a/Marlin/src/HAL/AVR/endstop_interrupts.h b/Marlin/src/HAL/AVR/endstop_interrupts.h
index ae9a605accce..9fd9c38b86ad 100644
--- a/Marlin/src/HAL/AVR/endstop_interrupts.h
+++ b/Marlin/src/HAL/AVR/endstop_interrupts.h
@@ -124,7 +124,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(X_MAX_PIN);
#else
- static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(X_MAX_PIN);
#endif
#endif
@@ -132,7 +132,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(X_MIN_PIN);
#else
- static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(X_MIN_PIN);
#endif
#endif
@@ -140,7 +140,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Y_MAX_PIN);
#else
- static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Y_MAX_PIN);
#endif
#endif
@@ -148,7 +148,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Y_MIN_PIN);
#else
- static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Y_MIN_PIN);
#endif
#endif
@@ -156,7 +156,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Z_MAX_PIN);
#else
- static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Z_MAX_PIN);
#endif
#endif
@@ -164,7 +164,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Z_MIN_PIN);
#else
- static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Z_MIN_PIN);
#endif
#endif
@@ -172,7 +172,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(X2_MAX_PIN);
#else
- static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(X2_MAX_PIN);
#endif
#endif
@@ -180,7 +180,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(X2_MIN_PIN);
#else
- static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(X2_MIN_PIN);
#endif
#endif
@@ -188,7 +188,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Y2_MAX_PIN);
#else
- static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Y2_MAX_PIN);
#endif
#endif
@@ -196,7 +196,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Y2_MIN_PIN);
#else
- static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Y2_MIN_PIN);
#endif
#endif
@@ -204,7 +204,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Z2_MAX_PIN);
#else
- static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Z2_MAX_PIN);
#endif
#endif
@@ -212,7 +212,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Z2_MIN_PIN);
#else
- static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Z2_MIN_PIN);
#endif
#endif
@@ -220,7 +220,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Z3_MAX_PIN);
#else
- static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Z3_MAX_PIN);
#endif
#endif
@@ -228,7 +228,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Z3_MIN_PIN);
#else
- static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Z3_MIN_PIN);
#endif
#endif
@@ -236,7 +236,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Z4_MAX_PIN);
#else
- static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Z4_MAX_PIN);
#endif
#endif
@@ -244,7 +244,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Z4_MIN_PIN);
#else
- static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Z4_MIN_PIN);
#endif
#endif
@@ -252,7 +252,7 @@ void setup_endstop_interrupts() {
#if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
_ATTACH(Z_MIN_PROBE_PIN);
#else
- static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable");
+ static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
pciSetup(Z_MIN_PROBE_PIN);
#endif
#endif
diff --git a/Marlin/src/HAL/AVR/spi_pins.h b/Marlin/src/HAL/AVR/spi_pins.h
index f3fa78e2bfaf..831972938a7b 100644
--- a/Marlin/src/HAL/AVR/spi_pins.h
+++ b/Marlin/src/HAL/AVR/spi_pins.h
@@ -51,15 +51,15 @@
#define AVR_SS_PIN 16
#endif
-#ifndef SCK_PIN
- #define SCK_PIN AVR_SCK_PIN
+#ifndef SD_SCK_PIN
+ #define SD_SCK_PIN AVR_SCK_PIN
#endif
-#ifndef MISO_PIN
- #define MISO_PIN AVR_MISO_PIN
+#ifndef SD_MISO_PIN
+ #define SD_MISO_PIN AVR_MISO_PIN
#endif
-#ifndef MOSI_PIN
- #define MOSI_PIN AVR_MOSI_PIN
+#ifndef SD_MOSI_PIN
+ #define SD_MOSI_PIN AVR_MOSI_PIN
#endif
-#ifndef SS_PIN
- #define SS_PIN AVR_SS_PIN
+#ifndef SD_SS_PIN
+ #define SD_SS_PIN AVR_SS_PIN
#endif
diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h
index 395ca4ccc971..6a4d4f61498d 100644
--- a/Marlin/src/HAL/DUE/HAL.h
+++ b/Marlin/src/HAL/DUE/HAL.h
@@ -59,6 +59,14 @@
#endif
#endif
+#ifdef MMU2_SERIAL_PORT
+ #if WITHIN(MMU2_SERIAL_PORT, 0, 3)
+ #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
+ #else
+ #error "MMU2_SERIAL_PORT must be from 0 to 3. Please update your configuration."
+ #endif
+#endif
+
#ifdef LCD_SERIAL_PORT
#if LCD_SERIAL_PORT == -1
#define LCD_SERIAL lcdSerial
@@ -75,16 +83,6 @@
// On AVR this is in math.h?
#define square(x) ((x)*(x))
-#ifndef strncpy_P
- #define strncpy_P(dest, src, num) strncpy((dest), (src), (num))
-#endif
-
-// Fix bug in pgm_read_ptr
-#undef pgm_read_ptr
-#define pgm_read_ptr(addr) (*((void**)(addr)))
-#undef pgm_read_word
-#define pgm_read_word(addr) (*((uint16_t*)(addr)))
-
typedef int8_t pin_t;
#define SHARED_SERVOS HAS_SERVOS
diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp
index 0451d8bcc4ff..342c37373538 100644
--- a/Marlin/src/HAL/DUE/HAL_SPI.cpp
+++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp
@@ -69,10 +69,10 @@
// run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0
- uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */
- uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN);
- uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
- uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
+ uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
+ uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
+ uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
+ uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
uint32_t idx = 0;
/* Negate bout, as the assembler requires a negated value */
@@ -154,9 +154,9 @@
static uint8_t spiTransferRx0(uint8_t) { // using Mode 0
uint32_t bin = 0;
uint32_t work = 0;
- uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */
- uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
- uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
+ uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
+ uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
+ uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
/* The software SPI routine */
__asm__ __volatile__(
@@ -225,15 +225,15 @@
static uint8_t spiTransfer1(uint8_t b) { // using Mode 0
int bits = 8;
do {
- WRITE(MOSI_PIN, b & 0x80);
+ WRITE(SD_MOSI_PIN, b & 0x80);
b <<= 1; // little setup time
- WRITE(SCK_PIN, HIGH);
+ WRITE(SD_SCK_PIN, HIGH);
DELAY_NS(125); // 10 cycles @ 84mhz
- b |= (READ(MISO_PIN) != 0);
+ b |= (READ(SD_MISO_PIN) != 0);
- WRITE(SCK_PIN, LOW);
+ WRITE(SD_SCK_PIN, LOW);
DELAY_NS(125); // 10 cycles @ 84mhz
} while (--bits);
return b;
@@ -245,15 +245,15 @@
static uint8_t spiTransferX(uint8_t b) { // using Mode 0
int bits = 8;
do {
- WRITE(MOSI_PIN, b & 0x80);
+ WRITE(SD_MOSI_PIN, b & 0x80);
b <<= 1; // little setup time
- WRITE(SCK_PIN, HIGH);
+ WRITE(SD_SCK_PIN, HIGH);
__delay_4cycles(spiDelayCyclesX4);
- b |= (READ(MISO_PIN) != 0);
+ b |= (READ(SD_MISO_PIN) != 0);
- WRITE(SCK_PIN, LOW);
+ WRITE(SD_SCK_PIN, LOW);
__delay_4cycles(spiDelayCyclesX4);
} while (--bits);
return b;
@@ -271,10 +271,10 @@
// Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
static void spiTxBlock0(const uint8_t* ptr, uint32_t todo) {
- uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */
- uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN);
- uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
- uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
+ uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
+ uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
+ uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
+ uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
uint32_t work = 0;
uint32_t txval = 0;
@@ -352,9 +352,9 @@
static void spiRxBlock0(uint8_t* ptr, uint32_t todo) {
uint32_t bin = 0;
uint32_t work = 0;
- uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */
- uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
- uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
+ uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
+ uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
+ uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
/* The software SPI routine */
__asm__ __volatile__(
@@ -442,22 +442,22 @@
static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
#if MB(ALLIGATOR)
- #define _SS_WRITE(S) WRITE(SS_PIN, S)
+ #define _SS_WRITE(S) WRITE(SD_SS_PIN, S)
#else
#define _SS_WRITE(S) NOOP
#endif
void spiBegin() {
- SET_OUTPUT(SS_PIN);
+ SET_OUTPUT(SD_SS_PIN);
_SS_WRITE(HIGH);
- SET_OUTPUT(SCK_PIN);
- SET_INPUT(MISO_PIN);
- SET_OUTPUT(MOSI_PIN);
+ SET_OUTPUT(SD_SCK_PIN);
+ SET_INPUT(SD_MISO_PIN);
+ SET_OUTPUT(SD_MOSI_PIN);
}
uint8_t spiRec() {
_SS_WRITE(LOW);
- WRITE(MOSI_PIN, HIGH); // Output 1s 1
+ WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
uint8_t b = spiTransferRx(0xFF);
_SS_WRITE(HIGH);
return b;
@@ -466,7 +466,7 @@
void spiRead(uint8_t* buf, uint16_t nbyte) {
if (nbyte) {
_SS_WRITE(LOW);
- WRITE(MOSI_PIN, HIGH); // Output 1s 1
+ WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
spiRxBlock(buf, nbyte);
_SS_WRITE(HIGH);
}
@@ -519,8 +519,8 @@
}
_SS_WRITE(HIGH);
- WRITE(MOSI_PIN, HIGH);
- WRITE(SCK_PIN, LOW);
+ WRITE(SD_MOSI_PIN, HIGH);
+ WRITE(SD_SCK_PIN, LOW);
}
/** Begin SPI transaction, set clock, bit order, data mode */
@@ -575,20 +575,20 @@
// Configure SPI pins
PIO_Configure(
- g_APinDescription[SCK_PIN].pPort,
- g_APinDescription[SCK_PIN].ulPinType,
- g_APinDescription[SCK_PIN].ulPin,
- g_APinDescription[SCK_PIN].ulPinConfiguration);
+ g_APinDescription[SD_SCK_PIN].pPort,
+ g_APinDescription[SD_SCK_PIN].ulPinType,
+ g_APinDescription[SD_SCK_PIN].ulPin,
+ g_APinDescription[SD_SCK_PIN].ulPinConfiguration);
PIO_Configure(
- g_APinDescription[MOSI_PIN].pPort,
- g_APinDescription[MOSI_PIN].ulPinType,
- g_APinDescription[MOSI_PIN].ulPin,
- g_APinDescription[MOSI_PIN].ulPinConfiguration);
+ g_APinDescription[SD_MOSI_PIN].pPort,
+ g_APinDescription[SD_MOSI_PIN].ulPinType,
+ g_APinDescription[SD_MOSI_PIN].ulPin,
+ g_APinDescription[SD_MOSI_PIN].ulPinConfiguration);
PIO_Configure(
- g_APinDescription[MISO_PIN].pPort,
- g_APinDescription[MISO_PIN].ulPinType,
- g_APinDescription[MISO_PIN].ulPin,
- g_APinDescription[MISO_PIN].ulPinConfiguration);
+ g_APinDescription[SD_MISO_PIN].pPort,
+ g_APinDescription[SD_MISO_PIN].ulPinType,
+ g_APinDescription[SD_MISO_PIN].ulPin,
+ g_APinDescription[SD_MISO_PIN].ulPinConfiguration);
// set master mode, peripheral select, fault detection
SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS);
@@ -606,7 +606,7 @@
WRITE(SPI_EEPROM1_CS, HIGH);
WRITE(SPI_EEPROM2_CS, HIGH);
WRITE(SPI_FLASH_CS, HIGH);
- WRITE(SS_PIN, HIGH);
+ WRITE(SD_SS_PIN, HIGH);
OUT_WRITE(SDSS, LOW);
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
index be4b49c0f992..d07da15ad80e 100644
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
+++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
@@ -64,12 +64,11 @@
#include "../../../MarlinCore.h"
-void spiBegin();
-void spiInit(uint8_t spiRate);
-void spiSend(uint8_t b);
-void spiSend(const uint8_t* buf, size_t n);
+#ifndef LCD_SPI_SPEED
+ #define LCD_SPI_SPEED SPI_QUARTER_SPEED
+#endif
-#include "../../shared/Marduino.h"
+#include "../../shared/HAL_SPI.h"
#include "../fastio.h"
void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) {
@@ -100,11 +99,7 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
spiBegin();
- #ifndef SPI_SPEED
- #define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card
- #endif
- spiInit(2);
-
+ spiInit(LCD_SPI_SPEED);
break;
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
index ea7204fa366b..890546af58bb 100644
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
+++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
@@ -59,9 +59,6 @@
#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
-#undef SPI_SPEED
-#define SPI_SPEED 2 // About 2 MHz
-
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
#include "../../shared/Marduino.h"
diff --git a/Marlin/src/HAL/DUE/fastio.h b/Marlin/src/HAL/DUE/fastio.h
index 5fb8b4d01533..f375cb6b2977 100644
--- a/Marlin/src/HAL/DUE/fastio.h
+++ b/Marlin/src/HAL/DUE/fastio.h
@@ -50,7 +50,7 @@
#define PWM_PIN(P) WITHIN(P, 2, 13)
#ifndef MASK
- #define MASK(PIN) (1 << PIN)
+ #define MASK(PIN) _BV(PIN)
#endif
/**
diff --git a/Marlin/src/HAL/DUE/inc/SanityCheck.h b/Marlin/src/HAL/DUE/inc/SanityCheck.h
index 688069650630..26fb44f3980b 100644
--- a/Marlin/src/HAL/DUE/inc/SanityCheck.h
+++ b/Marlin/src/HAL/DUE/inc/SanityCheck.h
@@ -40,7 +40,7 @@
* Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
* as the TMC2130 soft SPI the most common setup.
*/
-#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == MOSI_PIN || TMC_SW_##P == MISO_PIN || TMC_SW_##P == SCK_PIN))
+#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == SD_MOSI_PIN || TMC_SW_##P == SD_MISO_PIN || TMC_SW_##P == SD_SCK_PIN))
#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
#if ENABLED(TMC_USE_SW_SPI)
diff --git a/Marlin/src/HAL/DUE/spi_pins.h b/Marlin/src/HAL/DUE/spi_pins.h
index e28eaf827020..cec22c2c374a 100644
--- a/Marlin/src/HAL/DUE/spi_pins.h
+++ b/Marlin/src/HAL/DUE/spi_pins.h
@@ -43,22 +43,22 @@
#define SPI_PIN 87
#define SPI_CHAN 1
#endif
- #define SCK_PIN 76
- #define MISO_PIN 74
- #define MOSI_PIN 75
+ #define SD_SCK_PIN 76
+ #define SD_MISO_PIN 74
+ #define SD_MOSI_PIN 75
#else
// defaults
#define DUE_SOFTWARE_SPI
- #ifndef SCK_PIN
- #define SCK_PIN 52
+ #ifndef SD_SCK_PIN
+ #define SD_SCK_PIN 52
#endif
- #ifndef MISO_PIN
- #define MISO_PIN 50
+ #ifndef SD_MISO_PIN
+ #define SD_MISO_PIN 50
#endif
- #ifndef MOSI_PIN
- #define MOSI_PIN 51
+ #ifndef SD_MOSI_PIN
+ #define SD_MOSI_PIN 51
#endif
#endif
/* A.28, A.29, B.21, C.26, C.29 */
-#define SS_PIN SDSS
+#define SD_SS_PIN SDSS
diff --git a/Marlin/src/HAL/DUE/timers.cpp b/Marlin/src/HAL/DUE/timers.cpp
index 9b937d1a7c83..65073c510d7c 100644
--- a/Marlin/src/HAL/DUE/timers.cpp
+++ b/Marlin/src/HAL/DUE/timers.cpp
@@ -121,7 +121,7 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num) {
// missing from CMSIS: Check if interrupt is enabled or not
static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
- return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0;
+ return TEST(NVIC->ISER[uint32_t(IRQn) >> 5], uint32_t(IRQn) & 0x1F);
}
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h
index 5ef13e0c21d4..d485b5d1d39d 100644
--- a/Marlin/src/HAL/ESP32/HAL.h
+++ b/Marlin/src/HAL/ESP32/HAL.h
@@ -67,10 +67,6 @@ extern portMUX_TYPE spinlock;
#define ENABLE_ISRS() if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock)
#define DISABLE_ISRS() portENTER_CRITICAL(&spinlock)
-// Fix bug in pgm_read_ptr
-#undef pgm_read_ptr
-#define pgm_read_ptr(addr) (*(addr))
-
// ------------------------
// Types
// ------------------------
@@ -90,6 +86,13 @@ extern uint16_t HAL_adc_result;
// Public functions
// ------------------------
+//
+// Tone
+//
+void toneInit();
+void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0);
+void noTone(const pin_t _pin);
+
// clear reset reason
void HAL_clear_reset_source();
diff --git a/Marlin/src/HAL/ESP32/HAL_SPI.cpp b/Marlin/src/HAL/ESP32/HAL_SPI.cpp
index 8e5875fc388d..8ee837ba1567 100644
--- a/Marlin/src/HAL/ESP32/HAL_SPI.cpp
+++ b/Marlin/src/HAL/ESP32/HAL_SPI.cpp
@@ -53,11 +53,11 @@ static SPISettings spiConfig;
// ------------------------
void spiBegin() {
- #if !PIN_EXISTS(SS)
- #error "SS_PIN not defined!"
+ #if !PIN_EXISTS(SD_SS)
+ #error "SD_SS_PIN not defined!"
#endif
- OUT_WRITE(SS_PIN, HIGH);
+ OUT_WRITE(SD_SS_PIN, HIGH);
}
void spiInit(uint8_t spiRate) {
diff --git a/Marlin/src/HAL/ESP32/Servo.h b/Marlin/src/HAL/ESP32/Servo.h
index b0d929452732..8542092d66ea 100644
--- a/Marlin/src/HAL/ESP32/Servo.h
+++ b/Marlin/src/HAL/ESP32/Servo.h
@@ -30,7 +30,7 @@ class Servo {
MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo
TAU_MSEC = 20,
TAU_USEC = (TAU_MSEC * 1000),
- MAX_COMPARE = ((1 << 16) - 1), // 65535
+ MAX_COMPARE = _BV(16) - 1, // 65535
CHANNEL_MAX_NUM = 16;
public:
diff --git a/Marlin/src/HAL/ESP32/Tone.cpp b/Marlin/src/HAL/ESP32/Tone.cpp
new file mode 100644
index 000000000000..376c0f32e129
--- /dev/null
+++ b/Marlin/src/HAL/ESP32/Tone.cpp
@@ -0,0 +1,59 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * Copypaste of SAMD51 HAL developed by Giuliano Zaro (AKA GMagician)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+/**
+ * Description: Tone function for ESP32
+ * Derived from https://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012
+ */
+
+#ifdef ARDUINO_ARCH_ESP32
+
+#include "../../inc/MarlinConfig.h"
+#include "HAL.h"
+
+static pin_t tone_pin;
+volatile static int32_t toggles;
+
+void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) {
+ tone_pin = _pin;
+ toggles = 2 * frequency * duration / 1000;
+ HAL_timer_start(TONE_TIMER_NUM, 2 * frequency);
+}
+
+void noTone(const pin_t _pin) {
+ HAL_timer_disable_interrupt(TONE_TIMER_NUM);
+ WRITE(_pin, LOW);
+}
+
+HAL_TONE_TIMER_ISR() {
+ HAL_timer_isr_prologue(TONE_TIMER_NUM);
+
+ if (toggles) {
+ toggles--;
+ TOGGLE(tone_pin);
+ }
+ else noTone(tone_pin); // turn off interrupt
+}
+
+#endif // ARDUINO_ARCH_ESP32
diff --git a/Marlin/src/HAL/ESP32/spi_pins.h b/Marlin/src/HAL/ESP32/spi_pins.h
index 15f8f2ab6b07..cfe71eee4a75 100644
--- a/Marlin/src/HAL/ESP32/spi_pins.h
+++ b/Marlin/src/HAL/ESP32/spi_pins.h
@@ -18,7 +18,7 @@
*/
#pragma once
-#define SS_PIN SDSS
-#define SCK_PIN 18
-#define MISO_PIN 19
-#define MOSI_PIN 23
+#define SD_SS_PIN SDSS
+#define SD_SCK_PIN 18
+#define SD_MISO_PIN 19
+#define SD_MOSI_PIN 23
diff --git a/Marlin/src/HAL/ESP32/timers.cpp b/Marlin/src/HAL/ESP32/timers.cpp
index 3300aea8a89c..57662a665882 100644
--- a/Marlin/src/HAL/ESP32/timers.cpp
+++ b/Marlin/src/HAL/ESP32/timers.cpp
@@ -45,7 +45,7 @@ const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = {
{ TIMER_GROUP_0, TIMER_0, STEPPER_TIMER_PRESCALE, stepTC_Handler }, // 0 - Stepper
{ TIMER_GROUP_0, TIMER_1, TEMP_TIMER_PRESCALE, tempTC_Handler }, // 1 - Temperature
{ TIMER_GROUP_1, TIMER_0, PWM_TIMER_PRESCALE, pwmTC_Handler }, // 2 - PWM
- { TIMER_GROUP_1, TIMER_1, 1, nullptr }, // 3
+ { TIMER_GROUP_1, TIMER_1, TONE_TIMER_PRESCALE, toneTC_Handler }, // 3 - Tone
};
// ------------------------
diff --git a/Marlin/src/HAL/ESP32/timers.h b/Marlin/src/HAL/ESP32/timers.h
index 98386e3980b9..a47697113d5d 100644
--- a/Marlin/src/HAL/ESP32/timers.h
+++ b/Marlin/src/HAL/ESP32/timers.h
@@ -44,6 +44,9 @@ typedef uint64_t hal_timer_t;
#ifndef PWM_TIMER_NUM
#define PWM_TIMER_NUM 2 // index of timer to use for PWM outputs
#endif
+#ifndef TONE_TIMER_NUM
+ #define TONE_TIMER_NUM 3 // index of timer for beeper tones
+#endif
#define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals
@@ -59,6 +62,8 @@ typedef uint64_t hal_timer_t;
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
+#define TONE_TIMER_PRESCALE 1000 // Arbitrary value, no idea what i'm doing here
+
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
@@ -90,11 +95,15 @@ typedef uint64_t hal_timer_t;
#ifndef HAL_PWM_TIMER_ISR
#define HAL_PWM_TIMER_ISR() extern "C" void pwmTC_Handler()
#endif
+#ifndef HAL_TONE_TIMER_ISR
+ #define HAL_TONE_TIMER_ISR() extern "C" void toneTC_Handler()
+#endif
extern "C" {
void tempTC_Handler();
void stepTC_Handler();
void pwmTC_Handler();
+ void toneTC_Handler();
}
// ------------------------
diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h
index 729f6c856e19..8eaee44cce4b 100644
--- a/Marlin/src/HAL/LINUX/HAL.h
+++ b/Marlin/src/HAL/LINUX/HAL.h
@@ -113,8 +113,3 @@ inline void HAL_reboot() {} // reboot the board or restart the bootloader
FORCE_INLINE static void DELAY_CYCLES(uint64_t x) {
Clock::delayCycles(x);
}
-
-// Add strcmp_P if missing
-#ifndef strcmp_P
- #define strcmp_P(a, b) strcmp((a), (b))
-#endif
diff --git a/Marlin/src/HAL/LINUX/include/Arduino.h b/Marlin/src/HAL/LINUX/include/Arduino.h
index 6aeb0db58335..d4086e259a2f 100644
--- a/Marlin/src/HAL/LINUX/include/Arduino.h
+++ b/Marlin/src/HAL/LINUX/include/Arduino.h
@@ -73,27 +73,6 @@ extern "C" {
void GpioDisableInt(uint32_t port, uint32_t pin);
}
-// Program Memory
-#define pgm_read_ptr(addr) (*((void**)(addr)))
-#define pgm_read_byte_near(addr) (*((uint8_t*)(addr)))
-#define pgm_read_float_near(addr) (*((float*)(addr)))
-#define pgm_read_word_near(addr) (*((uint16_t*)(addr)))
-#define pgm_read_dword_near(addr) (*((uint32_t*)(addr)))
-#define pgm_read_byte(addr) pgm_read_byte_near(addr)
-#define pgm_read_float(addr) pgm_read_float_near(addr)
-#define pgm_read_word(addr) pgm_read_word_near(addr)
-#define pgm_read_dword(addr) pgm_read_dword_near(addr)
-
-using std::memcpy;
-#define memcpy_P memcpy
-#define sprintf_P sprintf
-#define strstr_P strstr
-#define strncpy_P strncpy
-#define vsnprintf_P vsnprintf
-#define strcpy_P strcpy
-#define snprintf_P snprintf
-#define strlen_P strlen
-
// Time functions
extern "C" void delay(const int milis);
void _delay_ms(const int delay);
diff --git a/Marlin/src/HAL/LINUX/main.cpp b/Marlin/src/HAL/LINUX/main.cpp
index eadc409324c9..c409a83e5d55 100644
--- a/Marlin/src/HAL/LINUX/main.cpp
+++ b/Marlin/src/HAL/LINUX/main.cpp
@@ -1,6 +1,5 @@
/**
* Marlin 3D Printer Firmware
- *
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* This program is free software: you can redistribute it and/or modify
diff --git a/Marlin/src/HAL/LINUX/spi_pins.h b/Marlin/src/HAL/LINUX/spi_pins.h
index 01ba28e5b604..33136ac9dd80 100644
--- a/Marlin/src/HAL/LINUX/spi_pins.h
+++ b/Marlin/src/HAL/LINUX/spi_pins.h
@@ -24,31 +24,32 @@
#include "../../core/macros.h"
#include "../../inc/MarlinConfigPre.h"
-#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN)
+#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_ENABLE == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN)
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently
// needed due to the speed and mode required for communicating with each device being different.
// This requirement can be removed if the SPI access to these devices is updated to use
// spiBeginTransaction.
#endif
-/** onboard SD card */
-//#define SCK_PIN P0_07
-//#define MISO_PIN P0_08
-//#define MOSI_PIN P0_09
-//#define SS_PIN P0_06
-/** external */
-#ifndef SCK_PIN
- #define SCK_PIN 50
+// Onboard SD
+//#define SD_SCK_PIN P0_07
+//#define SD_MISO_PIN P0_08
+//#define SD_MOSI_PIN P0_09
+//#define SD_SS_PIN P0_06
+
+// External SD
+#ifndef SD_SCK_PIN
+ #define SD_SCK_PIN 50
#endif
-#ifndef MISO_PIN
- #define MISO_PIN 51
+#ifndef SD_MISO_PIN
+ #define SD_MISO_PIN 51
#endif
-#ifndef MOSI_PIN
- #define MOSI_PIN 52
+#ifndef SD_MOSI_PIN
+ #define SD_MOSI_PIN 52
#endif
-#ifndef SS_PIN
- #define SS_PIN 53
+#ifndef SD_SS_PIN
+ #define SD_SS_PIN 53
#endif
#ifndef SDSS
- #define SDSS SS_PIN
+ #define SDSS SD_SS_PIN
#endif
diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h
index 51a13389b1e6..c65fff474797 100644
--- a/Marlin/src/HAL/LPC1768/HAL.h
+++ b/Marlin/src/HAL/LPC1768/HAL.h
@@ -47,9 +47,6 @@ extern "C" volatile uint32_t _millis;
#include
#include
-// i2c uses 8-bit shifted address
-#define I2C_ADDRESS(A) uint8_t((A) << 1)
-
//
// Default graphical display delays
//
@@ -85,6 +82,16 @@ extern "C" volatile uint32_t _millis;
#endif
#endif
+#ifdef MMU2_SERIAL_PORT
+ #if MMU2_SERIAL_PORT == -1
+ #define MMU2_SERIAL UsbSerial
+ #elif WITHIN(MMU2_SERIAL_PORT, 0, 3)
+ #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
+ #else
+ #error "MMU2_SERIAL_PORT must be from -1 to 3. Please update your configuration."
+ #endif
+#endif
+
#ifdef LCD_SERIAL_PORT
#if LCD_SERIAL_PORT == -1
#define LCD_SERIAL UsbSerial
@@ -207,8 +214,3 @@ void HAL_clear_reset_source(void);
uint8_t HAL_get_reset_source(void);
inline void HAL_reboot() {} // reboot the board or restart the bootloader
-
-// Add strcmp_P if missing
-#ifndef strcmp_P
- #define strcmp_P(a, b) strcmp((a), (b))
-#endif
diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp
index 16ac789fc0f3..dbc89a33f547 100644
--- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp
+++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp
@@ -55,27 +55,33 @@
#include
#include
+#include "../shared/HAL_SPI.h"
+
// ------------------------
// Public functions
// ------------------------
#if ENABLED(LPC_SOFTWARE_SPI)
+ // Software SPI
+
#include
- // Software SPI
+ #ifndef HAL_SPI_SPEED
+ #define HAL_SPI_SPEED SPI_FULL_SPEED
+ #endif
- static uint8_t SPI_speed = 0;
+ static uint8_t SPI_speed = HAL_SPI_SPEED;
static uint8_t spiTransfer(uint8_t b) {
- return swSpiTransfer(b, SPI_speed, SCK_PIN, MISO_PIN, MOSI_PIN);
+ return swSpiTransfer(b, SPI_speed, SD_SCK_PIN, SD_MISO_PIN, SD_MOSI_PIN);
}
void spiBegin() {
- swSpiBegin(SCK_PIN, MISO_PIN, MOSI_PIN);
+ swSpiBegin(SD_SCK_PIN, SD_MISO_PIN, SD_MOSI_PIN);
}
void spiInit(uint8_t spiRate) {
- SPI_speed = swSpiInit(spiRate, SCK_PIN, MOSI_PIN);
+ SPI_speed = swSpiInit(spiRate, SD_SCK_PIN, SD_MOSI_PIN);
}
uint8_t spiRec() { return spiTransfer(0xFF); }
@@ -100,14 +106,20 @@
#else
- void spiBegin() { // setup SCK, MOSI & MISO pins for SSP0
- spiInit(SPI_SPEED);
- }
+ #ifndef HAL_SPI_SPEED
+ #ifdef SD_SPI_SPEED
+ #define HAL_SPI_SPEED SD_SPI_SPEED
+ #else
+ #define HAL_SPI_SPEED SPI_FULL_SPEED
+ #endif
+ #endif
+
+ void spiBegin() { spiInit(HAL_SPI_SPEED); } // Set up SCK, MOSI & MISO pins for SSP0
void spiInit(uint8_t spiRate) {
- #if MISO_PIN == BOARD_SPI1_MISO_PIN
+ #if SD_MISO_PIN == BOARD_SPI1_MISO_PIN
SPI.setModule(1);
- #elif MISO_PIN == BOARD_SPI2_MISO_PIN
+ #elif SD_MISO_PIN == BOARD_SPI2_MISO_PIN
SPI.setModule(2);
#endif
SPI.setDataSize(DATA_SIZE_8BIT);
@@ -150,10 +162,9 @@
(void)spiTransfer(buf[i]);
}
- /** Begin SPI transaction, set clock, bit order, data mode */
+ // Begin SPI transaction, set clock, bit order, data mode
void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
- // TODO: to be implemented
-
+ // TODO: Implement this method
}
#endif // LPC_SOFTWARE_SPI
@@ -392,9 +403,9 @@ void SPIClass::updateSettings() {
SSP_Init(_currentSetting->spi_d, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers
}
-#if MISO_PIN == BOARD_SPI1_MISO_PIN
+#if SD_MISO_PIN == BOARD_SPI1_MISO_PIN
SPIClass SPI(1);
-#elif MISO_PIN == BOARD_SPI2_MISO_PIN
+#elif SD_MISO_PIN == BOARD_SPI2_MISO_PIN
SPIClass SPI(2);
#endif
diff --git a/Marlin/src/HAL/LPC1768/eeprom_flash.cpp b/Marlin/src/HAL/LPC1768/eeprom_flash.cpp
index 3c0c3c8ec30e..38d2705d519a 100644
--- a/Marlin/src/HAL/LPC1768/eeprom_flash.cpp
+++ b/Marlin/src/HAL/LPC1768/eeprom_flash.cpp
@@ -25,7 +25,7 @@
* Emulate EEPROM storage using Flash Memory
*
* Use a single 32K flash sector to store EEPROM data. To reduce the
- * number of erase operations a simple "levelling" scheme is used that
+ * number of erase operations a simple "leveling" scheme is used that
* maintains a number of EEPROM "slots" within the larger flash sector.
* Each slot is used in turn and the entire sector is only erased when all
* slots have been used.
diff --git a/Marlin/src/HAL/LPC1768/endstop_interrupts.h b/Marlin/src/HAL/LPC1768/endstop_interrupts.h
index b0d0c0ec5c0a..126d6e7d5bb2 100644
--- a/Marlin/src/HAL/LPC1768/endstop_interrupts.h
+++ b/Marlin/src/HAL/LPC1768/endstop_interrupts.h
@@ -46,79 +46,79 @@ void setup_endstop_interrupts() {
#if HAS_X_MAX
#if !LPC1768_PIN_INTERRUPT_M(X_MAX_PIN)
- #error "X_MAX_PIN is not INTERRUPT-capable."
+ #error "X_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(X_MAX_PIN);
#endif
#if HAS_X_MIN
#if !LPC1768_PIN_INTERRUPT_M(X_MIN_PIN)
- #error "X_MIN_PIN is not INTERRUPT-capable."
+ #error "X_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(X_MIN_PIN);
#endif
#if HAS_Y_MAX
#if !LPC1768_PIN_INTERRUPT_M(Y_MAX_PIN)
- #error "Y_MAX_PIN is not INTERRUPT-capable."
+ #error "Y_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(Y_MAX_PIN);
#endif
#if HAS_Y_MIN
#if !LPC1768_PIN_INTERRUPT_M(Y_MIN_PIN)
- #error "Y_MIN_PIN is not INTERRUPT-capable."
+ #error "Y_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(Y_MIN_PIN);
#endif
#if HAS_Z_MAX
#if !LPC1768_PIN_INTERRUPT_M(Z_MAX_PIN)
- #error "Z_MAX_PIN is not INTERRUPT-capable."
+ #error "Z_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(Z_MAX_PIN);
#endif
#if HAS_Z_MIN
#if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PIN)
- #error "Z_MIN_PIN is not INTERRUPT-capable."
+ #error "Z_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(Z_MIN_PIN);
#endif
#if HAS_Z2_MAX
#if !LPC1768_PIN_INTERRUPT_M(Z2_MAX_PIN)
- #error "Z2_MAX_PIN is not INTERRUPT-capable."
+ #error "Z2_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(Z2_MAX_PIN);
#endif
#if HAS_Z2_MIN
#if !LPC1768_PIN_INTERRUPT_M(Z2_MIN_PIN)
- #error "Z2_MIN_PIN is not INTERRUPT-capable."
+ #error "Z2_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(Z2_MIN_PIN);
#endif
#if HAS_Z3_MAX
#if !LPC1768_PIN_INTERRUPT_M(Z3_MAX_PIN)
- #error "Z3_MIN_PIN is not INTERRUPT-capable."
+ #error "Z3_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(Z3_MAX_PIN);
#endif
#if HAS_Z3_MIN
#if !LPC1768_PIN_INTERRUPT_M(Z3_MIN_PIN)
- #error "Z3_MIN_PIN is not INTERRUPT-capable."
+ #error "Z3_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(Z3_MIN_PIN);
#endif
#if HAS_Z4_MAX
#if !LPC1768_PIN_INTERRUPT_M(Z4_MAX_PIN)
- #error "Z4_MIN_PIN is not INTERRUPT-capable."
+ #error "Z4_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(Z4_MAX_PIN);
#endif
#if HAS_Z4_MIN
#if !LPC1768_PIN_INTERRUPT_M(Z4_MIN_PIN)
- #error "Z4_MIN_PIN is not INTERRUPT-capable."
+ #error "Z4_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(Z4_MIN_PIN);
#endif
#if HAS_Z_MIN_PROBE_PIN
#if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PROBE_PIN)
- #error "Z_MIN_PROBE_PIN is not INTERRUPT-capable."
+ #error "Z_MIN_PROBE_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif
_ATTACH(Z_MIN_PROBE_PIN);
#endif
diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
index 21d149fcafe6..14890bcd6ece 100644
--- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
+++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
@@ -24,7 +24,7 @@
#if PIO_PLATFORM_VERSION < 1001
#error "nxplpc-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries. You may need to remove the platform and let it reinstall automatically."
#endif
-#if PIO_FRAMEWORK_VERSION < 2005
+#if PIO_FRAMEWORK_VERSION < 2006
#error "framework-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries."
#endif
@@ -116,8 +116,8 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
#elif HAS_WIRED_LCD
#if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1)
#error "Serial port pins (1) conflict with Encoder Buttons!"
- #elif ANY_TX(1, SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \
- || ANY_RX(1, LCD_SDSS, LCD_PINS_RS, MISO_PIN, DOGLCD_A0, SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN)
+ #elif ANY_TX(1, SD_SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK_PIN) \
+ || ANY_RX(1, LCD_SDSS, LCD_PINS_RS, SD_MISO_PIN, DOGLCD_A0, SD_SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN)
#error "Serial port pins (1) conflict with LCD pins!"
#endif
#endif
@@ -205,8 +205,8 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
#error "SDA0 overlaps with BEEPER_PIN!"
#elif IS_SCL0(BTN_ENC)
#error "SCL0 overlaps with Encoder Button!"
- #elif IS_SCL0(SS_PIN)
- #error "SCL0 overlaps with SS_PIN!"
+ #elif IS_SCL0(SD_SS_PIN)
+ #error "SCL0 overlaps with SD_SS_PIN!"
#elif IS_SCL0(LCD_SDSS)
#error "SCL0 overlaps with LCD_SDSS!"
#endif
diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp
index 96faf54d7fd2..f41a57637639 100644
--- a/Marlin/src/HAL/LPC1768/main.cpp
+++ b/Marlin/src/HAL/LPC1768/main.cpp
@@ -90,11 +90,11 @@ void HAL_init() {
//debug_frmwrk_init();
//_DBG("\n\nDebug running\n");
// Initialize the SD card chip select pins as soon as possible
- #if PIN_EXISTS(SS)
- OUT_WRITE(SS_PIN, HIGH);
+ #if PIN_EXISTS(SD_SS)
+ OUT_WRITE(SD_SS_PIN, HIGH);
#endif
- #if PIN_EXISTS(ONBOARD_SD_CS) && ONBOARD_SD_CS_PIN != SS_PIN
+ #if PIN_EXISTS(ONBOARD_SD_CS) && ONBOARD_SD_CS_PIN != SD_SS_PIN
OUT_WRITE(ONBOARD_SD_CS_PIN, HIGH);
#endif
diff --git a/Marlin/src/HAL/LPC1768/spi_pins.h b/Marlin/src/HAL/LPC1768/spi_pins.h
index b4da5d4df234..e7d774742f42 100644
--- a/Marlin/src/HAL/LPC1768/spi_pins.h
+++ b/Marlin/src/HAL/LPC1768/spi_pins.h
@@ -23,7 +23,7 @@
#include "../../core/macros.h"
-#if BOTH(SDSUPPORT, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN)
+#if BOTH(SDSUPPORT, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_ENABLE == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN)
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently
// needed due to the speed and mode required for communicating with each device being different.
// This requirement can be removed if the SPI access to these devices is updated to use
@@ -31,24 +31,24 @@
#endif
/** onboard SD card */
-//#define SCK_PIN P0_07
-//#define MISO_PIN P0_08
-//#define MOSI_PIN P0_09
-//#define SS_PIN P0_06
+//#define SD_SCK_PIN P0_07
+//#define SD_MISO_PIN P0_08
+//#define SD_MOSI_PIN P0_09
+//#define SD_SS_PIN P0_06
/** external */
-#ifndef SCK_PIN
- #define SCK_PIN P0_15
+#ifndef SD_SCK_PIN
+ #define SD_SCK_PIN P0_15
#endif
-#ifndef MISO_PIN
- #define MISO_PIN P0_17
+#ifndef SD_MISO_PIN
+ #define SD_MISO_PIN P0_17
#endif
-#ifndef MOSI_PIN
- #define MOSI_PIN P0_18
+#ifndef SD_MOSI_PIN
+ #define SD_MOSI_PIN P0_18
#endif
-#ifndef SS_PIN
- #define SS_PIN P1_23
+#ifndef SD_SS_PIN
+ #define SD_SS_PIN P1_23
#endif
#if !defined(SDSS) || SDSS == P_NC // gets defaulted in pins.h
#undef SDSS
- #define SDSS SS_PIN
+ #define SDSS SD_SS_PIN
#endif
diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.h b/Marlin/src/HAL/LPC1768/tft/xpt2046.h
index 29db0b3fc454..65602bda0f40 100644
--- a/Marlin/src/HAL/LPC1768/tft/xpt2046.h
+++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.h
@@ -28,16 +28,16 @@
#endif
#ifndef TOUCH_MISO_PIN
- #define TOUCH_MISO_PIN MISO_PIN
+ #define TOUCH_MISO_PIN SD_MISO_PIN
#endif
#ifndef TOUCH_MOSI_PIN
- #define TOUCH_MOSI_PIN MOSI_PIN
+ #define TOUCH_MOSI_PIN SD_MOSI_PIN
#endif
#ifndef TOUCH_SCK_PIN
- #define TOUCH_SCK_PIN SCK_PIN
+ #define TOUCH_SCK_PIN SD_SCK_PIN
#endif
#ifndef TOUCH_CS_PIN
- #define TOUCH_CS_PIN CS_PIN
+ #define TOUCH_CS_PIN SD_SS_PIN
#endif
#ifndef TOUCH_INT_PIN
#define TOUCH_INT_PIN -1
diff --git a/Marlin/src/HAL/LPC1768/timers.h b/Marlin/src/HAL/LPC1768/timers.h
index e6744fb005bf..4b638546856f 100644
--- a/Marlin/src/HAL/LPC1768/timers.h
+++ b/Marlin/src/HAL/LPC1768/timers.h
@@ -152,7 +152,7 @@ FORCE_INLINE static void HAL_timer_disable_interrupt(const uint8_t timer_num) {
// This function is missing from CMSIS
FORCE_INLINE static bool NVIC_GetEnableIRQ(IRQn_Type IRQn) {
- return (NVIC->ISER[((uint32_t)IRQn) >> 5] & (1 << ((uint32_t)IRQn) & 0x1F)) != 0;
+ return TEST(NVIC->ISER[uint32_t(IRQn) >> 5], uint32_t(IRQn) & 0x1F);
}
FORCE_INLINE static bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp
index 057e10e0f545..b1eea13d5747 100644
--- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp
+++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp
@@ -62,10 +62,13 @@
#include
#include "../../shared/HAL_SPI.h"
-void spiBegin();
-void spiInit(uint8_t spiRate);
-void spiSend(uint8_t b);
-void spiSend(const uint8_t* buf, size_t n);
+#ifndef LCD_SPI_SPEED
+ #ifdef SD_SPI_SPEED
+ #define LCD_SPI_SPEED SD_SPI_SPEED // Assume SPI speed shared with SD
+ #else
+ #define LCD_SPI_SPEED SPI_FULL_SPEED // Use full speed if SD speed is not supplied
+ #endif
+#endif
uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
switch (msg) {
@@ -81,10 +84,7 @@ uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val,
u8g_SetPIOutput(u8g, U8G_PI_RESET);
u8g_Delay(5);
spiBegin();
- #ifndef SPI_SPEED
- #define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card
- #endif
- spiInit(SPI_SPEED);
+ spiInit(LCD_SPI_SPEED);
break;
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp
index 10d84941625f..61211d9d881c 100644
--- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp
+++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp
@@ -62,9 +62,11 @@
#include
#include
#include "../../shared/Delay.h"
+#include "../../shared/HAL_SPI.h"
-#undef SPI_SPEED
-#define SPI_SPEED 3 // About 1 MHz
+#ifndef LCD_SPI_SPEED
+ #define LCD_SPI_SPEED SPI_EIGHTH_SPEED // About 1 MHz
+#endif
static pin_t SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL;
static uint8_t SPI_speed = 0;
@@ -92,7 +94,7 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar
u8g_SetPIOutput(u8g, U8G_PI_MOSI);
u8g_Delay(5);
- SPI_speed = swSpiInit(SPI_SPEED, SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL);
+ SPI_speed = swSpiInit(LCD_SPI_SPEED, SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL);
u8g_SetPILevel(u8g, U8G_PI_CS, 0);
u8g_SetPILevel(u8g, U8G_PI_SCK, 0);
diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
index ca9d6ecfbe25..7f38ec54aff7 100644
--- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
+++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
@@ -60,9 +60,11 @@
#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
#include
+#include "../../shared/HAL_SPI.h"
-#undef SPI_SPEED
-#define SPI_SPEED 2 // About 2 MHz
+#ifndef LCD_SPI_SPEED
+ #define LCD_SPI_SPEED SPI_QUARTER_SPEED // About 2 MHz
+#endif
#include
#include
@@ -145,7 +147,7 @@ uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val,
u8g_SetPIOutput(u8g, U8G_PI_CS);
u8g_SetPIOutput(u8g, U8G_PI_A0);
if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput(u8g, U8G_PI_RESET);
- SPI_speed = swSpiInit(SPI_SPEED, u8g->pin_list[U8G_PI_SCK], u8g->pin_list[U8G_PI_MOSI]);
+ SPI_speed = swSpiInit(LCD_SPI_SPEED, u8g->pin_list[U8G_PI_SCK], u8g->pin_list[U8G_PI_MOSI]);
u8g_SetPILevel(u8g, U8G_PI_SCK, 0);
u8g_SetPILevel(u8g, U8G_PI_MOSI, 0);
break;
diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h
index ff9310114641..fd2eb59475e9 100644
--- a/Marlin/src/HAL/SAMD51/HAL.h
+++ b/Marlin/src/HAL/SAMD51/HAL.h
@@ -57,6 +57,16 @@
#endif
#endif
+ #ifdef MMU2_SERIAL_PORT
+ #if MMU2_SERIAL_PORT == -1
+ #define MMU2_SERIAL Serial
+ #elif WITHIN(MMU2_SERIAL_PORT, 0, 3)
+ #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
+ #else
+ #error "MMU2_SERIAL_PORT must be from -1 to 3. Please update your configuration."
+ #endif
+ #endif
+
#ifdef LCD_SERIAL_PORT
#if LCD_SERIAL_PORT == -1
#define LCD_SERIAL Serial
diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp
index abc5f3acbf77..fac67cf5a3bc 100644
--- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp
+++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp
@@ -21,13 +21,13 @@
#ifdef ADAFRUIT_GRAND_CENTRAL_M4
/**
- * Framework doesn't define some serial to save sercom resources
+ * Framework doesn't define some serials to save sercom resources
* hence if these are used I need to define them
*/
#include "../../inc/MarlinConfig.h"
-#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1
+#if USING_SERIAL_1
Uart Serial2(&sercom4, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX);
void SERCOM4_0_Handler() { Serial2.IrqHandler(); }
void SERCOM4_1_Handler() { Serial2.IrqHandler(); }
@@ -35,7 +35,7 @@
void SERCOM4_3_Handler() { Serial2.IrqHandler(); }
#endif
-#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2
+#if USING_SERIAL_2
Uart Serial3(&sercom1, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX);
void SERCOM1_0_Handler() { Serial3.IrqHandler(); }
void SERCOM1_1_Handler() { Serial3.IrqHandler(); }
@@ -43,7 +43,7 @@
void SERCOM1_3_Handler() { Serial3.IrqHandler(); }
#endif
-#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3
+#if USING_SERIAL_3
Uart Serial4(&sercom5, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX, PAD_SERIAL4_TX);
void SERCOM5_0_Handler() { Serial4.IrqHandler(); }
void SERCOM5_1_Handler() { Serial4.IrqHandler(); }
diff --git a/Marlin/src/HAL/SAMD51/fastio.h b/Marlin/src/HAL/SAMD51/fastio.h
index c456dfce30cb..a95b7cac0ce9 100644
--- a/Marlin/src/HAL/SAMD51/fastio.h
+++ b/Marlin/src/HAL/SAMD51/fastio.h
@@ -31,7 +31,7 @@
*/
#ifndef MASK
- #define MASK(PIN) (1 << PIN)
+ #define MASK(PIN) _BV(PIN)
#endif
/**
diff --git a/Marlin/src/HAL/SAMD51/spi_pins.h b/Marlin/src/HAL/SAMD51/spi_pins.h
index 5a9b1275ef88..2a667bcaa1ce 100644
--- a/Marlin/src/HAL/SAMD51/spi_pins.h
+++ b/Marlin/src/HAL/SAMD51/spi_pins.h
@@ -30,16 +30,16 @@
* SPI | 53 52 50 51 |
* SPI1 | 83 81 80 82 |
* +-------------------------+
- * Any pin can be used for Chip Select (SS_PIN)
+ * Any pin can be used for Chip Select (SD_SS_PIN)
*/
- #ifndef SCK_PIN
- #define SCK_PIN 52
+ #ifndef SD_SCK_PIN
+ #define SD_SCK_PIN 52
#endif
- #ifndef MISO_PIN
- #define MISO_PIN 50
+ #ifndef SD_MISO_PIN
+ #define SD_MISO_PIN 50
#endif
- #ifndef MOSI_PIN
- #define MOSI_PIN 51
+ #ifndef SD_MOSI_PIN
+ #define SD_MOSI_PIN 51
#endif
#ifndef SDSS
#define SDSS 53
@@ -51,4 +51,4 @@
#endif
-#define SS_PIN SDSS
+#define SD_SS_PIN SDSS
diff --git a/Marlin/src/HAL/SAMD51/timers.cpp b/Marlin/src/HAL/SAMD51/timers.cpp
index a68af2e074ae..5c55d324079a 100644
--- a/Marlin/src/HAL/SAMD51/timers.cpp
+++ b/Marlin/src/HAL/SAMD51/timers.cpp
@@ -157,7 +157,7 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num) {
// missing from CMSIS: Check if interrupt is enabled or not
static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
- return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0;
+ return TEST(NVIC->ISER[uint32_t(IRQn) >> 5], uint32_t(IRQn) & 0x1F);
}
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h
index 16dc7a453994..9d0c421a1919 100644
--- a/Marlin/src/HAL/STM32/HAL.h
+++ b/Marlin/src/HAL/STM32/HAL.h
@@ -29,6 +29,7 @@
#include "../shared/math_32bit.h"
#include "../shared/HAL_SPI.h"
#include "fastio.h"
+#include "Servo.h"
#include "watchdog.h"
#include "MarlinSerial.h"
@@ -64,6 +65,16 @@
#endif
#endif
+#ifdef MMU2_SERIAL_PORT
+ #if MMU2_SERIAL_PORT == -1
+ #define MMU2_SERIAL SerialUSB
+ #elif WITHIN(MMU2_SERIAL_PORT, 1, 6)
+ #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
+ #else
+ #error "MMU2_SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration."
+ #endif
+#endif
+
#ifdef LCD_SERIAL_PORT
#if LCD_SERIAL_PORT == -1
#define LCD_SERIAL SerialUSB
@@ -95,14 +106,6 @@
// On AVR this is in math.h?
#define square(x) ((x)*(x))
-#ifndef strncpy_P
- #define strncpy_P(dest, src, num) strncpy((dest), (src), (num))
-#endif
-
-// Fix bug in pgm_read_ptr
-#undef pgm_read_ptr
-#define pgm_read_ptr(addr) (*(addr))
-
// ------------------------
// Types
// ------------------------
@@ -110,6 +113,8 @@
typedef int16_t pin_t;
#define HAL_SERVO_LIB libServo
+#define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos()
+#define RESUME_SERVO_OUTPUT() libServo::resume_all_servos()
// ------------------------
// Public Variables
@@ -140,19 +145,15 @@ void _delay_ms(const int delay);
extern "C" char* _sbrk(int incr);
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-function"
-#endif
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-function"
static inline int freeMemory() {
volatile char top;
return &top - reinterpret_cast(_sbrk(0));
}
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic pop
-#endif
+#pragma GCC diagnostic pop
//
// ADC
@@ -160,14 +161,14 @@ static inline int freeMemory() {
#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT)
-inline void HAL_adc_init() {}
-
#define HAL_ADC_VREF 3.3
-#define HAL_ADC_RESOLUTION 10
+#define HAL_ADC_RESOLUTION ADC_RESOLUTION // 12
#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin)
#define HAL_READ_ADC() HAL_adc_result
#define HAL_ADC_READY() true
+inline void HAL_adc_init() { analogReadResolution(HAL_ADC_RESOLUTION); }
+
void HAL_adc_start_conversion(const uint8_t adc_pin);
uint16_t HAL_adc_get_result();
diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp
index f947e6ef3272..eef480777bb7 100644
--- a/Marlin/src/HAL/STM32/HAL_SPI.cpp
+++ b/Marlin/src/HAL/STM32/HAL_SPI.cpp
@@ -45,10 +45,10 @@ static SPISettings spiConfig;
#include "../shared/Delay.h"
void spiBegin(void) {
- OUT_WRITE(SS_PIN, HIGH);
- OUT_WRITE(SCK_PIN, HIGH);
- SET_INPUT(MISO_PIN);
- OUT_WRITE(MOSI_PIN, HIGH);
+ OUT_WRITE(SD_SS_PIN, HIGH);
+ OUT_WRITE(SD_SCK_PIN, HIGH);
+ SET_INPUT(SD_MISO_PIN);
+ OUT_WRITE(SD_MOSI_PIN, HIGH);
}
static uint16_t delay_STM32_soft_spi;
@@ -72,15 +72,15 @@ static SPISettings spiConfig;
uint8_t HAL_SPI_STM32_SpiTransfer_Mode_3(uint8_t b) { // using Mode 3
for (uint8_t bits = 8; bits--;) {
- WRITE(SCK_PIN, LOW);
- WRITE(MOSI_PIN, b & 0x80);
+ WRITE(SD_SCK_PIN, LOW);
+ WRITE(SD_MOSI_PIN, b & 0x80);
DELAY_NS(delay_STM32_soft_spi);
- WRITE(SCK_PIN, HIGH);
+ WRITE(SD_SCK_PIN, HIGH);
DELAY_NS(delay_STM32_soft_spi);
b <<= 1; // little setup time
- b |= (READ(MISO_PIN) != 0);
+ b |= (READ(SD_MISO_PIN) != 0);
}
DELAY_NS(125);
return b;
@@ -132,8 +132,8 @@ static SPISettings spiConfig;
* @details Only configures SS pin since stm32duino creates and initialize the SPI object
*/
void spiBegin() {
- #if PIN_EXISTS(SS)
- OUT_WRITE(SS_PIN, HIGH);
+ #if PIN_EXISTS(SD_SS)
+ OUT_WRITE(SD_SS_PIN, HIGH);
#endif
}
@@ -154,10 +154,9 @@ static SPISettings spiConfig;
spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0);
#if ENABLED(CUSTOM_SPI_PINS)
- SPI.setMISO(MISO_PIN);
- SPI.setMOSI(MOSI_PIN);
- SPI.setSCLK(SCK_PIN);
- SPI.setSSEL(SS_PIN);
+ SPI.setMISO(SD_MISO_PIN);
+ SPI.setMOSI(SD_MOSI_PIN);
+ SPI.setSCLK(SD_SCK_PIN);
#endif
SPI.begin();
diff --git a/Marlin/src/HAL/STM32/MarlinSPI.cpp b/Marlin/src/HAL/STM32/MarlinSPI.cpp
index da11b88a60b1..5086b4178461 100644
--- a/Marlin/src/HAL/STM32/MarlinSPI.cpp
+++ b/Marlin/src/HAL/STM32/MarlinSPI.cpp
@@ -19,7 +19,6 @@
* along with this program. If not, see .
*
*/
-
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#include "MarlinSPI.h"
@@ -61,7 +60,6 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH
_dmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
}
#ifdef STM32F4xx
- _dmaHandle.Init.Channel = DMA_CHANNEL_3;
_dmaHandle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
#endif
@@ -74,7 +72,8 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH
_dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Channel3 : DMA1_Channel2;
#elif defined(STM32F4xx)
__HAL_RCC_DMA2_CLK_ENABLE();
- _dmaHandle.Instance = DMA2_Stream3;
+ _dmaHandle.Init.Channel = DMA_CHANNEL_3;
+ _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA2_Stream3 : DMA2_Stream0;
#endif
}
#endif
@@ -84,7 +83,9 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH
__HAL_RCC_DMA1_CLK_ENABLE();
_dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Channel5 : DMA1_Channel4;
#elif defined(STM32F4xx)
- //TODO: f4 dma config
+ __HAL_RCC_DMA1_CLK_ENABLE();
+ _dmaHandle.Init.Channel = DMA_CHANNEL_0;
+ _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Stream4 : DMA1_Stream3;
#endif
}
#endif
@@ -94,7 +95,9 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH
__HAL_RCC_DMA2_CLK_ENABLE();
_dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA2_Channel2 : DMA2_Channel1;
#elif defined(STM32F4xx)
- //TODO: f4 dma config
+ __HAL_RCC_DMA1_CLK_ENABLE();
+ _dmaHandle.Init.Channel = DMA_CHANNEL_0;
+ _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Stream5 : DMA1_Stream2;
#endif
}
#endif
diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp
index a146664366df..4d9177248ad6 100644
--- a/Marlin/src/HAL/STM32/MarlinSerial.cpp
+++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp
@@ -16,7 +16,6 @@
* along with this program. If not, see .
*
*/
-
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#include "../../inc/MarlinConfig.h"
@@ -49,6 +48,10 @@
DECLARE_SERIAL_PORT_EXP(SERIAL_PORT_2)
#endif
+#if defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT >= 0
+ DECLARE_SERIAL_PORT_EXP(MMU2_SERIAL_PORT)
+#endif
+
#if defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT >= 0
DECLARE_SERIAL_PORT_EXP(LCD_SERIAL_PORT)
#endif
diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp
index 9c2666ed26f4..e00fb9b16f7a 100644
--- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp
+++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp
@@ -19,10 +19,11 @@
* along with this program. If not, see .
*
*/
+#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#include "../../inc/MarlinConfig.h"
-#if ENABLED(SDIO_SUPPORT) && !defined(STM32GENERIC)
+#if ENABLED(SDIO_SUPPORT)
#include
#include
@@ -87,18 +88,37 @@
MKS Robin board seems to have stable SDIO with BusWide 1bit and ClockDiv 8 i.e. 4.8MHz SDIO clock frequency
Additional testing is required as there are clearly some 4bit initialization problems
-
- Add -DTRANSFER_CLOCK_DIV=8 to build parameters to improve SDIO stability
*/
- #ifndef TRANSFER_CLOCK_DIV
- #define TRANSFER_CLOCK_DIV (uint8_t(SDIO_INIT_CLK_DIV) / 40)
- #endif
-
#ifndef USBD_OK
#define USBD_OK 0
#endif
+ // Target Clock, configurable. Default is 18MHz, from STM32F1
+ #ifndef SDIO_CLOCK
+ #define SDIO_CLOCK 18000000 /* 18 MHz */
+ #endif
+
+ // SDIO retries, configurable. Default is 3, from STM32F1
+ #ifndef SDIO_READ_RETRIES
+ #define SDIO_READ_RETRIES 3
+ #endif
+
+ // SDIO Max Clock (naming from STM Manual, don't change)
+ #define SDIOCLK 48000000
+
+ static uint32_t clock_to_divider(uint32_t clk) {
+ // limit the SDIO master clock to 8/3 of PCLK2. See STM32 Manuals
+ // Also limited to no more than 48Mhz (SDIOCLK).
+ const uint32_t pclk2 = HAL_RCC_GetPCLK2Freq();
+ clk = min(clk, (uint32_t)(pclk2 * 8 / 3));
+ clk = min(clk, (uint32_t)SDIOCLK);
+ // Round up divider, so we don't run the card over the speed supported,
+ // and subtract by 2, because STM32 will add 2, as written in the manual:
+ // SDIO_CK frequency = SDIOCLK / [CLKDIV + 2]
+ return pclk2 / clk + (pclk2 % clk != 0) - 2;
+ }
+
void go_to_transfer_speed() {
SD_InitTypeDef Init;
@@ -108,7 +128,7 @@
Init.ClockPowerSave = hsd.Init.ClockPowerSave;
Init.BusWide = hsd.Init.BusWide;
Init.HardwareFlowControl = hsd.Init.HardwareFlowControl;
- Init.ClockDiv = TRANSFER_CLOCK_DIV;
+ Init.ClockDiv = clock_to_divider(SDIO_CLOCK);
/* Initialize SDIO peripheral interface with default configuration */
SDIO_Init(hsd.Instance, Init);
@@ -154,38 +174,25 @@
//Initialize the SDIO (with initial <400Khz Clock)
tempreg = 0; //Reset value
tempreg |= SDIO_CLKCR_CLKEN; // Clock enabled
- tempreg |= (uint32_t)0x76; // Clock Divider. Clock = 48000 / (118 + 2) = 400Khz
+ tempreg |= SDIO_INIT_CLK_DIV; // Clock Divider. Clock = 48000 / (118 + 2) = 400Khz
// Keep the rest at 0 => HW_Flow Disabled, Rising Clock Edge, Disable CLK ByPass, Bus Width = 0, Power save Disable
SDIO->CLKCR = tempreg;
// Power up the SDIO
- SDIO->POWER = 0x03;
+ SDIO_PowerState_ON(SDIO);
}
void HAL_SD_MspInit(SD_HandleTypeDef *hsd) { // application specific init
- UNUSED(hsd); /* Prevent unused argument(s) compilation warning */
+ UNUSED(hsd); // Prevent unused argument(s) compilation warning
__HAL_RCC_SDIO_CLK_ENABLE(); // turn on SDIO clock
}
- constexpr uint8_t SD_RETRY_COUNT = TERN(SD_CHECK_AND_RETRY, 3, 1);
-
bool SDIO_Init() {
- //init SDIO and get SD card info
-
- uint8_t retryCnt = SD_RETRY_COUNT;
+ uint8_t retryCnt = SDIO_READ_RETRIES;
bool status;
hsd.Instance = SDIO;
- hsd.State = (HAL_SD_StateTypeDef) 0; // HAL_SD_STATE_RESET
-
- /*
- hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
- hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
- hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
- hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
- hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
- hsd.Init.ClockDiv = 8;
- */
+ hsd.State = HAL_SD_STATE_RESET;
SD_LowLevel_Init();
@@ -257,7 +264,7 @@
bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) {
hsd.Instance = SDIO;
- uint8_t retryCnt = SD_RETRY_COUNT;
+ uint8_t retryCnt = SDIO_READ_RETRIES;
bool status;
for (;;) {
@@ -306,7 +313,7 @@
bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) {
hsd.Instance = SDIO;
- uint8_t retryCnt = SD_RETRY_COUNT;
+ uint8_t retryCnt = SDIO_READ_RETRIES;
bool status;
for (;;) {
status = (bool) HAL_SD_WriteBlocks(&hsd, (uint8_t*)src, block, 1, 500); // write one 512 byte block with 500mS timeout
@@ -319,3 +326,4 @@
#endif // !USBD_USE_CDC_COMPOSITE
#endif // SDIO_SUPPORT
+#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp
index 702e42e561f8..8cd62879a5c6 100644
--- a/Marlin/src/HAL/STM32/eeprom_flash.cpp
+++ b/Marlin/src/HAL/STM32/eeprom_flash.cpp
@@ -28,15 +28,6 @@
#include "../shared/eeprom_api.h"
-#if HAS_SERVOS
- #include "Servo.h"
- #define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos()
- #define RESUME_SERVO_OUTPUT() libServo::resume_all_servos()
-#else
- #define PAUSE_SERVO_OUTPUT()
- #define RESUME_SERVO_OUTPUT()
-#endif
-
/**
* The STM32 HAL supports chips that deal with "pages" and some with "sectors" and some that
* even have multiple "banks" of flash.
@@ -172,11 +163,11 @@ bool PersistentStore::access_finish() {
current_slot = EEPROM_SLOTS - 1;
UNLOCK_FLASH();
- PAUSE_SERVO_OUTPUT();
+ TERN_(HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT());
DISABLE_ISRS();
status = HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);
ENABLE_ISRS();
- RESUME_SERVO_OUTPUT();
+ TERN_(HAS_PAUSE_SERVO_OUTPUT, RESUME_SERVO_OUTPUT());
if (status != HAL_OK) {
DEBUG_ECHOLNPAIR("HAL_FLASHEx_Erase=", status);
DEBUG_ECHOLNPAIR("GetError=", HAL_FLASH_GetError());
@@ -227,11 +218,11 @@ bool PersistentStore::access_finish() {
// Interrupts during this time can have unpredictable results, such as killing Servo
// output. Servo output still glitches with interrupts disabled, but recovers after the
// erase.
- PAUSE_SERVO_OUTPUT();
+ TERN_(HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT());
DISABLE_ISRS();
eeprom_buffer_flush();
ENABLE_ISRS();
- RESUME_SERVO_OUTPUT();
+ TERN_(HAS_PAUSE_SERVO_OUTPUT, RESUME_SERVO_OUTPUT());
eeprom_data_written = false;
#endif
diff --git a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp
index c9180bf09b22..f811468fb484 100644
--- a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp
+++ b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp
@@ -19,13 +19,12 @@
* along with this program. If not, see .
*
*/
+#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
/**
* Implementation of EEPROM settings in SD Card
*/
-#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
-
#include "../../inc/MarlinConfig.h"
#if ENABLED(SDCARD_EEPROM_EMULATION)
@@ -89,4 +88,4 @@ bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uin
}
#endif // SDCARD_EEPROM_EMULATION
-#endif // STM32 && !STM32GENERIC
+#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/STM32/fast_pwm.cpp b/Marlin/src/HAL/STM32/fast_pwm.cpp
index 99101c6e81fe..42eecb5e1a96 100644
--- a/Marlin/src/HAL/STM32/fast_pwm.cpp
+++ b/Marlin/src/HAL/STM32/fast_pwm.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#include "../../inc/MarlinConfigPre.h"
@@ -55,3 +56,4 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255
}
#endif // NEEDS_HARDWARE_PWM
+#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/STM32/fastio.h b/Marlin/src/HAL/STM32/fastio.h
index ea28b8f3bfaa..17751c44dd8d 100644
--- a/Marlin/src/HAL/STM32/fastio.h
+++ b/Marlin/src/HAL/STM32/fastio.h
@@ -59,7 +59,7 @@ void FastIO_init(); // Must be called before using fast io macros
#endif
#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->IDR, _BV32(STM_PIN(digitalPinToPinName(IO)))))
-#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->ODR ^= _BV32(STM_PIN(digitalPinToPinName(IO))))
+#define _TOGGLE(IO) TBI32(FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->ODR, STM_PIN(digitalPinToPinName(IO)))
#define _GET_MODE(IO)
#define _SET_MODE(IO,M) pinMode(IO, M)
diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h
index c51fecc7bdb9..4df75a050558 100644
--- a/Marlin/src/HAL/STM32/inc/SanityCheck.h
+++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h
@@ -51,3 +51,7 @@
#elif ENABLED(SERIAL_STATS_DROPPED_RX)
#error "SERIAL_STATS_DROPPED_RX is not supported on this platform."
#endif
+
+#if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) && NOT_TARGET(STM32F4xx, STM32F1xx)
+ #error "TFT_COLOR_UI, TFT_LVGL_UI and TFT_CLASSIC_UI are currently only supported on STM32F4 and STM32F1 hardware."
+#endif
diff --git a/Marlin/src/HAL/STM32/pinsDebug.h b/Marlin/src/HAL/STM32/pinsDebug.h
index 77c93ee41e36..048f788e3d08 100644
--- a/Marlin/src/HAL/STM32/pinsDebug.h
+++ b/Marlin/src/HAL/STM32/pinsDebug.h
@@ -137,32 +137,18 @@ const XrefInfo pin_xref[] PROGMEM = {
#endif
uint8_t get_pin_mode(const pin_t Ard_num) {
- uint32_t mode_all = 0;
const PinName dp = digitalPinToPinName(Ard_num);
- switch (PORT_ALPHA(dp)) {
- case 'A' : mode_all = GPIOA->MODER; break;
- case 'B' : mode_all = GPIOB->MODER; break;
- case 'C' : mode_all = GPIOC->MODER; break;
- case 'D' : mode_all = GPIOD->MODER; break;
- #ifdef PE_0
- case 'E' : mode_all = GPIOE->MODER; break;
- #elif defined(PF_0)
- case 'F' : mode_all = GPIOF->MODER; break;
- #elif defined(PG_0)
- case 'G' : mode_all = GPIOG->MODER; break;
- #elif defined(PH_0)
- case 'H' : mode_all = GPIOH->MODER; break;
- #elif defined(PI_0)
- case 'I' : mode_all = GPIOI->MODER; break;
- #elif defined(PJ_0)
- case 'J' : mode_all = GPIOJ->MODER; break;
- #elif defined(PK_0)
- case 'K' : mode_all = GPIOK->MODER; break;
- #elif defined(PL_0)
- case 'L' : mode_all = GPIOL->MODER; break;
- #endif
+ uint32_t ll_pin = STM_LL_GPIO_PIN(dp);
+ GPIO_TypeDef *port = get_GPIO_Port(STM_PORT(dp));
+ uint32_t mode = LL_GPIO_GetPinMode(port, ll_pin);
+ switch (mode) {
+ case LL_GPIO_MODE_ANALOG: return MODE_PIN_ANALOG;
+ case LL_GPIO_MODE_INPUT: return MODE_PIN_INPUT;
+ case LL_GPIO_MODE_OUTPUT: return MODE_PIN_OUTPUT;
+ case LL_GPIO_MODE_ALTERNATE: return MODE_PIN_ALT;
+ TERN_(STM32F1xx, case LL_GPIO_MODE_FLOATING:)
+ default: return 0;
}
- return (mode_all >> (2 * uint8_t(PIN_NUM(dp)))) & 0x03;
}
bool GET_PINMODE(const pin_t Ard_num) {
@@ -217,58 +203,62 @@ bool pwm_status(const pin_t Ard_num) {
}
void pwm_details(const pin_t Ard_num) {
- if (pwm_status(Ard_num)) {
- uint32_t alt_all = 0;
- const PinName dp = digitalPinToPinName(Ard_num);
- pin_t pin_number = uint8_t(PIN_NUM(dp));
- const bool over_7 = pin_number >= 8;
- const uint8_t ind = over_7 ? 1 : 0;
- switch (PORT_ALPHA(dp)) { // get alt function
- case 'A' : alt_all = GPIOA->AFR[ind]; break;
- case 'B' : alt_all = GPIOB->AFR[ind]; break;
- case 'C' : alt_all = GPIOC->AFR[ind]; break;
- case 'D' : alt_all = GPIOD->AFR[ind]; break;
- #ifdef PE_0
- case 'E' : alt_all = GPIOE->AFR[ind]; break;
- #elif defined (PF_0)
- case 'F' : alt_all = GPIOF->AFR[ind]; break;
- #elif defined (PG_0)
- case 'G' : alt_all = GPIOG->AFR[ind]; break;
- #elif defined (PH_0)
- case 'H' : alt_all = GPIOH->AFR[ind]; break;
- #elif defined (PI_0)
- case 'I' : alt_all = GPIOI->AFR[ind]; break;
- #elif defined (PJ_0)
- case 'J' : alt_all = GPIOJ->AFR[ind]; break;
- #elif defined (PK_0)
- case 'K' : alt_all = GPIOK->AFR[ind]; break;
- #elif defined (PL_0)
- case 'L' : alt_all = GPIOL->AFR[ind]; break;
- #endif
- }
- if (over_7) pin_number -= 8;
+ #ifndef STM32F1xx
+ if (pwm_status(Ard_num)) {
+ uint32_t alt_all = 0;
+ const PinName dp = digitalPinToPinName(Ard_num);
+ pin_t pin_number = uint8_t(PIN_NUM(dp));
+ const bool over_7 = pin_number >= 8;
+ const uint8_t ind = over_7 ? 1 : 0;
+ switch (PORT_ALPHA(dp)) { // get alt function
+ case 'A' : alt_all = GPIOA->AFR[ind]; break;
+ case 'B' : alt_all = GPIOB->AFR[ind]; break;
+ case 'C' : alt_all = GPIOC->AFR[ind]; break;
+ case 'D' : alt_all = GPIOD->AFR[ind]; break;
+ #ifdef PE_0
+ case 'E' : alt_all = GPIOE->AFR[ind]; break;
+ #elif defined (PF_0)
+ case 'F' : alt_all = GPIOF->AFR[ind]; break;
+ #elif defined (PG_0)
+ case 'G' : alt_all = GPIOG->AFR[ind]; break;
+ #elif defined (PH_0)
+ case 'H' : alt_all = GPIOH->AFR[ind]; break;
+ #elif defined (PI_0)
+ case 'I' : alt_all = GPIOI->AFR[ind]; break;
+ #elif defined (PJ_0)
+ case 'J' : alt_all = GPIOJ->AFR[ind]; break;
+ #elif defined (PK_0)
+ case 'K' : alt_all = GPIOK->AFR[ind]; break;
+ #elif defined (PL_0)
+ case 'L' : alt_all = GPIOL->AFR[ind]; break;
+ #endif
+ }
+ if (over_7) pin_number -= 8;
- uint8_t alt_func = (alt_all >> (4 * pin_number)) & 0x0F;
- SERIAL_ECHOPAIR("Alt Function: ", alt_func);
- if (alt_func < 10) SERIAL_CHAR(' ');
- SERIAL_ECHOPGM(" - ");
- switch (alt_func) {
- case 0 : SERIAL_ECHOPGM("system (misc. I/O)"); break;
- case 1 : SERIAL_ECHOPGM("TIM1/TIM2 (probably PWM)"); break;
- case 2 : SERIAL_ECHOPGM("TIM3..5 (probably PWM)"); break;
- case 3 : SERIAL_ECHOPGM("TIM8..11 (probably PWM)"); break;
- case 4 : SERIAL_ECHOPGM("I2C1..3"); break;
- case 5 : SERIAL_ECHOPGM("SPI1/SPI2"); break;
- case 6 : SERIAL_ECHOPGM("SPI3"); break;
- case 7 : SERIAL_ECHOPGM("USART1..3"); break;
- case 8 : SERIAL_ECHOPGM("USART4..6"); break;
- case 9 : SERIAL_ECHOPGM("CAN1/CAN2, TIM12..14 (probably PWM)"); break;
- case 10 : SERIAL_ECHOPGM("OTG"); break;
- case 11 : SERIAL_ECHOPGM("ETH"); break;
- case 12 : SERIAL_ECHOPGM("FSMC, SDIO, OTG"); break;
- case 13 : SERIAL_ECHOPGM("DCMI"); break;
- case 14 : SERIAL_ECHOPGM("unused (shouldn't see this)"); break;
- case 15 : SERIAL_ECHOPGM("EVENTOUT"); break;
+ uint8_t alt_func = (alt_all >> (4 * pin_number)) & 0x0F;
+ SERIAL_ECHOPAIR("Alt Function: ", alt_func);
+ if (alt_func < 10) SERIAL_CHAR(' ');
+ SERIAL_ECHOPGM(" - ");
+ switch (alt_func) {
+ case 0 : SERIAL_ECHOPGM("system (misc. I/O)"); break;
+ case 1 : SERIAL_ECHOPGM("TIM1/TIM2 (probably PWM)"); break;
+ case 2 : SERIAL_ECHOPGM("TIM3..5 (probably PWM)"); break;
+ case 3 : SERIAL_ECHOPGM("TIM8..11 (probably PWM)"); break;
+ case 4 : SERIAL_ECHOPGM("I2C1..3"); break;
+ case 5 : SERIAL_ECHOPGM("SPI1/SPI2"); break;
+ case 6 : SERIAL_ECHOPGM("SPI3"); break;
+ case 7 : SERIAL_ECHOPGM("USART1..3"); break;
+ case 8 : SERIAL_ECHOPGM("USART4..6"); break;
+ case 9 : SERIAL_ECHOPGM("CAN1/CAN2, TIM12..14 (probably PWM)"); break;
+ case 10 : SERIAL_ECHOPGM("OTG"); break;
+ case 11 : SERIAL_ECHOPGM("ETH"); break;
+ case 12 : SERIAL_ECHOPGM("FSMC, SDIO, OTG"); break;
+ case 13 : SERIAL_ECHOPGM("DCMI"); break;
+ case 14 : SERIAL_ECHOPGM("unused (shouldn't see this)"); break;
+ case 15 : SERIAL_ECHOPGM("EVENTOUT"); break;
+ }
}
- }
+ #else
+ // TODO: F1 doesn't support changing pins function, so we need to check the function of the PIN and if it's enabled
+ #endif
} // pwm_details
diff --git a/Marlin/src/HAL/STM32/spi_pins.h b/Marlin/src/HAL/STM32/spi_pins.h
index 176e2a7b2063..e2052c5c7704 100644
--- a/Marlin/src/HAL/STM32/spi_pins.h
+++ b/Marlin/src/HAL/STM32/spi_pins.h
@@ -21,15 +21,15 @@
/**
* Define SPI Pins: SCK, MISO, MOSI, SS
*/
-#ifndef SCK_PIN
- #define SCK_PIN PIN_SPI_SCK
+#ifndef SD_SCK_PIN
+ #define SD_SCK_PIN PIN_SPI_SCK
#endif
-#ifndef MISO_PIN
- #define MISO_PIN PIN_SPI_MISO
+#ifndef SD_MISO_PIN
+ #define SD_MISO_PIN PIN_SPI_MISO
#endif
-#ifndef MOSI_PIN
- #define MOSI_PIN PIN_SPI_MOSI
+#ifndef SD_MOSI_PIN
+ #define SD_MOSI_PIN PIN_SPI_MOSI
#endif
-#ifndef SS_PIN
- #define SS_PIN PIN_SPI_SS
+#ifndef SD_SS_PIN
+ #define SD_SS_PIN PIN_SPI_SS
#endif
diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp
index 3a080d5e271e..87ca2dbbe18a 100644
--- a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp
+++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#include "../../../inc/MarlinConfig.h"
@@ -47,13 +48,14 @@ void TFT_FSMC::Init() {
uint32_t NSBank = (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS);
+ // Perform the SRAM1 memory initialization sequence
SRAMx.Instance = FSMC_NORSRAM_DEVICE;
SRAMx.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
- /* SRAMx.Init */
+ // SRAMx.Init
SRAMx.Init.NSBank = NSBank;
SRAMx.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
SRAMx.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
- SRAMx.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
+ SRAMx.Init.MemoryDataWidth = TERN(TFT_INTERFACE_FSMC_8BIT, FSMC_NORSRAM_MEM_BUS_WIDTH_8, FSMC_NORSRAM_MEM_BUS_WIDTH_16);
SRAMx.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
SRAMx.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
SRAMx.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
@@ -66,8 +68,8 @@ void TFT_FSMC::Init() {
#ifdef STM32F4xx
SRAMx.Init.PageSize = FSMC_PAGE_SIZE_NONE;
#endif
- /* Read Timing - relatively slow to ensure ID information is correctly read from TFT controller */
- /* Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss */
+ // Read Timing - relatively slow to ensure ID information is correctly read from TFT controller
+ // Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss
Timing.AddressSetupTime = 15;
Timing.AddressHoldTime = 15;
Timing.DataSetupTime = 24;
@@ -75,8 +77,8 @@ void TFT_FSMC::Init() {
Timing.CLKDivision = 16;
Timing.DataLatency = 17;
Timing.AccessMode = FSMC_ACCESS_MODE_A;
- /* Write Timing */
- /* Can be decreases from 8-15-8 to 0-0-1 with risk of stability loss */
+ // Write Timing
+ // Can be decreases from 8-15-8 to 0-0-1 with risk of stability loss
ExtTiming.AddressSetupTime = 8;
ExtTiming.AddressHoldTime = 15;
ExtTiming.DataSetupTime = 8;
@@ -130,7 +132,7 @@ void TFT_FSMC::Init() {
uint32_t TFT_FSMC::GetID() {
uint32_t id;
- WriteReg(0x0000);
+ WriteReg(0);
id = LCD->RAM;
if (id == 0)
@@ -140,41 +142,40 @@ uint32_t TFT_FSMC::GetID() {
return id;
}
- uint32_t TFT_FSMC::ReadID(uint16_t Reg) {
- uint32_t id;
- WriteReg(Reg);
- id = LCD->RAM; // dummy read
- id = Reg << 24;
- id |= (LCD->RAM & 0x00FF) << 16;
- id |= (LCD->RAM & 0x00FF) << 8;
- id |= LCD->RAM & 0x00FF;
- return id;
- }
+uint32_t TFT_FSMC::ReadID(tft_data_t Reg) {
+ uint32_t id;
+ WriteReg(Reg);
+ id = LCD->RAM; // dummy read
+ id = Reg << 24;
+ id |= (LCD->RAM & 0x00FF) << 16;
+ id |= (LCD->RAM & 0x00FF) << 8;
+ id |= LCD->RAM & 0x00FF;
+ return id;
+}
bool TFT_FSMC::isBusy() {
- if (__IS_DMA_ENABLED(&DMAtx))
+ #if defined(STM32F1xx)
+ volatile bool dmaEnabled = (DMAtx.Instance->CCR & DMA_CCR_EN) != RESET;
+ #elif defined(STM32F4xx)
+ volatile bool dmaEnabled = DMAtx.Instance->CR & DMA_SxCR_EN;
+ #endif
+ if (dmaEnabled) {
if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0)
Abort();
- return __IS_DMA_ENABLED(&DMAtx);
+ }
+ else
+ Abort();
+ return dmaEnabled;
}
void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) {
DMAtx.Init.PeriphInc = MemoryIncrease;
HAL_DMA_Init(&DMAtx);
-
- __HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx));
- __HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx));
-
- #ifdef STM32F1xx
- DMAtx.Instance->CNDTR = Count;
- DMAtx.Instance->CPAR = (uint32_t)Data;
- DMAtx.Instance->CMAR = (uint32_t)&(LCD->RAM);
- #elif defined(STM32F4xx)
- DMAtx.Instance->NDTR = Count;
- DMAtx.Instance->PAR = (uint32_t)Data;
- DMAtx.Instance->M0AR = (uint32_t)&(LCD->RAM);
- #endif
- __HAL_DMA_ENABLE(&DMAtx);
+ DataTransferBegin();
+ HAL_DMA_Start(&DMAtx, (uint32_t)Data, (uint32_t)&(LCD->RAM), Count);
+ HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
+ Abort();
}
#endif // HAS_FSMC_TFT
+#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.h b/Marlin/src/HAL/STM32/tft/tft_fsmc.h
index e2e0128c5efc..2200abaa10e8 100644
--- a/Marlin/src/HAL/STM32/tft/tft_fsmc.h
+++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.h
@@ -25,10 +25,8 @@
#ifdef STM32F1xx
#include "stm32f1xx_hal.h"
- #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN)
#elif defined(STM32F4xx)
#include "stm32f4xx_hal.h"
- #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN)
#else
#error "FSMC TFT is currently only supported on STM32F1 and STM32F4 hardware."
#endif
@@ -44,9 +42,12 @@
#define DATASIZE_16BIT SPI_DATASIZE_16BIT
#define TFT_IO_DRIVER TFT_FSMC
+#define TFT_DATASIZE TERN(TFT_INTERFACE_FSMC_8BIT, DATASIZE_8BIT, DATASIZE_16BIT)
+typedef TERN(TFT_INTERFACE_FSMC_8BIT, uint8_t, uint16_t) tft_data_t;
+
typedef struct {
- __IO uint16_t REG;
- __IO uint16_t RAM;
+ __IO tft_data_t REG;
+ __IO tft_data_t RAM;
} LCD_CONTROLLER_TypeDef;
class TFT_FSMC {
@@ -56,8 +57,8 @@ class TFT_FSMC {
static LCD_CONTROLLER_TypeDef *LCD;
- static uint32_t ReadID(uint16_t Reg);
- static void Transmit(uint16_t Data) { LCD->RAM = Data; __DSB(); }
+ static uint32_t ReadID(tft_data_t Reg);
+ static void Transmit(tft_data_t Data) { LCD->RAM = Data; __DSB(); }
static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count);
public:
@@ -66,17 +67,23 @@ class TFT_FSMC {
static bool isBusy();
static void Abort() { __HAL_DMA_DISABLE(&DMAtx); }
- static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) {}
+ static void DataTransferBegin(uint16_t DataWidth = TFT_DATASIZE) {}
static void DataTransferEnd() {};
- static void WriteData(uint16_t Data) { Transmit(Data); }
- static void WriteReg(uint16_t Reg) { LCD->REG = Reg; __DSB(); }
+ static void WriteData(uint16_t Data) { Transmit(tft_data_t(Data)); }
+ static void WriteReg(uint16_t Reg) { LCD->REG = tft_data_t(Reg); __DSB(); }
static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_ENABLE, Data, Count); }
static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_PINC_DISABLE, &Data, Count); }
+ static void WriteMultiple(uint16_t Color, uint32_t Count) {
+ static uint16_t Data; Data = Color;
+ while (Count > 0) {
+ TransmitDMA(DMA_MINC_DISABLE, &Data, Count > 0xFFFF ? 0xFFFF : Count);
+ Count = Count > 0xFFFF ? Count - 0xFFFF : 0;
+ }
+ }
};
-
#ifdef STM32F1xx
#define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)
#elif defined(STM32F4xx)
@@ -98,14 +105,16 @@ const PinMap PinMap_FSMC[] = {
{PE_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D05
{PE_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D06
{PE_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D07
- {PE_11, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D08
- {PE_12, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D09
- {PE_13, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D10
- {PE_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D11
- {PE_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D12
- {PD_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D13
- {PD_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D14
- {PD_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D15
+ #if DISABLED(TFT_INTERFACE_FSMC_8BIT)
+ {PE_11, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D08
+ {PE_12, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D09
+ {PE_13, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D10
+ {PE_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D11
+ {PE_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D12
+ {PD_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D13
+ {PD_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D14
+ {PD_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D15
+ #endif
{PD_4, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NOE
{PD_5, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NWE
{NC, NP, 0}
@@ -121,7 +130,11 @@ const PinMap PinMap_FSMC_CS[] = {
{NC, NP, 0}
};
-#define FSMC_RS(A) (void *)((2 << A) - 2)
+#if ENABLED(TFT_INTERFACE_FSMC_8BIT)
+ #define FSMC_RS(A) (void *)((2 << (A-1)) - 1)
+#else
+ #define FSMC_RS(A) (void *)((2 << A) - 2)
+#endif
const PinMap PinMap_FSMC_RS[] = {
#ifdef PF0
diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp
index d3eb4ba8db6a..3cb797d5f2a9 100644
--- a/Marlin/src/HAL/STM32/tft/tft_spi.cpp
+++ b/Marlin/src/HAL/STM32/tft/tft_spi.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#include "../../../inc/MarlinConfig.h"
@@ -33,22 +34,13 @@ DMA_HandleTypeDef TFT_SPI::DMAtx;
void TFT_SPI::Init() {
SPI_TypeDef *spiInstance;
- #if PIN_EXISTS(TFT_RESET)
- OUT_WRITE(TFT_RESET_PIN, HIGH);
- HAL_Delay(100);
- #endif
-
- #if PIN_EXISTS(TFT_BACKLIGHT)
- OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH);
- #endif
-
OUT_WRITE(TFT_A0_PIN, HIGH);
OUT_WRITE(TFT_CS_PIN, HIGH);
if ((spiInstance = (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK)) == NP) return;
if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI)) return;
- #if PIN_EXISTS(TFT_MISO) && (TFT_MISO_PIN != TFT_MOSI_PIN)
+ #if PIN_EXISTS(TFT_MISO) && TFT_MISO_PIN != TFT_MOSI_PIN
if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO)) return;
#endif
@@ -56,12 +48,7 @@ void TFT_SPI::Init() {
SPIx.State = HAL_SPI_STATE_RESET;
SPIx.Init.NSS = SPI_NSS_SOFT;
SPIx.Init.Mode = SPI_MODE_MASTER;
- SPIx.Init.Direction =
- #if TFT_MISO_PIN == TFT_MOSI_PIN
- SPI_DIRECTION_1LINE;
- #else
- SPI_DIRECTION_2LINES;
- #endif
+ SPIx.Init.Direction = (TFT_MISO_PIN == TFT_MOSI_PIN) ? SPI_DIRECTION_1LINE : SPI_DIRECTION_2LINES;
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
SPIx.Init.CLKPhase = SPI_PHASE_1EDGE;
SPIx.Init.CLKPolarity = SPI_POLARITY_LOW;
@@ -73,7 +60,7 @@ void TFT_SPI::Init() {
pinmap_pinout(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK);
pinmap_pinout(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI);
- #if PIN_EXISTS(TFT_MISO) && (TFT_MISO_PIN != TFT_MOSI_PIN)
+ #if PIN_EXISTS(TFT_MISO) && TFT_MISO_PIN != TFT_MOSI_PIN
pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO);
#endif
pin_PullConfig(get_GPIO_Port(STM_PORT(digitalPinToPinName(TFT_SCK_PIN))), STM_LL_GPIO_PIN(digitalPinToPinName(TFT_SCK_PIN)), GPIO_PULLDOWN);
@@ -81,23 +68,41 @@ void TFT_SPI::Init() {
#ifdef SPI1_BASE
if (SPIx.Instance == SPI1) {
__HAL_RCC_SPI1_CLK_ENABLE();
- __HAL_RCC_DMA1_CLK_ENABLE();
+ #ifdef STM32F1xx
+ __HAL_RCC_DMA1_CLK_ENABLE();
+ DMAtx.Instance = DMA1_Channel3;
+ #elif defined(STM32F4xx)
+ __HAL_RCC_DMA2_CLK_ENABLE();
+ DMAtx.Instance = DMA2_Stream3;
+ DMAtx.Init.Channel = DMA_CHANNEL_3;
+ #endif
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
- DMAtx.Instance = DMA1_Channel3;
}
#endif
#ifdef SPI2_BASE
if (SPIx.Instance == SPI2) {
__HAL_RCC_SPI2_CLK_ENABLE();
- __HAL_RCC_DMA1_CLK_ENABLE();
- DMAtx.Instance = DMA1_Channel5;
+ #ifdef STM32F1xx
+ __HAL_RCC_DMA1_CLK_ENABLE();
+ DMAtx.Instance = DMA1_Channel5;
+ #elif defined(STM32F4xx)
+ __HAL_RCC_DMA1_CLK_ENABLE();
+ DMAtx.Instance = DMA1_Stream4;
+ DMAtx.Init.Channel = DMA_CHANNEL_0;
+ #endif
}
#endif
#ifdef SPI3_BASE
if (SPIx.Instance == SPI3) {
__HAL_RCC_SPI3_CLK_ENABLE();
- __HAL_RCC_DMA2_CLK_ENABLE();
- DMAtx.Instance = DMA2_Channel2;
+ #ifdef STM32F1xx
+ __HAL_RCC_DMA2_CLK_ENABLE();
+ DMAtx.Instance = DMA2_Channel2;
+ #elif defined(STM32F4xx)
+ __HAL_RCC_DMA1_CLK_ENABLE();
+ DMAtx.Instance = DMA1_Stream5;
+ DMAtx.Init.Channel = DMA_CHANNEL_0;
+ #endif
}
#endif
@@ -109,6 +114,9 @@ void TFT_SPI::Init() {
DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
DMAtx.Init.Mode = DMA_NORMAL;
DMAtx.Init.Priority = DMA_PRIORITY_LOW;
+ #ifdef STM32F4xx
+ DMAtx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
+ #endif
}
void TFT_SPI::DataTransferBegin(uint16_t DataSize) {
@@ -127,11 +135,10 @@ uint32_t TFT_SPI::GetID() {
}
uint32_t TFT_SPI::ReadID(uint16_t Reg) {
- #if !PIN_EXISTS(TFT_MISO)
- return 0;
- #else
+ uint32_t Data = 0;
+ #if PIN_EXISTS(TFT_MISO)
uint32_t BaudRatePrescaler = SPIx.Init.BaudRatePrescaler;
- uint32_t i, Data = 0;
+ uint32_t i;
SPIx.Init.BaudRatePrescaler = SPIx.Instance == SPI1 ? SPI_BAUDRATEPRESCALER_8 : SPI_BAUDRATEPRESCALER_4;
DataTransferBegin(DATASIZE_8BIT);
@@ -155,27 +162,42 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) {
DataTransferEnd();
SPIx.Init.BaudRatePrescaler = BaudRatePrescaler;
-
- return Data >> 7;
#endif
+
+ return Data >> 7;
}
bool TFT_SPI::isBusy() {
- if (DMAtx.Instance->CCR & DMA_CCR_EN)
+ #if defined(STM32F1xx)
+ volatile bool dmaEnabled = (DMAtx.Instance->CCR & DMA_CCR_EN) != RESET;
+ #elif defined(STM32F4xx)
+ volatile bool dmaEnabled = DMAtx.Instance->CR & DMA_SxCR_EN;
+ #endif
+ if (dmaEnabled) {
if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0)
Abort();
- return DMAtx.Instance->CCR & DMA_CCR_EN;
+ }
+ else
+ Abort();
+ return dmaEnabled;
}
void TFT_SPI::Abort() {
- __HAL_DMA_DISABLE(&DMAtx);
+ // Wait for any running spi
+ while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {}
+ while ((SPIx.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY) {}
+ // First, abort any running dma
+ HAL_DMA_Abort(&DMAtx);
+ // DeInit objects
+ HAL_DMA_DeInit(&DMAtx);
+ HAL_SPI_DeInit(&SPIx);
+ // Deselect CS
DataTransferEnd();
}
void TFT_SPI::Transmit(uint16_t Data) {
- #if TFT_MISO_PIN == TFT_MOSI_PIN
+ if (TFT_MISO_PIN == TFT_MOSI_PIN)
SPI_1LINE_TX(&SPIx);
- #endif
__HAL_SPI_ENABLE(&SPIx);
@@ -184,29 +206,30 @@ void TFT_SPI::Transmit(uint16_t Data) {
while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {}
while ((SPIx.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY) {}
- #if TFT_MISO_PIN != TFT_MOSI_PIN
+ if (TFT_MISO_PIN != TFT_MOSI_PIN)
__HAL_SPI_CLEAR_OVRFLAG(&SPIx); /* Clear overrun flag in 2 Lines communication mode because received is not read */
- #endif
}
void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) {
+ // Wait last dma finish, to start another
+ while(isBusy()) { }
+
DMAtx.Init.MemInc = MemoryIncrease;
HAL_DMA_Init(&DMAtx);
- DataTransferBegin();
-
- #if TFT_MISO_PIN == TFT_MOSI_PIN
+ if (TFT_MISO_PIN == TFT_MOSI_PIN)
SPI_1LINE_TX(&SPIx);
- #endif
- DMAtx.DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << DMAtx.ChannelIndex);
- DMAtx.Instance->CNDTR = Count;
- DMAtx.Instance->CPAR = (uint32_t)&(SPIx.Instance->DR);
- DMAtx.Instance->CMAR = (uint32_t)Data;
- __HAL_DMA_ENABLE(&DMAtx);
+ DataTransferBegin();
+
+ HAL_DMA_Start(&DMAtx, (uint32_t)Data, (uint32_t)&(SPIx.Instance->DR), Count);
__HAL_SPI_ENABLE(&SPIx);
SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */
+
+ HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
+ Abort();
}
#endif // HAS_SPI_TFT
+#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.h b/Marlin/src/HAL/STM32/tft/tft_spi.h
index d477b58c004d..667b5f366b7e 100644
--- a/Marlin/src/HAL/STM32/tft/tft_spi.h
+++ b/Marlin/src/HAL/STM32/tft/tft_spi.h
@@ -64,4 +64,11 @@ class TFT_SPI {
static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); }
static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); }
+ static void WriteMultiple(uint16_t Color, uint32_t Count) {
+ static uint16_t Data; Data = Color;
+ while (Count > 0) {
+ TransmitDMA(DMA_MINC_DISABLE, &Data, Count > 0xFFFF ? 0xFFFF : Count);
+ Count = Count > 0xFFFF ? Count - 0xFFFF : 0;
+ }
+ }
};
diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.cpp b/Marlin/src/HAL/STM32/tft/xpt2046.cpp
index f95bb8ca4da4..04294e669c55 100644
--- a/Marlin/src/HAL/STM32/tft/xpt2046.cpp
+++ b/Marlin/src/HAL/STM32/tft/xpt2046.cpp
@@ -19,10 +19,11 @@
* along with this program. If not, see .
*
*/
+#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#include "../../../inc/MarlinConfig.h"
-#if HAS_TFT_XPT2046
+#if HAS_TFT_XPT2046 || HAS_TOUCH_BUTTONS
#include "xpt2046.h"
#include "pinconfig.h"
@@ -30,7 +31,6 @@
uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; }
SPI_HandleTypeDef XPT2046::SPIx;
-DMA_HandleTypeDef XPT2046::DMAtx;
void XPT2046::Init() {
SPI_TypeDef *spiInstance;
@@ -70,34 +70,16 @@ void XPT2046::Init() {
if (SPIx.Instance == SPI1) {
__HAL_RCC_SPI1_CLK_ENABLE();
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
- #ifdef STM32F1xx
- DMAtx.Instance = DMA1_Channel3;
- #elif defined(STM32F4xx)
- DMAtx.Instance = DMA2_Stream3; // DMA2_Stream5
- #endif
- //SERIAL_ECHO_MSG(" Touch Screen on SPI1");
}
#endif
#ifdef SPI2_BASE
if (SPIx.Instance == SPI2) {
__HAL_RCC_SPI2_CLK_ENABLE();
- #ifdef STM32F1xx
- DMAtx.Instance = DMA1_Channel5;
- #elif defined(STM32F4xx)
- DMAtx.Instance = DMA1_Stream4;
- #endif
- //SERIAL_ECHO_MSG(" Touch Screen on SPI2");
}
#endif
#ifdef SPI3_BASE
if (SPIx.Instance == SPI3) {
__HAL_RCC_SPI3_CLK_ENABLE();
- #ifdef STM32F1xx
- DMAtx.Instance = DMA2_Channel2;
- #elif defined(STM32F4xx)
- DMAtx.Instance = DMA1_Stream5; // DMA1_Stream7
- #endif
- //SERIAL_ECHO_MSG(" Touch Screen on SPI3");
}
#endif
}
@@ -106,7 +88,6 @@ void XPT2046::Init() {
SET_INPUT(TOUCH_MISO_PIN);
SET_OUTPUT(TOUCH_MOSI_PIN);
SET_OUTPUT(TOUCH_SCK_PIN);
- //SERIAL_ECHO_MSG(" Touch Screen on Software SPI");
}
getRawData(XPT2046_Z1);
@@ -186,3 +167,4 @@ uint16_t XPT2046::SoftwareIO(uint16_t data) {
}
#endif // HAS_TFT_XPT2046
+#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.h b/Marlin/src/HAL/STM32/tft/xpt2046.h
index 3acf3898a3b5..5b8acf4b87af 100644
--- a/Marlin/src/HAL/STM32/tft/xpt2046.h
+++ b/Marlin/src/HAL/STM32/tft/xpt2046.h
@@ -60,19 +60,11 @@ enum XPTCoordinate : uint8_t {
#define XPT2046_Z1_THRESHOLD 10
#endif
-#ifdef STM32F1xx
- #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN)
-#elif defined(STM32F4xx)
- #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN)
-#endif
-
-
class XPT2046 {
private:
static SPI_HandleTypeDef SPIx;
- static DMA_HandleTypeDef DMAtx;
- static bool isBusy() { return SPIx.Instance ? __IS_DMA_ENABLED(&DMAtx) : false; }
+ static bool isBusy() { return false; }
static uint16_t getRawData(const XPTCoordinate coordinate);
static bool isTouched();
diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp
index 90f8c3dc94fa..e8e18a47d48b 100644
--- a/Marlin/src/HAL/STM32/timers.cpp
+++ b/Marlin/src/HAL/STM32/timers.cpp
@@ -27,7 +27,6 @@
// Local defines
// ------------------------
-
// Default timer priorities. Override by specifying alternate priorities in the board pins file.
// The TONE timer is not present here, as it currently cannot be set programmatically. It is set
// by defining TIM_IRQ_PRIO in the variant.h or platformio.ini file, which adjusts the default
@@ -96,11 +95,6 @@
#define STEP_TIMER_DEV _TIMER_DEV(STEP_TIMER)
#define TEMP_TIMER_DEV _TIMER_DEV(TEMP_TIMER)
-#define __TIMER_IRQ_NAME(X) TIM##X##_IRQn
-#define _TIMER_IRQ_NAME(X) __TIMER_IRQ_NAME(X)
-#define STEP_TIMER_IRQ_NAME _TIMER_IRQ_NAME(STEP_TIMER)
-#define TEMP_TIMER_IRQ_NAME _TIMER_IRQ_NAME(TEMP_TIMER)
-
// ------------------------
// Private Variables
// ------------------------
@@ -197,87 +191,132 @@ void SetTimerInterruptPriorities() {
TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIO, 0));
}
-// This is a terrible hack to replicate the behavior used in the framework's SoftwareSerial.cpp
-// to choose a serial timer. It will select TIM7 on most boards used by Marlin, but this is more
-// resiliant to new MCUs which may not have a TIM7. Best practice is to explicitly specify
-// TIMER_SERIAL to avoid relying on framework selections which may not be predictable.
-#if !defined(TIMER_SERIAL)
- #if defined (TIM18_BASE)
- #define TIMER_SERIAL TIM18
- #elif defined (TIM7_BASE)
- #define TIMER_SERIAL TIM7
- #elif defined (TIM6_BASE)
- #define TIMER_SERIAL TIM6
- #elif defined (TIM22_BASE)
- #define TIMER_SERIAL TIM22
- #elif defined (TIM21_BASE)
- #define TIMER_SERIAL TIM21
- #elif defined (TIM17_BASE)
- #define TIMER_SERIAL TIM17
- #elif defined (TIM16_BASE)
- #define TIMER_SERIAL TIM16
- #elif defined (TIM15_BASE)
- #define TIMER_SERIAL TIM15
- #elif defined (TIM14_BASE)
- #define TIMER_SERIAL TIM14
- #elif defined (TIM13_BASE)
- #define TIMER_SERIAL TIM13
- #elif defined (TIM11_BASE)
- #define TIMER_SERIAL TIM11
- #elif defined (TIM10_BASE)
- #define TIMER_SERIAL TIM10
- #elif defined (TIM12_BASE)
- #define TIMER_SERIAL TIM12
- #elif defined (TIM19_BASE)
- #define TIMER_SERIAL TIM19
- #elif defined (TIM9_BASE)
- #define TIMER_SERIAL TIM9
- #elif defined (TIM5_BASE)
- #define TIMER_SERIAL TIM5
- #elif defined (TIM4_BASE)
- #define TIMER_SERIAL TIM4
- #elif defined (TIM3_BASE)
- #define TIMER_SERIAL TIM3
- #elif defined (TIM2_BASE)
- #define TIMER_SERIAL TIM2
- #elif defined (TIM20_BASE)
- #define TIMER_SERIAL TIM20
- #elif defined (TIM8_BASE)
- #define TIMER_SERIAL TIM8
- #elif defined (TIM1_BASE)
- #define TIMER_SERIAL TIM1
- #else
- #error No suitable timer found for SoftwareSerial, define TIMER_SERIAL in variant.h
+// ------------------------
+// Detect timer conflicts
+// ------------------------
+
+// This list serves two purposes. Firstly, it facilitates build-time mapping between
+// variant-defined timer names (such as TIM1) and timer numbers. It also replicates
+// the order of timers used in the framework's SoftwareSerial.cpp. The first timer in
+// this list will be automatically used by SoftwareSerial if it is not already defined
+// in the board's variant or compiler options.
+static constexpr struct {uintptr_t base_address; int timer_number;} stm32_timer_map[] = {
+ #ifdef TIM18_BASE
+ { uintptr_t(TIM18), 18 },
+ #endif
+ #ifdef TIM7_BASE
+ { uintptr_t(TIM7), 7 },
+ #endif
+ #ifdef TIM6_BASE
+ { uintptr_t(TIM6), 6 },
+ #endif
+ #ifdef TIM22_BASE
+ { uintptr_t(TIM22), 22 },
+ #endif
+ #ifdef TIM21_BASE
+ { uintptr_t(TIM21), 21 },
+ #endif
+ #ifdef TIM17_BASE
+ { uintptr_t(TIM17), 17 },
+ #endif
+ #ifdef TIM16_BASE
+ { uintptr_t(TIM16), 16 },
+ #endif
+ #ifdef TIM15_BASE
+ { uintptr_t(TIM15), 15 },
+ #endif
+ #ifdef TIM14_BASE
+ { uintptr_t(TIM14), 14 },
+ #endif
+ #ifdef TIM13_BASE
+ { uintptr_t(TIM13), 13 },
+ #endif
+ #ifdef TIM11_BASE
+ { uintptr_t(TIM11), 11 },
+ #endif
+ #ifdef TIM10_BASE
+ { uintptr_t(TIM10), 10 },
#endif
+ #ifdef TIM12_BASE
+ { uintptr_t(TIM12), 12 },
+ #endif
+ #ifdef TIM19_BASE
+ { uintptr_t(TIM19), 19 },
+ #endif
+ #ifdef TIM9_BASE
+ { uintptr_t(TIM9), 9 },
+ #endif
+ #ifdef TIM5_BASE
+ { uintptr_t(TIM5), 5 },
+ #endif
+ #ifdef TIM4_BASE
+ { uintptr_t(TIM4), 4 },
+ #endif
+ #ifdef TIM3_BASE
+ { uintptr_t(TIM3), 3 },
+ #endif
+ #ifdef TIM2_BASE
+ { uintptr_t(TIM2), 2 },
+ #endif
+ #ifdef TIM20_BASE
+ { uintptr_t(TIM20), 20 },
+ #endif
+ #ifdef TIM8_BASE
+ { uintptr_t(TIM8), 8 },
+ #endif
+ #ifdef TIM1_BASE
+ { uintptr_t(TIM1), 1 }
+ #endif
+};
+
+// Convert from a timer base address to its integer timer number.
+static constexpr int get_timer_num_from_base_address(uintptr_t base_address) {
+ for (const auto &timer : stm32_timer_map)
+ if (timer.base_address == base_address) return timer.timer_number;
+ return 0;
+}
+
+// The platform's SoftwareSerial.cpp will use the first timer from stm32_timer_map.
+#if HAS_TMC_SW_SERIAL && !defined(TIMER_SERIAL)
+ #define TIMER_SERIAL (stm32_timer_map[0].base_address)
#endif
-// Place all timers used into an array, then recursively check for duplicates during compilation.
-// This does not currently account for timers used for PWM, such as for fans.
-// Timers are actually pointers. Convert to integers to simplify constexpr logic.
-static constexpr uintptr_t timers_in_use[] = {
- uintptr_t(TEMP_TIMER_DEV), // Override in pins file
- uintptr_t(STEP_TIMER_DEV), // Override in pins file
+// constexpr doesn't like using the base address pointers that timers evaluate to.
+// We can get away with casting them to uintptr_t, if we do so inside an array.
+// GCC will not currently do it directly to a uintptr_t.
+IF_ENABLED(HAS_TMC_SW_SERIAL, static constexpr uintptr_t timer_serial[] = {uintptr_t(TIMER_SERIAL)});
+IF_ENABLED(SPEAKER, static constexpr uintptr_t timer_tone[] = {uintptr_t(TIMER_TONE)});
+IF_ENABLED(HAS_SERVOS, static constexpr uintptr_t timer_servo[] = {uintptr_t(TIMER_SERVO)});
+
+enum TimerPurpose { TP_SERIAL, TP_TONE, TP_SERVO, TP_STEP, TP_TEMP };
+
+// List of timers, to enable checking for conflicts.
+// Includes the purpose of each timer to ease debugging when evaluating at build-time.
+// This cannot yet account for timers used for PWM output, such as for fans.
+static constexpr struct { TimerPurpose p; int t; } timers_in_use[] = {
#if HAS_TMC_SW_SERIAL
- uintptr_t(TIMER_SERIAL), // Set in variant.h, or as a define in platformio.h if not present in variant.h
+ {TP_SERIAL, get_timer_num_from_base_address(timer_serial[0])}, // Set in variant.h, or as a define in platformio.h if not present in variant.h
#endif
#if ENABLED(SPEAKER)
- uintptr_t(TIMER_TONE), // Set in variant.h, or as a define in platformio.h if not present in variant.h
+ {TP_TONE, get_timer_num_from_base_address(timer_tone[0])}, // Set in variant.h, or as a define in platformio.h if not present in variant.h
#endif
#if HAS_SERVOS
- uintptr_t(TIMER_SERVO), // Set in variant.h, or as a define in platformio.h if not present in variant.h
+ {TP_SERVO, get_timer_num_from_base_address(timer_servo[0])}, // Set in variant.h, or as a define in platformio.h if not present in variant.h
#endif
- };
+ {TP_STEP, STEP_TIMER},
+ {TP_TEMP, TEMP_TIMER},
+};
-static constexpr bool verify_no_duplicate_timers() {
+static constexpr bool verify_no_timer_conflicts() {
LOOP_L_N(i, COUNT(timers_in_use))
LOOP_S_L_N(j, i + 1, COUNT(timers_in_use))
- if (timers_in_use[i] == timers_in_use[j]) return false;
+ if (timers_in_use[i].t == timers_in_use[j].t) return false;
return true;
}
-// If this assertion fails at compile time, review the timers_in_use array. If default_envs is
-// defined properly in platformio.ini, VS Code can evaluate the array when hovering over it,
-// making it easy to identify the conflicting timers.
-static_assert(verify_no_duplicate_timers(), "One or more timer conflict detected");
+// If this assertion fails at compile time, review the timers_in_use array.
+// If default_envs is defined properly in platformio.ini, VS Code can evaluate the array
+// when hovering over it, making it easy to identify the conflicting timers.
+static_assert(verify_no_timer_conflicts(), "One or more timer conflict detected. Examine \"timers_in_use\" to help identify conflict.");
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/STM32/usb_host.cpp b/Marlin/src/HAL/STM32/usb_host.cpp
new file mode 100644
index 000000000000..ed743361e681
--- /dev/null
+++ b/Marlin/src/HAL/STM32/usb_host.cpp
@@ -0,0 +1,117 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
+
+#include "../../inc/MarlinConfig.h"
+
+#if BOTH(USE_OTG_USB_HOST, USBHOST)
+
+#include "usb_host.h"
+#include "../shared/Marduino.h"
+#include "usbh_core.h"
+#include "usbh_msc.h"
+
+USBH_HandleTypeDef hUsbHost;
+USBHost usb;
+BulkStorage bulk(&usb);
+
+static void USBH_UserProcess(USBH_HandleTypeDef *phost, uint8_t id) {
+ switch(id) {
+ case HOST_USER_SELECT_CONFIGURATION:
+ //SERIAL_ECHOLNPGM("APPLICATION_SELECT_CONFIGURATION");
+ break;
+ case HOST_USER_DISCONNECTION:
+ //SERIAL_ECHOLNPGM("APPLICATION_DISCONNECT");
+ //usb.setUsbTaskState(USB_STATE_RUNNING);
+ break;
+ case HOST_USER_CLASS_ACTIVE:
+ //SERIAL_ECHOLNPGM("APPLICATION_READY");
+ usb.setUsbTaskState(USB_STATE_RUNNING);
+ break;
+ case HOST_USER_CONNECTION:
+ break;
+ default:
+ break;
+ }
+}
+
+bool USBHost::start() {
+ if (USBH_Init(&hUsbHost, USBH_UserProcess, TERN(USE_USB_HS_IN_FS, HOST_HS, HOST_FS)) != USBH_OK) {
+ SERIAL_ECHOLNPGM("Error: USBH_Init");
+ return false;
+ }
+ if (USBH_RegisterClass(&hUsbHost, USBH_MSC_CLASS) != USBH_OK) {
+ SERIAL_ECHOLNPGM("Error: USBH_RegisterClass");
+ return false;
+ }
+ if (USBH_Start(&hUsbHost) != USBH_OK) {
+ SERIAL_ECHOLNPGM("Error: USBH_Start");
+ return false;
+ }
+ return true;
+}
+
+void USBHost::Task() {
+ USBH_Process(&hUsbHost);
+}
+
+uint8_t USBHost::getUsbTaskState() {
+ return usb_task_state;
+}
+
+void USBHost::setUsbTaskState(uint8_t state) {
+ usb_task_state = state;
+ if (usb_task_state == USB_STATE_RUNNING) {
+ MSC_LUNTypeDef info;
+ USBH_MSC_GetLUNInfo(&hUsbHost, usb.lun, &info);
+ capacity = info.capacity.block_nbr / 2000;
+ block_size = info.capacity.block_size;
+ block_count = info.capacity.block_nbr;
+ // SERIAL_ECHOLNPAIR("info.capacity.block_nbr : %ld\n", info.capacity.block_nbr);
+ // SERIAL_ECHOLNPAIR("info.capacity.block_size: %d\n", info.capacity.block_size);
+ // SERIAL_ECHOLNPAIR("capacity : %d MB\n", capacity);
+ }
+};
+
+bool BulkStorage::LUNIsGood(uint8_t t) {
+ return USBH_MSC_IsReady(&hUsbHost) && USBH_MSC_UnitIsReady(&hUsbHost, t);
+}
+
+uint32_t BulkStorage::GetCapacity(uint8_t lun) {
+ return usb->block_count;
+}
+
+uint16_t BulkStorage::GetSectorSize(uint8_t lun) {
+ return usb->block_size;
+}
+
+uint8_t BulkStorage::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf) {
+ return USBH_MSC_Read(&hUsbHost, lun, addr, buf, blocks) != USBH_OK;
+}
+
+uint8_t BulkStorage::Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t * buf) {
+ return USBH_MSC_Write(&hUsbHost, lun, addr, const_cast (buf), blocks) != USBH_OK;
+}
+
+#endif // USE_OTG_USB_HOST && USBHOST
+#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/STM32/usb_host.h b/Marlin/src/HAL/STM32/usb_host.h
new file mode 100644
index 000000000000..c0001c0d755b
--- /dev/null
+++ b/Marlin/src/HAL/STM32/usb_host.h
@@ -0,0 +1,60 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+typedef enum {
+ USB_STATE_INIT,
+ USB_STATE_ERROR,
+ USB_STATE_RUNNING,
+} usb_state_t;
+
+class USBHost {
+public:
+ bool start();
+ void Task();
+ uint8_t getUsbTaskState();
+ void setUsbTaskState(uint8_t state);
+ uint8_t regRd(uint8_t reg) { return 0x0; };
+ uint8_t usb_task_state = USB_STATE_INIT;
+ uint8_t lun = 0;
+ uint32_t capacity = 0;
+ uint16_t block_size = 0;
+ uint32_t block_count = 0;
+};
+
+class BulkStorage {
+public:
+ BulkStorage(USBHost *usb) : usb(usb) {};
+
+ bool LUNIsGood(uint8_t t);
+ uint32_t GetCapacity(uint8_t lun);
+ uint16_t GetSectorSize(uint8_t lun);
+ uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf);
+ uint8_t Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t * buf);
+
+ USBHost *usb;
+};
+
+extern USBHost usb;
+extern BulkStorage bulk;
diff --git a/Marlin/src/HAL/STM32/usb_serial.cpp b/Marlin/src/HAL/STM32/usb_serial.cpp
index 25c47d694fbd..705d649ff58c 100644
--- a/Marlin/src/HAL/STM32/usb_serial.cpp
+++ b/Marlin/src/HAL/STM32/usb_serial.cpp
@@ -16,7 +16,6 @@
* along with this program. If not, see .
*
*/
-
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#include "../../inc/MarlinConfigPre.h"
@@ -51,5 +50,5 @@ void USB_Hook_init() {
USBD_CDC_fops.Receive = USBD_CDC_Receive_hook;
}
-#endif // EMERGENCY_PARSER
+#endif // EMERGENCY_PARSER && USBD_USE_CDC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/STM32/watchdog.cpp b/Marlin/src/HAL/STM32/watchdog.cpp
index 3d8340831118..aad0a79a0cb2 100644
--- a/Marlin/src/HAL/STM32/watchdog.cpp
+++ b/Marlin/src/HAL/STM32/watchdog.cpp
@@ -46,5 +46,4 @@ void HAL_watchdog_refresh() {
}
#endif // USE_WATCHDOG
-
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h
index 06f75662cffa..c7eef639a5b2 100644
--- a/Marlin/src/HAL/STM32F1/HAL.h
+++ b/Marlin/src/HAL/STM32F1/HAL.h
@@ -99,6 +99,18 @@
#endif
#endif
+#ifdef MMU2_SERIAL_PORT
+ #if MMU2_SERIAL_PORT == -1
+ #define MMU2_SERIAL UsbSerial
+ #elif WITHIN(MMU2_SERIAL_PORT, 1, NUM_UARTS)
+ #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
+ #elif NUM_UARTS == 5
+ #error "MMU2_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration."
+ #else
+ #error "MMU2_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration."
+ #endif
+#endif
+
#ifdef LCD_SERIAL_PORT
#if LCD_SERIAL_PORT == -1
#define LCD_SERIAL UsbSerial
@@ -109,6 +121,9 @@
#else
#error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration."
#endif
+ #if HAS_DGUS_LCD
+ #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite()
+ #endif
#endif
// Set interrupt grouping for this MCU
@@ -137,14 +152,6 @@ void HAL_idletask();
// On AVR this is in math.h?
#define square(x) ((x)*(x))
-#ifndef strncpy_P
- #define strncpy_P(dest, src, num) strncpy((dest), (src), (num))
-#endif
-
-// Fix bug in pgm_read_ptr
-#undef pgm_read_ptr
-#define pgm_read_ptr(addr) (*(addr))
-
#define RST_POWER_ON 1
#define RST_EXTERNAL 2
#define RST_BROWN_OUT 4
@@ -189,10 +196,8 @@ inline void HAL_reboot() {} // reboot the board or restart the bootloader
void _delay_ms(const int delay);
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-function"
-#endif
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-function"
/*
extern "C" {
@@ -202,22 +207,12 @@ extern "C" {
extern "C" char* _sbrk(int incr);
-/*
-static int freeMemory() {
- volatile int top;
- top = (int)((char*)&top - reinterpret_cast(_sbrk(0)));
- return top;
-}
-*/
-
-static int freeMemory() {
+static inline int freeMemory() {
volatile char top;
- return &top - reinterpret_cast(_sbrk(0));
+ return &top - _sbrk(0);
}
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic pop
-#endif
+#pragma GCC diagnostic pop
//
// ADC
diff --git a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp
index 76b1c3e2468b..7e876f765fb2 100644
--- a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp
+++ b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp
@@ -61,8 +61,8 @@
* @details Only configures SS pin since libmaple creates and initialize the SPI object
*/
void spiBegin() {
- #if PIN_EXISTS(SS)
- OUT_WRITE(SS_PIN, HIGH);
+ #if PIN_EXISTS(SD_SS)
+ OUT_WRITE(SD_SS_PIN, HIGH);
#endif
}
diff --git a/Marlin/src/HAL/STM32F1/Servo.cpp b/Marlin/src/HAL/STM32F1/Servo.cpp
index e1ee83149374..36f7c6d51273 100644
--- a/Marlin/src/HAL/STM32F1/Servo.cpp
+++ b/Marlin/src/HAL/STM32F1/Servo.cpp
@@ -45,7 +45,7 @@ uint8_t ServoCount = 0;
*
* This uses the smallest prescaler that allows an overflow < 2^16.
*/
-#define MAX_OVERFLOW UINT16_MAX //((1 << 16) - 1)
+#define MAX_OVERFLOW UINT16_MAX // _BV(16) - 1
#define CYC_MSEC (1000 * CYCLES_PER_MICROSECOND)
#define TAU_MSEC 20
#define TAU_USEC (TAU_MSEC * 1000)
diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp
index 60596054e820..784a80c29fd3 100644
--- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp
+++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp
@@ -23,12 +23,14 @@
#if BOTH(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI)
#include
+#include "../../shared/HAL_SPI.h"
-#undef SPI_SPEED
-#define SPI_SPEED 0 // Fastest
-//#define SPI_SPEED 2 // Slower
+#ifndef LCD_SPI_SPEED
+ #define LCD_SPI_SPEED SPI_FULL_SPEED // Fastest
+ //#define LCD_SPI_SPEED SPI_QUARTER_SPEED // Slower
+#endif
-static uint8_t SPI_speed = SPI_SPEED;
+static uint8_t SPI_speed = LCD_SPI_SPEED;
static inline uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) {
LOOP_L_N(i, 8) {
@@ -104,7 +106,7 @@ static uint8_t swSpiInit(const uint8_t spi_speed) {
uint8_t u8g_com_HAL_STM32F1_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
switch (msg) {
case U8G_COM_MSG_INIT:
- SPI_speed = swSpiInit(SPI_SPEED);
+ SPI_speed = swSpiInit(LCD_SPI_SPEED);
break;
case U8G_COM_MSG_STOP:
diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp
index 94b5e099bd58..a6395698aae7 100644
--- a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp
+++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp
@@ -48,6 +48,7 @@ bool PersistentStore::access_start() { eeprom_init(); return true; }
bool PersistentStore::access_finish() { return true; }
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
+ size_t written = 0;
while (size--) {
uint8_t v = *value;
uint8_t * const p = (uint8_t * const)pos;
@@ -55,7 +56,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
// so only write bytes that have changed!
if (v != eeprom_read_byte(p)) {
eeprom_write_byte(p, v);
- delay(2);
+ if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
if (eeprom_read_byte(p) != v) {
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
return true;
diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp
index 6e992a22a32d..16cfc24af6f6 100644
--- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp
+++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp
@@ -1,6 +1,5 @@
/**
* Marlin 3D Printer Firmware
- *
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* This program is free software: you can redistribute it and/or modify
diff --git a/Marlin/src/HAL/STM32F1/fastio.h b/Marlin/src/HAL/STM32F1/fastio.h
index a618fccc578e..e75254d6929e 100644
--- a/Marlin/src/HAL/STM32F1/fastio.h
+++ b/Marlin/src/HAL/STM32F1/fastio.h
@@ -29,9 +29,9 @@
#include
-#define READ(IO) (PIN_MAP[IO].gpio_device->regs->IDR & (1U << PIN_MAP[IO].gpio_bit) ? HIGH : LOW)
-#define WRITE(IO,V) (PIN_MAP[IO].gpio_device->regs->BSRR = (1U << PIN_MAP[IO].gpio_bit) << ((V) ? 0 : 16))
-#define TOGGLE(IO) (PIN_MAP[IO].gpio_device->regs->ODR = PIN_MAP[IO].gpio_device->regs->ODR ^ (1U << PIN_MAP[IO].gpio_bit))
+#define READ(IO) (PIN_MAP[IO].gpio_device->regs->IDR & _BV32(PIN_MAP[IO].gpio_bit) ? HIGH : LOW)
+#define WRITE(IO,V) (PIN_MAP[IO].gpio_device->regs->BSRR = _BV32(PIN_MAP[IO].gpio_bit) << ((V) ? 0 : 16))
+#define TOGGLE(IO) TBI32(PIN_MAP[IO].gpio_device->regs->ODR, PIN_MAP[IO].gpio_bit)
#define _GET_MODE(IO) gpio_get_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit)
#define _SET_MODE(IO,M) gpio_set_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit, M)
diff --git a/Marlin/src/HAL/STM32F1/spi_pins.h b/Marlin/src/HAL/STM32F1/spi_pins.h
index 59ac446410da..7d650ffe373f 100644
--- a/Marlin/src/HAL/STM32F1/spi_pins.h
+++ b/Marlin/src/HAL/STM32F1/spi_pins.h
@@ -31,23 +31,23 @@
* SPI2 | PB12 PB13 PB14 PB15 |
* SPI3 | PA15 PB3 PB4 PB5 |
* +-----------------------------+
- * Any pin can be used for Chip Select (SS_PIN)
+ * Any pin can be used for Chip Select (SD_SS_PIN)
* SPI1 is enabled by default
*/
-#ifndef SCK_PIN
- #define SCK_PIN PA5
+#ifndef SD_SCK_PIN
+ #define SD_SCK_PIN PA5
#endif
-#ifndef MISO_PIN
- #define MISO_PIN PA6
+#ifndef SD_MISO_PIN
+ #define SD_MISO_PIN PA6
#endif
-#ifndef MOSI_PIN
- #define MOSI_PIN PA7
+#ifndef SD_MOSI_PIN
+ #define SD_MOSI_PIN PA7
#endif
-#ifndef SS_PIN
- #define SS_PIN PA4
+#ifndef SD_SS_PIN
+ #define SD_SS_PIN PA4
#endif
#undef SDSS
-#define SDSS SS_PIN
+#define SDSS SD_SS_PIN
#ifndef SPI_DEVICE
#define SPI_DEVICE 1
diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.h b/Marlin/src/HAL/STM32F1/tft/xpt2046.h
index 29db0b3fc454..65602bda0f40 100644
--- a/Marlin/src/HAL/STM32F1/tft/xpt2046.h
+++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.h
@@ -28,16 +28,16 @@
#endif
#ifndef TOUCH_MISO_PIN
- #define TOUCH_MISO_PIN MISO_PIN
+ #define TOUCH_MISO_PIN SD_MISO_PIN
#endif
#ifndef TOUCH_MOSI_PIN
- #define TOUCH_MOSI_PIN MOSI_PIN
+ #define TOUCH_MOSI_PIN SD_MOSI_PIN
#endif
#ifndef TOUCH_SCK_PIN
- #define TOUCH_SCK_PIN SCK_PIN
+ #define TOUCH_SCK_PIN SD_SCK_PIN
#endif
#ifndef TOUCH_CS_PIN
- #define TOUCH_CS_PIN CS_PIN
+ #define TOUCH_CS_PIN SD_SS_PIN
#endif
#ifndef TOUCH_INT_PIN
#define TOUCH_INT_PIN -1
diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h
index 9156aadb4de0..11b5564a179c 100644
--- a/Marlin/src/HAL/TEENSY31_32/HAL.h
+++ b/Marlin/src/HAL/TEENSY31_32/HAL.h
@@ -74,17 +74,6 @@ typedef int8_t pin_t;
#define ENABLE_ISRS() __enable_irq()
#define DISABLE_ISRS() __disable_irq()
-#ifndef strncpy_P
- #define strncpy_P(dest, src, num) strncpy((dest), (src), (num))
-#endif
-
-// Fix bug in pgm_read_ptr
-#undef pgm_read_ptr
-#define pgm_read_ptr(addr) (*((void**)(addr)))
-// Add type-checking to pgm_read_word
-#undef pgm_read_word
-#define pgm_read_word(addr) (*((uint16_t*)(addr)))
-
inline void HAL_init() {}
// Clear the reset reason
diff --git a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp
index cdb3f4701c03..dce236ef6bd0 100644
--- a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp
+++ b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp
@@ -35,18 +35,18 @@ static SPISettings spiConfig;
// Initialize SPI bus
void spiBegin() {
- #if !PIN_EXISTS(SS)
- #error "SS_PIN not defined!"
+ #if !PIN_EXISTS(SD_SS)
+ #error "SD_SS_PIN not defined!"
#endif
- OUT_WRITE(SS_PIN, HIGH);
- SET_OUTPUT(SCK_PIN);
- SET_INPUT(MISO_PIN);
- SET_OUTPUT(MOSI_PIN);
+ OUT_WRITE(SD_SS_PIN, HIGH);
+ SET_OUTPUT(SD_SCK_PIN);
+ SET_INPUT(SD_MISO_PIN);
+ SET_OUTPUT(SD_MOSI_PIN);
#if 0 && DISABLED(SOFTWARE_SPI)
// set SS high - may be chip select for another SPI device
#if SET_SPI_SS_HIGH
- WRITE(SS_PIN, HIGH);
+ WRITE(SD_SS_PIN, HIGH);
#endif
// set a default rate
spiInit(SPI_HALF_SPEED); // 1
diff --git a/Marlin/src/HAL/TEENSY31_32/fastio.h b/Marlin/src/HAL/TEENSY31_32/fastio.h
index 9a299de9c763..622799ec8cac 100644
--- a/Marlin/src/HAL/TEENSY31_32/fastio.h
+++ b/Marlin/src/HAL/TEENSY31_32/fastio.h
@@ -28,7 +28,7 @@
*/
#ifndef MASK
- #define MASK(PIN) (1 << PIN)
+ #define MASK(PIN) _BV(PIN)
#endif
#define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000)
diff --git a/Marlin/src/HAL/TEENSY31_32/spi_pins.h b/Marlin/src/HAL/TEENSY31_32/spi_pins.h
index 5754fbfeed11..6d0d05f85a5d 100644
--- a/Marlin/src/HAL/TEENSY31_32/spi_pins.h
+++ b/Marlin/src/HAL/TEENSY31_32/spi_pins.h
@@ -21,7 +21,7 @@
*/
#pragma once
-#define SCK_PIN 13
-#define MISO_PIN 12
-#define MOSI_PIN 11
-#define SS_PIN 20 //SDSS // A.28, A.29, B.21, C.26, C.29
+#define SD_SCK_PIN 13
+#define SD_MISO_PIN 12
+#define SD_MOSI_PIN 11
+#define SD_SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29
diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h
index 04151e837861..1d66fa518408 100644
--- a/Marlin/src/HAL/TEENSY35_36/HAL.h
+++ b/Marlin/src/HAL/TEENSY35_36/HAL.h
@@ -80,17 +80,6 @@ typedef int8_t pin_t;
#undef sq
#define sq(x) ((x)*(x))
-#ifndef strncpy_P
- #define strncpy_P(dest, src, num) strncpy((dest), (src), (num))
-#endif
-
-// Fix bug in pgm_read_ptr
-#undef pgm_read_ptr
-#define pgm_read_ptr(addr) (*((void**)(addr)))
-// Add type-checking to pgm_read_word
-#undef pgm_read_word
-#define pgm_read_word(addr) (*((uint16_t*)(addr)))
-
inline void HAL_init() {}
// Clear reset reason
diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp
index b36900a32195..84852cd3580d 100644
--- a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp
+++ b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp
@@ -35,18 +35,18 @@
static SPISettings spiConfig;
void spiBegin() {
- #if !PIN_EXISTS(SS)
- #error "SS_PIN not defined!"
+ #if !PIN_EXISTS(SD_SS)
+ #error "SD_SS_PIN not defined!"
#endif
- OUT_WRITE(SS_PIN, HIGH);
- SET_OUTPUT(SCK_PIN);
- SET_INPUT(MISO_PIN);
- SET_OUTPUT(MOSI_PIN);
+ OUT_WRITE(SD_SS_PIN, HIGH);
+ SET_OUTPUT(SD_SCK_PIN);
+ SET_INPUT(SD_MISO_PIN);
+ SET_OUTPUT(SD_MOSI_PIN);
#if 0 && DISABLED(SOFTWARE_SPI)
// set SS high - may be chip select for another SPI device
#if SET_SPI_SS_HIGH
- WRITE(SS_PIN, HIGH);
+ WRITE(SD_SS_PIN, HIGH);
#endif
// set a default rate
spiInit(SPI_HALF_SPEED); // 1
diff --git a/Marlin/src/HAL/TEENSY35_36/fastio.h b/Marlin/src/HAL/TEENSY35_36/fastio.h
index 9a299de9c763..622799ec8cac 100644
--- a/Marlin/src/HAL/TEENSY35_36/fastio.h
+++ b/Marlin/src/HAL/TEENSY35_36/fastio.h
@@ -28,7 +28,7 @@
*/
#ifndef MASK
- #define MASK(PIN) (1 << PIN)
+ #define MASK(PIN) _BV(PIN)
#endif
#define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000)
diff --git a/Marlin/src/HAL/TEENSY35_36/spi_pins.h b/Marlin/src/HAL/TEENSY35_36/spi_pins.h
index c76344d07546..cfffdc932598 100644
--- a/Marlin/src/HAL/TEENSY35_36/spi_pins.h
+++ b/Marlin/src/HAL/TEENSY35_36/spi_pins.h
@@ -25,7 +25,7 @@
* HAL SPI Pins for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
*/
-#define SCK_PIN 13
-#define MISO_PIN 12
-#define MOSI_PIN 11
-#define SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29
+#define SD_SCK_PIN 13
+#define SD_MISO_PIN 12
+#define SD_MOSI_PIN 11
+#define SD_SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29
diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h
index 28f511631eea..b191c7de5fe7 100644
--- a/Marlin/src/HAL/TEENSY40_41/HAL.h
+++ b/Marlin/src/HAL/TEENSY40_41/HAL.h
@@ -92,21 +92,10 @@ typedef int8_t pin_t;
#undef sq
#define sq(x) ((x)*(x))
-#ifndef strncpy_P
- #define strncpy_P(dest, src, num) strncpy((dest), (src), (num))
-#endif
-
// Don't place string constants in PROGMEM
#undef PSTR
#define PSTR(str) ({static const char *data = (str); &data[0];})
-// Fix bug in pgm_read_ptr
-#undef pgm_read_ptr
-#define pgm_read_ptr(addr) (*((void**)(addr)))
-// Add type-checking to pgm_read_word
-#undef pgm_read_word
-#define pgm_read_word(addr) (*((uint16_t*)(addr)))
-
// Enable hooks into idle and setup for HAL
#define HAL_IDLETASK 1
FORCE_INLINE void HAL_idletask() {}
diff --git a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp
index 20b472aa3515..8c93049027ab 100644
--- a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp
+++ b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp
@@ -50,20 +50,20 @@ static SPISettings spiConfig;
// ------------------------
void spiBegin() {
- #ifndef SS_PIN
- #error "SS_PIN is not defined!"
+ #ifndef SD_SS_PIN
+ #error "SD_SS_PIN is not defined!"
#endif
- OUT_WRITE(SS_PIN, HIGH);
+ OUT_WRITE(SD_SS_PIN, HIGH);
- //SET_OUTPUT(SCK_PIN);
- //SET_INPUT(MISO_PIN);
- //SET_OUTPUT(MOSI_PIN);
+ //SET_OUTPUT(SD_SCK_PIN);
+ //SET_INPUT(SD_MISO_PIN);
+ //SET_OUTPUT(SD_MOSI_PIN);
#if 0 && DISABLED(SOFTWARE_SPI)
// set SS high - may be chip select for another SPI device
#if SET_SPI_SS_HIGH
- WRITE(SS_PIN, HIGH);
+ WRITE(SD_SS_PIN, HIGH);
#endif
// set a default rate
spiInit(SPI_HALF_SPEED); // 1
diff --git a/Marlin/src/HAL/TEENSY40_41/spi_pins.h b/Marlin/src/HAL/TEENSY40_41/spi_pins.h
index d6f8d41bf6ce..ba4a2c700a4b 100644
--- a/Marlin/src/HAL/TEENSY40_41/spi_pins.h
+++ b/Marlin/src/HAL/TEENSY40_41/spi_pins.h
@@ -25,7 +25,7 @@
* HAL SPI Pins for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
*/
-#define SCK_PIN 13
-#define MISO_PIN 12
-#define MOSI_PIN 11
-#define SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29
+#define SD_SCK_PIN 13
+#define SD_MISO_PIN 12
+#define SD_MOSI_PIN 11
+#define SD_SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29
diff --git a/Marlin/src/HAL/shared/Marduino.h b/Marlin/src/HAL/shared/Marduino.h
index 3003f3cc2891..d0ee6ecc9d43 100644
--- a/Marlin/src/HAL/shared/Marduino.h
+++ b/Marlin/src/HAL/shared/Marduino.h
@@ -28,9 +28,9 @@
#undef DISABLED // Redefined by ESP32
#undef M_PI // Redefined by all
#undef _BV // Redefined by some
-#undef sq // Redefined by teensy3/wiring.h
#undef SBI // Redefined by arduino/const_functions.h
#undef CBI // Redefined by arduino/const_functions.h
+#undef sq // Redefined by teensy3/wiring.h
#undef UNUSED // Redefined by stm32f4xx_hal_def.h
#include // NOTE: If included earlier then this line is a NOOP
@@ -40,18 +40,16 @@
#undef _BV
#define _BV(b) (1UL << (b))
-
-#undef sq
-#define sq(x) ((x)*(x))
-
#ifndef SBI
- #define SBI(A,B) (A |= (1 << (B)))
+ #define SBI(A,B) (A |= _BV(B))
#endif
-
#ifndef CBI
- #define CBI(A,B) (A &= ~(1 << (B)))
+ #define CBI(A,B) (A &= ~_BV(B))
#endif
+#undef sq
+#define sq(x) ((x)*(x))
+
#ifndef __AVR__
#ifndef strchr_P // Some platforms define a macro (DUE, teensy35)
inline const char* strchr_P(const char *s, int c) { return strchr(s,c); }
@@ -83,3 +81,5 @@
#ifndef UNUSED
#define UNUSED(x) ((void)(x))
#endif
+
+#include "progmem.h"
diff --git a/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp b/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp
index 59734bfbfe1e..decf74e6e9c5 100644
--- a/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp
+++ b/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp
@@ -43,10 +43,9 @@ static bool isDataProc(uint32_t instr) {
}
UnwResult UnwStartArm(UnwState * const state) {
- bool found = false;
uint16_t t = UNW_MAX_INSTR_COUNT;
- do {
+ for (;;) {
uint32_t instr;
/* Attempt to read the instruction */
@@ -527,7 +526,7 @@ UnwResult UnwStartArm(UnwState * const state) {
if (--t == 0) return UNWIND_EXHAUSTED;
- } while (!found);
+ }
return UNWIND_UNSUPPORTED;
}
diff --git a/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp b/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp
index be4abd090fa8..0c6a70649d82 100644
--- a/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp
+++ b/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp
@@ -30,12 +30,11 @@ static int32_t signExtend11(const uint16_t value) {
}
UnwResult UnwStartThumb(UnwState * const state) {
- bool found = false;
uint16_t t = UNW_MAX_INSTR_COUNT;
uint32_t lastJumpAddr = 0; // Last JUMP address, to try to detect infinite loops
bool loopDetected = false; // If a loop was detected
- do {
+ for (;;) {
uint16_t instr;
/* Attempt to read the instruction */
@@ -1059,7 +1058,7 @@ UnwResult UnwStartThumb(UnwState * const state) {
if (--t == 0) return UNWIND_EXHAUSTED;
- } while (!found);
+ }
return UNWIND_SUCCESS;
}
diff --git a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp
index bfc062af2090..f1ee81ed4acb 100644
--- a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp
+++ b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp
@@ -128,11 +128,8 @@ static UnwResult UnwTabStateInit(const UnwindCallbacks *cb, UnwTabState *ucb, ui
* Execute unwinding instructions
*/
static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabState *ucb) {
-
int instruction;
- uint32_t mask;
- uint32_t reg;
- uint32_t vsp;
+ uint32_t mask, reg, vsp;
/* Consume all instruction byte */
while ((instruction = UnwTabGetNextInstruction(cb, ucb)) != -1) {
@@ -140,12 +137,12 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat
if ((instruction & 0xC0) == 0x00) { // ARM_EXIDX_CMD_DATA_POP
/* vsp = vsp + (xxxxxx << 2) + 4 */
ucb->vrs[13] += ((instruction & 0x3F) << 2) + 4;
- } else
- if ((instruction & 0xC0) == 0x40) { // ARM_EXIDX_CMD_DATA_PUSH
+ }
+ else if ((instruction & 0xC0) == 0x40) { // ARM_EXIDX_CMD_DATA_PUSH
/* vsp = vsp - (xxxxxx << 2) - 4 */
ucb->vrs[13] -= ((instruction & 0x3F) << 2) - 4;
- } else
- if ((instruction & 0xF0) == 0x80) {
+ }
+ else if ((instruction & 0xF0) == 0x80) {
/* pop under mask {r15-r12},{r11-r4} or refuse to unwind */
instruction = instruction << 8 | UnwTabGetNextInstruction(cb, ucb);
@@ -171,17 +168,17 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat
}
/* Patch up the vrs sp if it was in the mask */
- if ((instruction & (1 << (13 - 4))) != 0)
+ if (instruction & (1 << (13 - 4)))
ucb->vrs[13] = vsp;
-
- } else
- if ((instruction & 0xF0) == 0x90 && // ARM_EXIDX_CMD_REG_TO_SP
- instruction != 0x9D &&
- instruction != 0x9F) {
+ }
+ else if ((instruction & 0xF0) == 0x90 // ARM_EXIDX_CMD_REG_TO_SP
+ && instruction != 0x9D
+ && instruction != 0x9F
+ ) {
/* vsp = r[nnnn] */
ucb->vrs[13] = ucb->vrs[instruction & 0x0F];
- } else
- if ((instruction & 0xF0) == 0xA0) { // ARM_EXIDX_CMD_REG_POP
+ }
+ else if ((instruction & 0xF0) == 0xA0) { // ARM_EXIDX_CMD_REG_POP
/* pop r4-r[4+nnn] or pop r4-r[4+nnn], r14*/
vsp = ucb->vrs[13];
@@ -204,8 +201,8 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat
ucb->vrs[13] = vsp;
- } else
- if (instruction == 0xB0) { // ARM_EXIDX_CMD_FINISH
+ }
+ else if (instruction == 0xB0) { // ARM_EXIDX_CMD_FINISH
/* finished */
if (ucb->vrs[15] == 0)
ucb->vrs[15] = ucb->vrs[14];
@@ -213,8 +210,8 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat
/* All done unwinding */
return UNWIND_SUCCESS;
- } else
- if (instruction == 0xB1) { // ARM_EXIDX_CMD_REG_POP
+ }
+ else if (instruction == 0xB1) { // ARM_EXIDX_CMD_REG_POP
/* pop register under mask {r3,r2,r1,r0} */
vsp = ucb->vrs[13];
mask = UnwTabGetNextInstruction(cb, ucb);
@@ -234,16 +231,15 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat
}
ucb->vrs[13] = (uint32_t)vsp;
- } else
- if (instruction == 0xB2) { // ARM_EXIDX_CMD_DATA_POP
+ }
+ else if (instruction == 0xB2) { // ARM_EXIDX_CMD_DATA_POP
/* vps = vsp + 0x204 + (uleb128 << 2) */
ucb->vrs[13] += 0x204 + (UnwTabGetNextInstruction(cb, ucb) << 2);
-
- } else
- if (instruction == 0xB3 || // ARM_EXIDX_CMD_VFP_POP
- instruction == 0xC8 ||
- instruction == 0xC9) {
-
+ }
+ else if (instruction == 0xB3 // ARM_EXIDX_CMD_VFP_POP
+ || instruction == 0xC8
+ || instruction == 0xC9
+ ) {
/* pop VFP double-precision registers */
vsp = ucb->vrs[13];
@@ -266,27 +262,20 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat
}
ucb->vrs[13] = vsp;
-
- } else
- if ((instruction & 0xF8) == 0xB8 ||
- (instruction & 0xF8) == 0xD0) {
-
+ }
+ else if ((instruction & 0xF8) == 0xB8 || (instruction & 0xF8) == 0xD0) {
/* Pop VFP double precision registers D[8]-D[8+nnn] */
ucb->vrs[14] = 0x80 | (instruction & 0x07);
-
- if ((instruction & 0xF8) == 0xD0) {
+ if ((instruction & 0xF8) == 0xD0)
ucb->vrs[14] = 1 << 17;
- }
-
- } else
+ }
+ else
return UNWIND_UNSUPPORTED_DWARF_INSTR;
}
-
return UNWIND_SUCCESS;
}
static inline __attribute__((always_inline)) uint32_t read_psp() {
-
/* Read the current PSP and return its value as a pointer */
uint32_t psp;
diff --git a/Marlin/src/HAL/shared/progmem.h b/Marlin/src/HAL/shared/progmem.h
new file mode 100644
index 000000000000..539d02705e97
--- /dev/null
+++ b/Marlin/src/HAL/shared/progmem.h
@@ -0,0 +1,189 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#ifndef __AVR__
+#ifndef __PGMSPACE_H_
+// This define should prevent reading the system pgmspace.h if included elsewhere
+// This is not normally needed.
+#define __PGMSPACE_H_ 1
+#endif
+
+#ifndef PROGMEM
+#define PROGMEM
+#endif
+#ifndef PGM_P
+#define PGM_P const char *
+#endif
+#ifndef PSTR
+#define PSTR(str) (str)
+#endif
+#ifndef F
+#define F(str) (str)
+#endif
+#ifndef _SFR_BYTE
+#define _SFR_BYTE(n) (n)
+#endif
+#ifndef memchr_P
+#define memchr_P(str, c, len) memchr((str), (c), (len))
+#endif
+#ifndef memcmp_P
+#define memcmp_P(a, b, n) memcmp((a), (b), (n))
+#endif
+#ifndef memcpy_P
+#define memcpy_P(dest, src, num) memcpy((dest), (src), (num))
+#endif
+#ifndef memmem_P
+#define memmem_P(a, alen, b, blen) memmem((a), (alen), (b), (blen))
+#endif
+#ifndef memrchr_P
+#define memrchr_P(str, val, len) memrchr((str), (val), (len))
+#endif
+#ifndef strcat_P
+#define strcat_P(dest, src) strcat((dest), (src))
+#endif
+#ifndef strchr_P
+#define strchr_P(str, c) strchr((str), (c))
+#endif
+#ifndef strchrnul_P
+#define strchrnul_P(str, c) strchrnul((str), (c))
+#endif
+#ifndef strcmp_P
+#define strcmp_P(a, b) strcmp((a), (b))
+#endif
+#ifndef strcpy_P
+#define strcpy_P(dest, src) strcpy((dest), (src))
+#endif
+#ifndef strcasecmp_P
+#define strcasecmp_P(a, b) strcasecmp((a), (b))
+#endif
+#ifndef strcasestr_P
+#define strcasestr_P(a, b) strcasestr((a), (b))
+#endif
+#ifndef strlcat_P
+#define strlcat_P(dest, src, len) strlcat((dest), (src), (len))
+#endif
+#ifndef strlcpy_P
+#define strlcpy_P(dest, src, len) strlcpy((dest), (src), (len))
+#endif
+#ifndef strlen_P
+#define strlen_P(s) strlen((const char *)(s))
+#endif
+#ifndef strnlen_P
+#define strnlen_P(str, len) strnlen((str), (len))
+#endif
+#ifndef strncmp_P
+#define strncmp_P(a, b, n) strncmp((a), (b), (n))
+#endif
+#ifndef strncasecmp_P
+#define strncasecmp_P(a, b, n) strncasecmp((a), (b), (n))
+#endif
+#ifndef strncat_P
+#define strncat_P(a, b, n) strncat((a), (b), (n))
+#endif
+#ifndef strncpy_P
+#define strncpy_P(a, b, n) strncpy((a), (b), (n))
+#endif
+#ifndef strpbrk_P
+#define strpbrk_P(str, chrs) strpbrk((str), (chrs))
+#endif
+#ifndef strrchr_P
+#define strrchr_P(str, c) strrchr((str), (c))
+#endif
+#ifndef strsep_P
+#define strsep_P(strp, delim) strsep((strp), (delim))
+#endif
+#ifndef strspn_P
+#define strspn_P(str, chrs) strspn((str), (chrs))
+#endif
+#ifndef strstr_P
+#define strstr_P(a, b) strstr((a), (b))
+#endif
+#ifndef sprintf_P
+#define sprintf_P(s, ...) sprintf((s), __VA_ARGS__)
+#endif
+#ifndef vfprintf_P
+#define vfprintf_P(s, ...) vfprintf((s), __VA_ARGS__)
+#endif
+#ifndef printf_P
+#define printf_P(...) printf(__VA_ARGS__)
+#endif
+#ifndef snprintf_P
+#define snprintf_P(s, n, ...) snprintf((s), (n), __VA_ARGS__)
+#endif
+#ifndef vsprintf_P
+#define vsprintf_P(s, ...) vsprintf((s),__VA_ARGS__)
+#endif
+#ifndef vsnprintf_P
+#define vsnprintf_P(s, n, ...) vsnprintf((s), (n),__VA_ARGS__)
+#endif
+#ifndef fprintf_P
+#define fprintf_P(s, ...) fprintf((s), __VA_ARGS__)
+#endif
+
+#ifndef pgm_read_byte
+#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
+#endif
+#ifndef pgm_read_word
+#define pgm_read_word(addr) (*(const unsigned short *)(addr))
+#endif
+#ifndef pgm_read_dword
+#define pgm_read_dword(addr) (*(const unsigned long *)(addr))
+#endif
+#ifndef pgm_read_float
+#define pgm_read_float(addr) (*(const float *)(addr))
+#endif
+
+#ifndef pgm_read_byte_near
+#define pgm_read_byte_near(addr) pgm_read_byte(addr)
+#endif
+#ifndef pgm_read_word_near
+#define pgm_read_word_near(addr) pgm_read_word(addr)
+#endif
+#ifndef pgm_read_dword_near
+#define pgm_read_dword_near(addr) pgm_read_dword(addr)
+#endif
+#ifndef pgm_read_float_near
+#define pgm_read_float_near(addr) pgm_read_float(addr)
+#endif
+#ifndef pgm_read_byte_far
+#define pgm_read_byte_far(addr) pgm_read_byte(addr)
+#endif
+#ifndef pgm_read_word_far
+#define pgm_read_word_far(addr) pgm_read_word(addr)
+#endif
+#ifndef pgm_read_dword_far
+#define pgm_read_dword_far(addr) pgm_read_dword(addr)
+#endif
+#ifndef pgm_read_float_far
+#define pgm_read_float_far(addr) pgm_read_float(addr)
+#endif
+
+#ifndef pgm_read_pointer
+#define pgm_read_pointer
+#endif
+
+// Fix bug in pgm_read_ptr
+#undef pgm_read_ptr
+#define pgm_read_ptr(addr) (*((void**)(addr)))
+
+#endif // __AVR__
diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index 5769da05d0f2..20cbb35386ba 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -43,6 +43,7 @@
#include
#include "core/utility.h"
+
#include "module/motion.h"
#include "module/planner.h"
#include "module/endstops.h"
@@ -57,6 +58,7 @@
#include "gcode/parser.h"
#include "gcode/queue.h"
+#include "feature/pause.h"
#include "sd/cardreader.h"
#include "lcd/marlinui.h"
@@ -77,6 +79,10 @@
#include "lcd/dwin/e3v2/rotary_encoder.h"
#endif
+#if ENABLED(EXTENSIBLE_UI)
+ #include "lcd/extui/ui_api.h"
+#endif
+
#if HAS_ETHERNET
#include "feature/ethernet.h"
#endif
@@ -135,7 +141,6 @@
#if ENABLED(EXPERIMENTAL_I2CBUS)
#include "feature/twibus.h"
- TWIBus i2c;
#endif
#if ENABLED(I2C_POSITION_ENCODERS)
@@ -169,8 +174,8 @@
#include "feature/bedlevel/bedlevel.h"
#endif
-#if BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT)
- #include "feature/pause.h"
+#if ENABLED(GCODE_REPEAT_MARKERS)
+ #include "feature/repeat.h"
#endif
#if ENABLED(POWER_LOSS_RECOVERY)
@@ -185,7 +190,7 @@
#include "feature/runout.h"
#endif
-#if HAS_Z_SERVO_PROBE
+#if EITHER(PROBE_TARE, HAS_Z_SERVO_PROBE)
#include "module/probe.h"
#endif
@@ -259,40 +264,12 @@ bool wait_for_heatup = true;
#endif
-#if PIN_EXISTS(CHDK)
- extern millis_t chdk_timeout;
-#endif
-
-#if ENABLED(I2C_POSITION_ENCODERS)
- I2CPositionEncodersMgr I2CPEM;
-#endif
-
/**
* ***************************************************************************
* ******************************** FUNCTIONS ********************************
* ***************************************************************************
*/
-void setup_killpin() {
- #if HAS_KILL
- #if KILL_PIN_STATE
- SET_INPUT_PULLDOWN(KILL_PIN);
- #else
- SET_INPUT_PULLUP(KILL_PIN);
- #endif
- #endif
-}
-
-void setup_powerhold() {
- #if HAS_SUICIDE
- OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING);
- #endif
- #if ENABLED(PSU_CONTROL)
- powersupply_on = ENABLED(PSU_DEFAULT_OFF);
- if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON();
- #endif
-}
-
/**
* Stepper Reset (RigidBoard, et.al.)
*/
@@ -301,18 +278,6 @@ void setup_powerhold() {
void enableStepperDrivers() { SET_INPUT(STEPPER_RESET_PIN); } // Set to input, allowing pullups to pull the pin high
#endif
-#if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0
-
- void i2c_on_receive(int bytes) { // just echo all bytes received to serial
- i2c.receive(bytes);
- }
-
- void i2c_on_request() { // just send dummy data for now
- i2c.reply("Hello World!\n");
- }
-
-#endif
-
/**
* Sensitive pin test for M42, M226
*/
@@ -334,17 +299,6 @@ bool pin_is_protected(const pin_t pin) {
#pragma GCC diagnostic pop
-void protected_pin_err() {
- SERIAL_ERROR_MSG(STR_ERR_PROTECTED_PIN);
-}
-
-void quickstop_stepper() {
- planner.quick_stop();
- planner.synchronize();
- set_current_from_steppers_for_axis(ALL_AXES);
- sync_plan_position();
-}
-
void enable_e_steppers() {
#define _ENA_E(N) ENABLE_AXIS_E##N();
REPEAT(E_STEPPERS, _ENA_E)
@@ -356,6 +310,8 @@ void enable_all_steppers() {
ENABLE_AXIS_Y();
ENABLE_AXIS_Z();
enable_e_steppers();
+
+ TERN_(EXTENSIBLE_UI, ExtUI::onSteppersEnabled());
}
void disable_e_steppers() {
@@ -375,42 +331,9 @@ void disable_all_steppers() {
DISABLE_AXIS_Y();
DISABLE_AXIS_Z();
disable_e_steppers();
-}
-#if ENABLED(G29_RETRY_AND_RECOVER)
-
- void event_probe_failure() {
- #ifdef ACTION_ON_G29_FAILURE
- host_action(PSTR(ACTION_ON_G29_FAILURE));
- #endif
- #ifdef G29_FAILURE_COMMANDS
- gcode.process_subcommands_now_P(PSTR(G29_FAILURE_COMMANDS));
- #endif
- #if ENABLED(G29_HALT_ON_FAILURE)
- #ifdef ACTION_ON_CANCEL
- host_action_cancel();
- #endif
- kill(GET_TEXT(MSG_LCD_PROBING_FAILED));
- #endif
- }
-
- void event_probe_recover() {
- TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_INFO, PSTR("G29 Retrying"), DISMISS_STR));
- #ifdef ACTION_ON_G29_RECOVER
- host_action(PSTR(ACTION_ON_G29_RECOVER));
- #endif
- #ifdef G29_RECOVER_COMMANDS
- gcode.process_subcommands_now_P(PSTR(G29_RECOVER_COMMANDS));
- #endif
- }
-
-#endif
-
-#if ENABLED(ADVANCED_PAUSE_FEATURE)
- #include "feature/pause.h"
-#else
- constexpr bool did_pause_print = false;
-#endif
+ TERN_(EXTENSIBLE_UI, ExtUI::onSteppersDisabled());
+}
/**
* A Print Job exists when the timer is running or SD printing
@@ -435,6 +358,7 @@ bool printingIsPaused() {
void startOrResumeJob() {
if (!printingIsPaused()) {
+ TERN_(GCODE_REPEAT_MARKERS, repeat.reset());
TERN_(CANCEL_OBJECTS, cancelable.reset());
TERN_(LCD_SHOW_E_TOTAL, e_move_accumulator = 0);
#if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME)
@@ -447,6 +371,7 @@ void startOrResumeJob() {
#if ENABLED(SDSUPPORT)
inline void abortSDPrinting() {
+ IF_DISABLED(NO_SD_AUTOSTART, card.autofile_cancel());
card.endFilePrint(TERN_(SD_RESORT, true));
queue.clear();
quickstop_stepper();
@@ -497,8 +422,8 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) {
// Prevent steppers timing-out in the middle of M600
// unless PAUSE_PARK_NO_STEPPER_TIMEOUT is disabled
- const bool parked_or_ignoring = ignore_stepper_queue ||
- (BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) && did_pause_print);
+ const bool parked_or_ignoring = ignore_stepper_queue
+ || TERN0(PAUSE_PARK_NO_STEPPER_TIMEOUT, did_pause_print);
// Reset both the M18/M84 activity timeout and the M85 max 'kill' timeout
if (parked_or_ignoring) gcode.reset_stepper_timeout(ms);
@@ -536,6 +461,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) {
}
#if PIN_EXISTS(CHDK) // Check if pin should be set to LOW (after M240 set it HIGH)
+ extern millis_t chdk_timeout;
if (chdk_timeout && ELAPSED(ms, chdk_timeout)) {
chdk_timeout = 0;
WRITE(CHDK_PIN, LOW);
@@ -572,7 +498,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) {
if (ELAPSED(ms, next_home_key_ms)) {
next_home_key_ms = ms + HOME_DEBOUNCE_DELAY;
LCD_MESSAGEPGM(MSG_AUTO_HOME);
- queue.enqueue_now_P(G28_STR);
+ queue.inject_P(G28_STR);
}
}
#endif
@@ -641,11 +567,12 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) {
#if ENABLED(DUAL_X_CARRIAGE)
// handle delayed move timeout
- if (delayed_move_time && ELAPSED(ms, delayed_move_time + 1000UL) && IsRunning()) {
+ if (delayed_move_time && ELAPSED(ms, delayed_move_time) && IsRunning()) {
// travel moves have been received so enact them
delayed_move_time = 0xFFFFFFFFUL; // force moves to be done
destination = current_position;
prepare_line_to_destination();
+ planner.synchronize();
}
#endif
@@ -696,6 +623,10 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) {
* - Handle Joystick jogging
*/
void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
+ #if ENABLED(MARLIN_DEV_MODE)
+ static uint8_t idle_depth = 0;
+ if (++idle_depth > 5) SERIAL_ECHOLNPAIR("idle() call depth: ", int(idle_depth));
+ #endif
// Core Marlin activities
manage_inactivity(TERN_(ADVANCED_PAUSE_FEATURE, no_stepper_sleep));
@@ -707,7 +638,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
TERN_(MAX7219_DEBUG, max7219.idle_tasks());
// Return if setup() isn't completed
- if (marlin_state == MF_INITIALIZING) return;
+ if (marlin_state == MF_INITIALIZING) goto IDLE_DONE;
// Handle filament runout sensors
TERN_(HAS_FILAMENT_SENSOR, runout.run());
@@ -751,6 +682,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
// Run i2c Position Encoders
#if ENABLED(I2C_POSITION_ENCODERS)
+ {
static millis_t i2cpem_next_update_ms;
if (planner.has_blocks_queued()) {
const millis_t ms = millis();
@@ -759,6 +691,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
i2cpem_next_update_ms = ms + I2CPE_MIN_UPD_TIME_MS;
}
}
+ }
#endif
// Auto-report Temperatures / SD Status
@@ -780,6 +713,10 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
// Update the LVGL interface
TERN_(HAS_TFT_LVGL_UI, LV_TASK_HANDLER());
+
+ IDLE_DONE:
+ TERN_(MARLIN_DEV_MODE, idle_depth--);
+ return;
}
/**
@@ -970,14 +907,15 @@ void setup() {
#endif
MYSERIAL0.begin(BAUDRATE);
- uint32_t serial_connect_timeout = millis() + 1000UL;
+ millis_t serial_connect_timeout = millis() + 1000UL;
while (!MYSERIAL0 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
+
#if HAS_MULTI_SERIAL && !HAS_ETHERNET
MYSERIAL1.begin(BAUDRATE);
serial_connect_timeout = millis() + 1000UL;
while (!MYSERIAL1 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
#endif
- SERIAL_ECHO_MSG("start");
+ SERIAL_ECHOLNPGM("start");
#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE)
mks_esp_wifi_init();
@@ -1012,13 +950,29 @@ void setup() {
SETUP_RUN(recovery.setup());
#endif
- SETUP_RUN(setup_killpin());
+ #if HAS_KILL
+ SETUP_LOG("KILL_PIN");
+ #if KILL_PIN_STATE
+ SET_INPUT_PULLDOWN(KILL_PIN);
+ #else
+ SET_INPUT_PULLUP(KILL_PIN);
+ #endif
+ #endif
#if HAS_TMC220x
SETUP_RUN(tmc_serial_begin());
#endif
- SETUP_RUN(setup_powerhold());
+ #if HAS_SUICIDE
+ SETUP_LOG("SUICIDE_PIN")
+ OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING);
+ #endif
+
+ #if ENABLED(PSU_CONTROL)
+ SETUP_LOG("PSU_CONTROL");
+ powersupply_on = ENABLED(PSU_DEFAULT_OFF);
+ if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON();
+ #endif
#if HAS_STEPPER_RESET
SETUP_RUN(disableStepperDrivers());
@@ -1095,6 +1049,10 @@ void setup() {
SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.)
#endif
+ #if ENABLED(PROBE_TARE)
+ SETUP_RUN(probe.tare_init());
+ #endif
+
#if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION)
SETUP_RUN(card.mount()); // Mount media with settings before first_load
#endif
@@ -1331,7 +1289,6 @@ void loop() {
idle();
#if ENABLED(SDSUPPORT)
- card.checkautostart();
if (card.flag.abort_sd_printing) abortSDPrinting();
if (marlin_state == MF_SD_COMPLETE) finishSDPrinting();
#endif
diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h
index 908636e9677c..f5bdbed535e2 100644
--- a/Marlin/src/MarlinCore.h
+++ b/Marlin/src/MarlinCore.h
@@ -37,11 +37,6 @@ void stop();
void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep=false));
inline void idle_no_sleep() { idle(TERN_(ADVANCED_PAUSE_FEATURE, true)); }
-#if ENABLED(EXPERIMENTAL_I2CBUS)
- #include "feature/twibus.h"
- extern TWIBus i2c;
-#endif
-
#if ENABLED(G38_PROBE_TARGET)
extern uint8_t G38_move; // Flag to tell the ISR that G38 is in progress, and the type
extern bool G38_did_trigger; // Flag from the ISR to indicate the endstop changed
@@ -59,8 +54,6 @@ void disable_all_steppers();
void kill(PGM_P const lcd_error=nullptr, PGM_P const lcd_component=nullptr, const bool steppers_off=false);
void minkill(const bool steppers_off=false);
-void quickstop_stepper();
-
// Global State of the firmware
enum MarlinState : uint8_t {
MF_INITIALIZING = 0,
@@ -103,7 +96,6 @@ extern bool wait_for_heatup;
#endif
bool pin_is_protected(const pin_t pin);
-void protected_pin_err();
#if HAS_SUICIDE
inline void suicide() { OUT_WRITE(SUICIDE_PIN, SUICIDE_PIN_INVERTING); }
@@ -116,11 +108,6 @@ void protected_pin_err();
inline bool kill_state() { return READ(KILL_PIN) == KILL_PIN_STATE; }
#endif
-#if ENABLED(G29_RETRY_AND_RECOVER)
- void event_probe_recover();
- void event_probe_failure();
-#endif
-
extern const char NUL_STR[], M112_KILL_STR[], G28_STR[], M21_STR[], M23_STR[], M24_STR[],
SP_A_STR[], SP_B_STR[], SP_C_STR[],
SP_P_STR[], SP_T_STR[], SP_X_STR[], SP_Y_STR[], SP_Z_STR[], SP_E_STR[],
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index a6fc1b4dfdd0..13a202daedb1 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -113,7 +113,8 @@
#define BOARD_RAMPS_S_12_EEFB 1157 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
#define BOARD_RAMPS_S_12_EEEB 1158 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
#define BOARD_RAMPS_S_12_EFFB 1159 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
-#define BOARD_RAMPS_LONGER3D_LK4PRO 1160 // Longer LKxxPRO/ Alfawise UxxPro (PRO version)
+#define BOARD_LONGER3D_LK1_PRO 1160 // Longer LK1 PRO / Alfawise U20 Pro (PRO version)
+#define BOARD_LONGER3D_LKx_PRO 1161 // Longer LKx PRO / Alfawise Uxx Pro (PRO version)
//
// RAMBo and derivatives
@@ -188,7 +189,7 @@
#define BOARD_GEN3_PLUS 1601 // Gen3+
#define BOARD_GEN6 1602 // Gen6
#define BOARD_GEN6_DELUXE 1603 // Gen6 deluxe
-#define BOARD_GEN7_CUSTOM 1604 // Gen7 custom (Alfons3 Version) "https://github.com/Alfons3/Generation_7_Electronics"
+#define BOARD_GEN7_CUSTOM 1604 // Gen7 custom (Alfons3 Version) https://github.com/Alfons3/Generation_7_Electronics
#define BOARD_GEN7_12 1605 // Gen7 v1.1, v1.2
#define BOARD_GEN7_13 1606 // Gen7 v1.3
#define BOARD_GEN7_14 1607 // Gen7 v1.4
@@ -318,20 +319,25 @@
#define BOARD_BTT_SKR_MINI_E3_V2_0 4026 // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC)
#define BOARD_BTT_SKR_MINI_MZ_V1_0 4027 // BigTreeTech SKR Mini MZ V1.0 (STM32F103RC)
#define BOARD_BTT_SKR_E3_DIP 4028 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE)
-#define BOARD_JGAURORA_A5S_A1 4029 // JGAurora A5S A1 (STM32F103ZET6)
-#define BOARD_FYSETC_AIO_II 4030 // FYSETC AIO_II
-#define BOARD_FYSETC_CHEETAH 4031 // FYSETC Cheetah
-#define BOARD_FYSETC_CHEETAH_V12 4032 // FYSETC Cheetah V1.2
-#define BOARD_LONGER3D_LK 4033 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6
-#define BOARD_CCROBOT_MEEB_3DP 4034 // ccrobot-online.com MEEB_3DP (STM32F103RC)
-#define BOARD_CHITU3D_V5 4035 // Chitu3D TronXY X5SA V5 Board
-#define BOARD_CHITU3D_V6 4036 // Chitu3D TronXY X5SA V5 Board
-#define BOARD_CREALITY_V4 4037 // Creality v4.x (STM32F103RE)
-#define BOARD_CREALITY_V427 4038 // Creality v4.2.7 (STM32F103RE)
-#define BOARD_TRIGORILLA_PRO 4039 // Trigorilla Pro (STM32F103ZET6)
-#define BOARD_FLY_MINI 4040 // FLY MINI (STM32F103RCT6)
-#define BOARD_FLSUN_HISPEED 4041 // FLSUN HiSpeedV1 (STM32F103VET6)
-#define BOARD_BEAST 4042 // STM32F103RET6 Libmaple-based controller
+#define BOARD_BTT_SKR_CR6 4029 // BigTreeTech SKR CR6 v1.0 (STM32F103RE)
+#define BOARD_JGAURORA_A5S_A1 4030 // JGAurora A5S A1 (STM32F103ZET6)
+#define BOARD_FYSETC_AIO_II 4031 // FYSETC AIO_II
+#define BOARD_FYSETC_CHEETAH 4032 // FYSETC Cheetah
+#define BOARD_FYSETC_CHEETAH_V12 4033 // FYSETC Cheetah V1.2
+#define BOARD_LONGER3D_LK 4034 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6
+#define BOARD_CCROBOT_MEEB_3DP 4035 // ccrobot-online.com MEEB_3DP (STM32F103RC)
+#define BOARD_CHITU3D_V5 4036 // Chitu3D TronXY X5SA V5 Board
+#define BOARD_CHITU3D_V6 4037 // Chitu3D TronXY X5SA V5 Board
+#define BOARD_CREALITY_V4 4038 // Creality v4.x (STM32F103RE)
+#define BOARD_CREALITY_V427 4039 // Creality v4.2.7 (STM32F103RE)
+#define BOARD_CREALITY_V4210 4040 // Creality v4.2.10 (STM32F103RE) as found in the CR-30
+#define BOARD_CREALITY_V431 4041 // Creality v4.3.1 (STM32F103RE)
+#define BOARD_CREALITY_V452 4042 // Creality v4.5.2 (STM32F103RE)
+#define BOARD_CREALITY_V453 4043 // Creality v4.5.3 (STM32F103RE)
+#define BOARD_TRIGORILLA_PRO 4044 // Trigorilla Pro (STM32F103ZET6)
+#define BOARD_FLY_MINI 4045 // FLY MINI (STM32F103RCT6)
+#define BOARD_FLSUN_HISPEED 4046 // FLSUN HiSpeedV1 (STM32F103VET6)
+#define BOARD_BEAST 4047 // STM32F103RET6 Libmaple-based controller
//
// ARM Cortex-M4F
@@ -363,6 +369,10 @@
#define BOARD_FYSETC_S6_V2_0 4216 // FYSETC S6 v2.0 board
#define BOARD_FLYF407ZG 4217 // FLYF407ZG board (STM32F407ZG)
#define BOARD_MKS_ROBIN2 4218 // MKS_ROBIN2 (STM32F407ZE)
+#define BOARD_MKS_ROBIN_PRO_V2 4219 // MKS Robin Pro V2 (STM32F407VE)
+#define BOARD_MKS_ROBIN_NANO_V3 4220 // MKS Robin Nano V3 (STM32F407VG)
+#define BOARD_ANET_ET4 4221 // ANET ET4 V1.x (STM32F407VGT6)
+#define BOARD_ANET_ET4P 4222 // ANET ET4P V1.x (STM32F407VGT6)
//
// ARM Cortex M7
diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h
index f1e477933ad9..923ad903cb55 100644
--- a/Marlin/src/core/language.h
+++ b/Marlin/src/core/language.h
@@ -68,6 +68,7 @@
// ro Romanian
// ru Russian
// sk Slovak
+// sv Swedish
// tr Turkish
// uk Ukrainian
// vi Vietnamese
@@ -91,7 +92,7 @@
#define MACHINE_UUID DEFAULT_MACHINE_UUID
#endif
-#define MARLIN_WEBSITE_URL "https://marlinfw.org"
+#define MARLIN_WEBSITE_URL "marlinfw.org"
//#if !defined(STRING_SPLASH_LINE3) && defined(WEBSITE_URL)
// #define STRING_SPLASH_LINE3 WEBSITE_URL
@@ -154,6 +155,7 @@
#define STR_Z4_MIN "z4_min"
#define STR_Z4_MAX "z4_max"
#define STR_Z_PROBE "z_probe"
+#define STR_PROBE_EN "probe_en"
#define STR_FILAMENT_RUNOUT_SENSOR "filament"
#define STR_PROBE_OFFSET "Probe Offset"
#define STR_SKEW_MIN "min_skew_factor: "
diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h
index 2e38fad30ef6..d5b3342437ea 100644
--- a/Marlin/src/core/macros.h
+++ b/Marlin/src/core/macros.h
@@ -84,17 +84,13 @@
#define _BV(n) (1<<(n))
#define TEST(n,b) (!!((n)&_BV(b)))
#define SET_BIT_TO(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0)
-
#ifndef SBI
- #define SBI(A,B) (A |= (1 << (B)))
+ #define SBI(A,B) (A |= _BV(B))
#endif
-
#ifndef CBI
- #define CBI(A,B) (A &= ~(1 << (B)))
+ #define CBI(A,B) (A &= ~_BV(B))
#endif
-
#define TBI(N,B) (N ^= _BV(B))
-
#define _BV32(b) (1UL << (b))
#define TEST32(n,b) !!((n)&_BV32(b))
#define SBI32(n,b) (n |= _BV32(b))
@@ -151,7 +147,7 @@
#endif
-// Macros to chain up to 12 conditions
+// Macros to chain up to 14 conditions
#define _DO_1(W,C,A) (_##W##_1(A))
#define _DO_2(W,C,A,B) (_##W##_1(A) C _##W##_1(B))
#define _DO_3(W,C,A,V...) (_##W##_1(A) C _DO_2(W,C,V))
@@ -164,6 +160,8 @@
#define _DO_10(W,C,A,V...) (_##W##_1(A) C _DO_9(W,C,V))
#define _DO_11(W,C,A,V...) (_##W##_1(A) C _DO_10(W,C,V))
#define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V))
+#define _DO_13(W,C,A,V...) (_##W##_1(A) C _DO_12(W,C,V))
+#define _DO_14(W,C,A,V...) (_##W##_1(A) C _DO_13(W,C,V))
#define __DO_N(W,C,N,V...) _DO_##N(W,C,V)
#define _DO_N(W,C,N,V...) __DO_N(W,C,N,V)
#define DO(W,C,V...) (_DO_N(W,C,NUM_ARGS(V),V))
@@ -214,6 +212,7 @@
#define ANY_BUTTON(V...) DO(BTNEX,||,V)
#define WITHIN(N,L,H) ((N) >= (L) && (N) <= (H))
+#define ISEOL(C) ((C) == '\n' || (C) == '\r')
#define NUMERIC(a) WITHIN(a, '0', '9')
#define DECIMAL(a) (NUMERIC(a) || a == '.')
#define HEXCHR(a) (NUMERIC(a) ? (a) - '0' : WITHIN(a, 'a', 'f') ? ((a) - 'a' + 10) : WITHIN(a, 'A', 'F') ? ((a) - 'A' + 10) : -1)
@@ -284,6 +283,7 @@
#define RSQRT(x) (1.0f / sqrtf(x))
#define CEIL(x) ceilf(x)
#define FLOOR(x) floorf(x)
+#define TRUNC(x) truncf(x)
#define LROUND(x) lroundf(x)
#define FMOD(x, y) fmodf(x, y)
#define HYPOT(x,y) SQRT(HYPOT2(x,y))
diff --git a/Marlin/src/core/multi_language.h b/Marlin/src/core/multi_language.h
index 6af4af2f8df4..5a26edf8d453 100644
--- a/Marlin/src/core/multi_language.h
+++ b/Marlin/src/core/multi_language.h
@@ -20,6 +20,8 @@
****************************************************************************/
#pragma once
+#include "../inc/MarlinConfigPre.h"
+
typedef const char Language_Str[];
#ifdef LCD_LANGUAGE_5
@@ -57,26 +59,27 @@ typedef const char Language_Str[];
#define GET_LANG(LANG) _GET_LANG(LANG)
#if NUM_LANGUAGES > 1
- extern uint8_t lang;
+ #define HAS_MULTI_LANGUAGE 1
#define GET_TEXT(MSG) ( \
- lang == 0 ? GET_LANG(LCD_LANGUAGE)::MSG : \
- lang == 1 ? GET_LANG(LCD_LANGUAGE_2)::MSG : \
- lang == 2 ? GET_LANG(LCD_LANGUAGE_3)::MSG : \
- lang == 3 ? GET_LANG(LCD_LANGUAGE_4)::MSG : \
- GET_LANG(LCD_LANGUAGE_5)::MSG \
- )
- #define MAX_LANG_CHARSIZE _MAX(GET_LANG(LCD_LANGUAGE)::CHARSIZE, \
- GET_LANG(LCD_LANGUAGE_2)::CHARSIZE, \
- GET_LANG(LCD_LANGUAGE_3)::CHARSIZE, \
- GET_LANG(LCD_LANGUAGE_4)::CHARSIZE, \
- GET_LANG(LCD_LANGUAGE_5)::CHARSIZE)
+ ui.language == 0 ? GET_LANG(LCD_LANGUAGE )::MSG : \
+ ui.language == 1 ? GET_LANG(LCD_LANGUAGE_2)::MSG : \
+ ui.language == 2 ? GET_LANG(LCD_LANGUAGE_3)::MSG : \
+ ui.language == 3 ? GET_LANG(LCD_LANGUAGE_4)::MSG : \
+ GET_LANG(LCD_LANGUAGE_5)::MSG )
+ #define MAX_LANG_CHARSIZE _MAX(GET_LANG(LCD_LANGUAGE )::CHARSIZE, \
+ GET_LANG(LCD_LANGUAGE_2)::CHARSIZE, \
+ GET_LANG(LCD_LANGUAGE_3)::CHARSIZE, \
+ GET_LANG(LCD_LANGUAGE_4)::CHARSIZE, \
+ GET_LANG(LCD_LANGUAGE_5)::CHARSIZE )
#else
#define GET_TEXT(MSG) GET_LANG(LCD_LANGUAGE)::MSG
- #define MAX_LANG_CHARSIZE GET_LANG(LCD_LANGUAGE)::CHARSIZE
+ #define MAX_LANG_CHARSIZE LANG_CHARSIZE
#endif
#define GET_TEXT_F(MSG) (const __FlashStringHelper*)GET_TEXT(MSG)
#define GET_LANGUAGE_NAME(INDEX) GET_LANG(LCD_LANGUAGE_##INDEX)::LANGUAGE
+#define LANG_CHARSIZE GET_TEXT(CHARSIZE)
+#define USE_WIDE_GLYPH (LANG_CHARSIZE > 2)
#define MSG_1_LINE(A) A "\0" "\0"
#define MSG_2_LINE(A,B) A "\0" B "\0"
diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h
index a5b78caabbe4..20519e1888b5 100644
--- a/Marlin/src/core/types.h
+++ b/Marlin/src/core/types.h
@@ -75,7 +75,6 @@ typedef float feedRate_t;
// Conversion macros
#define MMM_TO_MMS(MM_M) feedRate_t(float(MM_M) / 60.0f)
#define MMS_TO_MMM(MM_S) (float(MM_S) * 60.0f)
-#define MMS_SCALED(V) ((V) * 0.01f * feedrate_percentage)
//
// Coordinates structures for XY, XYZ, XYZE...
diff --git a/Marlin/src/feature/backlash.cpp b/Marlin/src/feature/backlash.cpp
index 867e9cdd217c..b848214f0c46 100644
--- a/Marlin/src/feature/backlash.cpp
+++ b/Marlin/src/feature/backlash.cpp
@@ -123,24 +123,22 @@ void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const
}
#if ENABLED(MEASURE_BACKLASH_WHEN_PROBING)
- #if HAS_CUSTOM_PROBE_PIN
- #define TEST_PROBE_PIN (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING)
- #else
- #define TEST_PROBE_PIN (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)
- #endif
+
+ #include "../module/probe.h"
// Measure Z backlash by raising nozzle in increments until probe deactivates
void Backlash::measure_with_probe() {
if (measured_count.z == 255) return;
const float start_height = current_position.z;
- while (current_position.z < (start_height + BACKLASH_MEASUREMENT_LIMIT) && TEST_PROBE_PIN)
+ while (current_position.z < (start_height + BACKLASH_MEASUREMENT_LIMIT) && PROBE_TRIGGERED())
do_blocking_move_to_z(current_position.z + BACKLASH_MEASUREMENT_RESOLUTION, MMM_TO_MMS(BACKLASH_MEASUREMENT_FEEDRATE));
// The backlash from all probe points is averaged, so count the number of measurements
measured_mm.z += current_position.z - start_height;
measured_count.z++;
}
+
#endif
#endif // BACKLASH_COMPENSATION
diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp
index 44e4fc38a1bd..3fb0cfc3583e 100644
--- a/Marlin/src/feature/bedlevel/abl/abl.cpp
+++ b/Marlin/src/feature/bedlevel/abl/abl.cpp
@@ -168,7 +168,7 @@ void print_bilinear_leveling_grid() {
// cancelled out in bed_level_virt_cmr and does not impact the result. Return 0.0 rather than
// making this function more complex by extrapolating two points.
return 0.0;
- }
+ }
if (!x || x == ABL_TEMP_POINTS_X - 1) {
if (x) {
ep = GRID_MAX_POINTS_X - 1;
diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h
index 995e9d0dbcef..a33f08ad0ee1 100644
--- a/Marlin/src/feature/bedlevel/bedlevel.h
+++ b/Marlin/src/feature/bedlevel/bedlevel.h
@@ -23,6 +23,10 @@
#include "../../inc/MarlinConfigPre.h"
+#if EITHER(RESTORE_LEVELING_AFTER_G28, ENABLE_LEVELING_AFTER_G28)
+ #define G28_L0_ENSURES_LEVELING_OFF 1
+#endif
+
#if ENABLED(PROBE_MANUALLY)
extern bool g29_in_progress;
#else
diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp
index 1200c2a1b3b8..ec5b95c108b8 100644
--- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp
+++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp
@@ -71,8 +71,8 @@
// Start and end in the same cell? No split needed.
if (scel == ecel) {
- line_to_destination(scaled_fr_mm_s);
current_position = destination;
+ line_to_current_position(scaled_fr_mm_s);
return;
}
@@ -104,8 +104,8 @@
else {
// Must already have been split on these border(s)
// This should be a rare case.
- line_to_destination(scaled_fr_mm_s);
current_position = destination;
+ line_to_current_position(scaled_fr_mm_s);
return;
}
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp
index 087fdf42b2ac..fba065fed91f 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp
@@ -42,9 +42,7 @@
#include "math.h"
- void unified_bed_leveling::echo_name() {
- SERIAL_ECHOPGM("Unified Bed Leveling");
- }
+ void unified_bed_leveling::echo_name() { SERIAL_ECHOPGM("Unified Bed Leveling"); }
void unified_bed_leveling::report_current_mesh() {
if (!leveling_is_valid()) return;
@@ -86,9 +84,7 @@
volatile int16_t unified_bed_leveling::encoder_diff;
- unified_bed_leveling::unified_bed_leveling() {
- reset();
- }
+ unified_bed_leveling::unified_bed_leveling() { reset(); }
void unified_bed_leveling::reset() {
const bool was_enabled = planner.leveling_active;
@@ -113,6 +109,31 @@
}
}
+ #if ENABLED(OPTIMIZED_MESH_STORAGE)
+
+ constexpr float mesh_store_scaling = 1000;
+ constexpr int16_t Z_STEPS_NAN = INT16_MAX;
+
+ void unified_bed_leveling::set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values) {
+ auto z_to_store = [](const float &z) {
+ if (isnan(z)) return Z_STEPS_NAN;
+ const int32_t z_scaled = TRUNC(z * mesh_store_scaling);
+ if (z_scaled == Z_STEPS_NAN || !WITHIN(z_scaled, INT16_MIN, INT16_MAX))
+ return Z_STEPS_NAN; // If Z is out of range, return our custom 'NaN'
+ return int16_t(z_scaled);
+ };
+ GRID_LOOP(x, y) stored_values[x][y] = z_to_store(in_values[x][y]);
+ }
+
+ void unified_bed_leveling::set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values) {
+ auto store_to_z = [](const int16_t z_scaled) {
+ return z_scaled == Z_STEPS_NAN ? NAN : z_scaled / mesh_store_scaling;
+ };
+ GRID_LOOP(x, y) out_values[x][y] = store_to_z(stored_values[x][y]);
+ }
+
+ #endif // OPTIMIZED_MESH_STORAGE
+
static void serial_echo_xy(const uint8_t sp, const int16_t x, const int16_t y) {
SERIAL_ECHO_SP(sp);
SERIAL_CHAR('(');
@@ -127,7 +148,7 @@
static void serial_echo_column_labels(const uint8_t sp) {
SERIAL_ECHO_SP(7);
- for (int8_t i = 0; i < GRID_MAX_POINTS_X; i++) {
+ LOOP_L_N(i, GRID_MAX_POINTS_X) {
if (i < 10) SERIAL_CHAR(' ');
SERIAL_ECHO(i);
SERIAL_ECHO_SP(sp);
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h
index c90b1f7ac155..876063c8787c 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl.h
+++ b/Marlin/src/feature/bedlevel/ubl/ubl.h
@@ -41,6 +41,10 @@ struct mesh_index_pair;
#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1))
#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1))
+#if ENABLED(OPTIMIZED_MESH_STORAGE)
+ typedef int16_t mesh_store_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y];
+#endif
+
class unified_bed_leveling {
private:
@@ -106,6 +110,10 @@ class unified_bed_leveling {
static int8_t storage_slot;
static bed_mesh_t z_values;
+ #if ENABLED(OPTIMIZED_MESH_STORAGE)
+ static void set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values);
+ static void set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values);
+ #endif
static const float _mesh_index_to_xpos[GRID_MAX_POINTS_X],
_mesh_index_to_ypos[GRID_MAX_POINTS_Y];
@@ -122,20 +130,29 @@ class unified_bed_leveling {
FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; }
+ static int8_t cell_index_x_raw(const float &x) {
+ return FLOOR((x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST));
+ }
+
+ static int8_t cell_index_y_raw(const float &y) {
+ return FLOOR((y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST));
+ }
+
+ static int8_t cell_index_x_valid(const float &x) {
+ return WITHIN(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X - 2));
+ }
+
+ static int8_t cell_index_y_valid(const float &y) {
+ return WITHIN(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y - 2));
+ }
+
static int8_t cell_index_x(const float &x) {
- const int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST);
- return constrain(cx, 0, (GRID_MAX_POINTS_X) - 1); // -1 is appropriate if we want all movement to the X_MAX
- } // position. But with this defined this way, it is possible
- // to extrapolate off of this point even further out. Probably
- // that is OK because something else should be keeping that from
- // happening and should not be worried about at this level.
+ return constrain(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X) - 2);
+ }
+
static int8_t cell_index_y(const float &y) {
- const int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST);
- return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 1); // -1 is appropriate if we want all movement to the Y_MAX
- } // position. But with this defined this way, it is possible
- // to extrapolate off of this point even further out. Probably
- // that is OK because something else should be keeping that from
- // happening and should not be worried about at this level.
+ return constrain(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y) - 2);
+ }
static inline xy_int8_t cell_indexes(const float &x, const float &y) {
return { cell_index_x(x), cell_index_y(y) };
@@ -173,6 +190,12 @@ class unified_bed_leveling {
return z1 + (z2 - z1) * (a0 - a1) / (a2 - a1);
}
+ #ifdef UBL_Z_RAISE_WHEN_OFF_MESH
+ #define _UBL_OUTER_Z_RAISE UBL_Z_RAISE_WHEN_OFF_MESH
+ #else
+ #define _UBL_OUTER_Z_RAISE NAN
+ #endif
+
/**
* z_correction_for_x_on_horizontal_mesh_line is an optimization for
* the case where the printer is making a vertical line that only crosses horizontal mesh lines.
@@ -186,13 +209,7 @@ class unified_bed_leveling {
}
// The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN.
- return (
- #ifdef UBL_Z_RAISE_WHEN_OFF_MESH
- UBL_Z_RAISE_WHEN_OFF_MESH
- #else
- NAN
- #endif
- );
+ return _UBL_OUTER_Z_RAISE;
}
const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * RECIPROCAL(MESH_X_DIST),
@@ -215,13 +232,7 @@ class unified_bed_leveling {
}
// The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN.
- return (
- #ifdef UBL_Z_RAISE_WHEN_OFF_MESH
- UBL_Z_RAISE_WHEN_OFF_MESH
- #else
- NAN
- #endif
- );
+ return _UBL_OUTER_Z_RAISE;
}
const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * RECIPROCAL(MESH_Y_DIST),
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
index 94bec99194b7..3f7b2d7d9666 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
@@ -321,7 +321,8 @@
// Check for commands that require the printer to be homed
if (may_move) {
planner.synchronize();
- if (axes_should_home()) gcode.home_all_axes();
+ // Send 'N' to force homing before G29 (internal only)
+ if (axes_should_home() || parser.seen('N')) gcode.home_all_axes();
TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0));
}
@@ -543,7 +544,7 @@
}
else {
const float cvf = parser.value_float();
- switch ((int)truncf(cvf * 10.0f) - 30) { // 3.1 -> 1
+ switch ((int)TRUNC(cvf * 10.0f) - 30) { // 3.1 -> 1
#if ENABLED(UBL_G29_P31)
case 1: {
@@ -727,7 +728,7 @@
* Probe all invalidated locations of the mesh that can be reached by the probe.
* This attempts to fill in locations closest to the nozzle's start location first.
*/
- void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) {
+ void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &nearby, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) {
probe.deploy(); // Deploy before ui.capture() to allow for PAUSE_BEFORE_DEPLOY_STOW
TERN_(HAS_LCD_MENU, ui.capture());
@@ -758,7 +759,7 @@
best = do_furthest
? find_furthest_invalid_mesh_point()
- : find_closest_mesh_point_of_type(INVALID, near, true);
+ : find_closest_mesh_point_of_type(INVALID, nearby, true);
if (best.pos.x >= 0) { // mesh point found and is reachable by probe
TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START));
@@ -788,8 +789,8 @@
restore_ubl_active_state_and_leave();
do_blocking_move_to_xy(
- constrain(near.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X),
- constrain(near.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y)
+ constrain(nearby.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X),
+ constrain(nearby.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y)
);
}
@@ -972,6 +973,12 @@
MeshFlags done_flags{0};
const xy_int8_t &lpos = location.pos;
+
+ #if IS_TFTGLCD_PANEL
+ lcd_mesh_edit_setup(0); // Change current screen before calling ui.ubl_plot
+ safe_delay(50);
+ #endif
+
do {
location = find_closest_mesh_point_of_type(SET_IN_BITMAP, pos, false, &done_flags);
@@ -1206,7 +1213,7 @@
found_a_NAN = true;
- xy_int8_t near { -1, -1 };
+ xy_int8_t nearby { -1, -1 };
float d1, d2 = 99999.9f;
GRID_LOOP(k, l) {
if (isnan(z_values[k][l])) continue;
@@ -1221,7 +1228,7 @@
if (d1 < d2) { // Invalid mesh point (i,j) is closer to the defined point (k,l)
d2 = d1;
- near.set(i, j);
+ nearby.set(i, j);
}
}
@@ -1229,8 +1236,8 @@
// At this point d2 should have the near defined mesh point to invalid mesh point (i,j)
//
- if (found_a_real && near.x >= 0 && d2 > farthest.distance) {
- farthest.pos = near; // Found an invalid location farther from the defined mesh point
+ if (found_a_real && nearby.x >= 0 && d2 > farthest.distance) {
+ farthest.pos = nearby; // Found an invalid location farther from the defined mesh point
farthest.distance = d2;
}
} // GRID_LOOP
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
index 010b5951be5f..8b7cd15a3c6d 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
@@ -56,39 +56,32 @@
// A move within the same cell needs no splitting
if (istart == iend) {
- // For a move off the bed, use a constant Z raise
- if (!WITHIN(iend.x, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iend.y, 0, GRID_MAX_POINTS_Y - 1)) {
+ FINAL_MOVE:
- // Note: There is no Z Correction in this case. We are off the grid and don't know what
- // a reasonable correction would be. If the user has specified a UBL_Z_RAISE_WHEN_OFF_MESH
- // value, that will be used instead of a calculated (Bi-Linear interpolation) correction.
+ // When UBL_Z_RAISE_WHEN_OFF_MESH is disabled Z correction is extrapolated from the edge of the mesh
+ #ifdef UBL_Z_RAISE_WHEN_OFF_MESH
+ // For a move off the UBL mesh, use a constant Z raise
+ if (!cell_index_x_valid(end.x) || !cell_index_y_valid(end.y)) {
- #ifdef UBL_Z_RAISE_WHEN_OFF_MESH
- end.z += UBL_Z_RAISE_WHEN_OFF_MESH;
- #endif
- planner.buffer_segment(end, scaled_fr_mm_s, extruder);
- current_position = destination;
- return;
- }
+ // Note: There is no Z Correction in this case. We are off the mesh and don't know what
+ // a reasonable correction would be, UBL_Z_RAISE_WHEN_OFF_MESH will be used instead of
+ // a calculated (Bi-Linear interpolation) correction.
- FINAL_MOVE:
+ end.z += UBL_Z_RAISE_WHEN_OFF_MESH;
+ planner.buffer_segment(end, scaled_fr_mm_s, extruder);
+ current_position = destination;
+ return;
+ }
+ #endif
// The distance is always MESH_X_DIST so multiply by the constant reciprocal.
- const float xratio = (end.x - mesh_index_to_xpos(iend.x)) * RECIPROCAL(MESH_X_DIST);
-
- float z1, z2;
- if (iend.x >= GRID_MAX_POINTS_X - 1)
- z1 = z2 = 0.0;
- else {
- z1 = z_values[iend.x ][iend.y ] + xratio *
- (z_values[iend.x + 1][iend.y ] - z_values[iend.x][iend.y ]),
- z2 = z_values[iend.x ][iend.y + 1] + xratio *
- (z_values[iend.x + 1][iend.y + 1] - z_values[iend.x][iend.y + 1]);
- }
+ const float xratio = (end.x - mesh_index_to_xpos(iend.x)) * RECIPROCAL(MESH_X_DIST),
+ yratio = (end.y - mesh_index_to_ypos(iend.y)) * RECIPROCAL(MESH_Y_DIST),
+ z1 = z_values[iend.x][iend.y ] + xratio * (z_values[iend.x + 1][iend.y ] - z_values[iend.x][iend.y ]),
+ z2 = z_values[iend.x][iend.y + 1] + xratio * (z_values[iend.x + 1][iend.y + 1] - z_values[iend.x][iend.y + 1]);
// X cell-fraction done. Interpolate the two Z offsets with the Y fraction for the final Z offset.
- const float yratio = (end.y - mesh_index_to_ypos(iend.y)) * RECIPROCAL(MESH_Y_DIST),
- z0 = iend.y < GRID_MAX_POINTS_Y - 1 ? (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end.z) : 0.0;
+ const float z0 = (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end.z);
// Undefined parts of the Mesh in z_values[][] are NAN.
// Replace NAN corrections with 0.0 to prevent NAN propagation.
diff --git a/Marlin/src/feature/bltouch.cpp b/Marlin/src/feature/bltouch.cpp
index d6b1f99c16b9..48eaf9efc400 100644
--- a/Marlin/src/feature/bltouch.cpp
+++ b/Marlin/src/feature/bltouch.cpp
@@ -31,6 +31,7 @@ BLTouch bltouch;
bool BLTouch::last_written_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain
#include "../module/servo.h"
+#include "../module/probe.h"
void stop();
@@ -90,15 +91,7 @@ void BLTouch::clear() {
_stow(); // STOW to be ready for meaningful work. Could fail, don't care
}
-bool BLTouch::triggered() {
- return (
- #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)
- READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING
- #else
- READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING
- #endif
- );
-}
+bool BLTouch::triggered() { return PROBE_TRIGGERED(); }
bool BLTouch::deploy_proc() {
// Do a DEPLOY
diff --git a/Marlin/src/feature/bltouch.h b/Marlin/src/feature/bltouch.h
index 40685af1b357..8bd41f03e404 100644
--- a/Marlin/src/feature/bltouch.h
+++ b/Marlin/src/feature/bltouch.h
@@ -23,19 +23,16 @@
#include "../inc/MarlinConfigPre.h"
+#if DISABLED(BLTOUCH_HS_MODE)
+ #define BLTOUCH_SLOW_MODE 1
+#endif
+
// BLTouch commands are sent as servo angles
typedef unsigned char BLTCommand;
-#if ENABLED(CREALITY_TOUCH)
- #define STOW_ALARM false
- #define BLTOUCH_DEPLOY 170
- #define BLTOUCH_STOW 20
-#else
- #define STOW_ALARM true
- #define BLTOUCH_DEPLOY 10
- #define BLTOUCH_STOW 90
-#endif
-
+#define STOW_ALARM true
+#define BLTOUCH_DEPLOY 10
+#define BLTOUCH_STOW 90
#define BLTOUCH_SW_MODE 60
#define BLTOUCH_SELFTEST 120
#define BLTOUCH_MODE_STORE 130
diff --git a/Marlin/src/feature/dac/dac_dac084s085.cpp b/Marlin/src/feature/dac/dac_dac084s085.cpp
index 82d17fa28f07..649aa5561bfa 100644
--- a/Marlin/src/feature/dac/dac_dac084s085.cpp
+++ b/Marlin/src/feature/dac/dac_dac084s085.cpp
@@ -92,7 +92,7 @@ void dac084s085::cshigh() {
WRITE(SPI_EEPROM1_CS, HIGH);
WRITE(SPI_EEPROM2_CS, HIGH);
WRITE(SPI_FLASH_CS, HIGH);
- WRITE(SS_PIN, HIGH);
+ WRITE(SD_SS_PIN, HIGH);
}
#endif // MB(ALLIGATOR)
diff --git a/Marlin/src/feature/digipot/digipot_mcp4018.cpp b/Marlin/src/feature/digipot/digipot_mcp4018.cpp
index 4b90cc4ead6b..37853ff428bc 100644
--- a/Marlin/src/feature/digipot/digipot_mcp4018.cpp
+++ b/Marlin/src/feature/digipot/digipot_mcp4018.cpp
@@ -27,7 +27,7 @@
#include "digipot.h"
#include
-#include // https://github.com/stawel/SlowSoftI2CMaster
+#include // https://github.com/felias-fogg/SlowSoftI2CMaster
// Settings for the I2C based DIGIPOT (MCP4018) based on WT150
@@ -46,21 +46,21 @@ static byte current_to_wiper(const float current) {
}
static SlowSoftI2CMaster pots[DIGIPOT_I2C_NUM_CHANNELS] = {
- SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_X, DIGIPOTS_I2C_SCL)
+ SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_X, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS))
#if DIGIPOT_I2C_NUM_CHANNELS > 1
- , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Y, DIGIPOTS_I2C_SCL)
+ , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Y, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS))
#if DIGIPOT_I2C_NUM_CHANNELS > 2
- , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Z, DIGIPOTS_I2C_SCL)
+ , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Z, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS))
#if DIGIPOT_I2C_NUM_CHANNELS > 3
- , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E0, DIGIPOTS_I2C_SCL)
+ , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E0, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS))
#if DIGIPOT_I2C_NUM_CHANNELS > 4
- , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E1, DIGIPOTS_I2C_SCL)
+ , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E1, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS))
#if DIGIPOT_I2C_NUM_CHANNELS > 5
- , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E2, DIGIPOTS_I2C_SCL)
+ , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E2, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS))
#if DIGIPOT_I2C_NUM_CHANNELS > 6
- , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E3, DIGIPOTS_I2C_SCL)
+ , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E3, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS))
#if DIGIPOT_I2C_NUM_CHANNELS > 7
- , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E4, DIGIPOTS_I2C_SCL)
+ , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E4, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS))
#endif
#endif
#endif
diff --git a/Marlin/src/feature/direct_stepping.h b/Marlin/src/feature/direct_stepping.h
index cde9d1a0b438..b3007731cdb2 100644
--- a/Marlin/src/feature/direct_stepping.h
+++ b/Marlin/src/feature/direct_stepping.h
@@ -93,8 +93,8 @@ namespace DirectStepping {
static constexpr int DIRECTIONAL = dir ? 1 : 0;
static constexpr int SEGMENTS = segments;
- static constexpr int NUM_SEGMENTS = 1 << BITS_SEGMENT;
- static constexpr int SEGMENT_STEPS = (1 << (BITS_SEGMENT - DIRECTIONAL)) - 1;
+ static constexpr int NUM_SEGMENTS = _BV(BITS_SEGMENT);
+ static constexpr int SEGMENT_STEPS = _BV(BITS_SEGMENT - DIRECTIONAL) - 1;
static constexpr int TOTAL_STEPS = SEGMENT_STEPS * SEGMENTS;
static constexpr int PAGE_SIZE = (NUM_AXES * BITS_SEGMENT * SEGMENTS) / 8;
diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h
index 0bb0253149eb..659e516787fc 100644
--- a/Marlin/src/feature/e_parser.h
+++ b/Marlin/src/feature/e_parser.h
@@ -33,7 +33,6 @@
// External references
extern bool wait_for_user, wait_for_heatup;
-void quickstop_stepper();
class EmergencyParser {
@@ -76,7 +75,6 @@ class EmergencyParser {
FORCE_INLINE static void disable() { enabled = false; }
FORCE_INLINE static void update(State &state, const uint8_t c) {
- #define ISEOL(C) ((C) == '\n' || (C) == '\r')
switch (state) {
case EP_RESET:
switch (c) {
diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp
index 8a3e959e0702..fa3cf1503f4d 100644
--- a/Marlin/src/feature/encoder_i2c.cpp
+++ b/Marlin/src/feature/encoder_i2c.cpp
@@ -34,7 +34,6 @@
#include "encoder_i2c.h"
-#include "../module/temperature.h"
#include "../module/stepper.h"
#include "../gcode/parser.h"
@@ -42,6 +41,8 @@
#include
+I2CPositionEncodersMgr I2CPEM;
+
void I2CPositionEncoder::init(const uint8_t address, const AxisEnum axis) {
encoderAxis = axis;
i2cAddress = address;
@@ -85,7 +86,7 @@ void I2CPositionEncoder::update() {
* the encoder would be re-enabled.
*/
- /*
+ #if 0
// If the magnetic strength has been good for a certain time, start trusting the module again
if (millis() - lastErrorTime > I2CPE_TIME_TRUSTED) {
@@ -111,7 +112,7 @@ void I2CPositionEncoder::update() {
SERIAL_ECHOLNPGM(")");
#endif
}
- */
+ #endif
return;
}
@@ -332,7 +333,7 @@ bool I2CPositionEncoder::test_axis() {
const float startPosition = soft_endstop.min[encoderAxis] + 10,
endPosition = soft_endstop.max[encoderAxis] - 10;
- const feedRate_t fr_mm_s = FLOOR(MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY));
+ const feedRate_t fr_mm_s = FLOOR(homing_feedrate(encoderAxis));
ec = false;
@@ -382,7 +383,7 @@ void I2CPositionEncoder::calibrate_steps_mm(const uint8_t iter) {
int32_t startCount, stopCount;
- const feedRate_t fr_mm_s = MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY);
+ const feedRate_t fr_mm_s = homing_feedrate(encoderAxis);
bool oldec = ec;
ec = false;
diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp
index e5c52562a9ad..2a71af11d67d 100644
--- a/Marlin/src/feature/fwretract.cpp
+++ b/Marlin/src/feature/fwretract.cpp
@@ -139,7 +139,7 @@ void FWRetract::retract(const bool retracting
if (retracting) {
// Retract by moving from a faux E position back to the current E position
current_retract[active_extruder] = base_retract;
- prepare_internal_move_to_destination( // set current to destination
+ prepare_internal_move_to_destination( // set current from destination
settings.retract_feedrate_mm_s * TERN1(RETRACT_SYNC_MIXING, (MIXING_STEPPERS))
);
diff --git a/Marlin/src/feature/joystick.cpp b/Marlin/src/feature/joystick.cpp
index d9c5ae7c1b1c..3dca2eb2e9bd 100644
--- a/Marlin/src/feature/joystick.cpp
+++ b/Marlin/src/feature/joystick.cpp
@@ -32,7 +32,6 @@
#include "../inc/MarlinConfig.h" // for pins
#include "../module/planner.h"
-#include "../module/temperature.h"
Joystick joystick;
@@ -127,6 +126,11 @@ Joystick joystick;
static bool injecting_now; // = false;
if (injecting_now) return;
+ #if ENABLED(NO_MOTION_BEFORE_HOMING)
+ if (TERN0(HAS_JOY_ADC_X, axis_should_home(X_AXIS)) || TERN0(HAS_JOY_ADC_Y, axis_should_home(Y_AXIS)) || TERN0(HAS_JOY_ADC_Z, axis_should_home(Z_AXIS)))
+ return;
+ #endif
+
static constexpr int QUEUE_DEPTH = 5; // Insert up to this many movements
static constexpr float target_lag = 0.25f, // Aim for 1/4 second lag
seg_time = target_lag / QUEUE_DEPTH; // 0.05 seconds, short segments inserted every 1/20th of a second
diff --git a/Marlin/src/feature/joystick.h b/Marlin/src/feature/joystick.h
index 1d25a30cc24d..e8e218b2f940 100644
--- a/Marlin/src/feature/joystick.h
+++ b/Marlin/src/feature/joystick.h
@@ -27,7 +27,6 @@
#include "../inc/MarlinConfigPre.h"
#include "../core/types.h"
-#include "../core/macros.h"
#include "../module/temperature.h"
class Joystick {
diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h
index 055ea0df37ad..57b21d576c54 100644
--- a/Marlin/src/feature/leds/leds.h
+++ b/Marlin/src/feature/leds/leds.h
@@ -34,7 +34,7 @@
#endif
// A white component can be passed
-#if EITHER(RGBW_LED, NEOPIXEL_LED)
+#if ANY(RGBW_LED, NEOPIXEL_LED, PCA9632_RGBW)
#define HAS_WHITE_LED 1
#endif
diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h
index d7354207fc53..acf2e7f54d3b 100644
--- a/Marlin/src/feature/leds/neopixel.h
+++ b/Marlin/src/feature/leds/neopixel.h
@@ -105,6 +105,8 @@ class Marlin_NeoPixel {
}
static inline void show() {
+ // Some platforms cannot maintain PWM output when NeoPixel disables interrupts for long durations.
+ TERN_(HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT());
adaneo1.show();
#if PIN_EXISTS(NEOPIXEL2)
#if CONJOINED_NEOPIXEL
@@ -115,6 +117,7 @@ class Marlin_NeoPixel {
adaneo1.setPin(NEOPIXEL_PIN);
#endif
#endif
+ TERN_(HAS_PAUSE_SERVO_OUTPUT, RESUME_SERVO_OUTPUT());
}
#if 0
diff --git a/Marlin/src/feature/leds/pca9632.cpp b/Marlin/src/feature/leds/pca9632.cpp
index d8af31cb6ce4..bb30e0b48b0e 100644
--- a/Marlin/src/feature/leds/pca9632.cpp
+++ b/Marlin/src/feature/leds/pca9632.cpp
@@ -58,7 +58,7 @@
#define PCA9632_AUTOGLO 0xC0
#define PCA9632_AUTOGI 0xE0
-// Red=LED0 Green=LED1 Blue=LED2
+// Red=LED0 Green=LED1 Blue=LED2 White=LED3
#ifndef PCA9632_RED
#define PCA9632_RED 0x00
#endif
@@ -68,9 +68,12 @@
#ifndef PCA9632_BLU
#define PCA9632_BLU 0x04
#endif
+#if HAS_WHITE_LED && !defined(PCA9632_WHT)
+ #define PCA9632_WHT 0x06
+#endif
// If any of the color indexes are greater than 0x04 they can't use auto increment
-#if !defined(PCA9632_NO_AUTO_INC) && (PCA9632_RED > 0x04 || PCA9632_GRN > 0x04 || PCA9632_BLU > 0x04)
+#if !defined(PCA9632_NO_AUTO_INC) && (PCA9632_RED > 0x04 || PCA9632_GRN > 0x04 || PCA9632_BLU > 0x04 || PCA9632_WHT > 0x04)
#define PCA9632_NO_AUTO_INC
#endif
@@ -89,25 +92,28 @@ static void PCA9632_WriteRegister(const byte addr, const byte regadd, const byte
Wire.endTransmission();
}
-static void PCA9632_WriteAllRegisters(const byte addr, const byte regadd, const byte vr, const byte vg, const byte vb) {
+static void PCA9632_WriteAllRegisters(const byte addr, const byte regadd, const byte vr, const byte vg, const byte vb
+ #if ENABLED(PCA9632_RGBW)
+ , const byte vw
+ #endif
+) {
#if DISABLED(PCA9632_NO_AUTO_INC)
- uint8_t data[4], len = 4;
+ uint8_t data[4];
data[0] = PCA9632_AUTO_IND | regadd;
data[1 + (PCA9632_RED >> 1)] = vr;
data[1 + (PCA9632_GRN >> 1)] = vg;
data[1 + (PCA9632_BLU >> 1)] = vb;
+ Wire.beginTransmission(I2C_ADDRESS(addr));
+ Wire.write(data, sizeof(data));
+ Wire.endTransmission();
#else
- uint8_t data[6], len = 6;
- data[0] = regadd + (PCA9632_RED >> 1);
- data[1] = vr;
- data[2] = regadd + (PCA9632_GRN >> 1);
- data[3] = vg;
- data[4] = regadd + (PCA9632_BLU >> 1);
- data[5] = vb;
+ PCA9632_WriteRegister(addr, regadd + (PCA9632_RED >> 1), vr);
+ PCA9632_WriteRegister(addr, regadd + (PCA9632_GRN >> 1), vg);
+ PCA9632_WriteRegister(addr, regadd + (PCA9632_BLU >> 1), vb);
+ #if ENABLED(PCA9632_RGBW)
+ PCA9632_WriteRegister(addr, regadd + (PCA9632_WHT >> 1), vw);
+ #endif
#endif
- Wire.beginTransmission(I2C_ADDRESS(addr));
- Wire.write(data, len);
- Wire.endTransmission();
}
#if 0
@@ -130,9 +136,17 @@ void PCA9632_set_led_color(const LEDColor &color) {
const byte LEDOUT = (color.r ? LED_PWM << PCA9632_RED : 0)
| (color.g ? LED_PWM << PCA9632_GRN : 0)
- | (color.b ? LED_PWM << PCA9632_BLU : 0);
-
- PCA9632_WriteAllRegisters(PCA9632_ADDRESS,PCA9632_PWM0, color.r, color.g, color.b);
+ | (color.b ? LED_PWM << PCA9632_BLU : 0)
+ #if ENABLED(PCA9632_RGBW)
+ | (color.w ? LED_PWM << PCA9632_WHT : 0)
+ #endif
+ ;
+
+ PCA9632_WriteAllRegisters(PCA9632_ADDRESS,PCA9632_PWM0, color.r, color.g, color.b
+ #if ENABLED(PCA9632_RGBW)
+ , color.w
+ #endif
+ );
PCA9632_WriteRegister(PCA9632_ADDRESS,PCA9632_LEDOUT, LEDOUT);
}
diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp
index 61adcfca72a7..a4b7f257a9b8 100644
--- a/Marlin/src/feature/mmu/mmu2.cpp
+++ b/Marlin/src/feature/mmu/mmu2.cpp
@@ -91,8 +91,6 @@ MMU2 mmu2;
#define MMU2_NO_TOOL 99
#define MMU_BAUD 115200
-#define mmuSerial MMU2_SERIAL
-
bool MMU2::enabled, MMU2::ready, MMU2::mmu_print_saved;
#if HAS_PRUSA_MMU2S
bool MMU2::mmu2s_triggered;
@@ -128,12 +126,11 @@ void MMU2::init() {
set_runout_valid(false);
#if PIN_EXISTS(MMU2_RST)
- // TODO use macros for this
WRITE(MMU2_RST_PIN, HIGH);
SET_OUTPUT(MMU2_RST_PIN);
#endif
- mmuSerial.begin(MMU_BAUD);
+ MMU2_SERIAL.begin(MMU_BAUD);
extruder = MMU2_NO_TOOL;
safe_delay(10);
@@ -386,8 +383,8 @@ bool MMU2::rx_start() {
bool MMU2::rx_str_P(const char* str) {
uint8_t i = strlen(rx_buffer);
- while (mmuSerial.available()) {
- rx_buffer[i++] = mmuSerial.read();
+ while (MMU2_SERIAL.available()) {
+ rx_buffer[i++] = MMU2_SERIAL.read();
rx_buffer[i] = '\0';
if (i == sizeof(rx_buffer) - 1) {
@@ -418,7 +415,7 @@ bool MMU2::rx_str_P(const char* str) {
void MMU2::tx_str_P(const char* str) {
clear_rx_buffer();
uint8_t len = strlen_P(str);
- LOOP_L_N(i, len) mmuSerial.write(pgm_read_byte(str++));
+ LOOP_L_N(i, len) MMU2_SERIAL.write(pgm_read_byte(str++));
rx_buffer[0] = '\0';
prev_request = millis();
}
@@ -429,7 +426,7 @@ void MMU2::tx_str_P(const char* str) {
void MMU2::tx_printf_P(const char* format, int argument = -1) {
clear_rx_buffer();
uint8_t len = sprintf_P(tx_buffer, format, argument);
- LOOP_L_N(i, len) mmuSerial.write(tx_buffer[i]);
+ LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]);
rx_buffer[0] = '\0';
prev_request = millis();
}
@@ -440,7 +437,7 @@ void MMU2::tx_printf_P(const char* format, int argument = -1) {
void MMU2::tx_printf_P(const char* format, int argument1, int argument2) {
clear_rx_buffer();
uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2);
- LOOP_L_N(i, len) mmuSerial.write(tx_buffer[i]);
+ LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]);
rx_buffer[0] = '\0';
prev_request = millis();
}
@@ -449,7 +446,7 @@ void MMU2::tx_printf_P(const char* format, int argument1, int argument2) {
* Empty the rx buffer
*/
void MMU2::clear_rx_buffer() {
- while (mmuSerial.available()) mmuSerial.read();
+ while (MMU2_SERIAL.available()) MMU2_SERIAL.read();
rx_buffer[0] = '\0';
}
@@ -955,7 +952,7 @@ bool MMU2::load_filament_to_nozzle(const uint8_t index) {
/**
* Load filament to nozzle of multimaterial printer
*
- * This function is used only only after T? (user select filament) and M600 (change filament).
+ * This function is used only after T? (user select filament) and M600 (change filament).
* It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading
* filament to nozzle.
*/
diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp
index 1593b0cc572e..5ab4f2b146b9 100644
--- a/Marlin/src/feature/pause.cpp
+++ b/Marlin/src/feature/pause.cpp
@@ -137,10 +137,7 @@ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=P
thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder);
#endif
- #if HAS_LCD_MENU
- lcd_pause_show_message(PAUSE_MESSAGE_HEATING, mode);
- #endif
- UNUSED(mode);
+ ui.pause_show_message(PAUSE_MESSAGE_HEATING, mode); UNUSED(mode);
if (wait) return thermalManager.wait_for_hotend(active_extruder);
@@ -181,19 +178,13 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l
DEBUG_SECTION(lf, "load_filament", true);
DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " showlcd:", int(show_lcd), " pauseforuser:", int(pause_for_user), " pausemode:", int(mode) DXC_SAY);
- UNUSED(show_lcd);
-
if (!ensure_safe_temperature(false, mode)) {
- #if HAS_LCD_MENU
- if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_STATUS, mode);
- #endif
+ if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_STATUS, mode);
return false;
}
if (pause_for_user) {
- #if HAS_LCD_MENU
- if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_INSERT, mode);
- #endif
+ if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_INSERT, mode);
SERIAL_ECHO_MSG(_PMSG(STR_FILAMENT_CHANGE_INSERT));
first_impatient_beep(max_beep_count);
@@ -217,9 +208,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l
}
}
- #if HAS_LCD_MENU
- if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_LOAD, mode);
- #endif
+ if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_LOAD, mode);
#if ENABLED(DUAL_X_CARRIAGE)
const int8_t saved_ext = active_extruder;
@@ -250,9 +239,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l
#if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE)
- #if HAS_LCD_MENU
- if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_PURGE);
- #endif
+ if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_PURGE);
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Filament Purging..."), CONTINUE_STR));
TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Filament Purging...")));
@@ -266,9 +253,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l
do {
if (purge_length > 0) {
// "Wait for filament purge"
- #if HAS_LCD_MENU
- if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_PURGE);
- #endif
+ if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_PURGE);
// Extrude filament to get into hotend
unscaled_e_move(purge_length, ADVANCED_PAUSE_PURGE_FEEDRATE);
@@ -281,7 +266,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l
// Show "Purge More" / "Resume" menu and wait for reply
KEEPALIVE_STATE(PAUSED_FOR_USER);
wait_for_user = false;
- lcd_pause_show_message(PAUSE_MESSAGE_OPTION);
+ ui.pause_show_message(PAUSE_MESSAGE_OPTION);
while (pause_menu_response == PAUSE_RESPONSE_WAIT_FOR) idle_no_sleep();
}
#endif
@@ -295,6 +280,18 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l
return true;
}
+/**
+ * Disabling E steppers for manual filament change should be fine
+ * as long as users don't spin the E motor ridiculously fast and
+ * send current back to their board, potentially frying it.
+ */
+inline void disable_active_extruder() {
+ #if HAS_E_STEPPER_ENABLE
+ disable_e_stepper(active_extruder);
+ safe_delay(100);
+ #endif
+}
+
/**
* Unload filament from the hotend
*
@@ -318,22 +315,16 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/,
#endif
);
- UNUSED(show_lcd);
-
#if !BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER)
constexpr float mix_multiplier = 1.0;
#endif
if (!ensure_safe_temperature(false, mode)) {
- #if HAS_LCD_MENU
- if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_STATUS);
- #endif
+ if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_STATUS);
return false;
}
- #if HAS_LCD_MENU
- if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, mode);
- #endif
+ if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_UNLOAD, mode);
// Retract filament
unscaled_e_move(-(FILAMENT_UNLOAD_PURGE_RETRACT) * mix_multiplier, (PAUSE_PARK_RETRACT_FEEDRATE) * mix_multiplier);
@@ -357,11 +348,8 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/,
planner.settings.retract_acceleration = saved_acceleration;
#endif
- // Disable E steppers for manual change
- #if HAS_E_STEPPER_ENABLE
- disable_e_stepper(active_extruder);
- safe_delay(100);
- #endif
+ // Disable the Extruder for manual change
+ disable_active_extruder();
return true;
}
@@ -447,6 +435,9 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float
set_duplication_enabled(saved_ext_dup_mode, saved_ext);
#endif
+ // Disable the Extruder for manual change
+ disable_active_extruder();
+
return true;
}
@@ -467,7 +458,7 @@ void show_continue_prompt(const bool is_reload) {
DEBUG_SECTION(scp, "pause_print", true);
DEBUG_ECHOLNPAIR("... is_reload:", int(is_reload));
- TERN_(HAS_LCD_MENU, lcd_pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING));
+ ui.pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING);
SERIAL_ECHO_START();
serialprintPGM(is_reload ? PSTR(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : PSTR(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n"));
}
@@ -508,7 +499,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep
// Wait for the user to press the button to re-heat the nozzle, then
// re-heat the nozzle, re-show the continue prompt, restart idle timers, start over
if (nozzle_timed_out) {
- TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_HEAT));
+ ui.pause_show_message(PAUSE_MESSAGE_HEAT);
SERIAL_ECHO_MSG(_PMSG(STR_FILAMENT_CHANGE_HEAT));
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_HEATER_TIMEOUT), GET_TEXT(MSG_REHEAT)));
@@ -602,7 +593,7 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le
thermalManager.wait_for_hotend(active_extruder, false);
}
- TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_RESUME));
+ ui.pause_show_message(PAUSE_MESSAGE_RESUME);
// Check Temperature before moving hotend
ensure_safe_temperature();
@@ -641,7 +632,7 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le
// Write PLR now to update the z axis value
TERN_(POWER_LOSS_RECOVERY, if (recovery.enabled) recovery.save(true));
- TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS));
+ ui.pause_show_message(PAUSE_MESSAGE_STATUS);
#ifdef ACTION_ON_RESUMED
host_action_resumed();
diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h
index c69ed73546e0..7e58d4564ebb 100644
--- a/Marlin/src/feature/pause.h
+++ b/Marlin/src/feature/pause.h
@@ -101,4 +101,8 @@ bool unload_filament(const float &unload_length, const bool show_lcd=false, cons
#endif
);
-#endif // ADVANCED_PAUSE_FEATURE
+#else // !ADVANCED_PAUSE_FEATURE
+
+ constexpr uint8_t did_pause_print = 0;
+
+#endif // !ADVANCED_PAUSE_FEATURE
diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp
index 8d05d146986f..d22247b46df4 100644
--- a/Marlin/src/feature/power.cpp
+++ b/Marlin/src/feature/power.cpp
@@ -122,7 +122,7 @@ void Power::power_off() {
#ifdef PSU_POWEROFF_GCODE
GcodeSuite::process_subcommands_now_P(PSTR(PSU_POWEROFF_GCODE));
#endif
- PSU_PIN_OFF();
+ PSU_PIN_OFF();
}
}
diff --git a/Marlin/src/feature/power_monitor.cpp b/Marlin/src/feature/power_monitor.cpp
index e1e7324fb6c6..97c4a933637e 100644
--- a/Marlin/src/feature/power_monitor.cpp
+++ b/Marlin/src/feature/power_monitor.cpp
@@ -1,9 +1,9 @@
/**
* Marlin 3D Printer Firmware
- * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
- * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h
index a0eaf353f4c7..f378ee2a107c 100644
--- a/Marlin/src/feature/power_monitor.h
+++ b/Marlin/src/feature/power_monitor.h
@@ -1,9 +1,9 @@
/**
* Marlin 3D Printer Firmware
- * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
- * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp
index c4e0ef694abe..0e669a74d49c 100644
--- a/Marlin/src/feature/powerloss.cpp
+++ b/Marlin/src/feature/powerloss.cpp
@@ -180,8 +180,10 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/
// Machine state
info.current_position = current_position;
- info.feedrate = uint16_t(feedrate_mm_s * 60.0f);
+ info.feedrate = uint16_t(MMS_TO_MMM(feedrate_mm_s));
info.zraise = zraise;
+
+ TERN_(GCODE_REPEAT_MARKERS, info.stored_repeat = repeat);
TERN_(HAS_HOME_OFFSET, info.home_offset = home_offset);
TERN_(HAS_POSITION_SHIFT, info.position_shift = position_shift);
@@ -340,6 +342,30 @@ void PrintJobRecovery::resume() {
gcode.process_subcommands_now_P(PSTR("M420 S0 Z0"));
#endif
+ #if HAS_HEATED_BED
+ const int16_t bt = info.target_temperature_bed;
+ if (bt) {
+ // Restore the bed temperature
+ sprintf_P(cmd, PSTR("M190 S%i"), bt);
+ gcode.process_subcommands_now(cmd);
+ }
+ #endif
+
+ // Restore all hotend temperatures
+ #if HAS_HOTEND
+ HOTEND_LOOP() {
+ const int16_t et = info.target_temperature[e];
+ if (et) {
+ #if HAS_MULTI_HOTEND
+ sprintf_P(cmd, PSTR("T%i S"), e);
+ gcode.process_subcommands_now(cmd);
+ #endif
+ sprintf_P(cmd, PSTR("M109 S%i"), et);
+ gcode.process_subcommands_now(cmd);
+ }
+ }
+ #endif
+
// Reset E, raise Z, home XY...
#if Z_HOME_DIR > 0
@@ -351,20 +377,11 @@ void PrintJobRecovery::resume() {
#else // "G92.9 E0 ..."
- // Set Z to 0, raise Z by info.zraise, and Home (XY only for Cartesian)
- // with no raise. (Only do simulated homing in Marlin Dev Mode.)
-
- sprintf_P(cmd, PSTR("G92.9 E0 "
- #if ENABLED(BACKUP_POWER_SUPPLY)
- "Z%s" // Z was already raised at outage
- #else
- "Z0\nG1Z%s" // Set Z=0 and Raise Z now
- #endif
- ),
- dtostrf(info.zraise, 1, 3, str_1)
- );
+ // If a Z raise occurred at outage restore Z, otherwise raise Z now
+ sprintf_P(cmd, PSTR("G92.9 E0 " TERN(BACKUP_POWER_SUPPLY, "Z%s", "Z0\nG1Z%s")), dtostrf(info.zraise, 1, 3, str_1));
gcode.process_subcommands_now(cmd);
+ // Home safely with no Z raise
gcode.process_subcommands_now_P(PSTR(
"G28R0" // No raise during G28
#if IS_CARTESIAN && DISABLED(POWER_LOSS_RECOVER_ZHOME)
@@ -402,30 +419,6 @@ void PrintJobRecovery::resume() {
#endif
#endif
- #if HAS_HEATED_BED
- const int16_t bt = info.target_temperature_bed;
- if (bt) {
- // Restore the bed temperature
- sprintf_P(cmd, PSTR("M190 S%i"), bt);
- gcode.process_subcommands_now(cmd);
- }
- #endif
-
- // Restore all hotend temperatures
- #if HAS_HOTEND
- HOTEND_LOOP() {
- const int16_t et = info.target_temperature[e];
- if (et) {
- #if HAS_MULTI_HOTEND
- sprintf_P(cmd, PSTR("T%i S"), e);
- gcode.process_subcommands_now(cmd);
- #endif
- sprintf_P(cmd, PSTR("M109 S%i"), et);
- gcode.process_subcommands_now(cmd);
- }
- }
- #endif
-
// Select the previously active tool (with no_move)
#if HAS_MULTI_EXTRUDER
sprintf_P(cmd, PSTR("T%i S"), info.active_extruder);
@@ -507,6 +500,7 @@ void PrintJobRecovery::resume() {
sprintf_P(cmd, PSTR("G92.9 E%s"), dtostrf(info.current_position.e, 1, 3, str_1));
gcode.process_subcommands_now(cmd);
+ TERN_(GCODE_REPEAT_MARKERS, repeat = info.stored_repeat);
TERN_(HAS_HOME_OFFSET, home_offset = info.home_offset);
TERN_(HAS_POSITION_SHIFT, position_shift = info.position_shift);
#if HAS_HOME_OFFSET || HAS_POSITION_SHIFT
diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h
index 73cd0b70faf4..25581e17230d 100644
--- a/Marlin/src/feature/powerloss.h
+++ b/Marlin/src/feature/powerloss.h
@@ -30,6 +30,10 @@
#include "../inc/MarlinConfig.h"
+#if ENABLED(GCODE_REPEAT_MARKERS)
+ #include "../feature/repeat.h"
+#endif
+
#if ENABLED(MIXING_EXTRUDER)
#include "../feature/mixing.h"
#endif
@@ -50,6 +54,8 @@ typedef struct {
uint16_t feedrate;
float zraise;
+ // Repeat information
+ TERN_(GCODE_REPEAT_MARKERS, Repeat stored_repeat);
TERN_(HAS_HOME_OFFSET, xyz_pos_t home_offset);
TERN_(HAS_POSITION_SHIFT, xyz_pos_t position_shift);
@@ -146,7 +152,7 @@ class PrintJobRecovery {
static void resume();
static void purge();
- static inline void cancel() { purge(); card.autostart_index = 0; }
+ static inline void cancel() { purge(); IF_DISABLED(NO_SD_AUTOSTART, card.autofile_begin()); }
static void load();
static void save(const bool force=ENABLED(SAVE_EACH_CMD_MODE), const float zraise=0);
diff --git a/Marlin/src/feature/repeat.cpp b/Marlin/src/feature/repeat.cpp
new file mode 100644
index 000000000000..d48157a84d41
--- /dev/null
+++ b/Marlin/src/feature/repeat.cpp
@@ -0,0 +1,81 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#include "../inc/MarlinConfig.h"
+
+#if ENABLED(GCODE_REPEAT_MARKERS)
+
+//#define DEBUG_GCODE_REPEAT_MARKERS
+
+#include "repeat.h"
+
+#include "../gcode/gcode.h"
+#include "../sd/cardreader.h"
+
+#define DEBUG_OUT ENABLED(DEBUG_GCODE_REPEAT_MARKERS)
+#include "../core/debug_out.h"
+
+repeat_marker_t Repeat::marker[MAX_REPEAT_NESTING];
+uint8_t Repeat::index;
+
+void Repeat::add_marker(const uint32_t sdpos, const uint16_t count) {
+ if (index >= MAX_REPEAT_NESTING)
+ SERIAL_ECHO_MSG("!Too many markers.");
+ else {
+ marker[index].sdpos = sdpos;
+ marker[index].counter = count ?: -1;
+ index++;
+ DEBUG_ECHOLNPAIR("Add Marker ", int(index), " at ", sdpos, " (", count, ")");
+ }
+}
+
+void Repeat::loop() {
+ if (!index) // No marker?
+ SERIAL_ECHO_MSG("!No marker set."); // Inform the user.
+ else {
+ const uint8_t ind = index - 1; // Active marker's index
+ if (!marker[ind].counter) { // Did its counter run out?
+ DEBUG_ECHOLNPAIR("Pass Marker ", int(index));
+ index--; // Carry on. Previous marker on the next 'M808'.
+ }
+ else {
+ card.setIndex(marker[ind].sdpos); // Loop back to the marker.
+ if (marker[ind].counter > 0) // Ignore a negative (or zero) counter.
+ --marker[ind].counter; // Decrement the counter. If zero this 'M808' will be skipped next time.
+ DEBUG_ECHOLNPAIR("Goto Marker ", int(index), " at ", marker[ind].sdpos, " (", marker[ind].counter, ")");
+ }
+ }
+}
+
+void Repeat::cancel() { LOOP_L_N(i, index) marker[i].counter = 0; }
+
+void Repeat::early_parse_M808(char * const cmd) {
+ if (is_command_M808(cmd)) {
+ DEBUG_ECHOLNPAIR("Parsing \"", cmd, "\"");
+ parser.parse(cmd);
+ if (parser.seen('L'))
+ add_marker(card.getIndex(), parser.value_ushort());
+ else
+ Repeat::loop();
+ }
+}
+
+#endif // GCODE_REPEAT_MARKERS
diff --git a/Marlin/src/feature/repeat.h b/Marlin/src/feature/repeat.h
new file mode 100644
index 000000000000..0f4d9425b768
--- /dev/null
+++ b/Marlin/src/feature/repeat.h
@@ -0,0 +1,53 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "../inc/MarlinConfigPre.h"
+#include "../gcode/parser.h"
+
+#include
+
+#define MAX_REPEAT_NESTING 10
+
+typedef struct {
+ uint32_t sdpos; // The repeat file position
+ int16_t counter; // The counter for looping
+} repeat_marker_t;
+
+class Repeat {
+private:
+ static repeat_marker_t marker[MAX_REPEAT_NESTING];
+ static uint8_t index;
+public:
+ static inline void reset() { index = 0; }
+ static inline bool is_active() {
+ LOOP_L_N(i, index) if (marker[i].counter) return true;
+ return false;
+ }
+ static bool is_command_M808(char * const cmd) { return cmd[0] == 'M' && cmd[1] == '8' && cmd[2] == '0' && cmd[3] == '8' && !NUMERIC(cmd[4]); }
+ static void early_parse_M808(char * const cmd);
+ static void add_marker(const uint32_t sdpos, const uint16_t count);
+ static void loop();
+ static void cancel();
+};
+
+extern Repeat repeat;
diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp
index 50e18e52ef04..be769d2dc82f 100644
--- a/Marlin/src/feature/runout.cpp
+++ b/Marlin/src/feature/runout.cpp
@@ -59,6 +59,7 @@ bool FilamentMonitorBase::enabled = true,
// Filament Runout event handler
//
#include "../MarlinCore.h"
+#include "../feature/pause.h"
#include "../gcode/queue.h"
#if ENABLED(HOST_ACTION_COMMANDS)
@@ -71,7 +72,7 @@ bool FilamentMonitorBase::enabled = true,
void event_filament_runout() {
- if (TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print)) return; // Action already in progress. Purge triggered repeated runout.
+ if (did_pause_print) return; // Action already in progress. Purge triggered repeated runout.
#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
if (migration.in_progress) {
diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h
index 09443e6e2b2d..4b93d01eb7a1 100644
--- a/Marlin/src/feature/runout.h
+++ b/Marlin/src/feature/runout.h
@@ -118,9 +118,7 @@ class TFilamentMonitor : public FilamentMonitorBase {
// Give the response a chance to update its counter.
static inline void run() {
- if ( enabled && !filament_ran_out
- && (printingIsActive() || TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print))
- ) {
+ if (enabled && !filament_ran_out && (printingIsActive() || did_pause_print)) {
TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, cli()); // Prevent RunoutResponseDelayed::block_completed from accumulating here
response.run();
sensor.run();
@@ -343,9 +341,7 @@ class FilamentSensorBase {
}
static inline void block_completed(const block_t* const b) {
- if (b->steps.x || b->steps.y || b->steps.z
- || TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print) // Allow pause purge move to re-trigger runout state
- ) {
+ if (b->steps.x || b->steps.y || b->steps.z || did_pause_print) { // Allow pause purge move to re-trigger runout state
// Only trigger on extrusion with XYZ movement to allow filament change and retract/recover.
const uint8_t e = b->extruder;
const int32_t steps = b->steps.e;
diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp
index 8646ec872f6f..623f223caa1b 100644
--- a/Marlin/src/feature/solenoid.cpp
+++ b/Marlin/src/feature/solenoid.cpp
@@ -28,48 +28,41 @@
#include "../module/motion.h" // for active_extruder
-#if ENABLED(MANUAL_SOLENOID_CONTROL)
- #define HAS_SOLENOID(N) HAS_SOLENOID_##N
-#else
- #define HAS_SOLENOID(N) (HAS_SOLENOID_##N && EXTRUDERS > N)
+// PARKING_EXTRUDER options alter the default behavior of solenoids, this ensures compliance of M380-381
+
+#if ENABLED(PARKING_EXTRUDER)
+ #include "../module/tool_change.h"
#endif
+#define HAS_SOLENOID(N) (HAS_SOLENOID_##N && (ENABLED(MANUAL_SOLENOID_CONTROL) || N < EXTRUDERS))
+
// Used primarily with MANUAL_SOLENOID_CONTROL
static void set_solenoid(const uint8_t num, const bool active) {
- const uint8_t value = active ? HIGH : LOW;
+ const uint8_t value = active ? PE_MAGNET_ON_STATE : !PE_MAGNET_ON_STATE;
switch (num) {
- case 0:
- OUT_WRITE(SOL0_PIN, value);
- break;
+ case 0: OUT_WRITE(SOL0_PIN, value); break;
#if HAS_SOLENOID(1)
- case 1:
- OUT_WRITE(SOL1_PIN, value);
- break;
+ case 1: OUT_WRITE(SOL1_PIN, value); break;
#endif
#if HAS_SOLENOID(2)
- case 2:
- OUT_WRITE(SOL2_PIN, value);
- break;
+ case 2: OUT_WRITE(SOL2_PIN, value); break;
#endif
#if HAS_SOLENOID(3)
- case 3:
- OUT_WRITE(SOL3_PIN, value);
- break;
+ case 3: OUT_WRITE(SOL3_PIN, value); break;
#endif
#if HAS_SOLENOID(4)
- case 4:
- OUT_WRITE(SOL4_PIN, value);
- break;
+ case 4: OUT_WRITE(SOL4_PIN, value); break;
#endif
#if HAS_SOLENOID(5)
- case 5:
- OUT_WRITE(SOL5_PIN, value);
- break;
+ case 5: OUT_WRITE(SOL5_PIN, value); break;
#endif
- default:
- SERIAL_ECHO_MSG(STR_INVALID_SOLENOID);
- break;
+ default: SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); break;
}
+
+ #if ENABLED(PARKING_EXTRUDER)
+ if (!active && active_extruder == num) // If active extruder's solenoid is disabled, carriage is considered parked
+ parking_extruder_set_parked(true);
+ #endif
}
void enable_solenoid(const uint8_t num) { set_solenoid(num, true); }
diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp
index 3b28b61b4944..66c04a001c0a 100644
--- a/Marlin/src/feature/spindle_laser.cpp
+++ b/Marlin/src/feature/spindle_laser.cpp
@@ -36,6 +36,9 @@
SpindleLaser cutter;
uint8_t SpindleLaser::power;
+#if ENABLED(LASER_FEATURE)
+ cutter_test_pulse_t SpindleLaser::testPulse = 50; // Test fire Pulse time ms value.
+#endif
bool SpindleLaser::isReady; // Ready to apply power setting from the UI to OCR
cutter_power_t SpindleLaser::menuPower, // Power set via LCD menu in PWM, PERCENT, or RPM
SpindleLaser::unitPower; // LCD status power in PWM, PERCENT, or RPM
@@ -43,7 +46,7 @@ cutter_power_t SpindleLaser::menuPower, // Power s
#if ENABLED(MARLIN_DEV_MODE)
cutter_frequency_t SpindleLaser::frequency; // PWM frequency setting; range: 2K - 50K
#endif
-#define SPINDLE_LASER_PWM_OFF ((SPINDLE_LASER_PWM_INVERT) ? 255 : 0)
+#define SPINDLE_LASER_PWM_OFF TERN(SPINDLE_LASER_PWM_INVERT, 255, 0)
//
// Init the cutter to a safe OFF state
@@ -71,16 +74,23 @@ void SpindleLaser::init() {
/**
* Set the cutter PWM directly to the given ocr value
*/
- void SpindleLaser::set_ocr(const uint8_t ocr) {
- WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_STATE); // Turn spindle on
- analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF);
+ void SpindleLaser::_set_ocr(const uint8_t ocr) {
#if NEEDS_HARDWARE_PWM && SPINDLE_LASER_FREQUENCY
+ set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), TERN(MARLIN_DEV_MODE, frequency, SPINDLE_LASER_FREQUENCY));
set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF);
+ #else
+ analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF);
#endif
}
+
+ void SpindleLaser::set_ocr(const uint8_t ocr) {
+ WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_STATE); // Cutter ON
+ _set_ocr(ocr);
+ }
+
void SpindleLaser::ocr_off() {
- WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Turn spindle off
- analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Only write low byte
+ WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Cutter OFF
+ _set_ocr(0);
}
#endif
@@ -97,7 +107,7 @@ void SpindleLaser::apply_power(const uint8_t opwr) {
ocr_off();
isReady = false;
}
- else if (enabled() || ENABLED(CUTTER_POWER_RELATIVE)) {
+ else if (ENABLED(CUTTER_POWER_RELATIVE) || enabled()) {
set_ocr(power);
isReady = true;
}
@@ -118,7 +128,7 @@ void SpindleLaser::apply_power(const uint8_t opwr) {
// Set the spindle direction and apply immediately
// Stop on direction change if SPINDLE_STOP_ON_DIR_CHANGE is enabled
//
- void SpindleLaser::set_direction(const bool reverse) {
+ void SpindleLaser::set_reverse(const bool reverse) {
const bool dir_state = (reverse == SPINDLE_INVERT_DIR); // Forward (M3) HIGH when not inverted
if (TERN0(SPINDLE_STOP_ON_DIR_CHANGE, enabled()) && READ(SPINDLE_DIR_PIN) != dir_state) disable();
WRITE(SPINDLE_DIR_PIN, dir_state);
diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h
index 74d06634a0ba..57fc136c8ca3 100644
--- a/Marlin/src/feature/spindle_laser.h
+++ b/Marlin/src/feature/spindle_laser.h
@@ -30,6 +30,10 @@
#include "spindle_laser_types.h"
+#if USE_BEEPER
+ #include "../libs/buzzer.h"
+#endif
+
#if ENABLED(LASER_POWER_INLINE)
#include "../module/planner.h"
#endif
@@ -57,7 +61,7 @@ class SpindleLaser {
static const inline uint8_t cpwr_to_pct(const cutter_cpower_t cpwr) {
constexpr cutter_cpower_t power_floor = TERN(CUTTER_POWER_RELATIVE, SPEED_POWER_MIN, 0),
power_range = SPEED_POWER_MAX - power_floor;
- return unitPower ? round(100.0f * (cpwr - power_floor) / power_range) : 0;
+ return cpwr ? round(100.0f * (cpwr - power_floor) / power_range) : 0;
}
// Convert a cpower (e.g., SPEED_POWER_STARTUP) to unit power (upwr, upower),
@@ -90,6 +94,10 @@ class SpindleLaser {
static const cutter_power_t mpower_min() { return cpwr_to_upwr(SPEED_POWER_MIN); }
static const cutter_power_t mpower_max() { return cpwr_to_upwr(SPEED_POWER_MAX); }
+ #if ENABLED(LASER_FEATURE)
+ static cutter_test_pulse_t testPulse; // Test fire Pulse ms value
+ #endif
+
static bool isReady; // Ready to apply power setting from the UI to OCR
static uint8_t power;
@@ -117,6 +125,12 @@ class SpindleLaser {
#if ENABLED(SPINDLE_LASER_PWM)
+ private:
+
+ static void _set_ocr(const uint8_t ocr);
+
+ public:
+
static void set_ocr(const uint8_t ocr);
static inline void set_ocr_power(const uint8_t ocr) { power = ocr; set_ocr(ocr); }
static void ocr_off();
@@ -143,7 +157,7 @@ class SpindleLaser {
#elif CUTTER_UNIT_IS(RPM)
2
#else
- #error "???"
+ #error "CUTTER_UNIT_IS(???)"
#endif
));
}
@@ -191,9 +205,11 @@ class SpindleLaser {
}
#if ENABLED(SPINDLE_CHANGE_DIR)
- static void set_direction(const bool reverse);
+ static void set_reverse(const bool reverse);
+ static bool is_reverse() { return READ(SPINDLE_DIR_PIN) == SPINDLE_INVERT_DIR; }
#else
- static inline void set_direction(const bool) {}
+ static inline void set_reverse(const bool) {}
+ static bool is_reverse() { return false; }
#endif
static inline void disable() { isReady = false; set_enabled(false); }
@@ -208,11 +224,12 @@ class SpindleLaser {
else
menuPower = cpwr_to_upwr(SPEED_POWER_STARTUP);
unitPower = menuPower;
- set_direction(reverse);
+ set_reverse(reverse);
set_enabled(true);
}
FORCE_INLINE static void enable_forward() { enable_with_dir(false); }
FORCE_INLINE static void enable_reverse() { enable_with_dir(true); }
+ FORCE_INLINE static void enable_same_dir() { enable_with_dir(is_reverse()); }
#if ENABLED(SPINDLE_LASER_PWM)
static inline void update_from_mpower() {
@@ -221,7 +238,21 @@ class SpindleLaser {
}
#endif
- #endif
+ #if ENABLED(LASER_FEATURE)
+ /**
+ * Test fire the laser using the testPulse ms duration
+ * Also fires with any PWM power that was previous set
+ * If not set defaults to 80% power
+ */
+ static inline void test_fire_pulse() {
+ enable_forward(); // Turn Laser on (Spindle speak but same funct)
+ TERN_(USE_BEEPER, buzzer.tone(30, 3000));
+ delay(testPulse); // Delay for time set by user in pulse ms menu screen.
+ disable(); // Turn laser off
+ }
+ #endif
+
+ #endif // HAS_LCD_MENU
#if ENABLED(LASER_POWER_INLINE)
/**
diff --git a/Marlin/src/feature/spindle_laser_types.h b/Marlin/src/feature/spindle_laser_types.h
index 181c4d73ac07..0075e5481900 100644
--- a/Marlin/src/feature/spindle_laser_types.h
+++ b/Marlin/src/feature/spindle_laser_types.h
@@ -39,12 +39,22 @@ typedef IF<(SPEED_POWER_MAX > 255), uint16_t, uint8_t>::type cutter_cpower_t;
#if CUTTER_UNIT_IS(RPM) && SPEED_POWER_MAX > 255
typedef uint16_t cutter_power_t;
- #define CUTTER_MENU_POWER_TYPE uint16_5
- #define cutter_power2str ui16tostr5rj
+ #define CUTTER_MENU_POWER_TYPE uint16_5
+ #define cutter_power2str ui16tostr5rj
#else
typedef uint8_t cutter_power_t;
- #define CUTTER_MENU_POWER_TYPE uint8
- #define cutter_power2str ui8tostr3rj
+ #if CUTTER_UNIT_IS(PERCENT)
+ #define CUTTER_MENU_POWER_TYPE percent_3
+ #define cutter_power2str pcttostrpctrj
+ #else
+ #define CUTTER_MENU_POWER_TYPE uint8
+ #define cutter_power2str ui8tostr3rj
+ #endif
+#endif
+
+#if ENABLED(LASER_FEATURE)
+ typedef uint16_t cutter_test_pulse_t;
+ #define CUTTER_MENU_PULSE_TYPE uint16_3
#endif
#if ENABLED(MARLIN_DEV_MODE)
diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp
index d27177326bc6..8d0156883baa 100644
--- a/Marlin/src/feature/tmc_util.cpp
+++ b/Marlin/src/feature/tmc_util.cpp
@@ -147,7 +147,7 @@
static TMC_driver_data get_driver_data(TMC2208Stepper &st) {
constexpr uint8_t OTPW_bp = 0, OT_bp = 1;
- constexpr uint8_t S2G_bm = 0b11110; // 2..5
+ constexpr uint8_t S2G_bm = 0b111100; // 2..5
TMC_driver_data data;
const auto ds = data.drv_status = st.DRV_STATUS();
data.is_otpw = TEST(ds, OTPW_bp);
@@ -291,7 +291,7 @@
bool should_step_down = false;
if (need_update_error_counters) {
- if (data.is_ot /* | data.s2ga | data.s2gb*/) st.error_count++;
+ if (data.is_ot | data.is_s2g) st.error_count++;
else if (st.error_count > 0) st.error_count--;
#if ENABLED(STOP_ON_ERROR)
@@ -604,8 +604,6 @@
case TMC_PWM_OFS_AUTO: SERIAL_PRINT(st.pwm_ofs_auto(), DEC); break;
case TMC_PWM_GRAD_AUTO: SERIAL_PRINT(st.pwm_grad_auto(), DEC); break;
case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break;
- case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('*'); break;
- case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('*'); break;
case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
default: break;
}
@@ -631,6 +629,8 @@
case TMC_T150: if (st.t150()) SERIAL_CHAR('*'); break;
case TMC_T143: if (st.t143()) SERIAL_CHAR('*'); break;
case TMC_T120: if (st.t120()) SERIAL_CHAR('*'); break;
+ case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('*'); break;
+ case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('*'); break;
case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break;
default: break;
}
diff --git a/Marlin/src/feature/tramming.cpp b/Marlin/src/feature/tramming.cpp
new file mode 100644
index 000000000000..d03f0cf53bd7
--- /dev/null
+++ b/Marlin/src/feature/tramming.cpp
@@ -0,0 +1,69 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../inc/MarlinConfigPre.h"
+
+#if ENABLED(ASSISTED_TRAMMING)
+
+#include "tramming.h"
+
+#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)
+#include "../core/debug_out.h"
+
+PGMSTR(point_name_1, TRAMMING_POINT_NAME_1);
+PGMSTR(point_name_2, TRAMMING_POINT_NAME_2);
+PGMSTR(point_name_3, TRAMMING_POINT_NAME_3);
+#ifdef TRAMMING_POINT_NAME_4
+ PGMSTR(point_name_4, TRAMMING_POINT_NAME_4);
+ #ifdef TRAMMING_POINT_NAME_5
+ PGMSTR(point_name_5, TRAMMING_POINT_NAME_5);
+ #ifdef TRAMMING_POINT_NAME_6
+ PGMSTR(point_name_6, TRAMMING_POINT_NAME_6);
+ #endif
+ #endif
+#endif
+
+PGM_P const tramming_point_name[] PROGMEM = {
+ point_name_1, point_name_2, point_name_3
+ #ifdef TRAMMING_POINT_NAME_4
+ , point_name_4
+ #ifdef TRAMMING_POINT_NAME_5
+ , point_name_5
+ #ifdef TRAMMING_POINT_NAME_6
+ , point_name_6
+ #endif
+ #endif
+ #endif
+};
+
+#ifdef ASSISTED_TRAMMING_WAIT_POSITION
+
+ // Move to the defined wait position
+ void move_to_tramming_wait_pos() {
+ constexpr xyz_pos_t wait_pos = ASSISTED_TRAMMING_WAIT_POSITION;
+ if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Moving away");
+ do_blocking_move_to(wait_pos, XY_PROBE_FEEDRATE_MM_S);
+ }
+
+#endif
+
+#endif // ASSISTED_TRAMMING
diff --git a/Marlin/src/feature/tramming.h b/Marlin/src/feature/tramming.h
index 79f7407716d3..eb27fe82fe2a 100644
--- a/Marlin/src/feature/tramming.h
+++ b/Marlin/src/feature/tramming.h
@@ -19,8 +19,10 @@
* along with this program. If not, see .
*
*/
+#pragma once
-#include "../inc/MarlinConfigPre.h"
+#include "../inc/MarlinConfig.h"
+#include "../module/probe.h"
#if !WITHIN(TRAMMING_SCREW_THREAD, 30, 51) || TRAMMING_SCREW_THREAD % 10 > 1
#error "TRAMMING_SCREW_THREAD must be equal to 30, 31, 40, 41, 50, or 51."
@@ -29,13 +31,20 @@
constexpr xy_pos_t screws_tilt_adjust_pos[] = TRAMMING_POINT_XY;
#define G35_PROBE_COUNT COUNT(screws_tilt_adjust_pos)
-static_assert(G35_PROBE_COUNT >= 3, "TRAMMING_POINT_XY requires at least 3 XY positions.");
+static_assert(WITHIN(G35_PROBE_COUNT, 3, 6), "TRAMMING_POINT_XY requires between 3 and 6 XY positions.");
+
+#define VALIDATE_TRAMMING_POINT(N) static_assert(N >= G35_PROBE_COUNT || Probe::build_time::can_reach(screws_tilt_adjust_pos[N]), \
+ "TRAMMING_POINT_XY point " STRINGIFY(N) " is not reachable with the default NOZZLE_TO_PROBE offset and PROBING_MARGIN.")
+VALIDATE_TRAMMING_POINT(0); VALIDATE_TRAMMING_POINT(1); VALIDATE_TRAMMING_POINT(2); VALIDATE_TRAMMING_POINT(3); VALIDATE_TRAMMING_POINT(4); VALIDATE_TRAMMING_POINT(5);
extern const char point_name_1[], point_name_2[], point_name_3[]
#ifdef TRAMMING_POINT_NAME_4
, point_name_4[]
#ifdef TRAMMING_POINT_NAME_5
, point_name_5[]
+ #ifdef TRAMMING_POINT_NAME_6
+ , point_name_6[]
+ #endif
#endif
#endif
;
@@ -50,6 +59,10 @@ extern const char point_name_1[], point_name_2[], point_name_3[]
#ifdef TRAMMING_POINT_NAME_5
#undef _NR_TRAM_NAMES
#define _NR_TRAM_NAMES 5
+ #ifdef TRAMMING_POINT_NAME_6
+ #undef _NR_TRAM_NAMES
+ #define _NR_TRAM_NAMES 6
+ #endif
#endif
#endif
#endif
@@ -57,3 +70,9 @@ static_assert(_NR_TRAM_NAMES >= G35_PROBE_COUNT, "Define enough TRAMMING_POINT_N
#undef _NR_TRAM_NAMES
extern PGM_P const tramming_point_name[];
+
+#ifdef ASSISTED_TRAMMING_WAIT_POSITION
+ void move_to_tramming_wait_pos();
+#else
+ inline void move_to_tramming_wait_pos() {}
+#endif
diff --git a/Marlin/src/feature/twibus.cpp b/Marlin/src/feature/twibus.cpp
index 3cc20579ac57..855a3188d10c 100644
--- a/Marlin/src/feature/twibus.cpp
+++ b/Marlin/src/feature/twibus.cpp
@@ -28,6 +28,8 @@
#include
+TWIBus i2c;
+
TWIBus::TWIBus() {
#if I2C_SLAVE_ADDRESS == 0
Wire.begin(); // No address joins the BUS as the master
@@ -155,6 +157,14 @@ void TWIBus::flush() {
reset();
}
+ void i2c_on_receive(int bytes) { // just echo all bytes received to serial
+ i2c.receive(bytes);
+ }
+
+ void i2c_on_request() { // just send dummy data for now
+ i2c.reply("Hello World!\n");
+ }
+
#endif
#if ENABLED(DEBUG_TWIBUS)
diff --git a/Marlin/src/feature/twibus.h b/Marlin/src/feature/twibus.h
index 82aa9aa16a2a..59391534824c 100644
--- a/Marlin/src/feature/twibus.h
+++ b/Marlin/src/feature/twibus.h
@@ -31,6 +31,17 @@
typedef void (*twiReceiveFunc_t)(int bytes);
typedef void (*twiRequestFunc_t)();
+/**
+ * For a light i2c protocol that runs on two boards running Marlin see:
+ * See https://github.com/MarlinFirmware/Marlin/issues/4776#issuecomment-246262879
+ */
+#if I2C_SLAVE_ADDRESS > 0
+
+ void i2c_on_receive(int bytes); // Demo i2c onReceive handler
+ void i2c_on_request(); // Demo i2c onRequest handler
+
+#endif
+
#define TWIBUS_BUFFER_SIZE 32
/**
@@ -238,3 +249,5 @@ class TWIBus {
static inline void debug(const char[], uint8_t) {}
#endif
};
+
+extern TWIBus i2c;
diff --git a/Marlin/src/feature/z_stepper_align.cpp b/Marlin/src/feature/z_stepper_align.cpp
index 87b1f6f25163..1b4eb4474903 100644
--- a/Marlin/src/feature/z_stepper_align.cpp
+++ b/Marlin/src/feature/z_stepper_align.cpp
@@ -54,27 +54,11 @@ void ZStepperAlign::reset_to_default() {
#endif
);
- constexpr xyz_pos_t dpo = NOZZLE_TO_PROBE_OFFSET;
-
- #define LTEST(N) (xy_init[N].x >= _MAX(X_MIN_BED + PROBING_MARGIN_LEFT, X_MIN_POS + dpo.x) - 0.00001f)
- #define RTEST(N) (xy_init[N].x <= _MIN(X_MAX_BED - PROBING_MARGIN_RIGHT, X_MAX_POS + dpo.x) + 0.00001f)
- #define FTEST(N) (xy_init[N].y >= _MAX(Y_MIN_BED + PROBING_MARGIN_FRONT, Y_MIN_POS + dpo.y) - 0.00001f)
- #define BTEST(N) (xy_init[N].y <= _MIN(Y_MAX_BED - PROBING_MARGIN_BACK, Y_MAX_POS + dpo.y) + 0.00001f)
-
- static_assert(LTEST(0) && RTEST(0), "The 1st Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset.");
- static_assert(FTEST(0) && BTEST(0), "The 1st Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset.");
- static_assert(LTEST(1) && RTEST(1), "The 2nd Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset.");
- static_assert(FTEST(1) && BTEST(1), "The 2nd Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset.");
- #if NUM_Z_STEPPER_DRIVERS >= 3
- static_assert(LTEST(2) && RTEST(2), "The 3rd Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset.");
- static_assert(FTEST(2) && BTEST(2), "The 3rd Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset.");
- #if NUM_Z_STEPPER_DRIVERS >= 4
- static_assert(LTEST(3) && RTEST(3), "The 4th Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset.");
- static_assert(FTEST(3) && BTEST(3), "The 4th Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset.");
- #endif
- #endif
+ #define VALIDATE_ALIGN_POINT(N) static_assert(N >= NUM_Z_STEPPER_DRIVERS || Probe::build_time::can_reach(xy_init[N]), \
+ "Z_STEPPER_ALIGN_XY point " STRINGIFY(N) " is not reachable with the default NOZZLE_TO_PROBE offset and PROBING_MARGIN.")
+ VALIDATE_ALIGN_POINT(0); VALIDATE_ALIGN_POINT(1); VALIDATE_ALIGN_POINT(2); VALIDATE_ALIGN_POINT(3);
- #else // !defined(Z_STEPPER_ALIGN_XY)
+ #else // !Z_STEPPER_ALIGN_XY
const xy_pos_t xy_init[] = {
#if NUM_Z_STEPPER_DRIVERS >= 3 // First probe point...
@@ -115,7 +99,7 @@ void ZStepperAlign::reset_to_default() {
#endif
};
- #endif // !defined(Z_STEPPER_ALIGN_XY)
+ #endif // !Z_STEPPER_ALIGN_XY
COPY(xy, xy_init);
diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp
index 789d8bcf193a..46f75f25906f 100755
--- a/Marlin/src/gcode/bedlevel/G35.cpp
+++ b/Marlin/src/gcode/bedlevel/G35.cpp
@@ -40,27 +40,7 @@
// Define tramming point names.
//
-#include "../../feature/tramming.h" // Validate
-
-PGMSTR(point_name_1, TRAMMING_POINT_NAME_1);
-PGMSTR(point_name_2, TRAMMING_POINT_NAME_2);
-PGMSTR(point_name_3, TRAMMING_POINT_NAME_3);
-#ifdef TRAMMING_POINT_NAME_4
- PGMSTR(point_name_4, TRAMMING_POINT_NAME_4);
- #ifdef TRAMMING_POINT_NAME_5
- PGMSTR(point_name_5, TRAMMING_POINT_NAME_5);
- #endif
-#endif
-
-PGM_P const tramming_point_name[] PROGMEM = {
- point_name_1, point_name_2, point_name_3
- #ifdef TRAMMING_POINT_NAME_4
- , point_name_4
- #ifdef TRAMMING_POINT_NAME_5
- , point_name_5
- #endif
- #endif
-};
+#include "../../feature/tramming.h"
/**
* G35: Read bed corners to help adjust bed screws
@@ -178,11 +158,10 @@ void GcodeSuite::G35() {
// the probe deployed if it was successful.
probe.stow();
+ move_to_tramming_wait_pos();
+
// After this operation the Z position needs correction
set_axis_never_homed(Z_AXIS);
-
- // Home Z after the alignment procedure
- process_subcommands_now_P(PSTR("G28Z"));
}
#endif // ASSISTED_TRAMMING
diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp
index 9999d92e223b..28ffd59edc30 100644
--- a/Marlin/src/gcode/bedlevel/abl/G29.cpp
+++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp
@@ -181,14 +181,18 @@ G29_TYPE GcodeSuite::G29() {
no_action = seenA || seenQ,
faux = ENABLED(DEBUG_LEVELING_FEATURE) && DISABLED(PROBE_MANUALLY) ? parser.boolval('C') : no_action;
- // Don't allow auto-leveling without homing first
- if (homing_needed_error()) G29_RETURN(false);
-
if (!no_action && planner.leveling_active && parser.boolval('O')) { // Auto-level only if needed
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> Auto-level not needed, skip");
G29_RETURN(false);
}
+ // Send 'N' to force homing before G29 (internal only)
+ if (parser.seen('N'))
+ gcode.process_subcommands_now_P(TERN(G28_L0_ENSURES_LEVELING_OFF, PSTR("G28L0"), G28_STR));
+
+ // Don't allow auto-leveling without homing first
+ if (homing_needed_error()) G29_RETURN(false);
+
// Define local vars 'static' for manual probing, 'auto' otherwise
#define ABL_VAR TERN_(PROBE_MANUALLY, static)
@@ -249,7 +253,6 @@ G29_TYPE GcodeSuite::G29() {
#if ENABLED(AUTO_BED_LEVELING_LINEAR)
struct linear_fit_data lsf_results;
- incremental_LSF_reset(&lsf_results);
#endif
/**
@@ -324,6 +327,8 @@ G29_TYPE GcodeSuite::G29() {
#if ENABLED(AUTO_BED_LEVELING_LINEAR)
+ incremental_LSF_reset(&lsf_results);
+
do_topography_map = verbose_level > 2 || parser.boolval('T');
// X and Y specify points in each direction, overriding the default
@@ -392,7 +397,22 @@ G29_TYPE GcodeSuite::G29() {
planner.synchronize();
- if (!faux) remember_feedrate_scaling_off();
+ #if ENABLED(AUTO_BED_LEVELING_3POINT)
+ if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> 3-point Leveling");
+ points[0].z = points[1].z = points[2].z = 0; // Probe at 3 arbitrary points
+ #endif
+
+ #if BOTH(AUTO_BED_LEVELING_BILINEAR, EXTENSIBLE_UI)
+ ExtUI::onMeshLevelingStart();
+ #endif
+
+ if (!faux) {
+ remember_feedrate_scaling_off();
+
+ #if ENABLED(PREHEAT_BEFORE_LEVELING)
+ if (!dryrun) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, LEVELING_BED_TEMP);
+ #endif
+ }
// Disable auto bed leveling during G29.
// Be formal so G29 can be done successively without G28.
@@ -409,7 +429,6 @@ G29_TYPE GcodeSuite::G29() {
#endif
#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
-
if (TERN1(PROBE_MANUALLY, !no_action)
&& (gridSpacing != bilinear_grid_spacing || probe_position_lf != bilinear_start)
) {
@@ -423,18 +442,8 @@ G29_TYPE GcodeSuite::G29() {
// Can't re-enable (on error) until the new grid is written
abl_should_enable = false;
}
-
#endif // AUTO_BED_LEVELING_BILINEAR
- #if ENABLED(AUTO_BED_LEVELING_3POINT)
-
- if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> 3-point Leveling");
-
- // Probe at 3 arbitrary points
- points[0].z = points[1].z = points[2].z = 0;
-
- #endif // AUTO_BED_LEVELING_3POINT
-
} // !g29_in_progress
#if ENABLED(PROBE_MANUALLY)
diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp
index d5cc8a4fcb83..cf27c14d3b12 100644
--- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp
+++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp
@@ -85,7 +85,7 @@ void GcodeSuite::G29() {
mbl.reset();
mbl_probe_index = 0;
if (!ui.wait_for_move) {
- queue.inject_P(PSTR("G28\nG29 S2"));
+ queue.inject_P(parser.seen('N') ? PSTR("G28" TERN(G28_L0_ENSURES_LEVELING_OFF, "L0", "") "\nG29S2") : PSTR("G29S2"));
return;
}
state = MeshNext;
diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp
index c4effe7d58b8..2de029a08b0f 100644
--- a/Marlin/src/gcode/calibrate/G28.cpp
+++ b/Marlin/src/gcode/calibrate/G28.cpp
@@ -50,6 +50,10 @@
#include "../../lcd/dwin/e3v2/dwin.h"
#endif
+#if ENABLED(EXTENSIBLE_UI)
+ #include "../../lcd/extui/ui_api.h"
+#endif
+
#if HAS_L64XX // set L6470 absolute position registers to counts
#include "../../libs/L64XX/L64XX_Marlin.h"
#endif
@@ -207,8 +211,6 @@ void GcodeSuite::G28() {
TERN_(LASER_MOVE_G28_OFF, cutter.set_inline_enabled(false)); // turn off laser
- TERN_(DWIN_CREALITY_LCD, HMI_flag.home_flag = true);
-
#if ENABLED(DUAL_X_CARRIAGE)
bool IDEX_saved_duplication_state = extruder_duplication_enabled;
DualXMode IDEX_saved_mode = dual_x_carriage_mode;
@@ -225,25 +227,26 @@ void GcodeSuite::G28() {
#endif
// Home (O)nly if position is unknown
- if (!homing_needed() && parser.boolval('O')) {
+ if (!axes_should_home() && parser.boolval('O')) {
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> homing not needed, skip");
return;
}
+ TERN_(DWIN_CREALITY_LCD, DWIN_StartHoming());
+ TERN_(EXTENSIBLE_UI, ExtUI::onHomingStart());
+
planner.synchronize(); // Wait for planner moves to finish!
SET_SOFT_ENDSTOP_LOOSE(false); // Reset a leftover 'loose' motion state
// Disable the leveling matrix before homing
#if HAS_LEVELING
-
- // Cancel the active G29 session
- TERN_(PROBE_MANUALLY, g29_in_progress = false);
-
- TERN_(RESTORE_LEVELING_AFTER_G28, const bool leveling_was_active = planner.leveling_active);
+ const bool leveling_restore_state = parser.boolval('L', TERN(RESTORE_LEVELING_AFTER_G28, planner.leveling_active, ENABLED(ENABLE_LEVELING_AFTER_G28)));
+ IF_ENABLED(PROBE_MANUALLY, g29_in_progress = false); // Cancel the active G29 session
set_bed_leveling_enabled(false);
#endif
+ // Reset to the XY plane
TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY);
// Count this command as movement / activity
@@ -287,6 +290,10 @@ void GcodeSuite::G28() {
#if DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)
const uint8_t old_tool_index = active_extruder;
#endif
+ // PARKING_EXTRUDER homing requires different handling of movement / solenoid activation, depending on the side of homing
+ #if ENABLED(PARKING_EXTRUDER)
+ const bool pe_final_change_must_unpark = parking_extruder_unpark_after_homing(old_tool_index, X_HOME_DIR + 1 == old_tool_index * 2);
+ #endif
tool_change(0, true);
#endif
@@ -319,15 +326,14 @@ void GcodeSuite::G28() {
#endif
- const float z_homing_height =
- ENABLED(UNKNOWN_Z_NO_RAISE) && !TEST(axis_known_position, Z_AXIS)
- ? 0
- : (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT);
+ const float z_homing_height = TERN1(UNKNOWN_Z_NO_RAISE, axis_is_trusted(Z_AXIS))
+ ? (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT)
+ : 0;
if (z_homing_height && (doX || doY || TERN0(Z_SAFE_HOMING, doZ))) {
// Raise Z before homing any other axes and z is not already high enough (never lower z)
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) by ", z_homing_height);
- do_z_clearance(z_homing_height, true, DISABLED(UNKNOWN_Z_NO_RAISE));
+ do_z_clearance(z_homing_height, axis_is_trusted(Z_AXIS), DISABLED(UNKNOWN_Z_NO_RAISE));
}
#if ENABLED(QUICK_HOME)
@@ -434,13 +440,13 @@ void GcodeSuite::G28() {
do_blocking_move_to_z(delta_clip_start_height);
#endif
- TERN_(RESTORE_LEVELING_AFTER_G28, set_bed_leveling_enabled(leveling_was_active));
+ TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_restore_state));
restore_feedrate_and_scaling();
// Restore the active tool after homing
#if HAS_MULTI_HOTEND && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE))
- tool_change(old_tool_index, NONE(PARKING_EXTRUDER, DUAL_X_CARRIAGE)); // Do move if one of these
+ tool_change(old_tool_index, TERN(PARKING_EXTRUDER, !pe_final_change_must_unpark, DISABLED(DUAL_X_CARRIAGE))); // Do move if one of these
#endif
#if HAS_HOMING_CURRENT
@@ -462,6 +468,7 @@ void GcodeSuite::G28() {
ui.refresh();
TERN_(DWIN_CREALITY_LCD, DWIN_CompletedHoming());
+ TERN_(EXTENSIBLE_UI, ExtUI::onHomingComplete());
report_current_position();
diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp
index 315b2d7333dd..bcca00dd42b3 100644
--- a/Marlin/src/gcode/calibrate/G34.cpp
+++ b/Marlin/src/gcode/calibrate/G34.cpp
@@ -39,10 +39,11 @@
void GcodeSuite::G34() {
// Home before the alignment procedure
- if (!all_axes_known()) home_all_axes();
+ if (!all_axes_trusted()) home_all_axes();
+
+ TERN_(HAS_LEVELING, TEMPORARY_BED_LEVELING_STATE(false));
SET_SOFT_ENDSTOP_LOOSE(true);
- TEMPORARY_BED_LEVELING_STATE(false);
TemporaryGlobalEndstopsState unlock_z(false);
#ifdef GANTRY_CALIBRATION_COMMANDS_PRE
@@ -63,7 +64,7 @@ void GcodeSuite::G34() {
// Move Z to pounce position
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Setting Z Pounce");
- do_blocking_move_to_z(zpounce, MMM_TO_MMS(HOMING_FEEDRATE_Z));
+ do_blocking_move_to_z(zpounce, homing_feedrate(Z_AXIS));
// Store current motor settings, then apply reduced value
diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp
index 8d3dd0d06b23..0bcf954faf3f 100644
--- a/Marlin/src/gcode/calibrate/G34_M422.cpp
+++ b/Marlin/src/gcode/calibrate/G34_M422.cpp
@@ -167,7 +167,7 @@ void GcodeSuite::G34() {
);
// Home before the alignment procedure
- if (!all_axes_known()) home_all_axes();
+ if (!all_axes_trusted()) home_all_axes();
// Move the Z coordinate realm towards the positive - dirty trick
current_position.z += z_probe * 0.5f;
@@ -320,7 +320,6 @@ void GcodeSuite::G34() {
};
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
-
// Check if the applied corrections go in the correct direction.
// Calculate the sum of the absolute deviations from the mean of the probe measurements.
// Compare to the last iteration to ensure it's getting better.
@@ -478,32 +477,18 @@ void GcodeSuite::M422() {
const bool is_probe_point = parser.seen('S');
- #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
- if (is_probe_point && parser.seen('W')) {
- SERIAL_ECHOLNPGM("?(S) and (W) may not be combined.");
- return;
- }
- #endif
+ if (TERN0(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS, is_probe_point && parser.seen('W'))) {
+ SERIAL_ECHOLNPGM("?(S) and (W) may not be combined.");
+ return;
+ }
xy_pos_t *pos_dest = (
- #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
- !is_probe_point ? z_stepper_align.stepper_xy :
- #endif
+ TERN_(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS, !is_probe_point ? z_stepper_align.stepper_xy :)
z_stepper_align.xy
);
- if (!is_probe_point
- #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
- && !parser.seen('W')
- #endif
- ) {
- SERIAL_ECHOLNPGM(
- #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
- "?(S) or (W) is required."
- #else
- "?(S) is required."
- #endif
- );
+ if (!is_probe_point && TERN1(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS, !parser.seen('W'))) {
+ SERIAL_ECHOLNPGM("?(S)" TERN_(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS, " or (W)") " is required.");
return;
}
@@ -512,7 +497,7 @@ void GcodeSuite::M422() {
if (is_probe_point) {
position_index = parser.intval('S') - 1;
if (!WITHIN(position_index, 0, int8_t(NUM_Z_STEPPER_DRIVERS) - 1)) {
- SERIAL_ECHOLNPGM("?(S) Z-ProbePosition index invalid.");
+ SERIAL_ECHOLNPGM("?(S) Probe-position index invalid.");
return;
}
}
@@ -520,7 +505,7 @@ void GcodeSuite::M422() {
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
position_index = parser.intval('W') - 1;
if (!WITHIN(position_index, 0, NUM_Z_STEPPER_DRIVERS - 1)) {
- SERIAL_ECHOLNPGM("?(W) Z-Stepper index invalid.");
+ SERIAL_ECHOLNPGM("?(W) Z-stepper index invalid.");
return;
}
#endif
diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp
index 6517e6b4bdc4..9510da7740ef 100644
--- a/Marlin/src/gcode/calibrate/G425.cpp
+++ b/Marlin/src/gcode/calibrate/G425.cpp
@@ -143,14 +143,16 @@ inline void park_above_object(measurements_t &m, const float uncertainty) {
#endif
+#if !PIN_EXISTS(CALIBRATION)
+ #include "../../module/probe.h"
+#endif
+
inline bool read_calibration_pin() {
return (
#if PIN_EXISTS(CALIBRATION)
READ(CALIBRATION_PIN) != CALIBRATION_PIN_INVERTING
- #elif HAS_CUSTOM_PROBE_PIN
- READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING
#else
- READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING
+ PROBE_TRIGGERED()
#endif
);
}
diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp
index 8ffada5c0310..7438b0e83d62 100644
--- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp
+++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp
@@ -38,7 +38,7 @@
#include "../../feature/probe_temp_comp.h"
#include "../../lcd/marlinui.h"
-#include "../../MarlinCore.h" // for wait_for_heatup and idle()
+#include "../../MarlinCore.h" // for wait_for_heatup, idle(), G28_STR
#if ENABLED(PRINTJOB_TIMER_AUTOSTART)
#include "../../module/printcounter.h"
@@ -91,6 +91,12 @@
* - `B` - Run bed temperature calibration.
* - `P` - Run probe temperature calibration.
*/
+
+static void say_waiting_for() { SERIAL_ECHOPGM("Waiting for "); }
+static void say_waiting_for_probe_heating() { say_waiting_for(); SERIAL_ECHOLNPGM("probe heating."); }
+static void say_successfully_calibrated() { SERIAL_ECHOPGM("Successfully calibrated"); }
+static void say_failed_to_calibrate() { SERIAL_ECHOPGM("!Failed to calibrate"); }
+
void GcodeSuite::G76() {
// Check if heated bed is available and z-homing is done with probe
#if TEMP_SENSOR_BED == 0 || !(HOMING_Z_WITH_PROBE)
@@ -108,7 +114,7 @@ void GcodeSuite::G76() {
};
auto wait_for_temps = [&](const float tb, const float tp, millis_t &ntr, const millis_t timeout=0) {
- SERIAL_ECHOLNPGM("Waiting for bed and probe temperature.");
+ say_waiting_for(); SERIAL_ECHOLNPGM("bed and probe temperature.");
while (fabs(thermalManager.degBed() - tb) > 0.1f || thermalManager.degProbe() > tp)
if (report_temps(ntr, timeout)) return true;
return false;
@@ -162,7 +168,7 @@ void GcodeSuite::G76() {
return;
}
- process_subcommands_now_P(PSTR("G28"));
+ process_subcommands_now_P(G28_STR);
}
remember_feedrate_scaling_off();
@@ -184,7 +190,7 @@ void GcodeSuite::G76() {
uint16_t target_bed = cali_info_init[TSI_BED].start_temp,
target_probe = temp_comp.bed_calib_probe_temp;
- SERIAL_ECHOLNPGM("Waiting for cooling.");
+ say_waiting_for(); SERIAL_ECHOLNPGM(" cooling.");
while (thermalManager.degBed() > target_bed || thermalManager.degProbe() > target_probe)
report_temps(next_temp_report);
@@ -207,7 +213,8 @@ void GcodeSuite::G76() {
// Move the nozzle to the probing point and wait for the probe to reach target temp
do_blocking_move_to(noz_pos_xyz);
- SERIAL_ECHOLNPGM("Waiting for probe heating.");
+ say_waiting_for_probe_heating();
+ SERIAL_EOL();
while (thermalManager.degProbe() < target_probe)
report_temps(next_temp_report);
@@ -216,10 +223,14 @@ void GcodeSuite::G76() {
}
SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index());
- if (temp_comp.finish_calibration(TSI_BED))
- SERIAL_ECHOLNPGM("Successfully calibrated bed.");
- else
- SERIAL_ECHOLNPGM("!Failed to calibrate bed. Values reset.");
+ if (temp_comp.finish_calibration(TSI_BED)) {
+ say_successfully_calibrated();
+ SERIAL_ECHOLNPGM(" bed.");
+ }
+ else {
+ say_failed_to_calibrate();
+ SERIAL_ECHOLNPGM(" bed. Values reset.");
+ }
// Cleanup
thermalManager.setTargetBed(0);
@@ -254,7 +265,8 @@ void GcodeSuite::G76() {
// Move probe to probing point and wait for it to reach target temperature
do_blocking_move_to(noz_pos_xyz);
- SERIAL_ECHOLNPAIR("Waiting for probe heating. Bed:", target_bed, " Probe:", target_probe);
+ say_waiting_for_probe_heating();
+ SERIAL_ECHOLNPAIR(" Bed:", target_bed, " Probe:", target_probe);
const millis_t probe_timeout_ms = millis() + 900UL * 1000UL;
while (thermalManager.degProbe() < target_probe) {
if (report_temps(next_temp_report, probe_timeout_ms)) {
@@ -271,9 +283,9 @@ void GcodeSuite::G76() {
SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index());
if (temp_comp.finish_calibration(TSI_PROBE))
- SERIAL_ECHOPGM("Successfully calibrated");
+ say_successfully_calibrated();
else
- SERIAL_ECHOPGM("!Failed to calibrate");
+ say_failed_to_calibrate();
SERIAL_ECHOLNPGM(" probe.");
// Cleanup
diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp
index e70815ad543a..46367df10d6a 100644
--- a/Marlin/src/gcode/calibrate/M48.cpp
+++ b/Marlin/src/gcode/calibrate/M48.cpp
@@ -245,6 +245,7 @@ void GcodeSuite::M48() {
SERIAL_ECHO(n + 1);
SERIAL_ECHOPAIR(" of ", int(n_samples));
SERIAL_ECHOPAIR_F(": z: ", pz, 3);
+ SERIAL_CHAR(' ');
dev_report(verbose_level > 2, mean, sigma, min, max);
SERIAL_EOL();
}
diff --git a/Marlin/src/gcode/config/M220.cpp b/Marlin/src/gcode/config/M220.cpp
index 37fe7d3a5f28..75339f10b9fc 100644
--- a/Marlin/src/gcode/config/M220.cpp
+++ b/Marlin/src/gcode/config/M220.cpp
@@ -37,11 +37,9 @@
*/
void GcodeSuite::M220() {
- #if HAS_PRUSA_MMU2
- static int16_t backup_feedrate_percentage = 100;
- if (parser.seen('B')) backup_feedrate_percentage = feedrate_percentage;
- if (parser.seen('R')) feedrate_percentage = backup_feedrate_percentage;
- #endif
+ static int16_t backup_feedrate_percentage = 100;
+ if (parser.seen('B')) backup_feedrate_percentage = feedrate_percentage;
+ if (parser.seen('R')) feedrate_percentage = backup_feedrate_percentage;
if (parser.seenval('S')) feedrate_percentage = parser.value_int();
diff --git a/Marlin/src/gcode/control/M108_M112_M410.cpp b/Marlin/src/gcode/control/M108_M112_M410.cpp
index df145d5d11c9..f86874acec2f 100644
--- a/Marlin/src/gcode/control/M108_M112_M410.cpp
+++ b/Marlin/src/gcode/control/M108_M112_M410.cpp
@@ -25,7 +25,8 @@
#if DISABLED(EMERGENCY_PARSER)
#include "../gcode.h"
-#include "../../MarlinCore.h" // for wait_for_heatup, kill, quickstop_stepper
+#include "../../MarlinCore.h" // for wait_for_heatup, kill
+#include "../../module/motion.h" // for quickstop_stepper
/**
* M108: Stop the waiting for heaters in M109, M190, M303. Does not affect the target temperature.
diff --git a/Marlin/src/gcode/control/M226.cpp b/Marlin/src/gcode/control/M226.cpp
index ad717e614d8a..63f022e82bd8 100644
--- a/Marlin/src/gcode/control/M226.cpp
+++ b/Marlin/src/gcode/control/M226.cpp
@@ -28,6 +28,8 @@
#include "../../MarlinCore.h" // for pin_is_protected and idle()
#include "../../module/stepper.h"
+void protected_pin_err();
+
/**
* M226: Wait until the specified pin reaches the state required (M226 P S)
*/
diff --git a/Marlin/src/gcode/control/M3-M5.cpp b/Marlin/src/gcode/control/M3-M5.cpp
index 4ca103da5bac..711bb7e5e4a7 100644
--- a/Marlin/src/gcode/control/M3-M5.cpp
+++ b/Marlin/src/gcode/control/M3-M5.cpp
@@ -103,7 +103,7 @@ void GcodeSuite::M3_M4(const bool is_M4) {
#endif
planner.synchronize(); // Wait for previous movement commands (G0/G0/G2/G3) to complete before changing power
- cutter.set_direction(is_M4);
+ cutter.set_reverse(is_M4);
#if ENABLED(SPINDLE_LASER_PWM)
if (parser.seenval('O')) {
diff --git a/Marlin/src/gcode/control/M42.cpp b/Marlin/src/gcode/control/M42.cpp
index c635c06ec63b..6ef8455e0b5c 100644
--- a/Marlin/src/gcode/control/M42.cpp
+++ b/Marlin/src/gcode/control/M42.cpp
@@ -31,6 +31,10 @@
#include "../../module/temperature.h"
#endif
+void protected_pin_err() {
+ SERIAL_ERROR_MSG(STR_ERR_PROTECTED_PIN);
+}
+
/**
* M42: Change pin status via GCode
*
diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp
index 592b2b3dcefb..3ce284f82e86 100644
--- a/Marlin/src/gcode/control/T.cpp
+++ b/Marlin/src/gcode/control/T.cpp
@@ -61,16 +61,10 @@ void GcodeSuite::T(const int8_t tool_index) {
}
#endif
- #if EXTRUDERS < 2
-
- tool_change(tool_index);
-
- #else
-
- tool_change(
- tool_index,
- (tool_index == active_extruder) || parser.boolval('S')
- );
-
- #endif
+ tool_change(tool_index
+ #if HAS_MULTI_EXTRUDER
+ , TERN(PARKING_EXTRUDER, false, tool_index == active_extruder) // For PARKING_EXTRUDER motion is decided in tool_change()
+ || parser.boolval('S')
+ #endif
+ );
}
diff --git a/Marlin/src/gcode/feature/controllerfan/M710.cpp b/Marlin/src/gcode/feature/controllerfan/M710.cpp
index 67d4ad8abf54..cc450732baed 100644
--- a/Marlin/src/gcode/feature/controllerfan/M710.cpp
+++ b/Marlin/src/gcode/feature/controllerfan/M710.cpp
@@ -1,9 +1,9 @@
/**
* Marlin 3D Printer Firmware
- * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
- * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/Marlin/src/gcode/feature/filwidth/M404-M407.cpp b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp
index 516289fe2779..a70f7a61fec7 100644
--- a/Marlin/src/gcode/feature/filwidth/M404-M407.cpp
+++ b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp
@@ -26,7 +26,6 @@
#include "../../../feature/filwidth.h"
#include "../../../module/planner.h"
-#include "../../../module/temperature.h"
#include "../../../MarlinCore.h"
#include "../../gcode.h"
diff --git a/Marlin/src/gcode/feature/i2c/M260_M261.cpp b/Marlin/src/gcode/feature/i2c/M260_M261.cpp
index 526d9101e1c7..438d1527f5f7 100644
--- a/Marlin/src/gcode/feature/i2c/M260_M261.cpp
+++ b/Marlin/src/gcode/feature/i2c/M260_M261.cpp
@@ -26,7 +26,7 @@
#include "../../gcode.h"
-#include "../../../MarlinCore.h" // for i2c
+#include "../../../feature/twibus.h"
/**
* M260: Send data to a I2C slave device
diff --git a/Marlin/src/gcode/feature/pause/G61.cpp b/Marlin/src/gcode/feature/pause/G61.cpp
index d8049f02bcef..5d89af0ab84e 100644
--- a/Marlin/src/gcode/feature/pause/G61.cpp
+++ b/Marlin/src/gcode/feature/pause/G61.cpp
@@ -49,10 +49,6 @@ void GcodeSuite::G61(void) {
// No saved position? No axes being restored?
if (!TEST(saved_slots[slot >> 3], slot & 0x07) || !parser.seen("XYZ")) return;
- // Apply any given feedrate over 0.0
- const float fr = parser.linearval('F');
- if (fr > 0.0) feedrate_mm_s = MMM_TO_MMS(fr);
-
SERIAL_ECHOPAIR(STR_RESTORING_POS " S", int(slot));
LOOP_XYZ(i) {
destination[i] = parser.seen(XYZ_CHAR(i))
@@ -63,8 +59,15 @@ void GcodeSuite::G61(void) {
}
SERIAL_EOL();
+ // Apply any given feedrate over 0.0
+ feedRate_t saved_feedrate = feedrate_mm_s;
+ const float fr = parser.linearval('F');
+ if (fr > 0.0) feedrate_mm_s = MMM_TO_MMS(fr);
+
// Move to the saved position
prepare_line_to_destination();
+
+ feedrate_mm_s = saved_feedrate;
}
#endif // SAVED_POSITIONS
diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp
index b1d76e83ae98..9391b8661b2c 100644
--- a/Marlin/src/gcode/feature/pause/M125.cpp
+++ b/Marlin/src/gcode/feature/pause/M125.cpp
@@ -27,13 +27,10 @@
#include "../../gcode.h"
#include "../../parser.h"
#include "../../../feature/pause.h"
+#include "../../../lcd/marlinui.h"
#include "../../../module/motion.h"
-#include "../../../sd/cardreader.h"
#include "../../../module/printcounter.h"
-
-#if HAS_LCD_MENU
- #include "../../../lcd/marlinui.h"
-#endif
+#include "../../../sd/cardreader.h"
#if ENABLED(POWER_LOSS_RECOVERY)
#include "../../../feature/powerloss.h"
@@ -76,7 +73,7 @@ void GcodeSuite::M125() {
const bool sd_printing = TERN0(SDSUPPORT, IS_SD_PRINTING());
- TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT));
+ ui.pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT);
// If possible, show an LCD prompt with the 'P' flag
const bool show_lcd = TERN0(HAS_LCD_MENU, parser.boolval('P'));
diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp
index e676ed38a4a0..1c282f2052c7 100644
--- a/Marlin/src/gcode/feature/pause/M600.cpp
+++ b/Marlin/src/gcode/feature/pause/M600.cpp
@@ -28,15 +28,12 @@
#include "../../../feature/pause.h"
#include "../../../module/motion.h"
#include "../../../module/printcounter.h"
+#include "../../../lcd/marlinui.h"
#if HAS_MULTI_EXTRUDER
#include "../../../module/tool_change.h"
#endif
-#if HAS_LCD_MENU
- #include "../../../lcd/marlinui.h"
-#endif
-
#if ENABLED(MMU2_MENUS)
#include "../../../lcd/menu/menu_mmu2.h"
#endif
@@ -96,13 +93,13 @@ void GcodeSuite::M600() {
#endif
// Show initial "wait for start" message
- #if HAS_LCD_MENU && DISABLED(MMU2_MENUS)
- lcd_pause_show_message(PAUSE_MESSAGE_CHANGING, PAUSE_MODE_PAUSE_PRINT, target_extruder);
+ #if DISABLED(MMU2_MENUS)
+ ui.pause_show_message(PAUSE_MESSAGE_CHANGING, PAUSE_MODE_PAUSE_PRINT, target_extruder);
#endif
#if ENABLED(HOME_BEFORE_FILAMENT_CHANGE)
// If needed, home before parking for filament change
- if (!all_axes_known()) home_all_axes();
+ if (!all_axes_trusted()) home_all_axes(true);
#endif
#if HAS_MULTI_EXTRUDER
diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp
index a100d462da7e..9a2b77493667 100644
--- a/Marlin/src/gcode/feature/pause/M701_M702.cpp
+++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp
@@ -29,15 +29,12 @@
#include "../../../module/motion.h"
#include "../../../module/temperature.h"
#include "../../../feature/pause.h"
+#include "../../../lcd/marlinui.h"
#if HAS_MULTI_EXTRUDER
#include "../../../module/tool_change.h"
#endif
-#if HAS_LCD_MENU
- #include "../../../lcd/marlinui.h"
-#endif
-
#if HAS_PRUSA_MMU2
#include "../../../feature/mmu/mmu2.h"
#endif
@@ -59,10 +56,8 @@
void GcodeSuite::M701() {
xyz_pos_t park_point = NOZZLE_PARK_POINT;
- #if ENABLED(NO_MOTION_BEFORE_HOMING)
- // Don't raise Z if the machine isn't homed
- if (axes_should_home()) park_point.z = 0;
- #endif
+ // Don't raise Z if the machine isn't homed
+ if (TERN0(NO_MOTION_BEFORE_HOMING, axes_should_home())) park_point.z = 0;
#if ENABLED(MIXING_EXTRUDER)
const int8_t target_e_stepper = get_target_e_stepper_from_command();
@@ -84,7 +79,7 @@ void GcodeSuite::M701() {
if (parser.seenval('Z')) park_point.z = parser.linearval('Z');
// Show initial "wait for load" message
- TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_LOAD, PAUSE_MODE_LOAD_FILAMENT, target_extruder));
+ ui.pause_show_message(PAUSE_MESSAGE_LOAD, PAUSE_MODE_LOAD_FILAMENT, target_extruder);
#if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU)
// Change toolhead if specified
@@ -130,7 +125,7 @@ void GcodeSuite::M701() {
TERN_(MIXING_EXTRUDER, mixer.T(old_mixing_tool)); // Restore original mixing tool
// Show status screen
- TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS));
+ ui.pause_show_message(PAUSE_MESSAGE_STATUS);
}
/**
@@ -147,10 +142,8 @@ void GcodeSuite::M701() {
void GcodeSuite::M702() {
xyz_pos_t park_point = NOZZLE_PARK_POINT;
- #if ENABLED(NO_MOTION_BEFORE_HOMING)
- // Don't raise Z if the machine isn't homed
- if (axes_should_home()) park_point.z = 0;
- #endif
+ // Don't raise Z if the machine isn't homed
+ if (TERN0(NO_MOTION_BEFORE_HOMING, axes_should_home())) park_point.z = 0;
#if ENABLED(MIXING_EXTRUDER)
const uint8_t old_mixing_tool = mixer.get_current_vtool();
@@ -184,7 +177,7 @@ void GcodeSuite::M702() {
if (parser.seenval('Z')) park_point.z = parser.linearval('Z');
// Show initial "wait for unload" message
- TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, PAUSE_MODE_UNLOAD_FILAMENT, target_extruder));
+ ui.pause_show_message(PAUSE_MESSAGE_UNLOAD, PAUSE_MODE_UNLOAD_FILAMENT, target_extruder);
#if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU)
// Change toolhead if specified
@@ -236,7 +229,7 @@ void GcodeSuite::M702() {
TERN_(MIXING_EXTRUDER, mixer.T(old_mixing_tool)); // Restore original mixing tool
// Show status screen
- TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS));
+ ui.pause_show_message(PAUSE_MESSAGE_STATUS);
}
#endif // ADVANCED_PAUSE_FEATURE
diff --git a/Marlin/src/gcode/feature/power_monitor/M430.cpp b/Marlin/src/gcode/feature/power_monitor/M430.cpp
index 7639ea962d9b..9559404456f5 100644
--- a/Marlin/src/gcode/feature/power_monitor/M430.cpp
+++ b/Marlin/src/gcode/feature/power_monitor/M430.cpp
@@ -1,9 +1,9 @@
/**
* Marlin 3D Printer Firmware
- * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
- * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp
index 3bce34c1f323..88607b4081cb 100644
--- a/Marlin/src/gcode/gcode.cpp
+++ b/Marlin/src/gcode/gcode.cpp
@@ -61,7 +61,7 @@ GcodeSuite gcode;
#include "../feature/password/password.h"
#endif
-#include "../MarlinCore.h" // for idle()
+#include "../MarlinCore.h" // for idle, kill
// Inactivity shutdown
millis_t GcodeSuite::previous_move_ms = 0,
@@ -209,6 +209,31 @@ void GcodeSuite::dwell(millis_t time) {
*/
#if BOTH(HAS_LEVELING, G29_RETRY_AND_RECOVER)
+ void GcodeSuite::event_probe_recover() {
+ TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_INFO, PSTR("G29 Retrying"), DISMISS_STR));
+ #ifdef ACTION_ON_G29_RECOVER
+ host_action(PSTR(ACTION_ON_G29_RECOVER));
+ #endif
+ #ifdef G29_RECOVER_COMMANDS
+ process_subcommands_now_P(PSTR(G29_RECOVER_COMMANDS));
+ #endif
+ }
+
+ void GcodeSuite::event_probe_failure() {
+ #ifdef ACTION_ON_G29_FAILURE
+ host_action(PSTR(ACTION_ON_G29_FAILURE));
+ #endif
+ #ifdef G29_FAILURE_COMMANDS
+ process_subcommands_now_P(PSTR(G29_FAILURE_COMMANDS));
+ #endif
+ #if ENABLED(G29_HALT_ON_FAILURE)
+ #ifdef ACTION_ON_CANCEL
+ host_action_cancel();
+ #endif
+ kill(GET_TEXT(MSG_LCD_PROBING_FAILED));
+ #endif
+ }
+
#ifndef G29_MAX_RETRIES
#define G29_MAX_RETRIES 0
#endif
@@ -216,7 +241,10 @@ void GcodeSuite::dwell(millis_t time) {
void GcodeSuite::G29_with_retry() {
uint8_t retries = G29_MAX_RETRIES;
while (G29()) { // G29 should return true for failed probes ONLY
- if (retries--) event_probe_recover();
+ if (retries) {
+ event_probe_recover();
+ --retries;
+ }
else {
event_probe_failure();
return;
@@ -252,6 +280,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
#if ENABLED(PASSWORD_FEATURE)
if (password.is_locked && !parser.is_command('M', 511)) {
SERIAL_ECHO_MSG(STR_PRINTER_LOCKED);
+ if (!no_ok) queue.ok_to_send();
return;
}
#endif
@@ -717,6 +746,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 412: M412(); break; // M412: Enable/Disable filament runout detection
#endif
+ #if HAS_MULTI_LANGUAGE
+ case 414: M414(); break; // M414: Select multi language menu
+ #endif
+
#if HAS_LEVELING
case 420: M420(); break; // M420: Enable/Disable Bed Leveling
#endif
@@ -882,6 +915,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 800: parser.debug(); break; // M800: GCode Parser Test for M
#endif
+ #if ENABLED(GCODE_REPEAT_MARKERS)
+ case 808: M808(); break; // M808: Set / Goto repeat markers
+ #endif
+
#if ENABLED(I2C_POSITION_ENCODERS)
case 860: M860(); break; // M860: Report encoder module position
case 861: M861(); break; // M861: Report encoder module status
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index 1d74ac371960..2b7589662e42 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -213,6 +213,7 @@
* M410 - Quickstop. Abort all planned moves.
* M412 - Enable / Disable Filament Runout Detection. (Requires FILAMENT_RUNOUT_SENSOR)
* M413 - Enable / Disable Power-Loss Recovery. (Requires POWER_LOSS_RECOVERY)
+ * M414 - Set language by index. (Requires LCD_LANGUAGE_2...)
* M420 - Enable/Disable Leveling (with current values) S1=enable S0=disable (Requires MESH_BED_LEVELING or ABL)
* M421 - Set a single Z coordinate in the Mesh Leveling grid. X Y Z (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL)
* M422 - Set Z Stepper automatic alignment position using probe. X Y A (Requires Z_STEPPER_AUTO_ALIGN)
@@ -242,6 +243,7 @@
* M672 - Set/Reset Duet Smart Effector's sensitivity. (Requires DUET_SMART_EFFECTOR and SMART_EFFECTOR_MOD_PIN)
* M701 - Load filament (Requires FILAMENT_LOAD_UNLOAD_GCODES)
* M702 - Unload filament (Requires FILAMENT_LOAD_UNLOAD_GCODES)
+ * M808 - Set or Goto a Repeat Marker (Requires GCODE_REPEAT_MARKERS)
* M810-M819 - Define/execute a G-code macro (Requires GCODE_MACROS)
* M851 - Set Z probe's XYZ offsets in current units. (Negative values: X=left, Y=front, Z=below)
* M852 - Set skew factors: "M852 [I] [J] [K]". (Requires SKEW_CORRECTION_GCODE, and SKEW_CORRECTION_FOR_Z for IJ)
@@ -368,9 +370,9 @@ class GcodeSuite {
static void process_subcommands_now_P(PGM_P pgcode);
static void process_subcommands_now(char * gcode);
- static inline void home_all_axes() {
+ static inline void home_all_axes(const bool keep_leveling=false) {
extern const char G28_STR[];
- process_subcommands_now_P(G28_STR);
+ process_subcommands_now_P(keep_leveling ? G28_STR : TERN(G28_L0_ENSURES_LEVELING_OFF, PSTR("G28L0"), G28_STR));
}
#if EITHER(HAS_AUTO_REPORTING, HOST_KEEPALIVE_FEATURE)
@@ -450,6 +452,8 @@ class GcodeSuite {
#if HAS_LEVELING
#if ENABLED(G29_RETRY_AND_RECOVER)
+ static void event_probe_failure();
+ static void event_probe_recover();
static void G29_with_retry();
#define G29_TYPE bool
#else
@@ -746,6 +750,8 @@ class GcodeSuite {
TERN_(HAS_FILAMENT_SENSOR, static void M412());
+ TERN_(HAS_MULTI_LANGUAGE, static void M414());
+
#if HAS_LEVELING
static void M420();
static void M421();
@@ -807,6 +813,8 @@ class GcodeSuite {
static void M702();
#endif
+ TERN_(GCODE_REPEAT_MARKERS, static void M808());
+
TERN_(GCODE_MACROS, static void M810_819());
TERN_(HAS_BED_PROBE, static void M851());
diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp
index 529b1dd6d012..63511b606d16 100644
--- a/Marlin/src/gcode/host/M115.cpp
+++ b/Marlin/src/gcode/host/M115.cpp
@@ -117,6 +117,9 @@ void GcodeSuite::M115() {
// SDCARD (M20, M23, M24, etc.)
cap_line(PSTR("SDCARD"), ENABLED(SDSUPPORT));
+ // REPEAT (M808)
+ cap_line(PSTR("REPEAT"), ENABLED(GCODE_REPEAT_MARKERS));
+
// AUTOREPORT_SD_STATUS (M27 extension)
cap_line(PSTR("AUTOREPORT_SD_STATUS"), ENABLED(AUTO_REPORT_SD_STATUS));
diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp
index 06576bb75e5d..27207b717210 100644
--- a/Marlin/src/gcode/host/M118.cpp
+++ b/Marlin/src/gcode/host/M118.cpp
@@ -66,7 +66,7 @@ void GcodeSuite::M118() {
#endif
if (hasE) SERIAL_ECHO_START();
- if (hasA) SERIAL_ECHOPGM("// ");
+ if (hasA) SERIAL_ECHOPGM("//");
SERIAL_ECHOLN(p);
TERN_(HAS_MULTI_SERIAL, serial_port_index = old_serial);
diff --git a/Marlin/src/gcode/lcd/M414.cpp b/Marlin/src/gcode/lcd/M414.cpp
new file mode 100644
index 000000000000..760028a899f2
--- /dev/null
+++ b/Marlin/src/gcode/lcd/M414.cpp
@@ -0,0 +1,44 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../inc/MarlinConfig.h"
+
+#if HAS_MULTI_LANGUAGE
+
+#include "../gcode.h"
+#include "../../MarlinCore.h"
+#include "../../lcd/marlinui.h"
+
+/**
+ * M414: Set the language for the UI
+ *
+ * Parameters
+ * S : The language to select
+ */
+void GcodeSuite::M414() {
+
+ if (parser.seenval('S'))
+ ui.set_language(parser.value_byte());
+
+}
+
+#endif // HAS_MULTI_LANGUAGE
diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp
index c713877a0e6a..61e50247f3f7 100644
--- a/Marlin/src/gcode/motion/G2_G3.cpp
+++ b/Marlin/src/gcode/motion/G2_G3.cpp
@@ -41,13 +41,12 @@
#endif
/**
- * Plan an arc in 2 dimensions
+ * Plan an arc in 2 dimensions, with optional linear motion in a 3rd dimension
*
- * The arc is approximated by generating many small linear segments.
- * The length of each segment is configured in MM_PER_ARC_SEGMENT (Default 1mm)
- * Arcs should only be made relatively large (over 5mm), as larger arcs with
- * larger segments will tend to be more efficient. Your slicer should have
- * options for G2/G3 arc generation. In future these options may be GCode tunable.
+ * The arc is traced by generating many small linear segments, as configured by
+ * MM_PER_ARC_SEGMENT (Default 1mm). In the future we hope more slicers will include
+ * an option to generate G2/G3 arcs for curved surfaces, as this will allow faster
+ * boards to produce much smoother curved surfaces.
*/
void plan_arc(
const xyze_pos_t &cart, // Destination position
@@ -77,22 +76,36 @@ void plan_arc(
rt_Y = cart[q_axis] - center_Q,
start_L = current_position[l_axis];
- // CCW angle of rotation between position and target from the circle center. Only one atan2() trig computation required.
- float angular_travel = ATAN2(rvec.a * rt_Y - rvec.b * rt_X, rvec.a * rt_X + rvec.b * rt_Y);
- if (angular_travel < 0) angular_travel += RADIANS(360);
#ifdef MIN_ARC_SEGMENTS
- uint16_t min_segments = CEIL((MIN_ARC_SEGMENTS) * (angular_travel / RADIANS(360)));
- NOLESS(min_segments, 1U);
+ uint16_t min_segments = MIN_ARC_SEGMENTS;
#else
constexpr uint16_t min_segments = 1;
#endif
- if (clockwise) angular_travel -= RADIANS(360);
- // Make a circle if the angular rotation is 0 and the target is current position
- if (NEAR_ZERO(angular_travel) && NEAR(current_position[p_axis], cart[p_axis]) && NEAR(current_position[q_axis], cart[q_axis])) {
- angular_travel = RADIANS(360);
+ // Angle of rotation between position and target from the circle center.
+ float angular_travel;
+
+ // Do a full circle if starting and ending positions are "identical"
+ if (NEAR(current_position[p_axis], cart[p_axis]) && NEAR(current_position[q_axis], cart[q_axis])) {
+ // Preserve direction for circles
+ angular_travel = clockwise ? -RADIANS(360) : RADIANS(360);
+ }
+ else {
+ // Calculate the angle
+ angular_travel = ATAN2(rvec.a * rt_Y - rvec.b * rt_X, rvec.a * rt_X + rvec.b * rt_Y);
+
+ // Angular travel too small to detect? Just return.
+ if (!angular_travel) return;
+
+ // Make sure angular travel over 180 degrees goes the other way around.
+ switch (((angular_travel < 0) << 1) | clockwise) {
+ case 1: angular_travel -= RADIANS(360); break; // Positive but CW? Reverse direction.
+ case 2: angular_travel += RADIANS(360); break; // Negative but CCW? Reverse direction.
+ }
+
#ifdef MIN_ARC_SEGMENTS
- min_segments = MIN_ARC_SEGMENTS;
+ min_segments = CEIL(min_segments * ABS(angular_travel) / RADIANS(360));
+ NOLESS(min_segments, 1U);
#endif
}
diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp
index 18cc161fce29..df8dad7999f1 100644
--- a/Marlin/src/gcode/motion/M290.cpp
+++ b/Marlin/src/gcode/motion/M290.cpp
@@ -27,7 +27,6 @@
#include "../gcode.h"
#include "../../feature/babystep.h"
#include "../../module/probe.h"
-#include "../../module/temperature.h"
#include "../../module/planner.h"
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
diff --git a/Marlin/src/gcode/probe/M401_M402.cpp b/Marlin/src/gcode/probe/M401_M402.cpp
index 8e9bd11b81d7..bd9bb44c4061 100644
--- a/Marlin/src/gcode/probe/M401_M402.cpp
+++ b/Marlin/src/gcode/probe/M401_M402.cpp
@@ -33,6 +33,7 @@
*/
void GcodeSuite::M401() {
probe.deploy();
+ TERN_(PROBE_TARE, probe.tare());
report_current_position();
}
diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp
index 12dfce5111ff..8197205edac9 100644
--- a/Marlin/src/gcode/queue.cpp
+++ b/Marlin/src/gcode/queue.cpp
@@ -31,6 +31,7 @@ GCodeQueue queue;
#include "../lcd/marlinui.h"
#include "../sd/cardreader.h"
+#include "../module/motion.h"
#include "../module/planner.h"
#include "../module/temperature.h"
#include "../MarlinCore.h"
@@ -51,6 +52,10 @@ GCodeQueue queue;
#include "../feature/powerloss.h"
#endif
+#if ENABLED(GCODE_REPEAT_MARKERS)
+ #include "../feature/repeat.h"
+#endif
+
/**
* GCode line number handling. Hosts may opt to include line numbers when
* sending commands to Marlin, and lines will be checked for sequentiality.
@@ -154,8 +159,6 @@ bool GCodeQueue::_enqueue(const char* cmd, bool say_ok/*=false*/
return true;
}
-#define ISEOL(C) ((C) == '\n' || (C) == '\r')
-
/**
* Enqueue with Serial Echo
* Return true if the command was consumed
@@ -538,12 +541,11 @@ void GCodeQueue::get_serial_commands() {
#if DISABLED(EMERGENCY_PARSER)
// Process critical commands early
- if (strcmp_P(command, PSTR("M108")) == 0) {
- wait_for_heatup = false;
- TERN_(HAS_LCD_MENU, wait_for_user = false);
+ if (command[0] == 'M') switch (command[3]) {
+ case '8': if (command[2] == '0' && command[1] == '1') { wait_for_heatup = false; TERN_(HAS_LCD_MENU, wait_for_user = false); } break;
+ case '2': if (command[2] == '1' && command[1] == '1') kill(M112_KILL_STR, nullptr, true); break;
+ case '0': if (command[1] == '4' && command[2] == '1') quickstop_stepper(); break;
}
- if (strcmp_P(command, PSTR("M112")) == 0) kill(M112_KILL_STR, nullptr, true);
- if (strcmp_P(command, PSTR("M410")) == 0) quickstop_stepper();
#endif
#if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0
@@ -578,10 +580,9 @@ void GCodeQueue::get_serial_commands() {
if (!IS_SD_PRINTING()) return;
int sd_count = 0;
- bool card_eof = card.eof();
- while (length < BUFSIZE && !card_eof) {
+ while (length < BUFSIZE && !card.eof()) {
const int16_t n = card.get();
- card_eof = card.eof();
+ const bool card_eof = card.eof();
if (n < 0 && !card_eof) { SERIAL_ERROR_MSG(STR_SD_ERR_READ); continue; }
const char sd_char = (char)n;
@@ -591,17 +592,21 @@ void GCodeQueue::get_serial_commands() {
// Reset stream state, terminate the buffer, and commit a non-empty command
if (!is_eol && sd_count) ++sd_count; // End of file with no newline
if (!process_line_done(sd_input_state, command_buffer[index_w], sd_count)) {
+
+ // M808 S saves the sdpos of the next line. M808 loops to a new sdpos.
+ TERN_(GCODE_REPEAT_MARKERS, repeat.early_parse_M808(command_buffer[index_w]));
+
+ // Put the new command into the buffer (no "ok" sent)
_commit_command(false);
- #if ENABLED(POWER_LOSS_RECOVERY)
- recovery.cmd_sdpos = card.getIndex(); // Prime for the NEXT _commit_command
- #endif
+
+ // Prime Power-Loss Recovery for the NEXT _commit_command
+ TERN_(POWER_LOSS_RECOVERY, recovery.cmd_sdpos = card.getIndex());
}
- if (card_eof) card.fileHasFinished(); // Handle end of file reached
+ if (card.eof()) card.fileHasFinished(); // Handle end of file reached
}
else
process_stream_char(sd_char, sd_input_state, command_buffer[index_w], sd_count);
-
}
}
diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp
index 4a461170bc39..cba0e51af160 100644
--- a/Marlin/src/gcode/sd/M1001.cpp
+++ b/Marlin/src/gcode/sd/M1001.cpp
@@ -27,6 +27,10 @@
#include "../gcode.h"
#include "../../module/printcounter.h"
+#if DISABLED(NO_SD_AUTOSTART)
+ #include "../../sd/cardreader.h"
+#endif
+
#ifdef SD_FINISHED_RELEASECOMMAND
#include "../queue.h"
#endif
@@ -40,7 +44,7 @@
#endif
#if HAS_LEDS_OFF_FLAG
- #include "../../MarlinCore.h" // for wait_for_user_response
+ #include "../../MarlinCore.h" // for wait_for_user_response()
#include "../../feature/leds/printer_event_leds.h"
#endif
@@ -60,6 +64,11 @@
* M1001: Execute actions for SD print completion
*/
void GcodeSuite::M1001() {
+ // If there's another auto#.g file to run...
+ if (TERN(NO_SD_AUTOSTART, false, card.autofile_check())) return;
+
+ // Purge the recovery file...
+ TERN_(POWER_LOSS_RECOVERY, recovery.purge());
// Report total print time
const bool long_print = print_job_timer.duration() > 60;
@@ -71,9 +80,6 @@ void GcodeSuite::M1001() {
// Set the progress bar "done" state
TERN_(LCD_SET_PROGRESS_MANUALLY, ui.set_progress_done());
- // Purge the recovery file
- TERN_(POWER_LOSS_RECOVERY, recovery.purge());
-
// Announce SD file completion
{
PORT_REDIRECT(SERIAL_BOTH);
@@ -93,9 +99,11 @@ void GcodeSuite::M1001() {
// Inject SD_FINISHED_RELEASECOMMAND, if any
#ifdef SD_FINISHED_RELEASECOMMAND
- queue.inject_P(PSTR(SD_FINISHED_RELEASECOMMAND));
+ gcode.process_subcommands_now_P(PSTR(SD_FINISHED_RELEASECOMMAND));
#endif
+ TERN_(EXTENSIBLE_UI, ExtUI::onPrintFinished());
+
// Re-select the last printed file in the UI
TERN_(SD_REPRINT_LAST_SELECTED_FILE, ui.reselect_last_file());
}
diff --git a/Marlin/src/gcode/sd/M21_M22.cpp b/Marlin/src/gcode/sd/M21_M22.cpp
index 77df751fc774..a618bc0be31c 100644
--- a/Marlin/src/gcode/sd/M21_M22.cpp
+++ b/Marlin/src/gcode/sd/M21_M22.cpp
@@ -35,6 +35,10 @@ void GcodeSuite::M21() { card.mount(); }
/**
* M22: Release SD Card
*/
-void GcodeSuite::M22() { card.release(); }
+void GcodeSuite::M22() {
+
+ if (!IS_SD_PRINTING()) card.release();
+
+}
#endif // SDSUPPORT
diff --git a/Marlin/src/gcode/sd/M808.cpp b/Marlin/src/gcode/sd/M808.cpp
new file mode 100644
index 000000000000..0d11b16f8ae2
--- /dev/null
+++ b/Marlin/src/gcode/sd/M808.cpp
@@ -0,0 +1,51 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../inc/MarlinConfig.h"
+
+#if ENABLED(GCODE_REPEAT_MARKERS)
+
+#include "../gcode.h"
+#include "../../feature/repeat.h"
+
+/**
+ * M808: Set / Goto a repeat marker
+ *
+ * L - Set a repeat marker with 'count' repetitions. If omitted, infinity.
+ *
+ * Examples:
+ *
+ * M808 L ; Set a loop marker with a count of infinity
+ * M808 L2 ; Set a loop marker with a count of 2
+ * M808 ; Decrement and loop if not zero.
+ */
+void GcodeSuite::M808() {
+
+ // Handled early and ignored here in the queue.
+ // Allowed to go into the queue for logging purposes.
+
+ // M808 K sent from the host to cancel all loops
+ if (parser.seen('K')) repeat.cancel();
+
+}
+
+#endif // GCODE_REPEAT_MARKERS
diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp
index 90e1b601e477..07e46e177571 100644
--- a/Marlin/src/gcode/temp/M104_M109.cpp
+++ b/Marlin/src/gcode/temp/M104_M109.cpp
@@ -45,7 +45,7 @@
#endif
#endif
-#if ENABLED(SINGLENOZZLE)
+#if ENABLED(SINGLENOZZLE_STANDBY_TEMP)
#include "../../module/tool_change.h"
#endif
@@ -88,7 +88,7 @@ void GcodeSuite::M104() {
if (got_temp) {
#if ENABLED(SINGLENOZZLE_STANDBY_TEMP)
- singlenozzle_temp[target_extruder] = temp;
+ thermalManager.singlenozzle_temp[target_extruder] = temp;
if (target_extruder != active_extruder) return;
#endif
thermalManager.setTargetHotend(temp, target_extruder);
@@ -166,7 +166,7 @@ void GcodeSuite::M109() {
if (got_temp) {
#if ENABLED(SINGLENOZZLE_STANDBY_TEMP)
- singlenozzle_temp[target_extruder] = temp;
+ thermalManager.singlenozzle_temp[target_extruder] = temp;
if (target_extruder != active_extruder) return;
#endif
thermalManager.setTargetHotend(temp, target_extruder);
diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h
index 9c080ee2869d..a5bb24f27c41 100644
--- a/Marlin/src/inc/Conditionals_LCD.h
+++ b/Marlin/src/inc/Conditionals_LCD.h
@@ -651,11 +651,9 @@
#if ENABLED(DWIN_CREALITY_LCD)
#define SERIAL_CATCHALL 0
-#endif
-
-// Pressure sensor with a BLTouch-like interface
-#if ENABLED(CREALITY_TOUCH)
- #define BLTOUCH
+ #ifndef LCD_SERIAL_PORT
+ #define LCD_SERIAL_PORT 3 // Creality 4.x board
+ #endif
#endif
/**
@@ -819,9 +817,26 @@
#define TOTAL_PROBING MULTIPLE_PROBING
#endif
#endif
+ #if ENABLED(PREHEAT_BEFORE_PROBING)
+ #ifndef PROBING_NOZZLE_TEMP
+ #define PROBING_NOZZLE_TEMP 0
+ #endif
+ #ifndef PROBING_BED_TEMP
+ #define PROBING_BED_TEMP 0
+ #endif
+ #endif
+ #if ENABLED(PREHEAT_BEFORE_LEVELING)
+ #ifndef LEVELING_NOZZLE_TEMP
+ #define LEVELING_NOZZLE_TEMP 0
+ #endif
+ #ifndef LEVELING_BED_TEMP
+ #define LEVELING_BED_TEMP 0
+ #endif
+ #endif
#else
// Clear probe pin settings when no probe is selected
#undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN
+ #undef USE_PROBE_FOR_Z_HOMING
#endif
#if Z_HOME_DIR > 0
@@ -870,6 +885,7 @@
#if !HAS_LEVELING
#undef PROBE_MANUALLY
#undef RESTORE_LEVELING_AFTER_G28
+ #undef ENABLE_LEVELING_AFTER_G28
#endif
#ifdef GRID_MAX_POINTS_X
@@ -1032,11 +1048,6 @@
#define INVERT_E_DIR false
#endif
-// Fallback SPI Speed
-#ifndef SPI_SPEED
- #define SPI_SPEED SPI_FULL_SPEED
-#endif
-
/**
* This setting is also used by M109 when trying to calculate
* a ballpark safe margin to prevent wait-forever situation.
@@ -1057,28 +1068,23 @@
* - TFT_COLOR
* - GRAPHICAL_TFT_UPSCALE
*/
-#if ENABLED(MKS_TS35_V2_0)
- // Most common: ST7796
+#if ENABLED(MKS_TS35_V2_0) // Most common: ST7796
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY)
#define TFT_RES_480x320
#define TFT_INTERFACE_SPI
-#elif ENABLED(MKS_ROBIN_TFT24)
- // Most common: ST7789
+#elif ENABLED(MKS_ROBIN_TFT24) // Most common: ST7789
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y)
#define TFT_RES_320x240
#define TFT_INTERFACE_FSMC
-#elif ENABLED(MKS_ROBIN_TFT28)
- // Most common: ST7789
+#elif ENABLED(MKS_ROBIN_TFT28) // Most common: ST7789
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y)
#define TFT_RES_320x240
#define TFT_INTERFACE_FSMC
-#elif ENABLED(MKS_ROBIN_TFT32)
- // Most common: ST7789
+#elif ENABLED(MKS_ROBIN_TFT32) // Most common: ST7789
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y)
#define TFT_RES_320x240
#define TFT_INTERFACE_FSMC
-#elif ENABLED(MKS_ROBIN_TFT35)
- // Most common: ILI9488
+#elif ENABLED(MKS_ROBIN_TFT35) // Most common: ILI9488
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y)
#define TFT_RES_480x320
#define TFT_INTERFACE_FSMC
@@ -1087,12 +1093,11 @@
#define TFT_DRIVER SSD1963
#define TFT_RES_480x272
#define TFT_INTERFACE_FSMC
-#elif ENABLED(MKS_ROBIN_TFT_V1_1R)
- // ILI9328 or R61505
+#elif ENABLED(MKS_ROBIN_TFT_V1_1R) // ILI9328 or R61505
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y)
#define TFT_RES_320x240
#define TFT_INTERFACE_FSMC
-#elif EITHER(TFT_TRONXY_X5SA, ANYCUBIC_TFT35)
+#elif EITHER(TFT_TRONXY_X5SA, ANYCUBIC_TFT35) // ILI9488
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y)
#define TFT_DRIVER ILI9488
#define TFT_RES_480x320
@@ -1101,6 +1106,14 @@
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y)
#define TFT_RES_320x240
#define TFT_INTERFACE_FSMC
+#elif ENABLED(ANET_ET4_TFT28) // ST7789
+ #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y)
+ #define TFT_RES_320x240
+ #define TFT_INTERFACE_FSMC
+#elif ENABLED(ANET_ET5_TFT35) // ST7796
+ #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY)
+ #define TFT_RES_480x320
+ #define TFT_INTERFACE_FSMC
#elif ENABLED(TFT_GENERIC)
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y)
#if NONE(TFT_RES_320x240, TFT_RES_480x272, TFT_RES_480x320)
@@ -1154,6 +1167,12 @@
#elif ENABLED(TFT_INTERFACE_FSMC)
#define TFT_480x320
#endif
+#elif ENABLED(TFT_COLOR_UI) && TFT_HEIGHT == 272
+ #if ENABLED(TFT_INTERFACE_SPI)
+ #define TFT_480x272_SPI
+ #elif ENABLED(TFT_INTERFACE_FSMC)
+ #define TFT_480x272
+ #endif
#endif
// Fewer lines with touch buttons on-screen
@@ -1163,12 +1182,15 @@
#elif EITHER(TFT_480x320, TFT_480x320_SPI)
#define HAS_UI_480x320 1
#define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7)
+#elif EITHER(TFT_480x272, TFT_480x272_SPI)
+ #define HAS_UI_480x272 1
+ #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7)
#endif
// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046'
#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT
#undef TOUCH_SCREEN
- #if !HAS_TFT_LVGL_UI
+ #if ENABLED(TFT_CLASSIC_UI)
#define HAS_TOUCH_BUTTONS 1
#endif
#endif
@@ -1181,11 +1203,5 @@
#define TOUCH_OFFSET_X XPT2046_X_OFFSET
#define TOUCH_OFFSET_Y XPT2046_Y_OFFSET
#define TOUCH_ORIENTATION TOUCH_LANDSCAPE
- #else
- #define TOUCH_CALIBRATION_X 0
- #define TOUCH_CALIBRATION_Y 0
- #define TOUCH_OFFSET_X 0
- #define TOUCH_OFFSET_Y 0
- #define TOUCH_ORIENTATION TOUCH_ORIENTATION_NONE
#endif
#endif
diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h
index 1bd9dc47a417..22a671c5b3d6 100644
--- a/Marlin/src/inc/Conditionals_adv.h
+++ b/Marlin/src/inc/Conditionals_adv.h
@@ -142,6 +142,10 @@
#undef SD_FINISHED_RELEASECOMMAND
#endif
+#if ENABLED(NO_SD_AUTOSTART)
+ #undef MENU_ADDAUTOSTART
+#endif
+
#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY)
#define HAS_PRINT_PROGRESS 1
#endif
@@ -207,14 +211,18 @@
#if DISABLED(Y_DUAL_STEPPER_DRIVERS)
#undef Y2_DRIVER_TYPE
#endif
-#if NUM_Z_STEPPER_DRIVERS < 2
- #undef Z2_DRIVER_TYPE
-#endif
-#if NUM_Z_STEPPER_DRIVERS < 3
- #undef Z3_DRIVER_TYPE
-#endif
+
#if NUM_Z_STEPPER_DRIVERS < 4
#undef Z4_DRIVER_TYPE
+ #undef INVERT_Z4_VS_Z_DIR
+ #if NUM_Z_STEPPER_DRIVERS < 3
+ #undef Z3_DRIVER_TYPE
+ #undef INVERT_Z3_VS_Z_DIR
+ #if NUM_Z_STEPPER_DRIVERS < 2
+ #undef Z2_DRIVER_TYPE
+ #undef INVERT_Z2_VS_Z_DIR
+ #endif
+ #endif
#endif
//
@@ -378,6 +386,14 @@
#define POLL_JOG
#endif
+#ifndef HOMING_BUMP_MM
+ #define HOMING_BUMP_MM { 0, 0, 0 }
+#endif
+
+#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && NONE(USE_OTG_USB_HOST, USE_UHS3_USB)
+ #define USE_UHS2_USB
+#endif
+
/**
* Driver Timings (in nanoseconds)
* NOTE: Driver timing order is longest-to-shortest duration.
@@ -496,7 +512,10 @@
#endif
// Flag the indexed serial ports that are in use
-#define ANY_SERIAL_IS(N) (defined(SERIAL_PORT) && SERIAL_PORT == (N)) || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N))
+#define ANY_SERIAL_IS(N) (defined(SERIAL_PORT) && SERIAL_PORT == (N)) || \
+ (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || \
+ (defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT == (N)) || \
+ (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N))
#if ANY_SERIAL_IS(-1)
#define USING_SERIAL_DEFAULT
#endif
diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h
index 35fd92e10b76..acf8f3620b78 100644
--- a/Marlin/src/inc/Conditionals_post.h
+++ b/Marlin/src/inc/Conditionals_post.h
@@ -323,6 +323,11 @@
*/
#if ENABLED(SDSUPPORT)
+ // Extender cable doesn't support SD_DETECT_PIN
+ #if ENABLED(NO_SD_DETECT)
+ #undef SD_DETECT_PIN
+ #endif
+
#if HAS_SD_HOST_DRIVE && SD_CONNECTION_IS(ONBOARD)
//
// The external SD card is not used. Hardware SPI is used to access the card.
@@ -1647,6 +1652,54 @@
#ifndef E7_INTERPOLATE
#define E7_INTERPOLATE INTERPOLATE
#endif
+ #ifndef X_SLAVE_ADDRESS
+ #define X_SLAVE_ADDRESS 0
+ #endif
+ #ifndef Y_SLAVE_ADDRESS
+ #define Y_SLAVE_ADDRESS 0
+ #endif
+ #ifndef Z_SLAVE_ADDRESS
+ #define Z_SLAVE_ADDRESS 0
+ #endif
+ #ifndef X2_SLAVE_ADDRESS
+ #define X2_SLAVE_ADDRESS 0
+ #endif
+ #ifndef Y2_SLAVE_ADDRESS
+ #define Y2_SLAVE_ADDRESS 0
+ #endif
+ #ifndef Z2_SLAVE_ADDRESS
+ #define Z2_SLAVE_ADDRESS 0
+ #endif
+ #ifndef Z3_SLAVE_ADDRESS
+ #define Z3_SLAVE_ADDRESS 0
+ #endif
+ #ifndef Z4_SLAVE_ADDRESS
+ #define Z4_SLAVE_ADDRESS 0
+ #endif
+ #ifndef E0_SLAVE_ADDRESS
+ #define E0_SLAVE_ADDRESS 0
+ #endif
+ #ifndef E1_SLAVE_ADDRESS
+ #define E1_SLAVE_ADDRESS 0
+ #endif
+ #ifndef E2_SLAVE_ADDRESS
+ #define E2_SLAVE_ADDRESS 0
+ #endif
+ #ifndef E3_SLAVE_ADDRESS
+ #define E3_SLAVE_ADDRESS 0
+ #endif
+ #ifndef E4_SLAVE_ADDRESS
+ #define E4_SLAVE_ADDRESS 0
+ #endif
+ #ifndef E5_SLAVE_ADDRESS
+ #define E5_SLAVE_ADDRESS 0
+ #endif
+ #ifndef E6_SLAVE_ADDRESS
+ #define E6_SLAVE_ADDRESS 0
+ #endif
+ #ifndef E7_SLAVE_ADDRESS
+ #define E7_SLAVE_ADDRESS 0
+ #endif
#endif
#if (HAS_E_DRIVER(TMC2660) \
@@ -1997,6 +2050,9 @@
#if NUM_SERVOS > 0
#define HAS_SERVOS 1
#endif
+#if HAS_SERVOS && defined(PAUSE_SERVO_OUTPUT) && defined(RESUME_SERVO_OUTPUT)
+ #define HAS_PAUSE_SERVO_OUTPUT 1
+#endif
// Sensors
#if PIN_EXISTS(FILWIDTH)
@@ -2246,7 +2302,6 @@
#if FAN_COUNT > 0
#define HAS_FAN 1
- #define WRITE_FAN(n, v) WRITE(FAN##n##_PIN, (v) ^ FAN_INVERTING)
#endif
/**
@@ -2314,11 +2369,7 @@
#define Z_PROBE_OFFSET_RANGE_MAX 20
#endif
#ifndef XY_PROBE_SPEED
- #ifdef HOMING_FEEDRATE_XY
- #define XY_PROBE_SPEED HOMING_FEEDRATE_XY
- #else
- #define XY_PROBE_SPEED 4000
- #endif
+ #define XY_PROBE_SPEED ((homing_feedrate_mm_m.x + homing_feedrate_mm_m.y) / 2)
#endif
#ifndef NOZZLE_TO_PROBE_OFFSET
#define NOZZLE_TO_PROBE_OFFSET { 0, 0, 0 }
@@ -2374,7 +2425,7 @@
#endif
#if HAS_BED_PROBE && (EITHER(PROBING_HEATERS_OFF, PROBING_FANS_OFF) || DELAY_BEFORE_PROBING > 0)
- #define QUIET_PROBING 1
+ #define HAS_QUIET_PROBING 1
#endif
#if EITHER(ADVANCED_PAUSE_FEATURE, PROBING_HEATERS_OFF)
#define HEATER_IDLE_HANDLER 1
@@ -2448,6 +2499,10 @@
#endif
#endif
+#ifndef DEFAULT_LEVELING_FADE_HEIGHT
+ #define DEFAULT_LEVELING_FADE_HEIGHT 0.0
+#endif
+
#if ENABLED(SEGMENT_LEVELED_MOVES) && !defined(LEVELED_SEGMENT_LENGTH)
#define LEVELED_SEGMENT_LENGTH 5
#endif
@@ -2539,10 +2594,10 @@
*/
#if HAS_MARLINUI_U8GLIB
#ifndef DOGLCD_SCK
- #define DOGLCD_SCK SCK_PIN
+ #define DOGLCD_SCK SD_SCK_PIN
#endif
#ifndef DOGLCD_MOSI
- #define DOGLCD_MOSI MOSI_PIN
+ #define DOGLCD_MOSI SD_MOSI_PIN
#endif
#endif
@@ -2632,7 +2687,7 @@
// Force SDCARD_SORT_ALPHA to be enabled for Graphical LCD on LPC1768
// on boards where SD card and LCD display share the same SPI bus
// because of a bug in the shared SPI implementation. (See #8122)
-#if defined(TARGET_LPC1768) && IS_RRD_FG_SC && (SCK_PIN == LCD_PINS_D4)
+#if defined(TARGET_LPC1768) && IS_RRD_FG_SC && (SD_SCK_PIN == LCD_PINS_D4)
#define SDCARD_SORT_ALPHA // Keep one directory level in RAM. Changing directory levels
// may still glitch the screen, but LCD updates clean it up.
#undef SDSORT_LIMIT
@@ -2657,6 +2712,11 @@
#endif
#endif
+// Fallback SPI Speed for SD
+#if ENABLED(SDSUPPORT) && !defined(SD_SPI_SPEED)
+ #define SD_SPI_SPEED SPI_FULL_SPEED
+#endif
+
// Defined here to catch the above defines
#if ENABLED(SDCARD_SORT_ALPHA) && (FOLDER_SORTING || ENABLED(SDSORT_GCODE))
#define HAS_FOLDER_SORTING 1
diff --git a/Marlin/src/inc/MarlinConfig.h b/Marlin/src/inc/MarlinConfig.h
index 2eafa2b4171f..8fdb4b9baeae 100644
--- a/Marlin/src/inc/MarlinConfig.h
+++ b/Marlin/src/inc/MarlinConfig.h
@@ -55,3 +55,5 @@
#include "../core/serial.h"
#endif
+
+#include "../core/multi_language.h"
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index 9f4c10dd53e1..2d4b073e159d 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -105,9 +105,9 @@
#elif defined(USE_AUTOMATIC_VERSIONING)
#error "USE_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE."
#elif defined(SDSLOW)
- #error "SDSLOW deprecated. Set SPI_SPEED to SPI_HALF_SPEED instead."
+ #error "SDSLOW deprecated. Set SD_SPI_SPEED to SPI_HALF_SPEED instead."
#elif defined(SDEXTRASLOW)
- #error "SDEXTRASLOW deprecated. Set SPI_SPEED to SPI_QUARTER_SPEED instead."
+ #error "SDEXTRASLOW deprecated. Set SD_SPI_SPEED to SPI_QUARTER_SPEED instead."
#elif defined(FILAMENT_SENSOR)
#error "FILAMENT_SENSOR is now FILAMENT_WIDTH_SENSOR."
#elif defined(ENDSTOPPULLUP_FIL_RUNOUT)
@@ -189,7 +189,9 @@
#elif defined(ENDSTOPS_ONLY_FOR_HOMING)
#error "ENDSTOPS_ONLY_FOR_HOMING is deprecated. Use (disable) ENDSTOPS_ALWAYS_ON_DEFAULT instead."
#elif defined(HOMING_FEEDRATE)
- #error "HOMING_FEEDRATE is deprecated. Set individual rates with HOMING_FEEDRATE_(XY|Z|E) instead."
+ #error "HOMING_FEEDRATE is now set using the HOMING_FEEDRATE_MM_M array instead."
+#elif (defined(HOMING_FEEDRATE_XY) || defined(HOMING_FEEDRATE_Z)) && !defined(HOMING_FEEDRATE_MM_M)
+ #error "HOMING_FEEDRATE_XY and HOMING_FEEDRATE_Z are now set using the HOMING_FEEDRATE_MM_M array instead."
#elif defined(MANUAL_HOME_POSITIONS)
#error "MANUAL_HOME_POSITIONS is deprecated. Set MANUAL_[XYZ]_HOME_POS as-needed instead."
#elif defined(PID_ADD_EXTRUSION_RATE)
@@ -357,6 +359,8 @@
#error "LEVEL_CORNERS_INSET is now LEVEL_CORNERS_INSET_LFRB."
#elif ENABLED(LEVEL_BED_CORNERS) && !defined(LEVEL_CORNERS_INSET_LFRB)
#error "LEVEL_BED_CORNERS requires LEVEL_CORNERS_INSET_LFRB values."
+#elif BOTH(LEVEL_CORNERS_USE_PROBE, SENSORLESS_PROBING)
+ #error "LEVEL_CORNERS_USE_PROBE is incompatible with SENSORLESS_PROBING."
#elif defined(BEZIER_JERK_CONTROL)
#error "BEZIER_JERK_CONTROL is now S_CURVE_ACCELERATION."
#elif HAS_JUNCTION_DEVIATION && defined(JUNCTION_DEVIATION_FACTOR)
@@ -529,12 +533,16 @@
#error "PROBE_OFFSET_START is now PROBE_OFFSET_WIZARD_START_Z."
#elif defined(POWER_LOSS_PULL)
#error "POWER_LOSS_PULL is now specifically POWER_LOSS_PULL(UP|DOWN)."
+#elif defined(SHORT_MANUAL_Z_MOVE)
+ #error "SHORT_MANUAL_Z_MOVE is now FINE_MANUAL_MOVE, applying to Z on most printers."
#elif defined(FIL_RUNOUT_INVERTING)
#if FIL_RUNOUT_INVERTING
#error "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH."
#else
#error "FIL_RUNOUT_INVERTING false is now FIL_RUNOUT_STATE LOW."
#endif
+#elif defined(ASSISTED_TRAMMING_MENU_ITEM)
+ #error "ASSISTED_TRAMMING_MENU_ITEM is deprecated and should be removed."
#endif
/**
@@ -580,10 +588,6 @@
#error "SERIAL_PORT must be defined."
#elif defined(SERIAL_PORT_2) && SERIAL_PORT_2 == SERIAL_PORT
#error "SERIAL_PORT_2 cannot be the same as SERIAL_PORT."
-#elif defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == SERIAL_PORT
- #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT."
-#elif defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == SERIAL_PORT_2
- #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT_2."
#endif
#if !(defined(__AVR__) && defined(USBCON))
#if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024
@@ -705,6 +709,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#endif
#endif
+#if ENABLED(USE_M73_REMAINING_TIME) && DISABLED(LCD_SET_PROGRESS_MANUALLY)
+ #error "USE_M73_REMAINING_TIME requires LCD_SET_PROGRESS_MANUALLY"
+#endif
+
#if !HAS_LCD_MENU && ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
#error "SD_REPRINT_LAST_SELECTED_FILE currently requires a Marlin-native LCD menu."
#endif
@@ -715,7 +723,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE)
#error "SHOW_CUSTOM_BOOTSCREEN requires Graphical LCD or TOUCH_UI_FTDI_EVE."
#elif ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && !HAS_MARLINUI_U8GLIB
- #error "CUSTOM_STATUS_SCREEN_IMAGE requires a Graphical LCD."
+ #error "CUSTOM_STATUS_SCREEN_IMAGE requires a 128x64 DOGM B/W Graphical LCD."
#endif
/**
@@ -1249,8 +1257,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
*/
#if 1 < 0 \
+ (DISABLED(BLTOUCH) && HAS_Z_SERVO_PROBE) \
- + (ENABLED(BLTOUCH) && DISABLED(CREALITY_TOUCH)) \
- + COUNT_ENABLED(PROBE_MANUALLY, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, CREALITY_TOUCH, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, RACK_AND_PINION_PROBE, SENSORLESS_PROBING)
+ + COUNT_ENABLED(PROBE_MANUALLY, BLTOUCH, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, RACK_AND_PINION_PROBE, SENSORLESS_PROBING)
#error "Please enable only one probe option: PROBE_MANUALLY, SENSORLESS_PROBING, BLTOUCH, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo."
#endif
@@ -1355,12 +1362,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
static_assert(sanity_nozzle_to_probe_offset.x == 0 && sanity_nozzle_to_probe_offset.y == 0,
"NOZZLE_AS_PROBE requires the XY offsets in NOZZLE_TO_PROBE_OFFSET to both be 0.");
#else
- static_assert(sanity_nozzle_to_probe_offset.z <= 0.25,
- "Are you sure your Probe triggers above the nozzle? Set a negative Z value in the NOZZLE_TO_PROBE_OFFSET.");
- #ifdef PROBE_OFFSET_WIZARD_START_Z
- static_assert(PROBE_OFFSET_WIZARD_START_Z <= 0.25,
- "Are you sure your Probe triggers above the nozzle? Set a negative value for PROBE_OFFSET_WIZARD_START_Z.");
- #endif
static_assert(PROBING_MARGIN >= 0, "PROBING_MARGIN must be >= 0.");
static_assert(PROBING_MARGIN_BACK >= 0, "PROBING_MARGIN_BACK must be >= 0.");
static_assert(PROBING_MARGIN_FRONT >= 0, "PROBING_MARGIN_FRONT must be >= 0.");
@@ -1409,6 +1410,14 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#error "Z_SAFE_HOMING is recommended when homing with a probe. Enable it or comment out this line to continue."
#endif
+ #if ENABLED(PROBE_ACTIVATION_SWITCH)
+ #ifndef PROBE_ACTIVATION_SWITCH_STATE
+ #error "PROBE_ACTIVATION_SWITCH_STATE is required for PROBE_ACTIVATION_SWITCH."
+ #elif !PIN_EXISTS(PROBE_ACTIVATION_SWITCH)
+ #error "A PROBE_ACTIVATION_SWITCH_PIN is required for PROBE_ACTIVATION_SWITCH."
+ #endif
+ #endif
+
#else
/**
@@ -1447,8 +1456,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#error "AUTO_BED_LEVELING_UBL requires EEPROM_SETTINGS."
#elif !WITHIN(GRID_MAX_POINTS_X, 3, 15) || !WITHIN(GRID_MAX_POINTS_Y, 3, 15)
#error "GRID_MAX_POINTS_[XY] must be a whole number between 3 and 15."
- #elif !defined(RESTORE_LEVELING_AFTER_G28)
- #error "AUTO_BED_LEVELING_UBL used to enable RESTORE_LEVELING_AFTER_G28. To keep this behavior enable RESTORE_LEVELING_AFTER_G28. Otherwise define it as 'false'."
#endif
#elif HAS_ABL_NOT_UBL
@@ -1475,6 +1482,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#endif
+#if ALL(HAS_LEVELING, RESTORE_LEVELING_AFTER_G28, ENABLE_LEVELING_AFTER_G28)
+ #error "Only enable RESTORE_LEVELING_AFTER_G28 or ENABLE_LEVELING_AFTER_G28, but not both."
+#endif
+
#if HAS_MESH && HAS_CLASSIC_JERK
static_assert(DEFAULT_ZJERK > 0.1, "Low DEFAULT_ZJERK values are incompatible with mesh-based leveling.");
#endif
@@ -1510,6 +1521,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#endif
#endif
+#if BOTH(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING)
+ #error "Disable PREHEAT_BEFORE_LEVELING when using PREHEAT_BEFORE_PROBING."
+#endif
+
/**
* Homing
*/
@@ -1580,7 +1595,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
/**
* ULTIPANEL encoder
*/
-#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !defined(SHIFT_CLK)
+#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !PIN_EXISTS(SHIFT_CLK)
#error "ULTIPANEL controllers require some kind of encoder."
#endif
@@ -1603,7 +1618,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
* Allen Key
* Deploying the Allen Key probe uses big moves in z direction. Too dangerous for an unhomed z-axis.
*/
-#if ENABLED(Z_PROBE_ALLEN_KEY) && (Z_HOME_DIR < 0) && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)
+#if BOTH(Z_PROBE_ALLEN_KEY, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && (Z_HOME_DIR < 0)
#error "You can't home to a Z min endstop with a Z_PROBE_ALLEN_KEY."
#endif
@@ -1865,7 +1880,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
#error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN."
#elif !HAS_TEMP_ADC_PROBE
#error "TEMP_PROBE_PIN must be an ADC pin."
- #elif !ENABLED(FIX_MOUNTED_PROBE)
+ #elif DISABLED(FIX_MOUNTED_PROBE)
#error "TEMP_SENSOR_PROBE shouldn't be set without FIX_MOUNTED_PROBE."
#endif
#endif
@@ -1912,7 +1927,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
/**
* LED Backlight Timeout
*/
-#if defined(LED_BACKLIGHT_TIMEOUT) && !(ENABLED(PSU_CONTROL) && EITHER(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1))
+#if defined(LED_BACKLIGHT_TIMEOUT) && !(ENABLED(PSU_CONTROL) && ANY(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1, FYSETC_242_OLED_12864))
#error "LED_BACKLIGHT_TIMEOUT requires a FYSETC Mini Panel and a Power Switch."
#endif
@@ -1920,16 +1935,16 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
* Basic multi hotend duplication mode
*/
#if ENABLED(MULTI_NOZZLE_DUPLICATION)
- #if HOTENDS < 2
- #error "MULTI_NOZZLE_DUPLICATION requires 2 or more hotends."
+ #if ENABLED(SINGLENOZZLE)
+ #error "MULTI_NOZZLE_DUPLICATION is incompatible with SINGLENOZZLE."
#elif ENABLED(DUAL_X_CARRIAGE)
#error "MULTI_NOZZLE_DUPLICATION is incompatible with DUAL_X_CARRIAGE."
- #elif ENABLED(SINGLENOZZLE)
- #error "MULTI_NOZZLE_DUPLICATION is incompatible with SINGLENOZZLE."
#elif ENABLED(MIXING_EXTRUDER)
#error "MULTI_NOZZLE_DUPLICATION is incompatible with MIXING_EXTRUDER."
#elif ENABLED(SWITCHING_EXTRUDER)
#error "MULTI_NOZZLE_DUPLICATION is incompatible with SWITCHING_EXTRUDER."
+ #elif HOTENDS < 2
+ #error "MULTI_NOZZLE_DUPLICATION requires 2 or more hotends."
#endif
#endif
@@ -2287,7 +2302,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
+ COUNT_ENABLED(FYSETC_MINI_12864_X_X, FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1, FYSETC_GENERIC_12864_1_1) \
+ COUNT_ENABLED(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) \
+ COUNT_ENABLED(MKS_12864OLED, MKS_12864OLED_SSD1306) \
- + COUNT_ENABLED(MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R) \
+ + COUNT_ENABLED(MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, ANET_ET4_TFT28, ANET_ET5_TFT35) \
+ COUNT_ENABLED(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) \
+ COUNT_ENABLED(VIKI2, miniVIKI) \
+ COUNT_ENABLED(ZONESTAR_12864LCD, ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) \
@@ -2331,7 +2346,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
#undef IS_EXTUI
#undef IS_LEGACY_TFT
-#if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28)
+#if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28, ANET_ET4_TFT28, ANET_ET5_TFT35)
#if NONE(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI)
#error "TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI is required for your TFT. Please enable one."
#elif 1 < ENABLED(TFT_COLOR_UI) + ENABLED(TFT_CLASSIC_UI) + ENABLED(TFT_LVGL_UI)
@@ -2374,11 +2389,26 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
#error "SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set SERIAL_PORT to a valid value for your board."
#elif SERIAL_PORT_2 == -1
#error "SERIAL_PORT_2 is set to -1, but the MOTHERBOARD has no native USB support. Set SERIAL_PORT_2 to a valid value for your board."
+ #elif MMU2_SERIAL_PORT == -1
+ #error "MMU2_SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set MMU2_SERIAL_PORT to a valid value for your board."
#elif LCD_SERIAL_PORT == -1
#error "LCD_SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set LCD_SERIAL_PORT to a valid value for your board."
#endif
#endif
+/**
+ * MMU2 require a dedicated serial port
+ */
+#ifdef MMU2_SERIAL_PORT
+ #if MMU2_SERIAL_PORT == SERIAL_PORT
+ #error "MMU2_SERIAL_PORT cannot be the same as SERIAL_PORT."
+ #elif defined(SERIAL_PORT_2) && MMU2_SERIAL_PORT == SERIAL_PORT_2
+ #error "MMU2_SERIAL_PORT cannot be the same as SERIAL_PORT_2."
+ #elif defined(LCD_SERIAL_PORT) && MMU2_SERIAL_PORT == LCD_SERIAL_PORT
+ #error "MMU2_SERIAL_PORT cannot be the same as LCD_SERIAL_PORT."
+ #endif
+#endif
+
/**
* Serial displays require a dedicated serial port
*/
@@ -2658,6 +2688,10 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
#if ENABLED(SENSORLESS_PROBING)
#if ENABLED(DELTA) && !(X_SENSORLESS && Y_SENSORLESS && Z_SENSORLESS)
#error "SENSORLESS_PROBING for DELTA requires TMC stepper drivers with StallGuard on X, Y, and Z axes."
+ #elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)
+ #error "SENSORLESS_PROBING cannot be used with Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN."
+ #elif ENABLED(USE_PROBE_FOR_Z_HOMING)
+ #error "SENSORLESS_PROBING cannot be used with USE_PROBE_FOR_Z_HOMING."
#elif !Z_SENSORLESS
#error "SENSORLESS_PROBING requires a TMC stepper driver with StallGuard on Z."
#endif
@@ -2895,10 +2929,14 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
#error "PRINTCOUNTER requires EEPROM_SETTINGS."
#endif
-#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && !PINS_EXIST(USB_CS, USB_INTR)
+#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && !PINS_EXIST(USB_CS, USB_INTR) && DISABLED(USE_OTG_USB_HOST)
#error "USB_CS_PIN and USB_INTR_PIN are required for USB_FLASH_DRIVE_SUPPORT."
#endif
+#if ENABLED(USE_OTG_USB_HOST) && !defined(HAS_OTG_USB_HOST_SUPPORT)
+ #error "The current board does not support USE_OTG_USB_HOST."
+#endif
+
#if ENABLED(SD_FIRMWARE_UPDATE) && !defined(__AVR_ATmega2560__)
#error "SD_FIRMWARE_UPDATE requires an ATmega2560-based (Arduino Mega) board."
#endif
@@ -3193,10 +3231,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
#undef _PIN_CONFLICT
#endif
-#if !HAS_MARLINUI_U8GLIB
- #if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS)
- #error "PRINT_PROGRESS_SHOW_DECIMALS currently requires a Graphical LCD."
- #endif
+#if NONE(HAS_MARLINUI_U8GLIB, EXTENSIBLE_UI) && ENABLED(PRINT_PROGRESS_SHOW_DECIMALS)
+ #error "PRINT_PROGRESS_SHOW_DECIMALS currently requires a Graphical LCD."
#endif
#if HAS_ADC_BUTTONS && defined(ADC_BUTTON_DEBOUNCE_DELAY) && ADC_BUTTON_DEBOUNCE_DELAY < 16
@@ -3226,7 +3262,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
/**
* Touch Buttons
*/
-#if ENABLED(TOUCH_SCREEN)
+#if ENABLED(TOUCH_SCREEN) && DISABLED(TOUCH_SCREEN_CALIBRATION)
#ifndef TOUCH_CALIBRATION_X
#error "TOUCH_CALIBRATION_X must be defined with TOUCH_SCREEN."
#endif
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 5fb065dc35d8..99ce5ba14ae2 100644
--- a/Marlin/src/inc/Version.h
+++ b/Marlin/src/inc/Version.h
@@ -42,7 +42,7 @@
* version was tagged.
*/
#ifndef STRING_DISTRIBUTION_DATE
- #define STRING_DISTRIBUTION_DATE "2020-11-26"
+ #define STRING_DISTRIBUTION_DATE "2021-01-22"
#endif
/**
@@ -82,7 +82,7 @@
* providing the source code to your customers.)
*/
#ifndef SOURCE_CODE_URL
- #define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin"
+ #define SOURCE_CODE_URL "github.com/MarlinFirmware/Marlin"
#endif
/**
@@ -97,7 +97,7 @@
* documentation about a specific Marlin release. Displayed in the Info Menu.
*/
#ifndef WEBSITE_URL
- #define WEBSITE_URL "https://marlinfw.org"
+ #define WEBSITE_URL "marlinfw.org"
#endif
/**
diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp
index 00968f4ba0e9..84c477fbde5d 100644
--- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp
+++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp
@@ -506,18 +506,12 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const
lcd_put_wchar('X' + uint8_t(axis));
if (blink)
lcd_put_u8str(value);
- else {
- if (!TEST(axis_homed, axis))
- while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?');
- else {
- #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING)
- if (!TEST(axis_known_position, axis))
- lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" "));
- else
- #endif
- lcd_put_u8str(value);
- }
- }
+ else if (axis_should_home(axis))
+ while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?');
+ else if (NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) && !axis_is_trusted(axis))
+ lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" "));
+ else
+ lcd_put_u8str(value);
}
FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char prefix, const bool blink) {
@@ -714,7 +708,7 @@ inline uint8_t draw_elapsed_or_remaining_time(uint8_t timepos, const bool blink)
const bool show_remain = TERN1(ROTATE_PROGRESS_DISPLAY, blink) && (printingIsActive() || marlin_state == MF_SD_COMPLETE);
if (show_remain) {
#if ENABLED(USE_M73_REMAINING_TIME)
- duration_t remaining = get_remaining_time();
+ duration_t remaining = ui.get_remaining_time();
#else
uint8_t progress = ui.get_progress_percent();
uint32_t elapsed = print_job_timer.duration();
diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp
index 74be828c727e..44128cc9f8d1 100644
--- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp
+++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp
@@ -32,7 +32,7 @@
* and supports color output.
*/
-#if NONE(__AVR__, TARGET_LPC1768, __STM32F1__, STM32F4xx)
+#if NONE(__AVR__, TARGET_LPC1768, STM32F1, STM32F4xx)
#warning "Selected platform not yet tested. Please contribute your good pin mappings."
#endif
@@ -129,7 +129,7 @@ static uint8_t PanelDetected = 0;
#if ANY(__AVR__, TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__)
#define SPI_SEND_ONE(V) SPI.transfer(V);
#define SPI_SEND_TWO(V) SPI.transfer16(V);
-#elif defined(STM32F4xx)
+#elif EITHER(STM32F4xx, STM32F1xx)
#define SPI_SEND_ONE(V) SPI.transfer(V, SPI_CONTINUE);
#define SPI_SEND_TWO(V) SPI.transfer16(V, SPI_CONTINUE);
#elif defined(ARDUINO_ARCH_ESP32)
@@ -139,7 +139,7 @@ static uint8_t PanelDetected = 0;
#if ANY(__AVR__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__)
#define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L);
-#elif defined(STM32F4xx)
+#elif EITHER(STM32F4xx, STM32F1xx)
#define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L, SPI_CONTINUE);
#elif ANY(TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_ESP32)
#define SPI_SEND_SOME(V,L,Z) do{ for (uint16_t i = 0; i < L; i++) SPI_SEND_ONE(V[(Z)+i]); }while(0)
@@ -276,7 +276,7 @@ uint8_t MarlinUI::read_slow_buttons(void) {
Wire.endTransmission();
#ifdef __AVR__
Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 2, 0, 0, 1);
- #elif defined(__STM32F1__)
+ #elif defined(STM32F1)
Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, (uint8_t)2);
#elif EITHER(STM32F4xx, TARGET_LPC1768)
Wire.requestFrom(LCD_I2C_ADDRESS, 2);
@@ -313,7 +313,7 @@ void MarlinUI::init_lcd() {
t = 0;
#if ENABLED(TFTGLCD_PANEL_SPI)
// SPI speed must be less 10MHz
- _SET_OUTPUT(TFTGLCD_CS);
+ SET_OUTPUT(TFTGLCD_CS);
WRITE(TFTGLCD_CS, HIGH);
spiInit(TERN(__STM32F1__, SPI_QUARTER_SPEED, SPI_FULL_SPEED));
WRITE(TFTGLCD_CS, LOW);
@@ -330,7 +330,7 @@ void MarlinUI::init_lcd() {
Wire.endTransmission(); // send buffer
#ifdef __AVR__
Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 1, 0, 0, 1);
- #elif ANY(__STM32F1__, STM32F4xx, TARGET_LPC1768)
+ #elif ANY(STM32F1, STM32F4xx, TARGET_LPC1768)
Wire.requestFrom(LCD_I2C_ADDRESS, 1);
#endif
t = (uint8_t)Wire.read();
@@ -422,18 +422,12 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const
lcd.write('X' + uint8_t(axis));
if (blink)
lcd.print(value);
- else {
- if (!TEST(axis_homed, axis))
- while (const char c = *value++) lcd.write(c <= '.' ? c : '?');
- else {
- #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING)
- if (!TEST(axis_known_position, axis))
- lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" "));
- else
- #endif
- lcd_put_u8str(value);
- }
- }
+ else if (axis_should_home(axis))
+ while (const char c = *value++) lcd.write(c <= '.' ? c : '?');
+ else if (NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) && !axis_is_trusted(axis))
+ lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" "));
+ else
+ lcd_put_u8str(value);
}
FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *prefix, const bool blink) {
@@ -632,7 +626,7 @@ Equal to 20x10 text LCD
| ttc ttc % | ttc - current temperature
| tts tts %%% | tts - setted temperature, %%% - percent for FAN
| ICO ICO ICO ICO | ICO - icon 48x48, placed in 2 text lines
-| ICO ICO ICO ICO | ICO /
+| ICO ICO ICO ICO | ICO
or
@@ -861,13 +855,14 @@ void MarlinUI::draw_status_screen() {
void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) {
if (!PanelDetected) return;
ui.encoder_direction_normal();
- lcd.setCursor(0, MIDDLE_Y);
+ const uint8_t y = TERN0(AUTO_BED_LEVELING_UBL, ui.external_control) ? LCD_HEIGHT - 1 : MIDDLE_Y;
+ lcd.setCursor(0, y);
lcd.write(COLOR_EDIT);
lcd_put_u8str_P(pstr);
if (value) {
lcd.write(':');
- lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), MIDDLE_Y); // Right-justified, padded by spaces
- lcd.write(' '); // Overwrite char if value gets shorter
+ lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), y); // Right-justified, padded by spaces
+ lcd.write(' '); // Overwrite char if value gets shorter
lcd.print(value);
lcd.write(' ');
lcd.print_line();
diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h
index eedcc4afa073..c399b907e460 100644
--- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h
+++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h
@@ -61,15 +61,12 @@ extern TFTGLCD lcd;
#include "../lcdprint.h"
// Use panel encoder - free old encoder pins
-#undef BTN_EN1
-#undef BTN_EN2
-#undef BTN_ENC
-#define BTN_EN1 -1
-#define BTN_EN2 -1
-#define BTN_ENC -1
+#undef BTN_EN1
+#undef BTN_EN2
+#undef BTN_ENC
#ifndef EN_C
- #define EN_C 4 //for click
+ #define EN_C 4 // for click
#endif
#endif // IS_TFTGLCD_PANEL
diff --git a/Marlin/src/lcd/buttons.h b/Marlin/src/lcd/buttons.h
new file mode 100644
index 000000000000..07a4524def18
--- /dev/null
+++ b/Marlin/src/lcd/buttons.h
@@ -0,0 +1,234 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "../inc/MarlinConfig.h"
+
+#if ((!HAS_ADC_BUTTONS && IS_NEWPANEL) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL
+ #define HAS_ENCODER_WHEEL 1
+#endif
+#if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT)
+ #define HAS_DIGITAL_BUTTONS 1
+#endif
+#if !HAS_ADC_BUTTONS && (IS_RRW_KEYPAD || (HAS_WIRED_LCD && !IS_NEWPANEL))
+ #define HAS_SHIFT_ENCODER 1
+#endif
+
+// I2C buttons must be read in the main thread
+#if ANY(LCD_I2C_VIKI, LCD_I2C_PANELOLU2, IS_TFTGLCD_PANEL)
+ #define HAS_SLOW_BUTTONS 1
+#endif
+
+#if HAS_ENCODER_WHEEL
+ #define ENCODER_PHASE_0 0
+ #define ENCODER_PHASE_1 2
+ #define ENCODER_PHASE_2 3
+ #define ENCODER_PHASE_3 1
+#endif
+
+#if EITHER(HAS_DIGITAL_BUTTONS, DWIN_CREALITY_LCD)
+
+ // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes)
+ #define BLEN_A 0
+ #define BLEN_B 1
+
+ #define EN_A _BV(BLEN_A)
+ #define EN_B _BV(BLEN_B)
+
+ #define _BUTTON_PRESSED(BN) !READ(BTN_##BN)
+
+ #if BUTTON_EXISTS(ENC) || HAS_TOUCH_BUTTONS
+ #define BLEN_C 2
+ #define EN_C _BV(BLEN_C)
+ #endif
+
+ #if ENABLED(LCD_I2C_VIKI)
+
+ #include
+
+ #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
+
+ // button and encoder bit positions within 'buttons'
+ #define B_LE (BUTTON_LEFT << B_I2C_BTN_OFFSET) // The remaining normalized buttons are all read via I2C
+ #define B_UP (BUTTON_UP << B_I2C_BTN_OFFSET)
+ #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET)
+ #define B_DW (BUTTON_DOWN << B_I2C_BTN_OFFSET)
+ #define B_RI (BUTTON_RIGHT << B_I2C_BTN_OFFSET)
+
+ #if BUTTON_EXISTS(ENC) // The pause/stop/restart button is connected to BTN_ENC when used
+ #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name
+ #define BUTTON_CLICK() (buttons & (B_MI|B_RI|B_ST)) // Pause/stop also acts as click until a proper pause/stop is implemented.
+ #else
+ #define BUTTON_CLICK() (buttons & (B_MI|B_RI))
+ #endif
+
+ // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update
+
+ #elif ENABLED(LCD_I2C_PANELOLU2)
+
+ #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin
+
+ #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
+
+ #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later
+
+ #define BUTTON_CLICK() (buttons & B_MI)
+
+ #endif
+
+ #endif
+
+#else
+
+ #undef BUTTON_EXISTS
+ #define BUTTON_EXISTS(...) false
+
+ // Dummy button, never pressed
+ #define _BUTTON_PRESSED(BN) false
+
+ // Shift register bits correspond to buttons:
+ #define BL_LE 7 // Left
+ #define BL_UP 6 // Up
+ #define BL_MI 5 // Middle
+ #define BL_DW 4 // Down
+ #define BL_RI 3 // Right
+ #define BL_ST 2 // Red Button
+ #define B_LE _BV(BL_LE)
+ #define B_UP _BV(BL_UP)
+ #define B_MI _BV(BL_MI)
+ #define B_DW _BV(BL_DW)
+ #define B_RI _BV(BL_RI)
+ #define B_ST _BV(BL_ST)
+
+ #ifndef BUTTON_CLICK
+ #define BUTTON_CLICK() (buttons & (B_MI|B_ST))
+ #endif
+
+#endif
+
+#if IS_RRW_KEYPAD
+ #define BTN_OFFSET 0 // Bit offset into buttons for shift register values
+
+ #define BLEN_KEYPAD_F3 0
+ #define BLEN_KEYPAD_F2 1
+ #define BLEN_KEYPAD_F1 2
+ #define BLEN_KEYPAD_DOWN 3
+ #define BLEN_KEYPAD_RIGHT 4
+ #define BLEN_KEYPAD_MIDDLE 5
+ #define BLEN_KEYPAD_UP 6
+ #define BLEN_KEYPAD_LEFT 7
+
+ #define EN_KEYPAD_F1 _BV(BTN_OFFSET + BLEN_KEYPAD_F1)
+ #define EN_KEYPAD_F2 _BV(BTN_OFFSET + BLEN_KEYPAD_F2)
+ #define EN_KEYPAD_F3 _BV(BTN_OFFSET + BLEN_KEYPAD_F3)
+ #define EN_KEYPAD_DOWN _BV(BTN_OFFSET + BLEN_KEYPAD_DOWN)
+ #define EN_KEYPAD_RIGHT _BV(BTN_OFFSET + BLEN_KEYPAD_RIGHT)
+ #define EN_KEYPAD_MIDDLE _BV(BTN_OFFSET + BLEN_KEYPAD_MIDDLE)
+ #define EN_KEYPAD_UP _BV(BTN_OFFSET + BLEN_KEYPAD_UP)
+ #define EN_KEYPAD_LEFT _BV(BTN_OFFSET + BLEN_KEYPAD_LEFT)
+
+ #define RRK(B) (keypad_buttons & (B))
+
+ #ifdef EN_C
+ #define BUTTON_CLICK() ((buttons & EN_C) || RRK(EN_KEYPAD_MIDDLE))
+ #else
+ #define BUTTON_CLICK() RRK(EN_KEYPAD_MIDDLE)
+ #endif
+#endif
+
+#ifndef EN_A
+ #define EN_A 0
+#endif
+#ifndef EN_B
+ #define EN_B 0
+#endif
+#ifndef EN_C
+ #define EN_C 0
+#endif
+#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_BUTTONS, IS_TFTGLCD_PANEL)
+ #define BLEN_D 3
+ #define EN_D _BV(BLEN_D)
+#else
+ #define EN_D 0
+#endif
+
+#define BUTTON_PRESSED(BN) (_BUTTON_PRESSED_##BN)
+
+#if BUTTON_EXISTS(EN1)
+ #define _BUTTON_PRESSED_EN1 _BUTTON_PRESSED(EN1)
+#else
+ #define _BUTTON_PRESSED_EN1 false
+#endif
+#if BUTTON_EXISTS(EN2)
+ #define _BUTTON_PRESSED_EN2 _BUTTON_PRESSED(EN2)
+#else
+ #define _BUTTON_PRESSED_EN2 false
+#endif
+#if BUTTON_EXISTS(ENC_EN)
+ #define _BUTTON_PRESSED_ENC_EN _BUTTON_PRESSED(ENC_EN)
+#else
+ #define _BUTTON_PRESSED_ENC_EN false
+#endif
+#if BUTTON_EXISTS(ENC)
+ #define _BUTTON_PRESSED_ENC _BUTTON_PRESSED(ENC)
+#else
+ #define _BUTTON_PRESSED_ENC false
+#endif
+#if BUTTON_EXISTS(UP)
+ #define _BUTTON_PRESSED_UP _BUTTON_PRESSED(UP)
+#else
+ #define _BUTTON_PRESSED_UP false
+#endif
+#if BUTTON_EXISTS(DWN)
+ #define _BUTTON_PRESSED_DWN _BUTTON_PRESSED(DWN)
+#else
+ #define _BUTTON_PRESSED_DWN false
+#endif
+#if BUTTON_EXISTS(LFT)
+ #define _BUTTON_PRESSED_LFT _BUTTON_PRESSED(LFT)
+#else
+ #define _BUTTON_PRESSED_LFT false
+#endif
+#if BUTTON_EXISTS(RT)
+ #define _BUTTON_PRESSED_RT _BUTTON_PRESSED(RT)
+#else
+ #define _BUTTON_PRESSED_RT false
+#endif
+#if BUTTON_EXISTS(BACK)
+ #define _BUTTON_PRESSED_BACK _BUTTON_PRESSED(BACK)
+#else
+ #define _BUTTON_PRESSED_BACK false
+#endif
+
+#ifndef BUTTON_CLICK
+ #if EN_C > 0
+ #define BUTTON_CLICK() (buttons & EN_C)
+ #else
+ #define BUTTON_CLICK() false
+ #endif
+#endif
+
+#if EN_D > 0
+ #define LCD_BACK_CLICKED() (buttons & EN_D)
+#else
+ #define LCD_BACK_CLICKED() false
+#endif
diff --git a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h
index 1511c6993323..30a5361ab926 100644
--- a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h
+++ b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h
@@ -107,3 +107,16 @@ class U8GLIB_MINI12864_2X_HAL : public U8GLIB {
: U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_hw_spi, cs, a0, reset)
{ }
};
+
+extern u8g_dev_t u8g_dev_ssd1309_sw_spi;
+extern u8g_dev_t u8g_dev_ssd1309_hw_spi;
+
+class U8GLIB_SSD1309_128X64_HAL : public U8GLIB {
+public:
+ U8GLIB_SSD1309_128X64_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE)
+ : U8GLIB(&u8g_dev_ssd1309_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset)
+ { }
+ U8GLIB_SSD1309_128X64_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE)
+ : U8GLIB(&u8g_dev_ssd1309_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset)
+ { }
+};
diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h
index 535502f2e1a6..8a707ab41a36 100644
--- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h
+++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h
@@ -52,7 +52,9 @@
#elif defined(ARDUINO_ARCH_STM32)
+ uint8_t u8g_com_std_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
uint8_t u8g_com_stm32duino_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
+ #define U8G_COM_HAL_SW_SPI_FN u8g_com_std_sw_spi_fn
#define U8G_COM_HAL_HW_SPI_FN u8g_com_stm32duino_hw_spi_fn
#elif defined(__AVR__)
diff --git a/Marlin/src/lcd/dogm/dogm_Bootscreen.h b/Marlin/src/lcd/dogm/dogm_Bootscreen.h
index c9001119d9d4..0b8845ed794d 100644
--- a/Marlin/src/lcd/dogm/dogm_Bootscreen.h
+++ b/Marlin/src/lcd/dogm/dogm_Bootscreen.h
@@ -32,8 +32,16 @@
#if ENABLED(SHOW_CUSTOM_BOOTSCREEN)
+ typedef struct {
+ const unsigned char *bitmap;
+ const unsigned short duration;
+ } boot_frame_t;
+
#include "../../../_Bootscreen.h"
+ #ifndef CUSTOM_BOOTSCREEN_BMPWIDTH
+ #define CUSTOM_BOOTSCREEN_BMPWIDTH 128
+ #endif
#ifndef CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH
#define CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH CEILING(CUSTOM_BOOTSCREEN_BMPWIDTH, 8)
#endif
@@ -41,6 +49,13 @@
#define CUSTOM_BOOTSCREEN_BMPHEIGHT (sizeof(custom_start_bmp) / (CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH))
#endif
+ #ifndef CUSTOM_BOOTSCREEN_Y
+ #if ENABLED(CUSTOM_BOOTSCREEN_BOTTOM_JUSTIFY)
+ #define CUSTOM_BOOTSCREEN_Y (LCD_PIXEL_HEIGHT - (CUSTOM_BOOTSCREEN_BMPHEIGHT))
+ #else
+ #define CUSTOM_BOOTSCREEN_Y ((LCD_PIXEL_HEIGHT - (CUSTOM_BOOTSCREEN_BMPHEIGHT)) / 2)
+ #endif
+ #endif
#endif
#if ENABLED(BOOT_MARLIN_LOGO_SMALL)
diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_sk.h b/Marlin/src/lcd/dogm/fontdata/langdata_sk.h
index d2e7ec2c56db..491006e05a20 100644
--- a/Marlin/src/lcd/dogm/fontdata/langdata_sk.h
+++ b/Marlin/src/lcd/dogm/fontdata/langdata_sk.h
@@ -15,9 +15,10 @@ const u8g_fntpgm_uint8_t fontpage_2_186_186[33] U8G_FONT_SECTION("fontpage_2_186
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBA,0x00,0x0A,0x00,0x00,
0x00,0x03,0x0A,0x0A,0x06,0x01,0x00,0x20,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,
0xE0};
-const u8g_fntpgm_uint8_t fontpage_2_190_190[33] U8G_FONT_SECTION("fontpage_2_190_190") = {
- 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0x00,0x00,
- 0x00,0x03,0x0A,0x0A,0x06,0x01,0x00,0xA0,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,
+const u8g_fntpgm_uint8_t fontpage_2_189_190[49] U8G_FONT_SECTION("fontpage_2_189_190") = {
+ 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBD,0xBE,0x00,0x0A,0x00,0x00,
+ 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x80,0x80,0x80,0x80,0x80,0x80,
+ 0xF8,0x03,0x0A,0x0A,0x06,0x01,0x00,0xA0,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,
0xE0};
const u8g_fntpgm_uint8_t fontpage_2_199_200[47] U8G_FONT_SECTION("fontpage_2_199_200") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC8,0x00,0x0A,0x00,0x00,
@@ -40,7 +41,7 @@ const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(2, 140, 143, fontpage_2_140_143), // 'Č' -- 'ď'
FONTDATA_ITEM(2, 186, 186, fontpage_2_186_186), // 'ĺ' -- 'ĺ'
- FONTDATA_ITEM(2, 190, 190, fontpage_2_190_190), // 'ľ' -- 'ľ'
+ FONTDATA_ITEM(2, 189, 190, fontpage_2_189_190), // 'Ľ' -- 'ľ'
FONTDATA_ITEM(2, 199, 200, fontpage_2_199_200), // 'Ň' -- 'ň'
FONTDATA_ITEM(2, 224, 225, fontpage_2_224_225), // 'Š' -- 'š'
FONTDATA_ITEM(2, 229, 229, fontpage_2_229_229), // 'ť' -- 'ť'
diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp
index 4e265a8ee4df..1ab76a208dcf 100644
--- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp
+++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp
@@ -54,6 +54,7 @@
#include "../../sd/cardreader.h"
#include "../../module/temperature.h"
#include "../../module/printcounter.h"
+#include "../../MarlinCore.h"
#if ENABLED(SDSUPPORT)
#include "../../libs/duration_t.h"
@@ -110,19 +111,24 @@ bool MarlinUI::detected() { return true; }
// Draws a slice of a particular frame of the custom bootscreen, without the u8g loop
void MarlinUI::draw_custom_bootscreen(const uint8_t frame/*=0*/) {
constexpr u8g_uint_t left = u8g_uint_t((LCD_PIXEL_WIDTH - (CUSTOM_BOOTSCREEN_BMPWIDTH)) / 2),
- top = u8g_uint_t((LCD_PIXEL_HEIGHT - (CUSTOM_BOOTSCREEN_BMPHEIGHT)) / 2);
+ top = u8g_uint_t(CUSTOM_BOOTSCREEN_Y);
#if ENABLED(CUSTOM_BOOTSCREEN_INVERTED)
constexpr u8g_uint_t right = left + CUSTOM_BOOTSCREEN_BMPWIDTH,
bottom = top + CUSTOM_BOOTSCREEN_BMPHEIGHT;
#endif
- const u8g_pgm_uint8_t * const bmp =
- #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED)
- (u8g_pgm_uint8_t*)pgm_read_ptr(&custom_bootscreen_animation[frame])
+ #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED)
+ const void * const frame_ptr = pgm_read_ptr(&custom_bootscreen_animation[frame]);
+ #if ENABLED(CUSTOM_BOOTSCREEN_TIME_PER_FRAME)
+ const boot_frame_t * const frame_info = (boot_frame_t*)frame_ptr;
+ const u8g_pgm_uint8_t * const bmp = (u8g_pgm_uint8_t*)pgm_read_ptr(&frame_info->bitmap);
#else
- custom_start_bmp
+ const u8g_pgm_uint8_t * const bmp = (u8g_pgm_uint8_t*)frame_ptr;
#endif
- ;
+ #else
+ const u8g_pgm_uint8_t * const bmp = custom_start_bmp;
+ #endif
+
UNUSED(frame);
u8g.drawBitmapP(left, top, CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH, CUSTOM_BOOTSCREEN_BMPHEIGHT, bmp);
@@ -141,22 +147,31 @@ bool MarlinUI::detected() { return true; }
// Shows the custom bootscreen, with the u8g loop, animations and delays
void MarlinUI::show_custom_bootscreen() {
#if DISABLED(CUSTOM_BOOTSCREEN_ANIMATED)
- constexpr millis_t d = 0;
+ constexpr millis_t frame_time = 0;
constexpr uint8_t f = 0;
#else
- constexpr millis_t d = CUSTOM_BOOTSCREEN_FRAME_TIME;
+ #if DISABLED(CUSTOM_BOOTSCREEN_TIME_PER_FRAME)
+ constexpr millis_t frame_time = CUSTOM_BOOTSCREEN_FRAME_TIME;
+ #endif
LOOP_L_N(f, COUNT(custom_bootscreen_animation))
#endif
{
+ #if ENABLED(CUSTOM_BOOTSCREEN_TIME_PER_FRAME)
+ const uint8_t fr = _MIN(f, COUNT(custom_bootscreen_animation) - 1);
+ const boot_frame_t * const frame_info = (boot_frame_t*)pgm_read_ptr(&custom_bootscreen_animation[fr]);
+ const millis_t frame_time = pgm_read_word(&frame_info->duration);
+ #endif
u8g.firstPage();
do { draw_custom_bootscreen(f); } while (u8g.nextPage());
- if (d) safe_delay(d);
+ if (frame_time) safe_delay(frame_time);
}
#ifndef CUSTOM_BOOTSCREEN_TIMEOUT
#define CUSTOM_BOOTSCREEN_TIMEOUT 2500
#endif
- safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT);
+ #if CUSTOM_BOOTSCREEN_TIMEOUT
+ safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT);
+ #endif
}
#endif // SHOW_CUSTOM_BOOTSCREEN
@@ -210,10 +225,10 @@ bool MarlinUI::detected() { return true; }
#if DISABLED(BOOT_MARLIN_LOGO_ANIMATED)
draw_bootscreen_bmp(start_bmp);
#else
- constexpr millis_t d = MARLIN_BOOTSCREEN_FRAME_TIME;
+ constexpr millis_t frame_time = MARLIN_BOOTSCREEN_FRAME_TIME;
LOOP_L_N(f, COUNT(marlin_bootscreen_animation)) {
draw_bootscreen_bmp((uint8_t*)pgm_read_ptr(&marlin_bootscreen_animation[f]));
- if (d) safe_delay(d);
+ if (frame_time) safe_delay(frame_time);
}
#endif
}
@@ -441,20 +456,22 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
inline void draw_boxed_string(const u8g_uint_t x, const u8g_uint_t y, PGM_P const pstr, const bool inv) {
const u8g_uint_t len = utf8_strlen_P(pstr),
by = (y + 1) * (MENU_FONT_HEIGHT);
- const pixel_len_t bw = len * (MENU_FONT_WIDTH), bx = x * (MENU_FONT_WIDTH);
+ const u8g_uint_t prop = USE_WIDE_GLYPH ? 2 : 1;
+ const pixel_len_t bw = len * prop * (MENU_FONT_WIDTH), bx = x * prop * (MENU_FONT_WIDTH);
if (inv) {
u8g.setColorIndex(1);
- u8g.drawBox(bx - 1, by - (MENU_FONT_ASCENT) + 1, bw + 2, MENU_FONT_HEIGHT - 1);
+ u8g.drawBox(bx / prop - 1, by - (MENU_FONT_ASCENT) + 1, bw / prop + 2, MENU_FONT_HEIGHT - 1);
u8g.setColorIndex(0);
}
- lcd_put_u8str_P(bx, by, pstr);
+ lcd_put_u8str_P(bx / prop, by, pstr);
if (inv) u8g.setColorIndex(1);
}
void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) {
ui.draw_select_screen_prompt(pref, string, suff);
draw_boxed_string(1, LCD_HEIGHT - 1, no, !yesno);
- draw_boxed_string(LCD_WIDTH - (utf8_strlen_P(yes) + 1), LCD_HEIGHT - 1, yes, yesno);
+ const u8g_uint_t xpos = (LCD_WIDTH) / (USE_WIDE_GLYPH ? 2 : 1);
+ draw_boxed_string(xpos - (utf8_strlen_P(yes) + 1), LCD_HEIGHT - 1, yes, yesno);
}
#if ENABLED(SDSUPPORT)
@@ -527,6 +544,8 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
// Put Relevant Text on Display
+ extern const char X_LBL[], Y_LBL[], Z_LBL[];
+
// Show X and Y positions at top of screen
u8g.setColorIndex(1);
if (PAGE_UNDER(7)) {
diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h
index 29a1b7d3cff5..e5229cd08845 100644
--- a/Marlin/src/lcd/dogm/marlinui_DOGM.h
+++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h
@@ -37,7 +37,7 @@
// RepRapWorld Graphical LCD
#define U8G_CLASS U8GLIB_ST7920_128X64_4X
- #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN)
+ #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SD_SCK_PIN) && (LCD_PINS_ENABLE == SD_MOSI_PIN)
#define U8G_PARAM LCD_PINS_RS
#else
#define U8G_PARAM LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS
@@ -48,7 +48,7 @@
// RepRap Discount Full Graphics Smart Controller
// and other variant LCDs using ST7920
- #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN)
+ #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SD_SCK_PIN) && (LCD_PINS_ENABLE == SD_MOSI_PIN)
#define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.)
#define U8G_PARAM LCD_PINS_RS
#else
@@ -88,7 +88,7 @@
#define SMART_RAMPS MB(RAMPS_SMART_EFB, RAMPS_SMART_EEB, RAMPS_SMART_EFF, RAMPS_SMART_EEF, RAMPS_SMART_SF)
#define U8G_CLASS U8GLIB_64128N_2X_HAL // 4 stripes (HW-SPI)
- #if SMART_RAMPS || DOGLCD_SCK != SCK_PIN || DOGLCD_MOSI != MOSI_PIN
+ #if SMART_RAMPS || DOGLCD_SCK != SD_SCK_PIN || DOGLCD_MOSI != SD_MOSI_PIN
#define FORCE_SOFT_SPI // SW-SPI
#endif
@@ -110,11 +110,9 @@
#define U8G_CLASS U8GLIB_MINI12864_2X // 8 stripes (HW-SPI)
#endif
-#elif EITHER(MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864)
+#elif ENABLED(MKS_12864OLED_SSD1306)
// MKS 128x64 (SSD1306) OLED I2C LCD
- // - or -
- // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER
#define FORCE_SOFT_SPI // SW-SPI
@@ -124,6 +122,18 @@
#define U8G_CLASS U8GLIB_SSD1306_128X64 // 8 stripes
#endif
+#elif ENABLED(FYSETC_242_OLED_12864)
+
+ // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER
+
+ #define FORCE_SOFT_SPI // SW-SPI
+
+ #if ENABLED(ALTERNATIVE_LCD)
+ #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes
+ #else
+ #define U8G_CLASS U8GLIB_SSD1309_128X64_HAL
+ #endif
+
#elif ENABLED(ZONESTAR_12864OLED_SSD1306)
// Zonestar SSD1306 OLED SPI LCD
diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp
index 882b2fef506a..406e7b864038 100644
--- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp
+++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp
@@ -384,18 +384,12 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const
if (blink)
lcd_put_u8str(value);
- else {
- if (!TEST(axis_homed, axis))
- while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?');
- else {
- #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING)
- if (!TEST(axis_known_position, axis))
- lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" "));
- else
- #endif
- lcd_put_u8str(value);
- }
- }
+ else if (axis_should_home(axis))
+ while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?');
+ else if (NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) && !axis_is_trusted(axis))
+ lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" "));
+ else
+ lcd_put_u8str(value);
}
/**
@@ -624,7 +618,6 @@ void MarlinUI::draw_status_screen() {
if (cutter.isReady && PAGE_CONTAINS(STATUS_CUTTER_TEXT_Y - INFO_FONT_ASCENT, STATUS_CUTTER_TEXT_Y - 1)) {
#if CUTTER_UNIT_IS(PERCENT)
lcd_put_u8str(STATUS_CUTTER_TEXT_X, STATUS_CUTTER_TEXT_Y, cutter_power2str(cutter.unitPower));
- lcd_put_wchar('%');
#elif CUTTER_UNIT_IS(RPM)
lcd_put_u8str(STATUS_CUTTER_TEXT_X - 2, STATUS_CUTTER_TEXT_Y, ftostr51rj(float(cutter.unitPower) / 1000));
lcd_put_wchar('K');
@@ -710,6 +703,7 @@ void MarlinUI::draw_status_screen() {
lcd_put_u8str(estimation_x_pos, EXTRAS_BASELINE, estimation_string);
}
else if (elapsed_string[0]) {
+ extern const char E_LBL[];
lcd_put_u8str_P(PROGRESS_BAR_X, EXTRAS_BASELINE, E_LBL);
lcd_put_u8str(elapsed_x_pos, EXTRAS_BASELINE, elapsed_string);
}
@@ -898,6 +892,10 @@ void MarlinUI::draw_status_message(const bool blink) {
}
else {
// String is longer than the available space
+ if (blink != last_blink) {
+ last_blink = blink;
+ advance_status_scroll();
+ }
// Get a pointer to the next valid UTF8 character
// and the string remaining length
@@ -917,11 +915,6 @@ void MarlinUI::draw_status_message(const bool blink) {
}
}
}
-
- if (last_blink != blink) {
- last_blink = blink;
- advance_status_scroll();
- }
}
#else // !STATUS_MESSAGE_SCROLLING
diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp
index c06080f601bb..a538121d2cf6 100644
--- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp
+++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp
@@ -659,13 +659,13 @@ void ST7920_Lite_Status_Screen::draw_status_message() {
#endif
}
-void ST7920_Lite_Status_Screen::draw_position(const xyze_pos_t &pos, const bool position_known) {
+void ST7920_Lite_Status_Screen::draw_position(const xyze_pos_t &pos, const bool position_trusted) {
char str[7];
set_ddram_address(DDRAM_LINE_4);
begin_data();
// If position is unknown, flash the labels.
- const unsigned char alt_label = position_known ? 0 : (ui.get_blink() ? ' ' : 0);
+ const unsigned char alt_label = position_trusted ? 0 : (ui.get_blink() ? ' ' : 0);
if (TERN1(LCD_SHOW_E_TOTAL, !printingIsActive())) {
write_byte(alt_label ? alt_label : 'X');
@@ -831,9 +831,8 @@ void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) {
}
}
- if (countdown == 0 && (forceUpdate || position_changed()
- || TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, blink_changed())
- )) draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 1, all_axes_known()));
+ if (countdown == 0 && (forceUpdate || position_changed() || TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, blink_changed())))
+ draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 1, all_axes_trusted()));
#endif
}
@@ -855,7 +854,7 @@ void ST7920_Lite_Status_Screen::update_progress(const bool forceUpdate) {
UNUSED(forceUpdate);
- #endif // LCD_SET_PROGRESS_MANUALLY || SDSUPPORT
+ #endif
}
void ST7920_Lite_Status_Screen::update(const bool forceUpdate) {
diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp
index f97a323350ee..b3e579e6a44a 100644
--- a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp
+++ b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp
@@ -245,9 +245,8 @@ u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire = { u8g_dev_ssd1306_128x64_2x_2_w
uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq) {
uint8_t is_escape = 0;
- uint8_t value;
for (;;) {
- value = u8g_pgm_read(esc_seq);
+ uint8_t value = u8g_pgm_read(esc_seq);
if (is_escape == 0) {
if (value != 255) {
if (u8g_WriteByte(u8g, dev, value) == 0 )
diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp b/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp
new file mode 100644
index 000000000000..8ba19216b113
--- /dev/null
+++ b/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp
@@ -0,0 +1,128 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_MARLINUI_U8GLIB
+
+#include "HAL_LCD_com_defines.h"
+#include
+
+#define WIDTH 128
+#define HEIGHT 64
+#define PAGE_HEIGHT 8
+
+// SSD1309 init sequence
+static const uint8_t u8g_dev_ssd1309_128x64_init_seq[] PROGMEM = {
+ U8G_ESC_CS(0), // Disable chip
+ U8G_ESC_ADR(0), // Instruction mode
+ U8G_ESC_RST(1), // Do reset low pulse with (1*16)+2 milliseconds
+ U8G_ESC_CS(1), // Enable chip
+
+ 0xFD,0x12, // Command Lock
+ 0xAE, // Set Display Off
+ 0xD5,0xA0, // Set Display Clock Divide Ratio/Oscillator Frequency
+ 0xA8,0x3F, // Set Multiplex Ratio
+ 0x3D,0x00, // Set Display Offset
+ 0x40, // Set Display Start Line
+ 0xA1, // Set Segment Re-Map
+ 0xC8, // Set COM Output Scan Direction
+ 0xDA,0x12, // Set COM Pins Hardware Configuration
+ 0x81,0xDF, // Set Current Control
+ 0xD9,0x82, // Set Pre-Charge Period
+ 0xDB,0x34, // Set VCOMH Deselect Level
+ 0xA4, // Set Entire Display On/Off
+ 0xA6, // Set Normal/Inverse Display
+ U8G_ESC_VCC(1), // Power up VCC & Stabilized
+ U8G_ESC_DLY(50),
+ 0xAF, // Set Display On
+ U8G_ESC_DLY(50),
+ U8G_ESC_CS(0), // Disable chip
+ U8G_ESC_END // End of sequence
+};
+
+// Select one init sequence here
+#define u8g_dev_ssd1309_128x64_init_seq u8g_dev_ssd1309_128x64_init_seq
+
+static const uint8_t u8g_dev_ssd1309_128x64_data_start[] PROGMEM = {
+ U8G_ESC_ADR(0), // Instruction mode
+ U8G_ESC_CS(1), // Enable chip
+ 0x010, // Set upper 4 bit of the col adr to 0
+ 0x000, // Set lower 4 bit of the col adr to 4
+ U8G_ESC_END // End of sequence
+};
+
+static const uint8_t u8g_dev_ssd13xx_sleep_on[] PROGMEM = {
+ U8G_ESC_ADR(0), // Instruction mode
+ U8G_ESC_CS(1), // Enable chip
+ 0x0AE, // Display off
+ U8G_ESC_CS(0), // Disable chip
+ U8G_ESC_END // End of sequence
+};
+
+static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = {
+ U8G_ESC_ADR(0), // Instruction mode
+ U8G_ESC_CS(1), // Enable chip
+ 0x0AF, // Display on
+ U8G_ESC_DLY(50), // Delay 50 ms
+ U8G_ESC_CS(0), // Disable chip
+ U8G_ESC_END // End of sequence
+};
+
+uint8_t u8g_dev_ssd1309_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
+ switch(msg) {
+ case U8G_DEV_MSG_INIT:
+ u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS);
+ u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1309_128x64_init_seq);
+ break;
+ case U8G_DEV_MSG_STOP:
+ break;
+ case U8G_DEV_MSG_PAGE_NEXT: {
+ u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
+ u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1309_128x64_data_start);
+ u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); // Select current page (SSD1306)
+ u8g_SetAddress(u8g, dev, 1); // Data mode
+ if (u8g_pb_WriteBuffer(pb, u8g, dev) == 0) return 0;
+ u8g_SetChipSelect(u8g, dev, 0);
+ }
+ break;
+ case U8G_DEV_MSG_CONTRAST:
+ u8g_SetChipSelect(u8g, dev, 1);
+ u8g_SetAddress(u8g, dev, 0); // Instruction mode
+ u8g_WriteByte(u8g, dev, 0x081);
+ u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); // 11 Jul 2015: fixed contrast calculation
+ u8g_SetChipSelect(u8g, dev, 0);
+ return 1;
+ case U8G_DEV_MSG_SLEEP_ON:
+ u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
+ return 1;
+ case U8G_DEV_MSG_SLEEP_OFF:
+ u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
+ return 1;
+ }
+ return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
+}
+
+uint8_t u8g_dev_ssd1309_buf[WIDTH*2] U8G_NOCOMMON ;
+u8g_pb_t u8g_dev_ssd1309_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1309_buf};
+u8g_dev_t u8g_dev_ssd1309_sw_spi = { u8g_dev_ssd1309_128x64_fn, &u8g_dev_ssd1309_pb, U8G_COM_HAL_SW_SPI_FN };
+
+#endif // HAS_MARLINUI_U8GLIB
diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp
index 600d7e3faa37..7f88df7bc41f 100644
--- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp
+++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp
@@ -339,6 +339,8 @@ static uint8_t page;
}
#endif // HAS_TOUCH_BUTTONS
+static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT
+
uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
@@ -352,19 +354,21 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
switch (msg) {
case U8G_DEV_MSG_INIT:
dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, nullptr);
- tftio.Init();
- tftio.InitTFT();
- TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset());
if (preinit) {
preinit = false;
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
}
+ if (msgInitCount) return -1;
+ tftio.Init();
+ tftio.InitTFT();
+ TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset());
+
// Clear Screen
setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1);
#if HAS_LCD_IO
- tftio.WriteMultiple(TFT_MARLINBG_COLOR, uint32_t(TFT_WIDTH) * (TFT_HEIGHT));
+ tftio.WriteMultiple(TFT_MARLINBG_COLOR, (TFT_WIDTH) * (TFT_HEIGHT));
#else
memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2);
for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++)
@@ -420,8 +424,6 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
}
-static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT
-
uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
if (msgInitCount) {
if (msg == U8G_COM_MSG_INIT) msgInitCount--;
@@ -433,8 +435,6 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p
switch (msg) {
case U8G_COM_MSG_STOP: break;
case U8G_COM_MSG_INIT:
- u8g_SetPIOutput(u8g, U8G_PI_RESET);
- u8g_Delay(50);
isCommand = 0;
break;
@@ -443,7 +443,6 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p
break;
case U8G_COM_MSG_RESET:
- u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
break;
case U8G_COM_MSG_WRITE_BYTE:
@@ -525,6 +524,11 @@ U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT,
lcd_put_u8str(0, LCD_PIXEL_HEIGHT / 2, str);
} while (u8g.nextPage());
drawing_screen = false;
+ safe_delay(250);
+ if (calibration_stage == CALIBRATION_SUCCESS) {
+ safe_delay(500);
+ ui.goto_previous_screen();
+ }
}
#endif // TOUCH_SCREEN_CALIBRATION
diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp
index 7d1528bed19b..1978c6a4f801 100644
--- a/Marlin/src/lcd/dwin/dwin_lcd.cpp
+++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp
@@ -82,20 +82,27 @@ inline void DWIN_String(size_t &i, const __FlashStringHelper * string) {
// Send the data in the buffer and the packet end
inline void DWIN_Send(size_t &i) {
++i;
- LOOP_L_N(n, i) { MYSERIAL1.write(DWIN_SendBuf[n]); delayMicroseconds(1); }
- LOOP_L_N(n, 4) { MYSERIAL1.write(DWIN_BufTail[n]); delayMicroseconds(1); }
+ LOOP_L_N(n, i) { LCD_SERIAL.write(DWIN_SendBuf[n]); delayMicroseconds(1); }
+ LOOP_L_N(n, 4) { LCD_SERIAL.write(DWIN_BufTail[n]); delayMicroseconds(1); }
}
/*-------------------------------------- System variable function --------------------------------------*/
// Handshake (1: Success, 0: Fail)
bool DWIN_Handshake(void) {
+ #ifndef LCD_BAUDRATE
+ #define LCD_BAUDRATE 115200
+ #endif
+ LCD_SERIAL.begin(LCD_BAUDRATE);
+ const millis_t serial_connect_timeout = millis() + 1000UL;
+ while (!LCD_SERIAL && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
+
size_t i = 0;
DWIN_Byte(i, 0x00);
DWIN_Send(i);
- while (MYSERIAL1.available() > 0 && recnum < (signed)sizeof(databuf)) {
- databuf[recnum] = MYSERIAL1.read();
+ while (LCD_SERIAL.available() > 0 && recnum < (signed)sizeof(databuf)) {
+ databuf[recnum] = LCD_SERIAL.read();
// ignore the invalid data
if (databuf[0] != FHONE) { // prevent the program from running.
if (recnum > 0) {
diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp
index fe2397fa6b42..b872ce32aa07 100644
--- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp
+++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp
@@ -86,7 +86,7 @@
#endif
#ifndef MACHINE_SIZE
- #define MACHINE_SIZE "220x220x250"
+ #define MACHINE_SIZE STRINGIFY(X_BED_SIZE) "x" STRINGIFY(Y_BED_SIZE) "x" STRINGIFY(Z_MAX_POS)
#endif
#ifndef CORP_WEBSITE_C
#define CORP_WEBSITE_C "www.cxsw3d.com"
@@ -185,8 +185,10 @@ bool dwin_abort_flag = false; // Flag to reset feedrate, return to Home
constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE;
constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION;
-constexpr float default_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK };
-constexpr float default_axis_steps_per_unit[] = DEFAULT_AXIS_STEPS_PER_UNIT;
+
+#if HAS_CLASSIC_JERK
+ constexpr float default_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK };
+#endif
uint8_t Percentrecord = 0;
uint16_t remain_time = 0;
@@ -214,7 +216,7 @@ void HMI_SetLanguageCache() {
}
void HMI_SetLanguage() {
- #if ENABLED(EEPROM_SETTINGS)
+ #if BOTH(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM)
BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language));
#endif
HMI_SetLanguageCache();
@@ -223,7 +225,7 @@ void HMI_SetLanguage() {
void HMI_ToggleLanguage() {
HMI_flag.language = HMI_IsChinese() ? DWIN_ENGLISH : DWIN_CHINESE;
HMI_SetLanguageCache();
- #if ENABLED(EEPROM_SETTINGS)
+ #if BOTH(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM)
BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language));
#endif
}
@@ -500,9 +502,7 @@ inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, auto &valr
valref += EncoderRate.encoderMoveValue;
else if (encoder_diffState == ENCODER_DIFF_CCW)
valref -= EncoderRate.encoderMoveValue;
- else if (encoder_diffState == ENCODER_DIFF_ENTER)
- return true;
- return false;
+ return encoder_diffState == ENCODER_DIFF_ENTER;
}
//
@@ -727,14 +727,14 @@ inline void Draw_Control_Menu() {
else {
#ifdef USE_STRING_HEADINGS
Draw_Title(GET_TEXT_F(MSG_CONTROL));
- DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE));
- DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION));
+ DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE));
+ DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION));
#if ENABLED(EEPROM_SETTINGS)
- DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM));
- DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM));
- DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS));
+ DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM));
+ DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM));
+ DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS));
#endif
- if (CVISI(CONTROL_CASE_INFO)) DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_INFO), F("Info"));
+ if (CVISI(CONTROL_CASE_INFO)) DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_INFO), F("Info"));
#else
DWIN_Frame_TitleCopy(1, 128, 2, 176, 12); // "Control"
DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature >
@@ -1164,7 +1164,7 @@ void HMI_Move_X() {
if (!planner.is_full()) {
// Wait for planner moves to finish!
planner.synchronize();
- planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_XY), active_extruder);
+ planner.buffer_line(current_position, homing_feedrate(X_AXIS), active_extruder);
}
DWIN_UpdateLCD();
return;
@@ -1187,7 +1187,7 @@ void HMI_Move_Y() {
if (!planner.is_full()) {
// Wait for planner moves to finish!
planner.synchronize();
- planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_XY), active_extruder);
+ planner.buffer_line(current_position, homing_feedrate(Y_AXIS), active_extruder);
}
DWIN_UpdateLCD();
return;
@@ -1210,7 +1210,7 @@ void HMI_Move_Z() {
if (!planner.is_full()) {
// Wait for planner moves to finish!
planner.synchronize();
- planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_Z), active_extruder);
+ planner.buffer_line(current_position, homing_feedrate(Z_AXIS), active_extruder);
}
DWIN_UpdateLCD();
return;
@@ -1281,8 +1281,7 @@ void HMI_Move_Z() {
last_zoffset = dwin_zoffset;
dwin_zoffset = HMI_ValueStruct.offset_value / 100.0f;
#if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP)
- if ( (ENABLED(BABYSTEP_WITHOUT_HOMING) || all_axes_known()) && (ENABLED(BABYSTEP_ALWAYS_AVAILABLE) || printer_busy()) )
- babystep.add_mm(Z_AXIS, dwin_zoffset - last_zoffset);
+ if (BABYSTEP_ALLOWED()) babystep.add_mm(Z_AXIS, dwin_zoffset - last_zoffset);
#endif
DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(zoff_line), HMI_ValueStruct.offset_value);
DWIN_UpdateLCD();
@@ -1494,8 +1493,8 @@ void HMI_MaxAccelerationXYZE() {
if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Jerk)) {
checkkey = MaxJerk;
EncoderRate.enabled = false;
- if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS))
- planner.set_max_jerk(HMI_flag.step_axis, HMI_ValueStruct.Max_Jerk / 10);
+ if (WITHIN(HMI_flag.jerk_axis, X_AXIS, E_AXIS))
+ planner.set_max_jerk(HMI_flag.jerk_axis, HMI_ValueStruct.Max_Jerk / 10);
DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk);
return;
}
@@ -1523,7 +1522,7 @@ void HMI_StepXYZE() {
}
// Step limit
if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS))
- NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[HMI_flag.step_axis] * 2 * MINUNITMULT);
+ NOMORE(HMI_ValueStruct.Max_Step, 999.9 * MINUNITMULT);
NOLESS(HMI_ValueStruct.Max_Step, MIN_STEP);
// Step value
DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step);
@@ -1689,7 +1688,7 @@ inline void Draw_SDItem(const uint16_t item, int16_t row=-1) {
return;
}
- card.getfilename_sorted(item - is_subdir);
+ card.getfilename_sorted(SD_ORDER(item - is_subdir, card.get_num_Files()));
char * const name = card.longest_filename();
#if ENABLED(SCROLL_LONG_FILENAMES)
@@ -2322,9 +2321,9 @@ void HMI_Prepare() {
DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), current_position.y * MINUNITMULT);
DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), current_position.z * MINUNITMULT);
#if HAS_HOTEND
- queue.inject_P(PSTR("G92 E0"));
- current_position.e = HMI_ValueStruct.Move_E_scale = 0;
- DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0);
+ current_position.e = HMI_ValueStruct.Move_E_scale = 0.0;
+ sync_plan_position_e();
+ DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0.0);
#endif
break;
case PREPARE_CASE_DISA: // Disable steppers
@@ -2333,7 +2332,7 @@ void HMI_Prepare() {
case PREPARE_CASE_HOME: // Homing
checkkey = Last_Prepare;
index_prepare = MROWS;
- queue.inject_P(PSTR("G28")); // G28 will set home_flag
+ queue.inject_P(G28_STR); // G28 will set home_flag
Popup_Window_Home();
break;
#if HAS_ZOFFSET_ITEM
@@ -2575,6 +2574,7 @@ void HMI_AxisMove() {
if (encoder_diffState == ENCODER_DIFF_ENTER) {
HMI_flag.ETempTooLow_flag = false;
current_position.e = HMI_ValueStruct.Move_E_scale = 0;
+ sync_plan_position_e();
Draw_Move_Menu();
DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale);
DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale);
@@ -2957,75 +2957,77 @@ inline void Draw_Max_Accel_Menu() {
#endif
}
-inline void Draw_Max_Jerk_Menu() {
- Clear_Main_Window();
+#if HAS_CLASSIC_JERK
+ inline void Draw_Max_Jerk_Menu() {
+ Clear_Main_Window();
- if (HMI_IsChinese()) {
- DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Jerk"
-
- DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(1));
- DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(1) + 1);
- DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(1));
- DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 83, MBASE(1)); // Max Jerk speed X
- DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(2));
- DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(2) + 1);
- DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(2));
- DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 83, MBASE(2) + 3); // Max Jerk speed Y
- DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(3));
- DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(3) + 1);
- DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(3));
- DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 83, MBASE(3) + 3); // Max Jerk speed Z
- #if HAS_HOTEND
- DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(4));
- DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(4) + 1);
- DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(4));
- DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 83, MBASE(4) + 3); // Max Jerk speed E
- #endif
- }
- else {
- #ifdef USE_STRING_HEADINGS
- Draw_Title(GET_TEXT_F(MSG_JERK));
- DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Jerk X"));
- DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Jerk Y"));
- DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Jerk Z"));
+ if (HMI_IsChinese()) {
+ DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Jerk"
+
+ DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(1));
+ DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(1) + 1);
+ DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(1));
+ DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 83, MBASE(1)); // Max Jerk speed X
+ DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(2));
+ DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(2) + 1);
+ DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(2));
+ DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 83, MBASE(2) + 3); // Max Jerk speed Y
+ DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(3));
+ DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(3) + 1);
+ DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(3));
+ DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 83, MBASE(3) + 3); // Max Jerk speed Z
#if HAS_HOTEND
- DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Jerk E"));
+ DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(4));
+ DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(4) + 1);
+ DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(4));
+ DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 83, MBASE(4) + 3); // Max Jerk speed E
#endif
- #else
- DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Jerk"
- draw_max_en(MBASE(1)); // "Max"
- draw_jerk_en(MBASE(1)); // "Jerk"
- draw_speed_en(72, MBASE(1)); // "Speed"
- say_x(115, MBASE(1)); // "X"
-
- draw_max_en(MBASE(2)); // "Max"
- draw_jerk_en(MBASE(2)); // "Jerk"
- draw_speed_en(72, MBASE(2)); // "Speed"
- say_y(115, MBASE(2)); // "Y"
-
- draw_max_en(MBASE(3)); // "Max"
- draw_jerk_en(MBASE(3)); // "Jerk"
- draw_speed_en(72, MBASE(3)); // "Speed"
- say_z(115, MBASE(3)); // "Z"
+ }
+ else {
+ #ifdef USE_STRING_HEADINGS
+ Draw_Title(GET_TEXT_F(MSG_JERK));
+ DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Jerk X"));
+ DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Jerk Y"));
+ DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Jerk Z"));
+ #if HAS_HOTEND
+ DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Jerk E"));
+ #endif
+ #else
+ DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Jerk"
+ draw_max_en(MBASE(1)); // "Max"
+ draw_jerk_en(MBASE(1)); // "Jerk"
+ draw_speed_en(72, MBASE(1)); // "Speed"
+ say_x(115, MBASE(1)); // "X"
+
+ draw_max_en(MBASE(2)); // "Max"
+ draw_jerk_en(MBASE(2)); // "Jerk"
+ draw_speed_en(72, MBASE(2)); // "Speed"
+ say_y(115, MBASE(2)); // "Y"
+
+ draw_max_en(MBASE(3)); // "Max"
+ draw_jerk_en(MBASE(3)); // "Jerk"
+ draw_speed_en(72, MBASE(3)); // "Speed"
+ say_z(115, MBASE(3)); // "Z"
- #if HAS_HOTEND
- draw_max_en(MBASE(4)); // "Max"
- draw_jerk_en(MBASE(4)); // "Jerk"
- draw_speed_en(72, MBASE(4)); // "Speed"
- say_e(115, MBASE(4)); // "E"
+ #if HAS_HOTEND
+ draw_max_en(MBASE(4)); // "Max"
+ draw_jerk_en(MBASE(4)); // "Jerk"
+ draw_speed_en(72, MBASE(4)); // "Speed"
+ say_e(115, MBASE(4)); // "E"
+ #endif
#endif
+ }
+
+ Draw_Back_First();
+ LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i);
+ DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT);
+ DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT);
+ DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT);
+ #if HAS_HOTEND
+ DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT);
#endif
}
-
- Draw_Back_First();
- LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i);
- DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT);
- DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT);
- DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT);
- #if HAS_HOTEND
- DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT);
- #endif
-}
+#endif
inline void Draw_Steps_Menu() {
Clear_Main_Window();
@@ -3638,7 +3640,9 @@ void DWIN_HandleScreen() {
#endif
case MaxSpeed: HMI_MaxSpeed(); break;
case MaxAcceleration: HMI_MaxAcceleration(); break;
- case MaxJerk: HMI_MaxJerk(); break;
+ #if HAS_CLASSIC_JERK
+ case MaxJerk: HMI_MaxJerk(); break;
+ #endif
case Step: HMI_Step(); break;
case Move_X: HMI_Move_X(); break;
case Move_Y: HMI_Move_Y(); break;
@@ -3659,7 +3663,9 @@ void DWIN_HandleScreen() {
case PrintSpeed: HMI_PrintSpeed(); break;
case MaxSpeed_value: HMI_MaxFeedspeedXYZE(); break;
case MaxAcceleration_value: HMI_MaxAccelerationXYZE(); break;
- case MaxJerk_value: HMI_MaxJerkXYZE(); break;
+ #if HAS_CLASSIC_JERK
+ case MaxJerk_value: HMI_MaxJerkXYZE(); break;
+ #endif
case Step_value: HMI_StepXYZE(); break;
default: break;
}
diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h
index 5bff2e9f7890..5656d67e9a6e 100644
--- a/Marlin/src/lcd/dwin/e3v2/dwin.h
+++ b/Marlin/src/lcd/dwin/e3v2/dwin.h
@@ -249,7 +249,7 @@ typedef struct {
float Move_E_scale = 0;
#endif
float offset_value = 0;
- char show_mode = 0; // -1: Temperature control 0: Printing temperature
+ int8_t show_mode = 0; // -1: Temperature control 0: Printing temperature
} HMI_value_t;
#define DWIN_CHINESE 123
@@ -369,5 +369,7 @@ void DWIN_Update();
void EachMomentUpdate();
void DWIN_HandleScreen();
+inline void DWIN_StartHoming() { HMI_flag.home_flag = true; }
+
void DWIN_CompletedHoming();
void DWIN_CompletedLeveling();
diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp
index d39c6cfbd5e8..6c229b7aca22 100644
--- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp
+++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp
@@ -33,6 +33,7 @@
#if ENABLED(DWIN_CREALITY_LCD)
#include "rotary_encoder.h"
+#include "../../buttons.h"
#include "../../../MarlinCore.h"
#include "../../../HAL/shared/Delay.h"
@@ -43,17 +44,23 @@
#include
+#ifndef ENCODER_PULSES_PER_STEP
+ #define ENCODER_PULSES_PER_STEP 4
+#endif
+
ENCODER_Rate EncoderRate;
// Buzzer
-void Encoder_tick(void) {
- WRITE(BEEPER_PIN, 1);
- delay(10);
- WRITE(BEEPER_PIN, 0);
+void Encoder_tick() {
+ #if PIN_EXISTS(BEEPER)
+ WRITE(BEEPER_PIN, HIGH);
+ delay(10);
+ WRITE(BEEPER_PIN, LOW);
+ #endif
}
// Encoder initialization
-void Encoder_Configuration(void) {
+void Encoder_Configuration() {
#if BUTTON_EXISTS(EN1)
SET_INPUT_PULLUP(BTN_EN1);
#endif
@@ -63,21 +70,21 @@ void Encoder_Configuration(void) {
#if BUTTON_EXISTS(ENC)
SET_INPUT_PULLUP(BTN_ENC);
#endif
- #ifdef BEEPER_PIN
+ #if PIN_EXISTS(BEEPER)
SET_OUTPUT(BEEPER_PIN);
#endif
}
// Analyze encoder value and return state
-ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
+ENCODER_DiffState Encoder_ReceiveAnalyze() {
const millis_t now = millis();
- static unsigned char lastEncoderBits;
- unsigned char newbutton = 0;
+ static uint8_t lastEncoderBits;
+ uint8_t newbutton = 0;
static signed char temp_diff = 0;
ENCODER_DiffState temp_diffState = ENCODER_DIFF_NO;
- if (BUTTON_PRESSED(EN1)) newbutton |= 0x01;
- if (BUTTON_PRESSED(EN2)) newbutton |= 0x02;
+ if (BUTTON_PRESSED(EN1)) newbutton |= EN_A;
+ if (BUTTON_PRESSED(EN2)) newbutton |= EN_B;
if (BUTTON_PRESSED(ENC)) {
static millis_t next_click_update_ms;
if (ELAPSED(now, next_click_update_ms)) {
@@ -94,22 +101,22 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
}
if (newbutton != lastEncoderBits) {
switch (newbutton) {
- case ENCODER_PHASE_0: {
- if (lastEncoderBits == ENCODER_PHASE_3) temp_diff++;
+ case ENCODER_PHASE_0:
+ if (lastEncoderBits == ENCODER_PHASE_3) temp_diff++;
else if (lastEncoderBits == ENCODER_PHASE_1) temp_diff--;
- }break;
- case ENCODER_PHASE_1: {
- if (lastEncoderBits == ENCODER_PHASE_0) temp_diff++;
+ break;
+ case ENCODER_PHASE_1:
+ if (lastEncoderBits == ENCODER_PHASE_0) temp_diff++;
else if (lastEncoderBits == ENCODER_PHASE_2) temp_diff--;
- }break;
- case ENCODER_PHASE_2: {
- if (lastEncoderBits == ENCODER_PHASE_1) temp_diff++;
+ break;
+ case ENCODER_PHASE_2:
+ if (lastEncoderBits == ENCODER_PHASE_1) temp_diff++;
else if (lastEncoderBits == ENCODER_PHASE_3) temp_diff--;
- }break;
- case ENCODER_PHASE_3: {
- if (lastEncoderBits == ENCODER_PHASE_2) temp_diff++;
+ break;
+ case ENCODER_PHASE_3:
+ if (lastEncoderBits == ENCODER_PHASE_2) temp_diff++;
else if (lastEncoderBits == ENCODER_PHASE_0) temp_diff--;
- }break;
+ break;
}
lastEncoderBits = newbutton;
}
@@ -137,9 +144,12 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
}
EncoderRate.lastEncoderTime = ms;
}
+
#else
+
constexpr int32_t encoderMultiplier = 1;
- #endif // ENCODER_RATE_MULTIPLIER
+
+ #endif
// EncoderRate.encoderMoveValue += (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP);
EncoderRate.encoderMoveValue = (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP);
@@ -153,23 +163,23 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
#if PIN_EXISTS(LCD_LED)
// Take the low 24 valid bits 24Bit: G7 G6 G5 G4 G3 G2 G1 G0 R7 R6 R5 R4 R3 R2 R1 R0 B7 B6 B5 B4 B3 B2 B1 B0
- unsigned int LED_DataArray[LED_NUM];
+ uint16_t LED_DataArray[LED_NUM];
// LED light operation
- void LED_Action(void) {
+ void LED_Action() {
LED_Control(RGB_SCALE_WARM_WHITE,0x0F);
delay(30);
LED_Control(RGB_SCALE_WARM_WHITE,0x00);
}
// LED initialization
- void LED_Configuration(void) {
+ void LED_Configuration() {
SET_OUTPUT(LCD_LED_PIN);
}
// LED write data
- void LED_WriteData(void) {
- unsigned char tempCounter_LED, tempCounter_Bit;
+ void LED_WriteData() {
+ uint8_t tempCounter_LED, tempCounter_Bit;
for (tempCounter_LED = 0; tempCounter_LED < LED_NUM; tempCounter_LED++) {
for (tempCounter_Bit = 0; tempCounter_Bit < 24; tempCounter_Bit++) {
if (LED_DataArray[tempCounter_LED] & (0x800000 >> tempCounter_Bit)) {
@@ -190,14 +200,13 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
// LED control
// RGB_Scale: RGB color ratio
// luminance: brightness (0~0xFF)
- void LED_Control(unsigned char RGB_Scale, unsigned char luminance) {
- unsigned char temp_Counter;
- for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) {
- LED_DataArray[temp_Counter] = 0;
+ void LED_Control(const uint8_t RGB_Scale, const uint8_t luminance) {
+ for (uint8_t i = 0; i < LED_NUM; i++) {
+ LED_DataArray[i] = 0;
switch (RGB_Scale) {
- case RGB_SCALE_R10_G7_B5: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*5/10; break;
- case RGB_SCALE_R10_G7_B4: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*4/10; break;
- case RGB_SCALE_R10_G8_B7: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*8/10) << 16 | luminance*7/10; break;
+ case RGB_SCALE_R10_G7_B5: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 7/10) << 16 | luminance * 5/10; break;
+ case RGB_SCALE_R10_G7_B4: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 7/10) << 16 | luminance * 4/10; break;
+ case RGB_SCALE_R10_G8_B7: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 8/10) << 16 | luminance * 7/10; break;
}
}
LED_WriteData();
@@ -207,45 +216,38 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
// RGB_Scale: RGB color ratio
// luminance: brightness (0~0xFF)
// change_Time: gradient time (ms)
- void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval) {
- unsigned char temp_Counter;
- unsigned char LED_R_Data[LED_NUM], LED_G_Data[LED_NUM], LED_B_Data[LED_NUM];
- bool LED_R_Flag = 0, LED_G_Flag = 0, LED_B_Flag = 0;
-
- for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) {
+ void LED_GraduallyControl(const uint8_t RGB_Scale, const uint8_t luminance, const uint16_t change_Interval) {
+ struct { uint8_t g, r, b; } led_data[LED_NUM];
+ for (uint8_t i = 0; i < LED_NUM; i++) {
switch (RGB_Scale) {
- case RGB_SCALE_R10_G7_B5: {
- LED_R_Data[temp_Counter] = luminance*10/10;
- LED_G_Data[temp_Counter] = luminance*7/10;
- LED_B_Data[temp_Counter] = luminance*5/10;
- }break;
- case RGB_SCALE_R10_G7_B4: {
- LED_R_Data[temp_Counter] = luminance*10/10;
- LED_G_Data[temp_Counter] = luminance*7/10;
- LED_B_Data[temp_Counter] = luminance*4/10;
- }break;
- case RGB_SCALE_R10_G8_B7: {
- LED_R_Data[temp_Counter] = luminance*10/10;
- LED_G_Data[temp_Counter] = luminance*8/10;
- LED_B_Data[temp_Counter] = luminance*7/10;
- }break;
+ case RGB_SCALE_R10_G7_B5:
+ led_data[i] = { luminance * 7/10, luminance * 10/10, luminance * 5/10 };
+ break;
+ case RGB_SCALE_R10_G7_B4:
+ led_data[i] = { luminance * 7/10, luminance * 10/10, luminance * 4/10 };
+ break;
+ case RGB_SCALE_R10_G8_B7:
+ led_data[i] = { luminance * 8/10, luminance * 10/10, luminance * 7/10 };
+ break;
}
}
- for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) {
- if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) > LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000100;
- else if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) < LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000100;
- while (1) {
- else LED_R_Flag = 1;
- if ((unsigned char)(LED_DataArray[temp_Counter]>>16) > LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x010000;
- else if ((unsigned char)(LED_DataArray[temp_Counter]>>16) < LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x010000;
- else LED_G_Flag = 1;
- if ((unsigned char)LED_DataArray[temp_Counter] > LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000001;
- else if ((unsigned char)LED_DataArray[temp_Counter] < LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000001;
- else LED_B_Flag = 1;
+
+ struct { bool g, r, b; } led_flag = { false, false, false };
+ for (uint8_t i = 0; i < LED_NUM; i++) {
+ while (1) {
+ const uint8_t g = uint8_t(LED_DataArray[i] >> 16),
+ r = uint8_t(LED_DataArray[i] >> 8),
+ b = uint8_t(LED_DataArray[i]);
+ if (g == led_data[i].g) led_flag.g = true;
+ else LED_DataArray[i] += (g > led_data[i].g) ? -0x010000 : 0x010000;
+ if (r == led_data[i].r) led_flag.r = true;
+ else LED_DataArray[i] += (r > led_data[i].r) ? -0x000100 : 0x000100;
+ if (b == led_data[i].b) led_flag.b = true;
+ else LED_DataArray[i] += (b > led_data[i].b) ? -0x000001 : 0x000001;
+ LED_WriteData();
+ if (led_flag.r && led_flag.g && led_flag.b) break;
+ delay(change_Interval);
}
- LED_WriteData();
- if (LED_R_Flag && LED_G_Flag && LED_B_Flag) break;
- else delay(change_Interval);
}
}
diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h
index 93e54839d625..7de80dfe01ca 100644
--- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h
+++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h
@@ -30,19 +30,9 @@
****************************************************************************/
#include "../../../inc/MarlinConfig.h"
-#include "../../../MarlinCore.h"
/*********************** Encoder Set ***********************/
-#define ENCODER_PHASE_0 0
-#define ENCODER_PHASE_1 2
-#define ENCODER_PHASE_2 3
-#define ENCODER_PHASE_3 1
-
-#define ENCODER_PULSES_PER_STEP 4
-
-#define BUTTON_PRESSED(BN) !READ(BTN_## BN)
-
typedef struct {
bool enabled = false;
int encoderMoveValue = 0;
@@ -59,10 +49,10 @@ typedef enum {
} ENCODER_DiffState;
// Encoder initialization
-void Encoder_Configuration(void);
+void Encoder_Configuration();
// Analyze encoder value and return state
-ENCODER_DiffState Encoder_ReceiveAnalyze(void);
+ENCODER_DiffState Encoder_ReceiveAnalyze();
/*********************** Encoder LED ***********************/
@@ -82,23 +72,23 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void);
extern unsigned int LED_DataArray[LED_NUM];
// LED light operation
- void LED_Action(void);
+ void LED_Action();
// LED initialization
- void LED_Configuration(void);
+ void LED_Configuration();
// LED write data
- void LED_WriteData(void);
+ void LED_WriteData();
// LED control
// RGB_Scale: RGB color ratio
// luminance: brightness (0~0xFF)
- void LED_Control(unsigned char RGB_Scale, unsigned char luminance);
+ void LED_Control(const uint8_t RGB_Scale, const uint8_t luminance);
// LED gradient control
// RGB_Scale: RGB color ratio
// luminance: brightness (0~0xFF)
// change_Time: gradient time (ms)
- void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval);
+ void LED_GraduallyControl(const uint8_t RGB_Scale, const uint8_t luminance, const uint16_t change_Interval);
#endif // LCD_LED
diff --git a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp
index a7f9a7a0c3e3..06baa4c19d11 100644
--- a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp
+++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp
@@ -62,6 +62,10 @@ namespace ExtUI {
void onUserConfirmRequired(const char * const msg) { Chiron.ConfirmationRequest(msg); }
void onStatusChanged(const char * const msg) { Chiron.StatusChange(msg); }
+ void onHomingStart() {}
+ void onHomingComplete() {}
+ void onPrintFinished() {}
+
void onFactoryReset() {}
void onStoreSettings(char *buff) {
@@ -95,6 +99,8 @@ namespace ExtUI {
}
#if HAS_MESH
+ void onMeshLevelingStart() {}
+
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {
// Called when any mesh points are updated
//SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval);
@@ -116,6 +122,9 @@ namespace ExtUI {
// Called for temperature PID tuning result
}
#endif
+
+ void onSteppersDisabled() {}
+ void onSteppersEnabled() {}
}
#endif // ANYCUBIC_LCD_CHIRON
diff --git a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp
index 15526d16fc21..e2bd96068ceb 100644
--- a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp
+++ b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp
@@ -52,6 +52,11 @@ namespace ExtUI {
void onFilamentRunout(const extruder_t extruder) { AnycubicTFT.OnFilamentRunout(); }
void onUserConfirmRequired(const char * const msg) { AnycubicTFT.OnUserConfirmRequired(msg); }
void onStatusChanged(const char * const msg) {}
+
+ void onHomingStart() {}
+ void onHomingComplete() {}
+ void onPrintFinished() {}
+
void onFactoryReset() {}
void onStoreSettings(char *buff) {
@@ -84,9 +89,14 @@ namespace ExtUI {
// whether successful or not.
}
- void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {
- // Called when any mesh points are updated
- }
+ #if HAS_MESH
+
+ void onMeshLevelingStart() {}
+
+ void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {
+ // Called when any mesh points are updated
+ }
+ #endif
#if ENABLED(POWER_LOSS_RECOVERY)
void onPowerLossResume() {
@@ -99,6 +109,9 @@ namespace ExtUI {
// Called for temperature PID tuning result
}
#endif
+
+ void onSteppersDisabled() {}
+ void onSteppersEnabled() {}
}
#endif // ANYCUBIC_LCD_I3MEGA
diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp
index d175b5acac9a..33d8bd4d89e2 100644
--- a/Marlin/src/lcd/extui/dgus_lcd.cpp
+++ b/Marlin/src/lcd/extui/dgus_lcd.cpp
@@ -76,7 +76,12 @@ namespace ExtUI {
void onStatusChanged(const char * const msg) { ScreenHandler.setstatusmessage(msg); }
+ void onHomingStart() {}
+ void onHomingComplete() {}
+ void onPrintFinished() {}
+
void onFactoryReset() {}
+
void onStoreSettings(char *buff) {
// Called when saving to EEPROM (i.e. M500). If the ExtUI needs
// permanent data to be stored, it can write up to eeprom_data_size bytes
@@ -108,6 +113,8 @@ namespace ExtUI {
}
#if HAS_MESH
+ void onMeshLevelingStart() {}
+
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {
// Called when any mesh points are updated
}
@@ -146,5 +153,8 @@ namespace ExtUI {
}
#endif
+ void onSteppersDisabled() {}
+ void onSteppersEnabled() {}
}
+
#endif // HAS_DGUS_LCD
diff --git a/Marlin/src/lcd/extui/example.cpp b/Marlin/src/lcd/extui/example.cpp
index 592d67214d07..dd4b3312eb95 100644
--- a/Marlin/src/lcd/extui/example.cpp
+++ b/Marlin/src/lcd/extui/example.cpp
@@ -47,9 +47,9 @@ namespace ExtUI {
}
void onIdle() {}
void onPrinterKilled(PGM_P const error, PGM_P const component) {}
- void onMediaInserted() {};
- void onMediaError() {};
- void onMediaRemoved() {};
+ void onMediaInserted() {}
+ void onMediaError() {}
+ void onMediaRemoved() {}
void onPlayTone(const uint16_t frequency, const uint16_t duration) {}
void onPrintTimerStarted() {}
void onPrintTimerPaused() {}
@@ -57,6 +57,11 @@ namespace ExtUI {
void onFilamentRunout(const extruder_t extruder) {}
void onUserConfirmRequired(const char * const msg) {}
void onStatusChanged(const char * const msg) {}
+
+ void onHomingStart() {}
+ void onHomingComplete() {}
+ void onPrintFinished() {}
+
void onFactoryReset() {}
void onStoreSettings(char *buff) {
@@ -90,6 +95,8 @@ namespace ExtUI {
}
#if HAS_MESH
+ void onMeshLevelingStart() {}
+
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {
// Called when any mesh points are updated
}
@@ -110,6 +117,9 @@ namespace ExtUI {
// Called for temperature PID tuning result
}
#endif
+
+ void onSteppersDisabled() {}
+ void onSteppersEnabled() {}
}
#endif // EXTUI_EXAMPLE && EXTENSIBLE_UI
diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp
index fb4c84abb485..19f8ec81bc5b 100644
--- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp
+++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp
@@ -44,6 +44,8 @@ using namespace ExtUI;
namespace Anycubic {
+ FileNavigator filenavigator;
+
FileList FileNavigator::filelist; // Instance of the Marlin file API
char FileNavigator::currentfoldername[MAX_PATH_LEN]; // Current folder path
uint16_t FileNavigator::lastindex;
diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp
index 226fb7291e28..61057b5b10e7 100644
--- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp
+++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp
@@ -54,6 +54,8 @@ namespace Anycubic {
float ChironTFT::live_Zoffset;
file_menu_t ChironTFT::file_menu;
+ ChironTFT Chiron;
+
ChironTFT::ChironTFT(){}
void ChironTFT::Startup() {
@@ -86,9 +88,9 @@ namespace Anycubic {
safe_delay(200);
- // Enable levelling and Disable end stops during print
+ // Enable leveling and Disable end stops during print
// as Z home places nozzle above the bed so we need to allow it past the end stops
- injectCommands_P(AC_cmnd_enable_levelling);
+ injectCommands_P(AC_cmnd_enable_leveling);
// Startup tunes are defined in Tunes.h
//PlayTune(BEEPER_PIN, Anycubic_PowerOn, 1);
@@ -574,10 +576,11 @@ namespace Anycubic {
} break;
case 15: // A15 Resuming from outage
- if (printer_state == AC_printer_resuming_from_power_outage)
+ if (printer_state == AC_printer_resuming_from_power_outage) {
// Need to home here to restore the Z position
- injectCommands_P(AC_cmnd_power_loss_recovery);
- injectCommands_P(PSTR("M1000")); // home and start recovery
+ injectCommands(AC_cmnd_power_loss_recovery);
+ injectCommands("M1000"); // home and start recovery
+ }
break;
case 16: { // A16 Set HotEnd temp A17 S170
@@ -620,10 +623,10 @@ namespace Anycubic {
case 21: // A21 Home Axis A21 X
if (!isPrinting()) {
switch ((char)panel_command[4]) {
- case 'X': injectCommands_P(PSTR("G28 X")); break;
- case 'Y': injectCommands_P(PSTR("G28 Y")); break;
- case 'Z': injectCommands_P(PSTR("G28 Z")); break;
- case 'C': injectCommands_P(PSTR("G28")); break;
+ case 'X': injectCommands_P(PSTR("G28X")); break;
+ case 'Y': injectCommands_P(PSTR("G28Y")); break;
+ case 'Z': injectCommands_P(PSTR("G28Z")); break;
+ case 'C': injectCommands_P(G28_STR); break;
}
}
break;
@@ -718,7 +721,7 @@ namespace Anycubic {
// If the same meshpoint is selected twice in a row, move the head to that ready for adjustment
if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) {
if (!isPositionKnown())
- injectCommands_P(PSTR("G28")); // home
+ injectCommands_P(G28_STR); // home
if (isPositionKnown()) {
#if ACDEBUG(AC_INFO)
@@ -746,7 +749,7 @@ namespace Anycubic {
if (isPrinting())
SendtoTFTLN(AC_msg_probing_not_allowed); // forbid auto leveling
else {
- injectCommands_P(isMachineHomed() ? PSTR("G29") : PSTR("G28\nG29"));
+ injectCommands_P(PSTR("G28O\nG29"));
printer_state = AC_printer_probing;
SendtoTFTLN(AC_msg_start_probing);
}
@@ -762,7 +765,7 @@ namespace Anycubic {
selectedmeshpoint.x = selectedmeshpoint.y = 99;
}
break;
- case 'D': // Save Z Offset tables and restore levelling state
+ case 'D': // Save Z Offset tables and restore leveling state
if (!isPrinting()) {
setAxisPosition_mm(1.0,Z);
injectCommands_P(PSTR("M500"));
@@ -784,7 +787,7 @@ namespace Anycubic {
float Zshift = atof(&panel_command[4]);
setSoftEndstopState(false); // disable endstops
// Allow temporary Z position nudging during print
- // From the levelling panel use the all points UI to adjust the print pos.
+ // From the leveling panel use the all points UI to adjust the print pos.
if (isPrinting()) {
#if ACDEBUG(AC_INFO)
SERIAL_ECHOLNPAIR("Change Zoffset from:", live_Zoffset, " to ", live_Zoffset + Zshift);
diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h
index af030df580ad..7012e98d929e 100644
--- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h
+++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h
@@ -105,8 +105,8 @@
#define AC_cmnd_manual_load_filament PSTR("M83\nG1 E50 F700\nM82") // replace the manual panel commands with something a little faster
#define AC_cmnd_manual_unload_filament PSTR("M83\nG1 E-50 F1200\nM82")
-#define AC_cmnd_enable_levelling PSTR("M420 S1 V1")
-#define AC_cmnd_power_loss_recovery PSTR("G28 X Y R5\nG28 Z") // Lift, home X and Y then home Z when in 'safe' position
+#define AC_cmnd_enable_leveling PSTR("M420SV")
+#define AC_cmnd_power_loss_recovery PSTR("G28XYR5\nG28Z") // Lift, home X and Y then home Z when in 'safe' position
namespace Anycubic {
enum heater_state_t : uint8_t {
diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp
index 6d15d937b99b..baf2da63581a 100644
--- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp
+++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp
@@ -27,8 +27,8 @@
#include "../../ui_api.h"
#include "../../../../libs/numtostr.h"
-#include "../../../../module/motion.h" // for A20 read printing speed feedrate_percentage
-#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers
+#include "../../../../module/motion.h" // for quickstop_stepper, A20 read printing speed, feedrate_percentage
+#include "../../../../MarlinCore.h" // for disable_steppers, G28_STR
#include "../../../../inc/MarlinConfig.h"
// command sending macro's with debugging capability
@@ -274,12 +274,12 @@ void AnycubicTFTClass::HandleSpecialMenu() {
case '6': // "<06SMeshLvl>"
SERIAL_ECHOLNPGM("Special Menu: Start Mesh Leveling");
- ExtUI::injectCommands_P(PSTR("G29 S1"));
+ ExtUI::injectCommands_P(PSTR("G29S1"));
break;
case '7': // "<07MeshNPnt>"
SERIAL_ECHOLNPGM("Special Menu: Next Mesh Point");
- ExtUI::injectCommands_P(PSTR("G29 S2"));
+ ExtUI::injectCommands_P(PSTR("G29S2"));
break;
case '8': // "<08HtEndPID>"
@@ -324,7 +324,7 @@ void AnycubicTFTClass::HandleSpecialMenu() {
case '2': // "<02ABL>"
SERIAL_ECHOLNPGM("Special Menu: Auto Bed Leveling");
- ExtUI::injectCommands_P(PSTR("G28\nG29"));
+ ExtUI::injectCommands_P(PSTR("G29N"));
break;
case '3': // "<03HtendPID>"
@@ -592,15 +592,12 @@ void AnycubicTFTClass::GetCommandFromTFT() {
} break;
case 5: { // A5 GET CURRENT COORDINATE
- float xPostition = ExtUI::getAxisPosition_mm(ExtUI::X);
- float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y);
- float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z);
- SEND_PGM("A5V X: ");
- LCD_SERIAL.print(xPostition);
- SEND_PGM(" Y: ");
- LCD_SERIAL.print(yPostition);
- SEND_PGM(" Z: ");
- LCD_SERIAL.print(zPostition);
+ const float xPosition = ExtUI::getAxisPosition_mm(ExtUI::X),
+ yPosition = ExtUI::getAxisPosition_mm(ExtUI::Y),
+ zPosition = ExtUI::getAxisPosition_mm(ExtUI::Z);
+ SEND_PGM("A5V X: "); LCD_SERIAL.print(xPosition);
+ SEND_PGM( " Y: "); LCD_SERIAL.print(yPosition);
+ SEND_PGM( " Z: "); LCD_SERIAL.print(zPosition);
SENDLINE_PGM("");
} break;
@@ -761,14 +758,14 @@ void AnycubicTFTClass::GetCommandFromTFT() {
if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) {
if (CodeSeen('X') || CodeSeen('Y') || CodeSeen('Z')) {
if (CodeSeen('X'))
- ExtUI::injectCommands_P(PSTR("G28 X"));
+ ExtUI::injectCommands_P(PSTR("G28X"));
if (CodeSeen('Y'))
- ExtUI::injectCommands_P(PSTR("G28 Y"));
+ ExtUI::injectCommands_P(PSTR("G28Y"));
if (CodeSeen('Z'))
- ExtUI::injectCommands_P(PSTR("G28 Z"));
+ ExtUI::injectCommands_P(PSTR("G28Z"));
}
else if (CodeSeen('C')) {
- ExtUI::injectCommands_P(PSTR("G28"));
+ ExtUI::injectCommands_P(G28_STR);
}
}
break;
diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp
index 8577b76ce61f..c7cd76733fc1 100644
--- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp
+++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp
@@ -33,11 +33,9 @@
#include "../../ui_api.h"
#include "../../../../MarlinCore.h"
-#include "../../../../module/temperature.h"
#include "../../../../module/motion.h"
#include "../../../../gcode/queue.h"
#include "../../../../module/planner.h"
-#include "../../../../sd/cardreader.h"
#include "../../../../libs/duration_t.h"
#include "../../../../module/printcounter.h"
#if ENABLED(POWER_LOSS_RECOVERY)
diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h
index ee536ea21905..88c119566cc1 100644
--- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h
+++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h
@@ -25,7 +25,8 @@
#include "../../../../inc/MarlinConfigPre.h"
-#include "../../../../MarlinCore.h"
+#include // size_t
+
#if HAS_BED_PROBE
#include "../../../../module/probe.h"
#endif
@@ -96,7 +97,7 @@ class DGUSDisplay {
static void WritePGM(const char str[], uint8_t len);
static void ProcessRx();
- static inline uint16_t swap16(const uint16_t value) { return (value & 0xffU) << 8U | (value >> 8U); }
+ static inline uint16_t swap16(const uint16_t value) { return (value & 0xFFU) << 8U | (value >> 8U); }
static rx_datagram_state_t rx_datagram_state;
static uint8_t rx_datagram_len;
static bool Initialized, no_reentrance;
diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp
index ed26cac3c503..536640ec9526 100644
--- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp
+++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp
@@ -26,7 +26,7 @@
#if ENABLED(DGUS_LCD_UI_HIPRECY)
-#include "../DGUSDisplayDef.h"
+#include "DGUSDisplayDef.h"
#include "../DGUSDisplay.h"
#include "../DGUSScreenHandler.h"
diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h
index 3ff5e06dc18c..d18989a48b00 100644
--- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h
+++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h
@@ -21,6 +21,8 @@
*/
#pragma once
+#include "../DGUSDisplayDef.h"
+
enum DGUSLCD_Screens : uint8_t {
DGUSLCD_SCREEN_BOOT = 160,
DGUSLCD_SCREEN_MAIN = 1,
diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp
index 46e542a9598a..28e66e5d7ce4 100644
--- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp
+++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp
@@ -26,7 +26,7 @@
#if ENABLED(DGUS_LCD_UI_ORIGIN)
-#include "../DGUSDisplayDef.h"
+#include "DGUSDisplayDef.h"
#include "../DGUSDisplay.h"
#include "../DGUSScreenHandler.h"
diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h
index 451c11adba16..5c5a315de6dc 100644
--- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h
+++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h
@@ -21,6 +21,8 @@
*/
#pragma once
+#include "../DGUSDisplayDef.h"
+
enum DGUSLCD_Screens : uint8_t {
DGUSLCD_SCREEN_BOOT = 0,
DGUSLCD_SCREEN_MAIN = 10,
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp
index 8d2d74ea2607..9868492d81f5 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp
@@ -27,7 +27,7 @@
#if ENABLED(SDSUPPORT)
bool MediaFileReader::open(const char* filename) {
- card.init(SPI_SPEED, SDSS);
+ card.init(SD_SPI_SPEED, SDSS);
volume.init(&card);
root.openRoot(&volume);
return file.open(&root, filename, O_READ);
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp
index f64f2b5b5f0b..1db1175d3c63 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp
@@ -211,6 +211,14 @@ void CLCD::mem_write_32(uint32_t reg_address, uint32_t data) {
spi_ftdi_deselect();
}
+// Fill area of len size with repeated data bytes
+void CLCD::mem_write_fill(uint32_t reg_address, uint8_t data, uint16_t len) {
+ spi_ftdi_select();
+ spi_write_addr(reg_address);
+ while (len--) spi_write_8(data);
+ spi_ftdi_deselect();
+}
+
/******************* FT800/810 Co-processor Commands *********************************/
#if FTDI_API_LEVEL == 800
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h
index 74a7f298002a..376beaec44e0 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h
@@ -115,6 +115,7 @@ class CLCD {
static void mem_write_8 (uint32_t reg_address, uint8_t w_data);
static void mem_write_16 (uint32_t reg_address, uint16_t w_data);
static void mem_write_32 (uint32_t reg_address, uint32_t w_data);
+ static void mem_write_fill (uint32_t reg_address, uint8_t w_data, uint16_t len);
static void mem_write_bulk (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0);
static void mem_write_pgm (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0);
static void mem_write_bulk (uint32_t reg_address, progmem_str str, uint16_t len, uint8_t padding = 0);
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h
index d90fc1e8f044..5b29816429f3 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h
@@ -45,7 +45,7 @@
static_assert(thfp + thb + Hsize == th, "Mismatch in display th"); \
static_assert(tvfp + tvb + Vsize == tv, "Mismatch in display tv");
-#ifdef TOUCH_UI_320x240
+#if ENABLED(TOUCH_UI_320x240)
namespace FTDI {
constexpr uint8_t Pclk = 8;
constexpr uint8_t Pclkpol = 0;
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp
index a9b46e013bad..006cbe872c08 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp
@@ -33,7 +33,7 @@ namespace FTDI {
SPIClass EVE_SPI(CLCD_SPI_BUS);
#endif
#ifndef CLCD_HW_SPI_SPEED
- #define CLCD_HW_SPI_SPEED 8000000 >> SPI_SPEED
+ #define CLCD_HW_SPI_SPEED 8000000 >> SD_SPI_SPEED
#endif
SPISettings SPI::spi_settings(CLCD_HW_SPI_SPEED, MSBFIRST, SPI_MODE0);
#endif
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h
index 0f4bbbdb9aec..9be7882a390f 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h
@@ -206,6 +206,10 @@
// Define macros for compatibility
+ // Use NUM_ARGS(__VA_ARGS__) to get the number of variadic arguments
+ #define _NUM_ARGS(_,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A,OUT,...) OUT
+ #define NUM_ARGS(V...) _NUM_ARGS(0,V,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
+
#define _CAT(a,V...) a##V
#define CAT(a,V...) _CAT(a,V)
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp
index a7777a97fe07..e324cb978aa0 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp
@@ -21,7 +21,7 @@
#include "ftdi_extended.h"
-#ifdef FTDI_EXTENDED
+#if ENABLED(FTDI_EXTENDED)
CommandProcessor::btn_style_func_t *CommandProcessor::_btn_style_callback = CommandProcessor::default_button_style_func;
bool CommandProcessor::is_tracking = false;
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h
index b27ed7f59e7d..da51ee638517 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h
@@ -312,12 +312,12 @@ class CommandProcessor : public CLCD::CommandFifo {
int8_t apply_fit_text(int16_t w, int16_t h, T text) {
using namespace FTDI;
int8_t font = _font;
- #ifdef TOUCH_UI_USE_UTF8
+ #if ENABLED(TOUCH_UI_USE_UTF8)
const bool is_utf8 = has_utf8_chars(text);
#endif
for (;font > 26;) {
int16_t width, height;
- #ifdef TOUCH_UI_USE_UTF8
+ #if ENABLED(TOUCH_UI_USE_UTF8)
if (is_utf8) {
width = get_utf8_text_width(text, font_size_t::from_romfont(font));
height = font_size_t::from_romfont(font).get_height();
@@ -345,7 +345,7 @@ class CommandProcessor : public CLCD::CommandFifo {
template
uint16_t text_width(T text) {
using namespace FTDI;
- #ifdef TOUCH_UI_USE_UTF8
+ #if ENABLED(TOUCH_UI_USE_UTF8)
if (has_utf8_chars(text))
return get_utf8_text_width(text, font_size_t::from_romfont(_font));
#endif
@@ -362,7 +362,7 @@ class CommandProcessor : public CLCD::CommandFifo {
#else
const int8_t font = _font;
#endif
- #ifdef TOUCH_UI_USE_UTF8
+ #if ENABLED(TOUCH_UI_USE_UTF8)
if (has_utf8_chars(text))
draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(font), options);
else
@@ -401,7 +401,7 @@ class CommandProcessor : public CLCD::CommandFifo {
const int8_t font = _font;
#endif
CLCD::CommandFifo::button(x, y, w, h, font, options);
- #ifdef TOUCH_UI_USE_UTF8
+ #if ENABLED(TOUCH_UI_USE_UTF8)
if (has_utf8_chars(text)) {
CLCD::CommandFifo::str(F(""));
apply_text_alignment(x, y, w, h, OPT_CENTER);
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp
index 9f2b6dd35fbc..a13c36265ed8 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp
@@ -22,7 +22,7 @@
#include "ftdi_extended.h"
-#ifdef FTDI_EXTENDED
+#if ENABLED(FTDI_EXTENDED)
/* The Display List Cache mechanism stores the display list corresponding
* to a menu into RAM_G so that on subsequent calls drawing the menu does
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp
index 0808f2f4f253..6c0392c200db 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp
@@ -22,7 +22,7 @@
#include "ftdi_extended.h"
-#ifdef FTDI_EXTENDED
+#if ENABLED(FTDI_EXTENDED)
using namespace FTDI;
enum {
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h
index 006978babb1e..fd84c795f11f 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h
@@ -29,11 +29,12 @@
#define FTDI_EXTENDED
#endif
-#ifdef FTDI_EXTENDED
+#if ENABLED(FTDI_EXTENDED)
#include "unicode/font_size_t.h"
#include "unicode/unicode.h"
#include "unicode/standard_char_set.h"
#include "unicode/western_char_set.h"
+ #include "unicode/cyrillic_char_set.h"
#include "unicode/font_bitmaps.h"
#include "rgb_t.h"
#include "bitmap_info.h"
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h
index 490cbd4e548f..82bb8abf7fc0 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h
@@ -88,7 +88,7 @@
}
namespace FTDI {
- #ifdef TOUCH_UI_PORTRAIT
+ #if ENABLED(TOUCH_UI_PORTRAIT)
constexpr uint16_t display_width = Vsize;
constexpr uint16_t display_height = Hsize;
#else
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h
index 202c3cd7fb79..6aa52f09c9bd 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h
@@ -66,7 +66,7 @@ namespace FTDI {
cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_ALWAYS, 255, 255));
// Drawing the edge strip along scan lines
// seems to yield the best performance
- #ifdef TOUCH_UI_PORTRAIT
+ #if ENABLED(TOUCH_UI_PORTRAIT)
path_initiator = EDGE_STRIP_B;
#else
path_initiator = EDGE_STRIP_R;
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp
index 81a081faae7a..944237bd281d 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp
@@ -21,7 +21,7 @@
#include "ftdi_extended.h"
-#ifdef FTDI_EXTENDED
+#if ENABLED(FTDI_EXTENDED)
/********************** VIRTUAL DISPATCH DATA TYPE ******************************/
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h
index ef923614986f..1581cbbbc74e 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h
@@ -158,7 +158,7 @@ class UncachedScreen {
using namespace FTDI;
CommandProcessor cmd;
cmd.cmd(CMD_DLSTART);
- #ifdef TOUCH_UI_USE_UTF8
+ #if ENABLED(TOUCH_UI_USE_UTF8)
load_utf8_bitmaps(cmd);
#endif
@@ -199,7 +199,7 @@ class CachedScreen {
CommandProcessor cmd;
cmd.cmd(CMD_DLSTART);
- #ifdef TOUCH_UI_USE_UTF8
+ #if ENABLED(TOUCH_UI_USE_UTF8)
load_utf8_bitmaps(cmd);
#endif
current_screen.onRedraw(BACKGROUND);
@@ -222,7 +222,7 @@ class CachedScreen {
dlcache.append();
}
else {
- #ifdef TOUCH_UI_USE_UTF8
+ #if ENABLED(TOUCH_UI_USE_UTF8)
load_utf8_bitmaps(cmd);
#endif
current_screen.onRedraw(BACKGROUND);
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp
index 481589854bfa..07d1ff56246d 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp
@@ -21,7 +21,7 @@
#include "ftdi_extended.h"
-#ifdef FTDI_EXTENDED
+#if ENABLED(FTDI_EXTENDED)
namespace FTDI {
SoundPlayer sound; // Global sound player object
@@ -75,9 +75,7 @@ namespace FTDI {
while (has_more_notes()) {
onIdle();
- #ifdef EXTENSIBLE_UI
- ExtUI::yield();
- #endif
+ TERN_(TOUCH_UI_FTDI_EVE, ExtUI::yield());
}
}
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp
index 18e5d4bc5b00..b7422a06b1b0 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp
@@ -21,7 +21,7 @@
#include "ftdi_extended.h"
-#ifdef FTDI_EXTENDED
+#if ENABLED(FTDI_EXTENDED)
namespace FTDI {
/**
@@ -103,7 +103,7 @@ namespace FTDI {
if (line[line_len - 1] == '\n' || line[line_len - 1] == ' ')
line[line_len - 1] = 0;
- #ifdef TOUCH_UI_USE_UTF8
+ #if ENABLED(TOUCH_UI_USE_UTF8)
if (has_utf8_chars(line)) {
draw_utf8_text(cmd, x + dx, y + dy, line, fm.fs, options & ~OPT_CENTERY);
} else
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp
index a69280f5fc2e..5fc89f1fa9d3 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp
@@ -21,7 +21,7 @@
#include "ftdi_extended.h"
-#ifdef FTDI_EXTENDED
+#if ENABLED(FTDI_EXTENDED)
namespace FTDI {
@@ -37,11 +37,22 @@ namespace FTDI {
// split and still allow the ellipsis to fit.
int16_t lineWidth = 0;
char *breakPoint = str;
- for (char* c = str; *c; c++) {
- lineWidth += fm.get_char_width(*c);
- if (lineWidth + ellipsisWidth < w)
- breakPoint = c;
- }
+ #ifdef TOUCH_UI_USE_UTF8
+ char *tstr = str;
+ while (*tstr) {
+ breakPoint = tstr;
+ const utf8_char_t c = get_utf8_char_and_inc(tstr);
+ lineWidth += fm.get_char_width(c);
+ if (lineWidth + ellipsisWidth < w)
+ break;
+ }
+ #else
+ for (char* c = str; *c; c++) {
+ lineWidth += fm.get_char_width(*c);
+ if (lineWidth + ellipsisWidth < w)
+ breakPoint = c;
+ }
+ #endif
if (lineWidth > w) {
*breakPoint = '\0';
@@ -49,7 +60,7 @@ namespace FTDI {
}
cmd.apply_text_alignment(x, y, w, h, options);
- #ifdef TOUCH_UI_USE_UTF8
+ #if ENABLED(TOUCH_UI_USE_UTF8)
if (has_utf8_chars(str)) {
draw_utf8_text(cmd, x, y, str, font_size_t::from_romfont(font), options);
} else
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp
index 2147dd7c8fd7..5219c0d04180 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp
@@ -21,15 +21,11 @@
#include "ftdi_extended.h"
-#ifdef FTDI_EXTENDED
+#if ENABLED(FTDI_EXTENDED)
bool tiny_timer_t::elapsed(tiny_time_t duration) {
uint8_t now = tiny_time_t::tiny_time(
- #ifdef __MARLIN_FIRMWARE__
- ExtUI::safe_millis()
- #else
- millis()
- #endif
+ TERN(__MARLIN_FIRMWARE__, ExtUI::safe_millis(), millis())
);
uint8_t elapsed = now - _start;
return elapsed >= duration._duration;
@@ -37,11 +33,7 @@ bool tiny_timer_t::elapsed(tiny_time_t duration) {
void tiny_timer_t::start() {
_start = tiny_time_t::tiny_time(
- #ifdef __MARLIN_FIRMWARE__
- ExtUI::safe_millis()
- #else
- millis()
- #endif
+ TERN(__MARLIN_FIRMWARE__, ExtUI::safe_millis(), millis())
);
}
#endif // FTDI_EXTENDED
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp
new file mode 100644
index 000000000000..1c193ade4be1
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp
@@ -0,0 +1,139 @@
+/************************
+ * cyrillic_char_set.cpp *
+ ************************/
+
+/****************************************************************************
+ * Written By Kirill Shashlov 2020 *
+ * Marcio Teixeira 2019 - Aleph Objects, Inc. *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * To view a copy of the GNU General Public License, go to the following *
+ * location: . *
+ ****************************************************************************/
+
+#include "../ftdi_extended.h"
+
+#if ALL(FTDI_EXTENDED, TOUCH_UI_USE_UTF8, TOUCH_UI_UTF8_CYRILLIC_CHARSET)
+
+ #include "cyrillic_char_set_bitmap_31.h"
+
+ #define NUM_ELEMENTS(a) (sizeof(a)/sizeof(a[0]))
+
+ #define UTF8(A) uint16_t(utf8(U##A))
+
+ using namespace FTDI;
+
+ constexpr static uint8_t cyrillic_font_handle = 6;
+
+ uint32_t FTDI::CyrillicCharSet::bitmap_addr;
+
+ /**
+ * Load bitmap data into RAMG. This function is called once at the start
+ * of the program.
+ *
+ * Parameters:
+ *
+ * addr - Address in RAMG where the font data is written
+ *
+ * Returns: Last wrote address
+ */
+
+ uint32_t FTDI::CyrillicCharSet::load_data(uint32_t addr) {
+ if (addr % 4 != 0)
+ addr += 4 - (addr % 4);
+
+ // Load the alternative font metrics
+ CLCD::FontMetrics cyrillic_fm;
+ cyrillic_fm.ptr = addr + 148;
+ cyrillic_fm.format = L4;
+ cyrillic_fm.stride = 20;
+ cyrillic_fm.width = 40;
+ cyrillic_fm.height = 49;
+ LOOP_L_N(i, 127)
+ cyrillic_fm.char_widths[i] = 0;
+
+ // For cyrillic characters, copy the character widths from the widths tables
+ LOOP_L_N(i, NUM_ELEMENTS(cyrillic_font_widths)) {
+ cyrillic_fm.char_widths[i] = cyrillic_font_widths[i];
+ }
+ CLCD::mem_write_bulk(addr, &cyrillic_fm, 148);
+
+ // Decode the RLE data and load it into RAMG as a bitmap
+ uint32_t lastaddr = write_rle_data(addr + 148, cyrillic_font, sizeof(cyrillic_font));
+
+ bitmap_addr = addr;
+
+ return lastaddr;
+ }
+
+ /**
+ * Populates the bitmap handles for the custom into the display list.
+ * This function is called once at the start of each display list.
+ *
+ * Parameters:
+ *
+ * cmd - Object used for writing to the FTDI chip command queue.
+ */
+
+ void FTDI::CyrillicCharSet::load_bitmaps(CommandProcessor& cmd) {
+ CLCD::FontMetrics cyrillic_fm;
+ cyrillic_fm.ptr = bitmap_addr + 148;
+ cyrillic_fm.format = L4;
+ cyrillic_fm.stride = 20;
+ cyrillic_fm.width = 40;
+ cyrillic_fm.height = 49;
+ set_font_bitmap(cmd, cyrillic_fm, cyrillic_font_handle);
+ }
+
+ /**
+ * Renders a character at location x and y. The x position is incremented
+ * by the width of the character.
+ *
+ * Parameters:
+ *
+ * cmd - If non-NULL the symbol is drawn to the screen.
+ * If NULL, only increment position for text measurement.
+ *
+ * x, y - The location at which to draw the character. On output,
+ * incremented to the location of the next character.
+ *
+ * fs - A scaling object used to scale the font. The display will
+ * already be configured to scale bitmaps, but positions
+ * must be scaled using fs.scale()
+ *
+ * c - The unicode code point to draw. If the renderer does not
+ * support the character, it should return false.
+ *
+ * Returns: Whether the character was supported.
+ */
+
+ bool FTDI::CyrillicCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) {
+ // A supported character?
+ if ((c < UTF8('А') || c > UTF8('я')) && (c != UTF8('Ё')) && (c != UTF8('ё'))) return false;
+
+ uint8_t idx = (c == UTF8('Ё')) ? 64 :
+ (c == UTF8('ё')) ? 65 :
+ (c < UTF8('р')) ? c - UTF8('А') :
+ c - UTF8('р') + 48
+ ;
+
+ uint8_t width = cyrillic_font_widths[idx];
+
+ // Draw the character
+ if (cmd) ext_vertex2ii(*cmd, x, y, cyrillic_font_handle, idx);
+
+ // Increment X to the next character position
+ x += fs.scale(width);
+ return true;
+ }
+
+#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 && TOUCH_UI_UTF8_WESTERN_CHARSET
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.h
new file mode 100644
index 000000000000..63493b8bb977
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.h
@@ -0,0 +1,32 @@
+/**********************
+ * cyrillic_char_set.h *
+ **********************/
+
+/****************************************************************************
+ * Written By Kirill Shashlov 2020 *
+ * Marcio Teixeira 2019 - Aleph Objects, Inc. *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * To view a copy of the GNU General Public License, go to the following *
+ * location: . *
+ ****************************************************************************/
+
+namespace FTDI {
+ class CyrillicCharSet {
+ private:
+ static uint32_t bitmap_addr;
+ public:
+ static uint32_t load_data(uint32_t addr);
+ static void load_bitmaps(CommandProcessor&);
+ static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t);
+ };
+}
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set_bitmap_31.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set_bitmap_31.h
new file mode 100644
index 000000000000..00bfe3706b15
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set_bitmap_31.h
@@ -0,0 +1,2529 @@
+/********************************
+ * cyrillic_char_set_bitmap_31.h *
+ ********************************/
+
+/****************************************************************************
+ * Written By Kirill Shashlov 2020 *
+ * Marcio Teixeira 2019 - Aleph Objects, Inc. *
+ * *
+ * Used GNU FreeFont FreeSans font (licensed under the GPL) *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * To view a copy of the GNU General Public License, go to the following *
+ * location: . *
+ ****************************************************************************/
+
+#pragma once
+
+const uint8_t cyrillic_font_widths[] PROGMEM = {
+ 27, // А (0)
+ 26, // Б
+ 26, // В
+ 24, // Г
+ 33, // Д
+ 25, // Е
+ 37, // Ж
+ 26, // З
+
+ 28, // И (8)
+ 28, // Й
+ 26, // К
+ 25, // Л
+ 33, // М
+ 27, // Н
+ 31, // О
+ 27, // П
+
+ 26, // Р (16)
+ 29, // С
+ 28, // Т
+ 26, // У
+ 34, // Ф
+ 27, // Х
+ 30, // Ц
+ 23, // Ч
+
+ 32, // Ш (24)
+ 34, // Щ
+ 26, // Ь
+ 34, // Ы
+ 34, // Ъ
+ 28, // Э
+ 40, // Ю
+ 26, // Я
+
+ 22, // а (32)
+ 21, // б
+ 20, // в
+ 16, // г
+ 24, // д
+ 21, // е
+ 31, // ж
+ 19, // з
+
+ 21, // и (40)
+ 21, // й
+ 20, // к
+ 19, // л
+ 23, // м
+ 21, // н
+ 21, // о
+ 21, // п
+
+ 22, // р (48)
+ 20, // с
+ 17, // т
+ 19, // у
+ 34, // ф
+ 19, // х
+ 23, // ц
+ 19, // ч
+ 26, // ш
+ 28, // щ
+ 20, // ь
+ 26, // ы
+ 26, // ъ
+ 20, // э
+ 30, // ю
+ 20, // я
+
+ 26, // Ё
+ 21, // ё
+};
+
+
+/* This is a dump of "font_bitmaps/cyrillic_char_set_bitmap_31.png"
+ * using the tool "bitmap2cpp.py". The tool converts the image into
+ * 16-level grayscale and packs two pixels per byte. The resulting
+ * bytes are then RLE compressed to yield (count, byte) pairs.
+ */
+
+const unsigned char cyrillic_font[] PROGMEM = {
+ /* 0 */
+ 0xb9, 0x00, 0x01, 0x2f, 0x02, 0xff, 0x01, 0x30, 0x10, 0x00, 0x01, 0x7f,
+ 0x02, 0xff, 0x01, 0x90, 0x10, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xe0,
+ 0x0f, 0x00, 0x01, 0x03, 0x03, 0xff, 0x01, 0xf4, 0x0f, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xfb, 0x01, 0xff, 0x01, 0xfa, 0x0f, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0xf1, 0x02, 0xff, 0x0f, 0x00, 0x01, 0x5f, 0x01, 0xff,
+ 0x01, 0x90, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x50, 0x0e, 0x00, 0x01, 0xaf,
+ 0x01, 0xff, 0x01, 0x40, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xb0, 0x0d, 0x00,
+ 0x01, 0x01, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xf1, 0x0d, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00,
+ 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf7, 0x0d, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x01, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfc, 0x0d, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0xef, 0x01, 0xff,
+ 0x01, 0x20, 0x0c, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00,
+ 0x01, 0x9f, 0x01, 0xff, 0x01, 0x80, 0x0c, 0x00, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0x10, 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xd0, 0x0b, 0x00,
+ 0x01, 0x03, 0x01, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x0e, 0x01, 0xff,
+ 0x01, 0xf3, 0x0b, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf5, 0x03, 0x00,
+ 0x01, 0x09, 0x01, 0xff, 0x01, 0xf9, 0x0b, 0x00, 0x01, 0x0e, 0x01, 0xff,
+ 0x01, 0xe0, 0x03, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0x4f, 0x01, 0xff, 0x01, 0xb4, 0x04, 0x44, 0x02, 0xff, 0x01, 0x40,
+ 0x0a, 0x00, 0x01, 0xaf, 0x08, 0xff, 0x01, 0xa0, 0x0a, 0x00, 0x09, 0xff,
+ 0x01, 0xf0, 0x09, 0x00, 0x01, 0x06, 0x02, 0xff, 0x05, 0xee, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf5,
+ 0x05, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, 0x09, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x10,
+ 0x08, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x90, 0x06, 0x00, 0x01, 0xdf,
+ 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40,
+ 0x06, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x03,
+ 0x01, 0xff, 0x01, 0xfe, 0x07, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf2,
+ 0x07, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf8, 0x07, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xf8, 0x07, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2,
+ 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xfd, 0x07, 0x00, 0x01, 0x4f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x30,
+ 0x06, 0x00, 0x01, 0x8d, 0x01, 0xdd, 0x01, 0x60, 0x08, 0x00, 0x01, 0xad,
+ 0x01, 0xdd, 0x01, 0x70, 0xce, 0x00,
+
+ /* 1 */
+ 0xb5, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf4, 0x09, 0x00, 0x01, 0x1f,
+ 0x09, 0xff, 0x01, 0xf4, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf4,
+ 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd5, 0x07, 0x55, 0x01, 0x51,
+ 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xfe,
+ 0x04, 0xee, 0x01, 0xdb, 0x01, 0x84, 0x0b, 0x00, 0x01, 0x1f, 0x08, 0xff,
+ 0x01, 0xe7, 0x0a, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xd2, 0x09, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd6, 0x04, 0x66, 0x01, 0x68, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x05, 0x00, 0x01, 0x04, 0x01, 0xef, 0x01, 0xff, 0x01, 0x90,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x3f,
+ 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x06, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf5, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf9, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x06, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xf4, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x06, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x80,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe7, 0x04, 0x77, 0x01, 0x89,
+ 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfe, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff,
+ 0x01, 0xe2, 0x09, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xfb, 0x01, 0x10,
+ 0x09, 0x00, 0x01, 0x1d, 0x06, 0xdd, 0x01, 0xdc, 0x01, 0xb7, 0x01, 0x20,
+ 0xd1, 0x00,
+
+ /* 2 */
+ 0xb5, 0x00, 0x01, 0x1f, 0x06, 0xff, 0x01, 0xec, 0x01, 0x94, 0x0b, 0x00,
+ 0x01, 0x1f, 0x08, 0xff, 0x01, 0xc3, 0x0a, 0x00, 0x01, 0x1f, 0x09, 0xff,
+ 0x01, 0x40, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd6, 0x03, 0x66,
+ 0x01, 0x67, 0x01, 0x9d, 0x02, 0xff, 0x01, 0xe1, 0x09, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x4e, 0x01, 0xff, 0x01, 0xf9,
+ 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x04,
+ 0x02, 0xff, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00,
+ 0x01, 0xdf, 0x01, 0xff, 0x01, 0x20, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x06, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x08, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0xaf, 0x01, 0xff,
+ 0x01, 0x20, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00,
+ 0x01, 0xcf, 0x01, 0xff, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x05, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfa, 0x09, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xf2,
+ 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd2, 0x03, 0x22, 0x01, 0x23,
+ 0x01, 0x59, 0x02, 0xff, 0x01, 0x50, 0x09, 0x00, 0x01, 0x1f, 0x08, 0xff,
+ 0x01, 0xd3, 0x0a, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xb3, 0x0a, 0x00,
+ 0x01, 0x1f, 0x09, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xd4, 0x04, 0x44, 0x01, 0x45, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xfd,
+ 0x01, 0x10, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00,
+ 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf1,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x06, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf9,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x07,
+ 0x01, 0xff, 0x01, 0xf7, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x06, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf5, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf1,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x05,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0x90, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xe7, 0x04, 0x77, 0x01, 0x79, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfe,
+ 0x01, 0x10, 0x08, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xe3, 0x09, 0x00,
+ 0x01, 0x1f, 0x08, 0xff, 0x01, 0xfa, 0x01, 0x10, 0x09, 0x00, 0x01, 0x1d,
+ 0x07, 0xdd, 0x01, 0xb7, 0x01, 0x20, 0xd1, 0x00,
+
+ /* 3 */
+ 0xb5, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf4, 0x09, 0x00, 0x01, 0x1f,
+ 0x09, 0xff, 0x01, 0xf4, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf4,
+ 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd5, 0x07, 0x55, 0x01, 0x51,
+ 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1e,
+ 0x01, 0xee, 0x01, 0xb0, 0xd8, 0x00,
+
+ /* 4 */
+ 0xb8, 0x00, 0x01, 0x08, 0x09, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08,
+ 0x09, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x09, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfa, 0x05, 0x66, 0x01, 0xdf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xf4, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf2,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x6f,
+ 0x01, 0xff, 0x01, 0xa0, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x30,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x08, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xfe, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x08, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf1,
+ 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x05, 0x00, 0x01, 0x02,
+ 0x01, 0x22, 0x01, 0x28, 0x02, 0xff, 0x01, 0xc7, 0x06, 0x77, 0x01, 0xdf,
+ 0x01, 0xff, 0x01, 0x52, 0x01, 0x22, 0x04, 0x00, 0x01, 0x0f, 0x0f, 0xff,
+ 0x04, 0x00, 0x01, 0x0f, 0x0f, 0xff, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xed, 0x0b, 0xdd, 0x01, 0xef, 0x01, 0xff, 0x04, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x04, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x5f, 0x01, 0xff,
+ 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x5f,
+ 0x01, 0xff, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00,
+ 0x01, 0x5f, 0x01, 0xff, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x50,
+ 0x0b, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x04, 0x00, 0x01, 0x06, 0x01, 0x66,
+ 0x01, 0x20, 0x0b, 0x00, 0x01, 0x26, 0x01, 0x66, 0x54, 0x00,
+
+ /* 5 */
+ 0xb5, 0x00, 0x01, 0x1f, 0x0a, 0xff, 0x09, 0x00, 0x01, 0x1f, 0x0a, 0xff,
+ 0x09, 0x00, 0x01, 0x1f, 0x0a, 0xff, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xd6, 0x07, 0x66, 0x01, 0x65, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc1, 0x07, 0x11, 0x01, 0x10, 0x09, 0x00,
+ 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff,
+ 0x01, 0xf5, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf5, 0x09, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd4, 0x07, 0x44, 0x01, 0x41, 0x09, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe7, 0x08, 0x77, 0x01, 0x50, 0x08, 0x00,
+ 0x01, 0x1f, 0x0a, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x1f, 0x0a, 0xff,
+ 0x01, 0xb0, 0x08, 0x00, 0x01, 0x1e, 0x0a, 0xee, 0x01, 0xa0, 0xcf, 0x00,
+
+ /* 6 */
+ 0xb5, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xf3, 0x04, 0x00, 0x01, 0x4f,
+ 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xe1,
+ 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00,
+ 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x0a, 0x02, 0xff,
+ 0x01, 0x30, 0x03, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0,
+ 0x03, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x7f,
+ 0x01, 0xff, 0x01, 0xf5, 0x05, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf8,
+ 0x03, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x03,
+ 0x02, 0xff, 0x01, 0x80, 0x05, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x50,
+ 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x1e,
+ 0x01, 0xff, 0x01, 0xfb, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xf2,
+ 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfd,
+ 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x07, 0x00, 0x01, 0x01, 0x01, 0xdf,
+ 0x01, 0xff, 0x01, 0xb0, 0x01, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90,
+ 0x01, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf4, 0x09, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xf7, 0x01, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90,
+ 0x01, 0x02, 0x02, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x05, 0x02, 0xff,
+ 0x01, 0x40, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x1d, 0x01, 0xff,
+ 0x01, 0xfa, 0x0b, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xe2, 0x01, 0x4f,
+ 0x01, 0xff, 0x01, 0x90, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xc0, 0x0b, 0x00,
+ 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x98,
+ 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x0c, 0x00, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0xdf, 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xf3, 0x0d, 0x00,
+ 0x01, 0x2e, 0x05, 0xff, 0x01, 0x60, 0x0d, 0x00, 0x01, 0x07, 0x04, 0xff,
+ 0x01, 0xfc, 0x0e, 0x00, 0x01, 0x2e, 0x05, 0xff, 0x01, 0x60, 0x0c, 0x00,
+ 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x01, 0xef, 0x01, 0xff, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfd,
+ 0x01, 0x5f, 0x01, 0xff, 0x01, 0x9a, 0x02, 0xff, 0x01, 0x30, 0x0b, 0x00,
+ 0x01, 0xbf, 0x01, 0xff, 0x01, 0xe2, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90,
+ 0x01, 0xbf, 0x01, 0xff, 0x01, 0xe2, 0x0a, 0x00, 0x01, 0x09, 0x02, 0xff,
+ 0x01, 0x30, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x0d, 0x01, 0xff,
+ 0x01, 0xfd, 0x01, 0x10, 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf4,
+ 0x01, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x01, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0x50,
+ 0x01, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x3f,
+ 0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf7,
+ 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x04,
+ 0x02, 0xff, 0x01, 0x90, 0x06, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0x80,
+ 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x6f,
+ 0x01, 0xff, 0x01, 0xf7, 0x06, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfa,
+ 0x03, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x08,
+ 0x02, 0xff, 0x01, 0x50, 0x04, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0xb0, 0x03, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00,
+ 0x01, 0xaf, 0x01, 0xff, 0x01, 0xf4, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xfc, 0x04, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00,
+ 0x01, 0x0b, 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0xaf, 0x01, 0xff,
+ 0x01, 0xd1, 0x04, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x04, 0x00,
+ 0x01, 0xdf, 0x01, 0xff, 0x01, 0xe1, 0x02, 0x00, 0x01, 0x08, 0x01, 0xff,
+ 0x01, 0xfe, 0x01, 0x20, 0x04, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90,
+ 0x04, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x01, 0x00,
+ 0x01, 0x5d, 0x01, 0xdd, 0x01, 0xd3, 0x05, 0x00, 0x01, 0x3d, 0x01, 0xdd,
+ 0x01, 0x80, 0x04, 0x00, 0x01, 0x03, 0x02, 0xdd, 0x01, 0x90, 0xc9, 0x00,
+
+ /* 7 */
+ 0xa5, 0x00, 0x01, 0x45, 0x01, 0x67, 0x01, 0x65, 0x01, 0x20, 0x0e, 0x00,
+ 0x01, 0x06, 0x01, 0xcf, 0x03, 0xff, 0x01, 0xfe, 0x01, 0x92, 0x0c, 0x00,
+ 0x01, 0x04, 0x01, 0xef, 0x06, 0xff, 0x01, 0x90, 0x0b, 0x00, 0x01, 0x6f,
+ 0x02, 0xff, 0x01, 0xfd, 0x01, 0xcb, 0x01, 0xcf, 0x02, 0xff, 0x01, 0xfc,
+ 0x0a, 0x00, 0x01, 0x04, 0x02, 0xff, 0x01, 0xd6, 0x01, 0x10, 0x02, 0x00,
+ 0x01, 0x39, 0x02, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x0d, 0x01, 0xff,
+ 0x01, 0xf9, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00,
+ 0x01, 0x4f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff,
+ 0x01, 0xf9, 0x09, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x06, 0x00,
+ 0x01, 0xff, 0x01, 0xfe, 0x09, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x07, 0x00,
+ 0x01, 0xdf, 0x01, 0xff, 0x09, 0x00, 0x01, 0xac, 0x01, 0xcb, 0x07, 0x00,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, 0x10, 0x00, 0x01, 0x04, 0x02, 0xff,
+ 0x11, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xfc, 0x10, 0x00, 0x01, 0x01,
+ 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf5, 0x10, 0x00, 0x01, 0x5d, 0x02, 0xff,
+ 0x01, 0xa0, 0x0d, 0x00, 0x02, 0x99, 0x01, 0xbe, 0x02, 0xff, 0x01, 0xf8,
+ 0x0e, 0x00, 0x05, 0xff, 0x01, 0x40, 0x0e, 0x00, 0x05, 0xff, 0x01, 0xf9,
+ 0x0e, 0x00, 0x02, 0xbb, 0x01, 0xcd, 0x03, 0xff, 0x01, 0xd1, 0x10, 0x00,
+ 0x01, 0x16, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfc, 0x11, 0x00, 0x01, 0x0a,
+ 0x02, 0xff, 0x01, 0x60, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xc0,
+ 0x07, 0x00, 0x01, 0x07, 0x01, 0x99, 0x01, 0x80, 0x07, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xf0, 0x07, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf0,
+ 0x07, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf1, 0x07, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xf2, 0x07, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1,
+ 0x07, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x07, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0xe0, 0x07, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x20,
+ 0x06, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0xd2, 0x05, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0x30,
+ 0x08, 0x00, 0x01, 0x1e, 0x02, 0xff, 0x01, 0x81, 0x03, 0x00, 0x01, 0x01,
+ 0x01, 0x8f, 0x01, 0xff, 0x01, 0xfa, 0x09, 0x00, 0x01, 0x03, 0x01, 0xef,
+ 0x02, 0xff, 0x01, 0xda, 0x01, 0x98, 0x01, 0x9a, 0x01, 0xdf, 0x02, 0xff,
+ 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x2d, 0x07, 0xff, 0x01, 0xfa, 0x0c, 0x00,
+ 0x01, 0x6d, 0x05, 0xff, 0x01, 0xfb, 0x01, 0x30, 0x0d, 0x00, 0x01, 0x27,
+ 0x01, 0x9b, 0x01, 0xcd, 0x01, 0xba, 0x01, 0x95, 0x01, 0x10, 0xbe, 0x00,
+
+ /* 8 */
+ 0xb5, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x07, 0x00, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x06, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x90, 0x06, 0x00, 0x01, 0x2f, 0x02, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x06, 0x00, 0x01, 0xcf,
+ 0x02, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x05, 0x00, 0x01, 0x06, 0x03, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x05, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xfa, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x1e, 0x01, 0xff,
+ 0x01, 0xe1, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x60,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x03, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfb, 0x01, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x03, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x03, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, 0x01, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x02, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x02, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x02, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3, 0x02, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x80, 0x02, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfd, 0x03, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x01, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x01, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x01, 0x01, 0x01, 0xef, 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5, 0x04, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x01, 0x5f, 0x01, 0xff, 0x01, 0xb0, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x10, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x99, 0x01, 0xff, 0x01, 0xf6,
+ 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x03, 0xff, 0x01, 0x20,
+ 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f,
+ 0x02, 0xff, 0x01, 0xf7, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x02, 0xff, 0x01, 0xd0, 0x06, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x02, 0xff, 0x01, 0x30,
+ 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1e,
+ 0x01, 0xee, 0x01, 0xe8, 0x07, 0x00, 0x01, 0x0e, 0x01, 0xee, 0x01, 0xa0,
+ 0xce, 0x00,
+
+ /* 9 */
+ 0x2c, 0x00, 0x01, 0x7f, 0x01, 0xf1, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xe0,
+ 0x0d, 0x00, 0x01, 0x5f, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff,
+ 0x01, 0xb0, 0x0d, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xb6, 0x01, 0x45,
+ 0x01, 0x9f, 0x01, 0xff, 0x01, 0x50, 0x0d, 0x00, 0x01, 0x05, 0x04, 0xff,
+ 0x01, 0xfb, 0x0f, 0x00, 0x01, 0x5e, 0x03, 0xff, 0x01, 0x90, 0x10, 0x00,
+ 0x01, 0x46, 0x01, 0x87, 0x01, 0x51, 0x20, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x07, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x06, 0x00, 0x01, 0x07, 0x02, 0xff,
+ 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x06, 0x00,
+ 0x01, 0x2f, 0x02, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x06, 0x00, 0x01, 0xbf, 0x02, 0xff, 0x01, 0xa0, 0x07, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x06, 0x03, 0xff,
+ 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xef, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0xaf, 0x01, 0xff,
+ 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x04, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfa, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x04, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xe1, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x04, 0x00,
+ 0x01, 0x9f, 0x01, 0xff, 0x01, 0x60, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x04,
+ 0x01, 0xff, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x0d,
+ 0x01, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0x70, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x03,
+ 0x01, 0xff, 0x01, 0xfd, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xf3, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x7f,
+ 0x01, 0xff, 0x01, 0x80, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xfd, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x6f,
+ 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x01, 0x01, 0xef,
+ 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x0a, 0x01, 0xff,
+ 0x01, 0xf5, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xb0,
+ 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x90, 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, 0x04, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x99, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0xc0, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00,
+ 0x01, 0x1f, 0x03, 0xff, 0x01, 0x20, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x02, 0xff, 0x01, 0xf7, 0x06, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x02, 0xff,
+ 0x01, 0xd0, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00,
+ 0x01, 0x1f, 0x02, 0xff, 0x01, 0x30, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xe8, 0x07, 0x00,
+ 0x01, 0x0e, 0x01, 0xee, 0x01, 0xa0, 0xce, 0x00,
+
+ /* 10 */
+ 0xb5, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x1d,
+ 0x01, 0xff, 0x01, 0xfa, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x04, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xa0, 0x09, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x04, 0x00, 0x01, 0x1d, 0x01, 0xff,
+ 0x01, 0xf9, 0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00,
+ 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x90, 0x0a, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf9,
+ 0x0b, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x02,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0x90, 0x0b, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x02, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x01, 0x00, 0x01, 0x02, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x80, 0x0c, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x01, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xf8, 0x0d, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0x80,
+ 0x0d, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x01, 0x2e, 0x01, 0xff,
+ 0x01, 0xf7, 0x0e, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc3, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x70, 0x0e, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xee,
+ 0x01, 0xff, 0x01, 0xf7, 0x0f, 0x00, 0x01, 0x1f, 0x03, 0xff, 0x01, 0x70,
+ 0x0f, 0x00, 0x01, 0x1f, 0x03, 0xff, 0x01, 0x20, 0x0f, 0x00, 0x01, 0x1f,
+ 0x03, 0xff, 0x01, 0xe2, 0x0f, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xdd,
+ 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x0e, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc1, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xe2, 0x0e, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20,
+ 0x0d, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x01, 0x01, 0x01, 0xdf,
+ 0x01, 0xff, 0x01, 0xe2, 0x0d, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x01, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x0c, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x01, 0x00, 0x01, 0x01, 0x01, 0xdf,
+ 0x01, 0xff, 0x01, 0xe2, 0x0c, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x02, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x0b, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x01, 0x01, 0xdf,
+ 0x01, 0xff, 0x01, 0xe2, 0x0b, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x03, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x30, 0x0a, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x02, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0xe3, 0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x04, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x30, 0x09, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x04, 0x00, 0x01, 0x02, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0xe3, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x05, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x30, 0x08, 0x00,
+ 0x01, 0x1e, 0x01, 0xee, 0x01, 0xb0, 0x05, 0x00, 0x01, 0x02, 0x01, 0xde,
+ 0x01, 0xee, 0x01, 0xd2, 0xcf, 0x00,
+
+ /* 11 */
+ 0xb6, 0x00, 0x01, 0x08, 0x09, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08,
+ 0x09, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x09, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfa, 0x05, 0x66, 0x01, 0xdf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf4,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0a,
+ 0x01, 0xff, 0x01, 0xf4, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf1,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xc0,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x4f,
+ 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x20,
+ 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x08, 0x00, 0x01, 0x01,
+ 0x01, 0xff, 0x01, 0xfe, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x08, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf9, 0x06, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x30, 0x08, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf2,
+ 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0x1a,
+ 0x02, 0xff, 0x01, 0xa0, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30,
+ 0x07, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x06, 0x00,
+ 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0x2f, 0x01, 0xff,
+ 0x01, 0xf4, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x07, 0x00,
+ 0x01, 0x2f, 0x01, 0xfb, 0x01, 0x20, 0x07, 0x00, 0x01, 0xae, 0x01, 0xee,
+ 0x01, 0x30, 0x07, 0x00, 0x01, 0x03, 0x01, 0x10, 0xc6, 0x00,
+
+ /* 12 */
+ 0xb5, 0x00, 0x01, 0x1e, 0x02, 0xee, 0x01, 0x70, 0x08, 0x00, 0x02, 0xee,
+ 0x01, 0xe7, 0x05, 0x00, 0x01, 0x1f, 0x02, 0xff, 0x01, 0xc0, 0x07, 0x00,
+ 0x01, 0x05, 0x02, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x02, 0xff,
+ 0x01, 0xf2, 0x07, 0x00, 0x01, 0x0b, 0x02, 0xff, 0x01, 0xf8, 0x05, 0x00,
+ 0x01, 0x1f, 0x02, 0xff, 0x01, 0xf7, 0x07, 0x00, 0x01, 0x1f, 0x02, 0xff,
+ 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x02, 0xff, 0x01, 0xfd, 0x07, 0x00,
+ 0x01, 0x6f, 0x02, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xcf, 0x01, 0xff, 0x01, 0x30, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xfc,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x9d,
+ 0x01, 0xff, 0x01, 0x80, 0x05, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf7,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x98,
+ 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xe2,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x92,
+ 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x92,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x01, 0xdf, 0x01, 0xf9, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x42,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x01, 0x7f, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xfe, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x01, 0x2f, 0x01, 0xff, 0x01, 0x40, 0x04, 0x00, 0x01, 0xcf, 0x01, 0xf9,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x01, 0x0c, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x01,
+ 0x01, 0xff, 0x01, 0xf3, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x07, 0x01, 0xff, 0x01, 0xe0,
+ 0x03, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x02, 0x01, 0xff,
+ 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x01,
+ 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0x80,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x01, 0x00, 0x01, 0xcf, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x30, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x6f, 0x01, 0xff,
+ 0x03, 0x00, 0x01, 0x7f, 0x01, 0xfd, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff,
+ 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0xcf, 0x01, 0xf8,
+ 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xa0,
+ 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x01, 0x00, 0x01, 0x07,
+ 0x01, 0xff, 0x01, 0xd0, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0xff,
+ 0x01, 0xf6, 0x01, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0x90, 0x02, 0x00, 0x01, 0xaf, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0x20, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x5f,
+ 0x01, 0xff, 0x01, 0x10, 0x01, 0x7f, 0x01, 0xfd, 0x02, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x60, 0x01, 0xdf, 0x01, 0xf7,
+ 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xc2,
+ 0x01, 0xff, 0x01, 0xf2, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x04,
+ 0x01, 0xff, 0x01, 0xfa, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x03, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0x70, 0x02, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x03, 0x00, 0x01, 0x9f, 0x02, 0xff, 0x01, 0x20, 0x02, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x03, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xfc, 0x03, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0x80,
+ 0x03, 0x00, 0x01, 0x0d, 0x01, 0xee, 0x01, 0xe6, 0x03, 0x00, 0x01, 0x02,
+ 0x01, 0xee, 0x01, 0xe7, 0xcc, 0x00,
+
+ /* 13 */
+ 0xb5, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x0b, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x0b, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x0b, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd4,
+ 0x07, 0x44, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1e,
+ 0x01, 0xee, 0x01, 0xb0, 0x07, 0x00, 0x01, 0x8e, 0x01, 0xee, 0x01, 0x40,
+ 0xce, 0x00,
+
+ /* 14 */
+ 0xa6, 0x00, 0x01, 0x13, 0x01, 0x56, 0x01, 0x64, 0x01, 0x31, 0x0e, 0x00,
+ 0x01, 0x02, 0x01, 0x8d, 0x04, 0xff, 0x01, 0xc7, 0x01, 0x10, 0x0b, 0x00,
+ 0x01, 0x01, 0x01, 0x9f, 0x06, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x3e,
+ 0x08, 0xff, 0x01, 0xd2, 0x09, 0x00, 0x01, 0x04, 0x02, 0xff, 0x01, 0xfc,
+ 0x01, 0x72, 0x01, 0x00, 0x01, 0x01, 0x01, 0x38, 0x01, 0xdf, 0x02, 0xff,
+ 0x01, 0x30, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x50,
+ 0x04, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xe2, 0x07, 0x00, 0x01, 0x01,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0xd1, 0x06, 0x00, 0x01, 0x2e, 0x01, 0xff,
+ 0x01, 0xfd, 0x07, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10,
+ 0x06, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x60, 0x06, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xf4, 0x08, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe0,
+ 0x06, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xf5, 0x06, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x30,
+ 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xfd, 0x0a, 0x00, 0x02, 0xff, 0x05, 0x00, 0x01, 0x06,
+ 0x01, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x30,
+ 0x04, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0x50, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf4,
+ 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x70, 0x04, 0x00, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x80,
+ 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x4f,
+ 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3,
+ 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x80, 0x04, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xf4, 0x0a, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60,
+ 0x04, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x50, 0x04, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfb,
+ 0x0a, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x10, 0x05, 0x00, 0x02, 0xff,
+ 0x01, 0x10, 0x08, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfd, 0x06, 0x00,
+ 0x01, 0xbf, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xf8, 0x06, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe1, 0x08, 0x00,
+ 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf1, 0x06, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xfa, 0x08, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xa0, 0x06, 0x00,
+ 0x01, 0x04, 0x02, 0xff, 0x01, 0x80, 0x06, 0x00, 0x01, 0x0a, 0x01, 0xff,
+ 0x01, 0xfe, 0x01, 0x10, 0x07, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf9,
+ 0x05, 0x00, 0x01, 0x01, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf5, 0x08, 0x00,
+ 0x01, 0x0b, 0x02, 0xff, 0x01, 0xe6, 0x01, 0x10, 0x02, 0x00, 0x01, 0x02,
+ 0x01, 0x8f, 0x02, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0xaf, 0x02, 0xff,
+ 0x01, 0xfc, 0x01, 0xa8, 0x01, 0x8a, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xf6,
+ 0x0a, 0x00, 0x01, 0x06, 0x01, 0xef, 0x06, 0xff, 0x01, 0xfd, 0x01, 0x40,
+ 0x0b, 0x00, 0x01, 0x18, 0x01, 0xef, 0x04, 0xff, 0x01, 0xfd, 0x01, 0x60,
+ 0x0d, 0x00, 0x01, 0x03, 0x01, 0x7a, 0x01, 0xcd, 0x01, 0xdc, 0x01, 0xa7,
+ 0x01, 0x30, 0xbd, 0x00,
+
+ /* 15 */
+ 0xb5, 0x00, 0x01, 0x1f, 0x0b, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x0b, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x0b, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe6, 0x07, 0x66, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1e,
+ 0x01, 0xee, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9e, 0x01, 0xee, 0x01, 0x40,
+ 0xce, 0x00,
+
+ /* 16 */
+ 0xb5, 0x00, 0x01, 0x1e, 0x06, 0xee, 0x01, 0xec, 0x01, 0x95, 0x0b, 0x00,
+ 0x01, 0x1f, 0x08, 0xff, 0x01, 0xe5, 0x0a, 0x00, 0x01, 0x1f, 0x09, 0xff,
+ 0x01, 0x80, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd6, 0x03, 0x66,
+ 0x01, 0x67, 0x01, 0x9d, 0x02, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x4e, 0x01, 0xff, 0x01, 0xfe,
+ 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x03,
+ 0x02, 0xff, 0x01, 0x50, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x06, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x90, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xb0,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x3f,
+ 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x06, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xa0,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x05, 0x00, 0x01, 0x1b, 0x02, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc1, 0x03, 0x11, 0x01, 0x12, 0x01, 0x48, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0xf9, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xc0,
+ 0x09, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xfb, 0x01, 0x10, 0x09, 0x00,
+ 0x01, 0x1f, 0x07, 0xff, 0x01, 0xfb, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd4, 0x04, 0x44, 0x01, 0x32, 0x0c, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xb0, 0xd8, 0x00,
+
+ /* 17 */
+ 0xa6, 0x00, 0x01, 0x35, 0x01, 0x66, 0x01, 0x54, 0x01, 0x10, 0x0e, 0x00,
+ 0x01, 0x06, 0x01, 0xcf, 0x03, 0xff, 0x01, 0xfd, 0x01, 0x71, 0x0c, 0x00,
+ 0x01, 0x05, 0x01, 0xef, 0x06, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0xaf,
+ 0x07, 0xff, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0xd7,
+ 0x01, 0x20, 0x01, 0x00, 0x01, 0x03, 0x01, 0x9f, 0x02, 0xff, 0x01, 0x70,
+ 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x01,
+ 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf2, 0x08, 0x00, 0x01, 0x02, 0x02, 0xff,
+ 0x01, 0x60, 0x05, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfa, 0x08, 0x00,
+ 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0x02, 0x02, 0xff,
+ 0x01, 0x10, 0x07, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00,
+ 0x01, 0xaf, 0x01, 0xff, 0x01, 0x60, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff,
+ 0x01, 0x60, 0x07, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, 0x07, 0x00, 0x01, 0x05, 0x01, 0x55,
+ 0x01, 0x40, 0x06, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfb, 0x11, 0x00,
+ 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff,
+ 0x01, 0xf5, 0x11, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3, 0x11, 0x00,
+ 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2, 0x11, 0x00, 0x01, 0x0b, 0x01, 0xff,
+ 0x01, 0xf2, 0x11, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3, 0x11, 0x00,
+ 0x01, 0x09, 0x01, 0xff, 0x01, 0xf4, 0x11, 0x00, 0x01, 0x07, 0x01, 0xff,
+ 0x01, 0xf6, 0x11, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfa, 0x08, 0x00,
+ 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x06, 0x00, 0x01, 0x01, 0x01, 0xff,
+ 0x01, 0xfe, 0x08, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf3, 0x07, 0x00,
+ 0x01, 0xcf, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xf0, 0x07, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xb0, 0x07, 0x00,
+ 0x01, 0x7f, 0x01, 0xff, 0x01, 0xb0, 0x07, 0x00, 0x01, 0x1e, 0x01, 0xff,
+ 0x01, 0xf5, 0x07, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x60, 0x07, 0x00,
+ 0x01, 0x07, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x05, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x08, 0x00, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0xe3, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf7, 0x09, 0x00,
+ 0x01, 0x3f, 0x02, 0xff, 0x01, 0x92, 0x03, 0x00, 0x01, 0x29, 0x02, 0xff,
+ 0x01, 0xc0, 0x09, 0x00, 0x01, 0x04, 0x03, 0xff, 0x01, 0xda, 0x01, 0x88,
+ 0x01, 0x9c, 0x02, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x0a, 0x00, 0x01, 0x3d,
+ 0x07, 0xff, 0x01, 0xc1, 0x0c, 0x00, 0x01, 0x7e, 0x05, 0xff, 0x01, 0xd6,
+ 0x0e, 0x00, 0x01, 0x37, 0x01, 0xac, 0x01, 0xdd, 0x01, 0xca, 0x01, 0x73,
+ 0xbe, 0x00,
+
+ /* 18 */
+ 0xb4, 0x00, 0x01, 0x2f, 0x0b, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x2f,
+ 0x0b, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x2f, 0x0b, 0xff, 0x01, 0xa0,
+ 0x07, 0x00, 0x01, 0x16, 0x04, 0x66, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xd6,
+ 0x04, 0x66, 0x01, 0x40, 0x0c, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0,
+ 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0,
+ 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0,
+ 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0,
+ 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0,
+ 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0,
+ 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0,
+ 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0,
+ 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0,
+ 0x11, 0x00, 0x01, 0x2e, 0x01, 0xee, 0x01, 0xa0, 0xd4, 0x00,
+
+ /* 19 */
+ 0xb4, 0x00, 0x01, 0x8e, 0x01, 0xee, 0x01, 0xe2, 0x07, 0x00, 0x01, 0xde,
+ 0x01, 0xee, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xfa,
+ 0x06, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0x08,
+ 0x02, 0xff, 0x01, 0x20, 0x05, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xfa,
+ 0x08, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x6f,
+ 0x01, 0xff, 0x01, 0xf2, 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf2,
+ 0x05, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0x20,
+ 0x09, 0x00, 0x01, 0x08, 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x0d,
+ 0x01, 0xff, 0x01, 0xfa, 0x0a, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff,
+ 0x01, 0x90, 0x03, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00,
+ 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0x90, 0x0b, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x05, 0x02, 0xff, 0x01, 0x20, 0x0b, 0x00, 0x01, 0x07, 0x02, 0xff,
+ 0x01, 0x20, 0x01, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf9, 0x0d, 0x00,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x5f, 0x01, 0xff,
+ 0x01, 0xf1, 0x0d, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x00,
+ 0x01, 0xdf, 0x01, 0xff, 0x01, 0x80, 0x0d, 0x00, 0x01, 0x0e, 0x01, 0xff,
+ 0x01, 0xf9, 0x01, 0x05, 0x02, 0xff, 0x01, 0x10, 0x0d, 0x00, 0x01, 0x07,
+ 0x02, 0xff, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf8, 0x0f, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xf1, 0x0f, 0x00, 0x01, 0x7f,
+ 0x03, 0xff, 0x01, 0x80, 0x0f, 0x00, 0x01, 0x0e, 0x02, 0xff, 0x01, 0xfe,
+ 0x01, 0x10, 0x0f, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0xf7, 0x11, 0x00,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0xe0, 0x10, 0x00, 0x01, 0x01, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x70, 0x10, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfe,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf6, 0x11, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0xe0, 0x10, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x60,
+ 0x10, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfe, 0x11, 0x00, 0x01, 0x3f,
+ 0x01, 0xff, 0x01, 0xf6, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xd0,
+ 0x10, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x0c,
+ 0x01, 0xee, 0x01, 0xec, 0xd7, 0x00,
+
+ /* 20 */
+ 0xbb, 0x00, 0x01, 0x0b, 0x01, 0xee, 0x01, 0xe2, 0x11, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xf2, 0x11, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf2,
+ 0x10, 0x00, 0x01, 0x01, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x10,
+ 0x0d, 0x00, 0x01, 0x48, 0x01, 0xce, 0x05, 0xff, 0x01, 0xfd, 0x01, 0x96,
+ 0x01, 0x10, 0x09, 0x00, 0x01, 0x7d, 0x09, 0xff, 0x01, 0xfa, 0x01, 0x20,
+ 0x07, 0x00, 0x01, 0x2d, 0x0b, 0xff, 0x01, 0xf6, 0x06, 0x00, 0x01, 0x03,
+ 0x01, 0xef, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x75, 0x01, 0x4d, 0x01, 0xff,
+ 0x01, 0xf6, 0x01, 0x56, 0x01, 0x9d, 0x03, 0xff, 0x01, 0x80, 0x05, 0x00,
+ 0x01, 0x1e, 0x02, 0xff, 0x01, 0xe6, 0x02, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x02, 0x00, 0x01, 0x3b, 0x02, 0xff, 0x01, 0xf5, 0x05, 0x00,
+ 0x01, 0x8f, 0x01, 0xff, 0x01, 0xfb, 0x01, 0x10, 0x02, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xfe,
+ 0x05, 0x00, 0x02, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x03, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0x50, 0x03, 0x00,
+ 0x01, 0x05, 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00,
+ 0x01, 0x08, 0x01, 0xff, 0x01, 0xfc, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe0, 0x03, 0x00,
+ 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x04, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf0, 0x03, 0x00,
+ 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00,
+ 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00,
+ 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x04, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf0, 0x03, 0x00,
+ 0x01, 0x08, 0x01, 0xff, 0x01, 0xfc, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe0, 0x03, 0x00,
+ 0x01, 0x05, 0x02, 0xff, 0x01, 0x30, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x04, 0x00,
+ 0x02, 0xff, 0x01, 0xd1, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf2,
+ 0x03, 0x00, 0x01, 0x08, 0x02, 0xff, 0x01, 0x60, 0x04, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x02, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf2, 0x03, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xfe, 0x05, 0x00,
+ 0x01, 0x1e, 0x02, 0xff, 0x01, 0xf7, 0x01, 0x10, 0x01, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xf2, 0x02, 0x00, 0x01, 0x4c, 0x02, 0xff, 0x01, 0xf6,
+ 0x05, 0x00, 0x01, 0x04, 0x03, 0xff, 0x01, 0xfb, 0x01, 0x86, 0x01, 0x5d,
+ 0x01, 0xff, 0x01, 0xf6, 0x01, 0x67, 0x01, 0xae, 0x03, 0xff, 0x01, 0xa0,
+ 0x06, 0x00, 0x01, 0x4e, 0x0b, 0xff, 0x01, 0xf8, 0x07, 0x00, 0x01, 0x01,
+ 0x01, 0x8e, 0x09, 0xff, 0x01, 0xfb, 0x01, 0x30, 0x09, 0x00, 0x01, 0x48,
+ 0x01, 0xbe, 0x05, 0xff, 0x01, 0xed, 0x01, 0xa6, 0x01, 0x10, 0x0d, 0x00,
+ 0x01, 0x1c, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x10, 0x10, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xf2, 0x11, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf2,
+ 0x11, 0x00, 0x01, 0x0b, 0x01, 0xee, 0x01, 0xe2, 0xd2, 0x00,
+
+ /* 21 */
+ 0xb4, 0x00, 0x01, 0x0b, 0x01, 0xee, 0x01, 0xec, 0x07, 0x00, 0x01, 0x2e,
+ 0x01, 0xee, 0x01, 0xe7, 0x07, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x80,
+ 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00, 0x01, 0x6f,
+ 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0x20,
+ 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfd, 0x05, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xf6, 0x09, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff,
+ 0x01, 0x80, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xb0, 0x0a, 0x00,
+ 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf3, 0x03, 0x00, 0x01, 0x06, 0x01, 0xff,
+ 0x01, 0xfe, 0x01, 0x10, 0x0a, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfd,
+ 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf5, 0x0b, 0x00, 0x01, 0x01,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0x80, 0x02, 0x00, 0x01, 0xbf, 0x01, 0xff,
+ 0x01, 0x90, 0x0c, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00,
+ 0x01, 0x06, 0x01, 0xff, 0x01, 0xfd, 0x0d, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xfd, 0x01, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf3, 0x0e, 0x00,
+ 0x01, 0xdf, 0x01, 0xff, 0x01, 0x80, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x70,
+ 0x0e, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf9, 0x01, 0xff, 0x01, 0xfc,
+ 0x0f, 0x00, 0x01, 0x08, 0x03, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0xcf,
+ 0x02, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xfc,
+ 0x11, 0x00, 0x01, 0xaf, 0x02, 0xff, 0x01, 0x30, 0x0f, 0x00, 0x01, 0x05,
+ 0x03, 0xff, 0x01, 0xd0, 0x0f, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xfd,
+ 0x01, 0xff, 0x01, 0xf9, 0x0f, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x91,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0x50, 0x0d, 0x00, 0x01, 0x07, 0x01, 0xff,
+ 0x01, 0xfd, 0x01, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe1, 0x0d, 0x00,
+ 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, 0x01, 0x0b, 0x01, 0xff,
+ 0x01, 0xfb, 0x0d, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00,
+ 0x01, 0x01, 0x02, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xfd, 0x03, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00,
+ 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x03, 0x00, 0x01, 0x0b, 0x01, 0xff,
+ 0x01, 0xfc, 0x0a, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x01, 0x80,
+ 0x03, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x0a,
+ 0x01, 0xff, 0x01, 0xfd, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf4,
+ 0x09, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x07, 0x00, 0x01, 0x02, 0x02, 0xff,
+ 0x01, 0x80, 0x05, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0xa0, 0x07, 0x00,
+ 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfd, 0x07, 0x00, 0x01, 0x6f, 0x01, 0xff,
+ 0x01, 0xf5, 0x07, 0x00, 0x01, 0x6e, 0x01, 0xee, 0x01, 0xe3, 0x07, 0x00,
+ 0x01, 0x0b, 0x01, 0xee, 0x01, 0xed, 0x01, 0x10, 0xce, 0x00,
+
+ /* 22 */
+ 0xb5, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9e,
+ 0x01, 0xee, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
+ 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xe6, 0x07, 0x66, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x51,
+ 0x01, 0x10, 0x06, 0x00, 0x01, 0x1f, 0x0c, 0xff, 0x01, 0xf1, 0x06, 0x00,
+ 0x01, 0x1f, 0x0c, 0xff, 0x01, 0xf1, 0x06, 0x00, 0x01, 0x1f, 0x0c, 0xff,
+ 0x01, 0xf1, 0x11, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf1, 0x11, 0x00,
+ 0x01, 0x03, 0x01, 0xff, 0x01, 0xf1, 0x11, 0x00, 0x01, 0x03, 0x01, 0xff,
+ 0x01, 0xf1, 0x11, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf1, 0x11, 0x00,
+ 0x01, 0x03, 0x01, 0xff, 0x01, 0xf1, 0x11, 0x00, 0x01, 0x01, 0x01, 0x77,
+ 0x01, 0x70, 0x55, 0x00,
+
+ /* 23 */
+ 0xb4, 0x00, 0x01, 0x04, 0x01, 0xee, 0x01, 0xe8, 0x06, 0x00, 0x01, 0xbe,
+ 0x01, 0xee, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8,
+ 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10,
+ 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8,
+ 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10,
+ 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8,
+ 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10,
+ 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8,
+ 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10,
+ 0x08, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfa,
+ 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10,
+ 0x09, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xba, 0x04, 0xaa,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0x0b, 0x09, 0xff,
+ 0x01, 0x10, 0x0a, 0x00, 0x01, 0x8f, 0x08, 0xff, 0x01, 0x10, 0x0a, 0x00,
+ 0x01, 0x01, 0x01, 0x69, 0x05, 0xaa, 0x01, 0xef, 0x01, 0xff, 0x01, 0x10,
+ 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10,
+ 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10,
+ 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10,
+ 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xbe,
+ 0x01, 0xee, 0x01, 0x10, 0xd0, 0x00,
+
+ /* 24 */
+ 0xb5, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x1e,
+ 0x01, 0xee, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xc0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe6, 0x03, 0x66, 0x01, 0x7f,
+ 0x01, 0xff, 0x01, 0xe6, 0x03, 0x66, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x0d, 0xff, 0x01, 0xd0, 0x05, 0x00, 0x01, 0x1f,
+ 0x0d, 0xff, 0x01, 0xd0, 0x05, 0x00, 0x01, 0x1f, 0x0d, 0xff, 0x01, 0xc0,
+ 0xcc, 0x00,
+
+ /* 25 */
+ 0xb5, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x1e,
+ 0x01, 0xee, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xc0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe6, 0x03, 0x66, 0x01, 0x7f,
+ 0x01, 0xff, 0x01, 0xe6, 0x03, 0x66, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd1,
+ 0x01, 0x10, 0x04, 0x00, 0x01, 0x1f, 0x0e, 0xff, 0x01, 0xfa, 0x04, 0x00,
+ 0x01, 0x1f, 0x0e, 0xff, 0x01, 0xfa, 0x04, 0x00, 0x01, 0x1f, 0x0e, 0xff,
+ 0x01, 0xfa, 0x12, 0x00, 0x01, 0xbf, 0x01, 0xfa, 0x12, 0x00, 0x01, 0xbf,
+ 0x01, 0xfa, 0x12, 0x00, 0x01, 0xbf, 0x01, 0xfa, 0x12, 0x00, 0x01, 0xbf,
+ 0x01, 0xfa, 0x12, 0x00, 0x01, 0xbf, 0x01, 0xfa, 0x12, 0x00, 0x01, 0x57,
+ 0x01, 0x74, 0x53, 0x00,
+
+ /* 26 */
+ 0xb5, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe8,
+ 0x03, 0x88, 0x01, 0x76, 0x01, 0x53, 0x0c, 0x00, 0x01, 0x1f, 0x07, 0xff,
+ 0x01, 0xfb, 0x01, 0x50, 0x0a, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xfd,
+ 0x01, 0x30, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xfc, 0x03, 0xcc,
+ 0x01, 0xcd, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x04, 0x00, 0x01, 0x01, 0x01, 0x7e, 0x02, 0xff,
+ 0x01, 0x20, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00,
+ 0x01, 0x02, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf1,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x06, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf9,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x06, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2,
+ 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0xaf,
+ 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x05, 0x00, 0x01, 0x1a, 0x02, 0xff, 0x01, 0x40, 0x08, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd6, 0x04, 0x66, 0x01, 0x7b, 0x02, 0xff, 0x01, 0xf9,
+ 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x1f,
+ 0x08, 0xff, 0x01, 0xe6, 0x0a, 0x00, 0x01, 0x1e, 0x06, 0xee, 0x01, 0xed,
+ 0x01, 0xa5, 0xd2, 0x00,
+
+ /* 27 */
+ 0xb5, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xb0, 0x0a, 0x00, 0x01, 0x3e,
+ 0x01, 0xee, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0,
+ 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f,
+ 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0,
+ 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f,
+ 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0,
+ 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f,
+ 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xe8, 0x03, 0x88, 0x01, 0x76, 0x01, 0x52, 0x05, 0x00,
+ 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x07, 0xff,
+ 0x01, 0xfb, 0x01, 0x50, 0x03, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0,
+ 0x04, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xfd, 0x01, 0x30, 0x02, 0x00,
+ 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xfd, 0x04, 0xdd, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf5, 0x02, 0x00,
+ 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x04, 0x00, 0x01, 0x01, 0x01, 0x7e, 0x02, 0xff, 0x01, 0x20,
+ 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x02, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0xb0, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x3f, 0x01, 0xff,
+ 0x01, 0xf1, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0b, 0x01, 0xff,
+ 0x01, 0xf6, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x06, 0x01, 0xff,
+ 0x01, 0xf8, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x04, 0x01, 0xff,
+ 0x01, 0xf9, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x05, 0x01, 0xff,
+ 0x01, 0xf8, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xf6, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0e, 0x01, 0xff,
+ 0x01, 0xf2, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0xaf, 0x01, 0xff,
+ 0x01, 0xc0, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x1a, 0x02, 0xff,
+ 0x01, 0x40, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd6, 0x04, 0x66, 0x01, 0x7a, 0x02, 0xff,
+ 0x01, 0xf9, 0x02, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00,
+ 0x01, 0x1f, 0x09, 0xff, 0x01, 0xa0, 0x02, 0x00, 0x01, 0x3f, 0x01, 0xff,
+ 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xe6, 0x03, 0x00,
+ 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1e, 0x06, 0xee,
+ 0x01, 0xed, 0x01, 0xa5, 0x04, 0x00, 0x01, 0x3e, 0x01, 0xee, 0x01, 0xa0,
+ 0xcb, 0x00,
+
+ /* 28 */
+ 0xb4, 0x00, 0x01, 0x2e, 0x06, 0xee, 0x01, 0x50, 0x0c, 0x00, 0x01, 0x2f,
+ 0x06, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0x2f, 0x06, 0xff, 0x01, 0x50,
+ 0x0c, 0x00, 0x01, 0x17, 0x04, 0x77, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50,
+ 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x11, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0x50, 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50,
+ 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x11, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0x50, 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50,
+ 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x11, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0xb8, 0x03, 0x88, 0x01, 0x76, 0x01, 0x41, 0x0c, 0x00,
+ 0x01, 0x8f, 0x07, 0xff, 0x01, 0xe8, 0x01, 0x20, 0x0a, 0x00, 0x01, 0x8f,
+ 0x08, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xed,
+ 0x04, 0xdd, 0x03, 0xff, 0x01, 0xc0, 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff,
+ 0x01, 0x50, 0x04, 0x00, 0x01, 0x03, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xfb,
+ 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x07,
+ 0x02, 0xff, 0x01, 0x40, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50,
+ 0x06, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xe0,
+ 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50,
+ 0x06, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1,
+ 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50,
+ 0x06, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x50,
+ 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x4e,
+ 0x01, 0xff, 0x01, 0xfd, 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x96,
+ 0x04, 0x66, 0x01, 0x8d, 0x02, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x01, 0x8f,
+ 0x08, 0xff, 0x01, 0xfe, 0x01, 0x40, 0x09, 0x00, 0x01, 0x8f, 0x08, 0xff,
+ 0x01, 0xb2, 0x0a, 0x00, 0x01, 0x7e, 0x06, 0xee, 0x01, 0xec, 0x01, 0x83,
+ 0xce, 0x00,
+
+ /* 29 */
+ 0xa5, 0x00, 0x01, 0x14, 0x01, 0x56, 0x01, 0x54, 0x01, 0x20, 0x0e, 0x00,
+ 0x01, 0x02, 0x01, 0x8e, 0x03, 0xff, 0x01, 0xfe, 0x01, 0xa4, 0x0d, 0x00,
+ 0x01, 0x8f, 0x06, 0xff, 0x01, 0xc2, 0x0b, 0x00, 0x01, 0x0c, 0x08, 0xff,
+ 0x01, 0x50, 0x0a, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x73,
+ 0x01, 0x00, 0x01, 0x01, 0x01, 0x49, 0x02, 0xff, 0x01, 0xf6, 0x09, 0x00,
+ 0x01, 0x05, 0x02, 0xff, 0x01, 0x80, 0x04, 0x00, 0x01, 0x2c, 0x02, 0xff,
+ 0x01, 0x30, 0x08, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00,
+ 0x01, 0xaf, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x5f, 0x01, 0xff,
+ 0x01, 0xd0, 0x06, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00,
+ 0x01, 0xaf, 0x01, 0xff, 0x01, 0x60, 0x06, 0x00, 0x01, 0x03, 0x01, 0xff,
+ 0x01, 0xfe, 0x08, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, 0x07, 0x00,
+ 0x01, 0xbf, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x55, 0x01, 0x54,
+ 0x08, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x90, 0x11, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1,
+ 0x11, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf4, 0x0a, 0x00, 0x01, 0xbf,
+ 0x08, 0xff, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0xbf, 0x08, 0xff, 0x01, 0xf6,
+ 0x0a, 0x00, 0x01, 0xbf, 0x08, 0xff, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0x35,
+ 0x06, 0x55, 0x01, 0x5a, 0x01, 0xff, 0x01, 0xf6, 0x11, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xf5, 0x11, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3,
+ 0x06, 0x00, 0x01, 0x09, 0x01, 0xee, 0x01, 0xe5, 0x08, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0xf0, 0x06, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf8,
+ 0x08, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xd0, 0x06, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70,
+ 0x06, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x20, 0x07, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x20, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x90,
+ 0x06, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x5f,
+ 0x01, 0xff, 0x01, 0xf3, 0x06, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf3,
+ 0x08, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x04, 0x00,
+ 0x01, 0x06, 0x02, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff,
+ 0x01, 0xe6, 0x03, 0x00, 0x01, 0x03, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xfd,
+ 0x0a, 0x00, 0x01, 0x5f, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x87, 0x01, 0x8a,
+ 0x01, 0xef, 0x02, 0xff, 0x01, 0xd1, 0x0a, 0x00, 0x01, 0x04, 0x01, 0xef,
+ 0x06, 0xff, 0x01, 0xfb, 0x01, 0x10, 0x0b, 0x00, 0x01, 0x19, 0x05, 0xff,
+ 0x01, 0xfc, 0x01, 0x50, 0x0d, 0x00, 0x01, 0x15, 0x01, 0x9b, 0x01, 0xde,
+ 0x01, 0xdc, 0x01, 0xa7, 0x01, 0x20, 0xbe, 0x00,
+
+ /* 30 */
+ 0xab, 0x00, 0x01, 0x13, 0x01, 0x56, 0x01, 0x54, 0x01, 0x20, 0x06, 0x00,
+ 0x01, 0x1e, 0x01, 0xee, 0x01, 0xb0, 0x05, 0x00, 0x01, 0x02, 0x01, 0x8d,
+ 0x03, 0xff, 0x01, 0xfe, 0x01, 0x93, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x04, 0x00, 0x01, 0x01, 0x01, 0x9f, 0x06, 0xff, 0x01, 0xb2,
+ 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x04, 0x00, 0x01, 0x3e,
+ 0x08, 0xff, 0x01, 0x50, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0,
+ 0x03, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xfc, 0x01, 0x62, 0x01, 0x00,
+ 0x01, 0x02, 0x01, 0x6b, 0x02, 0xff, 0x01, 0xf6, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0xfe,
+ 0x01, 0x40, 0x04, 0x00, 0x01, 0x3d, 0x02, 0xff, 0x01, 0x30, 0x02, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xff,
+ 0x01, 0xd1, 0x05, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xd0,
+ 0x02, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x04,
+ 0x02, 0xff, 0x01, 0x10, 0x06, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0xf7,
+ 0x02, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xf6, 0x07, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfd,
+ 0x02, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x40,
+ 0x01, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x7f,
+ 0x01, 0xff, 0x01, 0x80, 0x08, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x90,
+ 0x01, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x20, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x01, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x09, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf0, 0x01, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x01, 0x00, 0x01, 0x01, 0x01, 0xff,
+ 0x01, 0xfc, 0x09, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00,
+ 0x01, 0x1f, 0x05, 0xff, 0x01, 0xfb, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xf4, 0x01, 0x00, 0x01, 0x1f, 0x05, 0xff, 0x01, 0xfa, 0x09, 0x00,
+ 0x01, 0x08, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00, 0x01, 0x1f, 0x05, 0xff,
+ 0x01, 0xf9, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe5, 0x01, 0x55, 0x01, 0x57, 0x01, 0xff,
+ 0x01, 0xfa, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x01, 0x00, 0x01, 0x01, 0x01, 0xff,
+ 0x01, 0xfb, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0xff, 0x01, 0xfd,
+ 0x09, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1, 0x01, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x10,
+ 0x08, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x50,
+ 0x08, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xb0,
+ 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2,
+ 0x07, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfe, 0x02, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb,
+ 0x07, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x02, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x70,
+ 0x06, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf7,
+ 0x05, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0x30, 0x02, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0xc4,
+ 0x03, 0x00, 0x01, 0x03, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xf6, 0x03, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x9f, 0x02, 0xff,
+ 0x01, 0xea, 0x01, 0x87, 0x01, 0x8a, 0x01, 0xef, 0x02, 0xff, 0x01, 0x50,
+ 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x06,
+ 0x07, 0xff, 0x01, 0xd4, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0,
+ 0x05, 0x00, 0x01, 0x19, 0x05, 0xff, 0x01, 0xe7, 0x0e, 0x00, 0x01, 0x04,
+ 0x01, 0x9b, 0x01, 0xce, 0x01, 0xdc, 0x01, 0x95, 0xb9, 0x00,
+
+ /* 31 */
+ 0xb7, 0x00, 0x01, 0x04, 0x01, 0x9c, 0x01, 0xde, 0x06, 0xee, 0x01, 0xc0,
+ 0x09, 0x00, 0x01, 0x04, 0x01, 0xdf, 0x08, 0xff, 0x01, 0xd0, 0x09, 0x00,
+ 0x01, 0x6f, 0x09, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x04, 0x02, 0xff,
+ 0x01, 0xfb, 0x01, 0x87, 0x04, 0x77, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd0,
+ 0x08, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x20, 0x05, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff,
+ 0x01, 0xe1, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00,
+ 0x01, 0x9f, 0x01, 0xff, 0x01, 0x60, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xd0, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x06, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0xcf, 0x01, 0xff,
+ 0x01, 0x10, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00,
+ 0x01, 0xaf, 0x01, 0xff, 0x01, 0x20, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xd0, 0x08, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00,
+ 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xd0, 0x08, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0xe8,
+ 0x01, 0x54, 0x04, 0x44, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xd0, 0x09, 0x00,
+ 0x01, 0x4f, 0x09, 0xff, 0x01, 0xd0, 0x09, 0x00, 0x01, 0x03, 0x01, 0xdf,
+ 0x08, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0x05, 0x01, 0xae, 0x07, 0xff,
+ 0x01, 0xd0, 0x0c, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x32,
+ 0x01, 0x22, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xd0, 0x0c, 0x00, 0x01, 0xaf,
+ 0x01, 0xff, 0x01, 0xe2, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0,
+ 0x0b, 0x00, 0x01, 0x08, 0x02, 0xff, 0x01, 0x30, 0x02, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0xd0, 0x0b, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf5,
+ 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0x04,
+ 0x02, 0xff, 0x01, 0x60, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0,
+ 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0xd0, 0x09, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff,
+ 0x01, 0x90, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x09, 0x00,
+ 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xd0, 0x09, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff,
+ 0x01, 0xfd, 0x01, 0x10, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0,
+ 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xe1, 0x06, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0x20,
+ 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x5f,
+ 0x01, 0xff, 0x01, 0xf4, 0x07, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0,
+ 0xcf, 0x00,
+
+ /* 32 */
+ 0xff, 0x00, 0x45, 0x00, 0x01, 0x01, 0x01, 0x11, 0x10, 0x00, 0x01, 0x02,
+ 0x01, 0x8d, 0x02, 0xff, 0x01, 0xfd, 0x01, 0x93, 0x0e, 0x00, 0x01, 0x9f,
+ 0x05, 0xff, 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x0b, 0x06, 0xff, 0x01, 0xfb,
+ 0x0c, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x42, 0x01, 0x12,
+ 0x01, 0x4a, 0x02, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0xcf, 0x01, 0xff,
+ 0x01, 0x30, 0x03, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x90, 0x0b, 0x00,
+ 0x01, 0xff, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xb0,
+ 0x0a, 0x00, 0x01, 0x02, 0x01, 0xdd, 0x01, 0xd5, 0x04, 0x00, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xc0,
+ 0x11, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xc0, 0x0e, 0x00, 0x01, 0x02,
+ 0x01, 0x57, 0x01, 0xad, 0x02, 0xff, 0x01, 0xc0, 0x0c, 0x00, 0x01, 0x16,
+ 0x01, 0xad, 0x05, 0xff, 0x01, 0xc0, 0x0b, 0x00, 0x01, 0x09, 0x04, 0xff,
+ 0x01, 0xfe, 0x01, 0x9d, 0x01, 0xff, 0x01, 0xc0, 0x0b, 0x00, 0x01, 0xcf,
+ 0x02, 0xff, 0x01, 0xc9, 0x01, 0x64, 0x01, 0x10, 0x01, 0x0b, 0x01, 0xff,
+ 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x71,
+ 0x03, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xc0,
+ 0x0a, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x70,
+ 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xc0,
+ 0x0a, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0x0a,
+ 0x02, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0x83,
+ 0x01, 0x12, 0x01, 0x48, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf4, 0x0b, 0x00,
+ 0x01, 0xcf, 0x05, 0xff, 0x01, 0x76, 0x02, 0xff, 0x01, 0xf6, 0x0a, 0x00,
+ 0x01, 0x1b, 0x04, 0xff, 0x01, 0xc3, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff,
+ 0x01, 0xf6, 0x0b, 0x00, 0x01, 0x39, 0x01, 0xce, 0x01, 0xdc, 0x01, 0x94,
+ 0x02, 0x00, 0x01, 0x2a, 0x01, 0xde, 0x01, 0xb3, 0xbd, 0x00,
+
+ /* 33 */
+ 0x93, 0x00, 0x01, 0x03, 0x01, 0xcc, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xd0, 0x10, 0x00, 0x01, 0x26, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0xa0, 0x0d, 0x00, 0x01, 0x02, 0x01, 0x69, 0x01, 0xbe, 0x03, 0xff,
+ 0x01, 0x40, 0x0c, 0x00, 0x01, 0x02, 0x01, 0xcf, 0x04, 0xff, 0x01, 0xf6,
+ 0x0d, 0x00, 0x01, 0x3f, 0x03, 0xff, 0x01, 0xfe, 0x01, 0xa6, 0x01, 0x10,
+ 0x0d, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x85, 0x01, 0x10,
+ 0x0e, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, 0x11, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x40, 0x11, 0x00, 0x01, 0x7f, 0x01, 0xf7, 0x02, 0x00,
+ 0x01, 0x10, 0x0f, 0x00, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0x3a, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0xfb, 0x01, 0x71, 0x0c, 0x00, 0x01, 0x01, 0x01, 0xff,
+ 0x01, 0x99, 0x04, 0xff, 0x01, 0xfe, 0x01, 0x60, 0x0b, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xdf, 0x05, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x08,
+ 0x02, 0xff, 0x01, 0xfe, 0x01, 0x72, 0x01, 0x11, 0x01, 0x5b, 0x02, 0xff,
+ 0x01, 0x50, 0x0a, 0x00, 0x01, 0x0b, 0x02, 0xff, 0x01, 0xc1, 0x03, 0x00,
+ 0x01, 0x7f, 0x01, 0xff, 0x01, 0xe1, 0x0a, 0x00, 0x01, 0x0d, 0x01, 0xff,
+ 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf7,
+ 0x0a, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, 0x01, 0x01,
+ 0x01, 0xff, 0x01, 0xfd, 0x0a, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf1,
+ 0x05, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x50,
+ 0x09, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x80,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90,
+ 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x05, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90,
+ 0x05, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x50,
+ 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8,
+ 0x04, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfd, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf6,
+ 0x0b, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xe3, 0x03, 0x00, 0x01, 0xaf,
+ 0x01, 0xff, 0x01, 0xd0, 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0xa6,
+ 0x01, 0x45, 0x01, 0x8e, 0x02, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0x01,
+ 0x01, 0xcf, 0x05, 0xff, 0x01, 0xf5, 0x0d, 0x00, 0x01, 0x08, 0x04, 0xff,
+ 0x01, 0xfc, 0x01, 0x30, 0x0e, 0x00, 0x01, 0x16, 0x01, 0xac, 0x01, 0xed,
+ 0x01, 0xc8, 0x01, 0x30, 0xc0, 0x00,
+
+ /* 34 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x04, 0x77, 0x01, 0x63, 0x0e, 0x00,
+ 0x01, 0xef, 0x05, 0xff, 0x01, 0xd5, 0x0d, 0x00, 0x01, 0xef, 0x06, 0xff,
+ 0x01, 0x60, 0x0c, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x02, 0x99, 0x01, 0xac,
+ 0x02, 0xff, 0x01, 0xf1, 0x0c, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00,
+ 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x03, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf7, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x03, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xe0,
+ 0x0c, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x02, 0x99, 0x01, 0xac, 0x02, 0xff,
+ 0x01, 0x40, 0x0c, 0x00, 0x01, 0xef, 0x05, 0xff, 0x01, 0xf3, 0x0d, 0x00,
+ 0x01, 0xef, 0x05, 0xff, 0x01, 0xfe, 0x01, 0x60, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xfc, 0x03, 0x88, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x02, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0x30, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x5f,
+ 0x01, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00,
+ 0x01, 0x2f, 0x01, 0xff, 0x01, 0x90, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x04, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x90, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x70, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xfa, 0x03, 0x22, 0x01, 0x4b, 0x02, 0xff, 0x01, 0x10,
+ 0x0b, 0x00, 0x01, 0xef, 0x06, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0xef,
+ 0x06, 0xff, 0x01, 0x80, 0x0c, 0x00, 0x01, 0xef, 0x04, 0xff, 0x01, 0xfd,
+ 0x01, 0x93, 0xd4, 0x00,
+
+ /* 35 */
+ 0xff, 0x00, 0x56, 0x00, 0x06, 0x77, 0x01, 0x70, 0x0d, 0x00, 0x01, 0xef,
+ 0x05, 0xff, 0x01, 0xf0, 0x0d, 0x00, 0x01, 0xef, 0x05, 0xff, 0x01, 0xf0,
+ 0x0d, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x04, 0x99, 0x01, 0x90, 0x0d, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0xd9, 0x00,
+
+ /* 36 */
+ 0xff, 0x00, 0x58, 0x00, 0x01, 0x57, 0x06, 0x77, 0x01, 0x20, 0x0c, 0x00,
+ 0x01, 0xcf, 0x06, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0xdf, 0x06, 0xff,
+ 0x01, 0x50, 0x0c, 0x00, 0x01, 0xdf, 0x01, 0xfd, 0x03, 0x99, 0x01, 0xaf,
+ 0x01, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0xdf, 0x01, 0xfa, 0x03, 0x00,
+ 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0xef, 0x01, 0xfa,
+ 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xfa, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0c, 0x00,
+ 0x01, 0xef, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50,
+ 0x0c, 0x00, 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff,
+ 0x01, 0x50, 0x0c, 0x00, 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf8,
+ 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x03,
+ 0x01, 0xff, 0x01, 0xf6, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50,
+ 0x0b, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf5, 0x03, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf3,
+ 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xf0, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50,
+ 0x0b, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90,
+ 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x6f,
+ 0x01, 0xff, 0x01, 0x30, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50,
+ 0x0a, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xfd, 0x04, 0x22, 0x01, 0x4f,
+ 0x01, 0xff, 0x01, 0x50, 0x09, 0x00, 0x01, 0x6a, 0x01, 0xae, 0x08, 0xff,
+ 0x01, 0xca, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x9f, 0x0a, 0xff, 0x01, 0xf0,
+ 0x08, 0x00, 0x01, 0x9f, 0x0a, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f,
+ 0x01, 0xf5, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f,
+ 0x01, 0xf5, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f,
+ 0x01, 0xf5, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f,
+ 0x01, 0xf5, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x8e,
+ 0x01, 0xe5, 0x08, 0x00, 0x01, 0xde, 0x01, 0xe0, 0x6c, 0x00,
+
+ /* 37 */
+ 0xff, 0x00, 0x58, 0x00, 0x01, 0x28, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfc,
+ 0x01, 0x71, 0x0e, 0x00, 0x01, 0x09, 0x05, 0xff, 0x01, 0x60, 0x0c, 0x00,
+ 0x01, 0x01, 0x01, 0xcf, 0x05, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xfe, 0x01, 0x73, 0x01, 0x11, 0x01, 0x5b, 0x02, 0xff,
+ 0x01, 0x50, 0x0b, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xc1, 0x03, 0x00,
+ 0x01, 0x5f, 0x01, 0xff, 0x01, 0xe0, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xfe,
+ 0x01, 0x10, 0x03, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00,
+ 0x01, 0x05, 0x01, 0xff, 0x01, 0xf5, 0x05, 0x00, 0x01, 0xdf, 0x01, 0xfc,
+ 0x0a, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0x7f,
+ 0x01, 0xff, 0x0a, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xb0, 0x05, 0x00,
+ 0x01, 0x4f, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xc6, 0x05, 0x66, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x60, 0x09, 0x00,
+ 0x01, 0x1f, 0x09, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x2f, 0x09, 0xff,
+ 0x01, 0x80, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xb6, 0x07, 0x66,
+ 0x01, 0x30, 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x80, 0x11, 0x00,
+ 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x0a, 0x01, 0xff,
+ 0x01, 0xf0, 0x05, 0x00, 0x01, 0x48, 0x01, 0x88, 0x0a, 0x00, 0x01, 0x06,
+ 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xef, 0x01, 0xfc, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x07, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd2, 0x03, 0x00,
+ 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe1, 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff,
+ 0x01, 0xa6, 0x01, 0x45, 0x01, 0x7c, 0x02, 0xff, 0x01, 0x50, 0x0b, 0x00,
+ 0x01, 0x01, 0x01, 0xcf, 0x05, 0xff, 0x01, 0xf6, 0x0d, 0x00, 0x01, 0x08,
+ 0x04, 0xff, 0x01, 0xfd, 0x01, 0x40, 0x0e, 0x00, 0x01, 0x16, 0x01, 0xad,
+ 0x01, 0xee, 0x01, 0xc9, 0x01, 0x40, 0xc0, 0x00,
+
+ /* 38 */
+ 0xff, 0x00, 0x55, 0x00, 0x01, 0x03, 0x02, 0x77, 0x03, 0x00, 0x01, 0x01,
+ 0x01, 0x77, 0x01, 0x71, 0x03, 0x00, 0x01, 0x06, 0x01, 0x77, 0x01, 0x73,
+ 0x06, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xb0, 0x02, 0x00, 0x01, 0x03,
+ 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xb0,
+ 0x06, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfb, 0x02, 0x00, 0x01, 0x03,
+ 0x01, 0xff, 0x01, 0xf4, 0x02, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfb,
+ 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x03,
+ 0x01, 0xff, 0x01, 0xf4, 0x02, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xc0,
+ 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfa, 0x01, 0x00, 0x01, 0x03,
+ 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfc,
+ 0x0a, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x03, 0x01, 0xff,
+ 0x01, 0xf4, 0x01, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00,
+ 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf9, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4,
+ 0x01, 0x08, 0x01, 0xff, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0xbf, 0x01, 0xff,
+ 0x01, 0x93, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xc1,
+ 0x0c, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfb, 0x01, 0xff, 0x01, 0xfb,
+ 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x0d, 0x00, 0x01, 0xcf, 0x04, 0xff,
+ 0x01, 0xd1, 0x0e, 0x00, 0x01, 0x0d, 0x03, 0xff, 0x01, 0xfd, 0x01, 0x10,
+ 0x0e, 0x00, 0x01, 0x5f, 0x04, 0xff, 0x01, 0x60, 0x0d, 0x00, 0x01, 0x05,
+ 0x05, 0xff, 0x01, 0xf6, 0x0d, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xe5,
+ 0x01, 0xff, 0x01, 0xf5, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x60, 0x0b, 0x00,
+ 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x23, 0x01, 0xff, 0x01, 0xf4,
+ 0x01, 0x1d, 0x01, 0xff, 0x01, 0xf7, 0x0b, 0x00, 0x01, 0x6f, 0x01, 0xff,
+ 0x01, 0xe2, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x01, 0x01, 0xdf,
+ 0x01, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfd,
+ 0x01, 0x20, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x1d,
+ 0x01, 0xff, 0x01, 0xf7, 0x09, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xd1,
+ 0x01, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x01,
+ 0x01, 0xdf, 0x01, 0xff, 0x01, 0x70, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff,
+ 0x01, 0xfd, 0x01, 0x10, 0x01, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4,
+ 0x02, 0x00, 0x01, 0x1c, 0x01, 0xff, 0x01, 0xf8, 0x07, 0x00, 0x01, 0x7f,
+ 0x01, 0xff, 0x01, 0xd1, 0x02, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4,
+ 0x02, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x80, 0x05, 0x00,
+ 0x01, 0x07, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x02, 0x00, 0x01, 0x03,
+ 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x1c, 0x01, 0xff, 0x01, 0xf8,
+ 0x05, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd1, 0x03, 0x00, 0x01, 0x03,
+ 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff,
+ 0x01, 0x80, 0xcc, 0x00,
+
+ /* 39 */
+ 0xff, 0x00, 0x45, 0x00, 0x01, 0x01, 0x11, 0x00, 0x01, 0x17, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0xfe, 0x01, 0xa5, 0x0e, 0x00, 0x01, 0x06, 0x05, 0xff,
+ 0x01, 0xd3, 0x0d, 0x00, 0x01, 0x5f, 0x06, 0xff, 0x01, 0x30, 0x0c, 0x00,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0xc5, 0x01, 0x21, 0x01, 0x26, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0xd0, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfb,
+ 0x03, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5, 0x0b, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xf3, 0x03, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
+ 0x0b, 0x00, 0x01, 0x05, 0x01, 0x88, 0x01, 0x80, 0x04, 0x00, 0x01, 0xff,
+ 0x01, 0xfa, 0x11, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf9, 0x11, 0x00,
+ 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf4, 0x0e, 0x00, 0x01, 0x01, 0x01, 0x33,
+ 0x01, 0x36, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x0e, 0x00, 0x01, 0x09,
+ 0x03, 0xff, 0x01, 0xfa, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x09, 0x03, 0xff,
+ 0x01, 0xfa, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x08, 0x01, 0xee, 0x03, 0xff,
+ 0x01, 0xe3, 0x10, 0x00, 0x01, 0x01, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xfd,
+ 0x11, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x06,
+ 0x01, 0x66, 0x01, 0x30, 0x04, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x70,
+ 0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xb0, 0x04, 0x00, 0x01, 0x4f,
+ 0x01, 0xff, 0x01, 0x80, 0x0a, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf1,
+ 0x04, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, 0x0a, 0x00, 0x01, 0x0a,
+ 0x01, 0xff, 0x01, 0xfb, 0x03, 0x00, 0x01, 0x04, 0x02, 0xff, 0x01, 0x10,
+ 0x0a, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0xe8, 0x01, 0x53, 0x01, 0x46,
+ 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0x7f, 0x06, 0xff,
+ 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xef, 0x04, 0xff, 0x01, 0xf7,
+ 0x0e, 0x00, 0x01, 0x05, 0x01, 0x9c, 0x01, 0xde, 0x01, 0xdc, 0x01, 0x95,
+ 0xc1, 0x00,
+
+ /* 40 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x74, 0x04, 0x00, 0x01, 0x05,
+ 0x01, 0x77, 0x01, 0x76, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00,
+ 0x01, 0x3f, 0x01, 0xff, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x03, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x0e, 0x02, 0xff, 0x01, 0xfe,
+ 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x7f, 0x01, 0xff,
+ 0x01, 0xcf, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xe1,
+ 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x3f, 0x01, 0xff, 0x01, 0x70, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0xcf, 0x01, 0xfd, 0x01, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00,
+ 0x01, 0x06, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x9f, 0x01, 0xfe,
+ 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x0e, 0x01, 0xff,
+ 0x01, 0xb0, 0x01, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x01, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x20, 0x01, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xe0, 0x02, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x4f,
+ 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x01, 0xdf, 0x01, 0xfc, 0x03, 0x00, 0x01, 0x9f,
+ 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf3, 0x03, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xa0,
+ 0x03, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x02, 0xff,
+ 0x01, 0x10, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xff, 0x01, 0xe0, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xfe,
+ 0xd2, 0x00,
+
+ /* 41 */
+ 0xca, 0x00, 0x01, 0x2a, 0x01, 0xa2, 0x03, 0x00, 0x01, 0x3a, 0x01, 0xa2,
+ 0x0d, 0x00, 0x01, 0x2f, 0x01, 0xf9, 0x03, 0x00, 0x01, 0xaf, 0x01, 0xf1,
+ 0x0d, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x82, 0x01, 0x00, 0x01, 0x29,
+ 0x01, 0xff, 0x01, 0xc0, 0x0d, 0x00, 0x01, 0x05, 0x05, 0xff, 0x01, 0x30,
+ 0x0e, 0x00, 0x01, 0x7f, 0x03, 0xff, 0x01, 0xf6, 0x0f, 0x00, 0x01, 0x02,
+ 0x01, 0x8b, 0x01, 0xdd, 0x01, 0xb8, 0x01, 0x10, 0x21, 0x00, 0x01, 0x67,
+ 0x01, 0x74, 0x04, 0x00, 0x01, 0x05, 0x01, 0x77, 0x01, 0x76, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xfe,
+ 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff,
+ 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x05,
+ 0x02, 0xff, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00,
+ 0x01, 0x0e, 0x02, 0xff, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x03, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xcf, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
+ 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf1, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x70,
+ 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0xcf, 0x01, 0xfd, 0x01, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf4,
+ 0x01, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x01, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x00, 0x01, 0x9f,
+ 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0x20, 0x01, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xe0, 0x02, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0xdf,
+ 0x01, 0xfc, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef,
+ 0x02, 0xff, 0x01, 0xf3, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00,
+ 0x01, 0xef, 0x02, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xfe,
+ 0x0b, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0x10, 0x03, 0x00, 0x01, 0x9f,
+ 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xe0,
+ 0x04, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0xd2, 0x00,
+
+ /* 42 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x74, 0x04, 0x00, 0x01, 0x67,
+ 0x01, 0x77, 0x01, 0x10, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x03, 0x00,
+ 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0xef, 0x01, 0xf8,
+ 0x03, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x60, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xf8, 0x02, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5, 0x0d, 0x00,
+ 0x01, 0xef, 0x01, 0xf8, 0x02, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x50,
+ 0x0d, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x0a, 0x01, 0xff,
+ 0x01, 0xf5, 0x0e, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x00, 0x01, 0xaf,
+ 0x01, 0xff, 0x01, 0x50, 0x0e, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x0a,
+ 0x01, 0xff, 0x01, 0xf4, 0x0f, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x40, 0x0f, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf4,
+ 0x10, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0x40, 0x10, 0x00, 0x01, 0xef,
+ 0x02, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xfa,
+ 0x10, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xb0,
+ 0x0f, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfb,
+ 0x0f, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x00, 0x01, 0xaf, 0x01, 0xff,
+ 0x01, 0xb0, 0x0e, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x0a,
+ 0x01, 0xff, 0x01, 0xfb, 0x0e, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x02, 0x00,
+ 0x01, 0x9f, 0x01, 0xff, 0x01, 0xc0, 0x0d, 0x00, 0x01, 0xef, 0x01, 0xf8,
+ 0x02, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfc, 0x0d, 0x00, 0x01, 0xef,
+ 0x01, 0xf8, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xc0, 0x0c, 0x00,
+ 0x01, 0xef, 0x01, 0xf8, 0x03, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfc,
+ 0x0c, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xff,
+ 0x01, 0xc1, 0xd2, 0x00,
+
+ /* 43 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x02, 0x06, 0x77, 0x01, 0x75, 0x0c, 0x00,
+ 0x01, 0x05, 0x06, 0xff, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x05, 0x06, 0xff,
+ 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfb, 0x03, 0xaa,
+ 0x01, 0xef, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2,
+ 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x05, 0x01, 0xff,
+ 0x01, 0xf2, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00,
+ 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc,
+ 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00, 0x01, 0xbf,
+ 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00,
+ 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0,
+ 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x08, 0x01, 0xff,
+ 0x01, 0xf0, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xf0, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00,
+ 0x01, 0x0b, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc,
+ 0x0c, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0xbf,
+ 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x80, 0x03, 0x00,
+ 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x40,
+ 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x9f, 0x01, 0xff,
+ 0x01, 0x10, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0b, 0x00, 0x01, 0x04,
+ 0x01, 0xff, 0x01, 0xf9, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0b, 0x00,
+ 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xfc,
+ 0x0b, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x70, 0x04, 0x00, 0x01, 0xbf,
+ 0x01, 0xfc, 0x0b, 0x00, 0x01, 0x9f, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf,
+ 0x01, 0xfc, 0x0b, 0x00, 0x01, 0x34, 0xc7, 0x00,
+
+ /* 44 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x77, 0x01, 0x30, 0x04, 0x00,
+ 0x01, 0x03, 0x02, 0x77, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xd0,
+ 0x04, 0x00, 0x01, 0x0b, 0x02, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff,
+ 0x01, 0xf3, 0x04, 0x00, 0x01, 0x2f, 0x02, 0xff, 0x0a, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0xfa, 0x04, 0x00, 0x01, 0x9f, 0x02, 0xff, 0x0a, 0x00,
+ 0x01, 0xef, 0x02, 0xff, 0x01, 0x10, 0x03, 0x00, 0x03, 0xff, 0x0a, 0x00,
+ 0x01, 0xef, 0x02, 0xff, 0x01, 0x80, 0x02, 0x00, 0x01, 0x06, 0x03, 0xff,
+ 0x0a, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xe0, 0x02, 0x00, 0x01, 0x0d,
+ 0x03, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x01, 0xff, 0x01, 0xf5,
+ 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x0a, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x01, 0xdf, 0x01, 0xfc, 0x02, 0x00, 0x01, 0xaf,
+ 0x01, 0xfe, 0x01, 0x8f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x01, 0x7f, 0x01, 0xff, 0x01, 0x30, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf8,
+ 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x90, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x7f,
+ 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x0a, 0x01, 0xff,
+ 0x01, 0xf1, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x7f, 0x01, 0xff,
+ 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7,
+ 0x01, 0x5f, 0x01, 0xff, 0x01, 0x40, 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0xcf, 0x01, 0xfd, 0x01, 0xcf,
+ 0x01, 0xfe, 0x01, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x01, 0x00, 0x01, 0x6f, 0x02, 0xff, 0x01, 0xf7, 0x01, 0x00,
+ 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00,
+ 0x01, 0x0f, 0x02, 0xff, 0x01, 0xf1, 0x01, 0x00, 0x01, 0x7f, 0x01, 0xff,
+ 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x09, 0x02, 0xff,
+ 0x01, 0xa0, 0x01, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x01, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x40, 0x01, 0x00,
+ 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0xcf, 0x01, 0xfd, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xf7, 0x02, 0x00,
+ 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x06, 0x01, 0x61, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x06, 0x00, 0x01, 0x7f, 0x01, 0xff, 0xd1, 0x00,
+
+ /* 45 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x74, 0x05, 0x00, 0x01, 0x77,
+ 0x01, 0x73, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x05, 0xaa, 0x01, 0xff,
+ 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x07, 0xff, 0x01, 0xf8, 0x0b, 0x00,
+ 0x01, 0xef, 0x07, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xfc,
+ 0x05, 0x77, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0xd2, 0x00,
+
+ /* 46 */
+ 0xff, 0x00, 0x58, 0x00, 0x01, 0x39, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xeb,
+ 0x01, 0x60, 0x0e, 0x00, 0x01, 0x1b, 0x04, 0xff, 0x01, 0xfe, 0x01, 0x50,
+ 0x0c, 0x00, 0x01, 0x02, 0x01, 0xef, 0x05, 0xff, 0x01, 0xf8, 0x0c, 0x00,
+ 0x01, 0x0d, 0x02, 0xff, 0x01, 0x83, 0x01, 0x12, 0x01, 0x5c, 0x02, 0xff,
+ 0x01, 0x50, 0x0b, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xd1, 0x03, 0x00,
+ 0x01, 0x7f, 0x01, 0xff, 0x01, 0xe1, 0x0a, 0x00, 0x01, 0x01, 0x01, 0xff,
+ 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf7,
+ 0x0a, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0x01,
+ 0x01, 0xff, 0x01, 0xfd, 0x0a, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf1,
+ 0x05, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x50,
+ 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x3f,
+ 0x01, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80,
+ 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90,
+ 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x05, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90,
+ 0x05, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x50,
+ 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0xaf,
+ 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8,
+ 0x04, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfd, 0x0b, 0x00, 0x02, 0xff,
+ 0x01, 0x20, 0x03, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf6, 0x0b, 0x00,
+ 0x01, 0x8f, 0x01, 0xff, 0x01, 0xe3, 0x03, 0x00, 0x01, 0xaf, 0x01, 0xff,
+ 0x01, 0xd0, 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0xa5, 0x01, 0x34,
+ 0x01, 0x7e, 0x02, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0x01, 0x01, 0xcf,
+ 0x05, 0xff, 0x01, 0xf5, 0x0d, 0x00, 0x01, 0x19, 0x04, 0xff, 0x01, 0xfc,
+ 0x01, 0x30, 0x0e, 0x00, 0x01, 0x27, 0x01, 0xbd, 0x01, 0xee, 0x01, 0xc9,
+ 0x01, 0x40, 0xc0, 0x00,
+
+ /* 47 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x07, 0x77, 0x01, 0x73, 0x0b, 0x00,
+ 0x01, 0xef, 0x07, 0xff, 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x07, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x05, 0xaa, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0xd2, 0x00,
+
+ /* 48 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x72, 0x01, 0x00, 0x01, 0x29,
+ 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc7, 0x01, 0x10, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xf4, 0x01, 0x08, 0x04, 0xff, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xf4, 0x01, 0xaf, 0x05, 0xff, 0x01, 0x80, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xfc, 0x01, 0xff, 0x01, 0xf9, 0x01, 0x42, 0x01, 0x37, 0x01, 0xdf,
+ 0x01, 0xff, 0x01, 0xf6, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfe,
+ 0x01, 0x30, 0x02, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10,
+ 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf3, 0x04, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x70, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x90,
+ 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf2,
+ 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x05, 0x01, 0xff,
+ 0x01, 0xf5, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfa, 0x06, 0x00,
+ 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x06, 0x00,
+ 0x01, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfa, 0x06, 0x00,
+ 0x01, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x05, 0x00,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfe,
+ 0x05, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2,
+ 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf4,
+ 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x70, 0x0a, 0x00, 0x01, 0xef,
+ 0x02, 0xff, 0x01, 0x40, 0x02, 0x00, 0x01, 0x1b, 0x01, 0xff, 0x01, 0xfe,
+ 0x01, 0x10, 0x0a, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x64,
+ 0x01, 0x58, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf5, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x01, 0xaf, 0x05, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x01, 0x08, 0x04, 0xff, 0x01, 0xe4, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x01, 0x00, 0x01, 0x28, 0x01, 0xce, 0x01, 0xed, 0x01, 0xa5,
+ 0x0d, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xde, 0x01, 0xe8,
+ 0x25, 0x00,
+
+ /* 49 */
+ 0xff, 0x00, 0x58, 0x00, 0x01, 0x38, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xea,
+ 0x01, 0x50, 0x0e, 0x00, 0x01, 0x19, 0x04, 0xff, 0x01, 0xfd, 0x01, 0x20,
+ 0x0c, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x05, 0xff, 0x01, 0xf2, 0x0c, 0x00,
+ 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x73, 0x01, 0x12, 0x01, 0x6d,
+ 0x01, 0xff, 0x01, 0xfd, 0x0c, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xc1,
+ 0x03, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xb0,
+ 0x0a, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, 0x01, 0x0a,
+ 0x01, 0xff, 0x01, 0xf0, 0x0a, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf1,
+ 0x04, 0x00, 0x01, 0x04, 0x01, 0xbb, 0x01, 0xb1, 0x0a, 0x00, 0x01, 0x0d,
+ 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90,
+ 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x11, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0x70, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80,
+ 0x11, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, 0x11, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x55, 0x01, 0x52, 0x0a, 0x00,
+ 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf1, 0x04, 0x00, 0x01, 0x04, 0x01, 0xff,
+ 0x01, 0xf4, 0x0a, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00,
+ 0x01, 0x09, 0x01, 0xff, 0x01, 0xf1, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xfe,
+ 0x01, 0x10, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xc0, 0x0b, 0x00,
+ 0x01, 0x8f, 0x01, 0xff, 0x01, 0xd2, 0x02, 0x00, 0x01, 0x01, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0x94,
+ 0x01, 0x34, 0x01, 0x8e, 0x01, 0xff, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x01,
+ 0x01, 0xdf, 0x05, 0xff, 0x01, 0xe1, 0x0d, 0x00, 0x01, 0x19, 0x04, 0xff,
+ 0x01, 0xfa, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x27, 0x01, 0xcd, 0x01, 0xee,
+ 0x01, 0xc8, 0x01, 0x20, 0xc0, 0x00,
+
+ /* 50 */
+ 0xff, 0x00, 0x55, 0x00, 0x01, 0x47, 0x06, 0x77, 0x01, 0x76, 0x0c, 0x00,
+ 0x01, 0x9f, 0x06, 0xff, 0x01, 0xfe, 0x0c, 0x00, 0x01, 0x9f, 0x06, 0xff,
+ 0x01, 0xfe, 0x0c, 0x00, 0x01, 0x6a, 0x02, 0xaa, 0x01, 0xdf, 0x01, 0xff,
+ 0x02, 0xaa, 0x01, 0xa9, 0x0f, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00,
+ 0x01, 0x9f, 0x01, 0xfe, 0xd7, 0x00,
+
+ /* 51 */
+ 0xff, 0x00, 0x55, 0x00, 0x01, 0x67, 0x01, 0x75, 0x05, 0x00, 0x01, 0x05,
+ 0x01, 0x77, 0x01, 0x70, 0x0a, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x05, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xb0, 0x0a, 0x00, 0x01, 0x5f, 0x01, 0xff,
+ 0x01, 0x50, 0x04, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x50, 0x0a, 0x00,
+ 0x01, 0x0f, 0x01, 0xff, 0x01, 0xb0, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xff,
+ 0x0b, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf0, 0x03, 0x00, 0x01, 0x01,
+ 0x01, 0xff, 0x01, 0xf9, 0x0b, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf5,
+ 0x03, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xfb, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xd0, 0x0c, 0x00,
+ 0x01, 0x9f, 0x01, 0xff, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x70,
+ 0x0c, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0x20, 0x0c, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0,
+ 0x02, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x0d, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xf1, 0x01, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf5, 0x0d, 0x00,
+ 0x01, 0x04, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xf0, 0x0e, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0x90, 0x0e, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x10,
+ 0x01, 0x5f, 0x01, 0xff, 0x01, 0x40, 0x0e, 0x00, 0x01, 0x3f, 0x01, 0xff,
+ 0x01, 0x50, 0x01, 0xbf, 0x01, 0xfd, 0x0f, 0x00, 0x01, 0x0d, 0x01, 0xff,
+ 0x01, 0xb1, 0x01, 0xff, 0x01, 0xf8, 0x0f, 0x00, 0x01, 0x08, 0x01, 0xff,
+ 0x01, 0xf7, 0x01, 0xff, 0x01, 0xf2, 0x0f, 0x00, 0x01, 0x03, 0x03, 0xff,
+ 0x01, 0xc0, 0x10, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0x60, 0x10, 0x00,
+ 0x01, 0x8f, 0x02, 0xff, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfa,
+ 0x11, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf4, 0x11, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x80,
+ 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x20, 0x11, 0x00, 0x01, 0xef,
+ 0x01, 0xfc, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, 0x0f, 0x00,
+ 0x01, 0x05, 0x01, 0x76, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xd0, 0x0f, 0x00,
+ 0x01, 0x09, 0x03, 0xff, 0x01, 0x50, 0x0f, 0x00, 0x01, 0x09, 0x02, 0xff,
+ 0x01, 0xf7, 0x10, 0x00, 0x01, 0x05, 0x01, 0xce, 0x01, 0xda, 0x01, 0x30,
+ 0x24, 0x00,
+
+ /* 52 */
+ 0xe3, 0x00, 0x01, 0x05, 0x01, 0x99, 0x01, 0x80, 0x11, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0,
+ 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0,
+ 0x0c, 0x00, 0x01, 0x01, 0x01, 0x8d, 0x01, 0xff, 0x01, 0xeb, 0x01, 0x40,
+ 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x02, 0x01, 0x9e, 0x01, 0xff,
+ 0x01, 0xea, 0x01, 0x50, 0x07, 0x00, 0x01, 0x6f, 0x03, 0xff, 0x01, 0xfa,
+ 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x5f, 0x03, 0xff, 0x01, 0xfc,
+ 0x01, 0x20, 0x05, 0x00, 0x01, 0x06, 0x05, 0xff, 0x01, 0x98, 0x01, 0xff,
+ 0x01, 0xe4, 0x05, 0xff, 0x01, 0xd1, 0x05, 0x00, 0x01, 0x3f, 0x01, 0xff,
+ 0x01, 0xfc, 0x01, 0x53, 0x01, 0x36, 0x01, 0xcf, 0x01, 0xfc, 0x01, 0xff,
+ 0x01, 0xfd, 0x01, 0xff, 0x01, 0x83, 0x01, 0x24, 0x01, 0x9f, 0x01, 0xff,
+ 0x01, 0xfb, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00,
+ 0x01, 0x0a, 0x03, 0xff, 0x01, 0xe2, 0x02, 0x00, 0x01, 0x03, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x40, 0x03, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfc,
+ 0x04, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0x40, 0x03, 0x00, 0x01, 0x5f,
+ 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4,
+ 0x04, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xfb, 0x04, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xe0,
+ 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, 0x01, 0x07,
+ 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0,
+ 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0x03,
+ 0x01, 0xff, 0x01, 0xf7, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90,
+ 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf9, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x04, 0x00,
+ 0x01, 0x09, 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0xff, 0x01, 0xfa,
+ 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x70, 0x04, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x03, 0x00,
+ 0x01, 0x2f, 0x01, 0xff, 0x01, 0x80, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xf0, 0x05, 0x00, 0x01, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf0,
+ 0x05, 0x00, 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff,
+ 0x01, 0xb0, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3, 0x04, 0x00,
+ 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff,
+ 0x01, 0xf0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00,
+ 0x01, 0x07, 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xf5, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xfc, 0x04, 0x00,
+ 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00, 0x01, 0x04, 0x01, 0xff,
+ 0x01, 0xfc, 0x04, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0x40, 0x03, 0x00,
+ 0x01, 0x5f, 0x01, 0xff, 0x01, 0xb0, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0xa0, 0x02, 0x00, 0x01, 0x0b, 0x03, 0xff, 0x01, 0xe3, 0x02, 0x00,
+ 0x01, 0x04, 0x02, 0xff, 0x01, 0x40, 0x04, 0x00, 0x01, 0x5f, 0x01, 0xff,
+ 0x01, 0xfd, 0x01, 0x74, 0x01, 0x47, 0x01, 0xdf, 0x01, 0xfe, 0x03, 0xff,
+ 0x01, 0x95, 0x01, 0x45, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00,
+ 0x01, 0x08, 0x05, 0xff, 0x01, 0xb8, 0x01, 0xff, 0x01, 0xe6, 0x05, 0xff,
+ 0x01, 0xd1, 0x06, 0x00, 0x01, 0x7f, 0x03, 0xff, 0x01, 0xfa, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xe0, 0x01, 0x6f, 0x03, 0xff, 0x01, 0xfa, 0x01, 0x10,
+ 0x06, 0x00, 0x01, 0x02, 0x01, 0x8c, 0x01, 0xef, 0x01, 0xdb, 0x01, 0x50,
+ 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x02, 0x01, 0x8d, 0x01, 0xee,
+ 0x01, 0xd9, 0x01, 0x30, 0x0c, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0,
+ 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0,
+ 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0,
+ 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x1e, 0x00,
+
+ /* 53 */
+ 0xff, 0x00, 0x55, 0x00, 0x01, 0x37, 0x01, 0x77, 0x01, 0x30, 0x04, 0x00,
+ 0x01, 0x17, 0x01, 0x77, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x0d, 0x01, 0xff,
+ 0x01, 0xe1, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x20, 0x0a, 0x00,
+ 0x01, 0x03, 0x01, 0xff, 0x01, 0xfb, 0x03, 0x00, 0x01, 0x06, 0x01, 0xff,
+ 0x01, 0xf6, 0x0c, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x02, 0x00,
+ 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x0d, 0x01, 0xff,
+ 0x01, 0xe1, 0x02, 0x00, 0x01, 0xcf, 0x01, 0xfe, 0x01, 0x10, 0x0c, 0x00,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x07, 0x01, 0xff,
+ 0x01, 0xf5, 0x0e, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0x90, 0x0e, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf2,
+ 0x01, 0xcf, 0x01, 0xfd, 0x0f, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfe,
+ 0x01, 0xff, 0x01, 0xf3, 0x10, 0x00, 0x01, 0x6f, 0x02, 0xff, 0x01, 0x70,
+ 0x10, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfc, 0x11, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xfd, 0x11, 0x00, 0x01, 0x4f, 0x02, 0xff, 0x01, 0x80,
+ 0x0f, 0x00, 0x01, 0x01, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf3, 0x0f, 0x00,
+ 0x01, 0x0a, 0x01, 0xff, 0x01, 0xe3, 0x01, 0xef, 0x01, 0xfd, 0x0f, 0x00,
+ 0x01, 0x6f, 0x01, 0xff, 0x01, 0x50, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x90,
+ 0x0d, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x0a,
+ 0x01, 0xff, 0x01, 0xf4, 0x0d, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xe1,
+ 0x01, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xfd, 0x0d, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x90,
+ 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xf4, 0x0b, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xe1,
+ 0x03, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xfe, 0x01, 0x10, 0x0a, 0x00,
+ 0x01, 0x9f, 0x01, 0xff, 0x01, 0x50, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff,
+ 0x01, 0xa0, 0x0a, 0x00, 0x02, 0x11, 0x05, 0x00, 0x01, 0x01, 0x01, 0x11,
+ 0x01, 0x10, 0xbe, 0x00,
+
+ /* 54 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x74, 0x05, 0x00, 0x01, 0x77,
+ 0x01, 0x73, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x11, 0x01, 0xff,
+ 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x07, 0xff, 0x01, 0xfc, 0x01, 0x99,
+ 0x0a, 0x00, 0x01, 0xef, 0x09, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x09, 0xff,
+ 0x12, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x12, 0x00, 0x01, 0x0e, 0x01, 0xff,
+ 0x12, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x12, 0x00, 0x01, 0x0e, 0x01, 0xff,
+ 0x12, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x6d, 0x00,
+
+ /* 55 */
+ 0xff, 0x00, 0x55, 0x00, 0x01, 0x02, 0x01, 0x77, 0x01, 0x71, 0x04, 0x00,
+ 0x01, 0x77, 0x01, 0x73, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2,
+ 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff,
+ 0x01, 0xf2, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00,
+ 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8,
+ 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00,
+ 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2,
+ 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff,
+ 0x01, 0xf2, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x03,
+ 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00,
+ 0x02, 0xff, 0x01, 0x85, 0x03, 0x55, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00,
+ 0x01, 0x6f, 0x06, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0x07, 0x06, 0xff,
+ 0x01, 0xf8, 0x0d, 0x00, 0x01, 0x17, 0x01, 0xbc, 0x03, 0xcc, 0x01, 0xff,
+ 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x12, 0x00, 0x01, 0x11, 0x01, 0x10, 0xbf, 0x00,
+
+ /* 56 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x66, 0x01, 0x64, 0x02, 0x00, 0x01, 0x01,
+ 0x01, 0x66, 0x01, 0x62, 0x02, 0x00, 0x01, 0x02, 0x01, 0x66, 0x01, 0x60,
+ 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff,
+ 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5,
+ 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00,
+ 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06,
+ 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff,
+ 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1,
+ 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff,
+ 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5,
+ 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00,
+ 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06,
+ 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff,
+ 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1,
+ 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff,
+ 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5,
+ 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00,
+ 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06,
+ 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff,
+ 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x11, 0x01, 0x13,
+ 0x01, 0xff, 0x01, 0xf6, 0x02, 0x11, 0x01, 0x17, 0x01, 0xff, 0x01, 0xf1,
+ 0x08, 0x00, 0x01, 0xef, 0x0a, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef,
+ 0x0a, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x0a, 0xff, 0x01, 0xf1,
+ 0xcf, 0x00,
+
+ /* 57 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x66, 0x01, 0x63, 0x02, 0x00, 0x01, 0x01,
+ 0x01, 0x66, 0x01, 0x62, 0x02, 0x00, 0x01, 0x02, 0x01, 0x66, 0x01, 0x60,
+ 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff,
+ 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5,
+ 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00,
+ 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06,
+ 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff,
+ 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1,
+ 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff,
+ 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5,
+ 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00,
+ 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06,
+ 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff,
+ 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1,
+ 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff,
+ 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5,
+ 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00,
+ 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06,
+ 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff,
+ 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x11, 0x01, 0x13,
+ 0x01, 0xff, 0x01, 0xf6, 0x02, 0x11, 0x01, 0x17, 0x01, 0xff, 0x01, 0xf1,
+ 0x08, 0x00, 0x01, 0xef, 0x0a, 0xff, 0x01, 0xf9, 0x01, 0x95, 0x07, 0x00,
+ 0x01, 0xef, 0x0b, 0xff, 0x01, 0xf9, 0x07, 0x00, 0x01, 0xef, 0x0b, 0xff,
+ 0x01, 0xf9, 0x12, 0x00, 0x01, 0x5f, 0x01, 0xf9, 0x12, 0x00, 0x01, 0x5f,
+ 0x01, 0xf9, 0x12, 0x00, 0x01, 0x5f, 0x01, 0xf9, 0x12, 0x00, 0x01, 0x5f,
+ 0x01, 0xf9, 0x12, 0x00, 0x01, 0x5f, 0x01, 0xf9, 0x6a, 0x00,
+
+ /* 58 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x56, 0x01, 0x63, 0x12, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xff, 0x02, 0xee, 0x01, 0xed,
+ 0x01, 0xc9, 0x01, 0x60, 0x0d, 0x00, 0x01, 0xef, 0x06, 0xff, 0x01, 0x70,
+ 0x0c, 0x00, 0x01, 0xef, 0x06, 0xff, 0x01, 0xfa, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xfa, 0x02, 0x33, 0x01, 0x34, 0x01, 0x6a, 0x02, 0xff, 0x01, 0x50,
+ 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff,
+ 0x01, 0xd0, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x0c,
+ 0x01, 0xff, 0x01, 0xf1, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00,
+ 0x01, 0x09, 0x01, 0xff, 0x01, 0xf3, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x04, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xe0,
+ 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x11, 0x01, 0x38, 0x02, 0xff,
+ 0x01, 0x70, 0x0b, 0x00, 0x01, 0xef, 0x06, 0xff, 0x01, 0xfc, 0x0c, 0x00,
+ 0x01, 0xef, 0x06, 0xff, 0x01, 0xc1, 0x0c, 0x00, 0x01, 0xef, 0x05, 0xff,
+ 0x01, 0xb5, 0x0d, 0x00, 0x05, 0x11, 0xc2, 0x00,
+
+ /* 59 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x56, 0x01, 0x63, 0x07, 0x00, 0x01, 0x02,
+ 0x01, 0x66, 0x01, 0x60, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x07, 0x00,
+ 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0,
+ 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff,
+ 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x07, 0x00, 0x01, 0x07,
+ 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x07, 0x00,
+ 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xff,
+ 0x02, 0xee, 0x01, 0xed, 0x01, 0xc9, 0x01, 0x60, 0x02, 0x00, 0x01, 0x07,
+ 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x06, 0xff, 0x01, 0x70,
+ 0x01, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef,
+ 0x06, 0xff, 0x01, 0xfa, 0x01, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0,
+ 0x08, 0x00, 0x01, 0xef, 0x01, 0xfa, 0x02, 0x33, 0x01, 0x34, 0x01, 0x6b,
+ 0x02, 0xff, 0x01, 0x50, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xd0,
+ 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1, 0x01, 0x07, 0x01, 0xff,
+ 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xf3, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4,
+ 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x07, 0x01, 0xff,
+ 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xe0, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x03, 0x11, 0x01, 0x37, 0x02, 0xff, 0x01, 0x70,
+ 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x06, 0xff,
+ 0x01, 0xfc, 0x01, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00,
+ 0x01, 0xef, 0x06, 0xff, 0x01, 0xc1, 0x01, 0x00, 0x01, 0x07, 0x01, 0xff,
+ 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x05, 0xff, 0x01, 0xb5, 0x02, 0x00,
+ 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x05, 0x11, 0x05, 0x00,
+ 0x01, 0x11, 0x01, 0x10, 0xbb, 0x00,
+
+ /* 60 */
+ 0xff, 0x00, 0x55, 0x00, 0x01, 0x36, 0x04, 0x66, 0x01, 0x63, 0x0e, 0x00,
+ 0x01, 0x9f, 0x04, 0xff, 0x01, 0xf8, 0x0e, 0x00, 0x01, 0x9f, 0x04, 0xff,
+ 0x01, 0xf8, 0x0e, 0x00, 0x01, 0x6a, 0x03, 0xaa, 0x01, 0xff, 0x01, 0xf8,
+ 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8,
+ 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8,
+ 0x12, 0x00, 0x02, 0xff, 0x02, 0xee, 0x01, 0xed, 0x01, 0xc9, 0x01, 0x50,
+ 0x0d, 0x00, 0x06, 0xff, 0x01, 0xfe, 0x01, 0x60, 0x0c, 0x00, 0x07, 0xff,
+ 0x01, 0xf9, 0x0c, 0x00, 0x01, 0xff, 0x01, 0xfa, 0x02, 0x33, 0x01, 0x34,
+ 0x01, 0x6b, 0x02, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xf8,
+ 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xc0, 0x0b, 0x00, 0x01, 0xff,
+ 0x01, 0xf8, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf1, 0x0b, 0x00,
+ 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf3,
+ 0x0b, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xf3, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x0b,
+ 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00,
+ 0x01, 0x3f, 0x01, 0xff, 0x01, 0xe0, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xf9,
+ 0x03, 0x11, 0x01, 0x38, 0x02, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x07, 0xff,
+ 0x01, 0xfc, 0x0c, 0x00, 0x07, 0xff, 0x01, 0xb1, 0x0c, 0x00, 0x06, 0xff,
+ 0x01, 0xb5, 0x0d, 0x00, 0x05, 0x11, 0xbf, 0x00,
+
+ /* 61 */
+ 0xff, 0x00, 0x57, 0x00, 0x01, 0x02, 0x01, 0x8c, 0x01, 0xff, 0x01, 0xfd,
+ 0x01, 0x94, 0x0f, 0x00, 0x01, 0x9f, 0x04, 0xff, 0x01, 0xb2, 0x0d, 0x00,
+ 0x01, 0x0c, 0x05, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x0c, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0xf8, 0x01, 0x42, 0x01, 0x36, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0xe1, 0x0b, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20,
+ 0x02, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfa, 0x0b, 0x00, 0x01, 0x07,
+ 0x01, 0xff, 0x01, 0xf5, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x20,
+ 0x0a, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xe0, 0x04, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0x90, 0x0a, 0x00, 0x01, 0x0a, 0x01, 0xcc, 0x01, 0x80,
+ 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08,
+ 0x01, 0xff, 0x01, 0xf1, 0x0d, 0x00, 0x01, 0x69, 0x03, 0x99, 0x01, 0x9b,
+ 0x01, 0xff, 0x01, 0xf4, 0x0d, 0x00, 0x01, 0xaf, 0x05, 0xff, 0x01, 0xf5,
+ 0x0d, 0x00, 0x01, 0xaf, 0x05, 0xff, 0x01, 0xf6, 0x0d, 0x00, 0x01, 0x58,
+ 0x03, 0x88, 0x01, 0x8a, 0x01, 0xff, 0x01, 0xf5, 0x11, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf4, 0x0a, 0x00, 0x01, 0x05, 0x01, 0x55, 0x01, 0x10,
+ 0x04, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0x80, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xe0,
+ 0x0a, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xa0, 0x0a, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf5,
+ 0x04, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x02, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xf9, 0x01, 0x42,
+ 0x01, 0x37, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xf2, 0x0c, 0x00, 0x01, 0x0b,
+ 0x06, 0xff, 0x01, 0x40, 0x0d, 0x00, 0x01, 0x8f, 0x04, 0xff, 0x01, 0xc2,
+ 0x0e, 0x00, 0x01, 0x01, 0x01, 0x8c, 0x01, 0xef, 0x01, 0xed, 0x01, 0x94,
+ 0xc1, 0x00,
+
+ /* 62 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x56, 0x01, 0x63, 0x04, 0x00, 0x01, 0x05,
+ 0x01, 0xae, 0x01, 0xff, 0x01, 0xed, 0x01, 0x83, 0x09, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x03, 0x00, 0x01, 0x03, 0x01, 0xdf, 0x04, 0xff, 0x01, 0xa1,
+ 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x6f, 0x05, 0xff,
+ 0x01, 0xfe, 0x01, 0x20, 0x07, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0x04, 0x02, 0xff, 0x01, 0xd6, 0x01, 0x32, 0x01, 0x48, 0x02, 0xff,
+ 0x01, 0xe0, 0x07, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x1c, 0x01, 0xff, 0x01, 0xf9,
+ 0x07, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xff,
+ 0x01, 0xb0, 0x03, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x01, 0x10,
+ 0x06, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0x20, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x70, 0x06, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfb,
+ 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xb0, 0x06, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00,
+ 0x01, 0x0b, 0x01, 0xff, 0x01, 0xe0, 0x06, 0x00, 0x01, 0xef, 0x01, 0xfd,
+ 0x01, 0x99, 0x01, 0x9c, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xf1, 0x06, 0x00, 0x01, 0xef, 0x04, 0xff, 0x01, 0xf2,
+ 0x05, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf2, 0x06, 0x00, 0x01, 0xef,
+ 0x04, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf3,
+ 0x06, 0x00, 0x01, 0xef, 0x01, 0xfc, 0x01, 0x88, 0x01, 0x8c, 0x01, 0xff,
+ 0x01, 0xf2, 0x05, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf2, 0x06, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf3,
+ 0x05, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf1, 0x06, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x01, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00,
+ 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf0, 0x06, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xb0, 0x06, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00,
+ 0x01, 0xcf, 0x01, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x7f, 0x01, 0xff,
+ 0x01, 0x70, 0x06, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x6f,
+ 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff,
+ 0x01, 0x10, 0x06, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x0e,
+ 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf9,
+ 0x07, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x04, 0x02, 0xff,
+ 0x01, 0xd7, 0x01, 0x32, 0x01, 0x49, 0x02, 0xff, 0x01, 0xd0, 0x07, 0x00,
+ 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x6f, 0x05, 0xff, 0x01, 0xfd,
+ 0x01, 0x20, 0x07, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x03,
+ 0x01, 0xdf, 0x04, 0xff, 0x01, 0xa1, 0x08, 0x00, 0x01, 0x11, 0x01, 0x10,
+ 0x04, 0x00, 0x01, 0x05, 0x01, 0xad, 0x01, 0xff, 0x01, 0xec, 0x01, 0x82,
+ 0xbc, 0x00,
+
+ /* 63 */
+ 0xff, 0x00, 0x58, 0x00, 0x01, 0x14, 0x05, 0x66, 0x01, 0x60, 0x0c, 0x00,
+ 0x01, 0x2b, 0x06, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x02, 0x01, 0xef,
+ 0x06, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0xeb,
+ 0x02, 0xaa, 0x01, 0xac, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x4f,
+ 0x01, 0xff, 0x01, 0xf5, 0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2,
+ 0x0b, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, 0x03, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30,
+ 0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x9f,
+ 0x01, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2,
+ 0x0b, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x70, 0x03, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf8,
+ 0x01, 0x20, 0x02, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00,
+ 0x01, 0x08, 0x07, 0xff, 0x01, 0xf2, 0x0c, 0x00, 0x01, 0x8f, 0x06, 0xff,
+ 0x01, 0xf2, 0x0c, 0x00, 0x01, 0x02, 0x01, 0x9d, 0x05, 0xff, 0x01, 0xf2,
+ 0x0d, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x62, 0x01, 0x27,
+ 0x01, 0xff, 0x01, 0xf2, 0x0d, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf7,
+ 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x0d, 0x00, 0x01, 0xcf,
+ 0x01, 0xff, 0x01, 0x80, 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2,
+ 0x0c, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf2, 0x0c, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0,
+ 0x02, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x09,
+ 0x01, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2,
+ 0x0b, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0x05,
+ 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb,
+ 0x04, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x7f,
+ 0x01, 0xff, 0x01, 0xc0, 0x04, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2,
+ 0x0a, 0x00, 0x02, 0x11, 0x06, 0x00, 0x01, 0x11, 0x01, 0x10, 0xbe, 0x00,
+
+ /* 64 */
+ 0x2c, 0x00, 0x01, 0xbd, 0x01, 0xdd, 0x01, 0x60, 0x01, 0x05, 0x01, 0xdd,
+ 0x01, 0xdc, 0x0e, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x70, 0x01, 0x06,
+ 0x01, 0xff, 0x01, 0xfe, 0x0e, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x70,
+ 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x0e, 0x00, 0x01, 0xdf, 0x01, 0xff,
+ 0x01, 0x70, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x0e, 0x00, 0x01, 0x67,
+ 0x01, 0x77, 0x01, 0x30, 0x01, 0x02, 0x01, 0x77, 0x01, 0x76, 0x33, 0x00,
+ 0x01, 0x1c, 0x0a, 0xcc, 0x09, 0x00, 0x01, 0x1f, 0x0a, 0xff, 0x09, 0x00,
+ 0x01, 0x1f, 0x0a, 0xff, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe8,
+ 0x08, 0x88, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xfe, 0x07, 0xee,
+ 0x01, 0xe4, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf5, 0x09, 0x00,
+ 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xe7, 0x07, 0x77, 0x01, 0x72, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00,
+ 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff,
+ 0x01, 0xd4, 0x08, 0x44, 0x01, 0x30, 0x08, 0x00, 0x01, 0x1f, 0x0a, 0xff,
+ 0x01, 0xb0, 0x08, 0x00, 0x01, 0x1f, 0x0a, 0xff, 0x01, 0xb0, 0x08, 0x00,
+ 0x01, 0x1f, 0x0a, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x01, 0x0a, 0x11,
+ 0xbc, 0x00,
+
+ /* 65 */
+ 0xb6, 0x00, 0x01, 0x01, 0x02, 0x55, 0x01, 0x00, 0x01, 0x04, 0x01, 0x55,
+ 0x01, 0x52, 0x0d, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x00, 0x01, 0x0d,
+ 0x01, 0xff, 0x01, 0xf7, 0x0d, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x00,
+ 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf7, 0x0d, 0x00, 0x01, 0x05, 0x02, 0xff,
+ 0x01, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf7, 0x0d, 0x00, 0x01, 0x04,
+ 0x02, 0xee, 0x01, 0x00, 0x01, 0x0c, 0x01, 0xee, 0x01, 0xe6, 0x4a, 0x00,
+ 0x01, 0x17, 0x01, 0xbe, 0x01, 0xff, 0x01, 0xdb, 0x01, 0x60, 0x0e, 0x00,
+ 0x01, 0x07, 0x04, 0xff, 0x01, 0xfe, 0x01, 0x50, 0x0d, 0x00, 0x01, 0xbf,
+ 0x05, 0xff, 0x01, 0xf7, 0x0c, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0x94,
+ 0x01, 0x23, 0x01, 0x6c, 0x02, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x6f,
+ 0x01, 0xff, 0x01, 0xd2, 0x03, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd0,
+ 0x0b, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x07,
+ 0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf6,
+ 0x05, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x0a, 0x00, 0x01, 0x09, 0x01, 0xff,
+ 0x01, 0xf0, 0x05, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0x0d,
+ 0x01, 0xff, 0x01, 0xb0, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x30,
+ 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xb5, 0x05, 0x55, 0x01, 0x7f,
+ 0x01, 0xff, 0x01, 0x50, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0x70,
+ 0x09, 0x00, 0x01, 0x2f, 0x09, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x1f,
+ 0x01, 0xff, 0x01, 0xb7, 0x07, 0x77, 0x01, 0x40, 0x09, 0x00, 0x01, 0x0f,
+ 0x01, 0xff, 0x01, 0x80, 0x11, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0,
+ 0x11, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0x37,
+ 0x01, 0x77, 0x0a, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf5, 0x05, 0x00,
+ 0x01, 0xdf, 0x01, 0xfd, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10,
+ 0x03, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x8f,
+ 0x01, 0xff, 0x01, 0xc1, 0x03, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf1,
+ 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0x94, 0x01, 0x23, 0x01, 0x6b,
+ 0x02, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x05, 0xff,
+ 0x01, 0xf8, 0x0d, 0x00, 0x01, 0x19, 0x04, 0xff, 0x01, 0xfe, 0x01, 0x50,
+ 0x0e, 0x00, 0x01, 0x27, 0x01, 0xce, 0x01, 0xff, 0x01, 0xda, 0x01, 0x50,
+ 0xc0, 0x00,
+
+ /* 48 */
+ 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x72, 0x01, 0x00, 0x01, 0x29,
+ 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc7, 0x01, 0x10, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xf4, 0x01, 0x08, 0x04, 0xff, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xf4, 0x01, 0xaf, 0x05, 0xff, 0x01, 0x80, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xfc, 0x01, 0xff, 0x01, 0xf9, 0x01, 0x42, 0x01, 0x37, 0x01, 0xdf,
+ 0x01, 0xff, 0x01, 0xf6, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfe,
+ 0x01, 0x30, 0x02, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10,
+ 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf3, 0x04, 0x00, 0x01, 0xbf,
+ 0x01, 0xff, 0x01, 0x70, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x90,
+ 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf2,
+ 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x05, 0x01, 0xff,
+ 0x01, 0xf5, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x02,
+ 0x01, 0xff, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfa, 0x06, 0x00,
+ 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x06, 0x00,
+ 0x01, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfa, 0x06, 0x00,
+ 0x01, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x05, 0x00,
+ 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfe,
+ 0x05, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0xef,
+ 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2,
+ 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x2f,
+ 0x01, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf4,
+ 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x70, 0x0a, 0x00, 0x01, 0xef,
+ 0x02, 0xff, 0x01, 0x40, 0x02, 0x00, 0x01, 0x1b, 0x01, 0xff, 0x01, 0xfe,
+ 0x01, 0x10, 0x0a, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x64,
+ 0x01, 0x58, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf5, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x01, 0xaf, 0x05, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x01, 0x08, 0x04, 0xff, 0x01, 0xe4, 0x0c, 0x00, 0x01, 0xef,
+ 0x01, 0xf9, 0x01, 0x00, 0x01, 0x28, 0x01, 0xce, 0x01, 0xed, 0x01, 0xa5,
+ 0x0d, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9,
+ 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xde, 0x01, 0xe8,
+ 0x25, 0x00,
+};
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp
index e288d270307c..d9acb4f67a43 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp
@@ -21,16 +21,18 @@
#include "../ftdi_extended.h"
-#ifdef FTDI_EXTENDED
+#if ENABLED(FTDI_EXTENDED)
namespace FTDI {
- void write_rle_data(uint16_t addr, const uint8_t *data, size_t n) {
+ uint32_t write_rle_data(uint32_t addr, const uint8_t *data, size_t n) {
for (; n >= 2; n -= 2) {
uint8_t count = pgm_read_byte(data++);
uint8_t value = pgm_read_byte(data++);
- while (count--) CLCD::mem_write_8(addr++, value);
+ CLCD::mem_write_fill(addr, value, count);
+ addr += count;
}
+ return addr;
}
void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle) {
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h
index 185b53e6ff87..2b0a533084d8 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h
@@ -24,7 +24,7 @@
class CommandProcessor;
namespace FTDI {
- void write_rle_data(uint16_t addr, const uint8_t *data, size_t n);
+ uint32_t write_rle_data(uint32_t addr, const uint8_t *data, size_t n);
void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle);
void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell);
}
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.png b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc46ebe6aa07459a05230f7002a6d31269475b96
GIT binary patch
literal 34122
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
literal 0
HcmV?d00001
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.svg b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.svg
new file mode 100644
index 000000000000..25893f52767b
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.svg
@@ -0,0 +1,535 @@
+
+
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.png b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.png
new file mode 100644
index 0000000000000000000000000000000000000000..baafc82171ce585c4841a36d61e5c517187e9067
GIT binary patch
literal 16643
zcmbV!cU+Tcx2@xVQd9_4Kzfmmbm@lBiJ;gV{Dc^2pDr6#piVtC!Cr~tmjngH#k?P
z2H8E&8YbqAC*KiS&x<>upGusCA>fNW(+QjmIRyoEsh2Ksl0U=Hlntk{L*$m#p=PgZ
znp}I!&6MqWr`5?s@%a}oTJkS`5zqAOB0XkG<@t7_Ci|xIhyfpO8jhxi`ytePclo|s
z9E}+enqQ5D!#Yrq$~fRluZ~wFy8Prl3K|1|R`m#~(XL-G%fI_byC=-Z!UAk6rd`Id
zYt9CMF~~JMgfybJQn470o@YahNJQzE{+!aK%t(FuAdx5ZQ=RO(z{yCbliSSRs(r(2
zRxvWP)`D(sq(Y-Rfxq>#L?wrG5A(}r3cGmy!g7bLst2K-zPMaKNO)OTC<4@y;1d-f
z$%}Xq8!Sv~3a{bp51m9VI_PZLR^3x)s&|=xzy5*!+n0|n8a^L;Qc`5N(}R%9`ll|x
z1dccK$Zl^}^*Eg@hi8i2IybaUnS0l0;d1PY3%nbbYIF;uE9-8-_=Yq5@0q`b=+^4T
zBo>6Sa%L!;bPiqxYMK8nUr35nFv(+Nr;?|&u#;t{-iH^511j}y>L>DVxtjzM>utHr
z;Eedjm$#J`cTry@&N=Dj)8b<~?mk-3^fl7422&^9cDuu!Ut`fN!%TI@zFcwO?@>)0-$wr
zv3-U!>!lR|HE>ZROSJQWY{?yov6c8e0?_vry}}4kxfIdrI1a7y%m1Cu*%g+O0foCW
zI2vHIFAU(R^o=oAJETC5J&aW}54Am8qe_
zaL7o`0<*hMEsZW6RPr7GR^Nvlj!j(9X+k~I4O(S+lbE<)q(k>xG}esUFJucd`pyWm
ztH~S+(KFTdn!dkhX&|TaVn>bO*mGjK`i7ZSZzvYMbYNPtq)xj>@5z9#xne@&q=jLP
z;pfd|%d;AOp+0|qG>eOyAY&pbngF4ELi#E8wZaku5H}So+XRuq(ZmhFu^AL)4BHTv
z^oZ}g@YT8W(@aU{hkj0C9c-njB}FhciouHVeq^dC(d`lW%9vm*RmJB6sMB5Lr+oyF
z$Y`Q0_5JPak>mreqVUN#cj=~q!%5D;-Gsii+3T->T!?(3UyDSth4
zW_MI9pSRx?X7y!B9=m^vO{X|<{@~1DJD>*oIv|I^hPuJrD4AF`<8jM%F~6uH
ze>(|Z(zFdEN#31~SWhfg#7#2y?Puq;!}A)w*?XiLV?y1i~B>Ypp7(GMyqsMXU$
zxX=WP;6{7PzUq__*tx^T?$qn;xh+VL8sXK*@r1WbFnAJHP!im>d077D!2d2f@y?UY
zYLdn$A+GEkbCd{dN#m1m5%y%U#6Y2(HQf@)ZnwK$ZiEh3-F4qa~SAq!*h?VMx9i7kgbkL#%s4V!uC!Td`@!at+^Bg#Rnqz-BU
zmkLjX1nME!ADfE>`-}0DDZ&=L8OwhP(!agv|3)ELaVjB^ie&tmox1d`%36sr{&$A)
zS9lINBI3LA*3i+Dpb_`lM68E$MvE6nm@?`UXA7xoC}+^y#u3
zkfyfQCrA_)Z+K(iu!cn9if=tdnci3>g=O#SKY7`VV
z5IvUk*h^n;M(~-iEA6l4E>28Ox(OiD$&f}Yk(?vpTGHJ<*vbcQWm83)Rz-G!hPcwT
zxtC47Z>srhVtjOle;e^$7HC1&oVdonNs)Y{lcQ6Z+nv2HvqrAqQ*I)m0%jO457@MN
z?rb1fDSx)3$=!f{;77|Tj3z2%PUU|%3SXX;^|npjl}xYhBC&8xcPE0IKAQurBtq3K
zmCF3a$HkbB?tat{^EU$`oYId=%853U;qrtww-dcm3Numdf1l;OTsgF`c0r`xPvKvP
z?nzA?8nGOC5eU+`@yYCuQlAyR-t!DM
zFf||`S@qwa%IyyG12LyT2Llb%?->PwVnfUZQ2*k+^VwUb{u?1Z2piM9%K=@*?Gcm%
ze;9JQiFw|HqNDqBj1ZR3yWV$M#sKNcSY(-eBh$*UC2eVx5V?)@wU5_N3auvs4|6|0
zoAAMHzpS(nL>6Yi-5T_qY!S%(f2P5oyUTNn*tIYqtMFM>C7Qt0Q{MhqUT5{x4Z@yX
z?NEcOdd^$pml+Iqd4^t{gBSHCf~&9}YHA<4eVq-x(Ns+8ks3JUTIN
zsm7NsKdQ>Z`zcmjdJ&a`J$Wk|fiZWwzdo83`c6+=WV;GqSV)hvb8#9n0iec}4Cr^Y
zd#NXSyn^o?2*cDZ7IB^LEHqvA^efxsqAp1ZZftsjYlW*jiecSY`wc^r6!|~Y9Yv;c
z%+NX8O@ogwxf?8Br~a;@{T(Ppc~MO)DlyLt#>*%m73%LJJOw)&CiOZv+j}DlEi=t>
zJuNlhD_(+ykgsn`sq522H#!)!7McvHIK2!U&ZgGN@ZH!PZ!R3CgL*nCIq3|aP(ric
z!=I%NeukmY4oNK~ExB~YlFakQ5BCGzSEfa_r~e3UG^BqrKN`!Kknu^_Awt0A_xGxf
z#}jAuLYzD0x$%8G&T8Ac*h()2R1F?uDFD$(N
zr0Ou=*Dl4<42yBax|N8%Q{6f4MR#gDO<_1A-5qe304Y};Y_b0`|01|X#x8?&=VOS<
z4MZQa+-iywvzig6Jr3h)45*6jqjzG_vUvs-xe|7usaOd
z@0LfmKA|vc@ekL`;BIvIfDUrmdsDeoJ*c>LSt8WHwKBUtP>6Gg;=Wu+kLvHQ(7Tpp
zgdJ!+j$?oJdO?l-yIIBV>c=OEeowLm^Otc>;5G3w*~klHdn{ED!t)E9m{|d&%a1nI
z&SV69^+glc4HK{E+^AA9x?)}HwhzUv{Q0(t@@j-RnH23sw0lRdxT`F+wP1(E$t{t^
zQv^QNgr)yk0(I(+lc%yWL9h^SI#L=I=+D@1f`Ns-&)Uit5bY7~#6L`x4oRa3QeTaU
zd4Oq1ZSGmm(K3xNkHK1{W>-aD1r9$!CdQh!Jrm5&Vnzve$N?*NMDh@gD7@lk1Fd%Y
zk?FIZNzTXc8DThUbjq-`R=z}D?lyKY&ine*{3S|9mt1ghINN*ZXun;TB
zkzK$UNZ$cg&W*fC-aTHsCC|xKq&>LW}C~
z@)hNI-Yxpw*>P_p=-$O;IKy`h;rBK5i>#X5#QSc^kOqg+HQs&(r^9ElTg?Pntx#%w
zv$>mE-{G|*Z((GXaxiZ+cX}Y@eG`MFG_iw96O~|l!&_atXTz-$N9bS?_7Kx0Puzas
z%DEoS+=U~&-s;L8XyfI2a$mWqkc0xKrwd`>OI97DI
zNR93`;Ce`Fm)oe3nH|tlS~j!DwJJdsHvhizI)KkH$~bdsrlPfZxqTKCzX1P)-509^Fh^LPaW$jPl~zKxMPTpC|x%F}xHrC!}ch-gBk*jCXna
zt8&K>=9Epb2_2$q{@XI(@ZI!Z&2(wHDWEFy)O_Z(d?=B{5hY!X_IfmS9J<(fb|^x$
zO%CkeXjVcfW0#rclsQSd>vl)(j7^`{O=2UcBP`_Jdzp*n+-^@mQK_2IMY7r#z?Ode
zt9}I;O}po&=e}|8f3M1r#h3B+t2qzdgQ?wkXf_P`pKFgKP*n#j9(5+eGQ~9i)*){O
z2kXgp5PC0rrOLSdLKb2?VPaH7HLdUR`Y)9F9)!s{O~aJAHG<139>?;6uRIJX9Q(Jc
zQp-pba!JU*iog~QA@;Yvsz>2h^X>;FTM4(|uqv^fTa-fivtZKo0mbp>gbMDXB7G#e1*3|qV;H-PR&v#Q1BYThva{;V+&DnUl`
zM56!ek=g0qQ%QBVJ&;ulhku+E7481;xH<^P9omL);P$14@8|bv46VAJf)Unl@C{Lk
zJpIWw31}WZ!T*I)G-YM7+-9$8ef231Uxky@H|ebZGx1>I%;DFa;jFqt-W)$K&F5j-
z$82RDl+n{_T1e90!}WvC{2!g81LPg)+!eB;i2JNX*vD$SZg+%9zb<{~P8GjPRvEkpILm
zTY}Fq_>~N3Ir&EQe};wusXN71f?&ht6A`gCjAc20&v?!>LYz{#TY4T46F^BOo-0u&
z)4RBD@)O8+U92np7}1h
zCypl5YY`^{(>>o-*vg1+qA4tV$bF#vQ_+gAS^~Wvig|N+SvT^s5p={@cPx~JS3Y<{
zq5cpjW{r0Ltx5AkWqK2pStTnkKql};Zx+vA8!9}OcnZ?TKp1MHNcV~M2BowVl~^dR
z^Fx6i0T=&lk404`R5iTX-r4na7hhMSm~nlHEqvRPbMwWRf0!u~N_){g
zasm)}v`3bH0J1|>HenMR%<#GQgHY?*Ni+I^m&kGbopQfM9lb=@wfj@0BP)AzgA_qo
zVFE6(_s86t-R|@rg#o&sl!lt?B|_?!uBY;t(5>$hExJ4@xh8bjz%o
zOM72wGD$MI{?@|+vz{EfkuKuqy4%Xv*r;B0FaWwtnfdBq4s5N`?+Yvg4k5BF%X@zr
z+ssf7P)Q=KUAZXBn%L=a@GQ+uhdXV1y(mQg^h^2`jJG;_7H
zozLnZvPB9<8j43fg){|(eLgL+>_|4*?dpGcks|v}MR2=ebT9YqapC)?0~6O^{M(in
z1V85a))X#L;nnMRua~?vUbwvCETgRkO5BfbA|wo^S`KzIz!>hyKhN{m8hev!MmpQ{
z#iPPb2x*-kBpw^c`(XW*!Pw-*^q@DB)Dv8MqQ&)MYM`Yjs@J`bLV*KSO;oT7J$`jJ
zn)FY@G9eM*cjH;`JymMH2j6S4e=EIFQKYhlwKtlpa1q2FtuE{N3c+EQ`zC>6$cvN%
zj8<#7NQ&LjJGhA(mP$hIyBV6oj_rqvG?qzxts9J8*hifFyC6dRCJRDz+Fy@TSyd~z
z^=2_P4p^g=_&DD4ltXF_9*R~@X*x_QH3;iympM1?t2uB!nJ2yAt2)l68Xp(rXV4{+
z3W7O~uLWB2b*k8g813Lw1_1y&;IM8fvgElg>ZkZy8KpznCsE^Z^V2x2hkitG9`N8M
zNb43j(OEFvuH=+K?v;AB+J+G;Wzc6`G48stk9OIqv|Gft!hw7^LrU0(c+1-wR4_7K
zc{saaDMS_t_yp+woG>tbx((h_R;QT>nDmhl^gW=EP!2^79;9QdDWJlza#h=I?DmDh
zO52>%B{jn8n%+(mM*{}SQRAv_a_**ct>DV^Ojhj|SE5FK9UzxOsvohGO#JSb5jnlCz1a
zC&mD3kSwL@P0eThU#Ug(0^}69wmV0~omdw=a#g`+=P~&r+wE={vS_4CTrxU~6|K
zR1FWPHTrK_I@FwHYRP*vnB9`90JetUY7CIzf)LCFSl!G*VI4U>EV?%cY*|AqIFIeeGj
zU|B*Kj#Jz!)fh?^L_R(jQ^1(RVQz~!J;&RBeQBAX03YJQ$5``qiaG_)3L=ugdgamp8~ub@8!N2u|wRz6Seuf_lFY>SfJ_
zM4tF+Lj^36LjD5U{=~GaaGbmlFqDNo=lgqt#=TjpU&J+cAqjp$OJ#?Bf4WR}tSamFI`SjwNZw
z*YN>%yC6N)Lqx676C}*-#!i50)z_F0r){G^d>nBt(z(BtjFaU45{DfN86A&kB7j-9
zbjcj|TkDf!D_4T2VY0D@`v_9kfCwCq72emR4{he(~b%v(Zm#w-i
zkwBoBm~$@zQeo}SlHz(dHOf=h1tJpIP*A=`Z_MQulxK}9;a++2d9uZs?L?6R)|+ip
z78qj+ThT;_>P1pkYiVDw=Mx@WF{gm#OB$P|6j}h;at0~2jmbebKK$oa`ctMP^Kuu+
z9UrZtdrwVVlXw6z^jII5+c%x^M|AvOKoFi1MRL{I91k7i#X-q9BNzFE^(8Py)kp37Gdj*=&jwu>RPGX7Vn#ipF7Ypd_q4W_ObNFe=Oh4
z+O-PMRxJ*@H4071t65UcpW^9ud-Li&Mrb~$K~QAUYc@}ARTtdlq;+Bptfe8j+1|J(fgeRI`dD`ip9rguc^$zbyU2cWDD
zm!EItSTJLH(~a6k8OM(j7_{avRMEs>DpRpvWqbDA-C&EBESz}>is{BU9~W(8_jS)R5?7_;~cF5r@o`4!>1QGKl&R5uDM+c8VNA6=6rDev`oN*kyNxHHioDeSh|)NzHd8WtfnI
z*i)w3RLW{tLDDPJ#3E^|H1Mf9cYqtr1s|_kN-Uc&4qLRv-1cY>>x>&I916NAJvwBK_k
z3xz%>51R&>^~kt9s5+cZYo}bNu1ORcG!!9+9w?$LlrD6@Vs0kW%jQ@Sxie~;fgE5B
zOgXQ#Z`g`Umf9v}6suEH
z+%sScGWch4k3xqi2l>OK8$8poCqkn|ZYCBD*uoc|7h|1W@4dWni|BHomfS1{EbGz_
zyw5F>SEUsslE?6r2P}rU)gR6zhgV-(sje|pLk$Y!sd`5rH5*(90CU-M6(Jj_uk-sb
z%uwPC$EV7UYspcK9gUF6e!jfd=nfEo0p~K58YQ`(7$Abm!jrl{%yOwwqz}yAd2zx&
zqFX2(J%P(sg5UoZnB#AluKBPpADZ*4vrpJus(84l9V1FR&`P{$alo#taP
z(&7eey1@zObM6{_>&N1j-NE!v9CYt4coA;FZ@W7z=9i-J#@qB1;ymByW{{a}IsSh5s7#kuVYX
zuGicpQExR4hL6umH9kmV+P3$*SEd}G2_QEnEcKnjkZER*dLFOCA@?}5!6JlA<1Nw7
z3`y|oE}sFH26IZ-^Ad~1DDlxKCu09IS-Zj9f?ft$@moQjvr7K(!;kgROYa^4F?U~d
zxYT17F6SW1dSsu}p|Kv)Y51{U9*xhGQJOixb^+zxa3)bwn)#^VWEmwauiL0ldznN{
z%?{{#K4$2v
z+O_9@rWT+gRpqcZgzzsGj1U*uV0p8b>eKW}smb@#$%O+dO0$RC?{V4`Pq@P1x-WMl
z2;m$6c1!<+4RG)w6NB8ASp(JuHY(n^l1rdc)-dhXy+?Z-HydKs$kT{KEDZ&4rqc3p
ze`IuG+@f09l?M!EsLKV>g>;x8(q%hcqoYu(|3W0nCf&)DUnX`vMM{*Ipvvt|o%_@?;Grt9aPQ3ZF{*sEnHM`|z7Rt)V?G$WW6g$m?=L$3`k2W2u
z+bc=+N~8e)0&U)L_^BIIX_Ap7YAbA=eI0C+YT9ksGz^Ude|;1oey%@XR$zF0=p{#I
zzO0~&iCyI7WNcP;U)E<|EWZXu_s9%$-7pSAZ`PodSRnR7VRP}!ry?vwZo9J387}NN
z)0(cs$U9Mt@1qjWF*WU1goLrvzRBFV`Bq5<)Mt7^$JJKvX1f=5IRi(
zk(ULA4ed(MTGlD!AWI6dD=u!C+Sox*FG8Gxba~9Yp*X-lAa3+^
zO4c+3D{qc~W{WX0OOk(m%e3R-GW$;_6`^WcQr<(!)w8nIxgTxdvV8GN$0=ChC#A(<
zF-4Vab%t=Y7z`}^8qP@hj^_B?LCRio^e^UvQ5_!22%UlGny?v_NgSwW(7N|e=64ssH>;vCr!(tFgbVr57fn
zWtGg$T?~S$aXzco^@b;C{B*CC-!EW