Browse Source

2.0.x update

pull/45/head
Sergey 3 years ago
parent
commit
7261a0a218
  1. 141
      Marlin/Configuration.h
  2. 19
      Marlin/Configuration_adv.h
  3. 8
      Marlin/src/HAL/DUE/HAL_SPI.cpp
  4. 3
      Marlin/src/HAL/SAMD51/inc/SanityCheck.h
  5. 14
      Marlin/src/HAL/STM32/HAL.cpp
  6. 2
      Marlin/src/HAL/STM32/HAL_MinSerial.cpp
  7. 4
      Marlin/src/HAL/STM32/HAL_SPI.cpp
  8. 4
      Marlin/src/HAL/STM32/MarlinSPI.cpp
  9. 4
      Marlin/src/HAL/STM32/MarlinSerial.cpp
  10. 511
      Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp
  11. 4
      Marlin/src/HAL/STM32/Servo.cpp
  12. 4
      Marlin/src/HAL/STM32/eeprom_flash.cpp
  13. 4
      Marlin/src/HAL/STM32/eeprom_sdcard.cpp
  14. 4
      Marlin/src/HAL/STM32/eeprom_sram.cpp
  15. 4
      Marlin/src/HAL/STM32/eeprom_wired.cpp
  16. 4
      Marlin/src/HAL/STM32/fast_pwm.cpp
  17. 4
      Marlin/src/HAL/STM32/fastio.cpp
  18. 14
      Marlin/src/HAL/STM32/msc_sd.cpp
  19. 4
      Marlin/src/HAL/STM32/tft/gt911.cpp
  20. 4
      Marlin/src/HAL/STM32/tft/tft_fsmc.cpp
  21. 4
      Marlin/src/HAL/STM32/tft/tft_ltdc.cpp
  22. 4
      Marlin/src/HAL/STM32/tft/tft_spi.cpp
  23. 4
      Marlin/src/HAL/STM32/tft/xpt2046.cpp
  24. 4
      Marlin/src/HAL/STM32/timers.cpp
  25. 4
      Marlin/src/HAL/STM32/usb_host.cpp
  26. 4
      Marlin/src/HAL/STM32/usb_serial.cpp
  27. 4
      Marlin/src/HAL/STM32/watchdog.cpp
  28. 2
      Marlin/src/HAL/STM32F1/inc/SanityCheck.h
  29. 7
      Marlin/src/HAL/STM32F1/msc_sd.cpp
  30. 4
      Marlin/src/HAL/STM32F1/sdio.cpp
  31. 80
      Marlin/src/HAL/shared/Delay.h
  32. 142
      Marlin/src/MarlinCore.cpp
  33. 6
      Marlin/src/MarlinCore.h
  34. 29
      Marlin/src/core/boards.h
  35. 6
      Marlin/src/core/macros.h
  36. 3
      Marlin/src/core/multi_language.h
  37. 2
      Marlin/src/core/serial.h
  38. 6
      Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
  39. 23
      Marlin/src/feature/cooler.cpp
  40. 6
      Marlin/src/feature/cooler.h
  41. 2
      Marlin/src/feature/dac/dac_mcp4728.cpp
  42. 2
      Marlin/src/feature/dac/stepper_dac.cpp
  43. 6
      Marlin/src/feature/joystick.h
  44. 28
      Marlin/src/feature/mmu/mmu2.cpp
  45. 3
      Marlin/src/feature/mmu/mmu2.h
  46. 28
      Marlin/src/feature/power.cpp
  47. 2
      Marlin/src/feature/power.h
  48. 12
      Marlin/src/feature/powerloss.h
  49. 7
      Marlin/src/feature/tmc_util.h
  50. 3
      Marlin/src/gcode/bedlevel/mbl/G29.cpp
  51. 18
      Marlin/src/gcode/calibrate/G28.cpp
  52. 18
      Marlin/src/gcode/calibrate/G33.cpp
  53. 8
      Marlin/src/gcode/calibrate/G34.cpp
  54. 12
      Marlin/src/gcode/calibrate/G34_M422.cpp
  55. 74
      Marlin/src/gcode/calibrate/M666.cpp
  56. 2
      Marlin/src/gcode/calibrate/M852.cpp
  57. 4
      Marlin/src/gcode/feature/controllerfan/M710.cpp
  58. 6
      Marlin/src/gcode/feature/digipot/M907-M910.cpp
  59. 8
      Marlin/src/gcode/feature/trinamic/M911-M914.cpp
  60. 4
      Marlin/src/gcode/gcode.cpp
  61. 43
      Marlin/src/gcode/gcode.h
  62. 3
      Marlin/src/gcode/host/M115.cpp
  63. 15
      Marlin/src/gcode/motion/G2_G3.cpp
  64. 2
      Marlin/src/gcode/queue.h
  65. 2
      Marlin/src/gcode/sd/M20.cpp
  66. 11
      Marlin/src/inc/Conditionals_LCD.h
  67. 465
      Marlin/src/inc/Conditionals_post.h
  68. 138
      Marlin/src/inc/SanityCheck.h
  69. 6
      Marlin/src/lcd/dogm/dogm_Statusscreen.h
  70. 23
      Marlin/src/lcd/dogm/fontdata/langdata.h
  71. 7
      Marlin/src/lcd/dogm/fontdata/langdata_an.h
  72. 23
      Marlin/src/lcd/dogm/fontdata/langdata_bg.h
  73. 7
      Marlin/src/lcd/dogm/fontdata/langdata_ca.h
  74. 25
      Marlin/src/lcd/dogm/fontdata/langdata_cz.h
  75. 7
      Marlin/src/lcd/dogm/fontdata/langdata_da.h
  76. 7
      Marlin/src/lcd/dogm/fontdata/langdata_de.h
  77. 27
      Marlin/src/lcd/dogm/fontdata/langdata_el.h
  78. 27
      Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h
  79. 7
      Marlin/src/lcd/dogm/fontdata/langdata_en.h
  80. 7
      Marlin/src/lcd/dogm/fontdata/langdata_es.h
  81. 7
      Marlin/src/lcd/dogm/fontdata/langdata_eu.h
  82. 7
      Marlin/src/lcd/dogm/fontdata/langdata_fi.h
  83. 7
      Marlin/src/lcd/dogm/fontdata/langdata_fr.h
  84. 7
      Marlin/src/lcd/dogm/fontdata/langdata_gl.h
  85. 17
      Marlin/src/lcd/dogm/fontdata/langdata_hr.h
  86. 9
      Marlin/src/lcd/dogm/fontdata/langdata_hu.h
  87. 7
      Marlin/src/lcd/dogm/fontdata/langdata_it.h
  88. 31
      Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h
  89. 219
      Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h
  90. 7
      Marlin/src/lcd/dogm/fontdata/langdata_nl.h
  91. 19
      Marlin/src/lcd/dogm/fontdata/langdata_pl.h
  92. 7
      Marlin/src/lcd/dogm/fontdata/langdata_pt.h
  93. 7
      Marlin/src/lcd/dogm/fontdata/langdata_pt_br.h
  94. 7
      Marlin/src/lcd/dogm/fontdata/langdata_ro.h
  95. 15
      Marlin/src/lcd/dogm/fontdata/langdata_ru.h
  96. 21
      Marlin/src/lcd/dogm/fontdata/langdata_sk.h
  97. 13
      Marlin/src/lcd/dogm/fontdata/langdata_test.h
  98. 13
      Marlin/src/lcd/dogm/fontdata/langdata_tr.h
  99. 23
      Marlin/src/lcd/dogm/fontdata/langdata_uk.h
  100. 97
      Marlin/src/lcd/dogm/fontdata/langdata_vi.h

141
Marlin/Configuration.h

@ -395,70 +395,92 @@
// @section temperature
/**
* --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table
* --NORMAL IS 4.7kΩ PULLUP!-- 1kΩ pullup can be used on hotend sensor, using correct resistor and table
*
* Temperature sensors available:
*
* -5 : PT100 / PT1000 with MAX31865 (only for sensors 0-1)
* -3 : thermocouple with MAX31855 (only for sensors 0-1)
* -2 : thermocouple with MAX6675 (only for sensors 0-1)
* -4 : thermocouple with AD8495
* -1 : thermocouple with AD595
* SPI RTD/Thermocouple Boards - IMPORTANT: Read the NOTE below!
* -------
* -5 : MAX31865 with Pt100/Pt1000, 2, 3, or 4-wire (only for sensors 0-1)
* NOTE: You must uncomment/set the MAX31865_*_OHMS_n defines below.
* -3 : MAX31855 with Thermocouple, -200°C to +700°C (only for sensors 0-1)
* -2 : MAX6675 with Thermocouple, 0°C to +700°C (only for sensors 0-1)
*
* NOTE: Ensure TEMP_n_CS_PIN is set in your pins file for each TEMP_SENSOR_n using an SPI Thermocouple. By default,
* Hardware SPI on the default serial bus is used. If you have also set TEMP_n_SCK_PIN and TEMP_n_MISO_PIN,
* Software SPI will be used on those ports instead. You can force Hardware SPI on the default bus in the
* Configuration_adv.h file. At this time, separate Hardware SPI buses for sensors are not supported.
*
* Analog Themocouple Boards
* -------
* -4 : AD8495 with Thermocouple
* -1 : AD595 with Thermocouple
*
* Analog Thermistors - 4.7 pullup - Normal
* -------
* 1 : 100 EPCOS - Best choice for EPCOS thermistors
* 331 : 100 Same as #1, but 3.3V scaled for MEGA
* 332 : 100 Same as #1, but 3.3V scaled for DUE
* 2 : 200 ATC Semitec 204GT-2
* 202 : 200 Copymaster 3D
* 3 : ???Ω Mendel-parts thermistor
* 4 : 10 Generic Thermistor !! DO NOT use for a hotend - it gives bad resolution at high temp. !!
* 5 : 100 ATC Semitec 104GT-2/104NT-4-R025H42G - Used in ParCan, J-Head, and E3D, SliceEngineering 300°C
* 501 : 100 Zonestar - Tronxy X3A
* 502 : 100 Zonestar - used by hot bed in Zonestar Průša P802M
* 512 : 100 RPW-Ultra hotend
* 6 : 100 EPCOS - Not as accurate as table #1 (created using a fluke thermocouple)
* 7 : 100 Honeywell 135-104LAG-J01
* 71 : 100 Honeywell 135-104LAF-J01
* 8 : 100 Vishay 0603 SMD NTCS0603E3104FXT
* 9 : 100 GE Sensing AL03006-58.2K-97-G1
* 10 : 100 RS PRO 198-961
* 11 : 100 Keenovo AC silicone mats, most Wanhao i3 machines - beta 3950, 1%
* 12 : 100 Vishay 0603 SMD NTCS0603E3104FXT (#8) - calibrated for Makibox hot bed
* 13 : 100 Hisens up to 300°C - for "Simple ONE" & "All In ONE" hotend - beta 3950, 1%
* 15 : 100 Calibrated for JGAurora A5 hotend
* 18 : 200 ATC Semitec 204GT-2 Dagoma.Fr - MKS_Base_DKU001327
* 22 : 100 GTM32 Pro vB - hotend - 4.7 pullup to 3.3V and 220Ω to analog input
* 23 : 100 GTM32 Pro vB - bed - 4.7 pullup to 3.3v and 220Ω to analog input
* 30 : 100 Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K - beta 3950
* 60 : 100 Maker's Tool Works Kapton Bed Thermistor - beta 3950
* 61 : 100 Formbot/Vivedino 350°C Thermistor - beta 3950
* 66 : 4.7 Dyze Design High Temperature Thermistor
* 67 : 500 SliceEngineering 450°C Thermistor
* 70 : 100 bq Hephestos 2
* 75 : 100 Generic Silicon Heat Pad with NTC100K MGB18-104F39050L32
*
* Analog Thermistors - 1 pullup - Atypical, and requires changing out the 4.7 pullup for 1.
* ------- (but gives greater accuracy and more stable PID)
* 51 : 100 EPCOS (1 pullup)
* 52 : 200 ATC Semitec 204GT-2 (1 pullup)
* 55 : 100 ATC Semitec 104GT-2 - Used in ParCan & J-Head (1 pullup)
*
* Analog Thermistors - 10 pullup - Atypical
* -------
* 99 : 100 Found on some Wanhao i3 machines with a 10 pull-up resistor
*
* Analog RTDs (Pt100/Pt1000)
* -------
* 110 : Pt100 with 1 pullup (atypical)
* 147 : Pt100 with 4.7 pullup
* 1010 : Pt1000 with 1 pullup (atypical)
* 1047 : Pt1000 with 4.7 pullup (E3D)
* 20 : Pt100 with circuit in the Ultimainboard V2.x with mainboard ADC reference voltage = INA826 amplifier-board supply voltage.
* NOTE: (1) Must use an ADC input with no pullup. (2) Some INA826 amplifiers are unreliable at 3.3V so consider using sensor 147, 110, or 21.
* 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v ADC reference voltage (STM32, LPC176x....) and 5V INA826 amplifier board supply.
* NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C.
* 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x
*
* Custom/Dummy/Other Thermos
* ------
* 0 : not used
* 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup)
* 331 : (3.3V scaled thermistor 1 table for MEGA)
* 332 : (3.3V scaled thermistor 1 table for DUE)
* 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup)
* 202 : 200k thermistor - Copymaster 3D
* 3 : Mendel-parts thermistor (4.7k pullup)
* 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !!
* 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan, J-Head, and E3D) (4.7k pullup)
* 501 : 100K Zonestar (Tronxy X3A) Thermistor
* 502 : 100K Zonestar Thermistor used by hot bed in Zonestar Průša P802M
* 512 : 100k RPW-Ultra hotend thermistor (4.7k pullup)
* 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup)
* 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup)
* 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup)
* 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup)
* 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup)
* 10 : 100k RS thermistor 198-961 (4.7k pullup)
* 11 : 100k beta 3950 1% thermistor (Used in Keenovo AC silicone mats and most Wanhao i3 machines) (4.7k pullup)
* 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed)
* 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE"
* 15 : 100k thermistor calibration for JGAurora A5 hotend
* 18 : ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327
* 20 : Pt100 with circuit in the Ultimainboard V2.x with mainboard ADC reference voltage = INA826 amplifier-board supply voltage.
* NOTES: (1) Must use an ADC input with no pullup. (2) Some INA826 amplifiers are unreliable at 3.3V so consider using sensor 147, 110, or 21.
* 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v ADC reference voltage (STM32, LPC176x....) and 5V INA826 amplifier board supply.
* NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C.
* 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB)
* 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB)
* 30 : Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K / B3950 (4.7k pullup)
* 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 61 : 100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup
* 66 : 4.7M High Temperature thermistor from Dyze Design
* 67 : 450C thermistor from SliceEngineering
* 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor
* 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines)
*
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID)
* 51 : 100k thermistor - EPCOS (1k pullup)
* 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup)
* 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup)
*
* 1047 : Pt1000 with 4k7 pullup (E3D)
* 1010 : Pt1000 with 1k pullup (non standard)
* 147 : Pt100 with 4k7 pullup
* 110 : Pt100 with 1k pullup (non standard)
*
* 1000 : Custom - Specify parameters in Configuration_adv.h
*
* Use these for Testing or Development purposes. NEVER for production machine.
* !!! Use these for Testing or Development purposes. NEVER for production machine. !!!
* 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below.
* 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below.
*
*/
#define TEMP_SENSOR_0 1
#define TEMP_SENSOR_1 0
@ -480,7 +502,7 @@
// Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1
//#define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000)
//#define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for AdaFruit PT100; 4300 for AdaFruit PT1000
//#define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for Adafruit PT100; 4300 for Adafruit PT1000
//#define MAX31865_SENSOR_OHMS_1 100
//#define MAX31865_CALIBRATION_OHMS_1 430
@ -2443,6 +2465,11 @@ EEPROM_W25Q
//
//#define MKS_MINI_12864
//
// MKS MINI12864 V3 is an alias for FYSETC_MINI_12864_2_1. Type A/B. NeoPixel RGB Backlight.
//
//#define MKS_MINI_12864_V3
//
// MKS LCD12864A/B with graphic controller and SD support. Follows MKS_MINI_12864 pinout.
// https://www.aliexpress.com/item/33018110072.html

19
Marlin/Configuration_adv.h

@ -131,10 +131,21 @@
#define REDUNDANT_BETA 3950 // Beta value
#endif
//
// Hephestos 2 24V heated bed upgrade kit.
// https://store.bq.com/en/heated-bed-kit-hephestos2
//
/**
* Configuration options for MAX Thermocouples (-2, -3, -5).
* FORCE_HW_SPI: Ignore SCK/MOSI/MISO pins and just use the CS pin & default SPI bus.
* MAX31865_WIRES: Set the number of wires for the probe connected to a MAX31865 board, 2-4. Default: 2
* MAX31865_50HZ: Enable 50Hz filter instead of the default 60Hz.
*/
//#define TEMP_SENSOR_FORCE_HW_SPI
//#define MAX31865_SENSOR_WIRES_0 2
//#define MAX31865_SENSOR_WIRES_1 2
//#define MAX31865_50HZ_FILTER
/**
* Hephestos 2 24V heated bed upgrade kit.
* https://store.bq.com/en/heated-bed-kit-hephestos2
*/
//#define HEPHESTOS2_HEATED_BED_KIT
#if ENABLED(HEPHESTOS2_HEATED_BED_KIT)
#undef TEMP_SENSOR_BED

8
Marlin/src/HAL/DUE/HAL_SPI.cpp

@ -240,7 +240,7 @@
}
// all the others
static uint32_t spiDelayCyclesX4 = 4 * (F_CPU) / 1000000; // 4µs => 125khz
static uint16_t spiDelayNS = 4000; // 4000ns => 125khz
static uint8_t spiTransferX(uint8_t b) { // using Mode 0
int bits = 8;
@ -249,12 +249,12 @@
b <<= 1; // little setup time
WRITE(SD_SCK_PIN, HIGH);
DELAY_CYCLES(spiDelayCyclesX4);
DELAY_NS(spiDelayNS);
b |= (READ(SD_MISO_PIN) != 0);
WRITE(SD_SCK_PIN, LOW);
DELAY_CYCLES(spiDelayCyclesX4);
DELAY_NS(spiDelayNS);
} while (--bits);
return b;
}
@ -510,7 +510,7 @@
spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
break;
default:
spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate) << 2; // spiRate of 2 gives the maximum error with current CPU
spiDelayNS = 4000 >> (6 - spiRate); // spiRate of 2 gives the maximum error with current CPU
spiTransferTx = (pfnSpiTransfer)spiTransferX;
spiTransferRx = (pfnSpiTransfer)spiTransferX;
spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;

3
Marlin/src/HAL/SAMD51/inc/SanityCheck.h

@ -31,7 +31,8 @@
#error "No custom SD drive cable defined for this board."
#endif
#if defined(MAX6675_SCK_PIN) && defined(MAX6675_DO_PIN) && (MAX6675_SCK_PIN == SCK1 || MAX6675_DO_PIN == MISO1)
#if (defined(TEMP_0_SCK_PIN) && defined(TEMP_0_MISO_PIN) && (TEMP_0_SCK_PIN == SCK1 || TEMP_0_MISO_PIN == MISO1)) || \
(defined(TEMP_1_SCK_PIN) && defined(TEMP_1_MISO_PIN) && (TEMP_1_SCK_PIN == SCK1 || TEMP_1_MISO_PIN == MISO1))
#error "OnBoard SPI BUS can't be shared with other devices."
#endif

14
Marlin/src/HAL/STM32/HAL.cpp

@ -20,7 +20,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "HAL.h"
#include "usb_serial.h"
@ -91,15 +91,13 @@ void HAL_init() {
USB_Hook_init();
#endif
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
#if HAS_SD_HOST_DRIVE
MSC_SD_init(); // Enable USB SD card access
#endif
TERN_(HAS_SD_HOST_DRIVE, MSC_SD_init()); // Enable USB SD card access
#if PIN_EXISTS(USB_CONNECT)
OUT_WRITE(USB_CONNECT_PIN, !USB_CONNECT_INVERTING); // USB clear connection
delay(1000); // Give OS time to notice
OUT_WRITE(USB_CONNECT_PIN, !USB_CONNECT_INVERTING); // USB clear connection
delay(1000); // Give OS time to notice
WRITE(USB_CONNECT_PIN, USB_CONNECT_INVERTING);
#endif
}
@ -167,4 +165,4 @@ void HAL_SYSTICK_Callback() {
if (systick_user_callback) systick_user_callback();
}
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

2
Marlin/src/HAL/STM32/HAL_MinSerial.cpp

@ -20,7 +20,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfigPre.h"

4
Marlin/src/HAL/STM32/HAL_SPI.cpp

@ -20,7 +20,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfig.h"
@ -224,4 +224,4 @@ static SPISettings spiConfig;
#endif // SOFTWARE_SPI
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/MarlinSPI.cpp

@ -19,7 +19,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(STM32H7xx)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1) && !defined(STM32H7xx)
#include "MarlinSPI.h"
@ -165,4 +165,4 @@ uint8_t MarlinSPI::dmaSend(const void * transmitBuf, uint16_t length, bool minc)
return 1;
}
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1 && !STM32H7xx

4
Marlin/src/HAL/STM32/MarlinSerial.cpp

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfig.h"
#include "MarlinSerial.h"
@ -101,4 +101,4 @@ void MarlinSerial::_rx_complete_irq(serial_t *obj) {
}
}
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

511
Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp

@ -19,7 +19,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfig.h"
@ -28,319 +28,296 @@
#include <stdint.h>
#include <stdbool.h>
#if NONE(STM32F103xE, STM32F103xG, STM32F4xx, STM32F7xx)
#error "ERROR - Only STM32F103xE, STM32F103xG, STM32F4xx or STM32F7xx CPUs supported"
// use local drivers
#if defined(STM32F103xE) || defined(STM32F103xG)
#include <stm32f1xx_hal_rcc_ex.h>
#include <stm32f1xx_hal_sd.h>
#elif defined(STM32F4xx)
#include <stm32f4xx_hal_rcc.h>
#include <stm32f4xx_hal_dma.h>
#include <stm32f4xx_hal_gpio.h>
#include <stm32f4xx_hal_sd.h>
#elif defined(STM32F7xx)
#include <stm32f7xx_hal_rcc.h>
#include <stm32f7xx_hal_dma.h>
#include <stm32f7xx_hal_gpio.h>
#include <stm32f7xx_hal_sd.h>
#else
#error "SDIO only supported with STM32F103xE, STM32F103xG, STM32F4xx, or STM32F7xx."
#endif
#if HAS_SD_HOST_DRIVE
// use USB drivers
extern "C" {
int8_t SD_MSC_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
int8_t SD_MSC_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
extern SD_HandleTypeDef hsd;
}
// Fixed
#define SDIO_D0_PIN PC8
#define SDIO_D1_PIN PC9
#define SDIO_D2_PIN PC10
#define SDIO_D3_PIN PC11
#define SDIO_CK_PIN PC12
#define SDIO_CMD_PIN PD2
SD_HandleTypeDef hsd; // create SDIO structure
// F4 supports one DMA for RX and another for TX, but Marlin will never
// do read and write at same time, so we use the same DMA for both.
DMA_HandleTypeDef hdma_sdio;
/*
SDIO_INIT_CLK_DIV is 118
SDIO clock frequency is 48MHz / (TRANSFER_CLOCK_DIV + 2)
SDIO init clock frequency should not exceed 400KHz = 48MHz / (118 + 2)
Default TRANSFER_CLOCK_DIV is 2 (118 / 40)
Default SDIO clock frequency is 48MHz / (2 + 2) = 12 MHz
This might be too fast for stable SDIO operations
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
*/
#ifndef USBD_OK
#define USBD_OK 0
#endif
bool SDIO_Init() {
return hsd.State == HAL_SD_STATE_READY; // return pass/fail status
}
// Target Clock, configurable. Default is 18MHz, from STM32F1
#ifndef SDIO_CLOCK
#define SDIO_CLOCK 18000000 // 18 MHz
#endif
bool SDIO_ReadBlock(uint32_t block, uint8_t *src) {
int8_t status = SD_MSC_Read(0, (uint8_t*)src, block, 1); // read one 512 byte block
return (bool) status;
}
// SDIO retries, configurable. Default is 3, from STM32F1
#ifndef SDIO_READ_RETRIES
#define SDIO_READ_RETRIES 3
#endif
bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) {
int8_t status = SD_MSC_Write(0, (uint8_t*)src, block, 1); // write one 512 byte block
return (bool) status;
}
// 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() {
/* Default SDIO peripheral configuration for SD card initialization */
hsd.Init.ClockEdge = hsd.Init.ClockEdge;
hsd.Init.ClockBypass = hsd.Init.ClockBypass;
hsd.Init.ClockPowerSave = hsd.Init.ClockPowerSave;
hsd.Init.BusWide = hsd.Init.BusWide;
hsd.Init.HardwareFlowControl = hsd.Init.HardwareFlowControl;
hsd.Init.ClockDiv = clock_to_divider(SDIO_CLOCK);
/* Initialize SDIO peripheral interface with default configuration */
SDIO_Init(hsd.Instance, hsd.Init);
}
void SD_LowLevel_Init(void) {
uint32_t tempreg;
__HAL_RCC_GPIOC_CLK_ENABLE(); //enable GPIO clocks
__HAL_RCC_GPIOD_CLK_ENABLE(); //enable GPIO clocks
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = 1; //GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
#if DISABLED(STM32F1xx)
GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
#endif
#else // !USBD_USE_CDC_COMPOSITE
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_12; // D0 & SCK
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// use local drivers
#if defined(STM32F103xE) || defined(STM32F103xG)
#include <stm32f1xx_hal_rcc_ex.h>
#include <stm32f1xx_hal_sd.h>
#elif defined(STM32F4xx)
#include <stm32f4xx_hal_rcc.h>
#include <stm32f4xx_hal_dma.h>
#include <stm32f4xx_hal_gpio.h>
#include <stm32f4xx_hal_sd.h>
#elif defined(STM32F7xx)
#include <stm32f7xx_hal_rcc.h>
#include <stm32f7xx_hal_dma.h>
#include <stm32f7xx_hal_gpio.h>
#include <stm32f7xx_hal_sd.h>
#else
#error "ERROR - Only STM32F103xE, STM32F103xG, STM32F4xx or STM32F7xx CPUs supported"
#if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // define D1-D3 only if have a four bit wide SDIO bus
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11; // D1-D3
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
#endif
// Fixed
#define SDIO_D0_PIN PC8
#define SDIO_D1_PIN PC9
#define SDIO_D2_PIN PC10
#define SDIO_D3_PIN PC11
#define SDIO_CK_PIN PC12
#define SDIO_CMD_PIN PD2
SD_HandleTypeDef hsd; // create SDIO structure
// F4 supports one DMA for RX and another for TX, but Marlin will never
// do read and write at same time, so we use the same DMA for both.
DMA_HandleTypeDef hdma_sdio;
/*
SDIO_INIT_CLK_DIV is 118
SDIO clock frequency is 48MHz / (TRANSFER_CLOCK_DIV + 2)
SDIO init clock frequency should not exceed 400KHz = 48MHz / (118 + 2)
Default TRANSFER_CLOCK_DIV is 2 (118 / 40)
Default SDIO clock frequency is 48MHz / (2 + 2) = 12 MHz
This might be too fast for stable SDIO operations
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
*/
#ifndef USBD_OK
#define USBD_OK 0
#endif
// Configure PD.02 CMD line
GPIO_InitStruct.Pin = GPIO_PIN_2;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
// Target Clock, configurable. Default is 18MHz, from STM32F1
#ifndef SDIO_CLOCK
#define SDIO_CLOCK 18000000 // 18 MHz
// Setup DMA
#if defined(STM32F1xx)
hdma_sdio.Init.Mode = DMA_NORMAL;
hdma_sdio.Instance = DMA2_Channel4;
HAL_NVIC_EnableIRQ(DMA2_Channel4_5_IRQn);
#elif defined(STM32F4xx)
hdma_sdio.Init.Mode = DMA_PFCTRL;
hdma_sdio.Instance = DMA2_Stream3;
hdma_sdio.Init.Channel = DMA_CHANNEL_4;
hdma_sdio.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_sdio.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_sdio.Init.MemBurst = DMA_MBURST_INC4;
hdma_sdio.Init.PeriphBurst = DMA_PBURST_INC4;
HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
#endif
HAL_NVIC_EnableIRQ(SDIO_IRQn);
hdma_sdio.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_sdio.Init.MemInc = DMA_MINC_ENABLE;
hdma_sdio.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_sdio.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_sdio.Init.Priority = DMA_PRIORITY_LOW;
__HAL_LINKDMA(&hsd, hdmarx, hdma_sdio);
__HAL_LINKDMA(&hsd, hdmatx, hdma_sdio);
// SDIO retries, configurable. Default is 3, from STM32F1
#ifndef SDIO_READ_RETRIES
#define SDIO_READ_RETRIES 3
#if defined(STM32F1xx)
__HAL_RCC_SDIO_CLK_ENABLE();
__HAL_RCC_DMA2_CLK_ENABLE();
#else
__HAL_RCC_SDIO_FORCE_RESET();
delay(2);
__HAL_RCC_SDIO_RELEASE_RESET();
delay(2);
__HAL_RCC_SDIO_CLK_ENABLE();
__HAL_RCC_DMA2_FORCE_RESET();
delay(2);
__HAL_RCC_DMA2_RELEASE_RESET();
delay(2);
__HAL_RCC_DMA2_CLK_ENABLE();
#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() {
/* Default SDIO peripheral configuration for SD card initialization */
hsd.Init.ClockEdge = hsd.Init.ClockEdge;
hsd.Init.ClockBypass = hsd.Init.ClockBypass;
hsd.Init.ClockPowerSave = hsd.Init.ClockPowerSave;
hsd.Init.BusWide = hsd.Init.BusWide;
hsd.Init.HardwareFlowControl = hsd.Init.HardwareFlowControl;
hsd.Init.ClockDiv = clock_to_divider(SDIO_CLOCK);
/* Initialize SDIO peripheral interface with default configuration */
SDIO_Init(hsd.Instance, hsd.Init);
}
void SD_LowLevel_Init(void) {
uint32_t tempreg;
//Initialize the SDIO (with initial <400Khz Clock)
tempreg = 0; //Reset value
tempreg |= SDIO_CLKCR_CLKEN; // Clock enabled
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;
__HAL_RCC_GPIOC_CLK_ENABLE(); //enable GPIO clocks
__HAL_RCC_GPIOD_CLK_ENABLE(); //enable GPIO clocks
// Power up the SDIO
SDIO_PowerState_ON(SDIO);
hsd.Instance = SDIO;
}
GPIO_InitTypeDef GPIO_InitStruct;
void HAL_SD_MspInit(SD_HandleTypeDef *hsd) { // application specific init
UNUSED(hsd); // Prevent unused argument(s) compilation warning
__HAL_RCC_SDIO_CLK_ENABLE(); // turn on SDIO clock
}
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = 1; //GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
bool SDIO_Init() {
uint8_t retryCnt = SDIO_READ_RETRIES;
#if DISABLED(STM32F1xx)
GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
#endif
bool status;
hsd.Instance = SDIO;
hsd.State = HAL_SD_STATE_RESET;
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_12; // D0 & SCK
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
SD_LowLevel_Init();
#if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // define D1-D3 only if have a four bit wide SDIO bus
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11; // D1-D3
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
#endif
// Configure PD.02 CMD line
GPIO_InitStruct.Pin = GPIO_PIN_2;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
// Setup DMA
#if defined(STM32F1xx)
hdma_sdio.Init.Mode = DMA_NORMAL;
hdma_sdio.Instance = DMA2_Channel4;
HAL_NVIC_EnableIRQ(DMA2_Channel4_5_IRQn);
#elif defined(STM32F4xx)
hdma_sdio.Init.Mode = DMA_PFCTRL;
hdma_sdio.Instance = DMA2_Stream3;
hdma_sdio.Init.Channel = DMA_CHANNEL_4;
hdma_sdio.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_sdio.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_sdio.Init.MemBurst = DMA_MBURST_INC4;
hdma_sdio.Init.PeriphBurst = DMA_PBURST_INC4;
HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
#endif
HAL_NVIC_EnableIRQ(SDIO_IRQn);
hdma_sdio.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_sdio.Init.MemInc = DMA_MINC_ENABLE;
hdma_sdio.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_sdio.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_sdio.Init.Priority = DMA_PRIORITY_LOW;
__HAL_LINKDMA(&hsd, hdmarx, hdma_sdio);
__HAL_LINKDMA(&hsd, hdmatx, hdma_sdio);
#if defined(STM32F1xx)
__HAL_RCC_SDIO_CLK_ENABLE();
__HAL_RCC_DMA2_CLK_ENABLE();
#else
__HAL_RCC_SDIO_FORCE_RESET();
delay(2);
__HAL_RCC_SDIO_RELEASE_RESET();
delay(2);
__HAL_RCC_SDIO_CLK_ENABLE();
__HAL_RCC_DMA2_FORCE_RESET();
delay(2);
__HAL_RCC_DMA2_RELEASE_RESET();
delay(2);
__HAL_RCC_DMA2_CLK_ENABLE();
#endif
//Initialize the SDIO (with initial <400Khz Clock)
tempreg = 0; //Reset value
tempreg |= SDIO_CLKCR_CLKEN; // Clock enabled
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_PowerState_ON(SDIO);
hsd.Instance = SDIO;
}
void HAL_SD_MspInit(SD_HandleTypeDef *hsd) { // application specific init
UNUSED(hsd); // Prevent unused argument(s) compilation warning
__HAL_RCC_SDIO_CLK_ENABLE(); // turn on SDIO clock
uint8_t retry_Cnt = retryCnt;
for (;;) {
TERN_(USE_WATCHDOG, HAL_watchdog_refresh());
status = (bool) HAL_SD_Init(&hsd);
if (!status) break;
if (!--retry_Cnt) return false; // return failing status if retries are exhausted
}
bool SDIO_Init() {
uint8_t retryCnt = SDIO_READ_RETRIES;
bool status;
hsd.Instance = SDIO;
hsd.State = HAL_SD_STATE_RESET;
go_to_transfer_speed();
SD_LowLevel_Init();
uint8_t retry_Cnt = retryCnt;
#if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // go to 4 bit wide mode if pins are defined
retry_Cnt = retryCnt;
for (;;) {
TERN_(USE_WATCHDOG, HAL_watchdog_refresh());
status = (bool) HAL_SD_Init(&hsd);
if (!status) break;
if (!--retry_Cnt) return false; // return failing status if retries are exhausted
if (!HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)) break; // some cards are only 1 bit wide so a pass here is not required
if (!--retry_Cnt) break;
}
go_to_transfer_speed();
#if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // go to 4 bit wide mode if pins are defined
if (!retry_Cnt) { // wide bus failed, go back to one bit wide mode
hsd.State = (HAL_SD_StateTypeDef) 0; // HAL_SD_STATE_RESET
SD_LowLevel_Init();
retry_Cnt = retryCnt;
for (;;) {
TERN_(USE_WATCHDOG, HAL_watchdog_refresh());
if (!HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)) break; // some cards are only 1 bit wide so a pass here is not required
if (!--retry_Cnt) break;
status = (bool) HAL_SD_Init(&hsd);
if (!status) break;
if (!--retry_Cnt) return false; // return failing status if retries are exhausted
}
if (!retry_Cnt) { // wide bus failed, go back to one bit wide mode
hsd.State = (HAL_SD_StateTypeDef) 0; // HAL_SD_STATE_RESET
SD_LowLevel_Init();
retry_Cnt = retryCnt;
for (;;) {
TERN_(USE_WATCHDOG, HAL_watchdog_refresh());
status = (bool) HAL_SD_Init(&hsd);
if (!status) break;
if (!--retry_Cnt) return false; // return failing status if retries are exhausted
}
go_to_transfer_speed();
}
#endif
go_to_transfer_speed();
}
#endif
return true;
}
return true;
}
static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t *src, uint8_t *dst) {
if (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) return false;
static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t *src, uint8_t *dst) {
if (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) return false;
TERN_(USE_WATCHDOG, HAL_watchdog_refresh());
TERN_(USE_WATCHDOG, HAL_watchdog_refresh());
HAL_StatusTypeDef ret;
if (src) {
hdma_sdio.Init.Direction = DMA_MEMORY_TO_PERIPH;
HAL_DMA_Init(&hdma_sdio);
ret = HAL_SD_WriteBlocks_DMA(&hsd, (uint8_t *)src, block, 1);
}
else {
hdma_sdio.Init.Direction = DMA_PERIPH_TO_MEMORY;
HAL_DMA_Init(&hdma_sdio);
ret = HAL_SD_ReadBlocks_DMA(&hsd, (uint8_t *)dst, block, 1);
}
HAL_StatusTypeDef ret;
if (src) {
hdma_sdio.Init.Direction = DMA_MEMORY_TO_PERIPH;
HAL_DMA_Init(&hdma_sdio);
ret = HAL_SD_WriteBlocks_DMA(&hsd, (uint8_t *)src, block, 1);
}
else {
hdma_sdio.Init.Direction = DMA_PERIPH_TO_MEMORY;
HAL_DMA_Init(&hdma_sdio);
ret = HAL_SD_ReadBlocks_DMA(&hsd, (uint8_t *)dst, block, 1);
}
if (ret != HAL_OK) {
if (ret != HAL_OK) {
HAL_DMA_Abort_IT(&hdma_sdio);
HAL_DMA_DeInit(&hdma_sdio);
return false;
}
millis_t timeout = millis() + 500;
// Wait the transfer
while (hsd.State != HAL_SD_STATE_READY) {
if (ELAPSED(millis(), timeout)) {
HAL_DMA_Abort_IT(&hdma_sdio);
HAL_DMA_DeInit(&hdma_sdio);
return false;
}
}
millis_t timeout = millis() + 500;
// Wait the transfer
while (hsd.State != HAL_SD_STATE_READY) {
if (ELAPSED(millis(), timeout)) {
HAL_DMA_Abort_IT(&hdma_sdio);
HAL_DMA_DeInit(&hdma_sdio);
return false;
}
}
while (__HAL_DMA_GET_FLAG(&hdma_sdio, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_sdio)) != 0
|| __HAL_DMA_GET_FLAG(&hdma_sdio, __HAL_DMA_GET_TE_FLAG_INDEX(&hdma_sdio)) != 0) { /* nada */ }
while (__HAL_DMA_GET_FLAG(&hdma_sdio, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_sdio)) != 0
|| __HAL_DMA_GET_FLAG(&hdma_sdio, __HAL_DMA_GET_TE_FLAG_INDEX(&hdma_sdio)) != 0) { /* nada */ }
HAL_DMA_Abort_IT(&hdma_sdio);
HAL_DMA_DeInit(&hdma_sdio);
HAL_DMA_Abort_IT(&hdma_sdio);
HAL_DMA_DeInit(&hdma_sdio);
timeout = millis() + 500;
while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) if (ELAPSED(millis(), timeout)) return false;
timeout = millis() + 500;
while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) if (ELAPSED(millis(), timeout)) return false;
return true;
}
return true;
}
bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) {
uint8_t retries = SDIO_READ_RETRIES;
while (retries--) if (SDIO_ReadWriteBlock_DMA(block, NULL, dst)) return true;
return false;
}
bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) {
uint8_t retries = SDIO_READ_RETRIES;
while (retries--) if (SDIO_ReadWriteBlock_DMA(block, NULL, dst)) return true;
return false;
}
bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) {
uint8_t retries = SDIO_READ_RETRIES;
while (retries--) if (SDIO_ReadWriteBlock_DMA(block, src, NULL)) return true;
return false;
}
bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) {
uint8_t retries = SDIO_READ_RETRIES;
while (retries--) if (SDIO_ReadWriteBlock_DMA(block, src, NULL)) return true;
return false;
}
bool SDIO_IsReady() {
return hsd.State == HAL_SD_STATE_READY;
}
#if defined(STM32F1xx)
#define DMA_IRQ_HANDLER DMA2_Channel4_5_IRQHandler
#elif defined(STM32F4xx)
#define DMA_IRQ_HANDLER DMA2_Stream3_IRQHandler
#else
#error "Unknown STM32 architecture."
#endif
uint32_t SDIO_GetCardSize() {
return (uint32_t)(hsd.SdCard.BlockNbr) * (hsd.SdCard.BlockSize);
}
#if defined(STM32F1xx)
#define DMA_IRQ_HANDLER DMA2_Channel4_5_IRQHandler
#elif defined(STM32F4xx)
#define DMA_IRQ_HANDLER DMA2_Stream3_IRQHandler
#else
#error "Unknown STM32 architecture."
#endif
extern "C" void SDIO_IRQHandler(void) { HAL_SD_IRQHandler(&hsd); }
extern "C" void DMA_IRQ_HANDLER(void) { HAL_DMA_IRQHandler(&hdma_sdio); }
extern "C" void SDIO_IRQHandler(void) { HAL_SD_IRQHandler(&hsd); }
extern "C" void DMA_IRQ_HANDLER(void) { HAL_DMA_IRQHandler(&hdma_sdio); }
#endif // !USBD_USE_CDC_COMPOSITE
#endif // SDIO_SUPPORT
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/Servo.cpp

@ -20,7 +20,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfig.h"
@ -107,4 +107,4 @@ void libServo::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriori
}
#endif // HAS_SERVOS
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/eeprom_flash.cpp

@ -20,7 +20,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfig.h"
@ -270,4 +270,4 @@ bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t
}
#endif // FLASH_EEPROM_EMULATION
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/eeprom_sdcard.cpp

@ -19,7 +19,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
/**
* Implementation of EEPROM settings in SD Card
@ -88,4 +88,4 @@ bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uin
}
#endif // SDCARD_EEPROM_EMULATION
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/eeprom_sram.cpp

@ -20,7 +20,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfig.h"
@ -65,4 +65,4 @@ bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t
}
#endif // SRAM_EEPROM_EMULATION
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/eeprom_wired.cpp

@ -20,7 +20,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfig.h"
@ -80,4 +80,4 @@ bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t
}
#endif // USE_WIRED_EEPROM
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/fast_pwm.cpp

@ -19,7 +19,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfigPre.h"
@ -56,4 +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
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/fastio.cpp

@ -20,7 +20,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfig.h"
@ -31,4 +31,4 @@ void FastIO_init() {
FastIOPortMap[STM_PORT(digitalPin[i])] = get_GPIO_Port(STM_PORT(digitalPin[i]));
}
#endif
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

14
Marlin/src/HAL/STM32/msc_sd.cpp

@ -13,21 +13,24 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfigPre.h"
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && HAS_SD_HOST_DRIVE
#if HAS_SD_HOST_DRIVE
#include "msc_sd.h"
#include "../shared/Marduino.h"
#include "msc_sd.h"
#include "usbd_core.h"
#include "../../sd/cardreader.h"
#include <USB.h>
#include <USBMscHandler.h>
#define BLOCK_SIZE 512
#define PRODUCT_ID 0x29
#include "../../sd/cardreader.h"
class Sd2CardUSBMscHandler : public USBMscHandler {
public:
DiskIODriver* diskIODriver() {
@ -121,4 +124,5 @@ void MSC_SD_init() {
USBDevice.begin();
}
#endif // __STM32F1__ && HAS_SD_HOST_DRIVE
#endif // HAS_SD_HOST_DRIVE
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/tft/gt911.cpp

@ -19,7 +19,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../../inc/MarlinConfig.h"
@ -199,4 +199,4 @@ bool GT911::getPoint(int16_t *x, int16_t *y) {
}
#endif // TFT_TOUCH_DEVICE_GT911
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/tft/tft_fsmc.cpp

@ -19,7 +19,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../../inc/MarlinConfig.h"
@ -178,4 +178,4 @@ void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Cou
}
#endif // HAS_FSMC_TFT
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/tft/tft_ltdc.cpp

@ -19,7 +19,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../../inc/MarlinConfig.h"
@ -384,4 +384,4 @@ void TFT_LTDC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Cou
}
#endif // HAS_LTDC_TFT
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/tft/tft_spi.cpp

@ -19,7 +19,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../../inc/MarlinConfig.h"
@ -240,4 +240,4 @@ void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Coun
}
#endif // HAS_SPI_TFT
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/tft/xpt2046.cpp

@ -19,7 +19,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../../inc/MarlinConfig.h"
@ -167,4 +167,4 @@ uint16_t XPT2046::SoftwareIO(uint16_t data) {
}
#endif // HAS_TFT_XPT2046
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/timers.cpp

@ -19,7 +19,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfig.h"
@ -319,4 +319,4 @@ static constexpr bool verify_no_timer_conflicts() {
// 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
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/usb_host.cpp

@ -20,7 +20,7 @@
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfig.h"
@ -114,4 +114,4 @@ uint8_t BulkStorage::Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t b
}
#endif // USE_OTG_USB_HOST && USBHOST
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/usb_serial.cpp

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfigPre.h"
@ -51,4 +51,4 @@ void USB_Hook_init() {
}
#endif // EMERGENCY_PARSER && USBD_USE_CDC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

4
Marlin/src/HAL/STM32/watchdog.cpp

@ -19,7 +19,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(MAPLE_STM32F1)
#include "../../inc/MarlinConfigPre.h"
@ -46,4 +46,4 @@ void HAL_watchdog_refresh() {
}
#endif // USE_WATCHDOG
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC && !MAPLE_STM32F1

2
Marlin/src/HAL/STM32F1/inc/SanityCheck.h

@ -39,7 +39,7 @@
#error "SERIAL_STATS_DROPPED_RX is not supported on the STM32F1 platform."
#endif
#if ENABLED(NEOPIXEL_LED)
#if ENABLED(NEOPIXEL_LED) && DISABLED(MKS_MINI_12864_V3)
#error "NEOPIXEL_LED (Adafruit NeoPixel) is not supported for HAL/STM32F1. Comment out this line to proceed at your own risk!"
#endif

7
Marlin/src/HAL/STM32F1/msc_sd.cpp

@ -13,9 +13,11 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#ifdef __STM32F1__
#include "../../inc/MarlinConfigPre.h"
#if defined(__STM32F1__) && HAS_SD_HOST_DRIVE
#if HAS_SD_HOST_DRIVE
#include "msc_sd.h"
#include "SPI.h"
@ -92,4 +94,5 @@ void MSC_SD_init() {
#endif
}
#endif // __STM32F1__ && HAS_SD_HOST_DRIVE
#endif // HAS_SD_HOST_DRIVE
#endif // __STM32F1__

4
Marlin/src/HAL/STM32F1/sdio.cpp

@ -184,6 +184,10 @@ bool SDIO_WriteBlock(uint32_t blockAddress, const uint8_t *data) {
inline uint32_t SDIO_GetCardState() { return SDIO_CmdSendStatus(SdCard.RelCardAdd << 16U) ? (SDIO_GetResponse(SDIO_RESP1) >> 9U) & 0x0FU : SDIO_CARD_ERROR; }
// No F1 board with SDIO + MSC using Maple, that I aware of...
bool SDIO_IsReady() { return true; }
uint32_t SDIO_GetCardSize() { return 0; }
// ------------------------
// SD Commands and Responses
// ------------------------

80
Marlin/src/HAL/shared/Delay.h

@ -97,43 +97,65 @@ void calibrate_delay_loop();
#define DELAY_US(x) DelayCycleFnc((x) * ((F_CPU) / 1000000UL))
#elif defined(__AVR__)
#define nop() __asm__ __volatile__("nop;\n\t":::)
FORCE_INLINE static void __delay_4cycles(uint8_t cy) {
__asm__ __volatile__(
L("1")
A("dec %[cnt]")
A("nop")
A("brne 1b")
: [cnt] "+r"(cy) // output: +r means input+output
: // input:
: "cc" // clobbers:
);
FORCE_INLINE static void __delay_up_to_3c(uint8_t cycles) {
switch (cycles) {
case 3:
__asm__ __volatile__(A("RJMP .+0") A("NOP"));
break;
case 2:
__asm__ __volatile__(A("RJMP .+0"));
break;
case 1:
__asm__ __volatile__(A("NOP"));
break;
}
}
// Delay in cycles
FORCE_INLINE static void DELAY_CYCLES(uint16_t x) {
if (__builtin_constant_p(x)) {
#define MAXNOPS 4
if (x <= (MAXNOPS)) {
switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); }
FORCE_INLINE static void DELAY_CYCLES(uint16_t cycles) {
if (__builtin_constant_p(cycles)) {
if (cycles <= 3) {
__delay_up_to_3c(cycles);
}
else if (cycles == 4) {
__delay_up_to_3c(2);
__delay_up_to_3c(2);
}
else {
const uint32_t rem = (x) % (MAXNOPS);
switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); }
if ((x = (x) / (MAXNOPS)))
__delay_4cycles(x); // if need more then 4 nop loop is more optimal
cycles -= 1 + 4; // Compensate for the first LDI (1) and the first round (4)
__delay_up_to_3c(cycles % 4);
cycles /= 4;
// The following code burns [1 + 4 * (rounds+1)] cycles
uint16_t dummy;
__asm__ __volatile__(
// "manually" load counter from constants, otherwise the compiler may optimize this part away
A("LDI %A[rounds], %[l]") // 1c
A("LDI %B[rounds], %[h]") // 1c (compensating the non branching BRCC)
L("1")
A("SBIW %[rounds], 1") // 2c
A("BRCC 1b") // 2c when branching, else 1c (end of loop)
: // Outputs ...
[rounds] "=w" (dummy) // Restrict to a wo (=) 16 bit register pair (w)
: // Inputs ...
[l] "M" (cycles%256), // Restrict to 0..255 constant (M)
[h] "M" (cycles/256) // Restrict to 0..255 constant (M)
:// Clobbers ...
"cc" // Indicate we are modifying flags like Carry (cc)
);
}
#undef MAXNOPS
}
else if ((x >>= 2))
__delay_4cycles(x);
else {
__asm__ __volatile__(
L("1")
A("SBIW %[cycles], 4") // 2c
A("BRCC 1b") // 2c when branching, else 1c (end of loop)
: [cycles] "+w" (cycles) // output: Restrict to a rw (+) 16 bit register pair (w)
: // input: -
: "cc" // clobbers: We are modifying flags like Carry (cc)
);
}
}
#undef nop
// Delay in microseconds
#define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL))

142
Marlin/src/MarlinCore.cpp

@ -70,7 +70,7 @@
#if HAS_TFT_LVGL_UI
#include "lcd/extui/mks_ui/tft_lvgl_configuration.h"
#include "lcd/extui/mks_ui/draw_ui.h"
#include "lcd/extui/mks_ui/mks_hardware_test.h"
#include "lcd/extui/mks_ui/mks_hardware.h"
#include <lvgl.h>
#endif
@ -135,7 +135,7 @@
#include "module/servo.h"
#endif
#if ENABLED(HAS_MOTOR_CURRENT_DAC)
#if HAS_MOTOR_CURRENT_DAC
#include "feature/dac/stepper_dac.h"
#endif
@ -510,7 +510,6 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
constexpr millis_t HOME_DEBOUNCE_DELAY = 1000UL;
static millis_t next_home_key_ms; // = 0
if (!IS_SD_PRINTING() && !READ(HOME_PIN)) { // HOME_PIN goes LOW when pressed
const millis_t ms = millis();
if (ELAPSED(ms, next_home_key_ms)) {
next_home_key_ms = ms + HOME_DEBOUNCE_DELAY;
LCD_MESSAGEPGM(MSG_AUTO_HOME);
@ -522,102 +521,154 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
#if ENABLED(CUSTOM_USER_BUTTONS)
// Handle a custom user button if defined
const bool printer_not_busy = !printingIsActive();
#define HAS_CUSTOM_USER_BUTTON(N) (PIN_EXISTS(BUTTON##N) && defined(BUTTON##N##_HIT_STATE) && defined(BUTTON##N##_GCODE) && defined(BUTTON##N##_DESC))
#define CHECK_CUSTOM_USER_BUTTON(N) do{ \
#define HAS_CUSTOM_USER_BUTTON(N) (PIN_EXISTS(BUTTON##N) && defined(BUTTON##N##_HIT_STATE) && defined(BUTTON##N##_GCODE))
#define HAS_BETTER_USER_BUTTON(N) HAS_CUSTOM_USER_BUTTON(N) && defined(BUTTON##N##_DESC)
#define _CHECK_CUSTOM_USER_BUTTON(N, CODE) do{ \
constexpr millis_t CUB_DEBOUNCE_DELAY_##N = 250UL; \
static millis_t next_cub_ms_##N; \
if (BUTTON##N##_HIT_STATE == READ(BUTTON##N##_PIN) \
&& (ENABLED(BUTTON##N##_WHEN_PRINTING) || printer_not_busy)) { \
const millis_t ms = millis(); \
if (ELAPSED(ms, next_cub_ms_##N)) { \
next_cub_ms_##N = ms + CUB_DEBOUNCE_DELAY_##N; \
if (strlen(BUTTON##N##_DESC)) \
LCD_MESSAGEPGM_P(PSTR(BUTTON##N##_DESC)); \
CODE; \
queue.inject_P(PSTR(BUTTON##N##_GCODE)); \
} \
} \
}while(0)
#if HAS_CUSTOM_USER_BUTTON(1)
#define CHECK_CUSTOM_USER_BUTTON(N) _CHECK_CUSTOM_USER_BUTTON(N, NOOP)
#define CHECK_BETTER_USER_BUTTON(N) _CHECK_CUSTOM_USER_BUTTON(N, if (strlen(BUTTON##N##_DESC)) LCD_MESSAGEPGM_P(PSTR(BUTTON##N##_DESC)))
#if HAS_BETTER_USER_BUTTON(1)
CHECK_BETTER_USER_BUTTON(1);
#elif HAS_CUSTOM_USER_BUTTON(1)
CHECK_CUSTOM_USER_BUTTON(1);
#endif
#if HAS_CUSTOM_USER_BUTTON(2)
#if HAS_BETTER_USER_BUTTON(2)
CHECK_BETTER_USER_BUTTON(2);
#elif HAS_CUSTOM_USER_BUTTON(2)
CHECK_CUSTOM_USER_BUTTON(2);
#endif
#if HAS_CUSTOM_USER_BUTTON(3)
#if HAS_BETTER_USER_BUTTON(3)
CHECK_BETTER_USER_BUTTON(3);
#elif HAS_CUSTOM_USER_BUTTON(3)
CHECK_CUSTOM_USER_BUTTON(3);
#endif
#if HAS_CUSTOM_USER_BUTTON(4)
#if HAS_BETTER_USER_BUTTON(4)
CHECK_BETTER_USER_BUTTON(4);
#elif HAS_CUSTOM_USER_BUTTON(4)
CHECK_CUSTOM_USER_BUTTON(4);
#endif
#if HAS_CUSTOM_USER_BUTTON(5)
#if HAS_BETTER_USER_BUTTON(5)
CHECK_BETTER_USER_BUTTON(5);
#elif HAS_CUSTOM_USER_BUTTON(5)
CHECK_CUSTOM_USER_BUTTON(5);
#endif
#if HAS_CUSTOM_USER_BUTTON(6)
#if HAS_BETTER_USER_BUTTON(6)
CHECK_BETTER_USER_BUTTON(6);
#elif HAS_CUSTOM_USER_BUTTON(6)
CHECK_CUSTOM_USER_BUTTON(6);
#endif
#if HAS_CUSTOM_USER_BUTTON(7)
#if HAS_BETTER_USER_BUTTON(7)
CHECK_BETTER_USER_BUTTON(7);
#elif HAS_CUSTOM_USER_BUTTON(7)
CHECK_CUSTOM_USER_BUTTON(7);
#endif
#if HAS_CUSTOM_USER_BUTTON(8)
#if HAS_BETTER_USER_BUTTON(8)
CHECK_BETTER_USER_BUTTON(8);
#elif HAS_CUSTOM_USER_BUTTON(8)
CHECK_CUSTOM_USER_BUTTON(8);
#endif
#if HAS_CUSTOM_USER_BUTTON(9)
#if HAS_BETTER_USER_BUTTON(9)
CHECK_BETTER_USER_BUTTON(9);
#elif HAS_CUSTOM_USER_BUTTON(9)
CHECK_CUSTOM_USER_BUTTON(9);
#endif
#if HAS_CUSTOM_USER_BUTTON(10)
#if HAS_BETTER_USER_BUTTON(10)
CHECK_BETTER_USER_BUTTON(10);
#elif HAS_CUSTOM_USER_BUTTON(10)
CHECK_CUSTOM_USER_BUTTON(10);
#endif
#if HAS_CUSTOM_USER_BUTTON(11)
#if HAS_BETTER_USER_BUTTON(11)
CHECK_BETTER_USER_BUTTON(11);
#elif HAS_CUSTOM_USER_BUTTON(11)
CHECK_CUSTOM_USER_BUTTON(11);
#endif
#if HAS_CUSTOM_USER_BUTTON(12)
#if HAS_BETTER_USER_BUTTON(12)
CHECK_BETTER_USER_BUTTON(12);
#elif HAS_CUSTOM_USER_BUTTON(12)
CHECK_CUSTOM_USER_BUTTON(12);
#endif
#if HAS_CUSTOM_USER_BUTTON(13)
#if HAS_BETTER_USER_BUTTON(13)
CHECK_BETTER_USER_BUTTON(13);
#elif HAS_CUSTOM_USER_BUTTON(13)
CHECK_CUSTOM_USER_BUTTON(13);
#endif
#if HAS_CUSTOM_USER_BUTTON(14)
#if HAS_BETTER_USER_BUTTON(14)
CHECK_BETTER_USER_BUTTON(14);
#elif HAS_CUSTOM_USER_BUTTON(14)
CHECK_CUSTOM_USER_BUTTON(14);
#endif
#if HAS_CUSTOM_USER_BUTTON(15)
#if HAS_BETTER_USER_BUTTON(15)
CHECK_BETTER_USER_BUTTON(15);
#elif HAS_CUSTOM_USER_BUTTON(15)
CHECK_CUSTOM_USER_BUTTON(15);
#endif
#if HAS_CUSTOM_USER_BUTTON(16)
#if HAS_BETTER_USER_BUTTON(16)
CHECK_BETTER_USER_BUTTON(16);
#elif HAS_CUSTOM_USER_BUTTON(16)
CHECK_CUSTOM_USER_BUTTON(16);
#endif
#if HAS_CUSTOM_USER_BUTTON(17)
#if HAS_BETTER_USER_BUTTON(17)
CHECK_BETTER_USER_BUTTON(17);
#elif HAS_CUSTOM_USER_BUTTON(17)
CHECK_CUSTOM_USER_BUTTON(17);
#endif
#if HAS_CUSTOM_USER_BUTTON(18)
#if HAS_BETTER_USER_BUTTON(18)
CHECK_BETTER_USER_BUTTON(18);
#elif HAS_CUSTOM_USER_BUTTON(18)
CHECK_CUSTOM_USER_BUTTON(18);
#endif
#if HAS_CUSTOM_USER_BUTTON(19)
#if HAS_BETTER_USER_BUTTON(19)
CHECK_BETTER_USER_BUTTON(19);
#elif HAS_CUSTOM_USER_BUTTON(19)
CHECK_CUSTOM_USER_BUTTON(19);
#endif
#if HAS_CUSTOM_USER_BUTTON(20)
#if HAS_BETTER_USER_BUTTON(20)
CHECK_BETTER_USER_BUTTON(20);
#elif HAS_CUSTOM_USER_BUTTON(20)
CHECK_CUSTOM_USER_BUTTON(20);
#endif
#if HAS_CUSTOM_USER_BUTTON(21)
#if HAS_BETTER_USER_BUTTON(21)
CHECK_BETTER_USER_BUTTON(21);
#elif HAS_CUSTOM_USER_BUTTON(21)
CHECK_CUSTOM_USER_BUTTON(21);
#endif
#if HAS_CUSTOM_USER_BUTTON(22)
#if HAS_BETTER_USER_BUTTON(22)
CHECK_BETTER_USER_BUTTON(22);
#elif HAS_CUSTOM_USER_BUTTON(22)
CHECK_CUSTOM_USER_BUTTON(22);
#endif
#if HAS_CUSTOM_USER_BUTTON(23)
#if HAS_BETTER_USER_BUTTON(23)
CHECK_BETTER_USER_BUTTON(23);
#elif HAS_CUSTOM_USER_BUTTON(23)
CHECK_CUSTOM_USER_BUTTON(23);
#endif
#if HAS_CUSTOM_USER_BUTTON(24)
#if HAS_BETTER_USER_BUTTON(24)
CHECK_BETTER_USER_BUTTON(24);
#elif HAS_CUSTOM_USER_BUTTON(24)
CHECK_CUSTOM_USER_BUTTON(24);
#endif
#if HAS_CUSTOM_USER_BUTTON(25)
#if HAS_BETTER_USER_BUTTON(25)
CHECK_BETTER_USER_BUTTON(25);
#elif HAS_CUSTOM_USER_BUTTON(25)
CHECK_CUSTOM_USER_BUTTON(25);
#endif
#endif
TERN_(USE_CONTROLLER_FAN, controllerFan.update()); // Check if fan should be turned on to cool stepper drivers down
TERN_(AUTO_POWER_CONTROL, powerManager.check());
TERN_(AUTO_POWER_CONTROL, powerManager.check(!ui.on_status_screen() || printJobOngoing() || printingIsPaused()));
TERN_(HOTEND_IDLE_TIMEOUT, hotend_idle.check());
@ -771,10 +822,8 @@ void idle(bool no_stepper_sleep/*=false*/) {
// Run StallGuard endstop checks
#if ENABLED(SPI_ENDSTOPS)
if (endstops.tmc_spi_homing.any
&& TERN1(IMPROVE_HOMING_RELIABILITY, ELAPSED(millis(), sg_guard_period))
) LOOP_L_N(i, 4) // Read SGT 4 times per idle loop
if (endstops.tmc_spi_homing_check()) break;
if (endstops.tmc_spi_homing.any && TERN1(IMPROVE_HOMING_RELIABILITY, ELAPSED(millis(), sg_guard_period)))
LOOP_L_N(i, 4) if (endstops.tmc_spi_homing_check()) break; // Read SGT 4 times per idle loop
#endif
// Handle SD Card insert / remove
@ -1156,23 +1205,16 @@ void setup() {
#endif
#endif
#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE)
mks_esp_wifi_init();
WIFISERIAL.begin(WIFI_BAUDRATE);
serial_connect_timeout = millis() + 1000UL;
while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
#endif
TERN_(DYNAMIC_VECTORTABLE, hook_cpu_exceptions()); // If supported, install Marlin exception handlers at runtime
SETUP_RUN(HAL_init());
// Init and disable SPI thermocouples; this is still needed
#if TEMP_SENSOR_0_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 0)
OUT_WRITE(MAX6675_SS_PIN, HIGH); // Disable
OUT_WRITE(TEMP_0_CS_PIN, HIGH); // Disable
#endif
#if TEMP_SENSOR_1_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 1)
OUT_WRITE(MAX6675_SS2_PIN, HIGH); // Disable
OUT_WRITE(TEMP_1_CS_PIN, HIGH);
#endif
#if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD)
@ -1228,9 +1270,7 @@ void setup() {
if (mcu & RST_SOFTWARE) SERIAL_ECHOLNPGM(STR_SOFTWARE_RESET);
HAL_clear_reset_source();
SERIAL_ECHOPGM_P(GET_TEXT(MSG_MARLIN));
SERIAL_CHAR(' ');
SERIAL_ECHOLNPGM(SHORT_BUILD_VERSION);
SERIAL_ECHOLNPGM("Marlin " SHORT_BUILD_VERSION);
SERIAL_EOL();
#if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR)
SERIAL_ECHO_MSG(
@ -1355,7 +1395,7 @@ void setup() {
SETUP_RUN(digipot_i2c.init());
#endif
#if ENABLED(HAS_MOTOR_CURRENT_DAC)
#if HAS_MOTOR_CURRENT_DAC
SETUP_RUN(stepper_dac.init());
#endif

6
Marlin/src/MarlinCore.h

@ -91,7 +91,11 @@ extern bool wait_for_heatup;
#define PSU_OFF_SOON() powerManager.power_off_soon()
#else
#define PSU_ON() PSU_PIN_ON()
#define PSU_OFF() PSU_PIN_OFF()
#if ENABLED(PS_OFF_SOUND)
#define PSU_OFF() do{ BUZZ(1000, 659); PSU_PIN_OFF(); }while(0)
#else
#define PSU_OFF() PSU_PIN_OFF()
#endif
#define PSU_OFF_SOON PSU_OFF
#endif
#endif

29
Marlin/src/core/boards.h

@ -249,7 +249,7 @@
#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)
#define BOARD_BTT_SKR_E3_TURBO 2510 // BigTreeTech SKR E3 Turbo (Power outputs: Hotend0, Hotend1, Bed, Fan0, Fan1)
#define BOARD_FLY_CDY 2511 // FLY_CDY (Power outputs: Hotend0, Hotend1, Hotend2, Bed, Fan0, Fan1, Fan2)
#define BOARD_FLY_CDY 2511 // FLYmaker FLY CDY (Power outputs: Hotend0, Hotend1, Hotend2, Bed, Fan0, Fan1, Fan2)
//
// SAM3X8E ARM Cortex M3
@ -333,18 +333,19 @@
#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 V6 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
#define BOARD_MINGDA_MPX_ARM_MINI 4048 // STM32F103ZET6 Mingda MD-16
#define BOARD_GTM32_PRO_VD 4049 // STM32F103VET6 controller
#define BOARD_CHITU3D_V9 4038 // Chitu3D TronXY X5SA V9 Board
#define BOARD_CREALITY_V4 4039 // Creality v4.x (STM32F103RE)
#define BOARD_CREALITY_V427 4040 // Creality v4.2.7 (STM32F103RE)
#define BOARD_CREALITY_V4210 4041 // Creality v4.2.10 (STM32F103RE) as found in the CR-30
#define BOARD_CREALITY_V431 4042 // Creality v4.3.1 (STM32F103RE)
#define BOARD_CREALITY_V452 4043 // Creality v4.5.2 (STM32F103RE)
#define BOARD_CREALITY_V453 4044 // Creality v4.5.3 (STM32F103RE)
#define BOARD_TRIGORILLA_PRO 4045 // Trigorilla Pro (STM32F103ZET6)
#define BOARD_FLY_MINI 4046 // FLYmaker FLY MINI (STM32F103RCT6)
#define BOARD_FLSUN_HISPEED 4047 // FLSUN HiSpeedV1 (STM32F103VET6)
#define BOARD_BEAST 4048 // STM32F103RET6 Libmaple-based controller
#define BOARD_MINGDA_MPX_ARM_MINI 4049 // STM32F103ZET6 Mingda MD-16
#define BOARD_GTM32_PRO_VD 4050 // STM32F103VET6 controller
//
// ARM Cortex-M4F
@ -380,7 +381,7 @@
#define BOARD_FYSETC_S6 4220 // FYSETC S6 (STM32F446VET6)
#define BOARD_FYSETC_S6_V2_0 4221 // FYSETC S6 v2.0 (STM32F446VET6)
#define BOARD_FYSETC_SPIDER 4222 // FYSETC Spider (STM32F446VET6)
#define BOARD_FLYF407ZG 4223 // FLYF407ZG (STM32F407ZG)
#define BOARD_FLYF407ZG 4223 // FLYmaker FLYF407ZG (STM32F407ZG)
#define BOARD_MKS_ROBIN2 4224 // MKS_ROBIN2 (STM32F407ZE)
#define BOARD_MKS_ROBIN_PRO_V2 4225 // MKS Robin Pro V2 (STM32F407VE)
#define BOARD_MKS_ROBIN_NANO_V3 4226 // MKS Robin Nano V3 (STM32F407VG)

6
Marlin/src/core/macros.h

@ -204,8 +204,8 @@
#define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1'
#define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B.
#define _OPTARG(A) , A
#define OPTARG(O,A) TERN_(O,DEFER4(_OPTARG)(A))
#define _OPTARG(A...) , A
#define OPTARG(O,A...) TERN_(O,DEFER4(_OPTARG)(A))
#define _OPTCODE(A) A;
#define OPTCODE(O,A) TERN_(O,DEFER4(_OPTCODE)(A))
@ -442,7 +442,7 @@
return contains(str, '/') ? findLastPos(findStringEnd(str), '/') : str;
}
// Find the first occurence of a character in a string (or return the last position in the string)
// Find the first occurrence of a character in a string (or return the last position in the string)
constexpr const char* findFirst(const char *str, const char ch) {
return *str == ch || *str == 0 ? (str + 1) : findFirst(str + 1, ch);
}

3
Marlin/src/core/multi_language.h

@ -42,15 +42,12 @@ typedef const char Language_Str[];
#ifndef LCD_LANGUAGE_2
#define LCD_LANGUAGE_2 LCD_LANGUAGE
#endif
#ifndef LCD_LANGUAGE_3
#define LCD_LANGUAGE_3 LCD_LANGUAGE_2
#endif
#ifndef LCD_LANGUAGE_4
#define LCD_LANGUAGE_4 LCD_LANGUAGE_3
#endif
#ifndef LCD_LANGUAGE_5
#define LCD_LANGUAGE_5 LCD_LANGUAGE_4
#endif

2
Marlin/src/core/serial.h

@ -67,7 +67,7 @@ extern uint8_t marlin_debug_flags;
// Serial redirection
//
// Step 1: Find out what the first serial leaf is
#if BOTH(HAS_MULTI_SERIAL, SERIAL_CATCHALL)
#if HAS_MULTI_SERIAL && defined(SERIAL_CATCHALL)
#define _SERIAL_LEAF_1 MYSERIAL
#else
#define _SERIAL_LEAF_1 MYSERIAL1

6
Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp

@ -307,7 +307,7 @@ void unified_bed_leveling::G29() {
const uint8_t p_val = parser.byteval('P');
const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen_test('J');
#if ENABLED(HAS_MULTI_HOTEND)
#if HAS_MULTI_HOTEND
const uint8_t old_tool_index = active_extruder;
#endif
@ -916,11 +916,11 @@ void set_message_with_feedback(PGM_P const msg_P) {
if (do_ubl_mesh_map) display_map(param.T_map_type); // Show user where we're probing
if (parser.seen_test('B')) {
SERIAL_ECHOPGM_P(GET_TEXT(MSG_UBL_BC_INSERT));
SERIAL_ECHOPGM("Place Shim & Measure");
LCD_MESSAGEPGM(MSG_UBL_BC_INSERT);
}
else {
SERIAL_ECHOPGM_P(GET_TEXT(MSG_UBL_BC_INSERT2));
SERIAL_ECHOPGM("Measure");
LCD_MESSAGEPGM(MSG_UBL_BC_INSERT2);
}

23
Marlin/src/feature/cooler.cpp

@ -22,26 +22,27 @@
#include "../inc/MarlinConfig.h"
#if HAS_COOLER
#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER)
#include "cooler.h"
Cooler cooler;
uint8_t Cooler::mode = 0;
uint16_t Cooler::capacity;
uint16_t Cooler::load;
bool Cooler::enabled = false;
#if HAS_COOLER
uint8_t Cooler::mode = 0;
uint16_t Cooler::capacity;
uint16_t Cooler::load;
bool Cooler::enabled = false;
#endif
#if ENABLED(LASER_COOLANT_FLOW_METER)
bool Cooler::flowmeter = false;
millis_t Cooler::flowmeter_next_ms; // = 0
volatile uint16_t Cooler::flowpulses;
float Cooler::flowrate;
#if ENABLED(FLOWMETER_SAFETY)
bool Cooler::flowsafety_enabled = true;
bool Cooler::flowfault = false;
#endif
#endif
#if ENABLED(FLOWMETER_SAFETY)
bool Cooler::flowsafety_enabled = true;
bool Cooler::fault = false;
#endif
#endif // HAS_COOLER
#endif // HAS_COOLER || LASER_COOLANT_FLOW_METER

6
Marlin/src/feature/cooler.h

@ -94,12 +94,12 @@ public:
}
#if ENABLED(FLOWMETER_SAFETY)
static bool fault; // Flag that the cooler is in a fault state
static bool flowsafety_enabled; // Flag to disable the cutter if flow rate is too low
static bool flowfault; // Flag that the cooler is in a fault state
static bool flowsafety_enabled; // Flag to disable the cutter if flow rate is too low
static void flowsafety_toggle() { flowsafety_enabled = !flowsafety_enabled; }
static bool check_flow_too_low() {
const bool too_low = flowsafety_enabled && flowrate < (FLOWMETER_MIN_LITERS_PER_MINUTE);
if (too_low) fault = true;
flowfault = too_low;
return too_low;
}
#endif

2
Marlin/src/feature/dac/dac_mcp4728.cpp

@ -32,7 +32,7 @@
#include "../../inc/MarlinConfig.h"
#if ENABLED(HAS_MOTOR_CURRENT_DAC)
#if HAS_MOTOR_CURRENT_DAC
#include "dac_mcp4728.h"

2
Marlin/src/feature/dac/stepper_dac.cpp

@ -26,7 +26,7 @@
#include "../../inc/MarlinConfig.h"
#if ENABLED(HAS_MOTOR_CURRENT_DAC)
#if HAS_MOTOR_CURRENT_DAC
#include "stepper_dac.h"
#include "../../MarlinCore.h" // for SP_X_LBL...

6
Marlin/src/feature/joystick.h

@ -32,13 +32,13 @@
class Joystick {
friend class Temperature;
private:
#if ENABLED(HAS_JOY_ADC_X)
#if HAS_JOY_ADC_X
static temp_info_t x;
#endif
#if ENABLED(HAS_JOY_ADC_Y)
#if HAS_JOY_ADC_Y
static temp_info_t y;
#endif
#if ENABLED(HAS_JOY_ADC_Z)
#if HAS_JOY_ADC_Z
static temp_info_t z;
#endif
public:

28
Marlin/src/feature/mmu/mmu2.cpp

@ -75,7 +75,7 @@ MMU2 mmu2;
#define MMU2_NO_TOOL 99
#define MMU_BAUD 115200
bool MMU2::enabled, MMU2::ready, MMU2::mmu_print_saved;
bool MMU2::_enabled, MMU2::ready, MMU2::mmu_print_saved;
#if HAS_PRUSA_MMU2S
bool MMU2::mmu2s_triggered;
#endif
@ -219,7 +219,7 @@ void MMU2::mmu_loop() {
DEBUG_ECHOLNPAIR("MMU => ", finda, "\nMMU - ENABLED");
enabled = true;
_enabled = true;
state = 1;
TERN_(HAS_PRUSA_MMU2S, mmu2s_triggered = false);
}
@ -480,7 +480,7 @@ static void mmu2_not_responding() {
*/
void MMU2::tool_change(const uint8_t index) {
if (!enabled) return;
if (!_enabled) return;
set_runout_valid(false);
@ -512,7 +512,7 @@ static void mmu2_not_responding() {
* Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated.
*/
void MMU2::tool_change(const char *special) {
if (!enabled) return;
if (!_enabled) return;
set_runout_valid(false);
@ -561,7 +561,7 @@ static void mmu2_not_responding() {
* Handle tool change
*/
void MMU2::tool_change(const uint8_t index) {
if (!enabled) return;
if (!_enabled) return;
set_runout_valid(false);
@ -599,7 +599,7 @@ static void mmu2_not_responding() {
* Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated.
*/
void MMU2::tool_change(const char *special) {
if (!enabled) return;
if (!_enabled) return;
set_runout_valid(false);
@ -665,7 +665,7 @@ static void mmu2_not_responding() {
* Handle tool change
*/
void MMU2::tool_change(const uint8_t index) {
if (!enabled) return;
if (!_enabled) return;
set_runout_valid(false);
@ -693,7 +693,7 @@ static void mmu2_not_responding() {
* Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated.
*/
void MMU2::tool_change(const char *special) {
if (!enabled) return;
if (!_enabled) return;
set_runout_valid(false);
@ -744,7 +744,7 @@ static void mmu2_not_responding() {
* Set next command
*/
void MMU2::command(const uint8_t mmu_cmd) {
if (!enabled) return;
if (!_enabled) return;
cmd = mmu_cmd;
ready = false;
}
@ -833,7 +833,7 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) {
}
void MMU2::set_filament_type(const uint8_t index, const uint8_t filamentType) {
if (!enabled) return;
if (!_enabled) return;
cmd_arg = filamentType;
command(MMU_CMD_F0 + index);
@ -892,7 +892,7 @@ void MMU2::filament_runout() {
// Load filament into MMU2
void MMU2::load_filament(const uint8_t index) {
if (!enabled) return;
if (!_enabled) return;
command(MMU_CMD_L0 + index);
manage_response(false, false);
@ -904,7 +904,7 @@ void MMU2::load_filament(const uint8_t index) {
*/
bool MMU2::load_filament_to_nozzle(const uint8_t index) {
if (!enabled) return false;
if (!_enabled) return false;
if (thermalManager.tooColdToExtrude(active_extruder)) {
BUZZ(200, 404);
@ -940,7 +940,7 @@ void MMU2::load_to_nozzle() {
bool MMU2::eject_filament(const uint8_t index, const bool recover) {
if (!enabled) return false;
if (!_enabled) return false;
if (thermalManager.tooColdToExtrude(active_extruder)) {
BUZZ(200, 404);
@ -989,7 +989,7 @@ bool MMU2::eject_filament(const uint8_t index, const bool recover) {
*/
bool MMU2::unload() {
if (!enabled) return false;
if (!_enabled) return false;
if (thermalManager.tooColdToExtrude(active_extruder)) {
BUZZ(200, 404);

3
Marlin/src/feature/mmu/mmu2.h

@ -43,6 +43,7 @@ public:
static void init();
static void reset();
static inline bool enabled() { return _enabled; }
static void mmu_loop();
static void tool_change(const uint8_t index);
static void tool_change(const char *special);
@ -88,7 +89,7 @@ private:
static void mmu_continue_loading();
#endif
static bool enabled, ready, mmu_print_saved;
static bool _enabled, ready, mmu_print_saved;
static uint8_t cmd, cmd_arg, last_cmd, extruder;
static int8_t state;

28
Marlin/src/feature/power.cpp

@ -33,6 +33,10 @@
#include "../module/stepper/indirection.h"
#include "../MarlinCore.h"
#if ENABLED(PS_OFF_SOUND)
#include "../libs/buzzer.h"
#endif
#if defined(PSU_POWERUP_GCODE) || defined(PSU_POWEROFF_GCODE)
#include "../gcode/gcode.h"
#endif
@ -46,6 +50,9 @@ Power powerManager;
millis_t Power::lastPowerOn;
bool Power::is_power_needed() {
if (printJobOngoing() || printingIsPaused()) return true;
#if ENABLED(AUTO_POWER_FANS)
FANS_LOOP(i) if (thermalManager.fan_speed[i]) return true;
#endif
@ -106,9 +113,17 @@ bool Power::is_power_needed() {
#define POWER_TIMEOUT 0
#endif
void Power::check() {
void Power::check(const bool pause) {
static bool _pause = false;
static millis_t nextPowerCheck = 0;
millis_t now = millis();
const millis_t now = millis();
#if POWER_TIMEOUT > 0
if (pause != _pause) {
lastPowerOn = now + !now;
_pause = pause;
}
if (pause) return;
#endif
if (ELAPSED(now, nextPowerCheck)) {
nextPowerCheck = now + 2500UL;
if (is_power_needed())
@ -119,7 +134,8 @@ void Power::check() {
}
void Power::power_on() {
lastPowerOn = millis();
const millis_t now = millis();
lastPowerOn = now + !now;
if (!powersupply_on) {
PSU_PIN_ON();
safe_delay(PSU_POWERUP_DELAY);
@ -136,6 +152,11 @@ void Power::power_off() {
#ifdef PSU_POWEROFF_GCODE
GcodeSuite::process_subcommands_now_P(PSTR(PSU_POWEROFF_GCODE));
#endif
#if ENABLED(PS_OFF_SOUND)
BUZZ(1000, 659);
#endif
PSU_PIN_OFF();
}
}
@ -143,6 +164,7 @@ void Power::power_off() {
void Power::power_off_soon() {
#if POWER_OFF_DELAY
lastPowerOn = millis() - SEC_TO_MS(POWER_TIMEOUT) + SEC_TO_MS(POWER_OFF_DELAY);
//if (!lastPowerOn) ++lastPowerOn;
#else
power_off();
#endif

2
Marlin/src/feature/power.h

@ -29,7 +29,7 @@
class Power {
public:
static void check();
static void check(const bool pause);
static void power_on();
static void power_off();
static void power_off_soon();

12
Marlin/src/feature/powerloss.h

@ -64,13 +64,13 @@ typedef struct {
Repeat stored_repeat;
#endif
#if ENABLED(HAS_HOME_OFFSET)
#if HAS_HOME_OFFSET
xyz_pos_t home_offset;
#endif
#if ENABLED(HAS_POSITION_SHIFT)
#if HAS_POSITION_SHIFT
xyz_pos_t position_shift;
#endif
#if ENABLED(HAS_MULTI_EXTRUDER)
#if HAS_MULTI_EXTRUDER
uint8_t active_extruder;
#endif
@ -78,13 +78,13 @@ typedef struct {
float filament_size[EXTRUDERS];
#endif
#if ENABLED(HAS_HOTEND)
#if HAS_HOTEND
celsius_t target_temperature[HOTENDS];
#endif
#if ENABLED(HAS_HEATED_BED)
#if HAS_HEATED_BED
celsius_t target_temperature_bed;
#endif
#if ENABLED(HAS_FAN)
#if HAS_FAN
uint8_t fan_speed[FAN_COUNT];
#endif

7
Marlin/src/feature/tmc_util.h

@ -360,13 +360,6 @@ void test_tmc_connection(LOGICAL_AXIS_DECL(const bool, true));
#if ENABLED(IMPROVE_HOMING_RELIABILITY)
extern millis_t sg_guard_period;
constexpr uint16_t default_sg_guard_duration = 400;
struct motion_state_t {
xy_ulong_t acceleration;
#if ENABLED(HAS_CLASSIC_JERK)
xy_float_t jerk_state;
#endif
};
#endif
bool tmc_enable_stallguard(TMC2130Stepper &st);

3
Marlin/src/gcode/bedlevel/mbl/G29.cpp

@ -70,7 +70,8 @@ void GcodeSuite::G29() {
return;
}
int8_t ix, iy = 0;
int8_t ix, iy;
ix = iy = 0;
switch (state) {
case MeshReport:

18
Marlin/src/gcode/calibrate/G28.cpp

@ -167,12 +167,15 @@
motion_state_t begin_slow_homing() {
motion_state_t motion_state{0};
motion_state.acceleration.set(planner.settings.max_acceleration_mm_per_s2[X_AXIS],
planner.settings.max_acceleration_mm_per_s2[Y_AXIS]);
planner.settings.max_acceleration_mm_per_s2[Y_AXIS]
OPTARG(DELTA, planner.settings.max_acceleration_mm_per_s2[Z_AXIS])
);
planner.settings.max_acceleration_mm_per_s2[X_AXIS] = 100;
planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = 100;
TERN_(DELTA, planner.settings.max_acceleration_mm_per_s2[Z_AXIS] = 100);
#if HAS_CLASSIC_JERK
motion_state.jerk_state = planner.max_jerk;
planner.max_jerk.set(0, 0);
planner.max_jerk.set(0, 0 OPTARG(DELTA, 0));
#endif
planner.reset_acceleration_rates();
return motion_state;
@ -181,6 +184,7 @@
void end_slow_homing(const motion_state_t &motion_state) {
planner.settings.max_acceleration_mm_per_s2[X_AXIS] = motion_state.acceleration.x;
planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = motion_state.acceleration.y;
TERN_(DELTA, planner.settings.max_acceleration_mm_per_s2[Z_AXIS] = motion_state.acceleration.z);
TERN_(HAS_CLASSIC_JERK, planner.max_jerk = motion_state.jerk_state);
planner.reset_acceleration_rates();
}
@ -259,7 +263,7 @@ void GcodeSuite::G28() {
reset_stepper_timeout();
#define HAS_CURRENT_HOME(N) (defined(N##_CURRENT_HOME) && N##_CURRENT_HOME != N##_CURRENT)
#if HAS_CURRENT_HOME(X) || HAS_CURRENT_HOME(X2) || HAS_CURRENT_HOME(Y) || HAS_CURRENT_HOME(Y2)
#if HAS_CURRENT_HOME(X) || HAS_CURRENT_HOME(X2) || HAS_CURRENT_HOME(Y) || HAS_CURRENT_HOME(Y2) || (ENABLED(DELTA) && HAS_CURRENT_HOME(Z))
#define HAS_HOMING_CURRENT 1
#endif
@ -287,6 +291,11 @@ void GcodeSuite::G28() {
stepperY2.rms_current(Y2_CURRENT_HOME);
if (DEBUGGING(LEVELING)) debug_current(PSTR("Y2"), tmc_save_current_Y2, Y2_CURRENT_HOME);
#endif
#if HAS_CURRENT_HOME(Z) && ENABLED(DELTA)
const int16_t tmc_save_current_Z = stepperZ.getMilliamps();
stepperZ.rms_current(Z_CURRENT_HOME);
if (DEBUGGING(LEVELING)) debug_current(PSTR("Z"), tmc_save_current_Z, Z_CURRENT_HOME);
#endif
#endif
#if ENABLED(IMPROVE_HOMING_RELIABILITY)
@ -497,6 +506,9 @@ void GcodeSuite::G28() {
#if HAS_CURRENT_HOME(Y2)
stepperY2.rms_current(tmc_save_current_Y2);
#endif
#if HAS_CURRENT_HOME(Z) && ENABLED(DELTA)
stepperZ.rms_current(tmc_save_current_Z);
#endif
#if HAS_CURRENT_HOME(I)
stepperI.rms_current(tmc_save_current_I);
#endif

18
Marlin/src/gcode/calibrate/G33.cpp

@ -63,7 +63,7 @@ enum CalEnum : char { // the 7 main calibration points -
#define LOOP_CAL_RAD(VAR) LOOP_CAL_PT(VAR, __A, _7P_STEP)
#define LOOP_CAL_ACT(VAR, _4P, _OP) LOOP_CAL_PT(VAR, _OP ? _AB : __A, _4P ? _4P_STEP : _7P_STEP)
#if ENABLED(HAS_MULTI_HOTEND)
#if HAS_MULTI_HOTEND
const uint8_t old_tool_index = active_extruder;
#endif
@ -71,7 +71,9 @@ float lcd_probe_pt(const xy_pos_t &xy);
void ac_home() {
endstops.enable(true);
TERN_(SENSORLESS_HOMING, probe.set_homing_current(true));
home_delta();
TERN_(SENSORLESS_HOMING, probe.set_homing_current(false));
endstops.not_homing();
}
@ -384,6 +386,12 @@ static float auto_tune_a() {
* V3 Report settings and probe results
*
* E Engage the probe for each point
*
* With SENSORLESS_PROBING:
* Use these flags to calibrate stall sensitivity: (e.g., `G33 P1 Y Z` to calibrate X only.)
* X Don't activate stallguard on X.
* Y Don't activate stallguard on Y.
* Z Don't activate stallguard on Z.
*/
void GcodeSuite::G33() {
@ -417,6 +425,12 @@ void GcodeSuite::G33() {
const bool stow_after_each = parser.seen_test('E');
#if ENABLED(SENSORLESS_PROBING)
probe.test_sensitivity.x = !parser.seen_test('X');
TERN_(HAS_Y_AXIS, probe.test_sensitivity.y = !parser.seen_test('Y'));
TERN_(HAS_Z_AXIS, probe.test_sensitivity.z = !parser.seen_test('Z'));
#endif
const bool _0p_calibration = probe_points == 0,
_1p_calibration = probe_points == 1 || probe_points == -1,
_4p_calibration = probe_points == 2,
@ -587,7 +601,7 @@ void GcodeSuite::G33() {
// print report
if (verbose_level == 3)
if (verbose_level == 3 || verbose_level == 0)
print_calibration_results(z_at_pt, _tower_results, _opposite_results);
if (verbose_level != 0) { // !dry run

8
Marlin/src/gcode/calibrate/G34.cpp

@ -81,11 +81,11 @@ void GcodeSuite::G34() {
const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT);
const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS];
stepper.set_digipot_current(1, target_current);
#elif ENABLED(HAS_MOTOR_CURRENT_DAC)
#elif HAS_MOTOR_CURRENT_DAC
const float target_current = parser.floatval('S', GANTRY_CALIBRATION_CURRENT);
const float previous_current = dac_amps(Z_AXIS, target_current);
stepper_dac.set_current_value(Z_AXIS, target_current);
#elif ENABLED(HAS_MOTOR_CURRENT_I2C)
#elif HAS_MOTOR_CURRENT_I2C
const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT);
previous_current = dac_amps(Z_AXIS);
digipot_i2c.set_current(Z_AXIS, target_current)
@ -127,9 +127,9 @@ void GcodeSuite::G34() {
stepper.set_digipot_current(Z_AXIS, previous_current);
#elif HAS_MOTOR_CURRENT_PWM
stepper.set_digipot_current(1, previous_current);
#elif ENABLED(HAS_MOTOR_CURRENT_DAC)
#elif HAS_MOTOR_CURRENT_DAC
stepper_dac.set_current_value(Z_AXIS, previous_current);
#elif ENABLED(HAS_MOTOR_CURRENT_I2C)
#elif HAS_MOTOR_CURRENT_I2C
digipot_i2c.set_current(Z_AXIS, previous_current)
#elif HAS_TRINAMIC_CONFIG
#if AXIS_IS_TMC(Z)

12
Marlin/src/gcode/calibrate/G34_M422.cpp

@ -314,11 +314,13 @@ void GcodeSuite::G34() {
sprintf_P(msg,
PSTR("1:2=%s" TERN_(TRIPLE_Z, " 3-2=%s 3-1=%s") TERN_(QUAD_Z, " 4-3=%s 4-2=%s 4-1=%s")),
dtostrf(ABS(z_measured[1] - z_measured[0]), 1, 3, fstr1)
OPTARG(TRIPLE_Z, dtostrf(ABS(z_measured[2] - z_measured[1]), 1, 3, fstr2))
OPTARG(TRIPLE_Z, dtostrf(ABS(z_measured[2] - z_measured[0]), 1, 3, fstr3))
OPTARG(QUAD_Z, dtostrf(ABS(z_measured[3] - z_measured[2]), 1, 3, fstr4))
OPTARG(QUAD_Z, dtostrf(ABS(z_measured[3] - z_measured[1]), 1, 3, fstr5))
OPTARG(QUAD_Z, dtostrf(ABS(z_measured[3] - z_measured[0]), 1, 3, fstr6))
OPTARG(TRIPLE_Z,
dtostrf(ABS(z_measured[2] - z_measured[1]), 1, 3, fstr2),
dtostrf(ABS(z_measured[2] - z_measured[0]), 1, 3, fstr3))
OPTARG(QUAD_Z,
dtostrf(ABS(z_measured[3] - z_measured[2]), 1, 3, fstr4),
dtostrf(ABS(z_measured[3] - z_measured[1]), 1, 3, fstr5),
dtostrf(ABS(z_measured[3] - z_measured[0]), 1, 3, fstr6))
);
ui.set_status(msg);
#endif

74
Marlin/src/gcode/calibrate/M666.cpp

@ -27,30 +27,72 @@
#include "../gcode.h"
#if ENABLED(DELTA)
#include "../../module/delta.h"
#include "../../module/motion.h"
#else
#include "../../module/endstops.h"
#endif
#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)
#include "../../core/debug_out.h"
#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)
#include "../../core/debug_out.h"
void M666_report(const bool forReplay=true) {
if (!forReplay) { SERIAL_ECHOLNPGM("; Endstop adjustment:"); SERIAL_ECHO_START(); }
#if ENABLED(DELTA)
SERIAL_ECHOLNPAIR_P(
PSTR(" M666 X"), LINEAR_UNIT(delta_endstop_adj.a)
, SP_Y_STR, LINEAR_UNIT(delta_endstop_adj.b)
, SP_Z_STR, LINEAR_UNIT(delta_endstop_adj.c)
);
#else
SERIAL_ECHOPGM(" M666");
#if ENABLED(X_DUAL_ENDSTOPS)
SERIAL_ECHOLNPAIR_P(SP_X_STR, LINEAR_UNIT(endstops.x2_endstop_adj));
#endif
#if ENABLED(Y_DUAL_ENDSTOPS)
SERIAL_ECHOLNPAIR_P(SP_Y_STR, LINEAR_UNIT(endstops.y2_endstop_adj));
#endif
#if ENABLED(Z_MULTI_ENDSTOPS)
#if NUM_Z_STEPPER_DRIVERS >= 3
SERIAL_ECHOPAIR(" S2 Z", LINEAR_UNIT(endstops.z3_endstop_adj));
if (!forReplay) SERIAL_ECHO_START();
SERIAL_ECHOPAIR(" M666 S3 Z", LINEAR_UNIT(endstops.z3_endstop_adj));
#if NUM_Z_STEPPER_DRIVERS >= 4
if (!forReplay) SERIAL_ECHO_START();
SERIAL_ECHOPAIR(" M666 S4 Z", LINEAR_UNIT(endstops.z4_endstop_adj));
#endif
#else
SERIAL_ECHOLNPAIR_P(SP_Z_STR, LINEAR_UNIT(endstops.z2_endstop_adj));
#endif
#endif
#endif
}
#if ENABLED(DELTA)
/**
* M666: Set delta endstop adjustment
*/
void GcodeSuite::M666() {
DEBUG_SECTION(log_M666, "M666", DEBUGGING(LEVELING));
bool is_err = false, is_set = false;
LOOP_LINEAR_AXES(i) {
if (parser.seen(AXIS_CHAR(i))) {
is_set = true;
const float v = parser.value_linear_units();
if (v * Z_HOME_DIR <= 0) delta_endstop_adj[i] = v;
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("delta_endstop_adj[", AS_CHAR(AXIS_CHAR(i)), "] = ", delta_endstop_adj[i]);
if (v > 0)
is_err = true;
else {
delta_endstop_adj[i] = v;
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("delta_endstop_adj[", AS_CHAR(AXIS_CHAR(i)), "] = ", v);
}
}
}
if (is_err) SERIAL_ECHOLNPAIR("?M666 offsets must be <= 0");
if (!is_set) M666_report();
}
#elif HAS_EXTRA_ENDSTOPS
#include "../../module/endstops.h"
#else
/**
* M666: Set Dual Endstops offsets for X, Y, and/or Z.
@ -81,21 +123,7 @@
#endif
}
#endif
if (!parser.seen("XYZ")) {
auto echo_adj = [](PGM_P const label, const_float_t value) { SERIAL_ECHOPAIR_P(label, value); };
SERIAL_ECHOPGM("Dual Endstop Adjustment (mm): ");
#if ENABLED(X_DUAL_ENDSTOPS)
echo_adj(PSTR(" X2:"), endstops.x2_endstop_adj);
#endif
#if ENABLED(Y_DUAL_ENDSTOPS)
echo_adj(PSTR(" Y2:"), endstops.y2_endstop_adj);
#endif
#if ENABLED(Z_MULTI_ENDSTOPS)
#define _ECHO_ZADJ(N) echo_adj(PSTR(" Z" STRINGIFY(N) ":"), endstops.z##N##_endstop_adj);
REPEAT_S(2, INCREMENT(NUM_Z_STEPPER_DRIVERS), _ECHO_ZADJ)
#endif
SERIAL_EOL();
}
if (!parser.seen("XYZ")) M666_report();
}
#endif // HAS_EXTRA_ENDSTOPS

2
Marlin/src/gcode/calibrate/M852.cpp

@ -93,7 +93,7 @@ void GcodeSuite::M852() {
if (!ijk) {
SERIAL_ECHO_START();
SERIAL_ECHOPGM_P(GET_TEXT(MSG_SKEW_FACTOR));
SERIAL_ECHOPGM("Skew Factor");
SERIAL_ECHOPAIR_F(" XY: ", planner.skew_factor.xy, 6);
#if ENABLED(SKEW_CORRECTION_FOR_Z)
SERIAL_ECHOPAIR_F(" XZ: ", planner.skew_factor.xz, 6);

4
Marlin/src/gcode/feature/controllerfan/M710.cpp

@ -27,7 +27,7 @@
#include "../../gcode.h"
#include "../../../feature/controllerfan.h"
void M710_report(const bool forReplay) {
void M710_report(const bool forReplay=true) {
if (!forReplay) { SERIAL_ECHOLNPGM("; Controller Fan"); SERIAL_ECHO_START(); }
SERIAL_ECHOLNPAIR(" M710"
" S", int(controllerFan.settings.active_speed),
@ -75,7 +75,7 @@ void GcodeSuite::M710() {
if (seenD) controllerFan.settings.duration = parser.value_ushort();
if (!(seenR || seenS || seenI || seenA || seenD))
M710_report(false);
M710_report();
}
#endif // CONTROLLER_FAN_EDITABLE

6
Marlin/src/gcode/feature/digipot/M907-M910.cpp

@ -34,7 +34,7 @@
#include "../../../feature/digipot/digipot.h"
#endif
#if ENABLED(HAS_MOTOR_CURRENT_DAC)
#if HAS_MOTOR_CURRENT_DAC
#include "../../../feature/dac/stepper_dac.h"
#endif
@ -73,7 +73,7 @@ void GcodeSuite::M907() {
#endif
#endif
#if ENABLED(HAS_MOTOR_CURRENT_DAC)
#if HAS_MOTOR_CURRENT_DAC
if (parser.seenval('S')) {
const float dac_percent = parser.value_float();
LOOP_LE_N(i, 4) stepper_dac.set_current_percent(i, dac_percent);
@ -92,7 +92,7 @@ void GcodeSuite::M907() {
TERN_(HAS_MOTOR_CURRENT_DAC, stepper_dac.set_current_value(parser.byteval('P', -1), parser.ushortval('S', 0)));
}
#if ENABLED(HAS_MOTOR_CURRENT_DAC)
#if HAS_MOTOR_CURRENT_DAC
void GcodeSuite::M909() { stepper_dac.print_values(); }
void GcodeSuite::M910() { stepper_dac.commit_eeprom(); }

8
Marlin/src/gcode/feature/trinamic/M911-M914.cpp

@ -260,10 +260,10 @@
#endif
case Z_AXIS:
TERN_(Z_HAS_STEALTCHOP, if (index < 2) TMC_SET_PWMTHRS(Z,Z));
TERN_(Z2_HAS_STEALTCHOP, if (index == 0 || index == 2) TMC_SET_PWMTHRS(Z,Z2));
TERN_(Z3_HAS_STEALTCHOP, if (index == 0 || index == 3) TMC_SET_PWMTHRS(Z,Z3));
TERN_(Z4_HAS_STEALTCHOP, if (index == 0 || index == 4) TMC_SET_PWMTHRS(Z,Z4));
TERN_(Z_HAS_STEALTHCHOP, if (index < 2) TMC_SET_PWMTHRS(Z,Z));
TERN_(Z2_HAS_STEALTHCHOP, if (index == 0 || index == 2) TMC_SET_PWMTHRS(Z,Z2));
TERN_(Z3_HAS_STEALTHCHOP, if (index == 0 || index == 3) TMC_SET_PWMTHRS(Z,Z3));
TERN_(Z4_HAS_STEALTHCHOP, if (index == 0 || index == 4) TMC_SET_PWMTHRS(Z,Z4));
break;
#if E_STEPPERS
case E_AXIS: {

4
Marlin/src/gcode/gcode.cpp

@ -301,7 +301,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
#endif
#if ENABLED(FLOWMETER_SAFETY)
if (cooler.fault) {
if (cooler.flowfault) {
SERIAL_ECHO_MSG(STR_FLOWMETER_FAULT);
return;
}
@ -962,7 +962,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 907: M907(); break; // M907: Set digital trimpot motor current using axis codes.
#if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC)
case 908: M908(); break; // M908: Control digital trimpot directly.
#if ENABLED(HAS_MOTOR_CURRENT_DAC)
#if HAS_MOTOR_CURRENT_DAC
case 909: M909(); break; // M909: Print digipot/DAC current value
case 910: M910(); break; // M910: Commit digipot/DAC value to external EEPROM
#endif

43
Marlin/src/gcode/gcode.h

@ -424,6 +424,7 @@ public:
static uint8_t host_keepalive_interval;
static void host_keepalive();
static inline bool host_keepalive_is_paused() { return busy_state >= PAUSED_FOR_USER; }
#define KEEPALIVE_STATE(N) REMEMBER(_KA_, gcode.busy_state, gcode.N)
#else
@ -524,7 +525,7 @@ private:
static void G38(const int8_t subcode);
#endif
#if ENABLED(HAS_MESH)
#if HAS_MESH
static void G42();
#endif
@ -557,7 +558,7 @@ private:
static void G425();
#endif
#if ENABLED(HAS_RESUME_CONTINUE)
#if HAS_RESUME_CONTINUE
static void M0_M1();
#endif
@ -612,7 +613,7 @@ private:
static void M31();
#if ENABLED(SDSUPPORT)
#if ENABLED(HAS_MEDIA_SUBCALLS)
#if HAS_MEDIA_SUBCALLS
static void M32();
#endif
#if ENABLED(LONG_FILENAME_HOST_SUPPORT)
@ -743,7 +744,7 @@ private:
static void M149();
#endif
#if ENABLED(HAS_COLOR_LEDS)
#if HAS_COLOR_LEDS
static void M150();
#endif
@ -777,7 +778,7 @@ private:
static void M204();
static void M205();
#if ENABLED(HAS_M206_COMMAND)
#if HAS_M206_COMMAND
static void M206();
#endif
@ -791,11 +792,11 @@ private:
static void M211();
#if ENABLED(HAS_MULTI_EXTRUDER)
#if HAS_MULTI_EXTRUDER
static void M217();
#endif
#if ENABLED(HAS_HOTEND_OFFSET)
#if HAS_HOTEND_OFFSET
static void M218();
#endif
@ -813,7 +814,7 @@ private:
static void M240();
#endif
#if ENABLED(HAS_LCD_CONTRAST)
#if HAS_LCD_CONTRAST
static void M250();
#endif
@ -833,7 +834,7 @@ private:
static void M290();
#endif
#if ENABLED(HAS_BUZZER)
#if HAS_BUZZER
static void M300();
#endif
@ -845,7 +846,7 @@ private:
static void M302();
#endif
#if ENABLED(HAS_PID_HEATING)
#if HAS_PID_HEATING
static void M303();
#endif
@ -853,7 +854,7 @@ private:
static void M304();
#endif
#if ENABLED(HAS_USER_THERMISTORS)
#if HAS_USER_THERMISTORS
static void M305();
#endif
@ -894,7 +895,7 @@ private:
static void M402();
#endif
#if ENABLED(HAS_PRUSA_MMU2)
#if HAS_PRUSA_MMU2
static void M403();
#endif
@ -905,11 +906,11 @@ private:
static void M407();
#endif
#if ENABLED(HAS_FILAMENT_SENSOR)
#if HAS_FILAMENT_SENSOR
static void M412();
#endif
#if ENABLED(HAS_MULTI_LANGUAGE)
#if HAS_MULTI_LANGUAGE
static void M414();
#endif
@ -922,11 +923,11 @@ private:
static void M425();
#endif
#if ENABLED(HAS_M206_COMMAND)
#if HAS_M206_COMMAND
static void M428();
#endif
#if ENABLED(HAS_POWER_MONITOR)
#if HAS_POWER_MONITOR
static void M430();
#endif
@ -977,11 +978,11 @@ private:
static void M603();
#endif
#if ENABLED(HAS_DUPLICATION_MODE)
#if HAS_DUPLICATION_MODE
static void M605();
#endif
#if ENABLED(IS_KINEMATIC)
#if IS_KINEMATIC
static void M665();
#endif
@ -1006,7 +1007,7 @@ private:
static void M810_819();
#endif
#if ENABLED(HAS_BED_PROBE)
#if HAS_BED_PROBE
static void M851();
#endif
@ -1039,7 +1040,7 @@ private:
#if HAS_TRINAMIC_CONFIG
static void M122();
static void M906();
#if ENABLED(HAS_STEALTHCHOP)
#if HAS_STEALTHCHOP
static void M569();
#endif
#if ENABLED(MONITOR_DRIVER_STATUS)
@ -1066,7 +1067,7 @@ private:
static void M907();
#if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC)
static void M908();
#if ENABLED(HAS_MOTOR_CURRENT_DAC)
#if HAS_MOTOR_CURRENT_DAC
static void M909();
static void M910();
#endif

3
Marlin/src/gcode/host/M115.cpp

@ -54,6 +54,9 @@ void GcodeSuite::M115() {
"PROTOCOL_VERSION:" PROTOCOL_VERSION " "
"MACHINE_TYPE:" MACHINE_NAME " "
"EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " "
#if LINEAR_AXES != XYZ
"AXIS_COUNT:" STRINGIFY(LINEAR_AXES) " "
#endif
#ifdef MACHINE_UUID
"UUID:" MACHINE_UUID
#endif

15
Marlin/src/gcode/motion/G2_G3.cpp

@ -83,12 +83,13 @@ void plan_arc(
#endif
// Angle of rotation between position and target from the circle center.
float angular_travel;
float angular_travel, abs_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);
abs_angular_travel = RADIANS(360);
}
else {
// Calculate the angle
@ -103,8 +104,10 @@ void plan_arc(
case 2: angular_travel += RADIANS(360); break; // Negative but CCW? Reverse direction.
}
abs_angular_travel = ABS(angular_travel);
#ifdef MIN_ARC_SEGMENTS
min_segments = CEIL(min_segments * ABS(angular_travel) / RADIANS(360));
min_segments = CEIL(min_segments * abs_angular_travel / RADIANS(360));
NOLESS(min_segments, 1U);
#endif
}
@ -117,8 +120,8 @@ void plan_arc(
#endif
// If circling around...
if (ENABLED(ARC_P_CIRCLES) && circles) {
const float total_angular = angular_travel + circles * RADIANS(360), // Total rotation with all circles and remainder
if (TERN0(ARC_P_CIRCLES, circles)) {
const float total_angular = abs_angular_travel + circles * RADIANS(360), // Total rotation with all circles and remainder
part_per_circle = RADIANS(360) / total_angular; // Each circle's part of the total
#if HAS_Z_AXIS
@ -138,8 +141,8 @@ void plan_arc(
TERN_(HAS_EXTRUDERS, extruder_travel = cart.e - current_position.e);
}
const float flat_mm = radius * angular_travel,
mm_of_travel = TERN_(HAS_Z_AXIS, linear_travel ? HYPOT(flat_mm, linear_travel) :) ABS(flat_mm);
const float flat_mm = radius * abs_angular_travel,
mm_of_travel = TERN_(HAS_Z_AXIS, linear_travel ? HYPOT(flat_mm, linear_travel) :) flat_mm;
if (mm_of_travel < 0.001f) return;
const feedRate_t scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s);

2
Marlin/src/gcode/queue.h

@ -62,7 +62,7 @@ public:
struct CommandLine {
char buffer[MAX_CMD_SIZE]; //!< The command buffer
bool skip_ok; //!< Skip sending ok when command is processed?
#if ENABLED(HAS_MULTI_SERIAL)
#if HAS_MULTI_SERIAL
serial_index_t port; //!< Serial port the command was received on
#endif
};

2
Marlin/src/gcode/sd/M20.cpp

@ -33,7 +33,7 @@
void GcodeSuite::M20() {
if (card.flag.mounted) {
SERIAL_ECHOLNPGM(STR_BEGIN_FILE_LIST);
card.ls();
card.ls(TERN_(LONG_FILENAME_HOST_SUPPORT, parser.boolval('L')));
SERIAL_ECHOLNPGM(STR_END_FILE_LIST);
}
else

11
Marlin/src/inc/Conditionals_LCD.h

@ -31,6 +31,11 @@
#define MKS_MINI_12864
#endif
// MKS_MINI_12864_V3 is simply identical to FYSETC_MINI_12864_2_1
#if ENABLED(MKS_MINI_12864_V3)
#define FYSETC_MINI_12864_2_1
#endif
/**
* General Flags that may be set below by specific LCDs
*
@ -1078,7 +1083,11 @@
#if ENABLED(DWIN_CREALITY_LCD)
#define SERIAL_CATCHALL 0
#ifndef LCD_SERIAL_PORT
#define LCD_SERIAL_PORT 3 // Creality 4.x board
#if MB(BTT_SKR_MINI_E3_V1_0, BTT_SKR_MINI_E3_V1_2, BTT_SKR_MINI_E3_V2_0, BTT_SKR_E3_TURBO)
#define LCD_SERIAL_PORT 1
#else
#define LCD_SERIAL_PORT 3 // Creality 4.x board
#endif
#endif
#endif

465
Marlin/src/inc/Conditionals_post.h

@ -369,6 +369,10 @@
#elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY)
#define _LCD_CONTRAST_MIN 120
#define _LCD_CONTRAST_INIT 195
#elif ENABLED(MKS_MINI_12864_V3)
#define _LCD_CONTRAST_MIN 255
#define _LCD_CONTRAST_INIT 255
#define _LCD_CONTRAST_MAX 255
#elif ENABLED(FYSETC_MINI_12864)
#define _LCD_CONTRAST_INIT 220
#elif ENABLED(ULTI_CONTROLLER)
@ -615,20 +619,21 @@
#if TEMP_SENSOR_0 == -5 || TEMP_SENSOR_0 == -3 || TEMP_SENSOR_0 == -2
#define TEMP_SENSOR_0_IS_MAX_TC 1
#define HAS_MAX_TC 1
#if TEMP_SENSOR_0 == -3
#define TEMP_SENSOR_0_MAX_TC_TMIN -270
#define TEMP_SENSOR_0_MAX_TC_TMAX 1800
#else
#define TEMP_SENSOR_0_MAX_TC_TMIN 0
#define TEMP_SENSOR_0_MAX_TC_TMAX 1024
#endif
#if TEMP_SENSOR_0 == -5
#define TEMP_SENSOR_0_IS_MAX31865 1
#define TEMP_SENSOR_0_MAX_TC_TMIN 0
#define TEMP_SENSOR_0_MAX_TC_TMAX 1024
#ifndef MAX31865_SENSOR_WIRES_0
#define MAX31865_SENSOR_WIRES_0 2
#endif
#elif TEMP_SENSOR_0 == -3
#define TEMP_SENSOR_0_IS_MAX31855 1
#define TEMP_SENSOR_0_MAX_TC_TMIN -270
#define TEMP_SENSOR_0_MAX_TC_TMAX 1800
#elif TEMP_SENSOR_0 == -2
#define TEMP_SENSOR_0_IS_MAX6675 1
#define TEMP_SENSOR_0_MAX_TC_TMIN 0
#define TEMP_SENSOR_0_MAX_TC_TMAX 1024
#endif
#elif TEMP_SENSOR_0 == -4
#define TEMP_SENSOR_0_IS_AD8495 1
@ -648,21 +653,23 @@
#if TEMP_SENSOR_1 == -5 || TEMP_SENSOR_1 == -3 || TEMP_SENSOR_1 == -2
#define TEMP_SENSOR_1_IS_MAX_TC 1
#define HAS_MAX_TC 1
#if TEMP_SENSOR_1 == -3
#define TEMP_SENSOR_1_MAX_TC_TMIN -270
#define TEMP_SENSOR_1_MAX_TC_TMAX 1800
#else
#define TEMP_SENSOR_1_MAX_TC_TMIN 0
#define TEMP_SENSOR_1_MAX_TC_TMAX 1024
#endif
#if TEMP_SENSOR_1 == -5
#define TEMP_SENSOR_1_IS_MAX31865 1
#define TEMP_SENSOR_1_MAX_TC_TMIN 0
#define TEMP_SENSOR_1_MAX_TC_TMAX 1024
#ifndef MAX31865_SENSOR_WIRES_1
#define MAX31865_SENSOR_WIRES_1 2
#endif
#elif TEMP_SENSOR_1 == -3
#define TEMP_SENSOR_1_IS_MAX31855 1
#define TEMP_SENSOR_1_MAX_TC_TMIN -270
#define TEMP_SENSOR_1_MAX_TC_TMAX 1800
#elif TEMP_SENSOR_1 == -2
#define TEMP_SENSOR_1_IS_MAX6675 1
#define TEMP_SENSOR_1_MAX_TC_TMIN 0
#define TEMP_SENSOR_1_MAX_TC_TMAX 1024
#endif
#if TEMP_SENSOR_1 != TEMP_SENSOR_0
#if TEMP_SENSOR_1 == -5
#error "If MAX31865 Thermocouple (-5) is used for TEMP_SENSOR_1 then TEMP_SENSOR_0 must match."
@ -690,37 +697,48 @@
#if TEMP_SENSOR_REDUNDANT == -5 || TEMP_SENSOR_REDUNDANT == -3 || TEMP_SENSOR_REDUNDANT == -2
#define TEMP_SENSOR_REDUNDANT_IS_MAX_TC 1
#define HAS_MAX_TC 1
#if TEMP_SENSOR_REDUNDANT == -3
#define TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN -270
#define TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX 1800
#else
#define TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN 0
#define TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX 1024
#endif
#if TEMP_SENSOR_REDUNDANT_SOURCE == 0
#define TEMP_SENSOR_0_MAX_TC_TMIN TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN
#define TEMP_SENSOR_0_MAX_TC_TMAX TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 1
#define TEMP_SENSOR_1_MAX_TC_TMIN TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN
#define TEMP_SENSOR_1_MAX_TC_TMAX TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX
#endif
#if TEMP_SENSOR_REDUNDANT == -5
#if TEMP_SENSOR_REDUNDANT_SOURCE != 0 && TEMP_SENSOR_REDUNDANT_SOURCE != 1
#error "MAX31865 Thermocouples (-5) not supported for TEMP_SENSOR_REDUNDANT_SOURCE other than TEMP_SENSOR_0/TEMP_SENSOR_1 (0/1)."
#endif
#define TEMP_SENSOR_REDUNDANT_IS_MAX31865 1
#define TEMP_SENSOR_REDUNDANT_IS_MAX31865 1
#define TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN 0
#define TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX 1024
#elif TEMP_SENSOR_REDUNDANT == -3
#if TEMP_SENSOR_REDUNDANT_SOURCE != 0 && TEMP_SENSOR_REDUNDANT_SOURCE != 1
#error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_REDUNDANT_SOURCE other than TEMP_SENSOR_0/TEMP_SENSOR_1 (0/1)."
#endif
#define TEMP_SENSOR_REDUNDANT_IS_MAX31855 1
#define TEMP_SENSOR_REDUNDANT_IS_MAX31855 1
#define TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN -270
#define TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX 1800
#elif TEMP_SENSOR_REDUNDANT == -2
#if TEMP_SENSOR_REDUNDANT_SOURCE != 0 && TEMP_SENSOR_REDUNDANT_SOURCE != 1
#error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_REDUNDANT_SOURCE other than TEMP_SENSOR_0/TEMP_SENSOR_1 (0/1)."
#endif
#define TEMP_SENSOR_REDUNDANT_IS_MAX6675 1
#define TEMP_SENSOR_REDUNDANT_IS_MAX6675 1
#define TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN 0
#define TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX 1024
#endif
// mimic setting up the source TEMP_SENSOR
#if TEMP_SENSOR_REDUNDANT_SOURCE == 0
#define TEMP_SENSOR_0_MAX_TC_TMIN TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN
#define TEMP_SENSOR_0_MAX_TC_TMAX TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX
#ifndef MAX31865_SENSOR_WIRES_0
#define MAX31865_SENSOR_WIRES_0 2
#endif
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 1
#define TEMP_SENSOR_1_MAX_TC_TMIN TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN
#define TEMP_SENSOR_1_MAX_TC_TMAX TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX
#ifndef MAX31865_SENSOR_WIRES_1
#define MAX31865_SENSOR_WIRES_1 2
#endif
#endif
#if (TEMP_SENSOR_0_IS_MAX_TC && TEMP_SENSOR_REDUNDANT != TEMP_SENSOR_0) || (TEMP_SENSOR_1_IS_MAX_TC && TEMP_SENSOR_REDUNDANT != TEMP_SENSOR_1)
#if TEMP_SENSOR_REDUNDANT == -5
#error "If MAX31865 Thermocouple (-5) is used for TEMP_SENSOR_0/TEMP_SENSOR_1 then TEMP_SENSOR_REDUNDANT must match."
@ -743,101 +761,182 @@
#endif
#endif
#if TEMP_SENSOR_0_IS_MAX_TC || TEMP_SENSOR_1_IS_MAX_TC || TEMP_SENSOR_REDUNDANT_IS_MAX_TC
#define HAS_MAX_TC 1
#endif
#if TEMP_SENSOR_0_IS_MAX6675 || TEMP_SENSOR_1_IS_MAX6675 || TEMP_SENSOR_REDUNDANT_IS_MAX6675
#define HAS_MAX6675 1
#endif
#if TEMP_SENSOR_0_IS_MAX31855 || TEMP_SENSOR_1_IS_MAX31855 || TEMP_SENSOR_REDUNDANT_IS_MAX31855
#define HAS_MAX31855 1
#endif
#if TEMP_SENSOR_0_IS_MAX31865 || TEMP_SENSOR_1_IS_MAX31865 || TEMP_SENSOR_REDUNDANT_IS_MAX31865
#define HAS_MAX31865 1
#endif
#if TEMP_SENSOR_0_IS_MAX6675 || TEMP_SENSOR_1_IS_MAX6675 || TEMP_SENSOR_REDUNDANT_IS_MAX6675
#define HAS_MAX6675 1
#endif
//
// Compatibility layer for MAX (SPI) temp boards
//
#define TEMP_SENSOR_IS_MAX(n, M) (ENABLED(TEMP_SENSOR_##n##_IS_##M) || (ENABLED(TEMP_SENSOR_REDUNDANT_IS_##M) && TEMP_SENSOR_REDUNDANT_SOURCE == (n)))
#if HAS_MAX_TC
// Translate old _SS, _CS, _SCK, _DO, _DI, _MISO, and _MOSI PIN defines.
#if TEMP_SENSOR_0_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 1)
#if !PIN_EXISTS(TEMP_0_CS) // SS, CS
#if PIN_EXISTS(MAX6675_SS)
#define TEMP_0_CS_PIN MAX6675_SS_PIN
#elif PIN_EXISTS(MAX6675_CS)
#define TEMP_0_CS_PIN MAX6675_CS_PIN
#elif PIN_EXISTS(MAX31855_SS)
#define TEMP_0_CS_PIN MAX31855_SS_PIN
#elif PIN_EXISTS(MAX31855_CS)
#define TEMP_0_CS_PIN MAX31855_CS_PIN
#elif PIN_EXISTS(MAX31865_SS)
#define TEMP_0_CS_PIN MAX31865_SS_PIN
#elif PIN_EXISTS(MAX31865_CS)
#define TEMP_0_CS_PIN MAX31865_CS_PIN
#endif
#endif
#if PIN_EXISTS(MAX6675_SS)
#if TEMP_SENSOR_IS_MAX(0, MAX31855)
#define MAX31855_CS_PIN MAX6675_SS_PIN
#elif TEMP_SENSOR_IS_MAX(0, MAX31865)
#define MAX31865_CS_PIN MAX6675_SS_PIN
#elif TEMP_SENSOR_IS_MAX(0, MAX6675)
#define MAX6675_CS_PIN MAX6675_SS_PIN
#endif
#endif
#if TEMP_SENSOR_0_IS_MAX6675
#if !PIN_EXISTS(TEMP_0_MISO) // DO
#if PIN_EXISTS(MAX6675_MISO)
#define TEMP_0_MISO_PIN MAX6675_MISO_PIN
#elif PIN_EXISTS(MAX6675_DO)
#define TEMP_0_MISO_PIN MAX6675_DO_PIN
#endif
#endif
#if !PIN_EXISTS(TEMP_0_SCK) && PIN_EXISTS(MAX6675_SCK)
#define TEMP_0_SCK_PIN MAX6675_SCK_PIN
#endif
#if PIN_EXISTS(MAX6675_SS2)
#if TEMP_SENSOR_IS_MAX(1, MAX31855)
#define MAX31855_CS2_PIN MAX6675_SS2_PIN
#elif TEMP_SENSOR_IS_MAX(1, MAX31865)
#define MAX31865_CS2_PIN MAX6675_SS2_PIN
#elif TEMP_SENSOR_IS_MAX(1, MAX6675)
#define MAX6675_CS2_PIN MAX6675_SS2_PIN
#endif
#endif
#elif TEMP_SENSOR_0_IS_MAX31855
#if !PIN_EXISTS(TEMP_0_MISO) // DO
#if PIN_EXISTS(MAX31855_MISO)
#define TEMP_0_MISO_PIN MAX31855_MISO_PIN
#elif PIN_EXISTS(MAX31855_DO)
#define TEMP_0_MISO_PIN MAX31855_DO_PIN
#endif
#endif
#if !PIN_EXISTS(TEMP_0_SCK) && PIN_EXISTS(MAX31855_SCK)
#define TEMP_0_SCK_PIN MAX31855_SCK_PIN
#endif
#if PIN_EXISTS(MAX6675_DO)
#if HAS_MAX31855
#define MAX31855_MISO_PIN MAX6675_DO_PIN
#elif HAS_MAX31865
#define MAX31865_MISO_PIN MAX6675_DO_PIN
#elif HAS_MAX6675
#define MAX6675_MISO_PIN MAX6675_DO_PIN
#endif
#endif
#elif TEMP_SENSOR_1_IS_MAX31865
#if !PIN_EXISTS(TEMP_1_MISO) // DO
#if PIN_EXISTS(MAX31865_MISO)
#define TEMP_1_MISO_PIN MAX31865_MISO_PIN
#elif PIN_EXISTS(MAX31865_DO)
#define TEMP_1_MISO_PIN MAX31865_DO_PIN
#endif
#endif
#if !PIN_EXISTS(TEMP_1_SCK) && PIN_EXISTS(MAX31865_SCK)
#define TEMP_1_SCK_PIN MAX31865_SCK_PIN
#endif
#if !PIN_EXISTS(TEMP_1_MOSI) && PIN_EXISTS(MAX31865_MOSI) // MOSI for '65 only
#define TEMP_1_MOSI_PIN MAX31865_MOSI_PIN
#endif
#endif
#if PIN_EXISTS(MAX6675_SCK)
#if HAS_MAX31855
#define MAX31855_SCK_PIN MAX6675_SCK_PIN
#elif HAS_MAX31865
#define MAX31865_SCK_PIN MAX6675_SCK_PIN
#endif
#endif
// Software SPI - enable if MISO/SCK are defined.
#if PIN_EXISTS(TEMP_0_MISO) && PIN_EXISTS(TEMP_0_SCK) && DISABLED(TEMP_SENSOR_0_FORCE_HW_SPI)
#if TEMP_SENSOR_0_IS_MAX31865 && !PIN_EXISTS(TEMP_0_MOSI)
#error "TEMP_SENSOR_0 MAX31865 requires TEMP_0_MOSI_PIN defined for Software SPI. To use Hardware SPI instead, undefine MISO/SCK or enable TEMP_SENSOR_0_FORCE_HW_SPI."
#else
#define TEMP_SENSOR_0_HAS_SPI_PINS 1
#endif
#endif
// Compatibility Layer for use when HAL manipulates PINS for MAX31855 and MAX6675
#if PIN_EXISTS(MAX31855_CS) && !PIN_EXISTS(MAX6675_SS)
#define MAX6675_SS_PIN MAX31855_CS_PIN
#endif
#if PIN_EXISTS(MAX31855_CS2) && !PIN_EXISTS(MAX6675_SS2)
#define MAX6675_SS2_PIN MAX31855_CS2_PIN
#endif
#if PIN_EXISTS(MAX6675_CS) && !PIN_EXISTS(MAX6675_SS)
#define MAX6675_SS_PIN MAX6675_CS_PIN
#endif
#if PIN_EXISTS(MAX6675_CS2) && !PIN_EXISTS(MAX6675_SS2)
#define MAX6675_SS2_PIN MAX6675_CS2_PIN
#endif
#if PIN_EXISTS(MAX31855_MISO) && !PIN_EXISTS(MAX6675_DO)
#define MAX6675_DO_PIN MAX31855_MISO_PIN
#endif
#if PIN_EXISTS(MAX6675_MISO) && !PIN_EXISTS(MAX6675_DO)
#define MAX6675_DO_PIN MAX6675_MISO_PIN
#endif
#if PIN_EXISTS(MAX31855_SCK) && !PIN_EXISTS(MAX6675_SCK)
#define MAX6675_SCK_PIN MAX31855_SCK_PIN
#endif
#endif // TEMP_SENSOR_0_IS_MAX_TC
#if TEMP_SENSOR_1_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 1)
#if !PIN_EXISTS(TEMP_1_CS) // SS2, CS2
#if PIN_EXISTS(MAX6675_SS2)
#define TEMP_1_CS_PIN MAX6675_SS2_PIN
#elif PIN_EXISTS(MAX6675_CS)
#define TEMP_1_CS_PIN MAX6675_CS2_PIN
#elif PIN_EXISTS(MAX31855_SS2)
#define TEMP_1_CS_PIN MAX31855_SS2_PIN
#elif PIN_EXISTS(MAX31855_CS2)
#define TEMP_1_CS_PIN MAX31855_CS2_PIN
#elif PIN_EXISTS(MAX31865_SS2)
#define TEMP_1_CS_PIN MAX31865_SS2_PIN
#elif PIN_EXISTS(MAX31865_CS2)
#define TEMP_1_CS_PIN MAX31865_CS2_PIN
#endif
#endif
//
// User-defined thermocouple libraries
//
// Add LIB_MAX6675 / LIB_MAX31855 / LIB_MAX31865 to the build_flags
// to select a USER library for MAX6675, MAX31855, MAX31865
//
#if BOTH(HAS_MAX6675, LIB_MAX6675)
#define LIB_USR_MAX6675 1
#endif
#if BOTH(HAS_MAX31855, LIB_MAX31855)
#define LIB_USR_MAX31855 1
#endif
#if HAS_MAX31865
#if ENABLED(LIB_MAX31865)
#if TEMP_SENSOR_1_IS_MAX6675
#if !PIN_EXISTS(TEMP_1_MISO) // DO
#if PIN_EXISTS(MAX6675_MISO)
#define TEMP_1_MISO_PIN MAX6675_MISO_PIN
#elif PIN_EXISTS(MAX6675_DO)
#define TEMP_1_MISO_PIN MAX6675_DO_PIN
#endif
#endif
#if !PIN_EXISTS(TEMP_1_SCK) && PIN_EXISTS(MAX6675_SCK)
#define TEMP_1_SCK_PIN MAX6675_SCK_PIN
#endif
#elif TEMP_SENSOR_1_IS_MAX31855
#if !PIN_EXISTS(TEMP_1_MISO) // DO
#if PIN_EXISTS(MAX31855_MISO)
#define TEMP_1_MISO_PIN MAX31855_MISO_PIN
#elif PIN_EXISTS(MAX31855_DO)
#define TEMP_1_MISO_PIN MAX31855_DO_PIN
#endif
#endif
#if !PIN_EXISTS(TEMP_1_SCK) && PIN_EXISTS(MAX31855_SCK)
#define TEMP_1_SCK_PIN MAX31855_SCK_PIN
#endif
#elif TEMP_SENSOR_1_IS_MAX31865
#if !PIN_EXISTS(TEMP_1_MISO) // DO
#if PIN_EXISTS(MAX31865_MISO)
#define TEMP_1_MISO_PIN MAX31865_MISO_PIN
#elif PIN_EXISTS(MAX31865_DO)
#define TEMP_1_MISO_PIN MAX31865_DO_PIN
#endif
#endif
#if !PIN_EXISTS(TEMP_1_SCK) && PIN_EXISTS(MAX31865_SCK)
#define TEMP_1_SCK_PIN MAX31865_SCK_PIN
#endif
#if !PIN_EXISTS(TEMP_1_MOSI) && PIN_EXISTS(MAX31865_MOSI) // MOSI for '65 only
#define TEMP_1_MOSI_PIN MAX31865_MOSI_PIN
#endif
#endif
// Software SPI - enable if MISO/SCK are defined.
#if PIN_EXISTS(TEMP_1_MISO) && PIN_EXISTS(TEMP_1_SCK) && DISABLED(TEMP_SENSOR_1_FORCE_HW_SPI)
#if TEMP_SENSOR_1_IS_MAX31865 && !PIN_EXISTS(TEMP_1_MOSI)
#error "TEMP_SENSOR_1 MAX31865 requires TEMP_1_MOSI_PIN defined for Software SPI. To use Hardware SPI instead, undefine MISO/SCK or enable TEMP_SENSOR_1_FORCE_HW_SPI."
#else
#define TEMP_SENSOR_1_HAS_SPI_PINS 1
#endif
#endif
#endif // TEMP_SENSOR_1_IS_MAX_TC
//
// User-defined thermocouple libraries
//
// Add LIB_MAX6675 / LIB_MAX31855 / LIB_MAX31865 to the build_flags
// to select a USER library for MAX6675, MAX31855, MAX31865
//
#if BOTH(HAS_MAX6675, LIB_MAX6675)
#define LIB_USR_MAX6675 1
#endif
#if BOTH(HAS_MAX31855, LIB_MAX31855)
#define LIB_USR_MAX31855 1
#endif
#if BOTH(HAS_MAX31865, LIB_MAX31865)
#define LIB_USR_MAX31865 1
#else
#define LIB_ADAFRUIT_MAX31865 1
#elif HAS_MAX31865
#define LIB_INTERNAL_MAX31865 1
#endif
#endif
#endif //HAS_MAX_TC
#if TEMP_SENSOR_2 == -4
#define TEMP_SENSOR_2_IS_AD8495 1
@ -2722,6 +2821,77 @@
#define BED_OR_CHAMBER_OR_FAN 1
#endif
/**
* Up to 3 PWM fans
*/
#ifndef FAN_INVERTING
#define FAN_INVERTING false
#endif
#if HAS_FAN7
#define FAN_COUNT 8
#elif HAS_FAN6
#define FAN_COUNT 7
#elif HAS_FAN5
#define FAN_COUNT 6
#elif HAS_FAN4
#define FAN_COUNT 5
#elif HAS_FAN3
#define FAN_COUNT 4
#elif HAS_FAN2
#define FAN_COUNT 3
#elif HAS_FAN1
#define FAN_COUNT 2
#elif HAS_FAN0
#define FAN_COUNT 1
#else
#define FAN_COUNT 0
#endif
#if FAN_COUNT > 0
#define HAS_FAN 1
#endif
/**
* Part Cooling fan multipliexer
*/
#if PIN_EXISTS(FANMUX0)
#define HAS_FANMUX 1
#endif
/**
* MIN/MAX fan PWM scaling
*/
#ifndef FAN_OFF_PWM
#define FAN_OFF_PWM 0
#endif
#ifndef FAN_MIN_PWM
#if FAN_OFF_PWM > 0
#define FAN_MIN_PWM (FAN_OFF_PWM + 1)
#else
#define FAN_MIN_PWM 0
#endif
#endif
#ifndef FAN_MAX_PWM
#define FAN_MAX_PWM 255
#endif
#if FAN_MIN_PWM < 0 || FAN_MIN_PWM > 255
#error "FAN_MIN_PWM must be a value from 0 to 255."
#elif FAN_MAX_PWM < 0 || FAN_MAX_PWM > 255
#error "FAN_MAX_PWM must be a value from 0 to 255."
#elif FAN_MIN_PWM > FAN_MAX_PWM
#error "FAN_MIN_PWM must be less than or equal to FAN_MAX_PWM."
#elif FAN_OFF_PWM > FAN_MIN_PWM
#error "FAN_OFF_PWM must be less than or equal to FAN_MIN_PWM."
#endif
/**
* FAST PWM FAN Settings
*/
#if ENABLED(FAST_PWM_FAN) && !defined(FAST_PWM_FAN_FREQUENCY)
#define FAST_PWM_FAN_FREQUENCY ((F_CPU) / (2 * 255 * 1)) // Fan frequency default
#endif
// Servos
#if PIN_EXISTS(SERVO0) && NUM_SERVOS > 0
#define HAS_SERVO_0 1
@ -2996,77 +3166,6 @@
#undef PREHEAT_SHORTCUT_MENU_ITEM
#endif
/**
* Up to 3 PWM fans
*/
#ifndef FAN_INVERTING
#define FAN_INVERTING false
#endif
#if HAS_FAN7
#define FAN_COUNT 8
#elif HAS_FAN6
#define FAN_COUNT 7
#elif HAS_FAN5
#define FAN_COUNT 6
#elif HAS_FAN4
#define FAN_COUNT 5
#elif HAS_FAN3
#define FAN_COUNT 4
#elif HAS_FAN2
#define FAN_COUNT 3
#elif HAS_FAN1
#define FAN_COUNT 2
#elif HAS_FAN0
#define FAN_COUNT 1
#else
#define FAN_COUNT 0
#endif
#if FAN_COUNT > 0
#define HAS_FAN 1
#endif
/**
* Part Cooling fan multipliexer
*/
#if PIN_EXISTS(FANMUX0)
#define HAS_FANMUX 1
#endif
/**
* MIN/MAX fan PWM scaling
*/
#ifndef FAN_OFF_PWM
#define FAN_OFF_PWM 0
#endif
#ifndef FAN_MIN_PWM
#if FAN_OFF_PWM > 0
#define FAN_MIN_PWM (FAN_OFF_PWM + 1)
#else
#define FAN_MIN_PWM 0
#endif
#endif
#ifndef FAN_MAX_PWM
#define FAN_MAX_PWM 255
#endif
#if FAN_MIN_PWM < 0 || FAN_MIN_PWM > 255
#error "FAN_MIN_PWM must be a value from 0 to 255."
#elif FAN_MAX_PWM < 0 || FAN_MAX_PWM > 255
#error "FAN_MAX_PWM must be a value from 0 to 255."
#elif FAN_MIN_PWM > FAN_MAX_PWM
#error "FAN_MIN_PWM must be less than or equal to FAN_MAX_PWM."
#elif FAN_OFF_PWM > FAN_MIN_PWM
#error "FAN_OFF_PWM must be less than or equal to FAN_MIN_PWM."
#endif
/**
* FAST PWM FAN Settings
*/
#if ENABLED(FAST_PWM_FAN) && !defined(FAST_PWM_FAN_FREQUENCY)
#define FAST_PWM_FAN_FREQUENCY ((F_CPU) / (2 * 255 * 1)) // Fan frequency default
#endif
/**
* MIN/MAX case light PWM scaling
*/
@ -3167,7 +3266,7 @@
* Advanced Pause - Filament Change
*/
#if ENABLED(ADVANCED_PAUSE_FEATURE)
#if HAS_LCD_MENU || BOTH(EMERGENCY_PARSER, HOST_PROMPT_SUPPORT)
#if EITHER(HAS_LCD_MENU, EXTENSIBLE_UI) || BOTH(EMERGENCY_PARSER, HOST_PROMPT_SUPPORT)
#define M600_PURGE_MORE_RESUMABLE 1
#endif
#ifndef FILAMENT_CHANGE_SLOW_LOAD_LENGTH

138
Marlin/src/inc/SanityCheck.h

@ -416,8 +416,19 @@
#error "MBL_Z_STEP is now MESH_EDIT_Z_STEP."
#elif defined(CHDK)
#error "CHDK is now CHDK_PIN."
#elif defined(MAX6675_SS) || defined(MAX6675_SS2)
#error "MAX6675_SS / MAX6675_SS2 is now MAX6675_SS_PIN / MAX6675_SS2_PIN."
#elif ANY_PIN( \
MAX6675_SS, MAX6675_SS2, MAX6675_CS, MAX6675_CS2, \
MAX31855_SS, MAX31855_SS2, MAX31855_CS, MAX31855_CS2, \
MAX31865_SS, MAX31865_SS2, MAX31865_CS, MAX31865_CS2)
#warning "MAX*_SS_PIN, MAX*_SS2_PIN, MAX*_CS_PIN, and MAX*_CS2_PIN are deprecated and will be removed in a future version. Please use TEMP_0_CS_PIN/TEMP_1_CS_PIN instead."
#elif ANY_PIN(MAX6675_SCK, MAX31855_SCK, MAX31865_SCK)
#warning "MAX*_SCK_PIN is deprecated and will be removed in a future version. Please use TEMP_0_SCK_PIN/TEMP_1_SCK_PIN instead."
#elif ANY_PIN(MAX6675_MISO, MAX6675_DO, MAX31855_MISO, MAX31855_DO, MAX31865_MISO, MAX31865_DO)
#warning "MAX*_MISO_PIN and MAX*_DO_PIN are deprecated and will be removed in a future version. Please use TEMP_0_MISO_PIN/TEMP_1_MISO_PIN instead."
#elif PIN_EXISTS(MAX31865_MOSI)
#warning "MAX31865_MOSI_PIN is deprecated and will be removed in a future version. Please use TEMP_0_MOSI_PIN/TEMP_1_MOSI_PIN instead."
#elif ANY_PIN(THERMO_CS1_PIN, THERMO_CS2_PIN, THERMO_DO_PIN, THERMO_SCK_PIN)
#error "THERMO_*_PIN is now TEMP_n_CS_PIN, TEMP_n_SCK_PIN, TEMP_n_MOSI_PIN, TEMP_n_MISO_PIN."
#elif defined(MAX31865_SENSOR_OHMS)
#error "MAX31865_SENSOR_OHMS is now MAX31865_SENSOR_OHMS_0."
#elif defined(MAX31865_CALIBRATION_OHMS)
@ -608,7 +619,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L
static_assert(_test_btc_sample_start != 12.3f, "BTC_SAMPLE_START must be a whole number.");
#endif
#ifdef BTC_SAMPLE_RES
constexpr _btc_sample_res = BTC_SAMPLE_RES;
constexpr auto _btc_sample_res = BTC_SAMPLE_RES;
constexpr decltype(_btc_sample_res) _test_btc_sample_res = 12.3f;
static_assert(_test_btc_sample_res != 12.3f, "BTC_SAMPLE_RES must be a whole number.");
#endif
@ -1953,14 +1964,21 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#endif
/**
* Pins and Sensor IDs must be set for each heater
* Required MAX31865 settings
*/
#if TEMP_SENSOR_0_IS_MAX6675 && !ANY_PIN(MAX6675_SS, MAX31855_CS, MAX31865_CS, MAX6675_CS)
#error "TEMP_SENSOR_0 -2 requires a MAX6675_SS_PIN, MAX6675_CS_PIN, MAX31855_CS_PIN, or MAX31865_CS_PIN."
#elif HAS_HOTEND && !HAS_TEMP_HOTEND && !TEMP_SENSOR_0_IS_DUMMY
#error "TEMP_0_PIN (required for TEMP_SENSOR_0) not defined for this board."
#elif EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1
#error "HEATER_1_PIN is not defined. TEMP_SENSOR_1 might not be set, or the board (not EEB / EEF?) doesn't define a pin."
#if TEMP_SENSOR_0_IS_MAX31865 || (TEMP_SENSOR_REDUNDANT_IS_MAX31865 && TEMP_SENSOR_REDUNDANT_SOURCE == 0)
#if !defined(MAX31865_SENSOR_WIRES_0) || !WITHIN(MAX31865_SENSOR_WIRES_0, 2, 4)
#error "MAX31865_SENSOR_WIRES_0 must be defined as an integer between 2 and 4."
#elif !defined(MAX31865_SENSOR_OHMS_0) || !defined(MAX31865_CALIBRATION_OHMS_0)
#error "MAX31865_SENSOR_OHMS_0 and MAX31865_CALIBRATION_OHMS_0 must be set if TEMP_SENSOR_0/TEMP_SENSOR_REDUNDANT is MAX31865."
#endif
#endif
#if TEMP_SENSOR_1_IS_MAX31865 || (TEMP_SENSOR_REDUNDANT_IS_MAX31865 && TEMP_SENSOR_REDUNDANT_SOURCE == 1)
#if !defined(MAX31865_SENSOR_WIRES_1) || !WITHIN(MAX31865_SENSOR_WIRES_1, 2, 4)
#error "MAX31865_SENSOR_WIRES_1 must be defined as an integer between 2 and 4."
#elif !defined(MAX31865_SENSOR_OHMS_1) || !defined(MAX31865_CALIBRATION_OHMS_1)
#error "MAX31865_SENSOR_OHMS_1 and MAX31865_CALIBRATION_OHMS_1 must be set if TEMP_SENSOR_1/TEMP_SENSOR_REDUNDANT is MAX31865."
#endif
#endif
/**
@ -2023,20 +2041,36 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#error "TEMP_SENSOR_REDUNDANT_TARGET can't be Cooler (-5): requires TEMP_COOLER_PIN"
#endif
#if TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 0 && !PIN_EXISTS(MAX6675_SS)
#error "TEMP_SENSOR_REDUNDANT MAX Thermocouple with TEMP_SENSOR_REDUNDANT_SOURCE 0 requires a MAX6675_SS_PIN, MAX6675_CS_PIN, MAX31855_CS_PIN, or MAX31865_CS_PIN."
#elif TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 1 && !PIN_EXISTS(MAX6675_SS2)
#error "TEMP_SENSOR_REDUNDANT MAX Thermocouple with TEMP_SENSOR_REDUNDANT_SOURCE 1 requires a MAX6675_SS2_PIN, MAX6675_CS_PIN, MAX31855_CS_PIN, or MAX31865_CS_PIN."
#if TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 0 && !PIN_EXISTS(TEMP_0_CS)
#error "TEMP_SENSOR_REDUNDANT MAX Thermocouple with TEMP_SENSOR_REDUNDANT_SOURCE 0 requires TEMP_0_CS_PIN."
#elif TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 1 && !PIN_EXISTS(TEMP_1_CS)
#error "TEMP_SENSOR_REDUNDANT MAX Thermocouple with TEMP_SENSOR_REDUNDANT_SOURCE 1 requires TEMP_1_CS_PIN."
#endif
#endif
/**
* Test Sensor & Heater pin combos.
* Pins and Sensor IDs must be set for each heater
*/
#if !ANY_PIN(TEMP_0, TEMP_0_CS)
#error "TEMP_0_PIN or TEMP_0_CS_PIN not defined for this board."
#elif !HAS_HEATER_0 && EXTRUDERS
#error "HEATER_0_PIN not defined for this board."
#elif TEMP_SENSOR_0_IS_MAX_TC && !PIN_EXISTS(TEMP_0_CS)
#error "TEMP_SENSOR_0 MAX thermocouple requires TEMP_0_CS_PIN."
#elif HAS_HOTEND && !HAS_TEMP_HOTEND && !TEMP_SENSOR_0_IS_DUMMY
#error "TEMP_0_PIN (required for TEMP_SENSOR_0) not defined for this board."
#elif EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1
#error "HEATER_1_PIN is not defined. TEMP_SENSOR_1 might not be set, or the board (not EEB / EEF?) doesn't define a pin."
#endif
#if HAS_MULTI_HOTEND
#if TEMP_SENSOR_1_IS_MAX6675 && !ANY_PIN(MAX6675_SS2, MAX31855_CS2, MAX31865_CS2, MAX6675_CS2)
#error "TEMP_SENSOR_1 requires a MAX6675_SS2_PIN, MAX6675_CS2_PIN, MAX31855_CS2_PIN, or MAX31865_CS2_PIN."
#if TEMP_SENSOR_1_IS_MAX_TC && !PIN_EXISTS(TEMP_1_CS)
#error "TEMP_SENSOR_1 MAX thermocouple requires TEMP_1_CS_PIN."
#elif TEMP_SENSOR_1 == 0
#error "TEMP_SENSOR_1 is required with 2 or more HOTENDS."
#elif !ANY_PIN(TEMP_1, MAX6675_SS2) && !TEMP_SENSOR_1_IS_DUMMY
#error "TEMP_1_PIN or MAX6675_SS2_PIN not defined for this board."
#elif !ANY_PIN(TEMP_1, TEMP_1_CS) && !TEMP_SENSOR_1_IS_DUMMY
#error "TEMP_1_PIN or TEMP_1_CS_PIN not defined for this board."
#endif
#if HOTENDS > 2
#if TEMP_SENSOR_2 == 0
@ -2148,14 +2182,31 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#error "TEMP_SENSOR_6 shouldn't be set with only 1 HOTEND."
#elif TEMP_SENSOR_7 != 0
#error "TEMP_SENSOR_7 shouldn't be set with only 1 HOTEND."
#endif
#endif // HAS_MULTI_HOTEND
/**
* Pins must be set for temp sensors, with some other feature requirements.
*/
#if TEMP_SENSOR_CHAMBER && !PIN_EXISTS(TEMP_CHAMBER)
#error "TEMP_SENSOR_CHAMBER requires TEMP_CHAMBER_PIN."
#endif
#if TEMP_SENSOR_COOLER && !(PIN_EXISTS(TEMP_COOLER) && ENABLED(LASER_FEATURE))
#error "TEMP_SENSOR_COOLER requires LASER_FEATURE and TEMP_COOLER_PIN."
#if TEMP_SENSOR_COOLER
#if !PIN_EXISTS(TEMP_COOLER)
#error "TEMP_SENSOR_COOLER requires TEMP_COOLER_PIN."
#elif DISABLED(LASER_FEATURE)
#error "TEMP_SENSOR_COOLER requires LASER_FEATURE."
#endif
#endif
#if TEMP_SENSOR_PROBE
#if !PIN_EXISTS(TEMP_PROBE)
#error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN."
#elif !HAS_TEMP_ADC_PROBE
#error "TEMP_PROBE_PIN must be an ADC pin."
#elif DISABLED(FIX_MOUNTED_PROBE)
#error "TEMP_SENSOR_PROBE shouldn't be set without FIX_MOUNTED_PROBE."
#endif
#endif
#if ENABLED(LASER_COOLANT_FLOW_METER) && !(PIN_EXISTS(FLOWMETER) && ENABLED(LASER_FEATURE))
@ -2186,41 +2237,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#endif
#endif
#if TEMP_SENSOR_PROBE
#if !PIN_EXISTS(TEMP_PROBE)
#error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN."
#elif !HAS_TEMP_ADC_PROBE
#error "TEMP_PROBE_PIN must be an ADC pin."
#elif DISABLED(FIX_MOUNTED_PROBE)
#error "TEMP_SENSOR_PROBE shouldn't be set without FIX_MOUNTED_PROBE."
#endif
#endif
#if TEMP_SENSOR_IS_MAX(0, MAX31865) && !(defined(MAX31865_SENSOR_OHMS_0) && defined(MAX31865_CALIBRATION_OHMS_0))
#error "MAX31865_SENSOR_OHMS_0 and MAX31865_CALIBRATION_OHMS_0 must be set if TEMP_SENSOR_0/TEMP_SENSOR_REDUNDANT is MAX31865."
#elif TEMP_SENSOR_IS_MAX(1, MAX31865) && !(defined(MAX31865_SENSOR_OHMS_1) && defined(MAX31865_CALIBRATION_OHMS_1))
#error "MAX31865_SENSOR_OHMS_1 and MAX31865_CALIBRATION_OHMS_1 must be set if TEMP_SENSOR_1/TEMP_SENSOR_REDUNDANT is MAX31865."
#endif
/**
* Test Heater, Temp Sensor, and Extruder Pins
*/
#if !HAS_HEATER_0 && EXTRUDERS
#error "HEATER_0_PIN not defined for this board."
#elif !ANY_PIN(TEMP_0, MAX6675_SS)
#error "TEMP_0_PIN or MAX6675_SS not defined for this board."
#endif
#if HAS_EXTRUDERS
#if ((defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && !PINS_EXIST(E0_STEP, E0_DIR))
#error "E0_STEP_PIN or E0_DIR_PIN not defined for this board."
#elif ( !(defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && (!PINS_EXIST(E0_STEP, E0_DIR) || !HAS_E0_ENABLE))
#error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board."
#elif EXTRUDERS && TEMP_SENSOR_0 == 0
#error "TEMP_SENSOR_0 is required if there are any extruders."
#endif
#endif
/**
* Temperature status LEDs
*/
@ -2262,6 +2278,16 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
/**
* Test Extruder Stepper Pins
*/
#if HAS_EXTRUDERS
#if ((defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && !PINS_EXIST(E0_STEP, E0_DIR))
#error "E0_STEP_PIN or E0_DIR_PIN not defined for this board."
#elif ( !(defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && (!PINS_EXIST(E0_STEP, E0_DIR) || !HAS_E0_ENABLE))
#error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board."
#elif EXTRUDERS && TEMP_SENSOR_0 == 0
#error "TEMP_SENSOR_0 is required if there are any extruders."
#endif
#endif
#if E_STEPPERS
#if !(PINS_EXIST(E0_STEP, E0_DIR) && HAS_E0_ENABLE)
#error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board."

6
Marlin/src/lcd/dogm/dogm_Statusscreen.h

@ -624,7 +624,7 @@
#define STATUS_AMMETER_X (LCD_PIXEL_WIDTH - (STATUS_AMMETER_BYTEWIDTH + STATUS_FLOWMETER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH + STATUS_COOLER_BYTEWIDTH) * 8)
#endif
#ifndef STATUS_AMMETER_HEIGHT
#define STATUS_AMMETER_HEIGHT(S) (sizeof(status_ammeter_bmp1) / (STATUS_AMMETER_BYTEWIDTH))
#define STATUS_AMMETER_HEIGHT(S) (sizeof(status_ammeter_bmp_mA) / (STATUS_AMMETER_BYTEWIDTH))
#endif
#ifndef STATUS_AMMETER_Y
#define STATUS_AMMETER_Y(S) (18 - STATUS_AMMETER_HEIGHT(S))
@ -633,8 +633,8 @@
#define STATUS_AMMETER_TEXT_X (STATUS_AMMETER_X + 7)
#endif
static_assert(
sizeof(status_ammeter_bmp1) == (STATUS_AMMETER_BYTEWIDTH) * STATUS_AMMETER_HEIGHT(0),
"Status ammeter bitmap (status_ammeter_bmp1) dimensions don't match data."
sizeof(status_ammeter_bmp_mA) == (STATUS_AMMETER_BYTEWIDTH) * STATUS_AMMETER_HEIGHT(0),
"Status ammeter bitmap (status_ammeter_bmp_mA) dimensions don't match data."
);
#endif

23
Marlin/src/lcd/dogm/fontdata/langdata.h

@ -0,0 +1,23 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* 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 <https://www.gnu.org/licenses/>.
*
*/
#pragma once
#include <U8glib-HAL.h>
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }

7
Marlin/src/lcd/dogm/fontdata/langdata_an.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_an[] PROGMEM = {};

23
Marlin/src/lcd/dogm/fontdata/langdata_bg.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_8_144_149[96] U8G_FONT_SECTION("fontpage_8_144_149") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x95,0x00,0x07,0xFF,0x00,
@ -64,14 +66,13 @@ const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206
0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06,
0x01,0x00,0x70,0x90,0x70,0x50,0x90};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(8, 144, 149, fontpage_8_144_149), // 'А' -- 'Е'
FONTDATA_ITEM(8, 151, 152, fontpage_8_151_152), // 'З' -- 'И'
FONTDATA_ITEM(8, 154, 164, fontpage_8_154_164), // 'К' -- 'Ф'
FONTDATA_ITEM(8, 166, 166, fontpage_8_166_166), // 'Ц' -- 'Ц'
FONTDATA_ITEM(8, 175, 195, fontpage_8_175_195), // 'Я' -- 'у'
FONTDATA_ITEM(8, 197, 200, fontpage_8_197_200), // 'х' -- 'ш'
FONTDATA_ITEM(8, 202, 202, fontpage_8_202_202), // 'ъ' -- 'ъ'
FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ю' -- 'я'
static const uxg_fontinfo_t g_fontinfo_bg[] PROGMEM = {
FONTDATA_ITEM(8, 144, 149, fontpage_8_144_149), // 'А' -- 'Е'
FONTDATA_ITEM(8, 151, 152, fontpage_8_151_152), // 'З' -- 'И'
FONTDATA_ITEM(8, 154, 164, fontpage_8_154_164), // 'К' -- 'Ф'
FONTDATA_ITEM(8, 166, 166, fontpage_8_166_166), // 'Ц' -- 'Ц'
FONTDATA_ITEM(8, 175, 195, fontpage_8_175_195), // 'Я' -- 'у'
FONTDATA_ITEM(8, 197, 200, fontpage_8_197_200), // 'х' -- 'ш'
FONTDATA_ITEM(8, 202, 202, fontpage_8_202_202), // 'ъ' -- 'ъ'
FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ю' -- 'я'
};

7
Marlin/src/lcd/dogm/fontdata/langdata_ca.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_ca[] PROGMEM = {};

25
Marlin/src/lcd/dogm/fontdata/langdata_cz.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_2_140_141[47] U8G_FONT_SECTION("fontpage_2_140_141") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8D,0x00,0x0A,0x00,0x00,
@ -40,15 +42,14 @@ const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253
0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,
0xF8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'Č' -- 'č'
FONTDATA_ITEM(2, 143, 143, fontpage_2_143_143), // 'ď' -- 'ď'
FONTDATA_ITEM(2, 154, 155, fontpage_2_154_155), // 'Ě' -- 'ě'
FONTDATA_ITEM(2, 200, 200, fontpage_2_200_200), // 'ň' -- 'ň'
FONTDATA_ITEM(2, 216, 217, fontpage_2_216_217), // 'Ř' -- 'ř'
FONTDATA_ITEM(2, 224, 225, fontpage_2_224_225), // 'Š' -- 'š'
FONTDATA_ITEM(2, 229, 229, fontpage_2_229_229), // 'ť' -- 'ť'
FONTDATA_ITEM(2, 239, 239, fontpage_2_239_239), // 'ů' -- 'ů'
FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž'
static const uxg_fontinfo_t g_fontinfo_cz[] PROGMEM = {
FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'Č' -- 'č'
FONTDATA_ITEM(2, 143, 143, fontpage_2_143_143), // 'ď' -- 'ď'
FONTDATA_ITEM(2, 154, 155, fontpage_2_154_155), // 'Ě' -- 'ě'
FONTDATA_ITEM(2, 200, 200, fontpage_2_200_200), // 'ň' -- 'ň'
FONTDATA_ITEM(2, 216, 217, fontpage_2_216_217), // 'Ř' -- 'ř'
FONTDATA_ITEM(2, 224, 225, fontpage_2_224_225), // 'Š' -- 'š'
FONTDATA_ITEM(2, 229, 229, fontpage_2_229_229), // 'ť' -- 'ť'
FONTDATA_ITEM(2, 239, 239, fontpage_2_239_239), // 'ů' -- 'ů'
FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž'
};

7
Marlin/src/lcd/dogm/fontdata/langdata_da.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_da[] PROGMEM = {};

7
Marlin/src/lcd/dogm/fontdata/langdata_de.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_de[] PROGMEM = {};

27
Marlin/src/lcd/dogm/fontdata/langdata_el.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0x00,0x00,
@ -75,16 +77,15 @@ const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_1
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x01,0x00,0x00,
0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xA8};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ'
FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Ν'
FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ'
FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ'
FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί'
FONTDATA_ITEM(7, 177, 181, fontpage_7_177_181), // 'α' -- 'ε'
FONTDATA_ITEM(7, 183, 199, fontpage_7_183_199), // 'η' -- 'χ'
FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω'
FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ό' -- 'ώ'
FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…'
static const uxg_fontinfo_t g_fontinfo_el[] PROGMEM = {
FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ'
FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Ν'
FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ'
FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ'
FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί'
FONTDATA_ITEM(7, 177, 181, fontpage_7_177_181), // 'α' -- 'ε'
FONTDATA_ITEM(7, 183, 199, fontpage_7_183_199), // 'η' -- 'χ'
FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω'
FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ό' -- 'ώ'
FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…'
};

27
Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0x00,0x00,
@ -75,16 +77,15 @@ const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_1
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x01,0x00,0x00,
0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xA8};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ'
FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Ν'
FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ'
FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ'
FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί'
FONTDATA_ITEM(7, 177, 181, fontpage_7_177_181), // 'α' -- 'ε'
FONTDATA_ITEM(7, 183, 199, fontpage_7_183_199), // 'η' -- 'χ'
FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω'
FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ό' -- 'ώ'
FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…'
static const uxg_fontinfo_t g_fontinfo_el_gr[] PROGMEM = {
FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ'
FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Ν'
FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ'
FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ'
FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί'
FONTDATA_ITEM(7, 177, 181, fontpage_7_177_181), // 'α' -- 'ε'
FONTDATA_ITEM(7, 183, 199, fontpage_7_183_199), // 'η' -- 'χ'
FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω'
FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ό' -- 'ώ'
FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…'
};

7
Marlin/src/lcd/dogm/fontdata/langdata_en.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_en[] PROGMEM = {};

7
Marlin/src/lcd/dogm/fontdata/langdata_es.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_es[] PROGMEM = {};

7
Marlin/src/lcd/dogm/fontdata/langdata_eu.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_eu[] PROGMEM = {};

7
Marlin/src/lcd/dogm/fontdata/langdata_fi.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_fi[] PROGMEM = {};

7
Marlin/src/lcd/dogm/fontdata/langdata_fr.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_fr[] PROGMEM = {};

7
Marlin/src/lcd/dogm/fontdata/langdata_gl.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_gl[] PROGMEM = {};

17
Marlin/src/lcd/dogm/fontdata/langdata_hr.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_2_135_135[31] U8G_FONT_SECTION("fontpage_2_135_135") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00,
@ -22,11 +24,10 @@ const u8g_fntpgm_uint8_t fontpage_2_254_254[31] U8G_FONT_SECTION("fontpage_2_254
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x08,0x00,0x00,
0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć'
FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'Č' -- 'č'
FONTDATA_ITEM(2, 145, 145, fontpage_2_145_145), // 'đ' -- 'đ'
FONTDATA_ITEM(2, 225, 225, fontpage_2_225_225), // 'š' -- 'š'
FONTDATA_ITEM(2, 254, 254, fontpage_2_254_254), // 'ž' -- 'ž'
static const uxg_fontinfo_t g_fontinfo_hr[] PROGMEM = {
FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć'
FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'Č' -- 'č'
FONTDATA_ITEM(2, 145, 145, fontpage_2_145_145), // 'đ' -- 'đ'
FONTDATA_ITEM(2, 225, 225, fontpage_2_225_225), // 'š' -- 'š'
FONTDATA_ITEM(2, 254, 254, fontpage_2_254_254), // 'ž' -- 'ž'
};

9
Marlin/src/lcd/dogm/fontdata/langdata_hu.h

@ -3,13 +3,14 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_2_241_241[31] U8G_FONT_SECTION("fontpage_2_241_241") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x08,0x00,0x00,
0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x48,0x90,0x00,0x88,0x88,0x88,0x88,0x70};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(2, 241, 241, fontpage_2_241_241), // 'ű' -- 'ű'
static const uxg_fontinfo_t g_fontinfo_hu[] PROGMEM = {
FONTDATA_ITEM(2, 241, 241, fontpage_2_241_241), // 'ű' -- 'ű'
};

7
Marlin/src/lcd/dogm/fontdata/langdata_it.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_it[] PROGMEM = {};

31
Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_97_161_164[65] U8G_FONT_SECTION("fontpage_97_161_164") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA4,0x00,0x07,0x00,0x00,
@ -94,18 +96,17 @@ const u8g_fntpgm_uint8_t fontpage_97_252_252[25] U8G_FONT_SECTION("fontpage_97_2
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x05,0x00,0x00,
0x00,0x05,0x02,0x02,0x06,0x00,0x03,0x80,0x78};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(97, 161, 164, fontpage_97_161_164), // 'ァ' -- 'イ'
FONTDATA_ITEM(97, 166, 166, fontpage_97_166_166), // 'ウ' -- 'ウ'
FONTDATA_ITEM(97, 168, 168, fontpage_97_168_168), // 'エ' -- 'エ'
FONTDATA_ITEM(97, 170, 187, fontpage_97_170_187), // 'オ' -- 'セ'
FONTDATA_ITEM(97, 189, 193, fontpage_97_189_193), // 'ソ' -- 'チ'
FONTDATA_ITEM(97, 195, 211, fontpage_97_195_211), // 'ッ' -- 'ビ'
FONTDATA_ITEM(97, 213, 217, fontpage_97_213_217), // 'フ' -- 'ベ'
FONTDATA_ITEM(97, 219, 220, fontpage_97_219_220), // 'ホ' -- 'ボ'
FONTDATA_ITEM(97, 222, 223, fontpage_97_222_223), // 'マ' -- 'ミ'
FONTDATA_ITEM(97, 225, 237, fontpage_97_225_237), // 'メ' -- 'ロ'
FONTDATA_ITEM(97, 242, 243, fontpage_97_242_243), // 'ヲ' -- 'ン'
FONTDATA_ITEM(97, 252, 252, fontpage_97_252_252), // 'ー' -- 'ー'
static const uxg_fontinfo_t g_fontinfo_jp_kana[] PROGMEM = {
FONTDATA_ITEM(97, 161, 164, fontpage_97_161_164), // 'ァ' -- 'イ'
FONTDATA_ITEM(97, 166, 166, fontpage_97_166_166), // 'ウ' -- 'ウ'
FONTDATA_ITEM(97, 168, 168, fontpage_97_168_168), // 'エ' -- 'エ'
FONTDATA_ITEM(97, 170, 187, fontpage_97_170_187), // 'オ' -- 'セ'
FONTDATA_ITEM(97, 189, 193, fontpage_97_189_193), // 'ソ' -- 'チ'
FONTDATA_ITEM(97, 195, 211, fontpage_97_195_211), // 'ッ' -- 'ビ'
FONTDATA_ITEM(97, 213, 217, fontpage_97_213_217), // 'フ' -- 'ベ'
FONTDATA_ITEM(97, 219, 220, fontpage_97_219_220), // 'ホ' -- 'ボ'
FONTDATA_ITEM(97, 222, 223, fontpage_97_222_223), // 'マ' -- 'ミ'
FONTDATA_ITEM(97, 225, 237, fontpage_97_225_237), // 'メ' -- 'ロ'
FONTDATA_ITEM(97, 242, 243, fontpage_97_242_243), // 'ヲ' -- 'ン'
FONTDATA_ITEM(97, 252, 252, fontpage_97_252_252), // 'ー' -- 'ー'
};

219
Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_344_240_240[34] U8G_FONT_SECTION("fontpage_344_240_240") = {
0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x09,0xFE,0x00,
@ -436,112 +438,111 @@ const u8g_fntpgm_uint8_t fontpage_431_136_136[34] U8G_FONT_SECTION("fontpage_431
0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xFD,0x01,0x71,0x49,0x89,0x49,0x71,
0x01,0x01};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(344, 240, 240, fontpage_344_240_240), // '거' -- '거'
FONTDATA_ITEM(345, 224, 224, fontpage_345_224_224), // '고' -- '고'
FONTDATA_ITEM(347, 248, 248, fontpage_347_248_248), // '그' -- '그'
FONTDATA_ITEM(348, 137, 137, fontpage_348_137_137), // '급' -- '급'
FONTDATA_ITEM(348, 176, 176, fontpage_348_176_176), // '기' -- '기'
FONTDATA_ITEM(348, 197, 197, fontpage_348_197_197), // '깅' -- '깅'
FONTDATA_ITEM(352, 196, 196, fontpage_352_196_196), // '끄' -- '끄'
FONTDATA_ITEM(353, 180, 180, fontpage_353_180_180), // '내' -- '내'
FONTDATA_ITEM(354, 248, 248, fontpage_354_248_248), // '노' -- '노'
FONTDATA_ITEM(356, 132, 132, fontpage_356_132_132), // '누' -- '누'
FONTDATA_ITEM(356, 244, 244, fontpage_356_244_244), // '뉴' -- '뉴'
FONTDATA_ITEM(357, 200, 200, fontpage_357_200_200), // '니' -- '니'
FONTDATA_ITEM(357, 228, 228, fontpage_357_228_228), // '다' -- '다'
FONTDATA_ITEM(357, 249, 249, fontpage_357_249_249), // '당' -- '당'
FONTDATA_ITEM(359, 196, 196, fontpage_359_196_196), // '도' -- '도'
FONTDATA_ITEM(359, 204, 204, fontpage_359_204_204), // '돌' -- '돌'
FONTDATA_ITEM(359, 217, 217, fontpage_359_217_217), // '동' -- '동'
FONTDATA_ITEM(360, 152, 152, fontpage_360_152_152), // '되' -- '되'
FONTDATA_ITEM(360, 156, 156, fontpage_360_156_156), // '된' -- '된'
FONTDATA_ITEM(360, 168, 168, fontpage_360_168_168), // '됨' -- '됨'
FONTDATA_ITEM(361, 164, 164, fontpage_361_164_164), // '뒤' -- '뒤'
FONTDATA_ITEM(361, 220, 220, fontpage_361_220_220), // '드' -- '드'
FONTDATA_ITEM(362, 148, 148, fontpage_362_148_148), // '디' -- '디'
FONTDATA_ITEM(366, 252, 252, fontpage_366_252_252), // '라' -- '라'
FONTDATA_ITEM(367, 236, 236, fontpage_367_236_236), // '러' -- '러'
FONTDATA_ITEM(368, 136, 136, fontpage_368_136_136), // '레' -- '레'
FONTDATA_ITEM(368, 165, 165, fontpage_368_165_165), // '력' -- '력'
FONTDATA_ITEM(368, 220, 220, fontpage_368_220_220), // '로' -- '로'
FONTDATA_ITEM(369, 204, 204, fontpage_369_204_204), // '료' -- '료'
FONTDATA_ITEM(370, 244, 244, fontpage_370_244_244), // '르' -- '르'
FONTDATA_ITEM(371, 172, 172, fontpage_371_172_172), // '리' -- '리'
FONTDATA_ITEM(371, 176, 176, fontpage_371_176_176), // '린' -- '린'
FONTDATA_ITEM(371, 189, 189, fontpage_371_189_189), // '립' -- '립'
FONTDATA_ITEM(371, 193, 193, fontpage_371_193_193), // '링' -- '링'
FONTDATA_ITEM(372, 200, 200, fontpage_372_200_200), // '멈' -- '멈'
FONTDATA_ITEM(372, 212, 212, fontpage_372_212_212), // '메' -- '메'
FONTDATA_ITEM(372, 244, 244, fontpage_372_244_244), // '면' -- '면'
FONTDATA_ITEM(373, 168, 168, fontpage_373_168_168), // '모' -- '모'
FONTDATA_ITEM(373, 187, 187, fontpage_373_187_187), // '못' -- '못'
FONTDATA_ITEM(375, 248, 248, fontpage_375_248_248), // '미' -- '미'
FONTDATA_ITEM(376, 128, 128, fontpage_376_128_128), // '밀' -- '밀'
FONTDATA_ITEM(376, 148, 148, fontpage_376_148_148), // '바' -- '바'
FONTDATA_ITEM(377, 132, 132, fontpage_377_132_132), // '버' -- '버'
FONTDATA_ITEM(377, 160, 160, fontpage_377_160_160), // '베' -- '베'
FONTDATA_ITEM(377, 168, 168, fontpage_377_168_168), // '벨' -- '벨'
FONTDATA_ITEM(377, 248, 248, fontpage_377_248_248), // '본' -- '본'
FONTDATA_ITEM(380, 196, 196, fontpage_380_196_196), // '비' -- '비'
FONTDATA_ITEM(385, 172, 172, fontpage_385_172_172), // '사' -- '사'
FONTDATA_ITEM(385, 189, 189, fontpage_385_189_189), // '삽' -- '삽'
FONTDATA_ITEM(385, 200, 200, fontpage_385_200_200), // '새' -- '새'
FONTDATA_ITEM(386, 164, 164, fontpage_386_164_164), // '설' -- '설'
FONTDATA_ITEM(387, 140, 141, fontpage_387_140_141), // '소' -- '속'
FONTDATA_ITEM(389, 164, 164, fontpage_389_164_164), // '스' -- '스'
FONTDATA_ITEM(389, 172, 172, fontpage_389_172_172), // '슬' -- '슬'
FONTDATA_ITEM(389, 220, 221, fontpage_389_220_221), // '시' -- '식'
FONTDATA_ITEM(395, 180, 180, fontpage_395_180_180), // '어' -- '어'
FONTDATA_ITEM(395, 198, 198, fontpage_395_198_198), // '없' -- '없'
FONTDATA_ITEM(395, 209, 209, fontpage_395_209_209), // '엑' -- '엑'
FONTDATA_ITEM(395, 212, 212, fontpage_395_212_212), // '엔' -- '엔'
FONTDATA_ITEM(395, 244, 244, fontpage_395_244_244), // '열' -- '열'
FONTDATA_ITEM(396, 136, 136, fontpage_396_136_136), // '예' -- '예'
FONTDATA_ITEM(396, 164, 164, fontpage_396_164_164), // '오' -- '오'
FONTDATA_ITEM(396, 168, 168, fontpage_396_168_168), // '온' -- '온'
FONTDATA_ITEM(396, 196, 196, fontpage_396_196_196), // '완' -- '완'
FONTDATA_ITEM(397, 208, 208, fontpage_397_208_208), // '원' -- '원'
FONTDATA_ITEM(398, 132, 132, fontpage_398_132_132), // '위' -- '위'
FONTDATA_ITEM(398, 188, 188, fontpage_398_188_188), // '으' -- '으'
FONTDATA_ITEM(398, 204, 204, fontpage_398_204_204), // '음' -- '음'
FONTDATA_ITEM(398, 244, 244, fontpage_398_244_244), // '이' -- '이'
FONTDATA_ITEM(398, 252, 253, fontpage_398_252_253), // '일' -- '읽'
FONTDATA_ITEM(399, 133, 133, fontpage_399_133_133), // '입' -- '입'
FONTDATA_ITEM(399, 144, 145, fontpage_399_144_145), // '자' -- '작'
FONTDATA_ITEM(399, 152, 152, fontpage_399_152_152), // '잘' -- '잘'
FONTDATA_ITEM(399, 165, 165, fontpage_399_165_165), // '장' -- '장'
FONTDATA_ITEM(399, 172, 172, fontpage_399_172_172), // '재' -- '재'
FONTDATA_ITEM(400, 128, 128, fontpage_400_128_128), // '저' -- '저'
FONTDATA_ITEM(400, 132, 132, fontpage_400_132_132), // '전' -- '전'
FONTDATA_ITEM(400, 149, 149, fontpage_400_149_149), // '정' -- '정'
FONTDATA_ITEM(400, 156, 156, fontpage_400_156_156), // '제' -- '제'
FONTDATA_ITEM(401, 253, 253, fontpage_401_253_253), // '죽' -- '죽'
FONTDATA_ITEM(402, 128, 128, fontpage_402_128_128), // '준' -- '준'
FONTDATA_ITEM(402, 145, 145, fontpage_402_145_145), // '중' -- '중'
FONTDATA_ITEM(403, 144, 144, fontpage_403_144_144), // '즐' -- '즐'
FONTDATA_ITEM(403, 192, 192, fontpage_403_192_192), // '지' -- '지'
FONTDATA_ITEM(409, 152, 152, fontpage_409_152_152), // '처' -- '처'
FONTDATA_ITEM(410, 136, 136, fontpage_410_136_136), // '초' -- '초'
FONTDATA_ITEM(411, 149, 149, fontpage_411_149_149), // '축' -- '축'
FONTDATA_ITEM(411, 156, 156, fontpage_411_156_156), // '출' -- '출'
FONTDATA_ITEM(411, 164, 164, fontpage_411_164_164), // '춤' -- '춤'
FONTDATA_ITEM(411, 232, 232, fontpage_411_232_232), // '취' -- '취'
FONTDATA_ITEM(412, 216, 216, fontpage_412_216_216), // '치' -- '치'
FONTDATA_ITEM(412, 232, 232, fontpage_412_232_232), // '침' -- '침'
FONTDATA_ITEM(412, 244, 244, fontpage_412_244_244), // '카' -- '카'
FONTDATA_ITEM(414, 156, 156, fontpage_414_156_156), // '켜' -- '켜'
FONTDATA_ITEM(417, 209, 209, fontpage_417_209_209), // '탑' -- '탑'
FONTDATA_ITEM(418, 176, 176, fontpage_418_176_176), // '터' -- '터'
FONTDATA_ITEM(418, 204, 204, fontpage_418_204_204), // '테' -- '테'
FONTDATA_ITEM(419, 160, 160, fontpage_419_160_160), // '토' -- '토'
FONTDATA_ITEM(421, 184, 184, fontpage_421_184_184), // '트' -- '트'
FONTDATA_ITEM(423, 156, 156, fontpage_423_156_156), // '펜' -- '펜'
FONTDATA_ITEM(426, 132, 132, fontpage_426_132_132), // '프' -- '프'
FONTDATA_ITEM(426, 216, 216, fontpage_426_216_216), // '하' -- '하'
FONTDATA_ITEM(426, 233, 233, fontpage_426_233_233), // '합' -- '합'
FONTDATA_ITEM(428, 200, 200, fontpage_428_200_200), // '홈' -- '홈'
FONTDATA_ITEM(428, 212, 212, fontpage_428_212_212), // '화' -- '화'
FONTDATA_ITEM(431, 136, 136, fontpage_431_136_136), // '히' -- '히'
static const uxg_fontinfo_t g_fontinfo_ko_KR[] PROGMEM = {
FONTDATA_ITEM(344, 240, 240, fontpage_344_240_240), // '거' -- '거'
FONTDATA_ITEM(345, 224, 224, fontpage_345_224_224), // '고' -- '고'
FONTDATA_ITEM(347, 248, 248, fontpage_347_248_248), // '그' -- '그'
FONTDATA_ITEM(348, 137, 137, fontpage_348_137_137), // '급' -- '급'
FONTDATA_ITEM(348, 176, 176, fontpage_348_176_176), // '기' -- '기'
FONTDATA_ITEM(348, 197, 197, fontpage_348_197_197), // '깅' -- '깅'
FONTDATA_ITEM(352, 196, 196, fontpage_352_196_196), // '끄' -- '끄'
FONTDATA_ITEM(353, 180, 180, fontpage_353_180_180), // '내' -- '내'
FONTDATA_ITEM(354, 248, 248, fontpage_354_248_248), // '노' -- '노'
FONTDATA_ITEM(356, 132, 132, fontpage_356_132_132), // '누' -- '누'
FONTDATA_ITEM(356, 244, 244, fontpage_356_244_244), // '뉴' -- '뉴'
FONTDATA_ITEM(357, 200, 200, fontpage_357_200_200), // '니' -- '니'
FONTDATA_ITEM(357, 228, 228, fontpage_357_228_228), // '다' -- '다'
FONTDATA_ITEM(357, 249, 249, fontpage_357_249_249), // '당' -- '당'
FONTDATA_ITEM(359, 196, 196, fontpage_359_196_196), // '도' -- '도'
FONTDATA_ITEM(359, 204, 204, fontpage_359_204_204), // '돌' -- '돌'
FONTDATA_ITEM(359, 217, 217, fontpage_359_217_217), // '동' -- '동'
FONTDATA_ITEM(360, 152, 152, fontpage_360_152_152), // '되' -- '되'
FONTDATA_ITEM(360, 156, 156, fontpage_360_156_156), // '된' -- '된'
FONTDATA_ITEM(360, 168, 168, fontpage_360_168_168), // '됨' -- '됨'
FONTDATA_ITEM(361, 164, 164, fontpage_361_164_164), // '뒤' -- '뒤'
FONTDATA_ITEM(361, 220, 220, fontpage_361_220_220), // '드' -- '드'
FONTDATA_ITEM(362, 148, 148, fontpage_362_148_148), // '디' -- '디'
FONTDATA_ITEM(366, 252, 252, fontpage_366_252_252), // '라' -- '라'
FONTDATA_ITEM(367, 236, 236, fontpage_367_236_236), // '러' -- '러'
FONTDATA_ITEM(368, 136, 136, fontpage_368_136_136), // '레' -- '레'
FONTDATA_ITEM(368, 165, 165, fontpage_368_165_165), // '력' -- '력'
FONTDATA_ITEM(368, 220, 220, fontpage_368_220_220), // '로' -- '로'
FONTDATA_ITEM(369, 204, 204, fontpage_369_204_204), // '료' -- '료'
FONTDATA_ITEM(370, 244, 244, fontpage_370_244_244), // '르' -- '르'
FONTDATA_ITEM(371, 172, 172, fontpage_371_172_172), // '리' -- '리'
FONTDATA_ITEM(371, 176, 176, fontpage_371_176_176), // '린' -- '린'
FONTDATA_ITEM(371, 189, 189, fontpage_371_189_189), // '립' -- '립'
FONTDATA_ITEM(371, 193, 193, fontpage_371_193_193), // '링' -- '링'
FONTDATA_ITEM(372, 200, 200, fontpage_372_200_200), // '멈' -- '멈'
FONTDATA_ITEM(372, 212, 212, fontpage_372_212_212), // '메' -- '메'
FONTDATA_ITEM(372, 244, 244, fontpage_372_244_244), // '면' -- '면'
FONTDATA_ITEM(373, 168, 168, fontpage_373_168_168), // '모' -- '모'
FONTDATA_ITEM(373, 187, 187, fontpage_373_187_187), // '못' -- '못'
FONTDATA_ITEM(375, 248, 248, fontpage_375_248_248), // '미' -- '미'
FONTDATA_ITEM(376, 128, 128, fontpage_376_128_128), // '밀' -- '밀'
FONTDATA_ITEM(376, 148, 148, fontpage_376_148_148), // '바' -- '바'
FONTDATA_ITEM(377, 132, 132, fontpage_377_132_132), // '버' -- '버'
FONTDATA_ITEM(377, 160, 160, fontpage_377_160_160), // '베' -- '베'
FONTDATA_ITEM(377, 168, 168, fontpage_377_168_168), // '벨' -- '벨'
FONTDATA_ITEM(377, 248, 248, fontpage_377_248_248), // '본' -- '본'
FONTDATA_ITEM(380, 196, 196, fontpage_380_196_196), // '비' -- '비'
FONTDATA_ITEM(385, 172, 172, fontpage_385_172_172), // '사' -- '사'
FONTDATA_ITEM(385, 189, 189, fontpage_385_189_189), // '삽' -- '삽'
FONTDATA_ITEM(385, 200, 200, fontpage_385_200_200), // '새' -- '새'
FONTDATA_ITEM(386, 164, 164, fontpage_386_164_164), // '설' -- '설'
FONTDATA_ITEM(387, 140, 141, fontpage_387_140_141), // '소' -- '속'
FONTDATA_ITEM(389, 164, 164, fontpage_389_164_164), // '스' -- '스'
FONTDATA_ITEM(389, 172, 172, fontpage_389_172_172), // '슬' -- '슬'
FONTDATA_ITEM(389, 220, 221, fontpage_389_220_221), // '시' -- '식'
FONTDATA_ITEM(395, 180, 180, fontpage_395_180_180), // '어' -- '어'
FONTDATA_ITEM(395, 198, 198, fontpage_395_198_198), // '없' -- '없'
FONTDATA_ITEM(395, 209, 209, fontpage_395_209_209), // '엑' -- '엑'
FONTDATA_ITEM(395, 212, 212, fontpage_395_212_212), // '엔' -- '엔'
FONTDATA_ITEM(395, 244, 244, fontpage_395_244_244), // '열' -- '열'
FONTDATA_ITEM(396, 136, 136, fontpage_396_136_136), // '예' -- '예'
FONTDATA_ITEM(396, 164, 164, fontpage_396_164_164), // '오' -- '오'
FONTDATA_ITEM(396, 168, 168, fontpage_396_168_168), // '온' -- '온'
FONTDATA_ITEM(396, 196, 196, fontpage_396_196_196), // '완' -- '완'
FONTDATA_ITEM(397, 208, 208, fontpage_397_208_208), // '원' -- '원'
FONTDATA_ITEM(398, 132, 132, fontpage_398_132_132), // '위' -- '위'
FONTDATA_ITEM(398, 188, 188, fontpage_398_188_188), // '으' -- '으'
FONTDATA_ITEM(398, 204, 204, fontpage_398_204_204), // '음' -- '음'
FONTDATA_ITEM(398, 244, 244, fontpage_398_244_244), // '이' -- '이'
FONTDATA_ITEM(398, 252, 253, fontpage_398_252_253), // '일' -- '읽'
FONTDATA_ITEM(399, 133, 133, fontpage_399_133_133), // '입' -- '입'
FONTDATA_ITEM(399, 144, 145, fontpage_399_144_145), // '자' -- '작'
FONTDATA_ITEM(399, 152, 152, fontpage_399_152_152), // '잘' -- '잘'
FONTDATA_ITEM(399, 165, 165, fontpage_399_165_165), // '장' -- '장'
FONTDATA_ITEM(399, 172, 172, fontpage_399_172_172), // '재' -- '재'
FONTDATA_ITEM(400, 128, 128, fontpage_400_128_128), // '저' -- '저'
FONTDATA_ITEM(400, 132, 132, fontpage_400_132_132), // '전' -- '전'
FONTDATA_ITEM(400, 149, 149, fontpage_400_149_149), // '정' -- '정'
FONTDATA_ITEM(400, 156, 156, fontpage_400_156_156), // '제' -- '제'
FONTDATA_ITEM(401, 253, 253, fontpage_401_253_253), // '죽' -- '죽'
FONTDATA_ITEM(402, 128, 128, fontpage_402_128_128), // '준' -- '준'
FONTDATA_ITEM(402, 145, 145, fontpage_402_145_145), // '중' -- '중'
FONTDATA_ITEM(403, 144, 144, fontpage_403_144_144), // '즐' -- '즐'
FONTDATA_ITEM(403, 192, 192, fontpage_403_192_192), // '지' -- '지'
FONTDATA_ITEM(409, 152, 152, fontpage_409_152_152), // '처' -- '처'
FONTDATA_ITEM(410, 136, 136, fontpage_410_136_136), // '초' -- '초'
FONTDATA_ITEM(411, 149, 149, fontpage_411_149_149), // '축' -- '축'
FONTDATA_ITEM(411, 156, 156, fontpage_411_156_156), // '출' -- '출'
FONTDATA_ITEM(411, 164, 164, fontpage_411_164_164), // '춤' -- '춤'
FONTDATA_ITEM(411, 232, 232, fontpage_411_232_232), // '취' -- '취'
FONTDATA_ITEM(412, 216, 216, fontpage_412_216_216), // '치' -- '치'
FONTDATA_ITEM(412, 232, 232, fontpage_412_232_232), // '침' -- '침'
FONTDATA_ITEM(412, 244, 244, fontpage_412_244_244), // '카' -- '카'
FONTDATA_ITEM(414, 156, 156, fontpage_414_156_156), // '켜' -- '켜'
FONTDATA_ITEM(417, 209, 209, fontpage_417_209_209), // '탑' -- '탑'
FONTDATA_ITEM(418, 176, 176, fontpage_418_176_176), // '터' -- '터'
FONTDATA_ITEM(418, 204, 204, fontpage_418_204_204), // '테' -- '테'
FONTDATA_ITEM(419, 160, 160, fontpage_419_160_160), // '토' -- '토'
FONTDATA_ITEM(421, 184, 184, fontpage_421_184_184), // '트' -- '트'
FONTDATA_ITEM(423, 156, 156, fontpage_423_156_156), // '펜' -- '펜'
FONTDATA_ITEM(426, 132, 132, fontpage_426_132_132), // '프' -- '프'
FONTDATA_ITEM(426, 216, 216, fontpage_426_216_216), // '하' -- '하'
FONTDATA_ITEM(426, 233, 233, fontpage_426_233_233), // '합' -- '합'
FONTDATA_ITEM(428, 200, 200, fontpage_428_200_200), // '홈' -- '홈'
FONTDATA_ITEM(428, 212, 212, fontpage_428_212_212), // '화' -- '화'
FONTDATA_ITEM(431, 136, 136, fontpage_431_136_136), // '히' -- '히'
};

7
Marlin/src/lcd/dogm/fontdata/langdata_nl.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_nl[] PROGMEM = {};

19
Marlin/src/lcd/dogm/fontdata/langdata_pl.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_2_132_133[45] U8G_FONT_SECTION("fontpage_2_132_133") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x85,0x00,0x07,0xFE,0x00,
@ -29,12 +31,11 @@ const u8g_fntpgm_uint8_t fontpage_2_252_252[30] U8G_FONT_SECTION("fontpage_2_252
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x07,0x00,0x00,
0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(2, 132, 133, fontpage_2_132_133), // 'Ą' -- 'ą'
FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć'
FONTDATA_ITEM(2, 153, 153, fontpage_2_153_153), // 'ę' -- 'ę'
FONTDATA_ITEM(2, 193, 196, fontpage_2_193_196), // 'Ł' -- 'ń'
FONTDATA_ITEM(2, 218, 219, fontpage_2_218_219), // 'Ś' -- 'ś'
FONTDATA_ITEM(2, 252, 252, fontpage_2_252_252), // 'ż' -- 'ż'
static const uxg_fontinfo_t g_fontinfo_pl[] PROGMEM = {
FONTDATA_ITEM(2, 132, 133, fontpage_2_132_133), // 'Ą' -- 'ą'
FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć'
FONTDATA_ITEM(2, 153, 153, fontpage_2_153_153), // 'ę' -- 'ę'
FONTDATA_ITEM(2, 193, 196, fontpage_2_193_196), // 'Ł' -- 'ń'
FONTDATA_ITEM(2, 218, 219, fontpage_2_218_219), // 'Ś' -- 'ś'
FONTDATA_ITEM(2, 252, 252, fontpage_2_252_252), // 'ż' -- 'ż'
};

7
Marlin/src/lcd/dogm/fontdata/langdata_pt.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_pt[] PROGMEM = {};

7
Marlin/src/lcd/dogm/fontdata/langdata_pt_br.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_pt_br[] PROGMEM = {};

7
Marlin/src/lcd/dogm/fontdata/langdata_ro.h

@ -3,7 +3,8 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {};
#include "langdata.h"
static const uxg_fontinfo_t g_fontinfo_ro[] PROGMEM = {};

15
Marlin/src/lcd/dogm/fontdata/langdata_ru.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_8_144_168[348] U8G_FONT_SECTION("fontpage_8_144_168") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0xA8,0x00,0x0A,0xFE,0x00,
@ -64,10 +66,9 @@ const u8g_fntpgm_uint8_t fontpage_8_209_209[30] U8G_FONT_SECTION("fontpage_8_209
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x07,0x00,0x00,
0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xF0,0x80,0x70};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(8, 144, 168, fontpage_8_144_168), // 'А' -- 'Ш'
FONTDATA_ITEM(8, 171, 173, fontpage_8_171_173), // 'Ы' -- 'Э'
FONTDATA_ITEM(8, 175, 207, fontpage_8_175_207), // 'Я' -- 'я'
FONTDATA_ITEM(8, 209, 209, fontpage_8_209_209), // 'ё' -- 'ё'
static const uxg_fontinfo_t g_fontinfo_ru[] PROGMEM = {
FONTDATA_ITEM(8, 144, 168, fontpage_8_144_168), // 'А' -- 'Ш'
FONTDATA_ITEM(8, 171, 173, fontpage_8_171_173), // 'Ы' -- 'Э'
FONTDATA_ITEM(8, 175, 207, fontpage_8_175_207), // 'Я' -- 'я'
FONTDATA_ITEM(8, 209, 209, fontpage_8_209_209), // 'ё' -- 'ё'
};

21
Marlin/src/lcd/dogm/fontdata/langdata_sk.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_2_140_143[79] U8G_FONT_SECTION("fontpage_2_140_143") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8F,0x00,0x0A,0x00,0x00,
@ -37,13 +39,12 @@ const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253
0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,
0xF8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
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, 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), // 'ť' -- 'ť'
FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž'
static const uxg_fontinfo_t g_fontinfo_sk[] PROGMEM = {
FONTDATA_ITEM(2, 140, 143, fontpage_2_140_143), // 'Č' -- 'ď'
FONTDATA_ITEM(2, 186, 186, fontpage_2_186_186), // 'ĺ' -- 'ĺ'
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), // 'ť' -- 'ť'
FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž'
};

13
Marlin/src/lcd/dogm/fontdata/langdata_test.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_8_128_255[1677] U8G_FONT_SECTION("fontpage_8_128_255") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x00,0x0A,0xFE,0x00,
@ -223,9 +225,8 @@ const u8g_fntpgm_uint8_t fontpage_97_193_255[822] U8G_FONT_SECTION("fontpage_97_
0x06,0x00,0x02,0x28,0x28,0x00,0x80,0x60,0x10,0x08,0x05,0x06,0x06,0x06,0x00,0x00,
0xF8,0x08,0x08,0x08,0x08,0x08};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(8, 128, 255, fontpage_8_128_255), // 'Ѐ' -- 'ѿ'
FONTDATA_ITEM(97, 129, 191, fontpage_97_129_191), // 'め' -- 'タ'
FONTDATA_ITEM(97, 193, 255, fontpage_97_193_255), // 'チ' -- 'ヿ'
static const uxg_fontinfo_t g_fontinfo_test[] PROGMEM = {
FONTDATA_ITEM(8, 128, 255, fontpage_8_128_255), // 'Ѐ' -- 'ѿ'
FONTDATA_ITEM(97, 129, 191, fontpage_97_129_191), // 'め' -- 'タ'
FONTDATA_ITEM(97, 193, 255, fontpage_97_193_255), // 'チ' -- 'ヿ'
};

13
Marlin/src/lcd/dogm/fontdata/langdata_tr.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_2_158_159[49] U8G_FONT_SECTION("fontpage_2_158_159") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9E,0x9F,0x00,0x0A,0xFE,0x00,
@ -19,9 +21,8 @@ const u8g_fntpgm_uint8_t fontpage_2_222_223[45] U8G_FONT_SECTION("fontpage_2_222
0x00,0x05,0x09,0x09,0x06,0x00,0xFE,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x10,0x60,
0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x80,0x70,0x08,0xF0,0x10,0x60};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(2, 158, 159, fontpage_2_158_159), // 'Ğ' -- 'ğ'
FONTDATA_ITEM(2, 176, 177, fontpage_2_176_177), // 'İ' -- 'ı'
FONTDATA_ITEM(2, 222, 223, fontpage_2_222_223), // 'Ş' -- 'ş'
static const uxg_fontinfo_t g_fontinfo_tr[] PROGMEM = {
FONTDATA_ITEM(2, 158, 159, fontpage_2_158_159), // 'Ğ' -- 'ğ'
FONTDATA_ITEM(2, 176, 177, fontpage_2_176_177), // 'İ' -- 'ı'
FONTDATA_ITEM(2, 222, 223, fontpage_2_222_223), // 'Ş' -- 'ş'
};

23
Marlin/src/lcd/dogm/fontdata/langdata_uk.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_8_134_134[30] U8G_FONT_SECTION("fontpage_8_134_134") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x07,0x00,0x00,
@ -72,14 +74,13 @@ const u8g_fntpgm_uint8_t fontpage_8_214_215[41] U8G_FONT_SECTION("fontpage_8_214
0x00,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x06,0x06,
0x06,0x01,0x00,0xA0,0x00,0xC0,0x40,0x40,0xE0};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(8, 134, 134, fontpage_8_134_134), // 'І' -- 'І'
FONTDATA_ITEM(8, 144, 169, fontpage_8_144_169), // 'А' -- 'Щ'
FONTDATA_ITEM(8, 172, 172, fontpage_8_172_172), // 'Ь' -- 'Ь'
FONTDATA_ITEM(8, 175, 201, fontpage_8_175_201), // 'Я' -- 'щ'
FONTDATA_ITEM(8, 204, 204, fontpage_8_204_204), // 'ь' -- 'ь'
FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ю' -- 'я'
FONTDATA_ITEM(8, 212, 212, fontpage_8_212_212), // 'є' -- 'є'
FONTDATA_ITEM(8, 214, 215, fontpage_8_214_215), // 'і' -- 'ї'
static const uxg_fontinfo_t g_fontinfo_uk[] PROGMEM = {
FONTDATA_ITEM(8, 134, 134, fontpage_8_134_134), // 'І' -- 'І'
FONTDATA_ITEM(8, 144, 169, fontpage_8_144_169), // 'А' -- 'Щ'
FONTDATA_ITEM(8, 172, 172, fontpage_8_172_172), // 'Ь' -- 'Ь'
FONTDATA_ITEM(8, 175, 201, fontpage_8_175_201), // 'Я' -- 'щ'
FONTDATA_ITEM(8, 204, 204, fontpage_8_204_204), // 'ь' -- 'ь'
FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ю' -- 'я'
FONTDATA_ITEM(8, 212, 212, fontpage_8_212_212), // 'є' -- 'є'
FONTDATA_ITEM(8, 214, 215, fontpage_8_214_215), // 'і' -- 'ї'
};

97
Marlin/src/lcd/dogm/fontdata/langdata_vi.h

@ -3,7 +3,9 @@
* Contents will be REPLACED by future processing!
* Use genallfont.sh to generate font data for updated languages.
*/
#include <U8glib-HAL.h>
#pragma once
#include "langdata.h"
const u8g_fntpgm_uint8_t fontpage_2_131_131[31] U8G_FONT_SECTION("fontpage_2_131_131") = {
0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x08,0x00,0x00,
@ -177,51 +179,50 @@ const u8g_fntpgm_uint8_t fontpage_61_241_241[32] U8G_FONT_SECTION("fontpage_61_2
0x00,0x06,0x09,0x09,0x07,0x00,0xFE,0x0C,0x04,0x88,0x88,0x88,0x88,0x70,0x00,0x20
};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(2, 131, 131, fontpage_2_131_131), // 'ă' -- 'ă'
FONTDATA_ITEM(2, 144, 145, fontpage_2_144_145), // 'Đ' -- 'đ'
FONTDATA_ITEM(2, 169, 169, fontpage_2_169_169), // 'ĩ' -- 'ĩ'
FONTDATA_ITEM(3, 161, 161, fontpage_3_161_161), // 'ơ' -- 'ơ'
FONTDATA_ITEM(3, 175, 176, fontpage_3_175_176), // 'Ư' -- 'ư'
FONTDATA_ITEM(6, 131, 131, fontpage_6_131_131), // '̃' -- '̃'
FONTDATA_ITEM(6, 137, 137, fontpage_6_137_137), // '̉' -- '̉'
FONTDATA_ITEM(6, 163, 163, fontpage_6_163_163), // '̣' -- '̣'
FONTDATA_ITEM(6, 192, 193, fontpage_6_192_193), // '̀' -- '́'
FONTDATA_ITEM(61, 161, 161, fontpage_61_161_161), // 'ạ' -- 'ạ'
FONTDATA_ITEM(61, 163, 163, fontpage_61_163_163), // 'ả' -- 'ả'
FONTDATA_ITEM(61, 165, 165, fontpage_61_165_165), // 'ấ' -- 'ấ'
FONTDATA_ITEM(61, 167, 167, fontpage_61_167_167), // 'ầ' -- 'ầ'
FONTDATA_ITEM(61, 169, 169, fontpage_61_169_169), // 'ẩ' -- 'ẩ'
FONTDATA_ITEM(61, 173, 173, fontpage_61_173_173), // 'ậ' -- 'ậ'
FONTDATA_ITEM(61, 175, 175, fontpage_61_175_175), // 'ắ' -- 'ắ'
FONTDATA_ITEM(61, 177, 177, fontpage_61_177_177), // 'ằ' -- 'ằ'
FONTDATA_ITEM(61, 179, 179, fontpage_61_179_179), // 'ẳ' -- 'ẳ'
FONTDATA_ITEM(61, 181, 181, fontpage_61_181_181), // 'ẵ' -- 'ẵ'
FONTDATA_ITEM(61, 183, 183, fontpage_61_183_183), // 'ặ' -- 'ặ'
FONTDATA_ITEM(61, 191, 191, fontpage_61_191_191), // 'ế' -- 'ế'
FONTDATA_ITEM(61, 193, 193, fontpage_61_193_193), // 'ề' -- 'ề'
FONTDATA_ITEM(61, 195, 195, fontpage_61_195_195), // 'ể' -- 'ể'
FONTDATA_ITEM(61, 199, 199, fontpage_61_199_199), // 'ệ' -- 'ệ'
FONTDATA_ITEM(61, 201, 201, fontpage_61_201_201), // 'ỉ' -- 'ỉ'
FONTDATA_ITEM(61, 203, 203, fontpage_61_203_203), // 'ị' -- 'ị'
FONTDATA_ITEM(61, 205, 205, fontpage_61_205_205), // 'ọ' -- 'ọ'
FONTDATA_ITEM(61, 207, 207, fontpage_61_207_207), // 'ỏ' -- 'ỏ'
FONTDATA_ITEM(61, 209, 209, fontpage_61_209_209), // 'ố' -- 'ố'
FONTDATA_ITEM(61, 211, 211, fontpage_61_211_211), // 'ồ' -- 'ồ'
FONTDATA_ITEM(61, 213, 213, fontpage_61_213_213), // 'ổ' -- 'ổ'
FONTDATA_ITEM(61, 215, 215, fontpage_61_215_215), // 'ỗ' -- 'ỗ'
FONTDATA_ITEM(61, 217, 217, fontpage_61_217_217), // 'ộ' -- 'ộ'
FONTDATA_ITEM(61, 219, 219, fontpage_61_219_219), // 'ớ' -- 'ớ'
FONTDATA_ITEM(61, 221, 221, fontpage_61_221_221), // 'ờ' -- 'ờ'
FONTDATA_ITEM(61, 223, 223, fontpage_61_223_223), // 'ở' -- 'ở'
FONTDATA_ITEM(61, 225, 225, fontpage_61_225_225), // 'ỡ' -- 'ỡ'
FONTDATA_ITEM(61, 227, 227, fontpage_61_227_227), // 'ợ' -- 'ợ'
FONTDATA_ITEM(61, 229, 229, fontpage_61_229_229), // 'ụ' -- 'ụ'
FONTDATA_ITEM(61, 231, 231, fontpage_61_231_231), // 'ủ' -- 'ủ'
FONTDATA_ITEM(61, 233, 233, fontpage_61_233_233), // 'ứ' -- 'ứ'
FONTDATA_ITEM(61, 235, 235, fontpage_61_235_235), // 'ừ' -- 'ừ'
FONTDATA_ITEM(61, 237, 237, fontpage_61_237_237), // 'ử' -- 'ử'
FONTDATA_ITEM(61, 239, 239, fontpage_61_239_239), // 'ữ' -- 'ữ'
FONTDATA_ITEM(61, 241, 241, fontpage_61_241_241), // 'ự' -- 'ự'
static const uxg_fontinfo_t g_fontinfo_vi[] PROGMEM = {
FONTDATA_ITEM(2, 131, 131, fontpage_2_131_131), // 'ă' -- 'ă'
FONTDATA_ITEM(2, 144, 145, fontpage_2_144_145), // 'Đ' -- 'đ'
FONTDATA_ITEM(2, 169, 169, fontpage_2_169_169), // 'ĩ' -- 'ĩ'
FONTDATA_ITEM(3, 161, 161, fontpage_3_161_161), // 'ơ' -- 'ơ'
FONTDATA_ITEM(3, 175, 176, fontpage_3_175_176), // 'Ư' -- 'ư'
FONTDATA_ITEM(6, 131, 131, fontpage_6_131_131), // '̃' -- '̃'
FONTDATA_ITEM(6, 137, 137, fontpage_6_137_137), // '̉' -- '̉'
FONTDATA_ITEM(6, 163, 163, fontpage_6_163_163), // '̣' -- '̣'
FONTDATA_ITEM(6, 192, 193, fontpage_6_192_193), // '̀' -- '́'
FONTDATA_ITEM(61, 161, 161, fontpage_61_161_161), // 'ạ' -- 'ạ'
FONTDATA_ITEM(61, 163, 163, fontpage_61_163_163), // 'ả' -- 'ả'
FONTDATA_ITEM(61, 165, 165, fontpage_61_165_165), // 'ấ' -- 'ấ'
FONTDATA_ITEM(61, 167, 167, fontpage_61_167_167), // 'ầ' -- 'ầ'
FONTDATA_ITEM(61, 169, 169, fontpage_61_169_169), // 'ẩ' -- 'ẩ'
FONTDATA_ITEM(61, 173, 173, fontpage_61_173_173), // 'ậ' -- 'ậ'
FONTDATA_ITEM(61, 175, 175, fontpage_61_175_175), // 'ắ' -- 'ắ'
FONTDATA_ITEM(61, 177, 177, fontpage_61_177_177), // 'ằ' -- 'ằ'
FONTDATA_ITEM(61, 179, 179, fontpage_61_179_179), // 'ẳ' -- 'ẳ'
FONTDATA_ITEM(61, 181, 181, fontpage_61_181_181), // 'ẵ' -- 'ẵ'
FONTDATA_ITEM(61, 183, 183, fontpage_61_183_183), // 'ặ' -- 'ặ'
FONTDATA_ITEM(61, 191, 191, fontpage_61_191_191), // 'ế' -- 'ế'
FONTDATA_ITEM(61, 193, 193, fontpage_61_193_193), // 'ề' -- 'ề'
FONTDATA_ITEM(61, 195, 195, fontpage_61_195_195), // 'ể' -- 'ể'
FONTDATA_ITEM(61, 199, 199, fontpage_61_199_199), // 'ệ' -- 'ệ'
FONTDATA_ITEM(61, 201, 201, fontpage_61_201_201), // 'ỉ' -- 'ỉ'
FONTDATA_ITEM(61, 203, 203, fontpage_61_203_203), // 'ị' -- 'ị'
FONTDATA_ITEM(61, 205, 205, fontpage_61_205_205), // 'ọ' -- 'ọ'
FONTDATA_ITEM(61, 207, 207, fontpage_61_207_207), // 'ỏ' -- 'ỏ'
FONTDATA_ITEM(61, 209, 209, fontpage_61_209_209), // 'ố' -- 'ố'
FONTDATA_ITEM(61, 211, 211, fontpage_61_211_211), // 'ồ' -- 'ồ'
FONTDATA_ITEM(61, 213, 213, fontpage_61_213_213), // 'ổ' -- 'ổ'
FONTDATA_ITEM(61, 215, 215, fontpage_61_215_215), // 'ỗ' -- 'ỗ'
FONTDATA_ITEM(61, 217, 217, fontpage_61_217_217), // 'ộ' -- 'ộ'
FONTDATA_ITEM(61, 219, 219, fontpage_61_219_219), // 'ớ' -- 'ớ'
FONTDATA_ITEM(61, 221, 221, fontpage_61_221_221), // 'ờ' -- 'ờ'
FONTDATA_ITEM(61, 223, 223, fontpage_61_223_223), // 'ở' -- 'ở'
FONTDATA_ITEM(61, 225, 225, fontpage_61_225_225), // 'ỡ' -- 'ỡ'
FONTDATA_ITEM(61, 227, 227, fontpage_61_227_227), // 'ợ' -- 'ợ'
FONTDATA_ITEM(61, 229, 229, fontpage_61_229_229), // 'ụ' -- 'ụ'
FONTDATA_ITEM(61, 231, 231, fontpage_61_231_231), // 'ủ' -- 'ủ'
FONTDATA_ITEM(61, 233, 233, fontpage_61_233_233), // 'ứ' -- 'ứ'
FONTDATA_ITEM(61, 235, 235, fontpage_61_235_235), // 'ừ' -- 'ừ'
FONTDATA_ITEM(61, 237, 237, fontpage_61_237_237), // 'ử' -- 'ử'
FONTDATA_ITEM(61, 239, 239, fontpage_61_239_239), // 'ữ' -- 'ữ'
FONTDATA_ITEM(61, 241, 241, fontpage_61_241_241), // 'ự' -- 'ự'
};

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

Loading…
Cancel
Save