Merge branch 'bugfix-2.0.x' into CrealityDwin2.0_Bleeding
This commit is contained in:
+91
-68
@@ -281,7 +281,7 @@
|
||||
*
|
||||
* Advanced settings can be found in Configuration_adv.h
|
||||
*/
|
||||
#define CONFIGURATION_H_VERSION 02000900
|
||||
#define CONFIGURATION_H_VERSION 02000901
|
||||
|
||||
//===========================================================================
|
||||
//============================= Getting Started =============================
|
||||
@@ -943,6 +943,8 @@
|
||||
//#define PSU_NAME "Power Supply"
|
||||
|
||||
#if ENABLED(PSU_CONTROL)
|
||||
//#define PS_OFF_CONFIRM // Confirm dialog when power off
|
||||
//#define PS_OFF_SOUND // Beep 1s when power off
|
||||
#if ENABLED(PowerShutoffKit)
|
||||
#define PS_ON_PIN 12
|
||||
#define PSU_ACTIVE_STATE HIGH
|
||||
@@ -977,70 +979,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.7kΩ pullup - Normal
|
||||
* -------
|
||||
* 1 : 100kΩ EPCOS - Best choice for EPCOS thermistors
|
||||
* 331 : 100kΩ Same as #1, but 3.3V scaled for MEGA
|
||||
* 332 : 100kΩ Same as #1, but 3.3V scaled for DUE
|
||||
* 2 : 200kΩ ATC Semitec 204GT-2
|
||||
* 202 : 200kΩ Copymaster 3D
|
||||
* 3 : ???Ω Mendel-parts thermistor
|
||||
* 4 : 10kΩ Generic Thermistor !! DO NOT use for a hotend - it gives bad resolution at high temp. !!
|
||||
* 5 : 100kΩ ATC Semitec 104GT-2/104NT-4-R025H42G - Used in ParCan, J-Head, and E3D, SliceEngineering 300°C
|
||||
* 501 : 100kΩ Zonestar - Tronxy X3A
|
||||
* 502 : 100kΩ Zonestar - used by hot bed in Zonestar Průša P802M
|
||||
* 512 : 100kΩ RPW-Ultra hotend
|
||||
* 6 : 100kΩ EPCOS - Not as accurate as table #1 (created using a fluke thermocouple)
|
||||
* 7 : 100kΩ Honeywell 135-104LAG-J01
|
||||
* 71 : 100kΩ Honeywell 135-104LAF-J01
|
||||
* 8 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT
|
||||
* 9 : 100kΩ GE Sensing AL03006-58.2K-97-G1
|
||||
* 10 : 100kΩ RS PRO 198-961
|
||||
* 11 : 100kΩ Keenovo AC silicone mats, most Wanhao i3 machines - beta 3950, 1%
|
||||
* 12 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT (#8) - calibrated for Makibox hot bed
|
||||
* 13 : 100kΩ Hisens up to 300°C - for "Simple ONE" & "All In ONE" hotend - beta 3950, 1%
|
||||
* 15 : 100kΩ Calibrated for JGAurora A5 hotend
|
||||
* 18 : 200kΩ ATC Semitec 204GT-2 Dagoma.Fr - MKS_Base_DKU001327
|
||||
* 22 : 100kΩ GTM32 Pro vB - hotend - 4.7kΩ pullup to 3.3V and 220Ω to analog input
|
||||
* 23 : 100kΩ GTM32 Pro vB - bed - 4.7kΩ pullup to 3.3v and 220Ω to analog input
|
||||
* 30 : 100kΩ Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K - beta 3950
|
||||
* 60 : 100kΩ Maker's Tool Works Kapton Bed Thermistor - beta 3950
|
||||
* 61 : 100kΩ Formbot/Vivedino 350°C Thermistor - beta 3950
|
||||
* 66 : 4.7MΩ Dyze Design High Temperature Thermistor
|
||||
* 67 : 500kΩ SliceEngineering 450°C Thermistor
|
||||
* 70 : 100kΩ bq Hephestos 2
|
||||
* 75 : 100kΩ Generic Silicon Heat Pad with NTC100K MGB18-104F39050L32
|
||||
*
|
||||
* Analog Thermistors - 1kΩ pullup - Atypical, and requires changing out the 4.7kΩ pullup for 1kΩ.
|
||||
* ------- (but gives greater accuracy and more stable PID)
|
||||
* 51 : 100kΩ EPCOS (1kΩ pullup)
|
||||
* 52 : 200kΩ ATC Semitec 204GT-2 (1kΩ pullup)
|
||||
* 55 : 100kΩ ATC Semitec 104GT-2 - Used in ParCan & J-Head (1kΩ pullup)
|
||||
*
|
||||
* Analog Thermistors - 10kΩ pullup - Atypical
|
||||
* -------
|
||||
* 99 : 100kΩ Found on some Wanhao i3 machines with a 10kΩ pull-up resistor
|
||||
*
|
||||
* Analog RTDs (Pt100/Pt1000)
|
||||
* -------
|
||||
* 110 : Pt100 with 1kΩ pullup (atypical)
|
||||
* 147 : Pt100 with 4.7kΩ pullup
|
||||
* 1010 : Pt1000 with 1kΩ pullup (atypical)
|
||||
* 1047 : Pt1000 with 4.7kΩ 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.
|
||||
*
|
||||
*/
|
||||
#if ENABLED(ConfigurableThermistors)
|
||||
#define TEMP_SENSOR_0 1000
|
||||
@@ -1092,7 +1116,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
|
||||
|
||||
@@ -2217,7 +2241,8 @@
|
||||
#define WAIT_FOR_HOTEND // Wait for hotend to heat back up between probes (to improve accuracy & prevent cold extrude)
|
||||
#endif
|
||||
//#define PROBING_FANS_OFF // Turn fans off when probing
|
||||
//#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing
|
||||
//#define PROBING_ESTEPPERS_OFF // Turn all extruder steppers off when probing
|
||||
//#define PROBING_STEPPERS_OFF // Turn all steppers off (unless needed to hold position) when probing (including extruders)
|
||||
//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors
|
||||
|
||||
// Require minimum nozzle and/or bed temperature for probing
|
||||
@@ -2948,15 +2973,13 @@
|
||||
//#define MANUAL_J_HOME_POS 0
|
||||
//#define MANUAL_K_HOME_POS 0
|
||||
|
||||
// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area.
|
||||
//
|
||||
// With this feature enabled:
|
||||
//
|
||||
// - Allow Z homing only after X and Y homing AND stepper drivers still enabled.
|
||||
// - If stepper drivers time out, it will need X and Y homing again before Z homing.
|
||||
// - Move the Z probe (or nozzle) to a defined XY point before Z Homing.
|
||||
// - Prevent Z homing when the Z probe is outside bed area.
|
||||
//
|
||||
/**
|
||||
* Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area.
|
||||
*
|
||||
* - Moves the Z probe (or nozzle) to a defined XY point before Z homing.
|
||||
* - Allows Z homing only when XY positions are known and trusted.
|
||||
* - If stepper drivers sleep, XY homing may be required again before Z homing.
|
||||
*/
|
||||
#if ANY(ABL_EZABL, ABL_NCSW, ABL_BLTOUCH, ABL_TOUCH_MI, NOZZLE_AS_PROBE)
|
||||
#define Z_SAFE_HOMING
|
||||
#endif
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
*
|
||||
* Basic settings can be found in Configuration.h
|
||||
*/
|
||||
#define CONFIGURATION_ADV_H_VERSION 02000900
|
||||
#define CONFIGURATION_ADV_H_VERSION 02000901
|
||||
|
||||
//===========================================================================
|
||||
//============================= Thermal Settings ============================
|
||||
@@ -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
|
||||
@@ -3036,7 +3047,7 @@
|
||||
*
|
||||
* It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
|
||||
*
|
||||
* SPI_ENDSTOPS *** Beta feature! *** TMC2130 Only ***
|
||||
* SPI_ENDSTOPS *** Beta feature! *** TMC2130/TMC5160 Only ***
|
||||
* Poll the driver through SPI to determine load when homing.
|
||||
* Removes the need for a wire from DIAG1 to an endstop pin.
|
||||
*
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -38,8 +38,8 @@
|
||||
#define SPI_CLOCK_MAX SPI_BAUD_PCLK_DIV_2
|
||||
#endif
|
||||
|
||||
#define CS_LOW() WRITE(ONBOARD_SD_CS_PIN, LOW) /* Set OnboardSPI cs low */
|
||||
#define CS_HIGH() WRITE(ONBOARD_SD_CS_PIN, HIGH) /* Set OnboardSPI cs high */
|
||||
#define CS_LOW() WRITE(ONBOARD_SD_CS_PIN, LOW) // Set OnboardSPI cs low
|
||||
#define CS_HIGH() WRITE(ONBOARD_SD_CS_PIN, HIGH) // Set OnboardSPI cs high
|
||||
|
||||
#define FCLK_FAST() ONBOARD_SD_SPI.setClockDivider(SPI_CLOCK_MAX)
|
||||
#define FCLK_SLOW() ONBOARD_SD_SPI.setClockDivider(SPI_BAUD_PCLK_DIV_256)
|
||||
@@ -49,32 +49,32 @@
|
||||
---------------------------------------------------------------------------*/
|
||||
|
||||
/* MMC/SD command */
|
||||
#define CMD0 (0) /* GO_IDLE_STATE */
|
||||
#define CMD1 (1) /* SEND_OP_COND (MMC) */
|
||||
#define ACMD41 (0x80+41) /* SEND_OP_COND (SDC) */
|
||||
#define CMD8 (8) /* SEND_IF_COND */
|
||||
#define CMD9 (9) /* SEND_CSD */
|
||||
#define CMD10 (10) /* SEND_CID */
|
||||
#define CMD12 (12) /* STOP_TRANSMISSION */
|
||||
#define ACMD13 (0x80+13) /* SD_STATUS (SDC) */
|
||||
#define CMD16 (16) /* SET_BLOCKLEN */
|
||||
#define CMD17 (17) /* READ_SINGLE_BLOCK */
|
||||
#define CMD18 (18) /* READ_MULTIPLE_BLOCK */
|
||||
#define CMD23 (23) /* SET_BLOCK_COUNT (MMC) */
|
||||
#define ACMD23 (0x80+23) /* SET_WR_BLK_ERASE_COUNT (SDC) */
|
||||
#define CMD24 (24) /* WRITE_BLOCK */
|
||||
#define CMD25 (25) /* WRITE_MULTIPLE_BLOCK */
|
||||
#define CMD32 (32) /* ERASE_ER_BLK_START */
|
||||
#define CMD33 (33) /* ERASE_ER_BLK_END */
|
||||
#define CMD38 (38) /* ERASE */
|
||||
#define CMD48 (48) /* READ_EXTR_SINGLE */
|
||||
#define CMD49 (49) /* WRITE_EXTR_SINGLE */
|
||||
#define CMD55 (55) /* APP_CMD */
|
||||
#define CMD58 (58) /* READ_OCR */
|
||||
#define CMD0 (0) // GO_IDLE_STATE
|
||||
#define CMD1 (1) // SEND_OP_COND (MMC)
|
||||
#define ACMD41 (0x80+41) // SEND_OP_COND (SDC)
|
||||
#define CMD8 (8) // SEND_IF_COND
|
||||
#define CMD9 (9) // SEND_CSD
|
||||
#define CMD10 (10) // SEND_CID
|
||||
#define CMD12 (12) // STOP_TRANSMISSION
|
||||
#define ACMD13 (0x80+13) // SD_STATUS (SDC)
|
||||
#define CMD16 (16) // SET_BLOCKLEN
|
||||
#define CMD17 (17) // READ_SINGLE_BLOCK
|
||||
#define CMD18 (18) // READ_MULTIPLE_BLOCK
|
||||
#define CMD23 (23) // SET_BLOCK_COUNT (MMC)
|
||||
#define ACMD23 (0x80+23) // SET_WR_BLK_ERASE_COUNT (SDC)
|
||||
#define CMD24 (24) // WRITE_BLOCK
|
||||
#define CMD25 (25) // WRITE_MULTIPLE_BLOCK
|
||||
#define CMD32 (32) // ERASE_ER_BLK_START
|
||||
#define CMD33 (33) // ERASE_ER_BLK_END
|
||||
#define CMD38 (38) // ERASE
|
||||
#define CMD48 (48) // READ_EXTR_SINGLE
|
||||
#define CMD49 (49) // WRITE_EXTR_SINGLE
|
||||
#define CMD55 (55) // APP_CMD
|
||||
#define CMD58 (58) // READ_OCR
|
||||
|
||||
static volatile DSTATUS Stat = STA_NOINIT; /* Physical drive status */
|
||||
static volatile DSTATUS Stat = STA_NOINIT; // Physical drive status
|
||||
static volatile UINT timeout;
|
||||
static BYTE CardType; /* Card type flags */
|
||||
static BYTE CardType; // Card type flags
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* Send/Receive data to the MMC (Platform dependent) */
|
||||
@@ -82,7 +82,7 @@ static BYTE CardType; /* Card type flags */
|
||||
|
||||
/* Exchange a byte */
|
||||
static BYTE xchg_spi (
|
||||
BYTE dat /* Data to send */
|
||||
BYTE dat // Data to send
|
||||
) {
|
||||
BYTE returnByte = ONBOARD_SD_SPI.transfer(dat);
|
||||
return returnByte;
|
||||
@@ -90,18 +90,18 @@ static BYTE xchg_spi (
|
||||
|
||||
/* Receive multiple byte */
|
||||
static void rcvr_spi_multi (
|
||||
BYTE *buff, /* Pointer to data buffer */
|
||||
UINT btr /* Number of bytes to receive (16, 64 or 512) */
|
||||
BYTE *buff, // Pointer to data buffer
|
||||
UINT btr // Number of bytes to receive (16, 64 or 512)
|
||||
) {
|
||||
ONBOARD_SD_SPI.dmaTransfer(0, const_cast<uint8_t*>(buff), btr);
|
||||
}
|
||||
|
||||
#if _DISKIO_WRITE
|
||||
|
||||
/* Send multiple bytes */
|
||||
// Send multiple bytes
|
||||
static void xmit_spi_multi (
|
||||
const BYTE *buff, /* Pointer to the data */
|
||||
UINT btx /* Number of bytes to send (multiple of 16) */
|
||||
const BYTE *buff, // Pointer to the data
|
||||
UINT btx // Number of bytes to send (multiple of 16)
|
||||
) {
|
||||
ONBOARD_SD_SPI.dmaSend(const_cast<uint8_t*>(buff), btx);
|
||||
}
|
||||
@@ -112,16 +112,15 @@ static void rcvr_spi_multi (
|
||||
/* Wait for card ready */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
static int wait_ready ( /* 1:Ready, 0:Timeout */
|
||||
UINT wt /* Timeout [ms] */
|
||||
static int wait_ready ( // 1:Ready, 0:Timeout
|
||||
UINT wt // Timeout [ms]
|
||||
) {
|
||||
BYTE d;
|
||||
|
||||
timeout = millis() + wt;
|
||||
do {
|
||||
d = xchg_spi(0xFF);
|
||||
/* This loop takes a while. Insert rot_rdq() here for multitask environment. */
|
||||
} while (d != 0xFF && (timeout > millis())); /* Wait for card goes ready or timeout */
|
||||
// This loop takes a while. Insert rot_rdq() here for multitask environment.
|
||||
} while (d != 0xFF && (timeout > millis())); // Wait for card goes ready or timeout
|
||||
|
||||
return (d == 0xFF) ? 1 : 0;
|
||||
}
|
||||
@@ -131,21 +130,21 @@ static int wait_ready ( /* 1:Ready, 0:Timeout */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
static void deselect() {
|
||||
CS_HIGH(); /* CS = H */
|
||||
xchg_spi(0xFF); /* Dummy clock (force DO hi-z for multiple slave SPI) */
|
||||
CS_HIGH(); // CS = H
|
||||
xchg_spi(0xFF); // Dummy clock (force DO hi-z for multiple slave SPI)
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* Select card and wait for ready */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
static int select() { /* 1:OK, 0:Timeout */
|
||||
CS_LOW(); /* CS = L */
|
||||
xchg_spi(0xFF); /* Dummy clock (force DO enabled) */
|
||||
static int select() { // 1:OK, 0:Timeout
|
||||
CS_LOW(); // CS = L
|
||||
xchg_spi(0xFF); // Dummy clock (force DO enabled)
|
||||
|
||||
if (wait_ready(500)) return 1; /* Leading busy check: Wait for card ready */
|
||||
if (wait_ready(500)) return 1; // Leading busy check: Wait for card ready
|
||||
|
||||
deselect(); /* Timeout */
|
||||
deselect(); // Timeout
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -153,16 +152,18 @@ static int select() { /* 1:OK, 0:Timeout */
|
||||
/* Control SPI module (Platform dependent) */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
static void power_on() { /* Enable SSP module and attach it to I/O pads */
|
||||
// Enable SSP module and attach it to I/O pads
|
||||
static void sd_power_on() {
|
||||
ONBOARD_SD_SPI.setModule(ONBOARD_SPI_DEVICE);
|
||||
ONBOARD_SD_SPI.begin();
|
||||
ONBOARD_SD_SPI.setBitOrder(MSBFIRST);
|
||||
ONBOARD_SD_SPI.setDataMode(SPI_MODE0);
|
||||
OUT_WRITE(ONBOARD_SD_CS_PIN, HIGH); /* Set CS# high */
|
||||
OUT_WRITE(ONBOARD_SD_CS_PIN, HIGH); // Set CS# high
|
||||
}
|
||||
|
||||
static void power_off() { /* Disable SPI function */
|
||||
select(); /* Wait for card ready */
|
||||
// Disable SPI function
|
||||
static void sd_power_off() {
|
||||
select(); // Wait for card ready
|
||||
deselect();
|
||||
}
|
||||
|
||||
@@ -170,23 +171,23 @@ static void power_off() { /* Disable SPI function */
|
||||
/* Receive a data packet from the MMC */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
static int rcvr_datablock ( /* 1:OK, 0:Error */
|
||||
BYTE *buff, /* Data buffer */
|
||||
UINT btr /* Data block length (byte) */
|
||||
static int rcvr_datablock ( // 1:OK, 0:Error
|
||||
BYTE *buff, // Data buffer
|
||||
UINT btr // Data block length (byte)
|
||||
) {
|
||||
BYTE token;
|
||||
|
||||
timeout = millis() + 200;
|
||||
do { /* Wait for DataStart token in timeout of 200ms */
|
||||
do { // Wait for DataStart token in timeout of 200ms
|
||||
token = xchg_spi(0xFF);
|
||||
/* This loop will take a while. Insert rot_rdq() here for multitask environment. */
|
||||
// This loop will take a while. Insert rot_rdq() here for multitask environment.
|
||||
} while ((token == 0xFF) && (timeout > millis()));
|
||||
if (token != 0xFE) return 0; /* Function fails if invalid DataStart token or timeout */
|
||||
if (token != 0xFE) return 0; // Function fails if invalid DataStart token or timeout
|
||||
|
||||
rcvr_spi_multi(buff, btr); /* Store trailing data to the buffer */
|
||||
xchg_spi(0xFF); xchg_spi(0xFF); /* Discard CRC */
|
||||
rcvr_spi_multi(buff, btr); // Store trailing data to the buffer
|
||||
xchg_spi(0xFF); xchg_spi(0xFF); // Discard CRC
|
||||
|
||||
return 1; /* Function succeeded */
|
||||
return 1; // Function succeeded
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
@@ -195,25 +196,25 @@ static int rcvr_datablock ( /* 1:OK, 0:Error */
|
||||
|
||||
#if _DISKIO_WRITE
|
||||
|
||||
static int xmit_datablock ( /* 1:OK, 0:Failed */
|
||||
const BYTE *buff, /* Ponter to 512 byte data to be sent */
|
||||
BYTE token /* Token */
|
||||
static int xmit_datablock( // 1:OK, 0:Failed
|
||||
const BYTE *buff, // Pointer to 512 byte data to be sent
|
||||
BYTE token // Token
|
||||
) {
|
||||
BYTE resp;
|
||||
|
||||
if (!wait_ready(500)) return 0; /* Leading busy check: Wait for card ready to accept data block */
|
||||
if (!wait_ready(500)) return 0; // Leading busy check: Wait for card ready to accept data block
|
||||
|
||||
xchg_spi(token); /* Send token */
|
||||
if (token == 0xFD) return 1; /* Do not send data if token is StopTran */
|
||||
xchg_spi(token); // Send token
|
||||
if (token == 0xFD) return 1; // Do not send data if token is StopTran
|
||||
|
||||
xmit_spi_multi(buff, 512); /* Data */
|
||||
xchg_spi(0xFF); xchg_spi(0xFF); /* Dummy CRC */
|
||||
xmit_spi_multi(buff, 512); // Data
|
||||
xchg_spi(0xFF); xchg_spi(0xFF); // Dummy CRC
|
||||
|
||||
resp = xchg_spi(0xFF); /* Receive data resp */
|
||||
resp = xchg_spi(0xFF); // Receive data resp
|
||||
|
||||
return (resp & 0x1F) == 0x05 ? 1 : 0; /* Data was accepted or not */
|
||||
return (resp & 0x1F) == 0x05 ? 1 : 0; // Data was accepted or not
|
||||
|
||||
/* Busy check is done at next transmission */
|
||||
// Busy check is done at next transmission
|
||||
}
|
||||
|
||||
#endif // _DISKIO_WRITE
|
||||
@@ -222,43 +223,43 @@ static int rcvr_datablock ( /* 1:OK, 0:Error */
|
||||
/* Send a command packet to the MMC */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
static BYTE send_cmd ( /* Return value: R1 resp (bit7==1:Failed to send) */
|
||||
BYTE cmd, /* Command index */
|
||||
DWORD arg /* Argument */
|
||||
static BYTE send_cmd( // Return value: R1 resp (bit7==1:Failed to send)
|
||||
BYTE cmd, // Command index
|
||||
DWORD arg // Argument
|
||||
) {
|
||||
BYTE n, res;
|
||||
|
||||
if (cmd & 0x80) { /* Send a CMD55 prior to ACMD<n> */
|
||||
if (cmd & 0x80) { // Send a CMD55 prior to ACMD<n>
|
||||
cmd &= 0x7F;
|
||||
res = send_cmd(CMD55, 0);
|
||||
if (res > 1) return res;
|
||||
}
|
||||
|
||||
/* Select the card and wait for ready except to stop multiple block read */
|
||||
// Select the card and wait for ready except to stop multiple block read
|
||||
if (cmd != CMD12) {
|
||||
deselect();
|
||||
if (!select()) return 0xFF;
|
||||
}
|
||||
|
||||
/* Send command packet */
|
||||
xchg_spi(0x40 | cmd); /* Start + command index */
|
||||
xchg_spi((BYTE)(arg >> 24)); /* Argument[31..24] */
|
||||
xchg_spi((BYTE)(arg >> 16)); /* Argument[23..16] */
|
||||
xchg_spi((BYTE)(arg >> 8)); /* Argument[15..8] */
|
||||
xchg_spi((BYTE)arg); /* Argument[7..0] */
|
||||
n = 0x01; /* Dummy CRC + Stop */
|
||||
if (cmd == CMD0) n = 0x95; /* Valid CRC for CMD0(0) */
|
||||
if (cmd == CMD8) n = 0x87; /* Valid CRC for CMD8(0x1AA) */
|
||||
// Send command packet
|
||||
xchg_spi(0x40 | cmd); // Start + command index
|
||||
xchg_spi((BYTE)(arg >> 24)); // Argument[31..24]
|
||||
xchg_spi((BYTE)(arg >> 16)); // Argument[23..16]
|
||||
xchg_spi((BYTE)(arg >> 8)); // Argument[15..8]
|
||||
xchg_spi((BYTE)arg); // Argument[7..0]
|
||||
n = 0x01; // Dummy CRC + Stop
|
||||
if (cmd == CMD0) n = 0x95; // Valid CRC for CMD0(0)
|
||||
if (cmd == CMD8) n = 0x87; // Valid CRC for CMD8(0x1AA)
|
||||
xchg_spi(n);
|
||||
|
||||
/* Receive command resp */
|
||||
if (cmd == CMD12) xchg_spi(0xFF); /* Diacard following one byte when CMD12 */
|
||||
n = 10; /* Wait for response (10 bytes max) */
|
||||
// Receive command response
|
||||
if (cmd == CMD12) xchg_spi(0xFF); // Discard the following byte when CMD12
|
||||
n = 10; // Wait for response (10 bytes max)
|
||||
do
|
||||
res = xchg_spi(0xFF);
|
||||
while ((res & 0x80) && --n);
|
||||
|
||||
return res; /* Return received response */
|
||||
return res; // Return received response
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
@@ -270,49 +271,52 @@ static BYTE send_cmd ( /* Return value: R1 resp (bit7==1:Failed to send) */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
DSTATUS disk_initialize (
|
||||
BYTE drv /* Physical drive number (0) */
|
||||
BYTE drv // Physical drive number (0)
|
||||
) {
|
||||
BYTE n, cmd, ty, ocr[4];
|
||||
|
||||
if (drv) return STA_NOINIT; /* Supports only drive 0 */
|
||||
power_on(); /* Initialize SPI */
|
||||
if (drv) return STA_NOINIT; // Supports only drive 0
|
||||
sd_power_on(); // Initialize SPI
|
||||
|
||||
if (Stat & STA_NODISK) return Stat; /* Is a card existing in the soket? */
|
||||
if (Stat & STA_NODISK) return Stat; // Is a card existing in the soket?
|
||||
|
||||
FCLK_SLOW();
|
||||
for (n = 10; n; n--) xchg_spi(0xFF); /* Send 80 dummy clocks */
|
||||
for (n = 10; n; n--) xchg_spi(0xFF); // Send 80 dummy clocks
|
||||
|
||||
ty = 0;
|
||||
if (send_cmd(CMD0, 0) == 1) { /* Put the card SPI state */
|
||||
timeout = millis() + 1000; /* Initialization timeout = 1 sec */
|
||||
if (send_cmd(CMD8, 0x1AA) == 1) { /* Is the catd SDv2? */
|
||||
for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); /* Get 32 bit return value of R7 resp */
|
||||
if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* Does the card support 2.7-3.6V? */
|
||||
while ((timeout > millis()) && send_cmd(ACMD41, 1UL << 30)) ; /* Wait for end of initialization with ACMD41(HCS) */
|
||||
if ((timeout > millis()) && send_cmd(CMD58, 0) == 0) { /* Check CCS bit in the OCR */
|
||||
if (send_cmd(CMD0, 0) == 1) { // Put the card SPI state
|
||||
timeout = millis() + 1000; // Initialization timeout = 1 sec
|
||||
if (send_cmd(CMD8, 0x1AA) == 1) { // Is the catd SDv2?
|
||||
for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); // Get 32 bit return value of R7 resp
|
||||
if (ocr[2] == 0x01 && ocr[3] == 0xAA) { // Does the card support 2.7-3.6V?
|
||||
while ((timeout > millis()) && send_cmd(ACMD41, 1UL << 30)); // Wait for end of initialization with ACMD41(HCS)
|
||||
if ((timeout > millis()) && send_cmd(CMD58, 0) == 0) { // Check CCS bit in the OCR
|
||||
for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF);
|
||||
ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; /* Check if the card is SDv2 */
|
||||
ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; // Check if the card is SDv2
|
||||
}
|
||||
}
|
||||
} else { /* Not an SDv2 card */
|
||||
if (send_cmd(ACMD41, 0) <= 1) { /* SDv1 or MMCv3? */
|
||||
ty = CT_SD1; cmd = ACMD41; /* SDv1 (ACMD41(0)) */
|
||||
} else {
|
||||
ty = CT_MMC; cmd = CMD1; /* MMCv3 (CMD1(0)) */
|
||||
}
|
||||
else { // Not an SDv2 card
|
||||
if (send_cmd(ACMD41, 0) <= 1) { // SDv1 or MMCv3?
|
||||
ty = CT_SD1; cmd = ACMD41; // SDv1 (ACMD41(0))
|
||||
}
|
||||
while ((timeout > millis()) && send_cmd(cmd, 0)) ; /* Wait for the card leaves idle state */
|
||||
if (!(timeout > millis()) || send_cmd(CMD16, 512) != 0) /* Set block length: 512 */
|
||||
else {
|
||||
ty = CT_MMC; cmd = CMD1; // MMCv3 (CMD1(0))
|
||||
}
|
||||
while ((timeout > millis()) && send_cmd(cmd, 0)); // Wait for the card leaves idle state
|
||||
if (!(timeout > millis()) || send_cmd(CMD16, 512) != 0) // Set block length: 512
|
||||
ty = 0;
|
||||
}
|
||||
}
|
||||
CardType = ty; /* Card type */
|
||||
CardType = ty; // Card type
|
||||
deselect();
|
||||
|
||||
if (ty) { /* OK */
|
||||
FCLK_FAST(); /* Set fast clock */
|
||||
Stat &= ~STA_NOINIT; /* Clear STA_NOINIT flag */
|
||||
} else { /* Failed */
|
||||
power_off();
|
||||
if (ty) { // OK
|
||||
FCLK_FAST(); // Set fast clock
|
||||
Stat &= ~STA_NOINIT; // Clear STA_NOINIT flag
|
||||
}
|
||||
else { // Failed
|
||||
sd_power_off();
|
||||
Stat = STA_NOINIT;
|
||||
}
|
||||
|
||||
@@ -324,10 +328,10 @@ DSTATUS disk_initialize (
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
DSTATUS disk_status (
|
||||
BYTE drv /* Physical drive number (0) */
|
||||
BYTE drv // Physical drive number (0)
|
||||
) {
|
||||
if (drv) return STA_NOINIT; /* Supports only drive 0 */
|
||||
return Stat; /* Return disk status */
|
||||
if (drv) return STA_NOINIT; // Supports only drive 0
|
||||
return Stat; // Return disk status
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
@@ -335,28 +339,28 @@ DSTATUS disk_status (
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
DRESULT disk_read (
|
||||
BYTE drv, /* Physical drive number (0) */
|
||||
BYTE *buff, /* Pointer to the data buffer to store read data */
|
||||
DWORD sector, /* Start sector number (LBA) */
|
||||
UINT count /* Number of sectors to read (1..128) */
|
||||
BYTE drv, // Physical drive number (0)
|
||||
BYTE *buff, // Pointer to the data buffer to store read data
|
||||
DWORD sector, // Start sector number (LBA)
|
||||
UINT count // Number of sectors to read (1..128)
|
||||
) {
|
||||
BYTE cmd;
|
||||
|
||||
if (drv || !count) return RES_PARERR; /* Check parameter */
|
||||
if (Stat & STA_NOINIT) return RES_NOTRDY; /* Check if drive is ready */
|
||||
if (!(CardType & CT_BLOCK)) sector *= 512; /* LBA ot BA conversion (byte addressing cards) */
|
||||
if (drv || !count) return RES_PARERR; // Check parameter
|
||||
if (Stat & STA_NOINIT) return RES_NOTRDY; // Check if drive is ready
|
||||
if (!(CardType & CT_BLOCK)) sector *= 512; // LBA ot BA conversion (byte addressing cards)
|
||||
FCLK_FAST();
|
||||
cmd = count > 1 ? CMD18 : CMD17; /* READ_MULTIPLE_BLOCK : READ_SINGLE_BLOCK */
|
||||
cmd = count > 1 ? CMD18 : CMD17; // READ_MULTIPLE_BLOCK : READ_SINGLE_BLOCK
|
||||
if (send_cmd(cmd, sector) == 0) {
|
||||
do {
|
||||
if (!rcvr_datablock(buff, 512)) break;
|
||||
buff += 512;
|
||||
} while (--count);
|
||||
if (cmd == CMD18) send_cmd(CMD12, 0); /* STOP_TRANSMISSION */
|
||||
if (cmd == CMD18) send_cmd(CMD12, 0); // STOP_TRANSMISSION
|
||||
}
|
||||
deselect();
|
||||
|
||||
return count ? RES_ERROR : RES_OK; /* Return result */
|
||||
return count ? RES_ERROR : RES_OK; // Return result
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
@@ -366,36 +370,36 @@ DRESULT disk_read (
|
||||
#if _DISKIO_WRITE
|
||||
|
||||
DRESULT disk_write(
|
||||
BYTE drv, /* Physical drive number (0) */
|
||||
const BYTE *buff, /* Ponter to the data to write */
|
||||
DWORD sector, /* Start sector number (LBA) */
|
||||
UINT count /* Number of sectors to write (1..128) */
|
||||
BYTE drv, // Physical drive number (0)
|
||||
const BYTE *buff, // Pointer to the data to write
|
||||
DWORD sector, // Start sector number (LBA)
|
||||
UINT count // Number of sectors to write (1..128)
|
||||
) {
|
||||
if (drv || !count) return RES_PARERR; /* Check parameter */
|
||||
if (Stat & STA_NOINIT) return RES_NOTRDY; /* Check drive status */
|
||||
if (Stat & STA_PROTECT) return RES_WRPRT; /* Check write protect */
|
||||
if (drv || !count) return RES_PARERR; // Check parameter
|
||||
if (Stat & STA_NOINIT) return RES_NOTRDY; // Check drive status
|
||||
if (Stat & STA_PROTECT) return RES_WRPRT; // Check write protect
|
||||
FCLK_FAST();
|
||||
if (!(CardType & CT_BLOCK)) sector *= 512; /* LBA ==> BA conversion (byte addressing cards) */
|
||||
if (!(CardType & CT_BLOCK)) sector *= 512; // LBA ==> BA conversion (byte addressing cards)
|
||||
|
||||
if (count == 1) { /* Single sector write */
|
||||
if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */
|
||||
if (count == 1) { // Single sector write
|
||||
if ((send_cmd(CMD24, sector) == 0) // WRITE_BLOCK
|
||||
&& xmit_datablock(buff, 0xFE)) {
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
else { /* Multiple sector write */
|
||||
if (CardType & CT_SDC) send_cmd(ACMD23, count); /* Predefine number of sectors */
|
||||
if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */
|
||||
else { // Multiple sector write
|
||||
if (CardType & CT_SDC) send_cmd(ACMD23, count); // Predefine number of sectors
|
||||
if (send_cmd(CMD25, sector) == 0) { // WRITE_MULTIPLE_BLOCK
|
||||
do {
|
||||
if (!xmit_datablock(buff, 0xFC)) break;
|
||||
buff += 512;
|
||||
} while (--count);
|
||||
if (!xmit_datablock(0, 0xFD)) count = 1; /* STOP_TRAN token */
|
||||
if (!xmit_datablock(0, 0xFD)) count = 1; // STOP_TRAN token
|
||||
}
|
||||
}
|
||||
deselect();
|
||||
|
||||
return count ? RES_ERROR : RES_OK; /* Return result */
|
||||
return count ? RES_ERROR : RES_OK; // Return result
|
||||
}
|
||||
|
||||
#endif // _DISKIO_WRITE
|
||||
@@ -407,9 +411,9 @@ DRESULT disk_read (
|
||||
#if _DISKIO_IOCTL
|
||||
|
||||
DRESULT disk_ioctl (
|
||||
BYTE drv, /* Physical drive number (0) */
|
||||
BYTE cmd, /* Control command code */
|
||||
void *buff /* Pointer to the conrtol data */
|
||||
BYTE drv, // Physical drive number (0)
|
||||
BYTE cmd, // Control command code
|
||||
void *buff // Pointer to the conrtol data
|
||||
) {
|
||||
DRESULT res;
|
||||
BYTE n, csd[16], *ptr = (BYTE *)buff;
|
||||
@@ -420,22 +424,23 @@ DRESULT disk_read (
|
||||
UINT dc;
|
||||
#endif
|
||||
|
||||
if (drv) return RES_PARERR; /* Check parameter */
|
||||
if (Stat & STA_NOINIT) return RES_NOTRDY; /* Check if drive is ready */
|
||||
if (drv) return RES_PARERR; // Check parameter
|
||||
if (Stat & STA_NOINIT) return RES_NOTRDY; // Check if drive is ready
|
||||
|
||||
res = RES_ERROR;
|
||||
FCLK_FAST();
|
||||
switch (cmd) {
|
||||
case CTRL_SYNC: /* Wait for end of internal write process of the drive */
|
||||
case CTRL_SYNC: // Wait for end of internal write process of the drive
|
||||
if (select()) res = RES_OK;
|
||||
break;
|
||||
|
||||
case GET_SECTOR_COUNT: /* Get drive capacity in unit of sector (DWORD) */
|
||||
case GET_SECTOR_COUNT: // Get drive capacity in unit of sector (DWORD)
|
||||
if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) {
|
||||
if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */
|
||||
if ((csd[0] >> 6) == 1) { // SDC ver 2.00
|
||||
csize = csd[9] + ((WORD)csd[8] << 8) + ((DWORD)(csd[7] & 63) << 16) + 1;
|
||||
*(DWORD*)buff = csize << 10;
|
||||
} else { /* SDC ver 1.XX or MMC ver 3 */
|
||||
}
|
||||
else { // SDC ver 1.XX or MMC ver 3
|
||||
n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;
|
||||
csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1;
|
||||
*(DWORD*)buff = csize << (n - 9);
|
||||
@@ -444,21 +449,23 @@ DRESULT disk_read (
|
||||
}
|
||||
break;
|
||||
|
||||
case GET_BLOCK_SIZE: /* Get erase block size in unit of sector (DWORD) */
|
||||
if (CardType & CT_SD2) { /* SDC ver 2.00 */
|
||||
if (send_cmd(ACMD13, 0) == 0) { /* Read SD status */
|
||||
case GET_BLOCK_SIZE: // Get erase block size in unit of sector (DWORD)
|
||||
if (CardType & CT_SD2) { // SDC ver 2.00
|
||||
if (send_cmd(ACMD13, 0) == 0) { // Read SD status
|
||||
xchg_spi(0xFF);
|
||||
if (rcvr_datablock(csd, 16)) { /* Read partial block */
|
||||
for (n = 64 - 16; n; n--) xchg_spi(0xFF); /* Purge trailing data */
|
||||
if (rcvr_datablock(csd, 16)) { // Read partial block
|
||||
for (n = 64 - 16; n; n--) xchg_spi(0xFF); // Purge trailing data
|
||||
*(DWORD*)buff = 16UL << (csd[10] >> 4);
|
||||
res = RES_OK;
|
||||
}
|
||||
}
|
||||
} else { /* SDC ver 1.XX or MMC */
|
||||
if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { /* Read CSD */
|
||||
if (CardType & CT_SD1) { /* SDC ver 1.XX */
|
||||
}
|
||||
else { // SDC ver 1.XX or MMC
|
||||
if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { // Read CSD
|
||||
if (CardType & CT_SD1) { // SDC ver 1.XX
|
||||
*(DWORD*)buff = (((csd[10] & 63) << 1) + ((WORD)(csd[11] & 128) >> 7) + 1) << ((csd[13] >> 6) - 1);
|
||||
} else { /* MMC */
|
||||
}
|
||||
else { // MMC
|
||||
*(DWORD*)buff = ((WORD)((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) << 3) + ((csd[11] & 224) >> 5) + 1);
|
||||
}
|
||||
res = RES_OK;
|
||||
@@ -466,47 +473,47 @@ DRESULT disk_read (
|
||||
}
|
||||
break;
|
||||
|
||||
case CTRL_TRIM: /* Erase a block of sectors (used when _USE_TRIM in ffconf.h is 1) */
|
||||
if (!(CardType & CT_SDC)) break; /* Check if the card is SDC */
|
||||
if (disk_ioctl(drv, MMC_GET_CSD, csd)) break; /* Get CSD */
|
||||
if (!(csd[0] >> 6) && !(csd[10] & 0x40)) break; /* Check if sector erase can be applied to the card */
|
||||
dp = (DWORD *)buff; st = dp[0]; ed = dp[1]; /* Load sector block */
|
||||
case CTRL_TRIM: // Erase a block of sectors (used when _USE_TRIM in ffconf.h is 1)
|
||||
if (!(CardType & CT_SDC)) break; // Check if the card is SDC
|
||||
if (disk_ioctl(drv, MMC_GET_CSD, csd)) break; // Get CSD
|
||||
if (!(csd[0] >> 6) && !(csd[10] & 0x40)) break; // Check if sector erase can be applied to the card
|
||||
dp = (DWORD *)buff; st = dp[0]; ed = dp[1]; // Load sector block
|
||||
if (!(CardType & CT_BLOCK)) {
|
||||
st *= 512; ed *= 512;
|
||||
}
|
||||
if (send_cmd(CMD32, st) == 0 && send_cmd(CMD33, ed) == 0 && send_cmd(CMD38, 0) == 0 && wait_ready(30000)) { /* Erase sector block */
|
||||
res = RES_OK; /* FatFs does not check result of this command */
|
||||
if (send_cmd(CMD32, st) == 0 && send_cmd(CMD33, ed) == 0 && send_cmd(CMD38, 0) == 0 && wait_ready(30000)) { // Erase sector block
|
||||
res = RES_OK; // FatFs does not check result of this command
|
||||
}
|
||||
break;
|
||||
|
||||
/* Following commands are never used by FatFs module */
|
||||
// The following commands are never used by FatFs module
|
||||
|
||||
case MMC_GET_TYPE: /* Get MMC/SDC type (BYTE) */
|
||||
case MMC_GET_TYPE: // Get MMC/SDC type (BYTE)
|
||||
*ptr = CardType;
|
||||
res = RES_OK;
|
||||
break;
|
||||
|
||||
case MMC_GET_CSD: /* Read CSD (16 bytes) */
|
||||
if (send_cmd(CMD9, 0) == 0 && rcvr_datablock(ptr, 16)) { /* READ_CSD */
|
||||
case MMC_GET_CSD: // Read CSD (16 bytes)
|
||||
if (send_cmd(CMD9, 0) == 0 && rcvr_datablock(ptr, 16)) {
|
||||
res = RES_OK;
|
||||
}
|
||||
break;
|
||||
|
||||
case MMC_GET_CID: /* Read CID (16 bytes) */
|
||||
if (send_cmd(CMD10, 0) == 0 && rcvr_datablock(ptr, 16)) { /* READ_CID */
|
||||
case MMC_GET_CID: // Read CID (16 bytes)
|
||||
if (send_cmd(CMD10, 0) == 0 && rcvr_datablock(ptr, 16)) {
|
||||
res = RES_OK;
|
||||
}
|
||||
break;
|
||||
|
||||
case MMC_GET_OCR: /* Read OCR (4 bytes) */
|
||||
if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */
|
||||
case MMC_GET_OCR: // Read OCR (4 bytes)
|
||||
if (send_cmd(CMD58, 0) == 0) {
|
||||
for (n = 4; n; n--) *ptr++ = xchg_spi(0xFF);
|
||||
res = RES_OK;
|
||||
}
|
||||
break;
|
||||
|
||||
case MMC_GET_SDSTAT: /* Read SD status (64 bytes) */
|
||||
if (send_cmd(ACMD13, 0) == 0) { /* SD_STATUS */
|
||||
case MMC_GET_SDSTAT: // Read SD status (64 bytes)
|
||||
if (send_cmd(ACMD13, 0) == 0) {
|
||||
xchg_spi(0xFF);
|
||||
if (rcvr_datablock(ptr, 64)) res = RES_OK;
|
||||
}
|
||||
|
||||
@@ -617,7 +617,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
|
||||
|
||||
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());
|
||||
|
||||
@@ -1169,10 +1169,10 @@ void setup() {
|
||||
|
||||
// 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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ enum AxisEnum : uint8_t {
|
||||
#undef _EN_ITEM
|
||||
|
||||
// Core also keeps toolhead directions
|
||||
#if IS_CORE
|
||||
#if EITHER(IS_CORE, MARKFORGED_XY)
|
||||
, X_HEAD, Y_HEAD, Z_HEAD
|
||||
#endif
|
||||
|
||||
|
||||
@@ -85,10 +85,16 @@ void StepperDAC::print_values() {
|
||||
if (!dac_present) return;
|
||||
SERIAL_ECHO_MSG("Stepper current values in % (Amps):");
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOPAIR_P( SP_X_LBL, dac_perc(X_AXIS), PSTR(" ("), dac_amps(X_AXIS), PSTR(")"));
|
||||
SERIAL_ECHOPAIR_P( SP_Y_LBL, dac_perc(Y_AXIS), PSTR(" ("), dac_amps(Y_AXIS), PSTR(")"));
|
||||
SERIAL_ECHOPAIR_P( SP_Z_LBL, dac_perc(Z_AXIS), PSTR(" ("), dac_amps(Z_AXIS), PSTR(")"));
|
||||
SERIAL_ECHOLNPAIR_P(SP_E_LBL, dac_perc(E_AXIS), PSTR(" ("), dac_amps(E_AXIS), PSTR(")"));
|
||||
SERIAL_ECHOPAIR_P(SP_X_LBL, dac_perc(X_AXIS), PSTR(" ("), dac_amps(X_AXIS), PSTR(")"));
|
||||
#if HAS_Y_AXIS
|
||||
SERIAL_ECHOPAIR_P(SP_Y_LBL, dac_perc(Y_AXIS), PSTR(" ("), dac_amps(Y_AXIS), PSTR(")"));
|
||||
#endif
|
||||
#if HAS_Z_AXIS
|
||||
SERIAL_ECHOPAIR_P(SP_Z_LBL, dac_perc(Z_AXIS), PSTR(" ("), dac_amps(Z_AXIS), PSTR(")"));
|
||||
#endif
|
||||
#if HAS_EXTRUDERS
|
||||
SERIAL_ECHOLNPAIR_P(SP_E_LBL, dac_perc(E_AXIS), PSTR(" ("), dac_amps(E_AXIS), PSTR(")"));
|
||||
#endif
|
||||
}
|
||||
|
||||
void StepperDAC::commit_eeprom() {
|
||||
|
||||
@@ -114,7 +114,6 @@ public:
|
||||
#if CONJOINED_NEOPIXEL
|
||||
adaneo2.show();
|
||||
#else
|
||||
IF_DISABLED(NEOPIXEL2_SEPARATE, adaneo1.setPin(NEOPIXEL2_PIN));
|
||||
adaneo1.show();
|
||||
adaneo1.setPin(NEOPIXEL_PIN);
|
||||
#endif
|
||||
|
||||
@@ -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
|
||||
@@ -81,7 +88,10 @@ bool Power::is_power_needed() {
|
||||
#endif
|
||||
) return true;
|
||||
|
||||
HOTEND_LOOP() if (thermalManager.degTargetHotend(e) > 0 || thermalManager.temp_hotend[e].soft_pwm_amount > 0) return true;
|
||||
#if HAS_HOTEND
|
||||
HOTEND_LOOP() if (thermalManager.degTargetHotend(e) > 0 || thermalManager.temp_hotend[e].soft_pwm_amount > 0) return true;
|
||||
#endif
|
||||
|
||||
if (TERN0(HAS_HEATED_BED, thermalManager.degTargetBed() > 0 || thermalManager.temp_bed.soft_pwm_amount > 0)) return true;
|
||||
|
||||
#if HAS_HOTEND && AUTO_POWER_E_TEMP
|
||||
@@ -103,20 +113,29 @@ 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 ms = millis();
|
||||
if (ELAPSED(ms, nextPowerCheck)) {
|
||||
nextPowerCheck = ms + 2500UL;
|
||||
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())
|
||||
power_on();
|
||||
else if (!lastPowerOn || (POWER_TIMEOUT > 0 && ELAPSED(ms, lastPowerOn + SEC_TO_MS(POWER_TIMEOUT))))
|
||||
else if (!lastPowerOn || (POWER_TIMEOUT > 0 && ELAPSED(now, lastPowerOn + SEC_TO_MS(POWER_TIMEOUT))))
|
||||
power_off();
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
@@ -133,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();
|
||||
}
|
||||
}
|
||||
@@ -140,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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -361,10 +361,10 @@ void test_tmc_connection(LOGICAL_AXIS_DECL(const bool, true));
|
||||
extern millis_t sg_guard_period;
|
||||
constexpr uint16_t default_sg_guard_duration = 400;
|
||||
|
||||
struct slow_homing_t {
|
||||
struct motion_state_t {
|
||||
xy_ulong_t acceleration;
|
||||
#if ENABLED(HAS_CLASSIC_JERK)
|
||||
xy_float_t jerk_xy;
|
||||
xy_float_t jerk_state;
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -291,7 +291,7 @@ typedef struct {
|
||||
if (p2.x < 0 || p2.x >= (GRID_MAX_POINTS_X)) return;
|
||||
if (p2.y < 0 || p2.y >= (GRID_MAX_POINTS_Y)) return;
|
||||
|
||||
if(circle_flags.marked(p1.x, p1.y) && circle_flags.marked(p2.x, p2.y)) {
|
||||
if (circle_flags.marked(p1.x, p1.y) && circle_flags.marked(p2.x, p2.y)) {
|
||||
xyz_pos_t s, e;
|
||||
s.x = _GET_MESH_X(p1.x) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)) * dx;
|
||||
e.x = _GET_MESH_X(p2.x) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)) * dx;
|
||||
|
||||
@@ -164,24 +164,24 @@
|
||||
|
||||
#if ENABLED(IMPROVE_HOMING_RELIABILITY)
|
||||
|
||||
slow_homing_t begin_slow_homing() {
|
||||
slow_homing_t slow_homing{0};
|
||||
slow_homing.acceleration.set(planner.settings.max_acceleration_mm_per_s2[X_AXIS],
|
||||
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[X_AXIS] = 100;
|
||||
planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = 100;
|
||||
#if HAS_CLASSIC_JERK
|
||||
slow_homing.jerk_xy = planner.max_jerk;
|
||||
motion_state.jerk_state = planner.max_jerk;
|
||||
planner.max_jerk.set(0, 0);
|
||||
#endif
|
||||
planner.reset_acceleration_rates();
|
||||
return slow_homing;
|
||||
return motion_state;
|
||||
}
|
||||
|
||||
void end_slow_homing(const slow_homing_t &slow_homing) {
|
||||
planner.settings.max_acceleration_mm_per_s2[X_AXIS] = slow_homing.acceleration.x;
|
||||
planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = slow_homing.acceleration.y;
|
||||
TERN_(HAS_CLASSIC_JERK, planner.max_jerk = slow_homing.jerk_xy);
|
||||
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_(HAS_CLASSIC_JERK, planner.max_jerk = motion_state.jerk_state);
|
||||
planner.reset_acceleration_rates();
|
||||
}
|
||||
|
||||
@@ -289,7 +289,9 @@ void GcodeSuite::G28() {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
TERN_(IMPROVE_HOMING_RELIABILITY, slow_homing_t slow_homing = begin_slow_homing());
|
||||
#if ENABLED(IMPROVE_HOMING_RELIABILITY)
|
||||
motion_state_t saved_motion_state = begin_slow_homing();
|
||||
#endif
|
||||
|
||||
// Always home with tool 0 active
|
||||
#if HAS_MULTI_HOTEND
|
||||
@@ -315,7 +317,7 @@ void GcodeSuite::G28() {
|
||||
|
||||
home_delta();
|
||||
|
||||
TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing));
|
||||
TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(saved_motion_state));
|
||||
|
||||
#elif ENABLED(AXEL_TPARA)
|
||||
|
||||
@@ -401,7 +403,7 @@ void GcodeSuite::G28() {
|
||||
if (DISABLED(HOME_Y_BEFORE_X) && doY)
|
||||
homeaxis(Y_AXIS);
|
||||
|
||||
TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing));
|
||||
TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(saved_motion_state));
|
||||
|
||||
// Home Z last if homing towards the bed
|
||||
#if HAS_Z_AXIS && DISABLED(HOME_Z_FIRST)
|
||||
@@ -440,7 +442,7 @@ void GcodeSuite::G28() {
|
||||
|
||||
if (idex_is_duplicating()) {
|
||||
|
||||
TERN_(IMPROVE_HOMING_RELIABILITY, slow_homing = begin_slow_homing());
|
||||
TERN_(IMPROVE_HOMING_RELIABILITY, saved_motion_state = begin_slow_homing());
|
||||
|
||||
// Always home the 2nd (right) extruder first
|
||||
active_extruder = 1;
|
||||
@@ -459,7 +461,7 @@ void GcodeSuite::G28() {
|
||||
dual_x_carriage_mode = IDEX_saved_mode;
|
||||
set_duplication_enabled(IDEX_saved_duplication_state);
|
||||
|
||||
TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing));
|
||||
TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(saved_motion_state));
|
||||
}
|
||||
|
||||
#endif // DUAL_X_CARRIAGE
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -71,29 +71,27 @@
|
||||
#endif
|
||||
#if ENABLED(Z_MULTI_ENDSTOPS)
|
||||
if (parser.seenval('Z')) {
|
||||
#if NUM_Z_STEPPER_DRIVERS >= 3
|
||||
const float z_adj = parser.value_linear_units();
|
||||
const int ind = parser.intval('S');
|
||||
if (!ind || ind == 2) endstops.z2_endstop_adj = z_adj;
|
||||
if (!ind || ind == 3) endstops.z3_endstop_adj = z_adj;
|
||||
#if NUM_Z_STEPPER_DRIVERS >= 4
|
||||
if (!ind || ind == 4) endstops.z4_endstop_adj = z_adj;
|
||||
#endif
|
||||
const float z_adj = parser.value_linear_units();
|
||||
#if NUM_Z_STEPPER_DRIVERS == 2
|
||||
endstops.z2_endstop_adj = z_adj;
|
||||
#else
|
||||
endstops.z2_endstop_adj = parser.value_linear_units();
|
||||
const int ind = parser.intval('S');
|
||||
#define _SET_ZADJ(N) if (!ind || ind == N) endstops.z##N##_endstop_adj = z_adj;
|
||||
REPEAT_S(2, INCREMENT(NUM_Z_STEPPER_DRIVERS), _SET_ZADJ)
|
||||
#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)
|
||||
SERIAL_ECHOPAIR(" X2:", endstops.x2_endstop_adj);
|
||||
echo_adj(PSTR(" X2:"), endstops.x2_endstop_adj);
|
||||
#endif
|
||||
#if ENABLED(Y_DUAL_ENDSTOPS)
|
||||
SERIAL_ECHOPAIR(" Y2:", endstops.y2_endstop_adj);
|
||||
echo_adj(PSTR(" Y2:"), endstops.y2_endstop_adj);
|
||||
#endif
|
||||
#if ENABLED(Z_MULTI_ENDSTOPS)
|
||||
#define _ECHO_ZADJ(N) SERIAL_ECHOPAIR(" Z" STRINGIFY(N) ":", endstops.z##N##_endstop_adj);
|
||||
#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();
|
||||
|
||||
@@ -32,31 +32,6 @@
|
||||
#define DEBUG_OUT ENABLED(L6470_CHITCHAT)
|
||||
#include "../../../core/debug_out.h"
|
||||
|
||||
/**
|
||||
* M906: report or set KVAL_HOLD which sets the maximum effective voltage provided by the
|
||||
* PWMs to the steppers
|
||||
*
|
||||
* On L6474 this sets the TVAL register (same address).
|
||||
*
|
||||
* I - select which driver(s) to change on multi-driver axis
|
||||
* 0 - (default) all drivers on the axis or E0
|
||||
* 1 - monitor only X, Y, Z or E1
|
||||
* 2 - monitor only X2, Y2, Z2 or E2
|
||||
* 3 - monitor only Z3 or E3
|
||||
* 4 - monitor only Z4 or E4
|
||||
* 5 - monitor only E5
|
||||
* Xxxx, Yxxx, Zxxx, Exxx - axis to change (optional)
|
||||
* L6474 - current in mA (4A max)
|
||||
* All others - 0-255
|
||||
*/
|
||||
|
||||
/**
|
||||
* Sets KVAL_HOLD wich affects the current being driven through the stepper.
|
||||
*
|
||||
* L6470 is used in the STEP-CLOCK mode. KVAL_HOLD is the only KVAL_xxx
|
||||
* that affects the effective voltage seen by the stepper.
|
||||
*/
|
||||
|
||||
/**
|
||||
* MACRO to fetch information on the items associated with current limiting
|
||||
* and maximum voltage output.
|
||||
@@ -220,6 +195,28 @@ void L64XX_report_current(L64XX &motor, const L64XX_axis_t axis) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* M906: report or set KVAL_HOLD which sets the maximum effective voltage provided by the
|
||||
* PWMs to the steppers
|
||||
*
|
||||
* On L6474 this sets the TVAL register (same address).
|
||||
*
|
||||
* I - select which driver(s) to change on multi-driver axis
|
||||
* 0 - (default) all drivers on the axis or E0
|
||||
* 1 - monitor only X, Y, Z or E1
|
||||
* 2 - monitor only X2, Y2, Z2 or E2
|
||||
* 3 - monitor only Z3 or E3
|
||||
* 4 - monitor only Z4 or E4
|
||||
* 5 - monitor only E5
|
||||
* Xxxx, Yxxx, Zxxx, Exxx - axis to change (optional)
|
||||
* L6474 - current in mA (4A max)
|
||||
* All others - 0-255
|
||||
*
|
||||
* Sets KVAL_HOLD wich affects the current being driven through the stepper.
|
||||
*
|
||||
* L6470 is used in the STEP-CLOCK mode. KVAL_HOLD is the only KVAL_xxx
|
||||
* that affects the effective voltage seen by the stepper.
|
||||
*/
|
||||
void GcodeSuite::M906() {
|
||||
|
||||
L64xxManager.pause_monitor(true); // Keep monitor_driver() from stealing status
|
||||
@@ -281,11 +278,11 @@ void GcodeSuite::M906() {
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if HAS_EXTRUDERS
|
||||
#if E_STEPPERS
|
||||
case E_AXIS: {
|
||||
const int8_t target_extruder = get_target_extruder_from_command();
|
||||
if (target_extruder < 0) return;
|
||||
switch (target_extruder) {
|
||||
const int8_t target_e_stepper = get_target_e_stepper_from_command();
|
||||
if (target_e_stepper < 0) return;
|
||||
switch (target_e_stepper) {
|
||||
#if AXIS_IS_L64XX(E0)
|
||||
case 0: L6470_SET_KVAL_HOLD(E0); break;
|
||||
#endif
|
||||
|
||||
@@ -52,14 +52,16 @@
|
||||
* M150 I1 R ; Set NEOPIXEL index 1 to red
|
||||
* M150 S1 I1 R ; Set SEPARATE index 1 to red
|
||||
*/
|
||||
|
||||
void GcodeSuite::M150() {
|
||||
#if ENABLED(NEOPIXEL_LED)
|
||||
const uint8_t index = parser.intval('I', -1);
|
||||
const int8_t index = parser.intval('I', -1);
|
||||
#if ENABLED(NEOPIXEL2_SEPARATE)
|
||||
const uint8_t unit = parser.intval('S'),
|
||||
brightness = unit ? neo2.brightness() : neo.brightness();
|
||||
*(unit ? &neo2.neoindex : &neo.neoindex) = index;
|
||||
int8_t brightness, unit = parser.intval('S', -1);
|
||||
switch (unit) {
|
||||
case -1: neo2.neoindex = index; // fall-thru
|
||||
case 0: neo.neoindex = index; brightness = neo.brightness(); break;
|
||||
case 1: neo2.neoindex = index; brightness = neo2.brightness(); break;
|
||||
}
|
||||
#else
|
||||
const uint8_t brightness = neo.brightness();
|
||||
neo.neoindex = index;
|
||||
@@ -75,10 +77,15 @@ void GcodeSuite::M150() {
|
||||
);
|
||||
|
||||
#if ENABLED(NEOPIXEL2_SEPARATE)
|
||||
if (unit == 1) { leds2.set_color(color); return; }
|
||||
switch (unit) {
|
||||
case 0: leds.set_color(color); return;
|
||||
case 1: leds2.set_color(color); return;
|
||||
}
|
||||
#endif
|
||||
|
||||
// If 'S' is not specified use both
|
||||
leds.set_color(color);
|
||||
TERN_(NEOPIXEL2_SEPARATE, leds2.set_color(color));
|
||||
}
|
||||
|
||||
#endif // HAS_COLOR_LEDS
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
*/
|
||||
void GcodeSuite::M125() {
|
||||
// Initial retract before move to filament change position
|
||||
const float retract = -ABS(parser.axisunitsval('L', E_AXIS, PAUSE_PARK_RETRACT_LENGTH));
|
||||
const float retract = TERN0(HAS_EXTRUDERS, -ABS(parser.axisunitsval('L', E_AXIS, PAUSE_PARK_RETRACT_LENGTH)));
|
||||
|
||||
xyz_pos_t park_point = NOZZLE_PARK_POINT;
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ void tmc_set_stealthChop(TMC &st, const bool enable) {
|
||||
st.refresh_stepping_mode();
|
||||
}
|
||||
|
||||
static void set_stealth_status(const bool enable, const int8_t target_extruder) {
|
||||
static void set_stealth_status(const bool enable, const int8_t target_e_stepper) {
|
||||
#define TMC_SET_STEALTH(Q) tmc_set_stealthChop(stepper##Q, enable)
|
||||
|
||||
#if X_HAS_STEALTHCHOP || Y_HAS_STEALTHCHOP || Z_HAS_STEALTHCHOP \
|
||||
@@ -82,17 +82,19 @@ static void set_stealth_status(const bool enable, const int8_t target_extruder)
|
||||
case K_AXIS: TMC_SET_STEALTH(K); break;
|
||||
#endif
|
||||
|
||||
#if HAS_EXTRUDERS
|
||||
#if E_STEPPERS
|
||||
case E_AXIS: {
|
||||
if (target_extruder < 0) return;
|
||||
OPTCODE(E0_HAS_STEALTHCHOP, else if (target_extruder == 0) TMC_SET_STEALTH(E0))
|
||||
OPTCODE(E1_HAS_STEALTHCHOP, else if (target_extruder == 1) TMC_SET_STEALTH(E1))
|
||||
OPTCODE(E2_HAS_STEALTHCHOP, else if (target_extruder == 2) TMC_SET_STEALTH(E2))
|
||||
OPTCODE(E3_HAS_STEALTHCHOP, else if (target_extruder == 3) TMC_SET_STEALTH(E3))
|
||||
OPTCODE(E4_HAS_STEALTHCHOP, else if (target_extruder == 4) TMC_SET_STEALTH(E4))
|
||||
OPTCODE(E5_HAS_STEALTHCHOP, else if (target_extruder == 5) TMC_SET_STEALTH(E5))
|
||||
OPTCODE(E6_HAS_STEALTHCHOP, else if (target_extruder == 6) TMC_SET_STEALTH(E6))
|
||||
OPTCODE(E7_HAS_STEALTHCHOP, else if (target_extruder == 7) TMC_SET_STEALTH(E7))
|
||||
if (target_e_stepper < 0) return;
|
||||
switch (target_e_stepper) {
|
||||
TERN_(E0_HAS_STEALTHCHOP, case 0: TMC_SET_STEALTH(E0); break;)
|
||||
TERN_(E1_HAS_STEALTHCHOP, case 1: TMC_SET_STEALTH(E1); break;)
|
||||
TERN_(E2_HAS_STEALTHCHOP, case 2: TMC_SET_STEALTH(E2); break;)
|
||||
TERN_(E3_HAS_STEALTHCHOP, case 3: TMC_SET_STEALTH(E3); break;)
|
||||
TERN_(E4_HAS_STEALTHCHOP, case 4: TMC_SET_STEALTH(E4); break;)
|
||||
TERN_(E5_HAS_STEALTHCHOP, case 5: TMC_SET_STEALTH(E5); break;)
|
||||
TERN_(E6_HAS_STEALTHCHOP, case 6: TMC_SET_STEALTH(E6); break;)
|
||||
TERN_(E7_HAS_STEALTHCHOP, case 7: TMC_SET_STEALTH(E7); break;)
|
||||
}
|
||||
} break;
|
||||
#endif
|
||||
}
|
||||
@@ -131,7 +133,7 @@ static void say_stealth_status() {
|
||||
*/
|
||||
void GcodeSuite::M569() {
|
||||
if (parser.seen('S'))
|
||||
set_stealth_status(parser.value_bool(), get_target_extruder_from_command());
|
||||
set_stealth_status(parser.value_bool(), get_target_e_stepper_from_command());
|
||||
else
|
||||
say_stealth_status();
|
||||
}
|
||||
|
||||
@@ -102,11 +102,11 @@ void GcodeSuite::M906() {
|
||||
case K_AXIS: TMC_SET_CURRENT(K); break;
|
||||
#endif
|
||||
|
||||
#if HAS_EXTRUDERS
|
||||
#if E_STEPPERS
|
||||
case E_AXIS: {
|
||||
const int8_t target_extruder = get_target_extruder_from_command();
|
||||
if (target_extruder < 0) return;
|
||||
switch (target_extruder) {
|
||||
const int8_t target_e_stepper = get_target_e_stepper_from_command();
|
||||
if (target_e_stepper < 0) return;
|
||||
switch (target_e_stepper) {
|
||||
#if AXIS_IS_TMC(E0)
|
||||
case 0: TMC_SET_CURRENT(E0); break;
|
||||
#endif
|
||||
|
||||
@@ -265,20 +265,22 @@
|
||||
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));
|
||||
break;
|
||||
case E_AXIS: {
|
||||
#if E_STEPPERS
|
||||
const int8_t target_extruder = get_target_extruder_from_command();
|
||||
if (target_extruder < 0) return;
|
||||
TERN_(E0_HAS_STEALTHCHOP, else if (target_extruder == 0) TMC_SET_PWMTHRS_E(0));
|
||||
TERN_(E1_HAS_STEALTHCHOP, else if (target_extruder == 1) TMC_SET_PWMTHRS_E(1));
|
||||
TERN_(E2_HAS_STEALTHCHOP, else if (target_extruder == 2) TMC_SET_PWMTHRS_E(2));
|
||||
TERN_(E3_HAS_STEALTHCHOP, else if (target_extruder == 3) TMC_SET_PWMTHRS_E(3));
|
||||
TERN_(E4_HAS_STEALTHCHOP, else if (target_extruder == 4) TMC_SET_PWMTHRS_E(4));
|
||||
TERN_(E5_HAS_STEALTHCHOP, else if (target_extruder == 5) TMC_SET_PWMTHRS_E(5));
|
||||
TERN_(E6_HAS_STEALTHCHOP, else if (target_extruder == 6) TMC_SET_PWMTHRS_E(6));
|
||||
TERN_(E7_HAS_STEALTHCHOP, else if (target_extruder == 7) TMC_SET_PWMTHRS_E(7));
|
||||
#endif // E_STEPPERS
|
||||
} break;
|
||||
#if E_STEPPERS
|
||||
case E_AXIS: {
|
||||
const int8_t target_e_stepper = get_target_e_stepper_from_command();
|
||||
if (target_e_stepper < 0) return;
|
||||
switch (target_e_stepper) {
|
||||
TERN_(E0_HAS_STEALTHCHOP, case 0: TMC_SET_PWMTHRS_E(0); break;)
|
||||
TERN_(E1_HAS_STEALTHCHOP, case 1: TMC_SET_PWMTHRS_E(1); break;)
|
||||
TERN_(E2_HAS_STEALTHCHOP, case 2: TMC_SET_PWMTHRS_E(2); break;)
|
||||
TERN_(E3_HAS_STEALTHCHOP, case 3: TMC_SET_PWMTHRS_E(3); break;)
|
||||
TERN_(E4_HAS_STEALTHCHOP, case 4: TMC_SET_PWMTHRS_E(4); break;)
|
||||
TERN_(E5_HAS_STEALTHCHOP, case 5: TMC_SET_PWMTHRS_E(5); break;)
|
||||
TERN_(E6_HAS_STEALTHCHOP, case 6: TMC_SET_PWMTHRS_E(6); break;)
|
||||
TERN_(E7_HAS_STEALTHCHOP, case 7: TMC_SET_PWMTHRS_E(7); break;)
|
||||
}
|
||||
} break;
|
||||
#endif // E_STEPPERS
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -216,10 +216,12 @@ void GcodeSuite::M114() {
|
||||
report_current_position_detail();
|
||||
return;
|
||||
}
|
||||
if (parser.seen_test('E')) {
|
||||
SERIAL_ECHOLNPAIR("Count E:", stepper.position(E_AXIS));
|
||||
return;
|
||||
}
|
||||
#if HAS_EXTRUDERS
|
||||
if (parser.seen_test('E')) {
|
||||
SERIAL_ECHOLNPAIR("Count E:", stepper.position(E_AXIS));
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if ENABLED(M114_REALTIME)
|
||||
|
||||
@@ -311,7 +311,13 @@ public:
|
||||
}
|
||||
|
||||
static inline float axis_unit_factor(const AxisEnum axis) {
|
||||
return (axis >= E_AXIS && volumetric_enabled ? volumetric_unit_factor : linear_unit_factor);
|
||||
return (
|
||||
#if HAS_EXTRUDERS
|
||||
axis >= E_AXIS && volumetric_enabled ? volumetric_unit_factor : linear_unit_factor
|
||||
#else
|
||||
linear_unit_factor
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
static inline float linear_value_to_mm(const_float_t v) { return v * linear_unit_factor; }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1078,7 +1078,11 @@
|
||||
#if ENABLED(DWIN_CREALITY_LCD)
|
||||
#define SERIAL_CATCHALL -1
|
||||
#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
|
||||
|
||||
|
||||
+387
-271
@@ -526,102 +526,110 @@
|
||||
#undef ANY_TEMP_SENSOR_IS
|
||||
|
||||
// Usurp a sensor to do redundant readings
|
||||
#if TEMP_SENSOR_REDUNDANT && !PIN_EXISTS(TEMP_REDUNDANT)
|
||||
#if TEMP_SENSOR_REDUNDANT_SOURCE == -5
|
||||
#if !PIN_EXISTS(TEMP_COOLER)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to COOLER requires TEMP_COOLER_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_COOLER_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == -4
|
||||
#if !PIN_EXISTS(TEMP_PROBE)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to PROBE requires TEMP_PROBE_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_PROBE_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == -2
|
||||
#if !PIN_EXISTS(TEMP_CHAMBER)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to CHAMBER requires TEMP_CHAMBER_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_CHAMBER_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == -1
|
||||
#if !PIN_EXISTS(TEMP_BED)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to BED requires TEMP_BED_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_BED_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 0
|
||||
#if !PIN_EXISTS(TEMP_0)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 0 requires TEMP_0_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_0_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 1
|
||||
#if !PIN_EXISTS(TEMP_1)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 1 requires TEMP_1_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_1_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 2
|
||||
#if !PIN_EXISTS(TEMP_2)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 2 requires TEMP_2_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_2_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 3
|
||||
#if !PIN_EXISTS(TEMP_3)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 3 requires TEMP_3_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_3_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 4
|
||||
#if !PIN_EXISTS(TEMP_4)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 4 requires TEMP_4_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_4_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 5
|
||||
#if !PIN_EXISTS(TEMP_5)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 5 requires TEMP_5_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_5_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 6
|
||||
#if !PIN_EXISTS(TEMP_6)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 6 requires TEMP_6_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_6_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 7
|
||||
#if !PIN_EXISTS(TEMP_7)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 7 requires TEMP_7_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_7_PIN
|
||||
#endif
|
||||
#if TEMP_SENSOR_REDUNDANT
|
||||
#ifndef TEMP_SENSOR_REDUNDANT_SOURCE
|
||||
#define TEMP_SENSOR_REDUNDANT_SOURCE 1
|
||||
#endif
|
||||
|
||||
#ifndef TEMP_SENSOR_REDUNDANT_MAX_DIFF
|
||||
#define TEMP_SENSOR_REDUNDANT_MAX_DIFF 10
|
||||
#ifndef TEMP_SENSOR_REDUNDANT_TARGET
|
||||
#define TEMP_SENSOR_REDUNDANT_TARGET 0
|
||||
#endif
|
||||
#if !PIN_EXISTS(TEMP_REDUNDANT)
|
||||
#ifndef TEMP_SENSOR_REDUNDANT_MAX_DIFF
|
||||
#define TEMP_SENSOR_REDUNDANT_MAX_DIFF 10
|
||||
#endif
|
||||
#if TEMP_SENSOR_REDUNDANT_SOURCE == -5
|
||||
#if !PIN_EXISTS(TEMP_COOLER)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to COOLER requires TEMP_COOLER_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_COOLER_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == -4
|
||||
#if !PIN_EXISTS(TEMP_PROBE)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to PROBE requires TEMP_PROBE_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_PROBE_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == -2
|
||||
#if !PIN_EXISTS(TEMP_CHAMBER)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to CHAMBER requires TEMP_CHAMBER_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_CHAMBER_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == -1
|
||||
#if !PIN_EXISTS(TEMP_BED)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to BED requires TEMP_BED_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_BED_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 0
|
||||
#if !PIN_EXISTS(TEMP_0)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 0 requires TEMP_0_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_0_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 1
|
||||
#if !PIN_EXISTS(TEMP_1)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 1 requires TEMP_1_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_1_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 2
|
||||
#if !PIN_EXISTS(TEMP_2)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 2 requires TEMP_2_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_2_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 3
|
||||
#if !PIN_EXISTS(TEMP_3)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 3 requires TEMP_3_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_3_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 4
|
||||
#if !PIN_EXISTS(TEMP_4)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 4 requires TEMP_4_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_4_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 5
|
||||
#if !PIN_EXISTS(TEMP_5)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 5 requires TEMP_5_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_5_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 6
|
||||
#if !PIN_EXISTS(TEMP_6)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 6 requires TEMP_6_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_6_PIN
|
||||
#endif
|
||||
#elif TEMP_SENSOR_REDUNDANT_SOURCE == 7
|
||||
#if !PIN_EXISTS(TEMP_7)
|
||||
#error "TEMP_SENSOR_REDUNDANT_SOURCE set to 7 requires TEMP_7_PIN."
|
||||
#else
|
||||
#define TEMP_REDUNDANT_PIN TEMP_7_PIN
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#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
|
||||
@@ -641,21 +649,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
|
||||
#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
|
||||
#else
|
||||
#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 == -5
|
||||
#define TEMP_SENSOR_1_IS_MAX31865 1
|
||||
#elif TEMP_SENSOR_1 == -3
|
||||
#define TEMP_SENSOR_1_IS_MAX31855 1
|
||||
#elif TEMP_SENSOR_1 == -2
|
||||
#define TEMP_SENSOR_1_IS_MAX6675 1
|
||||
#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."
|
||||
@@ -683,37 +693,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."
|
||||
@@ -736,101 +757,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
|
||||
|
||||
#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
|
||||
// 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 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
|
||||
|
||||
#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
|
||||
|
||||
#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_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
|
||||
|
||||
#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
|
||||
|
||||
#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
|
||||
#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
|
||||
#if BOTH(HAS_MAX31855, LIB_MAX31855)
|
||||
#define LIB_USR_MAX31855 1
|
||||
#endif
|
||||
#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
|
||||
|
||||
#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
|
||||
|
||||
// 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
|
||||
|
||||
//
|
||||
// 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 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
|
||||
@@ -2715,6 +2817,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
|
||||
@@ -2989,77 +3162,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
|
||||
*/
|
||||
@@ -3092,6 +3194,7 @@
|
||||
#endif
|
||||
#else
|
||||
#undef NOZZLE_TO_PROBE_OFFSET
|
||||
#undef PROBING_STEPPERS_OFF
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -3134,18 +3237,26 @@
|
||||
/**
|
||||
* Heater, Fan, and Probe interactions
|
||||
*/
|
||||
#if FAN_COUNT == 0
|
||||
#undef PROBING_FANS_OFF
|
||||
#if !HAS_FAN
|
||||
#undef ADAPTIVE_FAN_SLOWING
|
||||
#undef NO_FAN_SLOWING_IN_PID_TUNING
|
||||
#endif
|
||||
|
||||
#if HAS_BED_PROBE && (EITHER(PROBING_HEATERS_OFF, PROBING_FANS_OFF) || DELAY_BEFORE_PROBING > 0)
|
||||
#define HAS_QUIET_PROBING 1
|
||||
#if !BOTH(HAS_BED_PROBE, HAS_FAN)
|
||||
#undef PROBING_FANS_OFF
|
||||
#endif
|
||||
#if !BOTH(HAS_BED_PROBE, HAS_EXTRUDERS)
|
||||
#undef PROBING_ESTEPPERS_OFF
|
||||
#endif
|
||||
#if BOTH(PROBING_STEPPERS_OFF, PROBING_ESTEPPERS_OFF)
|
||||
#undef PROBING_ESTEPPERS_OFF
|
||||
#warning "PROBING_STEPPERS_OFF includes PROBING_ESTEPPERS_OFF. Disabling PROBING_ESTEPPERS_OFF."
|
||||
#endif
|
||||
#if EITHER(ADVANCED_PAUSE_FEATURE, PROBING_HEATERS_OFF)
|
||||
#define HEATER_IDLE_HANDLER 1
|
||||
#endif
|
||||
#if HAS_BED_PROBE && (ANY(PROBING_HEATERS_OFF, PROBING_STEPPERS_OFF, PROBING_ESTEPPERS_OFF, PROBING_FANS_OFF) || DELAY_BEFORE_PROBING > 0)
|
||||
#define HAS_QUIET_PROBING 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Advanced Pause - Filament Change
|
||||
@@ -3381,9 +3492,14 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// LCD timeout to status screen default is 15s
|
||||
#ifndef LCD_TIMEOUT_TO_STATUS
|
||||
#define LCD_TIMEOUT_TO_STATUS 15000
|
||||
#if HAS_LCD_MENU
|
||||
// LCD timeout to status screen default is 15s
|
||||
#ifndef LCD_TIMEOUT_TO_STATUS
|
||||
#define LCD_TIMEOUT_TO_STATUS 15000
|
||||
#endif
|
||||
#if LCD_TIMEOUT_TO_STATUS
|
||||
#define SCREENS_CAN_TIME_OUT 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Add commands that need sub-codes to this list
|
||||
|
||||
+124
-77
@@ -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)
|
||||
@@ -593,24 +604,29 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L
|
||||
#endif
|
||||
|
||||
#ifdef PTC_SAMPLE_START
|
||||
constexpr int _ptc_sample_start = PTC_SAMPLE_START;
|
||||
static_assert(_test_ptc_sample_start != PTC_SAMPLE_START, "PTC_SAMPLE_START must be a whole number.");
|
||||
constexpr auto _ptc_sample_start = PTC_SAMPLE_START;
|
||||
constexpr decltype(_ptc_sample_start) _test_ptc_sample_start = 12.3f;
|
||||
static_assert(_test_ptc_sample_start != 12.3f, "PTC_SAMPLE_START must be a whole number.");
|
||||
#endif
|
||||
#ifdef PTC_SAMPLE_RES
|
||||
constexpr int _ptc_sample_res = PTC_SAMPLE_END;
|
||||
static_assert(_test_ptc_sample_res != PTC_SAMPLE_END, "PTC_SAMPLE_RES must be a whole number.");
|
||||
constexpr auto _ptc_sample_res = PTC_SAMPLE_RES;
|
||||
constexpr decltype(_ptc_sample_res) _test_ptc_sample_res = 12.3f;
|
||||
static_assert(_test_ptc_sample_res != 12.3f, "PTC_SAMPLE_RES must be a whole number.");
|
||||
#endif
|
||||
#ifdef BTC_SAMPLE_START
|
||||
constexpr int _btc_sample_start = BTC_SAMPLE_START;
|
||||
static_assert(_test_btc_sample_start != BTC_SAMPLE_START, "BTC_SAMPLE_START must be a whole number.");
|
||||
constexpr auto _btc_sample_start = BTC_SAMPLE_START;
|
||||
constexpr decltype(_btc_sample_start) _test_btc_sample_start = 12.3f;
|
||||
static_assert(_test_btc_sample_start != 12.3f, "BTC_SAMPLE_START must be a whole number.");
|
||||
#endif
|
||||
#ifdef BTC_SAMPLE_RES
|
||||
constexpr int _btc_sample_res = BTC_SAMPLE_END;
|
||||
static_assert(_test_btc_sample_res != BTC_SAMPLE_END, "BTC_SAMPLE_RES must be a whole number.");
|
||||
constexpr _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
|
||||
#ifdef BTC_PROBE_TEMP
|
||||
constexpr int _btc_probe_temp = BTC_PROBE_TEMP;
|
||||
static_assert(_test_btc_probe_temp != BTC_PROBE_TEMP, "BTC_PROBE_TEMP must be a whole number.");
|
||||
constexpr auto _btc_probe_temp = BTC_PROBE_TEMP;
|
||||
constexpr decltype(_btc_probe_temp) _test_btc_probe_temp = 12.3f;
|
||||
static_assert(_test_btc_probe_temp != 12.3f, "BTC_PROBE_TEMP must be a whole number.");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1039,6 +1055,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
||||
#error "EXTRUDERS must be 1 with HEATERS_PARALLEL."
|
||||
#endif
|
||||
|
||||
#if ENABLED(STATUS_HOTEND_INVERTED) && NONE(STATUS_HOTEND_NUMBERLESS, STATUS_HOTEND_ANIM)
|
||||
#error "With multiple hotends STATUS_HOTEND_INVERTED requires STATUS_HOTEND_ANIM or STATUS_HOTEND_NUMBERLESS."
|
||||
#endif
|
||||
|
||||
#if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
|
||||
#ifndef TOOLCHANGE_FS_LENGTH
|
||||
#error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_LENGTH."
|
||||
@@ -1245,23 +1265,28 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
||||
#endif
|
||||
|
||||
/**
|
||||
* (Electro)magnetic Switching Toolhead requirements
|
||||
* Magnetic / Electromagnetic Switching Toolhead requirements
|
||||
*/
|
||||
#if EITHER(MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD)
|
||||
#ifndef SWITCHING_TOOLHEAD_Y_POS
|
||||
#error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Y_POS"
|
||||
#error "(ELECTRO)?MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Y_POS"
|
||||
#elif !defined(SWITCHING_TOOLHEAD_X_POS)
|
||||
#error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_X_POS"
|
||||
#elif !defined(SWITCHING_TOOLHEAD_Z_HOP)
|
||||
#error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Z_HOP."
|
||||
#error "(ELECTRO)?MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_X_POS"
|
||||
#elif !defined(SWITCHING_TOOLHEAD_Y_CLEAR)
|
||||
#error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Y_CLEAR."
|
||||
#elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD)
|
||||
#if ENABLED(EXT_SOLENOID)
|
||||
#error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD and EXT_SOLENOID are incompatible. (Pins are used twice.)"
|
||||
#elif !PIN_EXISTS(SOL0)
|
||||
#error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SOL0_PIN."
|
||||
#endif
|
||||
#error "(ELECTRO)?MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Y_CLEAR."
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Electromagnetic Switching Toolhead requirements
|
||||
*/
|
||||
#if ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD)
|
||||
#if ENABLED(EXT_SOLENOID)
|
||||
#error "ELECTROMAGNETIC_SWITCHING_TOOLHEAD and EXT_SOLENOID are incompatible. (Pins are used twice.)"
|
||||
#elif !PIN_EXISTS(SOL0)
|
||||
#error "ELECTROMAGNETIC_SWITCHING_TOOLHEAD requires SOL0_PIN."
|
||||
#elif !defined(SWITCHING_TOOLHEAD_Z_HOP)
|
||||
#error "ELECTROMAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Z_HOP."
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1939,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
|
||||
|
||||
/**
|
||||
@@ -2009,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
|
||||
@@ -2134,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))
|
||||
@@ -2172,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
|
||||
*/
|
||||
@@ -2248,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."
|
||||
@@ -3574,6 +3614,13 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
|
||||
#error "Either enable MEATPACK_ON_SERIAL_PORT_* or BINARY_FILE_TRANSFER, not both."
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Sanity Check for Slim LCD Menus and Probe Offset Wizard
|
||||
*/
|
||||
#if BOTH(SLIM_LCD_MENUS, PROBE_OFFSET_WIZARD)
|
||||
#error "SLIM_LCD_MENUS disables \"Advanced Settings > Probe Offsets > PROBE_OFFSET_WIZARD.\""
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Sanity check for unique start and stop values in NOZZLE_CLEAN_FEATURE
|
||||
*/
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
* version was tagged.
|
||||
*/
|
||||
#ifndef STRING_DISTRIBUTION_DATE
|
||||
#define STRING_DISTRIBUTION_DATE "2021-06-18"
|
||||
#define STRING_DISTRIBUTION_DATE "2021-07-07"
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -52,7 +52,7 @@
|
||||
* to alert users to major changes.
|
||||
*/
|
||||
|
||||
#define MARLIN_HEX_VERSION 02000900
|
||||
#define MARLIN_HEX_VERSION 02000901
|
||||
#ifndef REQUIRED_CONFIGURATION_H_VERSION
|
||||
#define REQUIRED_CONFIGURATION_H_VERSION MARLIN_HEX_VERSION
|
||||
#endif
|
||||
|
||||
@@ -369,13 +369,12 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
|
||||
void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) {
|
||||
|
||||
if (mark_as_selected(row, style & SS_INVERT)) {
|
||||
|
||||
pixel_len_t n = LCD_PIXEL_WIDTH; // pixel width of string allowed
|
||||
|
||||
const int8_t plen = pstr ? utf8_strlen_P(pstr) : 0,
|
||||
vlen = vstr ? utf8_strlen(vstr) : 0;
|
||||
|
||||
const int plen = pstr ? calculateWidth(pstr) : 0,
|
||||
vlen = vstr ? utf8_strlen(vstr) : 0;
|
||||
if (style & SS_CENTER) {
|
||||
int8_t pad = (LCD_WIDTH - plen - vlen) / 2;
|
||||
int pad = (LCD_PIXEL_WIDTH - plen - vlen * MENU_FONT_WIDTH) / MENU_FONT_WIDTH / 2;
|
||||
while (--pad >= 0) n -= lcd_put_wchar(' ');
|
||||
}
|
||||
|
||||
@@ -400,8 +399,9 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
|
||||
if (mark_as_selected(row, sel)) {
|
||||
const uint8_t vallen = (pgm ? utf8_strlen_P(inStr) : utf8_strlen((char*)inStr)),
|
||||
pixelwidth = (pgm ? uxg_GetUtf8StrPixelWidthP(u8g.getU8g(), inStr) : uxg_GetUtf8StrPixelWidth(u8g.getU8g(), (char*)inStr));
|
||||
const u8g_uint_t prop = USE_WIDE_GLYPH ? 2 : 1;
|
||||
|
||||
pixel_len_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vallen) * (MENU_FONT_WIDTH);
|
||||
pixel_len_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vallen * prop) * (MENU_FONT_WIDTH);
|
||||
if (vallen) {
|
||||
lcd_put_wchar(':');
|
||||
while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' ');
|
||||
@@ -414,15 +414,16 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
|
||||
void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) {
|
||||
ui.encoder_direction_normal();
|
||||
|
||||
const u8g_uint_t prop = USE_WIDE_GLYPH ? 2 : 1;
|
||||
const u8g_uint_t labellen = utf8_strlen_P(pstr), vallen = utf8_strlen(value);
|
||||
bool extra_row = labellen > LCD_WIDTH - 2 - vallen;
|
||||
bool extra_row = labellen * prop > LCD_WIDTH - 2 - vallen * prop;
|
||||
|
||||
#if ENABLED(USE_BIG_EDIT_FONT)
|
||||
// Use the menu font if the label won't fit on a single line
|
||||
constexpr u8g_uint_t lcd_edit_width = (LCD_PIXEL_WIDTH) / (EDIT_FONT_WIDTH);
|
||||
u8g_uint_t lcd_chr_fit, one_chr_width;
|
||||
if (labellen <= lcd_edit_width - 1) {
|
||||
if (labellen + vallen + 1 > lcd_edit_width) extra_row = true;
|
||||
if (labellen * prop <= lcd_edit_width - 1) {
|
||||
if (labellen * prop + vallen * prop + 1 > lcd_edit_width) extra_row = true;
|
||||
lcd_chr_fit = lcd_edit_width + 1;
|
||||
one_chr_width = EDIT_FONT_WIDTH;
|
||||
ui.set_font(FONT_EDIT);
|
||||
@@ -454,7 +455,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
|
||||
onpage = PAGE_CONTAINS(baseline - (EDIT_FONT_ASCENT - 1), baseline);
|
||||
}
|
||||
if (onpage) {
|
||||
lcd_put_wchar(((lcd_chr_fit - 1) - (vallen + 1)) * one_chr_width, baseline, ' '); // Right-justified, padded, add a leading space
|
||||
lcd_put_wchar(((lcd_chr_fit - 1) - (vallen * prop + 1)) * one_chr_width, baseline, ' '); // Right-justified, padded, add a leading space
|
||||
lcd_put_u8str(value);
|
||||
}
|
||||
}
|
||||
@@ -468,7 +469,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
|
||||
const pixel_len_t bw = len * prop * (MENU_FONT_WIDTH), bx = x * prop * (MENU_FONT_WIDTH);
|
||||
if (inv) {
|
||||
u8g.setColorIndex(1);
|
||||
u8g.drawBox(bx / prop - 1, by - (MENU_FONT_ASCENT) + 1, bw / prop + 2, MENU_FONT_HEIGHT - 1);
|
||||
u8g.drawBox(bx / prop - 1, by - (MENU_FONT_ASCENT), bw + 2, MENU_FONT_HEIGHT);
|
||||
u8g.setColorIndex(0);
|
||||
}
|
||||
lcd_put_u8str_P(bx / prop, by, pstr);
|
||||
@@ -478,8 +479,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
|
||||
void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) {
|
||||
ui.draw_select_screen_prompt(pref, string, suff);
|
||||
draw_boxed_string(1, LCD_HEIGHT - 1, no, !yesno);
|
||||
const u8g_uint_t xpos = (LCD_WIDTH) / (USE_WIDE_GLYPH ? 2 : 1);
|
||||
draw_boxed_string(xpos - (utf8_strlen_P(yes) + 1), LCD_HEIGHT - 1, yes, yesno);
|
||||
draw_boxed_string(LCD_WIDTH - (utf8_strlen_P(yes) * (USE_WIDE_GLYPH ? 2 : 1) + 1), LCD_HEIGHT - 1, yes, yesno);
|
||||
}
|
||||
|
||||
#if ENABLED(SDSUPPORT)
|
||||
|
||||
@@ -39,20 +39,33 @@
|
||||
|
||||
#define STATUS_HOTEND1_WIDTH 16
|
||||
|
||||
#if STATUS_HOTEND_BITMAPS == 1 || ENABLED(STATUS_HOTEND_NUMBERLESS)
|
||||
#if STATUS_HOTEND_BITMAPS == 1 || defined(STATUS_HOTEND_NUMBERLESS)
|
||||
|
||||
const unsigned char status_hotend_a_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00111111,B11110000,
|
||||
B00111111,B11110000,
|
||||
B00111111,B11110000,
|
||||
B00011111,B11100000,
|
||||
B00011111,B11100000,
|
||||
B00111111,B11110000,
|
||||
B00111111,B11110000,
|
||||
B00111111,B11110000,
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
#if defined(STATUS_HOTEND_INVERTED) && !defined(STATUS_HOTEND_ANIM)
|
||||
B00100000,B00010000,
|
||||
B00100000,B00010000,
|
||||
B00100000,B00010000,
|
||||
B00010000,B00100000,
|
||||
B00010000,B00100000,
|
||||
B00100000,B00010000,
|
||||
B00100000,B00010000,
|
||||
B00110000,B00110000,
|
||||
B00001000,B01000000,
|
||||
B00000100,B10000000,
|
||||
#else
|
||||
B00111111,B11110000,
|
||||
B00111111,B11110000,
|
||||
B00111111,B11110000,
|
||||
B00011111,B11100000,
|
||||
B00011111,B11100000,
|
||||
B00111111,B11110000,
|
||||
B00111111,B11110000,
|
||||
B00111111,B11110000,
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
#endif
|
||||
B00000011,B00000000
|
||||
};
|
||||
|
||||
|
||||
@@ -236,18 +236,12 @@ FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, co
|
||||
#define HOTEND_DOT false
|
||||
#endif
|
||||
|
||||
#if ANIM_HOTEND && BOTH(STATUS_HOTEND_INVERTED, STATUS_HOTEND_NUMBERLESS)
|
||||
#define OFF_BMP(N) status_hotend_b_bmp
|
||||
#define ON_BMP(N) status_hotend_a_bmp
|
||||
#elif ANIM_HOTEND && DISABLED(STATUS_HOTEND_INVERTED) && ENABLED(STATUS_HOTEND_NUMBERLESS)
|
||||
#define OFF_BMP(N) status_hotend_a_bmp
|
||||
#define ON_BMP(N) status_hotend_b_bmp
|
||||
#elif BOTH(ANIM_HOTEND, STATUS_HOTEND_INVERTED)
|
||||
#define OFF_BMP(N) status_hotend##N##_b_bmp
|
||||
#define ON_BMP(N) status_hotend##N##_a_bmp
|
||||
#if ENABLED(STATUS_HOTEND_NUMBERLESS)
|
||||
#define OFF_BMP(N) TERN(STATUS_HOTEND_INVERTED, status_hotend_b_bmp, status_hotend_a_bmp)
|
||||
#define ON_BMP(N) TERN(STATUS_HOTEND_INVERTED, status_hotend_a_bmp, status_hotend_b_bmp)
|
||||
#else
|
||||
#define OFF_BMP(N) status_hotend##N##_a_bmp
|
||||
#define ON_BMP(N) status_hotend##N##_b_bmp
|
||||
#define OFF_BMP(N) TERN(STATUS_HOTEND_INVERTED, status_hotend##N##_b_bmp, status_hotend##N##_a_bmp)
|
||||
#define ON_BMP(N) TERN(STATUS_HOTEND_INVERTED, status_hotend##N##_a_bmp, status_hotend##N##_b_bmp)
|
||||
#endif
|
||||
|
||||
#if STATUS_HOTEND_BITMAPS > 1
|
||||
@@ -275,20 +269,18 @@ FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, co
|
||||
uint8_t tall = uint8_t(perc * BAR_TALL + 0.5f);
|
||||
NOMORE(tall, BAR_TALL);
|
||||
|
||||
#if ANIM_HOTEND
|
||||
// Draw hotend bitmap, either whole or split by the heating percent
|
||||
const uint8_t hx = STATUS_HOTEND_X(heater_id),
|
||||
bw = STATUS_HOTEND_BYTEWIDTH(heater_id);
|
||||
#if ENABLED(STATUS_HEAT_PERCENT)
|
||||
if (isHeat && tall <= BAR_TALL) {
|
||||
const uint8_t ph = STATUS_HEATERS_HEIGHT - 1 - tall;
|
||||
u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, ph, HOTEND_BITMAP(TERN(HAS_MMU, active_extruder, heater_id), false));
|
||||
u8g.drawBitmapP(hx, STATUS_HEATERS_Y + ph, bw, tall + 1, HOTEND_BITMAP(TERN(HAS_MMU, active_extruder, heater_id), true) + ph * bw);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, STATUS_HEATERS_HEIGHT, HOTEND_BITMAP(TERN(HAS_MMU, active_extruder, heater_id), isHeat));
|
||||
// Draw hotend bitmap, either whole or split by the heating percent
|
||||
const uint8_t hx = STATUS_HOTEND_X(heater_id),
|
||||
bw = STATUS_HOTEND_BYTEWIDTH(heater_id);
|
||||
#if ENABLED(STATUS_HEAT_PERCENT)
|
||||
if (isHeat && tall <= BAR_TALL) {
|
||||
const uint8_t ph = STATUS_HEATERS_HEIGHT - 1 - tall;
|
||||
u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, ph, HOTEND_BITMAP(TERN(HAS_MMU, active_extruder, heater_id), false));
|
||||
u8g.drawBitmapP(hx, STATUS_HEATERS_Y + ph, bw, tall + 1, HOTEND_BITMAP(TERN(HAS_MMU, active_extruder, heater_id), true) + ph * bw);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, STATUS_HEATERS_HEIGHT, HOTEND_BITMAP(TERN(HAS_MMU, active_extruder, heater_id), isHeat));
|
||||
|
||||
} // PAGE_CONTAINS
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ enum DGUSLCD_Screens : uint8_t {
|
||||
DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version")
|
||||
DGUSLCD_SCREEN_WAITING = 251,
|
||||
DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen"
|
||||
DGUSLDC_SCREEN_UNUSED = 255
|
||||
DGUSLCD_SCREEN_UNUSED = 255
|
||||
};
|
||||
|
||||
// Display Memory layout used (T5UID)
|
||||
|
||||
@@ -51,7 +51,7 @@ enum DGUSLCD_Screens : uint8_t {
|
||||
DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version")
|
||||
DGUSLCD_SCREEN_WAITING = 251,
|
||||
DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen"
|
||||
DGUSLDC_SCREEN_UNUSED = 255
|
||||
DGUSLCD_SCREEN_UNUSED = 255
|
||||
};
|
||||
|
||||
// Display Memory layout used (T5UID)
|
||||
|
||||
@@ -238,7 +238,7 @@ enum DGUSLCD_Screens : uint8_t {
|
||||
DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version")
|
||||
DGUSLCD_SCREEN_WAITING = 251,
|
||||
DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen"
|
||||
DGUSLDC_SCREEN_UNUSED = 255
|
||||
DGUSLCD_SCREEN_UNUSED = 255
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ enum DGUSLCD_Screens : uint8_t {
|
||||
DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version")
|
||||
DGUSLCD_SCREEN_WAITING = 251,
|
||||
DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen"
|
||||
DGUSLDC_SCREEN_UNUSED = 255
|
||||
DGUSLCD_SCREEN_UNUSED = 255
|
||||
};
|
||||
|
||||
// Display Memory layout used (T5UID)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
* location: <https://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
|
||||
#include "../compat.h"
|
||||
#include "../config.h"
|
||||
|
||||
#if ENABLED(TOUCH_UI_FTDI_EVE)
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
* location: <https://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
|
||||
#include "../compat.h"
|
||||
#include "../config.h"
|
||||
|
||||
#if ENABLED(TOUCH_UI_FTDI_EVE)
|
||||
#include "media_file_reader.h"
|
||||
|
||||
@@ -32,9 +32,7 @@
|
||||
class MediaFileReader {
|
||||
private:
|
||||
#if ENABLED(SDSUPPORT)
|
||||
DiskIODriver_SPI_SD card;
|
||||
SdVolume volume;
|
||||
SdFile root, file;
|
||||
SdFile root, file;
|
||||
#endif
|
||||
|
||||
public:
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
/*************
|
||||
* screens.h *
|
||||
*************/
|
||||
|
||||
/****************************************************************************
|
||||
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
|
||||
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation, either version 3 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* To view a copy of the GNU General Public License, go to the following *
|
||||
* location: <https://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
|
||||
/********************************* DL CACHE SLOTS ******************************/
|
||||
|
||||
// In order to reduce SPI traffic, we cache display lists (DL) in RAMG. This
|
||||
// is done using the CLCD::DLCache class, which takes a unique ID for each
|
||||
// cache location. These IDs are defined here:
|
||||
|
||||
enum {
|
||||
STATUS_SCREEN_CACHE,
|
||||
MENU_SCREEN_CACHE,
|
||||
TUNE_SCREEN_CACHE,
|
||||
ALERT_BOX_CACHE,
|
||||
SPINNER_CACHE,
|
||||
ADVANCED_SETTINGS_SCREEN_CACHE,
|
||||
TEMPERATURE_SCREEN_CACHE,
|
||||
STEPS_SCREEN_CACHE,
|
||||
MAX_FEEDRATE_SCREEN_CACHE,
|
||||
MAX_VELOCITY_SCREEN_CACHE,
|
||||
MAX_ACCELERATION_SCREEN_CACHE,
|
||||
DEFAULT_ACCELERATION_SCREEN_CACHE,
|
||||
FLOW_PERCENT_SCREEN_CACHE,
|
||||
ZOFFSET_SCREEN_CACHE,
|
||||
STEPPER_CURRENT_SCREEN_CACHE,
|
||||
STEPPER_BUMP_SENSITIVITY_SCREEN_CACHE,
|
||||
PRINTING_SCREEN_CACHE,
|
||||
FILES_SCREEN_CACHE,
|
||||
INTERFACE_SETTINGS_SCREEN_CACHE,
|
||||
INTERFACE_SOUNDS_SCREEN_CACHE,
|
||||
LOCK_SCREEN_CACHE,
|
||||
DISPLAY_TIMINGS_SCREEN_CACHE
|
||||
};
|
||||
|
||||
// To save MCU RAM, the status message is "baked" in to the status screen
|
||||
// cache, so we reserve a large chunk of memory for the DL cache
|
||||
|
||||
#define STATUS_SCREEN_DL_SIZE 4096
|
||||
#define ALERT_BOX_DL_SIZE 3072
|
||||
#define SPINNER_DL_SIZE 3072
|
||||
#define FILE_SCREEN_DL_SIZE 4160
|
||||
#define PRINTING_SCREEN_DL_SIZE 2048
|
||||
|
||||
/************************* MENU SCREEN DECLARATIONS *************************/
|
||||
|
||||
#include "../generic/base_screen.h"
|
||||
#include "../generic/base_numeric_adjustment_screen.h"
|
||||
#include "../generic/dialog_box_base_class.h"
|
||||
#include "../generic/boot_screen.h"
|
||||
#include "../generic/about_screen.h"
|
||||
#include "../generic/kill_screen.h"
|
||||
#include "../generic/alert_dialog_box.h"
|
||||
#include "../generic/spinner_dialog_box.h"
|
||||
#include "../generic/restore_failsafe_dialog_box.h"
|
||||
#include "../generic/save_settings_dialog_box.h"
|
||||
#include "../generic/confirm_start_print_dialog_box.h"
|
||||
#include "../generic/confirm_abort_print_dialog_box.h"
|
||||
#include "../generic/confirm_user_request_alert_box.h"
|
||||
#include "../generic/touch_calibration_screen.h"
|
||||
#include "../generic/move_axis_screen.h"
|
||||
#include "../generic/steps_screen.h"
|
||||
#include "../generic/feedrate_percent_screen.h"
|
||||
#include "../generic/max_velocity_screen.h"
|
||||
#include "../generic/max_acceleration_screen.h"
|
||||
#include "../generic/default_acceleration_screen.h"
|
||||
#include "../generic/temperature_screen.h"
|
||||
#include "../generic/interface_sounds_screen.h"
|
||||
#include "../generic/interface_settings_screen.h"
|
||||
#include "../generic/lock_screen.h"
|
||||
#include "../generic/endstop_state_screen.h"
|
||||
#include "../generic/display_tuning_screen.h"
|
||||
#include "../generic/media_player_screen.h"
|
||||
#include "../generic/statistics_screen.h"
|
||||
#include "../generic/stepper_current_screen.h"
|
||||
#include "../generic/stepper_bump_sensitivity_screen.h"
|
||||
#include "../generic/leveling_menu.h"
|
||||
#include "../generic/z_offset_screen.h"
|
||||
#include "../generic/files_screen.h"
|
||||
|
||||
#include "bio_status_screen.h"
|
||||
#include "bio_main_menu.h"
|
||||
#include "bio_tune_menu.h"
|
||||
#include "bio_advanced_settings.h"
|
||||
#include "bio_printing_dialog_box.h"
|
||||
#include "bio_confirm_home_xyz.h"
|
||||
#include "bio_confirm_home_e.h"
|
||||
@@ -23,9 +23,9 @@
|
||||
#include "../config.h"
|
||||
#include "../screens.h"
|
||||
|
||||
#if ENABLED(COCOA_LEVELING_MENU)
|
||||
#ifdef COCOA_LEVELING_MENU
|
||||
|
||||
#if ENABLED(BLTOUCH)
|
||||
#if BOTH(HAS_BED_PROBE,BLTOUCH)
|
||||
#include "../../../../feature/bltouch.h"
|
||||
#endif
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ bool MainMenu::onTouchEnd(uint8_t tag) {
|
||||
case 8: GOTO_SCREEN(AdvancedSettingsMenu); break;
|
||||
case 9: injectCommands_P(PSTR("M84")); break;
|
||||
#if HAS_LEVELING
|
||||
case 10: GOTO_SCREEN(LevelingMenu); break;
|
||||
case 10: GOTO_SCREEN(LevelingMenu); break;
|
||||
#endif
|
||||
case 11: GOTO_SCREEN(AboutScreen); break;
|
||||
default:
|
||||
|
||||
@@ -84,16 +84,6 @@ void PreheatTimerScreen::draw_interaction_buttons(draw_mode_t what) {
|
||||
void PreheatTimerScreen::draw_adjuster(draw_mode_t what, uint8_t tag, progmem_str label, float value, int16_t x, int16_t y, int16_t w, int16_t h) {
|
||||
#define SUB_COLS 9
|
||||
#define SUB_ROWS 2
|
||||
#define SUB_GRID_W(W) ((W)*w/SUB_COLS)
|
||||
#define SUB_GRID_H(H) ((H)*h/SUB_ROWS)
|
||||
#define SUB_GRID_X(X) (SUB_GRID_W((X)-1) + x)
|
||||
#define SUB_GRID_Y(Y) (SUB_GRID_H((Y)-1) + y)
|
||||
#define SUB_X(X) (SUB_GRID_X(X) + MARGIN_L)
|
||||
#define SUB_Y(Y) (SUB_GRID_Y(Y) + MARGIN_T)
|
||||
#define SUB_W(W) (SUB_GRID_W(W) - MARGIN_L - MARGIN_R)
|
||||
#define SUB_H(H) (SUB_GRID_H(H) - MARGIN_T - MARGIN_B)
|
||||
#define SUB_POS(X,Y) SUB_X(X), SUB_Y(Y)
|
||||
#define SUB_SIZE(W,H) SUB_W(W), SUB_H(H)
|
||||
|
||||
CommandProcessor cmd;
|
||||
cmd.tag(0)
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
/*************
|
||||
* screens.h *
|
||||
*************/
|
||||
|
||||
/****************************************************************************
|
||||
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
|
||||
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation, either version 3 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* To view a copy of the GNU General Public License, go to the following *
|
||||
* location: <https://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
/********************************* DL CACHE SLOTS ******************************/
|
||||
|
||||
// In order to reduce SPI traffic, we cache display lists (DL) in RAMG. This
|
||||
// is done using the CLCD::DLCache class, which takes a unique ID for each
|
||||
// cache location. These IDs are defined here:
|
||||
|
||||
enum {
|
||||
STATUS_SCREEN_CACHE,
|
||||
MENU_SCREEN_CACHE,
|
||||
TUNE_SCREEN_CACHE,
|
||||
ALERT_BOX_CACHE,
|
||||
SPINNER_CACHE,
|
||||
ADVANCED_SETTINGS_SCREEN_CACHE,
|
||||
MOVE_AXIS_SCREEN_CACHE,
|
||||
TEMPERATURE_SCREEN_CACHE,
|
||||
STEPS_SCREEN_CACHE,
|
||||
MAX_FEEDRATE_SCREEN_CACHE,
|
||||
MAX_VELOCITY_SCREEN_CACHE,
|
||||
MAX_ACCELERATION_SCREEN_CACHE,
|
||||
DEFAULT_ACCELERATION_SCREEN_CACHE,
|
||||
FLOW_PERCENT_SCREEN_CACHE,
|
||||
LEVELING_SCREEN_CACHE,
|
||||
ZOFFSET_SCREEN_CACHE,
|
||||
BED_MESH_VIEW_SCREEN_CACHE,
|
||||
BED_MESH_EDIT_SCREEN_CACHE,
|
||||
STEPPER_CURRENT_SCREEN_CACHE,
|
||||
#if HAS_JUNCTION_DEVIATION
|
||||
JUNC_DEV_SCREEN_CACHE,
|
||||
#else
|
||||
JERK_SCREEN_CACHE,
|
||||
#endif
|
||||
CASE_LIGHT_SCREEN_CACHE,
|
||||
FILAMENT_MENU_CACHE,
|
||||
LINEAR_ADVANCE_SCREEN_CACHE,
|
||||
PREHEAT_MENU_CACHE,
|
||||
PREHEAT_TIMER_SCREEN_CACHE,
|
||||
LOAD_CHOCOLATE_SCREEN_CACHE,
|
||||
MOVE_XYZ_SCREEN_CACHE,
|
||||
MOVE_E_SCREEN_CACHE,
|
||||
FILES_SCREEN_CACHE,
|
||||
INTERFACE_SETTINGS_SCREEN_CACHE,
|
||||
INTERFACE_SOUNDS_SCREEN_CACHE,
|
||||
LOCK_SCREEN_CACHE,
|
||||
DISPLAY_TIMINGS_SCREEN_CACHE
|
||||
};
|
||||
|
||||
// To save MCU RAM, the status message is "baked" in to the status screen
|
||||
// cache, so we reserve a large chunk of memory for the DL cache
|
||||
|
||||
#define STATUS_SCREEN_DL_SIZE 4096
|
||||
#define ALERT_BOX_DL_SIZE 3072
|
||||
#define SPINNER_DL_SIZE 3072
|
||||
#define FILE_SCREEN_DL_SIZE 4160
|
||||
#define PRINTING_SCREEN_DL_SIZE 2048
|
||||
|
||||
/************************* MENU SCREEN DECLARATIONS *************************/
|
||||
|
||||
#include "../generic/base_screen.h"
|
||||
#include "../generic/base_numeric_adjustment_screen.h"
|
||||
#include "../generic/dialog_box_base_class.h"
|
||||
#include "../generic/boot_screen.h"
|
||||
#include "../generic/about_screen.h"
|
||||
#include "../generic/kill_screen.h"
|
||||
#include "../generic/alert_dialog_box.h"
|
||||
#include "../generic/spinner_dialog_box.h"
|
||||
#include "../generic/restore_failsafe_dialog_box.h"
|
||||
#include "../generic/save_settings_dialog_box.h"
|
||||
#include "../generic/confirm_start_print_dialog_box.h"
|
||||
#include "../generic/confirm_abort_print_dialog_box.h"
|
||||
#include "../generic/confirm_user_request_alert_box.h"
|
||||
#include "../generic/touch_calibration_screen.h"
|
||||
#include "../generic/move_axis_screen.h"
|
||||
#include "../generic/steps_screen.h"
|
||||
#include "../generic/feedrate_percent_screen.h"
|
||||
#include "../generic/max_velocity_screen.h"
|
||||
#include "../generic/max_acceleration_screen.h"
|
||||
#include "../generic/default_acceleration_screen.h"
|
||||
#include "../generic/temperature_screen.h"
|
||||
#include "../generic/interface_sounds_screen.h"
|
||||
#include "../generic/interface_settings_screen.h"
|
||||
#include "../generic/lock_screen.h"
|
||||
#include "../generic/endstop_state_screen.h"
|
||||
#include "../generic/display_tuning_screen.h"
|
||||
#include "../generic/statistics_screen.h"
|
||||
#include "../generic/stepper_current_screen.h"
|
||||
#include "../generic/leveling_menu.h"
|
||||
#include "../generic/z_offset_screen.h"
|
||||
#include "../generic/bed_mesh_base.h"
|
||||
#include "../generic/bed_mesh_view_screen.h"
|
||||
#include "../generic/bed_mesh_edit_screen.h"
|
||||
#include "../generic/case_light_screen.h"
|
||||
#include "../generic/linear_advance_screen.h"
|
||||
#include "../generic/files_screen.h"
|
||||
#include "../generic/move_axis_screen.h"
|
||||
#include "../generic/flow_percent_screen.h"
|
||||
#if HAS_JUNCTION_DEVIATION
|
||||
#include "../generic/junction_deviation_screen.h"
|
||||
#else
|
||||
#include "../generic/jerk_screen.h"
|
||||
#endif
|
||||
|
||||
#include "status_screen.h"
|
||||
#include "main_menu.h"
|
||||
#include "advanced_settings_menu.h"
|
||||
#include "preheat_menu.h"
|
||||
#include "preheat_screen.h"
|
||||
#include "load_chocolate.h"
|
||||
#include "move_xyz_screen.h"
|
||||
#include "move_e_screen.h"
|
||||
@@ -294,4 +294,14 @@ void StatusScreen::onIdle() {
|
||||
}
|
||||
}
|
||||
|
||||
void StatusScreen::onMediaInserted() {
|
||||
if (AT_SCREEN(StatusScreen))
|
||||
setStatusMessage(GET_TEXT_F(MSG_MEDIA_INSERTED));
|
||||
}
|
||||
|
||||
void StatusScreen::onMediaRemoved() {
|
||||
if (AT_SCREEN(StatusScreen) || ExtUI::isPrintingFromMedia())
|
||||
setStatusMessage(GET_TEXT_F(MSG_MEDIA_REMOVED));
|
||||
}
|
||||
|
||||
#endif // COCOA_STATUS_SCREEN
|
||||
|
||||
@@ -52,4 +52,6 @@ class StatusScreen : public BaseScreen, public CachedScreen<STATUS_SCREEN_CACHE>
|
||||
static bool onTouchHeld(uint8_t tag);
|
||||
static bool onTouchEnd(uint8_t tag);
|
||||
static void onIdle();
|
||||
static void onMediaInserted();
|
||||
static void onMediaRemoved();
|
||||
};
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
// Configure this display with options in Configuration_adv.h
|
||||
#include "../../../inc/MarlinConfigPre.h"
|
||||
#if ENABLED(TOUCH_UI_FTDI_EVE)
|
||||
|
||||
#include "compat.h"
|
||||
|
||||
// Configure this display with options in Configuration_adv.h
|
||||
#endif
|
||||
|
||||
@@ -45,24 +45,23 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
void onMediaInserted() {
|
||||
if (AT_SCREEN(StatusScreen))
|
||||
StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MEDIA_INSERTED));
|
||||
sound.play(media_inserted, PLAY_ASYNCHRONOUS);
|
||||
#if ENABLED(SDSUPPORT)
|
||||
sound.play(media_inserted, PLAY_ASYNCHRONOUS);
|
||||
StatusScreen::onMediaInserted();
|
||||
#endif
|
||||
}
|
||||
|
||||
void onMediaRemoved() {
|
||||
if (isPrintingFromMedia()) {
|
||||
stopPrint();
|
||||
InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED);
|
||||
}
|
||||
else
|
||||
sound.play(media_removed, PLAY_ASYNCHRONOUS);
|
||||
|
||||
if (AT_SCREEN(StatusScreen) || isPrintingFromMedia())
|
||||
StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MEDIA_REMOVED));
|
||||
|
||||
#if ENABLED(SDSUPPORT)
|
||||
if (AT_SCREEN(FilesScreen)) GOTO_SCREEN(StatusScreen);
|
||||
if (isPrintingFromMedia()) {
|
||||
stopPrint();
|
||||
InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED);
|
||||
}
|
||||
else
|
||||
sound.play(media_removed, PLAY_ASYNCHRONOUS);
|
||||
|
||||
StatusScreen::onMediaRemoved();
|
||||
FilesScreen::onMediaRemoved();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -239,9 +239,11 @@ class DeduplicatedPolyReader : public POLY_READER {
|
||||
*/
|
||||
template<class POLY_READER=DeduplicatedPolyReader<TransformedPolyReader>>
|
||||
class GenericPolyUI {
|
||||
private:
|
||||
protected:
|
||||
CommandProcessor &cmd;
|
||||
draw_mode_t mode;
|
||||
|
||||
private:
|
||||
// Attributes used to paint buttons
|
||||
|
||||
uint32_t btn_fill_color = 0x000000;
|
||||
@@ -250,8 +252,6 @@ class GenericPolyUI {
|
||||
uint32_t btn_stroke_color = 0x000000;
|
||||
uint8_t btn_stroke_width = 28;
|
||||
|
||||
draw_mode_t mode;
|
||||
|
||||
public:
|
||||
enum ButtonStyle : uint8_t {
|
||||
FILL = 1,
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
# Written By Marcio Teixeira 2021 - SynDaver Labs, Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# To view a copy of the GNU General Public License, go to the following
|
||||
# location: <https://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
import textwrap
|
||||
import os
|
||||
import zlib
|
||||
|
||||
def deflate(data):
|
||||
return zlib.compress(data)
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Converts a file into a packed C array for use as data')
|
||||
parser.add_argument("input")
|
||||
parser.add_argument("-d", "--deflate", action="store_true", help="Packs the data using the deflate algorithm")
|
||||
args = parser.parse_args()
|
||||
|
||||
varname = os.path.splitext(os.path.basename(args.input))[0];
|
||||
|
||||
with open(args.input, "rb") as in_file:
|
||||
data = in_file.read()
|
||||
if args.deflate:
|
||||
data = deflate(data)
|
||||
data = bytearray(data)
|
||||
data = list(map(lambda a: "0x" + format(a, '02x'), data))
|
||||
nElements = len(data)
|
||||
data = ', '.join(data)
|
||||
data = textwrap.fill(data, 75, initial_indent = ' ', subsequent_indent = ' ')
|
||||
|
||||
print("const unsigned char " + varname + "[" + format(nElements) + "] PROGMEM = {")
|
||||
print(data)
|
||||
print("};")
|
||||
@@ -0,0 +1,108 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
# Written By Marcio Teixeira 2019 - Aleph Objects, Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# To view a copy of the GNU General Public License, go to the following
|
||||
# location: <https://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import print_function
|
||||
from PIL import Image
|
||||
import argparse
|
||||
import textwrap
|
||||
|
||||
def pack_rle(data):
|
||||
"""Use run-length encoding to pack the bytes"""
|
||||
rle = []
|
||||
value = data[0]
|
||||
count = 0
|
||||
for i in data:
|
||||
if i != value or count == 255:
|
||||
rle.append(count)
|
||||
rle.append(value)
|
||||
value = i
|
||||
count = 1
|
||||
else:
|
||||
count += 1
|
||||
rle.append(count)
|
||||
rle.append(value)
|
||||
return rle
|
||||
|
||||
class WriteSource:
|
||||
def __init__(self, lines_in_blocks):
|
||||
self.blocks = []
|
||||
self.values = []
|
||||
self.block_size = lines_in_blocks
|
||||
self.rows = 0
|
||||
|
||||
def add_pixel(self, value):
|
||||
self.values.append(value)
|
||||
|
||||
def convert_to_4bpp(self, data, chunk_size = 0):
|
||||
# Invert the image
|
||||
data = list(map(lambda i: 255 - i, data))
|
||||
# Quanitize 8-bit values into 4-bits
|
||||
data = list(map(lambda i: i >> 4, data))
|
||||
# Make sure there is an even number of elements
|
||||
if (len(data) & 1) == 1:
|
||||
data.append(0)
|
||||
# Combine each two adjacent values into one
|
||||
i = iter(data)
|
||||
data = list(map(lambda a, b: a << 4 | b, i ,i))
|
||||
# Pack the data
|
||||
data = pack_rle(data)
|
||||
# Convert values into hex strings
|
||||
return list(map(lambda a: "0x" + format(a, '02x'), data))
|
||||
|
||||
def end_row(self, y):
|
||||
# Pad each row into even number of values
|
||||
if len(self.values) & 1:
|
||||
self.values.append(0)
|
||||
|
||||
self.rows += 1
|
||||
if self.block_size and (self.rows % self.block_size) == 0:
|
||||
self.blocks.append(self.values)
|
||||
self.values = []
|
||||
|
||||
def write(self):
|
||||
if len(self.values):
|
||||
self.blocks.append(self.values)
|
||||
|
||||
block_strs = [];
|
||||
for b in self.blocks:
|
||||
data = self.convert_to_4bpp(b)
|
||||
data = ', '.join(data)
|
||||
data = textwrap.fill(data, 75, initial_indent = ' ', subsequent_indent = ' ')
|
||||
block_strs.append(data)
|
||||
|
||||
print("const unsigned char font[] PROGMEM = {")
|
||||
for i, b in enumerate(block_strs):
|
||||
if i:
|
||||
print(',')
|
||||
print('\n /* {} */'.format(i))
|
||||
print(b, end='')
|
||||
print("\n};")
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Converts a grayscale bitmap into a 16-level RLE packed C array for use as font data')
|
||||
parser.add_argument("input")
|
||||
parser.add_argument('--char_height', help='Adds a separator every so many lines', type=int)
|
||||
args = parser.parse_args()
|
||||
|
||||
writer = WriteSource(args.char_height)
|
||||
|
||||
img = Image.open(args.input).convert('L')
|
||||
for y in range(img.height):
|
||||
for x in range(img.width):
|
||||
writer.add_pixel(img.getpixel((x,y)))
|
||||
writer.end_row(y)
|
||||
writer.write()
|
||||
@@ -0,0 +1,113 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
# Written By Marcio Teixeira 2021 - SynDaver Labs, Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# To view a copy of the GNU General Public License, go to the following
|
||||
# location: <https://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import print_function
|
||||
from PIL import Image
|
||||
import argparse
|
||||
import textwrap
|
||||
import os
|
||||
import sys
|
||||
import zlib
|
||||
|
||||
class WriteSource:
|
||||
def __init__(self, mode):
|
||||
self.values = []
|
||||
self.mode = mode
|
||||
self.offset = 8
|
||||
self.byte = 0
|
||||
|
||||
def finish_byte(self):
|
||||
if self.offset != 8:
|
||||
self.values.append(self.byte)
|
||||
self.offset = 8
|
||||
self.byte = 0
|
||||
|
||||
def add_bits_to_byte(self, value, size = 1):
|
||||
self.offset -= size
|
||||
self.byte = self.byte | value << self.offset
|
||||
if self.offset == 0:
|
||||
self.finish_byte()
|
||||
|
||||
def append_rgb565(self, color):
|
||||
value = ((color[0] & 0xF8) << 8) + ((color[1] & 0xFC) << 3) + ((color[2] & 0xF8) >> 3)
|
||||
self.values.append((value & 0x00FF) >> 0);
|
||||
self.values.append((value & 0xFF00) >> 8);
|
||||
|
||||
def append_rgb332(self, color):
|
||||
value = (color[0] & 0xE0) + ((color[1] & 0xE0) >> 3) + ((color[2] & 0xC0) >> 6)
|
||||
self.values.append(value);
|
||||
|
||||
def append_grayscale(self, color, bits):
|
||||
luminance = int(0.2126 * color[0] + 0.7152 * color[1] + 0.0722 * color[2])
|
||||
self.add_bits_to_byte(luminance >> (8 - bits), bits)
|
||||
|
||||
def deflate(self, data):
|
||||
return zlib.compress(data)
|
||||
|
||||
def add_pixel(self, color):
|
||||
if self.mode == "l1":
|
||||
self.append_grayscale(color, 1)
|
||||
elif self.mode == "l2":
|
||||
self.append_grayscale(color, 2)
|
||||
elif self.mode == "l4":
|
||||
self.append_grayscale(color, 4)
|
||||
elif self.mode == "l8":
|
||||
self.append_grayscale(color, 8)
|
||||
elif self.mode == "rgb565":
|
||||
self.append_rgb565(color)
|
||||
elif self.mode == "rgb332":
|
||||
self.append_rgb332(color)
|
||||
|
||||
def end_row(self, y):
|
||||
if self.mode in ["l1", "l2", "l3"]:
|
||||
self.finish_byte()
|
||||
|
||||
def write(self, varname, deflate):
|
||||
print("Length of uncompressed data: ", len(self.values), file=sys.stderr)
|
||||
data = bytes(bytearray(self.values))
|
||||
if deflate:
|
||||
data = self.deflate(data)
|
||||
print("Length of data after compression: ", len(data), file=sys.stderr)
|
||||
data = bytearray(data)
|
||||
data = list(map(lambda a: "0x" + format(a, '02x'), data))
|
||||
nElements = len(data)
|
||||
data = ', '.join(data)
|
||||
data = textwrap.fill(data, 75, initial_indent = ' ', subsequent_indent = ' ')
|
||||
|
||||
print("const unsigned char " + varname + "[" + format(nElements) + "] PROGMEM = {")
|
||||
print(data)
|
||||
print("};")
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Converts a bitmap into a C array')
|
||||
parser.add_argument("input")
|
||||
parser.add_argument("-d", "--deflate", action="store_true", help="Packs the data using the deflate algorithm")
|
||||
parser.add_argument("-m", "--mode", default="l1", help="Mode, can be l1, l2, l4, l8, rgb332 or rgb565")
|
||||
args = parser.parse_args()
|
||||
|
||||
varname = os.path.splitext(os.path.basename(args.input))[0];
|
||||
|
||||
writer = WriteSource(args.mode)
|
||||
|
||||
img = Image.open(args.input)
|
||||
print("Image height: ", img.height, file=sys.stderr)
|
||||
print("Image width: ", img.width, file=sys.stderr)
|
||||
for y in range(img.height):
|
||||
for x in range(img.width):
|
||||
writer.add_pixel(img.getpixel((x,y)))
|
||||
writer.end_row(y)
|
||||
writer.write(varname, args.deflate)
|
||||
@@ -91,20 +91,22 @@ void AboutScreen::onRedraw(draw_mode_t) {
|
||||
draw_text_box(cmd, FW_INFO_POS, about_str, OPT_CENTER, font_medium);
|
||||
draw_text_box(cmd, INSET_POS(LICENSE_POS), GET_TEXT_F(MSG_LICENSE), OPT_CENTER, font_tiny);
|
||||
|
||||
cmd.font(font_medium)
|
||||
.colors(normal_btn)
|
||||
.tag(2).button(STATS_POS, GET_TEXT_F(MSG_INFO_STATS_MENU))
|
||||
.colors(action_btn)
|
||||
cmd.font(font_medium);
|
||||
#if ENABLED(PRINTCOUNTER) && defined(FTDI_STATISTICS_SCREEN)
|
||||
cmd.colors(normal_btn)
|
||||
.tag(2).button(STATS_POS, GET_TEXT_F(MSG_INFO_STATS_MENU));
|
||||
#endif
|
||||
cmd.colors(action_btn)
|
||||
.tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK));
|
||||
}
|
||||
|
||||
bool AboutScreen::onTouchEnd(uint8_t tag) {
|
||||
switch (tag) {
|
||||
case 1: GOTO_PREVIOUS(); break;
|
||||
#if ENABLED(PRINTCOUNTER)
|
||||
#if ENABLED(PRINTCOUNTER) && defined(FTDI_STATISTICS_SCREEN)
|
||||
case 2: GOTO_SCREEN(StatisticsScreen); break;
|
||||
#endif
|
||||
#if ENABLED(TOUCH_UI_DEVELOPER_MENU)
|
||||
#if ENABLED(TOUCH_UI_DEVELOPER_MENU) && defined(FTDI_DEVELOPER_MENU)
|
||||
case 3: GOTO_SCREEN(DeveloperMenu); break;
|
||||
#endif
|
||||
default: return false;
|
||||
|
||||
@@ -45,7 +45,7 @@ bool BaseScreen::buttonStyleCallback(CommandProcessor &cmd, uint8_t tag, uint8_t
|
||||
return false;
|
||||
}
|
||||
|
||||
#if LCD_TIMEOUT_TO_STATUS > 0
|
||||
#if SCREENS_CAN_TIME_OUT
|
||||
if (EventLoop::get_pressed_tag() != 0) {
|
||||
reset_menu_timeout();
|
||||
}
|
||||
@@ -65,7 +65,7 @@ bool BaseScreen::buttonStyleCallback(CommandProcessor &cmd, uint8_t tag, uint8_t
|
||||
}
|
||||
|
||||
void BaseScreen::onIdle() {
|
||||
#if LCD_TIMEOUT_TO_STATUS > 0
|
||||
#if SCREENS_CAN_TIME_OUT
|
||||
if ((millis() - last_interaction) > LCD_TIMEOUT_TO_STATUS) {
|
||||
reset_menu_timeout();
|
||||
#if ENABLED(TOUCH_UI_DEBUG)
|
||||
@@ -77,12 +77,10 @@ void BaseScreen::onIdle() {
|
||||
}
|
||||
|
||||
void BaseScreen::reset_menu_timeout() {
|
||||
#if LCD_TIMEOUT_TO_STATUS > 0
|
||||
last_interaction = millis();
|
||||
#endif
|
||||
TERN_(SCREENS_CAN_TIME_OUT, last_interaction = millis());
|
||||
}
|
||||
|
||||
#if LCD_TIMEOUT_TO_STATUS > 0
|
||||
#if SCREENS_CAN_TIME_OUT
|
||||
uint32_t BaseScreen::last_interaction;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
class BaseScreen : public UIScreen {
|
||||
protected:
|
||||
#if LCD_TIMEOUT_TO_STATUS > 0
|
||||
#if SCREENS_CAN_TIME_OUT
|
||||
static uint32_t last_interaction;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -190,17 +190,11 @@ bool BedMeshEditScreen::onTouchEnd(uint8_t tag) {
|
||||
}
|
||||
|
||||
void BedMeshEditScreen::show() {
|
||||
// On entry, home if needed and save current mesh
|
||||
if (!ExtUI::isMachineHomed()) {
|
||||
SpinnerDialogBox::enqueueAndWait_P(F("G28\nG29 S1"));
|
||||
// After the spinner, go to this screen.
|
||||
current_screen.forget();
|
||||
PUSH_SCREEN(BedMeshEditScreen);
|
||||
}
|
||||
else {
|
||||
injectCommands_P(PSTR("G29 S1"));
|
||||
GOTO_SCREEN(BedMeshEditScreen);
|
||||
}
|
||||
// On entry, always home (to account for possible Z offset changes) and save current mesh
|
||||
SpinnerDialogBox::enqueueAndWait_P(F("G28\nG29 S1"));
|
||||
// After the spinner, go to this screen.
|
||||
current_screen.forget();
|
||||
PUSH_SCREEN(BedMeshEditScreen);
|
||||
}
|
||||
|
||||
#endif // FTDI_BED_MESH_EDIT_SCREEN
|
||||
|
||||
@@ -132,7 +132,6 @@ void BedMeshViewScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI
|
||||
mydata.count = GRID_MAX_POINTS;
|
||||
break;
|
||||
case ExtUI::G26_START:
|
||||
GOTO_SCREEN(BedMeshViewScreen);
|
||||
mydata.message = nullptr;
|
||||
mydata.count = 0;
|
||||
break;
|
||||
@@ -161,7 +160,7 @@ void BedMeshViewScreen::doProbe() {
|
||||
void BedMeshViewScreen::doMeshValidation() {
|
||||
mydata.count = 0;
|
||||
GOTO_SCREEN(StatusScreen);
|
||||
injectCommands_P(PSTR("M75\nG28 O\nM117 Heating...\nG26 R X0 Y0\nG27\nM77"));
|
||||
injectCommands_P(PSTR("G28\nM117 Heating...\nG26 R X0 Y0\nG27"));
|
||||
}
|
||||
|
||||
void BedMeshViewScreen::show() {
|
||||
|
||||
@@ -83,8 +83,10 @@ void BootScreen::onIdle() {
|
||||
if (UIData::animations_enabled()) {
|
||||
// If there is a startup video in the flash SPI, play
|
||||
// that, otherwise show a static splash screen.
|
||||
if (!MediaPlayerScreen::playBootMedia())
|
||||
showSplashScreen();
|
||||
#ifdef FTDI_MEDIA_PLAYER_SCREEN
|
||||
if (!MediaPlayerScreen::playBootMedia())
|
||||
#endif
|
||||
showSplashScreen();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ constexpr static ChangeFilamentScreenData &mydata = screen_data.ChangeFilamentSc
|
||||
|
||||
/****************** COLOR SCALE ***********************/
|
||||
|
||||
uint32_t getWarmColor(uint16_t temp, uint16_t cool, uint16_t low, uint16_t med, uint16_t high) {
|
||||
uint32_t ChangeFilamentScreen::getWarmColor(uint16_t temp, uint16_t cool, uint16_t low, uint16_t med, uint16_t high) {
|
||||
rgb_t R0, R1, mix;
|
||||
|
||||
float t;
|
||||
|
||||
@@ -38,9 +38,9 @@ class ChangeFilamentScreen : public BaseScreen, public CachedScreen<CHANGE_FILAM
|
||||
static uint8_t getSoftenTemp();
|
||||
static ExtUI::extruder_t getExtruder();
|
||||
static void drawTempGradient(uint16_t x, uint16_t y, uint16_t w, uint16_t h);
|
||||
static uint32_t getTempColor(uint32_t temp);
|
||||
static void doPurge();
|
||||
public:
|
||||
static uint32_t getWarmColor(uint16_t temp, uint16_t cool, uint16_t low, uint16_t med, uint16_t high);
|
||||
static void onEntry();
|
||||
static void onExit();
|
||||
static void onRedraw(draw_mode_t);
|
||||
|
||||
@@ -35,12 +35,15 @@ void ConfirmUserRequestAlertBox::onRedraw(draw_mode_t mode) {
|
||||
bool ConfirmUserRequestAlertBox::onTouchEnd(uint8_t tag) {
|
||||
switch (tag) {
|
||||
case 1:
|
||||
if (ExtUI::isPrintingPaused()) {
|
||||
// The TuneMenu will call ExtUI::setUserConfirmed()
|
||||
GOTO_SCREEN(TuneMenu);
|
||||
current_screen.forget();
|
||||
}
|
||||
else {
|
||||
#ifdef FTDI_TUNE_MENU
|
||||
if (ExtUI::isPrintingPaused()) {
|
||||
// The TuneMenu will call ExtUI::setUserConfirmed()
|
||||
GOTO_SCREEN(TuneMenu);
|
||||
current_screen.forget();
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
ExtUI::setUserConfirmed();
|
||||
GOTO_PREVIOUS();
|
||||
}
|
||||
|
||||
@@ -262,4 +262,8 @@ void FilesScreen::onIdle() {
|
||||
#endif
|
||||
}
|
||||
|
||||
void FilesScreen::onMediaRemoved() {
|
||||
if (AT_SCREEN(FilesScreen)) GOTO_SCREEN(StatusScreen);
|
||||
}
|
||||
|
||||
#endif // FTDI_FILES_SCREEN
|
||||
|
||||
@@ -72,4 +72,5 @@ class FilesScreen : public BaseScreen, public CachedScreen<FILES_SCREEN_CACHE, F
|
||||
static void onRedraw(draw_mode_t);
|
||||
static bool onTouchEnd(uint8_t tag);
|
||||
static void onIdle();
|
||||
static void onMediaRemoved();
|
||||
};
|
||||
|
||||
@@ -86,10 +86,12 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) {
|
||||
}
|
||||
|
||||
if (what & FOREGROUND) {
|
||||
#if ENABLED(TOUCH_UI_PORTRAIT)
|
||||
constexpr uint8_t w = 2;
|
||||
#else
|
||||
constexpr uint8_t w = 1;
|
||||
#if defined(FTDI_LOCK_SCREEN) || DISABLED(TOUCH_UI_NO_BOOTSCREEN)
|
||||
#if ENABLED(TOUCH_UI_PORTRAIT)
|
||||
constexpr uint8_t w = 2;
|
||||
#else
|
||||
constexpr uint8_t w = 1;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
cmd.font(font_medium)
|
||||
@@ -99,8 +101,10 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) {
|
||||
.tag(2).slider(BTN_POS(3,2), BTN_SIZE(2,1), mydata.brightness, 128)
|
||||
#endif
|
||||
.tag(3).slider(BTN_POS(3,3), BTN_SIZE(2,1), mydata.volume, 0xFF)
|
||||
#ifdef FTDI_LOCK_SCREEN
|
||||
.colors(ui_toggle)
|
||||
.tag(4).toggle2(BTN_POS(3,4), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), LockScreen::is_enabled())
|
||||
#endif
|
||||
#if DISABLED(TOUCH_UI_NO_BOOTSCREEN)
|
||||
.tag(5).toggle2(BTN_POS(3,5), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), UIData::animations_enabled())
|
||||
#endif
|
||||
@@ -122,12 +126,14 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) {
|
||||
bool InterfaceSettingsScreen::onTouchEnd(uint8_t tag) {
|
||||
switch (tag) {
|
||||
case 1: GOTO_PREVIOUS(); return true;
|
||||
case 4:
|
||||
if (!LockScreen::is_enabled())
|
||||
LockScreen::enable();
|
||||
else
|
||||
LockScreen::disable();
|
||||
break;
|
||||
#ifdef FTDI_LOCK_SCREEN
|
||||
case 4:
|
||||
if (!LockScreen::is_enabled())
|
||||
LockScreen::enable();
|
||||
else
|
||||
LockScreen::disable();
|
||||
break;
|
||||
#endif
|
||||
case 5: UIData::enable_animations(!UIData::animations_enabled());; break;
|
||||
case 6: GOTO_SCREEN(InterfaceSoundsScreen); return true;
|
||||
default:
|
||||
@@ -191,7 +197,9 @@ void InterfaceSettingsScreen::failSafeSettings() {
|
||||
}
|
||||
|
||||
void InterfaceSettingsScreen::defaultSettings() {
|
||||
LockScreen::passcode = 0;
|
||||
#ifdef FTDI_LOCK_SCREEN
|
||||
LockScreen::passcode = 0;
|
||||
#endif
|
||||
SoundPlayer::set_volume(255);
|
||||
CLCD::set_brightness(255);
|
||||
UIData::reset_persistent_data();
|
||||
@@ -210,7 +218,11 @@ void InterfaceSettingsScreen::saveSettings(char *buff) {
|
||||
|
||||
persistent_data_t eeprom;
|
||||
|
||||
eeprom.passcode = LockScreen::passcode;
|
||||
#ifdef FTDI_LOCK_SCREEN
|
||||
eeprom.passcode = LockScreen::passcode;
|
||||
#else
|
||||
eeprom.passcode = 0;
|
||||
#endif
|
||||
eeprom.sound_volume = SoundPlayer::get_volume();
|
||||
eeprom.display_brightness = CLCD::get_brightness();
|
||||
eeprom.bit_flags = UIData::get_persistent_data();
|
||||
@@ -239,7 +251,9 @@ void InterfaceSettingsScreen::loadSettings(const char *buff) {
|
||||
|
||||
SERIAL_ECHOLNPGM("Loading setting from EEPROM");
|
||||
|
||||
LockScreen::passcode = eeprom.passcode;
|
||||
#ifdef FTDI_LOCK_SCREEN
|
||||
LockScreen::passcode = eeprom.passcode;
|
||||
#endif
|
||||
SoundPlayer::set_volume(eeprom.sound_volume);
|
||||
UIData::set_persistent_data(eeprom.bit_flags);
|
||||
CLCD::set_brightness(eeprom.display_brightness);
|
||||
|
||||
@@ -83,6 +83,7 @@ void LevelingMenu::onRedraw(draw_mode_t what) {
|
||||
.font(font_medium).colors(normal_btn)
|
||||
.enabled(EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION))
|
||||
.tag(2).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_LEVEL_X_AXIS))
|
||||
.enabled(ENABLED(HAS_BED_PROBE))
|
||||
.tag(3).button(PROBE_BED_POS, GET_TEXT_F(MSG_PROBE_BED))
|
||||
.enabled(ENABLED(HAS_MESH))
|
||||
.tag(4).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH))
|
||||
@@ -101,30 +102,32 @@ void LevelingMenu::onRedraw(draw_mode_t what) {
|
||||
|
||||
bool LevelingMenu::onTouchEnd(uint8_t tag) {
|
||||
switch (tag) {
|
||||
case 1: GOTO_PREVIOUS(); break;
|
||||
case 1: GOTO_PREVIOUS(); break;
|
||||
#if EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION)
|
||||
case 2: SpinnerDialogBox::enqueueAndWait_P(F("G34")); break;
|
||||
case 2: SpinnerDialogBox::enqueueAndWait_P(F("G34")); break;
|
||||
#endif
|
||||
case 3:
|
||||
#ifndef BED_LEVELING_COMMANDS
|
||||
#define BED_LEVELING_COMMANDS "G29"
|
||||
#if ENABLED(HAS_BED_PROBE)
|
||||
case 3:
|
||||
#ifndef BED_LEVELING_COMMANDS
|
||||
#define BED_LEVELING_COMMANDS "G29"
|
||||
#endif
|
||||
#if ENABLED(AUTO_BED_LEVELING_UBL)
|
||||
BedMeshViewScreen::doProbe();
|
||||
#else
|
||||
SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS));
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
#if ENABLED(AUTO_BED_LEVELING_UBL)
|
||||
BedMeshViewScreen::doProbe();
|
||||
#else
|
||||
SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS));
|
||||
#endif
|
||||
break;
|
||||
#if ENABLED(AUTO_BED_LEVELING_UBL)
|
||||
case 4: BedMeshViewScreen::show(); break;
|
||||
case 5: BedMeshEditScreen::show(); break;
|
||||
case 4: BedMeshViewScreen::show(); break;
|
||||
case 5: BedMeshEditScreen::show(); break;
|
||||
#endif
|
||||
#if ENABLED(G26_MESH_VALIDATION)
|
||||
case 6: BedMeshViewScreen::doMeshValidation(); break;
|
||||
case 6: BedMeshViewScreen::doMeshValidation(); break;
|
||||
#endif
|
||||
#if ENABLED(BLTOUCH)
|
||||
case 7: injectCommands_P(PSTR("M280 P0 S60")); break;
|
||||
case 8: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
|
||||
case 7: injectCommands_P(PSTR("M280 P0 S60")); break;
|
||||
case 8: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
|
||||
#endif
|
||||
default: return false;
|
||||
}
|
||||
@@ -132,4 +135,3 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) {
|
||||
}
|
||||
|
||||
#endif // FTDI_LEVELING_MENU
|
||||
|
||||
|
||||
@@ -0,0 +1,224 @@
|
||||
/*************
|
||||
* screens.h *
|
||||
*************/
|
||||
|
||||
/****************************************************************************
|
||||
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
|
||||
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation, either version 3 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* To view a copy of the GNU General Public License, go to the following *
|
||||
* location: <https://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
/********************************* DL CACHE SLOTS ******************************/
|
||||
|
||||
// In order to reduce SPI traffic, we cache display lists (DL) in RAMG. This
|
||||
// is done using the CLCD::DLCache class, which takes a unique ID for each
|
||||
// cache location. These IDs are defined here:
|
||||
|
||||
enum {
|
||||
STATUS_SCREEN_CACHE,
|
||||
MENU_SCREEN_CACHE,
|
||||
TUNE_SCREEN_CACHE,
|
||||
ALERT_BOX_CACHE,
|
||||
SPINNER_CACHE,
|
||||
ADVANCED_SETTINGS_SCREEN_CACHE,
|
||||
MOVE_AXIS_SCREEN_CACHE,
|
||||
TEMPERATURE_SCREEN_CACHE,
|
||||
STEPS_SCREEN_CACHE,
|
||||
MAX_FEEDRATE_SCREEN_CACHE,
|
||||
MAX_VELOCITY_SCREEN_CACHE,
|
||||
MAX_ACCELERATION_SCREEN_CACHE,
|
||||
DEFAULT_ACCELERATION_SCREEN_CACHE,
|
||||
FLOW_PERCENT_SCREEN_CACHE,
|
||||
#if HAS_LEVELING
|
||||
LEVELING_SCREEN_CACHE,
|
||||
#if HAS_BED_PROBE
|
||||
ZOFFSET_SCREEN_CACHE,
|
||||
#endif
|
||||
#if HAS_MESH
|
||||
BED_MESH_VIEW_SCREEN_CACHE,
|
||||
BED_MESH_EDIT_SCREEN_CACHE,
|
||||
#endif
|
||||
#endif
|
||||
#if ENABLED(BABYSTEPPING)
|
||||
ADJUST_OFFSETS_SCREEN_CACHE,
|
||||
#endif
|
||||
#if HAS_TRINAMIC_CONFIG
|
||||
STEPPER_CURRENT_SCREEN_CACHE,
|
||||
STEPPER_BUMP_SENSITIVITY_SCREEN_CACHE,
|
||||
#endif
|
||||
#if HAS_MULTI_HOTEND
|
||||
NOZZLE_OFFSET_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(BACKLASH_GCODE)
|
||||
BACKLASH_COMPENSATION_SCREEN_CACHE,
|
||||
#endif
|
||||
#if HAS_JUNCTION_DEVIATION
|
||||
JUNC_DEV_SCREEN_CACHE,
|
||||
#else
|
||||
JERK_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(CASE_LIGHT_ENABLE)
|
||||
CASE_LIGHT_SCREEN_CACHE,
|
||||
#endif
|
||||
#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)
|
||||
FILAMENT_MENU_CACHE,
|
||||
#endif
|
||||
#if ENABLED(LIN_ADVANCE)
|
||||
LINEAR_ADVANCE_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
||||
FILAMENT_RUNOUT_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(SDSUPPORT)
|
||||
FILES_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(CUSTOM_MENU_MAIN)
|
||||
CUSTOM_USER_MENUS_SCREEN_CACHE,
|
||||
#endif
|
||||
CHANGE_FILAMENT_SCREEN_CACHE,
|
||||
INTERFACE_SETTINGS_SCREEN_CACHE,
|
||||
INTERFACE_SOUNDS_SCREEN_CACHE,
|
||||
LOCK_SCREEN_CACHE,
|
||||
DISPLAY_TIMINGS_SCREEN_CACHE
|
||||
};
|
||||
|
||||
// To save MCU RAM, the status message is "baked" in to the status screen
|
||||
// cache, so we reserve a large chunk of memory for the DL cache
|
||||
|
||||
#define STATUS_SCREEN_DL_SIZE 4096
|
||||
#define ALERT_BOX_DL_SIZE 3072
|
||||
#define SPINNER_DL_SIZE 3072
|
||||
#define FILE_SCREEN_DL_SIZE 4160
|
||||
#define PRINTING_SCREEN_DL_SIZE 2048
|
||||
|
||||
/************************* MENU SCREEN DECLARATIONS *************************/
|
||||
|
||||
#include "base_screen.h"
|
||||
#include "base_numeric_adjustment_screen.h"
|
||||
#include "dialog_box_base_class.h"
|
||||
#include "status_screen.h"
|
||||
#include "main_menu.h"
|
||||
#include "advanced_settings_menu.h"
|
||||
#include "tune_menu.h"
|
||||
#include "boot_screen.h"
|
||||
#include "about_screen.h"
|
||||
#include "kill_screen.h"
|
||||
#include "alert_dialog_box.h"
|
||||
#include "spinner_dialog_box.h"
|
||||
#include "restore_failsafe_dialog_box.h"
|
||||
#include "save_settings_dialog_box.h"
|
||||
#include "confirm_start_print_dialog_box.h"
|
||||
#include "confirm_abort_print_dialog_box.h"
|
||||
#include "confirm_user_request_alert_box.h"
|
||||
#include "touch_calibration_screen.h"
|
||||
#include "touch_registers_screen.h"
|
||||
#include "change_filament_screen.h"
|
||||
#include "move_axis_screen.h"
|
||||
#include "steps_screen.h"
|
||||
#include "feedrate_percent_screen.h"
|
||||
#include "max_velocity_screen.h"
|
||||
#include "max_acceleration_screen.h"
|
||||
#include "default_acceleration_screen.h"
|
||||
#include "temperature_screen.h"
|
||||
#include "interface_sounds_screen.h"
|
||||
#include "interface_settings_screen.h"
|
||||
#include "lock_screen.h"
|
||||
#include "endstop_state_screen.h"
|
||||
#include "display_tuning_screen.h"
|
||||
#include "media_player_screen.h"
|
||||
|
||||
#if ENABLED(PRINTCOUNTER)
|
||||
#include "statistics_screen.h"
|
||||
#endif
|
||||
|
||||
#if HAS_TRINAMIC_CONFIG
|
||||
#include "stepper_current_screen.h"
|
||||
#include "stepper_bump_sensitivity_screen.h"
|
||||
#endif
|
||||
|
||||
#if HAS_MULTI_HOTEND
|
||||
#include "nozzle_offsets_screen.h"
|
||||
#endif
|
||||
|
||||
#if HAS_LEVELING
|
||||
#if ENABLED(TOUCH_UI_SYNDAVER_LEVEL)
|
||||
#include "syndaver_level/leveling_menu.h"
|
||||
#else
|
||||
#include "leveling_menu.h"
|
||||
#endif
|
||||
#if HAS_BED_PROBE
|
||||
#include "z_offset_screen.h"
|
||||
#endif
|
||||
#if HAS_MESH
|
||||
#include "bed_mesh_base.h"
|
||||
#include "bed_mesh_view_screen.h"
|
||||
#include "bed_mesh_edit_screen.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if ENABLED(CALIBRATION_GCODE)
|
||||
#include "confirm_auto_calibration_dialog_box.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(BABYSTEPPING)
|
||||
#include "nudge_nozzle_screen.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(BACKLASH_GCODE)
|
||||
#include "backlash_compensation_screen.h"
|
||||
#endif
|
||||
|
||||
#if HAS_JUNCTION_DEVIATION
|
||||
#include "junction_deviation_screen.h"
|
||||
#else
|
||||
#include "jerk_screen.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(CASE_LIGHT_ENABLE)
|
||||
#include "case_light_screen.h"
|
||||
#endif
|
||||
|
||||
#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)
|
||||
#include "filament_menu.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
||||
#include "filament_runout_screen.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(LIN_ADVANCE)
|
||||
#include "linear_advance_screen.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(SDSUPPORT)
|
||||
#include "files_screen.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(CUSTOM_MENU_MAIN)
|
||||
#include "custom_user_menus.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(TOUCH_UI_DEVELOPER_MENU)
|
||||
#include "developer_menu.h"
|
||||
#include "confirm_erase_flash_dialog_box.h"
|
||||
#include "widget_demo_screen.h"
|
||||
#include "stress_test_screen.h"
|
||||
#endif
|
||||
|
||||
#if NUM_LANGUAGES > 1
|
||||
#include "language_menu.h"
|
||||
#endif
|
||||
@@ -461,4 +461,14 @@ bool StatusScreen::onTouchEnd(uint8_t tag) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void StatusScreen::onMediaInserted() {
|
||||
if (AT_SCREEN(StatusScreen))
|
||||
setStatusMessage(GET_TEXT_F(MSG_MEDIA_INSERTED));
|
||||
}
|
||||
|
||||
void StatusScreen::onMediaRemoved() {
|
||||
if (AT_SCREEN(StatusScreen) || ExtUI::isPrintingFromMedia())
|
||||
setStatusMessage(GET_TEXT_F(MSG_MEDIA_REMOVED));
|
||||
}
|
||||
|
||||
#endif // FTDI_STATUS_SCREEN
|
||||
|
||||
@@ -42,4 +42,6 @@ class StatusScreen : public BaseScreen, public CachedScreen<STATUS_SCREEN_CACHE,
|
||||
static void onEntry();
|
||||
static void onIdle();
|
||||
static bool onTouchEnd(uint8_t tag);
|
||||
static void onMediaInserted();
|
||||
static void onMediaRemoved();
|
||||
};
|
||||
|
||||
@@ -34,28 +34,53 @@
|
||||
* Formats a temperature string (e.g. "100°C")
|
||||
*/
|
||||
void format_temp(char *str, const_celsius_float_t t1) {
|
||||
sprintf_P(str, PSTR("%3d" S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C));
|
||||
#ifdef TOUCH_UI_LCD_TEMP_PRECISION
|
||||
char num1[7];
|
||||
dtostrf(t1, 4 + TOUCH_UI_LCD_TEMP_PRECISION, TOUCH_UI_LCD_TEMP_PRECISION, num1);
|
||||
sprintf_P(str, PSTR("%s" S_FMT), num1, GET_TEXT(MSG_UNITS_C));
|
||||
#else
|
||||
sprintf_P(str, PSTR("%3d" S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a temperature string for an idle heater (e.g. "100 °C / idle")
|
||||
*/
|
||||
void format_temp_and_idle(char *str, const_celsius_float_t t1) {
|
||||
sprintf_P(str, PSTR("%3d" S_FMT " / " S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C), GET_TEXT(MSG_IDLE));
|
||||
#ifdef TOUCH_UI_LCD_TEMP_PRECISION
|
||||
char num1[7];
|
||||
dtostrf(t1, 4 + TOUCH_UI_LCD_TEMP_PRECISION, TOUCH_UI_LCD_TEMP_PRECISION, num1);
|
||||
sprintf_P(str, PSTR("%s" S_FMT " / " S_FMT), num1, GET_TEXT(MSG_UNITS_C), GET_TEXT(MSG_IDLE));
|
||||
#else
|
||||
sprintf_P(str, PSTR("%3d" S_FMT " / " S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C), GET_TEXT(MSG_IDLE));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a temperature string for an active heater (e.g. "100 / 200°C")
|
||||
*/
|
||||
void format_temp_and_temp(char *str, const_celsius_float_t t1, const_celsius_float_t t2) {
|
||||
sprintf_P(str, PSTR("%3d / %3d" S_FMT), ROUND(t1), ROUND(t2), GET_TEXT(MSG_UNITS_C));
|
||||
#ifdef TOUCH_UI_LCD_TEMP_PRECISION
|
||||
char num1[7], num2[7];
|
||||
dtostrf(t1, 4 + TOUCH_UI_LCD_TEMP_PRECISION, TOUCH_UI_LCD_TEMP_PRECISION, num1);
|
||||
dtostrf(t2, 4 + TOUCH_UI_LCD_TEMP_PRECISION, TOUCH_UI_LCD_TEMP_PRECISION, num2);
|
||||
sprintf_P(str, PSTR("%s / %s" S_FMT), num1, num2, GET_TEXT(MSG_UNITS_C));
|
||||
#else
|
||||
sprintf_P(str, PSTR("%3d / %3d" S_FMT), ROUND(t1), ROUND(t2), GET_TEXT(MSG_UNITS_C));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a temperature string for a material (e.g. "100°C (PLA)")
|
||||
*/
|
||||
void format_temp_and_material(char *str, const_celsius_float_t t1, const char *material) {
|
||||
sprintf_P(str, PSTR("%3d" S_FMT " (" S_FMT ")"), ROUND(t1), GET_TEXT(MSG_UNITS_C), material);
|
||||
#ifdef TOUCH_UI_LCD_TEMP_PRECISION
|
||||
char num1[7];
|
||||
dtostrf(t1, 4 + TOUCH_UI_LCD_TEMP_PRECISION, TOUCH_UI_LCD_TEMP_PRECISION, num1);
|
||||
sprintf_P(str, PSTR("%s" S_FMT " (" S_FMT ")"), num1, GET_TEXT(MSG_UNITS_C), material);
|
||||
#else
|
||||
sprintf_P(str, PSTR("%3d" S_FMT " (" S_FMT ")"), ROUND(t1), GET_TEXT(MSG_UNITS_C), material);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -77,8 +77,11 @@ void TuneMenu::onRedraw(draw_mode_t what) {
|
||||
.tag(3).button(FIL_CHANGE_POS, GET_TEXT_F(MSG_FILAMENTCHANGE))
|
||||
.enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR))
|
||||
.tag(9).button(FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT))
|
||||
.enabled(BOTH(HAS_LEVELING, HAS_BED_PROBE) || ENABLED(BABYSTEPPING))
|
||||
.tag(4).button(NUDGE_NOZ_POS, GET_TEXT_F(TERN(BABYSTEPPING, MSG_NUDGE_NOZZLE, MSG_ZPROBE_ZOFFSET)))
|
||||
#if ENABLED(BABYSTEPPING) && HAS_MULTI_HOTEND
|
||||
.tag(4).button(NUDGE_NOZ_POS, GET_TEXT_F(MSG_NUDGE_NOZZLE))
|
||||
#elif BOTH(HAS_LEVELING, HAS_BED_PROBE)
|
||||
.tag(4).button(NUDGE_NOZ_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET))
|
||||
#endif
|
||||
.tag(5).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED))
|
||||
.enabled(sdOrHostPrinting)
|
||||
.tag(sdOrHostPaused ? 7 : 6)
|
||||
@@ -99,11 +102,11 @@ bool TuneMenu::onTouchEnd(uint8_t tag) {
|
||||
using namespace Theme;
|
||||
using namespace ExtUI;
|
||||
switch (tag) {
|
||||
case 1: GOTO_PREVIOUS(); break;
|
||||
case 1: SaveSettingsDialogBox::promptToSaveSettings(); break;
|
||||
case 2: GOTO_SCREEN(TemperatureScreen); break;
|
||||
case 3: GOTO_SCREEN(ChangeFilamentScreen); break;
|
||||
case 4:
|
||||
#if ENABLED(BABYSTEPPING)
|
||||
#if ENABLED(BABYSTEPPING) && HAS_MULTI_HOTEND
|
||||
GOTO_SCREEN(NudgeNozzleScreen);
|
||||
#elif BOTH(HAS_LEVELING, HAS_BED_PROBE)
|
||||
GOTO_SCREEN(ZOffsetScreen);
|
||||
|
||||
@@ -36,7 +36,14 @@ constexpr static ZOffsetScreenData &mydata = screen_data.ZOffsetScreen;
|
||||
|
||||
void ZOffsetScreen::onEntry() {
|
||||
mydata.z = SHEET_THICKNESS;
|
||||
mydata.softEndstopState = getSoftEndstopState();
|
||||
BaseNumericAdjustmentScreen::onEntry();
|
||||
if (wizardRunning())
|
||||
setSoftEndstopState(false);
|
||||
}
|
||||
|
||||
void ZOffsetScreen::onExit() {
|
||||
setSoftEndstopState(mydata.softEndstopState);
|
||||
}
|
||||
|
||||
void ZOffsetScreen::onRedraw(draw_mode_t what) {
|
||||
@@ -46,21 +53,17 @@ void ZOffsetScreen::onRedraw(draw_mode_t what) {
|
||||
w.heading( GET_TEXT_F(MSG_ZPROBE_ZOFFSET));
|
||||
w.color(z_axis).adjuster(4, GET_TEXT_F(MSG_ZPROBE_ZOFFSET), getZOffset_mm());
|
||||
w.increments();
|
||||
w.button(2, GET_TEXT_F(MSG_PROBE_WIZARD), !isPrinting());
|
||||
w.button(2, GET_TEXT_F(MSG_PROBE_WIZARD), !isPrinting() && !wizardRunning());
|
||||
}
|
||||
|
||||
void ZOffsetScreen::move(float mm, int16_t steps) {
|
||||
// We can't store state after the call to the AlertBox, so
|
||||
// check whether the current position equal mydata.z in order
|
||||
// to know whether the user started the wizard.
|
||||
if (getAxisPosition_mm(Z) == mydata.z) {
|
||||
// In the wizard
|
||||
if (wizardRunning()) {
|
||||
mydata.z += mm;
|
||||
setAxisPosition_mm(mydata.z, Z);
|
||||
}
|
||||
else {
|
||||
// Otherwise doing a manual adjustment, possibly during a print.
|
||||
babystepAxis_steps(steps, Z);
|
||||
TERN(BABYSTEPPING, babystepAxis_steps(steps, Z), UNUSED(steps));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,9 +87,16 @@ void ZOffsetScreen::runWizard() {
|
||||
AlertDialogBox::show(PSTR("After the printer finishes homing, adjust the Z Offset so that a sheet of paper can pass between the nozzle and bed with slight resistance."));
|
||||
}
|
||||
|
||||
bool ZOffsetScreen::wizardRunning() {
|
||||
// We can't store state after the call to the AlertBox, so
|
||||
// check whether the current Z position equals mydata.z in order
|
||||
// to know whether the user started the wizard.
|
||||
return getAxisPosition_mm(Z) == mydata.z;
|
||||
}
|
||||
|
||||
bool ZOffsetScreen::onTouchHeld(uint8_t tag) {
|
||||
const int16_t steps = mmToWholeSteps(getIncrement(), Z);
|
||||
const float increment = mmFromWholeSteps(steps, Z);
|
||||
const int16_t steps = TERN(BABYSTEPPING, mmToWholeSteps(getIncrement(), Z), 0);
|
||||
const float increment = TERN(BABYSTEPPING, mmFromWholeSteps(steps, Z), getIncrement());
|
||||
switch (tag) {
|
||||
case 2: runWizard(); break;
|
||||
case 4: UI_DECREMENT(ZOffset_mm); move(-increment, -steps); break;
|
||||
|
||||
@@ -27,14 +27,17 @@
|
||||
|
||||
struct ZOffsetScreenData : public BaseNumericAdjustmentScreenData {
|
||||
float z;
|
||||
bool softEndstopState;
|
||||
};
|
||||
|
||||
class ZOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen<ZOFFSET_SCREEN_CACHE> {
|
||||
private:
|
||||
static void move(float mm, int16_t steps);
|
||||
static void runWizard();
|
||||
static bool wizardRunning();
|
||||
public:
|
||||
static void onEntry();
|
||||
static void onExit();
|
||||
static void onRedraw(draw_mode_t);
|
||||
static bool onTouchHeld(uint8_t tag);
|
||||
};
|
||||
|
||||
@@ -130,7 +130,7 @@ namespace Language_en {
|
||||
PROGMEM Language_Str MSG_EEPROM_RESTORED = u8"Settings restored from backup";
|
||||
PROGMEM Language_Str MSG_EEPROM_RESET = u8"Settings restored to default";
|
||||
PROGMEM Language_Str MSG_EEPROM_SAVED = u8"Settings saved!";
|
||||
PROGMEM Language_Str MSG_EEPROM_SAVE_PROMPT = u8"Do you wish to save these settings for next power-on?";
|
||||
PROGMEM Language_Str MSG_EEPROM_SAVE_PROMPT = u8"Settings applied. Save these settings for next power-on?";
|
||||
PROGMEM Language_Str MSG_EEPROM_RESET_WARNING = u8"Are you sure? Customizations will be lost.";
|
||||
|
||||
PROGMEM Language_Str MSG_PASSCODE_REJECTED = u8"Wrong passcode!";
|
||||
@@ -146,7 +146,7 @@ namespace Language_en {
|
||||
PROGMEM Language_Str MSG_AXIS_LEVELING = u8"Axis Leveling";
|
||||
PROGMEM Language_Str MSG_PROBE_BED = u8"Probe Mesh";
|
||||
PROGMEM Language_Str MSG_SHOW_MESH = u8"View Mesh";
|
||||
PROGMEM Language_Str MSG_PRINT_TEST = u8"Print Test";
|
||||
PROGMEM Language_Str MSG_PRINT_TEST = u8"Print Test (PLA)";
|
||||
PROGMEM Language_Str MSG_MOVE_Z_TO_TOP = u8"Raise Z to Top";
|
||||
|
||||
#if ENABLED(TOUCH_UI_LULZBOT_BIO)
|
||||
|
||||
@@ -113,6 +113,7 @@ SCREEN_TABLE {
|
||||
DECL_SCREEN_IF_INCLUDED(COCOA_PREHEAT_MENU)
|
||||
DECL_SCREEN_IF_INCLUDED(COCOA_PREHEAT_SCREEN)
|
||||
DECL_SCREEN_IF_INCLUDED(COCOA_LOAD_CHOCOLATE_SCREEN)
|
||||
DECL_SCREEN_IF_INCLUDED(COCOA_LEVELING_MENU)
|
||||
DECL_SCREEN_IF_INCLUDED(COCOA_MOVE_XYZ_SCREEN)
|
||||
DECL_SCREEN_IF_INCLUDED(COCOA_MOVE_E_SCREEN)
|
||||
};
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "compat.h"
|
||||
#include "config.h"
|
||||
|
||||
#if ENABLED(TOUCH_UI_FTDI_EVE)
|
||||
|
||||
@@ -37,237 +37,14 @@
|
||||
|
||||
extern tiny_timer_t refresh_timer;
|
||||
|
||||
/********************************* DL CACHE SLOTS ******************************/
|
||||
|
||||
// In order to reduce SPI traffic, we cache display lists (DL) in RAMG. This
|
||||
// is done using the CLCD::DLCache class, which takes a unique ID for each
|
||||
// cache location. These IDs are defined here:
|
||||
|
||||
enum {
|
||||
STATUS_SCREEN_CACHE,
|
||||
MENU_SCREEN_CACHE,
|
||||
TUNE_SCREEN_CACHE,
|
||||
ALERT_BOX_CACHE,
|
||||
SPINNER_CACHE,
|
||||
ADVANCED_SETTINGS_SCREEN_CACHE,
|
||||
MOVE_AXIS_SCREEN_CACHE,
|
||||
TEMPERATURE_SCREEN_CACHE,
|
||||
STEPS_SCREEN_CACHE,
|
||||
MAX_FEEDRATE_SCREEN_CACHE,
|
||||
MAX_VELOCITY_SCREEN_CACHE,
|
||||
MAX_ACCELERATION_SCREEN_CACHE,
|
||||
DEFAULT_ACCELERATION_SCREEN_CACHE,
|
||||
FLOW_PERCENT_SCREEN_CACHE,
|
||||
#if HAS_LEVELING
|
||||
LEVELING_SCREEN_CACHE,
|
||||
#if HAS_BED_PROBE
|
||||
ZOFFSET_SCREEN_CACHE,
|
||||
#endif
|
||||
#if HAS_MESH
|
||||
BED_MESH_VIEW_SCREEN_CACHE,
|
||||
BED_MESH_EDIT_SCREEN_CACHE,
|
||||
#endif
|
||||
#endif
|
||||
#if ENABLED(BABYSTEPPING)
|
||||
ADJUST_OFFSETS_SCREEN_CACHE,
|
||||
#endif
|
||||
#if HAS_TRINAMIC_CONFIG
|
||||
STEPPER_CURRENT_SCREEN_CACHE,
|
||||
STEPPER_BUMP_SENSITIVITY_SCREEN_CACHE,
|
||||
#endif
|
||||
#if HAS_MULTI_HOTEND
|
||||
NOZZLE_OFFSET_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(BACKLASH_GCODE)
|
||||
BACKLASH_COMPENSATION_SCREEN_CACHE,
|
||||
#endif
|
||||
#if HAS_JUNCTION_DEVIATION
|
||||
JUNC_DEV_SCREEN_CACHE,
|
||||
#else
|
||||
JERK_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(CASE_LIGHT_ENABLE)
|
||||
CASE_LIGHT_SCREEN_CACHE,
|
||||
#endif
|
||||
#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)
|
||||
FILAMENT_MENU_CACHE,
|
||||
#endif
|
||||
#if ENABLED(LIN_ADVANCE)
|
||||
LINEAR_ADVANCE_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
||||
FILAMENT_RUNOUT_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(TOUCH_UI_LULZBOT_BIO)
|
||||
PRINTING_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(TOUCH_UI_COCOA_PRESS)
|
||||
PREHEAT_MENU_CACHE,
|
||||
PREHEAT_TIMER_SCREEN_CACHE,
|
||||
LOAD_CHOCOLATE_SCREEN_CACHE,
|
||||
MOVE_XYZ_SCREEN_CACHE,
|
||||
MOVE_E_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(SDSUPPORT)
|
||||
FILES_SCREEN_CACHE,
|
||||
#endif
|
||||
#if ENABLED(CUSTOM_MENU_MAIN)
|
||||
CUSTOM_USER_MENUS_SCREEN_CACHE,
|
||||
#endif
|
||||
CHANGE_FILAMENT_SCREEN_CACHE,
|
||||
INTERFACE_SETTINGS_SCREEN_CACHE,
|
||||
INTERFACE_SOUNDS_SCREEN_CACHE,
|
||||
LOCK_SCREEN_CACHE,
|
||||
DISPLAY_TIMINGS_SCREEN_CACHE
|
||||
};
|
||||
|
||||
// To save MCU RAM, the status message is "baked" in to the status screen
|
||||
// cache, so we reserve a large chunk of memory for the DL cache
|
||||
|
||||
#define STATUS_SCREEN_DL_SIZE 4096
|
||||
#define ALERT_BOX_DL_SIZE 3072
|
||||
#define SPINNER_DL_SIZE 3072
|
||||
#define FILE_SCREEN_DL_SIZE 4160
|
||||
#define PRINTING_SCREEN_DL_SIZE 2048
|
||||
|
||||
/************************* MENU SCREEN DECLARATIONS *************************/
|
||||
|
||||
#include "generic/base_screen.h"
|
||||
#include "generic/base_numeric_adjustment_screen.h"
|
||||
#include "generic/dialog_box_base_class.h"
|
||||
|
||||
#if ENABLED(TOUCH_UI_LULZBOT_BIO)
|
||||
#include "bio_status_screen.h"
|
||||
#include "bio_main_menu.h"
|
||||
#include "bio_tune_menu.h"
|
||||
#include "bio_advanced_settings.h"
|
||||
#include "bio_printing_dialog_box.h"
|
||||
#include "bio_confirm_home_xyz.h"
|
||||
#include "bio_confirm_home_e.h"
|
||||
|
||||
#include "bioprinter/screens.h"
|
||||
#elif ENABLED(TOUCH_UI_COCOA_PRESS)
|
||||
#include "generic/move_axis_screen.h"
|
||||
#include "generic/flow_percent_screen.h"
|
||||
#include "generic/tune_menu.h"
|
||||
#include "cocoa_press/status_screen.h"
|
||||
#include "cocoa_press/main_menu.h"
|
||||
#include "cocoa_press/advanced_settings_menu.h"
|
||||
#include "cocoa_press/preheat_menu.h"
|
||||
#include "cocoa_press/preheat_screen.h"
|
||||
#include "cocoa_press/load_chocolate.h"
|
||||
#include "cocoa_press/move_xyz_screen.h"
|
||||
#include "cocoa_press/move_e_screen.h"
|
||||
|
||||
#include "cocoa_press/screens.h"
|
||||
#elif ENABLED(TOUCH_UI_SYNDAVER_LEVEL)
|
||||
#include "syndaver_level/screens.h"
|
||||
#else
|
||||
#include "generic/status_screen.h"
|
||||
#include "generic/main_menu.h"
|
||||
#include "generic/advanced_settings_menu.h"
|
||||
#include "generic/tune_menu.h"
|
||||
#endif
|
||||
|
||||
#include "generic/boot_screen.h"
|
||||
#include "generic/about_screen.h"
|
||||
#include "generic/kill_screen.h"
|
||||
#include "generic/alert_dialog_box.h"
|
||||
#include "generic/spinner_dialog_box.h"
|
||||
#include "generic/restore_failsafe_dialog_box.h"
|
||||
#include "generic/save_settings_dialog_box.h"
|
||||
#include "generic/confirm_start_print_dialog_box.h"
|
||||
#include "generic/confirm_abort_print_dialog_box.h"
|
||||
#include "generic/confirm_user_request_alert_box.h"
|
||||
#include "generic/touch_calibration_screen.h"
|
||||
#include "generic/touch_registers_screen.h"
|
||||
#include "generic/change_filament_screen.h"
|
||||
#include "generic/move_axis_screen.h"
|
||||
#include "generic/steps_screen.h"
|
||||
#include "generic/feedrate_percent_screen.h"
|
||||
#include "generic/max_velocity_screen.h"
|
||||
#include "generic/max_acceleration_screen.h"
|
||||
#include "generic/default_acceleration_screen.h"
|
||||
#include "generic/temperature_screen.h"
|
||||
#include "generic/interface_sounds_screen.h"
|
||||
#include "generic/interface_settings_screen.h"
|
||||
#include "generic/lock_screen.h"
|
||||
#include "generic/endstop_state_screen.h"
|
||||
#include "generic/display_tuning_screen.h"
|
||||
#include "generic/media_player_screen.h"
|
||||
|
||||
#if ENABLED(PRINTCOUNTER)
|
||||
#include "generic/statistics_screen.h"
|
||||
#endif
|
||||
|
||||
#if HAS_TRINAMIC_CONFIG
|
||||
#include "generic/stepper_current_screen.h"
|
||||
#include "generic/stepper_bump_sensitivity_screen.h"
|
||||
#endif
|
||||
|
||||
#if HAS_MULTI_HOTEND
|
||||
#include "generic/nozzle_offsets_screen.h"
|
||||
#endif
|
||||
|
||||
#if HAS_LEVELING
|
||||
#include "generic/leveling_menu.h"
|
||||
#if HAS_BED_PROBE
|
||||
#include "generic/z_offset_screen.h"
|
||||
#endif
|
||||
#if HAS_MESH
|
||||
#include "generic/bed_mesh_base.h"
|
||||
#include "generic/bed_mesh_view_screen.h"
|
||||
#include "generic/bed_mesh_edit_screen.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if ENABLED(CALIBRATION_GCODE)
|
||||
#include "generic/confirm_auto_calibration_dialog_box.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(BABYSTEPPING)
|
||||
#include "generic/nudge_nozzle_screen.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(BACKLASH_GCODE)
|
||||
#include "generic/backlash_compensation_screen.h"
|
||||
#endif
|
||||
|
||||
#if HAS_JUNCTION_DEVIATION
|
||||
#include "generic/junction_deviation_screen.h"
|
||||
#else
|
||||
#include "generic/jerk_screen.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(CASE_LIGHT_ENABLE)
|
||||
#include "generic/case_light_screen.h"
|
||||
#endif
|
||||
|
||||
#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)
|
||||
#include "generic/filament_menu.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
||||
#include "generic/filament_runout_screen.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(LIN_ADVANCE)
|
||||
#include "generic/linear_advance_screen.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(SDSUPPORT)
|
||||
#include "generic/files_screen.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(CUSTOM_MENU_MAIN)
|
||||
#include "generic/custom_user_menus.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(TOUCH_UI_DEVELOPER_MENU)
|
||||
#include "generic/developer_menu.h"
|
||||
#include "generic/confirm_erase_flash_dialog_box.h"
|
||||
#include "generic/widget_demo_screen.h"
|
||||
#include "generic/stress_test_screen.h"
|
||||
#endif
|
||||
|
||||
#if NUM_LANGUAGES > 1
|
||||
#include "generic/language_menu.h"
|
||||
#include "generic/screens.h"
|
||||
#endif
|
||||
|
||||
#endif // TOUCH_UI_FTDI_EVE
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace Theme {
|
||||
.height = 23,
|
||||
};
|
||||
|
||||
constexpr PROGMEM unsigned char Extruder_Icon[] = {
|
||||
constexpr PROGMEM unsigned char Extruder_Icon[69] = {
|
||||
0x3F, 0xFF, 0xFC,
|
||||
0x7F, 0xFF, 0xFE,
|
||||
0xC0, 0x00, 0x03,
|
||||
@@ -68,12 +68,12 @@ namespace Theme {
|
||||
.filter = BILINEAR,
|
||||
.wrapx = BORDER,
|
||||
.wrapy = BORDER,
|
||||
.RAMG_offset = 8100,
|
||||
.RAMG_offset = 8069,
|
||||
.width = 32,
|
||||
.height = 23,
|
||||
};
|
||||
|
||||
constexpr PROGMEM unsigned char Bed_Heat_Icon[] = {
|
||||
constexpr PROGMEM unsigned char Bed_Heat_Icon[92] = {
|
||||
0x01, 0x81, 0x81, 0x80,
|
||||
0x01, 0x81, 0x81, 0x80,
|
||||
0x00, 0xC0, 0xC0, 0xC0,
|
||||
@@ -105,12 +105,12 @@ namespace Theme {
|
||||
.filter = BILINEAR,
|
||||
.wrapx = BORDER,
|
||||
.wrapy = BORDER,
|
||||
.RAMG_offset = 8300,
|
||||
.RAMG_offset = 8161,
|
||||
.width = 32,
|
||||
.height = 32,
|
||||
};
|
||||
|
||||
constexpr PROGMEM unsigned char Fan_Icon[] = {
|
||||
constexpr PROGMEM unsigned char Fan_Icon[128] = {
|
||||
0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF8, 0x00, 0x00, 0x1F,
|
||||
@@ -151,12 +151,12 @@ namespace Theme {
|
||||
.filter = BILINEAR,
|
||||
.wrapx = BORDER,
|
||||
.wrapy = BORDER,
|
||||
.RAMG_offset = 9000,
|
||||
.RAMG_offset = 8289,
|
||||
.width = 50,
|
||||
.height = 20,
|
||||
};
|
||||
|
||||
constexpr PROGMEM unsigned char TD_Icon[] = {
|
||||
constexpr PROGMEM unsigned char TD_Icon[140] = {
|
||||
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, // Thumb Drive Widget
|
||||
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80,
|
||||
@@ -179,5 +179,55 @@ namespace Theme {
|
||||
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00
|
||||
};
|
||||
|
||||
constexpr PROGMEM uint32_t UTF8_FONT_OFFSET = 10000;
|
||||
constexpr PROGMEM bitmap_info_t File_Icon_Info = {
|
||||
.format = L1,
|
||||
.linestride = 4,
|
||||
.filter = BILINEAR,
|
||||
.wrapx = BORDER,
|
||||
.wrapy = BORDER,
|
||||
.RAMG_offset = 8429,
|
||||
.width = 25,
|
||||
.height = 32,
|
||||
};
|
||||
|
||||
const unsigned char File_Icon[128] PROGMEM = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00,
|
||||
0x40, 0x02, 0x80, 0x00, 0x40, 0x02, 0x40, 0x00, 0x40, 0x02, 0x20, 0x00,
|
||||
0x40, 0x02, 0x10, 0x00, 0x40, 0x02, 0x08, 0x00, 0x40, 0x02, 0x04, 0x00,
|
||||
0x40, 0x02, 0x02, 0x00, 0x40, 0x03, 0xFF, 0x00, 0x40, 0x00, 0x01, 0x00,
|
||||
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
|
||||
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
|
||||
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
|
||||
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
|
||||
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
|
||||
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
|
||||
0x7F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
constexpr PROGMEM bitmap_info_t Clock_Icon_Info = {
|
||||
.format = L1,
|
||||
.linestride = 4,
|
||||
.filter = BILINEAR,
|
||||
.wrapx = BORDER,
|
||||
.wrapy = BORDER,
|
||||
.RAMG_offset = 8557,
|
||||
.width = 32,
|
||||
.height = 32,
|
||||
};
|
||||
|
||||
const unsigned char Clock_Icon[128] PROGMEM = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7E, 0x7E, 0x00,
|
||||
0x00, 0xE0, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x07, 0x01, 0x00, 0xE0,
|
||||
0x0C, 0x01, 0x80, 0x70, 0x0C, 0x01, 0x80, 0x30, 0x18, 0x01, 0x80, 0x18,
|
||||
0x30, 0x01, 0x80, 0x08, 0x30, 0x01, 0x80, 0x0C, 0x20, 0x01, 0x80, 0x0C,
|
||||
0x60, 0x01, 0x80, 0x04, 0x60, 0x01, 0x80, 0x06, 0x60, 0x01, 0x80, 0x06,
|
||||
0x60, 0x01, 0xFF, 0x06, 0x60, 0x01, 0xFF, 0x06, 0x60, 0x00, 0x00, 0x06,
|
||||
0x60, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x0C,
|
||||
0x30, 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00, 0x18,
|
||||
0x0C, 0x00, 0x00, 0x30, 0x0E, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0xE0,
|
||||
0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x7F, 0xFE, 0x00,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
constexpr PROGMEM uint32_t UTF8_FONT_OFFSET = 10000;
|
||||
}; // namespace Theme
|
||||
|
||||
@@ -108,6 +108,7 @@ namespace Theme {
|
||||
|
||||
constexpr uint32_t bed_mesh_lines_rgb = accent_color_6;
|
||||
constexpr uint32_t bed_mesh_shadow_rgb = 0x444444;
|
||||
#define BED_MESH_POINTS_GRAY
|
||||
#else
|
||||
constexpr uint32_t theme_darkest = gray_color_1;
|
||||
constexpr uint32_t theme_dark = gray_color_2;
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
* location: <https://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
|
||||
#include "../compat.h"
|
||||
#include "../config.h"
|
||||
|
||||
#if ENABLED(TOUCH_UI_FTDI_EVE)
|
||||
|
||||
|
||||
@@ -309,7 +309,7 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
float getAxisPosition_mm(const axis_t axis) {
|
||||
return TERN0(JOYSTICK, flags.jogging) ? destination[axis] : current_position[axis];
|
||||
return current_position[axis];
|
||||
}
|
||||
|
||||
float getAxisPosition_mm(const extruder_t extruder) {
|
||||
@@ -1044,10 +1044,10 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
bool isPrintingFromMediaPaused() {
|
||||
return TERN0(SDSUPPORT, isPrintingFromMedia() && printingIsPaused());
|
||||
return TERN0(SDSUPPORT, IS_SD_PAUSED());
|
||||
}
|
||||
|
||||
bool isPrintingFromMedia() { return IS_SD_PRINTING(); }
|
||||
bool isPrintingFromMedia() { return TERN0(SDSUPPORT, IS_SD_PRINTING() || IS_SD_PAUSED()); }
|
||||
|
||||
bool isPrinting() {
|
||||
return commandsInQueue() || isPrintingFromMedia() || printJobOngoing() || printingIsPaused();
|
||||
|
||||
@@ -194,7 +194,11 @@ namespace ExtUI {
|
||||
void setHostResponse(const uint8_t);
|
||||
#endif
|
||||
|
||||
inline void simulateUserClick() { ui.lcd_clicked = true; }
|
||||
inline void simulateUserClick() {
|
||||
#if EITHER(HAS_LCD_MENU, EXTENSIBLE_UI)
|
||||
ui.lcd_clicked = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if ENABLED(PRINTCOUNTER)
|
||||
char* getFailedPrints_str(char buffer[21]);
|
||||
|
||||
@@ -89,6 +89,7 @@ namespace Language_an {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Mover 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidat");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Base Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Boquilla");
|
||||
|
||||
@@ -79,6 +79,7 @@ namespace Language_bg {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Премести с 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Премести с 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Премести с 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Премести с 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Скорост");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" Дюза");
|
||||
|
||||
@@ -89,6 +89,7 @@ namespace Language_ca {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mou 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mou 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mou 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Mou 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Velocitat");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Llit Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle");
|
||||
|
||||
@@ -241,6 +241,7 @@ namespace Language_cz {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunout o 0,1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunout o 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunout o 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Posunout o 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Rychlost");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Výška podl.");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Tryska");
|
||||
|
||||
@@ -79,6 +79,7 @@ namespace Language_da {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Flyt 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Flyt 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Flyt 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Flyt 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Hastighed");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Plade Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Dyse");
|
||||
|
||||
@@ -231,9 +231,10 @@ namespace Language_de {
|
||||
PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Bewege Extruder *");
|
||||
PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend zu kalt");
|
||||
PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT(" %s mm");
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT(" 0,1 mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(" 1,0 mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("10,0 mm");
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT(" 0,1 mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(" 1,0 mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT(" 10,0 mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("100,0 mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Geschw.");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Bett Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Düse");
|
||||
|
||||
@@ -87,6 +87,7 @@ namespace Language_el {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Μετακίνηση 0,1 μμ");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Μετακίνηση 1 μμ");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Μετακίνηση 10 μμ");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Μετακίνηση 100 μμ");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Ταχύτητα");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Επ. Εκτύπωσης Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Ακροφύσιο");
|
||||
|
||||
@@ -88,6 +88,7 @@ namespace Language_el_gr {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Μετακίνηση 0,1 μμ");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Μετακίνηση 1 μμ");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Μετακίνηση 10 μμ");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Μετακίνηση 100 μμ");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Ταχύτητα");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Κλίνη Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Ακροφύσιο");
|
||||
|
||||
@@ -281,9 +281,11 @@ namespace Language_en {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Move 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Move 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Move 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Move 100mm");
|
||||
PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Move 0.001in");
|
||||
PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Move 0.01in");
|
||||
PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Move 0.1in");
|
||||
PROGMEM Language_Str MSG_MOVE_1IN = _UxGT("Move 1.0in");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Speed");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle");
|
||||
@@ -590,9 +592,9 @@ namespace Language_en {
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_I = _UxGT("I Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_J = _UxGT("J Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_K = _UxGT("K Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_I = AXIS4_STR _UxGT(" Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_J = AXIS5_STR _UxGT(" Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_K = AXIS6_STR _UxGT(" Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driver %");
|
||||
PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CONNECTION ERROR");
|
||||
PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Write");
|
||||
|
||||
@@ -236,6 +236,7 @@ namespace Language_es {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Mover 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidad");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Cama Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Boquilla");
|
||||
|
||||
@@ -143,6 +143,7 @@ namespace Language_eu {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mugitu 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mugitu 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mugitu 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Mugitu 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Abiadura");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Ohea");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Pita");
|
||||
|
||||
@@ -76,6 +76,7 @@ namespace Language_fi {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Liikuta 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Liikuta 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Liikuta 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Liikuta 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Nopeus");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Suutin");
|
||||
PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Suutin ~");
|
||||
|
||||
@@ -235,6 +235,7 @@ namespace Language_fr {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Déplacer 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Déplacer 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Déplacer 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Déplacer 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Vitesse");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Lit Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Buse");
|
||||
|
||||
@@ -233,6 +233,7 @@ namespace Language_gl {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Mover 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidade");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Cama Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Bico");
|
||||
|
||||
@@ -83,6 +83,7 @@ namespace Language_hr {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Miči 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Miči 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Miči 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Miči 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Brzina");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Dizna");
|
||||
|
||||
@@ -266,6 +266,7 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mozgás 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mozgás 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mozgás 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Mozgás 100mm");
|
||||
PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Mozgás 0.001mm");
|
||||
PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Mozgás 0.01mm");
|
||||
PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Mozgás 0.1mm");
|
||||
|
||||
@@ -67,9 +67,12 @@ namespace Language_it {
|
||||
PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu di debug");
|
||||
PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra avanzam.");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home asse X");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home asse Y");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home asse Z");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home X");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home Y");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_I = _UxGT("Home ") LCD_STR_I;
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_J = _UxGT("Home ") LCD_STR_J;
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_K = _UxGT("Home ") LCD_STR_K;
|
||||
PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Allineam.automat. Z");
|
||||
PROGMEM Language_Str MSG_ITERATION = _UxGT("Iterazione G34: %i");
|
||||
PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Precisione in calo!");
|
||||
@@ -80,6 +83,12 @@ namespace Language_it {
|
||||
PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Livel. terminato!");
|
||||
PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Fade Height");
|
||||
PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Imp. offset home");
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_X = _UxGT("Offset home X");
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_Y = _UxGT("Offset home Y");
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_Z = _UxGT("Offset home Z");
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_I = _UxGT("Offset home ") LCD_STR_I;
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_J = _UxGT("Offset home ") LCD_STR_J;
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_K = _UxGT("Offset home ") LCD_STR_K;
|
||||
PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offset applicato");
|
||||
PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Imposta Origine");
|
||||
PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Tramming assistito");
|
||||
@@ -112,10 +121,13 @@ namespace Language_it {
|
||||
PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potenza laser");
|
||||
PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potenza mandrino");
|
||||
PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Alterna Laser");
|
||||
PROGMEM Language_Str MSG_LASER_EVAC_TOGGLE = _UxGT("Alterna soffiatore");
|
||||
PROGMEM Language_Str MSG_LASER_ASSIST_TOGGLE = _UxGT("Alterna aria supp.");
|
||||
PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("ms impulso di test");
|
||||
PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Spara impulso");
|
||||
PROGMEM Language_Str MSG_FLOWMETER_FAULT = _UxGT("Err.flusso refrig.");
|
||||
PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Alterna mandrino");
|
||||
PROGMEM Language_Str MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Alterna vuoto");
|
||||
PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Mandrino in avanti");
|
||||
PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverti mandrino");
|
||||
PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Accendi aliment.");
|
||||
@@ -158,6 +170,7 @@ namespace Language_it {
|
||||
PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Livel.letto unificato");
|
||||
PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto inclinaz.");
|
||||
PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Mesh Manuale");
|
||||
PROGMEM Language_Str MSG_UBL_MESH_WIZARD = _UxGT("Creaz.guid.mesh UBL");
|
||||
PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Metti spes. e misura");
|
||||
PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Misura");
|
||||
PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Rimuovi e mis.piatto");
|
||||
@@ -258,6 +271,9 @@ namespace Language_it {
|
||||
PROGMEM Language_Str MSG_MOVE_X = _UxGT("Muovi X");
|
||||
PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Muovi Y");
|
||||
PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Muovi Z");
|
||||
PROGMEM Language_Str MSG_MOVE_I = _UxGT("Muovi ") LCD_STR_I;
|
||||
PROGMEM Language_Str MSG_MOVE_J = _UxGT("Muovi ") LCD_STR_J;
|
||||
PROGMEM Language_Str MSG_MOVE_K = _UxGT("Muovi ") LCD_STR_K;
|
||||
PROGMEM Language_Str MSG_MOVE_E = _UxGT("Estrusore");
|
||||
PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Estrusore *");
|
||||
PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Ugello freddo");
|
||||
@@ -265,9 +281,11 @@ namespace Language_it {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Muovi di 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Muovi di 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Muovi di 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Muovi di 0.001in");
|
||||
PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Muovi di 0.01in");
|
||||
PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Muovi di 0.1in");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Muovi di 100mm");
|
||||
PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Muovi di 0.001\"");
|
||||
PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Muovi di 0.01\"");
|
||||
PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Muovi di 0.1\"");
|
||||
PROGMEM Language_Str MSG_MOVE_1IN = _UxGT("Muovi di 1\"");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Velocità");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Piatto Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Ugello");
|
||||
@@ -312,12 +330,18 @@ namespace Language_it {
|
||||
PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-jerk");
|
||||
PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-jerk");
|
||||
PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-jerk");
|
||||
PROGMEM Language_Str MSG_VI_JERK = _UxGT("V") LCD_STR_I _UxGT("-jerk");
|
||||
PROGMEM Language_Str MSG_VJ_JERK = _UxGT("V") LCD_STR_J _UxGT("-jerk");
|
||||
PROGMEM Language_Str MSG_VK_JERK = _UxGT("V") LCD_STR_K _UxGT("-jerk");
|
||||
PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-jerk");
|
||||
PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Deviaz. giunzioni");
|
||||
PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocità");
|
||||
PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A;
|
||||
PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B;
|
||||
PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C;
|
||||
PROGMEM Language_Str MSG_VMAX_I = _UxGT("Vmax ") LCD_STR_I;
|
||||
PROGMEM Language_Str MSG_VMAX_J = _UxGT("Vmax ") LCD_STR_J;
|
||||
PROGMEM Language_Str MSG_VMAX_K = _UxGT("Vmax ") LCD_STR_K;
|
||||
PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E;
|
||||
PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vmax *");
|
||||
PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin");
|
||||
@@ -326,6 +350,9 @@ namespace Language_it {
|
||||
PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A;
|
||||
PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B;
|
||||
PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C;
|
||||
PROGMEM Language_Str MSG_AMAX_I = _UxGT("Amax ") LCD_STR_I;
|
||||
PROGMEM Language_Str MSG_AMAX_J = _UxGT("Amax ") LCD_STR_J;
|
||||
PROGMEM Language_Str MSG_AMAX_K = _UxGT("Amax ") LCD_STR_K;
|
||||
PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E;
|
||||
PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Amax *");
|
||||
PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-Ritrazione");
|
||||
@@ -333,11 +360,14 @@ namespace Language_it {
|
||||
PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Frequenza max");
|
||||
PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Feed min");
|
||||
PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passi/mm");
|
||||
PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("passi/mm");
|
||||
PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("passi/mm");
|
||||
PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("passi/mm");
|
||||
PROGMEM Language_Str MSG_E_STEPS = _UxGT("Epassi/mm");
|
||||
PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*passi/mm");
|
||||
PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" passi/mm");
|
||||
PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" passi/mm");
|
||||
PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" passi/mm");
|
||||
PROGMEM Language_Str MSG_I_STEPS = LCD_STR_I _UxGT(" passi/mm");
|
||||
PROGMEM Language_Str MSG_J_STEPS = LCD_STR_J _UxGT(" passi/mm");
|
||||
PROGMEM Language_Str MSG_K_STEPS = LCD_STR_K _UxGT(" passi/mm");
|
||||
PROGMEM Language_Str MSG_E_STEPS = _UxGT("E passi/mm");
|
||||
PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* passi/mm");
|
||||
PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura");
|
||||
PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento");
|
||||
PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento");
|
||||
@@ -469,6 +499,9 @@ namespace Language_it {
|
||||
PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X");
|
||||
PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y");
|
||||
PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z");
|
||||
PROGMEM Language_Str MSG_BABYSTEP_I = _UxGT("Babystep ") LCD_STR_I;
|
||||
PROGMEM Language_Str MSG_BABYSTEP_J = _UxGT("Babystep ") LCD_STR_J;
|
||||
PROGMEM Language_Str MSG_BABYSTEP_K = _UxGT("Babystep ") LCD_STR_K;
|
||||
PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Totali");
|
||||
PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Finecorsa annullati");
|
||||
PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Risc.Fallito"); // Max 12 caratteri
|
||||
@@ -545,10 +578,13 @@ namespace Language_it {
|
||||
PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp max");
|
||||
PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Alimentatore");
|
||||
PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Potenza Drive");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driver %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("Driver X %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Driver Y %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Driver Z %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_I = _UxGT("Driver ") AXIS4_STR _UxGT(" %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_J = _UxGT("Driver ") AXIS5_STR _UxGT(" %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_K = _UxGT("Driver ") AXIS6_STR _UxGT(" %");
|
||||
PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("Driver E %");
|
||||
PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ERR.CONNESSIONE TMC");
|
||||
PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Scrivi DAC EEPROM");
|
||||
PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIO FILAMENTO");
|
||||
@@ -681,10 +717,15 @@ namespace Language_it {
|
||||
|
||||
PROGMEM Language_Str MSG_SOUND = _UxGT("Suoni");
|
||||
|
||||
PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Alto sinistra");
|
||||
PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Alto sinistra");
|
||||
PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Basso sinistra");
|
||||
PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Alto destra");
|
||||
PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Basso destra");
|
||||
PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibrazione completata");
|
||||
PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibrazione fallita");
|
||||
|
||||
PROGMEM Language_Str MSG_DRIVER_BACKWARD = _UxGT(" driver invertito");
|
||||
|
||||
PROGMEM Language_Str MSG_SD_CARD = _UxGT("Scheda SD");
|
||||
PROGMEM Language_Str MSG_USB_DISK = _UxGT("Disco USB");
|
||||
}
|
||||
|
||||
@@ -98,6 +98,7 @@ namespace Language_jp_kana {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("0.1mm イドウ"); // "Move 0.1mm"
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(" 1mm イドウ"); // "Move 1mm"
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT(" 10mm イドウ"); // "Move 10mm"
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT(" 100mm イドウ"); // "Move 100mm"
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("ソクド"); // "Speed"
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Zオフセット"); // "Bed Z"
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("ノズル"); // "Nozzle"
|
||||
|
||||
@@ -91,6 +91,7 @@ namespace Language_nl {
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Verplaats 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Verplaats 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Verplaats 10mm");
|
||||
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Verplaats 100mm");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Snelheid");
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle");
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user