Compare commits

..

39 Commits

Author SHA1 Message Date
Scott Lahteine
b878127ea0 Marlin 2.0.9.1 2021-06-28 19:50:00 -05:00
Katelyn Schiesser
6ea6556d09 🐛 Use setTargetHotend in menus (#22247) 2021-06-28 19:50:00 -05:00
Scott Lahteine
2b37a71eba ♻️ Refactor status screen timeout 2021-06-28 19:50:00 -05:00
Cytown
e3ae76d76d 🚸 Expand box in draw_boxed_string (#22209) 2021-06-28 19:50:00 -05:00
Katelyn Schiesser
b24508907e 🐛 No HOTEND_LOOP with EXTRUDERS 0 (#22245) 2021-06-28 19:50:00 -05:00
Sébastien Gariépy
ec3daadf43 🌐 MSG_MOVE_100MM (#22242) 2021-06-28 19:50:00 -05:00
Cytown
ae76011e75 🐛 Fix wide glyph characters display (#22237) 2021-06-28 19:50:00 -05:00
Scott Lahteine
34066c1717 📝 Update probe heating value 2021-06-27 11:54:28 -05:00
ellensp
19fe3d5e79 🚸 MarlinUI Move Z >= 1000 (#22192) 2021-06-27 11:32:14 -05:00
Scott Lahteine
ec518e6e7b 🎨 Small tweak, ms => now 2021-06-27 11:25:58 -05:00
Scott Lahteine
003ce25acf 🎨 Format onboard_sd.cpp 2021-06-27 11:25:48 -05:00
ellensp
3e5d867276 🐛 Fix Z_MULTI_ENDSTOPS + NUM_Z_STEPPER_DRIVERS 4 compile (#22203) 2021-06-27 11:25:36 -05:00
cr20-123
b1bcb387fa Update/extend Quiet Probing (#22205) 2021-06-27 11:25:07 -05:00
ellensp
0fbd8c52bb 🔧 Fix E.S.T. sanity-check errors (#22224) 2021-06-27 11:24:54 -05:00
Marcio T
08895e6cb0 🎨 Fix and improve FTDI Eve Touch UI (#22223) 2021-06-27 11:24:43 -05:00
Keith Bennett
38e775496a 📝 Update TMC SPI endstops comment (#22221) 2021-06-27 11:24:33 -05:00
Scott Lahteine
47631167f9 🐛 Trigger existing endstops on G38 hit 2021-06-27 11:24:22 -05:00
bwspath
185e0dc7b7 🐛 Fix Octopus build on case-sensitive FS (#22206) 2021-06-27 11:23:56 -05:00
Serhiy-K
bcf6ca59df 🌐 Update Russian language (#22193) 2021-06-27 11:23:42 -05:00
Marcio T
1ba694cebb 🎨 Fix and enhance FTDI Eve Touch UI (#22189) 2021-06-27 11:22:20 -05:00
Scott Lahteine
906fa05bd6 🐛🌐 Fix extra axis translations 2021-06-27 11:21:33 -05:00
Scott Lahteine
651f15f833 🎨 Cosmetic cleanup 2021-06-21 16:26:38 -05:00
Katelyn Schiesser
ef41c1f452 🐛 Fix IJK axis references, E stepper indices (#22176)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2021-06-21 16:26:38 -05:00
Grumpy
8050813d32 🐛 Fix dual Neopixels (#22174) 2021-06-21 16:26:38 -05:00
ellensp
25e7e2fce0 🐛 Fix heater display options/compile (#22185) 2021-06-21 16:26:38 -05:00
Scott Lahteine
a0f7f0e9e2 🐛 Fix compact sensitive pins array (#22184) 2021-06-21 16:26:38 -05:00
Serhiy-K
f3e0bc7a4b 🌐 Update Ukrainian language (#22183) 2021-06-21 16:26:38 -05:00
Giuliano Zaro
49ff1e837a 🌐 Update Italian language (#22182) 2021-06-21 16:26:38 -05:00
Katelyn Schiesser
4f8191b481 🐛 Redundant Temp Sensor followup (#22173) 2021-06-20 16:44:01 -05:00
Scott Lahteine
927a1a1738 🐛 Fix LCD define typos 2021-06-20 16:40:50 -05:00
Scott Lahteine
f2f23e8097 🎨 Cosmetic changes for G28 2021-06-20 16:40:23 -05:00
Scott Lahteine
cce585f6ca 🐛 Define 'HEAD' axes for Markforged
Fixes #22167
2021-06-18 13:13:27 -05:00
Ari-SSO
5bfb465ab4 🚸 Include 'H' value in M412 report (#22138)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2021-06-18 12:26:12 -05:00
Katelyn Schiesser
ce7bbafb8f 💡 Add G28 L description (#22144) 2021-06-18 12:26:10 -05:00
Keith Bennett
5ffc4bfe3a 🐛 TFT encoder pin for BTT GTR (#22162) 2021-06-18 12:25:42 -05:00
Mike La Spina
3ecc99e95d 🐛 Fix Air Assist (#22159)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2021-06-18 12:25:05 -05:00
gjdodd
f22c5d3cc6 🩹 Extruders 0 patch for PWM Motor Current (#22163) 2021-06-18 12:24:54 -05:00
Victor Oliveira
d8df8e0eed 🐛 Fix env validation for 1280/2560 boards (#22150)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2021-06-18 12:24:47 -05:00
Victor Oliveira
e38958f256 🐛 Fix MKS Robin E3 build (#22149) 2021-06-18 12:23:46 -05:00
118 changed files with 1810 additions and 1031 deletions

View File

@@ -35,7 +35,7 @@
*
* Advanced settings can be found in Configuration_adv.h
*/
#define CONFIGURATION_H_VERSION 02000900
#define CONFIGURATION_H_VERSION 02000901
//===========================================================================
//============================= Getting Started =============================
@@ -1248,7 +1248,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

View File

@@ -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 ============================
@@ -1594,7 +1594,7 @@
*/
//#define STATUS_COMBINE_HEATERS // Use combined heater images instead of separate ones
//#define STATUS_HOTEND_NUMBERLESS // Use plain hotend icons instead of numbered ones (with 2+ hotends)
#define STATUS_HOTEND_INVERTED // Show solid nozzle bitmaps when heating (Requires STATUS_HOTEND_ANIM)
#define STATUS_HOTEND_INVERTED // Show solid nozzle bitmaps when heating (Requires STATUS_HOTEND_ANIM for numbered hotends)
#define STATUS_HOTEND_ANIM // Use a second bitmap to indicate hotend heating
#define STATUS_BED_ANIM // Use a second bitmap to indicate bed heating
#define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating
@@ -1988,9 +1988,9 @@
// calibration.
//#define BTC_PROBE_TEMP 30 // (°C)
// Height above Z=0.0f to raise the nozzle. Lowering this can help the probe to heat faster.
// Note: the Z=0.0f offset is determined by the probe offset which can be set using M851.
//#define PTC_PROBE_HEATING_OFFSET 0.5f
// Height above Z=0.0 to raise the nozzle. Lowering this can help the probe to heat faster.
// Note: the Z=0.0 offset is determined by the probe offset which can be set using M851.
//#define PTC_PROBE_HEATING_OFFSET 0.5
// Height to raise the Z-probe between heating and taking the next measurement. Some probes
// may fail to untrigger if they have been triggered for a long time, which can be solved by
@@ -2892,7 +2892,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.
*

View File

@@ -28,7 +28,7 @@
/**
* Marlin release version identifier
*/
//#define SHORT_BUILD_VERSION "2.0.9"
//#define SHORT_BUILD_VERSION "2.0.9.1"
/**
* Verbose version identifier which should contain a reference to the location
@@ -41,7 +41,7 @@
* here we define this default string as the date where the latest release
* version was tagged.
*/
//#define STRING_DISTRIBUTION_DATE "2021-06-15"
//#define STRING_DISTRIBUTION_DATE "2021-06-27"
/**
* Defines a generic printer name to be output to the LCD after booting Marlin.

View File

@@ -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)) */
}
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 { // 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))
}
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;
}

View File

@@ -282,19 +282,22 @@ bool wait_for_heatup = true;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnarrowing"
#ifdef RUNTIME_ONLY_ANALOG_TO_DIGITAL
static const pin_t sensitive_pins[] PROGMEM = { SENSITIVE_PINS };
#else
#ifndef RUNTIME_ONLY_ANALOG_TO_DIGITAL
template <pin_t ...D>
constexpr pin_t OnlyPins<-2, D...>::table[sizeof...(D)];
#define sensitive_pins OnlyPins<SENSITIVE_PINS>::table
constexpr pin_t OnlyPins<_SP_END, D...>::table[sizeof...(D)];
#endif
bool pin_is_protected(const pin_t pin) {
LOOP_L_N(i, COUNT(sensitive_pins)) {
pin_t sensitive_pin;
memcpy_P(&sensitive_pin, &sensitive_pins[i], sizeof(pin_t));
if (pin == sensitive_pin) return true;
#ifdef RUNTIME_ONLY_ANALOG_TO_DIGITAL
static const pin_t sensitive_pins[] PROGMEM = { SENSITIVE_PINS };
const size_t pincount = COUNT(sensitive_pins);
#else
static constexpr size_t pincount = OnlyPins<SENSITIVE_PINS>::size;
static const pin_t (&sensitive_pins)[pincount] PROGMEM = OnlyPins<SENSITIVE_PINS>::table;
#endif
LOOP_L_N(i, pincount) {
const pin_t * const pptr = &sensitive_pins[i];
if (pin == (sizeof(pin_t) == 2 ? (pin_t)pgm_read_word(pptr) : (pin_t)pgm_read_byte(pptr))) return true;
}
return false;
}

View File

@@ -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

View File

@@ -86,9 +86,15 @@ void StepperDAC::print_values() {
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(")"));
#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() {

View File

@@ -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

View File

@@ -81,7 +81,10 @@ bool Power::is_power_needed() {
#endif
) 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
@@ -105,12 +108,12 @@ bool Power::is_power_needed() {
void Power::check() {
static millis_t nextPowerCheck = 0;
millis_t ms = millis();
if (ELAPSED(ms, nextPowerCheck)) {
nextPowerCheck = ms + 2500UL;
millis_t now = millis();
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();
}
}

View File

@@ -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

View File

@@ -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();
}
@@ -195,9 +195,9 @@
* None Home to all axes with no parameters.
* With QUICK_HOME enabled XY will home together, then Z.
*
* O Home only if position is unknown
*
* Rn Raise by n mm/inches before homing
* L<bool> Force leveling state ON (if possible) or OFF after homing (Requires RESTORE_LEVELING_AFTER_G28 or ENABLE_LEVELING_AFTER_G28)
* O Home only if the position is not known and trusted
* R<linear> Raise by n mm/inches before homing
*
* Cartesian/SCARA parameters
*
@@ -229,7 +229,7 @@ void GcodeSuite::G28() {
#endif
// Home (O)nly if position is unknown
if (!axes_should_home() && parser.boolval('O')) {
if (!axes_should_home() && parser.seen_test('O')) {
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> homing not needed, skip");
return;
}
@@ -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

View File

@@ -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
#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();

View File

@@ -20,9 +20,9 @@
*
*/
#include "../../inc/MarlinConfig.h"
#include "../../inc/MarlinConfigPre.h"
#if ENABLED(COOLANT_CONTROL)
#if ANY(COOLANT_MIST, COOLANT_FLOOD, AIR_ASSIST)
#include "../gcode.h"
#include "../../module/planner.h"
@@ -37,18 +37,29 @@
}
#endif
#if ENABLED(COOLANT_FLOOD)
/**
* M8: Flood Coolant On
*/
void GcodeSuite::M8() {
planner.synchronize(); // Wait for move to arrive
WRITE(COOLANT_FLOOD_PIN, !(COOLANT_FLOOD_INVERT)); // Turn on Flood coolant
}
#if EITHER(COOLANT_FLOOD, AIR_ASSIST)
#if ENABLED(AIR_ASSIST)
#include "../../feature/spindle_laser.h"
#endif
/**
* M9: Coolant OFF
* M8: Flood Coolant / Air Assist ON
*/
void GcodeSuite::M8() {
planner.synchronize(); // Wait for move to arrive
#if ENABLED(COOLANT_FLOOD)
WRITE(COOLANT_FLOOD_PIN, !(COOLANT_FLOOD_INVERT)); // Turn on Flood coolant
#endif
#if ENABLED(AIR_ASSIST)
cutter.air_assist_enable(); // Turn on Air Assist
#endif
}
#endif
/**
* M9: Coolant / Air Assist OFF
*/
void GcodeSuite::M9() {
planner.synchronize(); // Wait for move to arrive
@@ -58,30 +69,9 @@ void GcodeSuite::M9() {
#if ENABLED(COOLANT_FLOOD)
WRITE(COOLANT_FLOOD_PIN, COOLANT_FLOOD_INVERT); // Turn off Flood coolant
#endif
}
#endif // COOLANT_CONTROL
#if ENABLED(AIR_ASSIST)
#include "../gcode.h"
#include "../../module/planner.h"
#include "../../feature/spindle_laser.h"
/**
* M8: Air Assist On
*/
void GcodeSuite::M8() {
planner.synchronize();
cutter.air_assist_enable(); // Turn on Air Assist pin
cutter.air_assist_disable(); // Turn off Air Assist
#endif
}
/**
* M9: Air Assist Off
*/
void GcodeSuite::M9() {
planner.synchronize();
cutter.air_assist_disable(); // Turn off Air Assist pin
}
#endif // AIR_ASSIST
#endif // COOLANT_MIST | COOLANT_FLOOD | AIR_ASSIST

View File

@@ -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

View File

@@ -67,9 +67,11 @@ void GcodeSuite::M907() {
LOOP_LOGICAL_AXES(i) if (parser.seenval(axis_codes[i])) digipot_i2c.set_current(i, parser.value_float());
// Additional extruders use B,C,D for channels 4,5,6.
// TODO: Change these parameters because 'E' is used. B<index>?
#if HAS_EXTRUDERS
for (uint8_t i = E_AXIS + 1; i < DIGIPOT_I2C_NUM_CHANNELS; i++)
if (parser.seenval('B' + i - (E_AXIS + 1))) digipot_i2c.set_current(i, parser.value_float());
#endif
#endif
#if ENABLED(HAS_MOTOR_CURRENT_DAC)
if (parser.seenval('S')) {

View File

@@ -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

View File

@@ -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;

View File

@@ -54,10 +54,15 @@ void GcodeSuite::M412() {
else {
SERIAL_ECHO_START();
SERIAL_ECHOPGM("Filament runout ");
serialprintln_onoff(runout.enabled);
serialprint_onoff(runout.enabled);
#if HAS_FILAMENT_RUNOUT_DISTANCE
SERIAL_ECHOLNPAIR("Filament runout distance (mm): ", runout.runout_distance());
SERIAL_ECHOPAIR(" ; Distance ", runout.runout_distance(), "mm");
#endif
#if ENABLED(HOST_ACTION_COMMANDS)
SERIAL_ECHOPGM(" ; Host handling ");
serialprint_onoff(runout.host_handling);
#endif
SERIAL_EOL();
}
}

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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
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
}
}

View File

@@ -441,21 +441,24 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 3: M3_M4(false); break; // M3: Turn ON Laser | Spindle (clockwise), set Power | Speed
case 4: M3_M4(true ); break; // M4: Turn ON Laser | Spindle (counter-clockwise), set Power | Speed
case 5: M5(); break; // M5: Turn OFF Laser | Spindle
#endif
#if ENABLED(COOLANT_MIST)
case 7: M7(); break; // M7: Coolant Mist ON
#endif
#if EITHER(AIR_ASSIST, COOLANT_FLOOD)
case 8: M8(); break; // M8: Air Assist / Coolant Flood ON
#endif
#if EITHER(AIR_ASSIST, COOLANT_CONTROL)
case 9: M9(); break; // M9: Air Assist / Coolant OFF
#endif
#if ENABLED(AIR_EVACUATION)
case 10: M10(); break; // M10: Vacuum or Blower motor ON
case 11: M11(); break; // M11: Vacuum or Blower motor OFF
#endif
#endif
#if ENABLED(COOLANT_CONTROL)
#if ENABLED(COOLANT_MIST)
case 7: M7(); break; // M7: Mist coolant ON
#endif
#if ENABLED(COOLANT_FLOOD)
case 8: M8(); break; // M8: Flood coolant ON
#endif
case 9: M9(); break; // M9: Coolant OFF
#endif
#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER)
case 12: M12(); break; // M12: Synchronize and optionally force a CLC set

View File

@@ -564,22 +564,25 @@ private:
#if HAS_CUTTER
static void M3_M4(const bool is_M4);
static void M5();
#if ENABLED(AIR_EVACUATION)
static void M10();
static void M11();
#endif
#endif
#if ENABLED(COOLANT_CONTROL)
#if ENABLED(COOLANT_MIST)
static void M7();
#endif
#if ENABLED(COOLANT_FLOOD)
#if EITHER(AIR_ASSIST, COOLANT_FLOOD)
static void M8();
#endif
#if EITHER(AIR_ASSIST, COOLANT_CONTROL)
static void M9();
#endif
#if ENABLED(AIR_EVACUATION)
static void M10();
static void M11();
#endif
#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER)
static void M12();
#endif

View File

@@ -216,11 +216,13 @@ void GcodeSuite::M114() {
report_current_position_detail();
return;
}
#if HAS_EXTRUDERS
if (parser.seen_test('E')) {
SERIAL_ECHOLNPAIR("Count E:", stepper.position(E_AXIS));
return;
}
#endif
#endif
#if ENABLED(M114_REALTIME)
if (parser.seen_test('R')) { report_real_position(); return; }

View File

@@ -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; }

View File

@@ -526,7 +526,17 @@
#undef ANY_TEMP_SENSOR_IS
// Usurp a sensor to do redundant readings
#if TEMP_SENSOR_REDUNDANT && !PIN_EXISTS(TEMP_REDUNDANT)
#if TEMP_SENSOR_REDUNDANT
#ifndef TEMP_SENSOR_REDUNDANT_SOURCE
#define TEMP_SENSOR_REDUNDANT_SOURCE 1
#endif
#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."
@@ -600,9 +610,6 @@
#define TEMP_REDUNDANT_PIN TEMP_7_PIN
#endif
#endif
#ifndef TEMP_SENSOR_REDUNDANT_MAX_DIFF
#define TEMP_SENSOR_REDUNDANT_MAX_DIFF 10
#endif
#endif
@@ -3092,6 +3099,7 @@
#endif
#else
#undef NOZZLE_TO_PROBE_OFFSET
#undef PROBING_STEPPERS_OFF
#endif
/**
@@ -3134,18 +3142,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,10 +3397,15 @@
#endif
#endif
#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
#if ANY(G38_PROBE_TARGET, CNC_COORDINATE_SYSTEMS, POWER_LOSS_RECOVERY)

View File

@@ -1039,6 +1039,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,24 +1249,29 @@ 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."
#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
/**

View File

@@ -25,7 +25,7 @@
* Release version. Leave the Marlin version or apply a custom scheme.
*/
#ifndef SHORT_BUILD_VERSION
#define SHORT_BUILD_VERSION "2.0.9"
#define SHORT_BUILD_VERSION "2.0.9.1"
#endif
/**
@@ -42,7 +42,7 @@
* version was tagged.
*/
#ifndef STRING_DISTRIBUTION_DATE
#define STRING_DISTRIBUTION_DATE "2021-06-15"
#define STRING_DISTRIBUTION_DATE "2021-06-27"
#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

View File

@@ -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,
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)

View File

@@ -39,10 +39,22 @@
#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,
#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,
@@ -53,6 +65,7 @@
B00111111,B11110000,
B00001111,B11000000,
B00000111,B10000000,
#endif
B00000011,B00000000
};

View File

@@ -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,7 +269,6 @@ 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);
@@ -288,7 +281,6 @@ FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, co
else
#endif
u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, STATUS_HEATERS_HEIGHT, HOTEND_BITMAP(TERN(HAS_MMU, active_extruder, heater_id), isHeat));
#endif
} // PAGE_CONTAINS

View File

@@ -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)

View File

@@ -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)

View File

@@ -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
};

View File

@@ -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)

View File

@@ -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"

View File

@@ -0,0 +1,91 @@
/*********************************
* cocoa_press/leveling_menu.cpp *
*********************************/
/****************************************************************************
* 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/>. *
****************************************************************************/
#include "../config.h"
#include "../screens.h"
#ifdef COCOA_LEVELING_MENU
#if BOTH(HAS_BED_PROBE,BLTOUCH)
#include "../../../../feature/bltouch.h"
#endif
using namespace FTDI;
using namespace ExtUI;
using namespace Theme;
#define GRID_ROWS 5
#define GRID_COLS 3
#define BED_MESH_TITLE_POS BTN_POS(1,1), BTN_SIZE(3,1)
#define PROBE_BED_POS BTN_POS(1,2), BTN_SIZE(1,1)
#define SHOW_MESH_POS BTN_POS(2,2), BTN_SIZE(1,1)
#define EDIT_MESH_POS BTN_POS(3,2), BTN_SIZE(1,1)
#define BLTOUCH_TITLE_POS BTN_POS(1,3), BTN_SIZE(3,1)
#define BLTOUCH_RESET_POS BTN_POS(1,4), BTN_SIZE(1,1)
#define BLTOUCH_TEST_POS BTN_POS(2,4), BTN_SIZE(1,1)
#define BACK_POS BTN_POS(1,5), BTN_SIZE(3,1)
void LevelingMenu::onRedraw(draw_mode_t what) {
if (what & BACKGROUND) {
CommandProcessor cmd;
cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color))
.cmd(CLEAR(true,true,true))
.tag(0);
}
if (what & FOREGROUND) {
CommandProcessor cmd;
cmd.font(font_large)
.cmd(COLOR_RGB(bg_text_enabled))
.text(BED_MESH_TITLE_POS, GET_TEXT_F(MSG_BED_LEVELING))
.text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH))
.font(font_medium).colors(normal_btn)
.tag(2).button(PROBE_BED_POS, GET_TEXT_F(MSG_PROBE_BED))
.enabled(ENABLED(HAS_MESH))
.tag(3).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH))
.enabled(ENABLED(HAS_MESH))
.tag(4).button(EDIT_MESH_POS, GET_TEXT_F(MSG_EDIT_MESH))
#undef GRID_COLS
#define GRID_COLS 2
.tag(5).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET))
.tag(6).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST))
#undef GRID_COLS
#define GRID_COLS 3
.colors(action_btn)
.tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK));
}
}
bool LevelingMenu::onTouchEnd(uint8_t tag) {
switch (tag) {
case 1: GOTO_PREVIOUS(); break;
case 2: BedMeshViewScreen::doProbe(); break;
case 3: BedMeshViewScreen::show(); break;
case 4: BedMeshEditScreen::show(); break;
case 5: injectCommands_P(PSTR("M280 P0 S60")); break;
case 6: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
default: return false;
}
return true;
}
#endif // COCOA_LEVELING_MENU

View File

@@ -0,0 +1,32 @@
/*******************************
* cocoa_press/leveling_menu.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
#define COCOA_LEVELING_MENU
#define COCOA_LEVELING_MENU_CLASS LevelingMenu
class LevelingMenu : public BaseScreen, public CachedScreen<LEVELING_SCREEN_CACHE> {
public:
static void onRedraw(draw_mode_t);
static bool onTouchEnd(uint8_t tag);
};

View File

@@ -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)

View File

@@ -0,0 +1,135 @@
/*************
* 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"
#include "../generic/tune_menu.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"

View File

@@ -45,12 +45,14 @@ namespace ExtUI {
}
void onMediaInserted() {
if (AT_SCREEN(StatusScreen))
StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MEDIA_INSERTED));
#if ENABLED(SDSUPPORT)
sound.play(media_inserted, PLAY_ASYNCHRONOUS);
StatusScreen::onMediaInserted();
#endif
}
void onMediaRemoved() {
#if ENABLED(SDSUPPORT)
if (isPrintingFromMedia()) {
stopPrint();
InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED);
@@ -58,11 +60,8 @@ namespace ExtUI {
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);
StatusScreen::onMediaRemoved();
FilesScreen::onMediaRemoved();
#endif
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -262,4 +262,8 @@ void FilesScreen::onIdle() {
#endif
}
void FilesScreen::onMediaRemoved() {
if (AT_SCREEN(FilesScreen)) GOTO_SCREEN(StatusScreen);
}
#endif // FTDI_FILES_SCREEN

View File

@@ -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();
};

View File

@@ -86,11 +86,13 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) {
}
if (what & FOREGROUND) {
#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)
#define EDGE_R 30
@@ -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;
#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() {
#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;
#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");
#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);

View File

@@ -132,4 +132,3 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) {
}
#endif // FTDI_LEVELING_MENU

View File

@@ -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

View File

@@ -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

View File

@@ -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();
};

View File

@@ -34,28 +34,53 @@
* Formats a temperature string (e.g. "100°C")
*/
void format_temp(char *str, const_celsius_float_t t1) {
#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) {
#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) {
#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) {
#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
}
/**

View File

@@ -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) {
@@ -50,17 +57,13 @@ void ZOffsetScreen::onRedraw(draw_mode_t what) {
}
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;

View File

@@ -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);
};

View File

@@ -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)
};

View File

@@ -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 "cocoapress/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

View File

@@ -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;

View File

@@ -305,7 +305,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) {
@@ -1033,10 +1033,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();

View File

@@ -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");

View File

@@ -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(" Дюза");

View File

@@ -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");

View File

@@ -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");

View File

@@ -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");

View File

@@ -234,6 +234,7 @@ namespace Language_de {
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");

View File

@@ -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("Ακροφύσιο");

View File

@@ -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("Ακροφύσιο");

View File

@@ -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");

View File

@@ -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");

View File

@@ -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");

View File

@@ -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 ~");

View File

@@ -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");

View File

@@ -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");

View File

@@ -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");

View File

@@ -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");

View File

@@ -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");
@@ -336,6 +363,9 @@ namespace Language_it {
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");
@@ -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");
@@ -687,4 +723,9 @@ namespace Language_it {
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");
}

View File

@@ -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"

View File

@@ -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");

View File

@@ -270,6 +270,7 @@ namespace Language_pl {
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Przesuń co .1 mm");
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Przesuń co 1 mm");
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Przesuń co 10 mm");
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Przesuń co 100 mm");
PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Przesuń co 0.001 cala");
PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Przesuń co 0.01 cala");
PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Przesuń co 0.1 cala");

View File

@@ -85,6 +85,7 @@ namespace Language_pt {
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("Base Z");
PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" Bico");

View File

@@ -218,6 +218,7 @@ namespace Language_pt_br {
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("Base Z");
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Bocal");

View File

@@ -232,6 +232,7 @@ namespace Language_ro {
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_SPEED = _UxGT("Speed");
PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z");
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle");

View File

@@ -69,6 +69,9 @@ namespace Language_ru {
PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Парковка X");
PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Парковка Y");
PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Парковка Z");
PROGMEM Language_Str MSG_AUTO_HOME_I = _UxGT("Парковка ") LCD_STR_I;
PROGMEM Language_Str MSG_AUTO_HOME_J = _UxGT("Парковка ") LCD_STR_J;
PROGMEM Language_Str MSG_AUTO_HOME_K = _UxGT("Парковка ") LCD_STR_K;
PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Авто Z-выравнивание");
PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Итерация: %i");
PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Уменьшение точности!");
@@ -80,11 +83,29 @@ namespace Language_ru {
PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Высота спада");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Установ. смещения дома");
PROGMEM Language_Str MSG_HOME_OFFSET_X = _UxGT("Смещение дома X");
PROGMEM Language_Str MSG_HOME_OFFSET_Y = _UxGT("Смещение дома Y");
PROGMEM Language_Str MSG_HOME_OFFSET_Z = _UxGT("Смещение дома Z");
PROGMEM Language_Str MSG_HOME_OFFSET_I = _UxGT("Смещение дома ") LCD_STR_I;
PROGMEM Language_Str MSG_HOME_OFFSET_J = _UxGT("Смещение дома ") LCD_STR_J;
PROGMEM Language_Str MSG_HOME_OFFSET_K = _UxGT("Смещение дома ") LCD_STR_K;
#else
PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Установ.смещ.дома");
PROGMEM Language_Str MSG_HOME_OFFSET_X = _UxGT("Смещ. дома X");
PROGMEM Language_Str MSG_HOME_OFFSET_Y = _UxGT("Смещ. дома Y");
PROGMEM Language_Str MSG_HOME_OFFSET_Z = _UxGT("Смещ. дома Z");
PROGMEM Language_Str MSG_HOME_OFFSET_I = _UxGT("Смещ. дома ") LCD_STR_I;
PROGMEM Language_Str MSG_HOME_OFFSET_J = _UxGT("Смещ. дома ") LCD_STR_J;
PROGMEM Language_Str MSG_HOME_OFFSET_K = _UxGT("Смещ. дома ") LCD_STR_K;
#endif
PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Смещения применены");
PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Установить ноль");
PROGMEM Language_Str MSG_SELECT_ORIGIN = _UxGT("Выберите ноль");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_LAST_VALUE_SP = _UxGT("Последнее знач. ");
#else
PROGMEM Language_Str MSG_LAST_VALUE_SP = _UxGT("Послед. знач. ");
#endif
#if PREHEAT_COUNT
PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Преднагрев ") PREHEAT_1_LABEL;
PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Нагрев ") PREHEAT_1_LABEL " ~";
@@ -107,14 +128,22 @@ namespace Language_ru {
PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Частота");
PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Управление лазером");
PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Переключить лазер");
PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Мощность лазера");
PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Управление шпинделем");
PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Переключить шпиндель");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Мощность шпинделя");
PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Мощность лазера");
PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Тестовый импульс мс");
#else
PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Мощн.шпинделя");
PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Мощн. лазера");
PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Тест. имп. мс");
#endif
PROGMEM Language_Str MSG_LASER_EVAC_TOGGLE = _UxGT("Переключить обдув");
PROGMEM Language_Str MSG_LASER_ASSIST_TOGGLE = _UxGT("Управление обдувом");
PROGMEM Language_Str MSG_FLOWMETER_FAULT = _UxGT("Ошибка обдува");
PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Импульс лазера");
PROGMEM Language_Str MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Переключить вакуум");
PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Шпиндель вперёд");
PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Инверсия шпинделя");
@@ -127,6 +156,15 @@ namespace Language_ru {
PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Выровнять стол");
PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Выровнять углы");
PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Следующий угол");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Вверх до срабатыв. зонда");
PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Углы в норме. Вырав.стола");
#else
PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Вверх до сраб. зонда");
PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Углы в норме. Вырав.");
#endif
PROGMEM Language_Str MSG_LEVEL_CORNERS_GOOD_POINTS = _UxGT("Хорошие точки: ");
PROGMEM Language_Str MSG_LEVEL_CORNERS_LAST_Z = _UxGT("Последняя Z: ");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Смещение по Z");
PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Правка сетки окончена");
@@ -164,12 +202,13 @@ namespace Language_ru {
PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Точка разворота");
PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ручной ввод сетки");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Разместить шайбу и измерить");
PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Разместить шайбу,измерить");
PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Убрать и замерить стол");
#else
PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Разм.шайбу, измерить");
PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Убрать, измер. стол");
#endif
PROGMEM Language_Str MSG_UBL_MESH_WIZARD = _UxGT("Мастер сеток UBL");
PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Измерение");
PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Двигаемся дальше");
PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Активировать UBL");
@@ -185,17 +224,15 @@ namespace Language_ru {
PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Правка сетки завершена");
#else
PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = LCD_STR_THERMOMETER _UxGT(" стола, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" стола, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Своя ") LCD_STR_THERMOMETER _UxGT(" стола,") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = LCD_STR_THERMOMETER _UxGT(" сопла, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" сопла, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Своя ") LCD_STR_THERMOMETER _UxGT(" сопла,") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Построить свою");
PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Правка завершена");
#endif
PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Точная правка сетки");
PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Построить сетку");
#if PREHEAT_COUNT
PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Построить сетку $");
#endif
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Построить холодную сетку");
#else
@@ -205,14 +242,10 @@ namespace Language_ru {
PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Высота");
PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Проверить сетку");
#if LCD_WIDTH > 21
#if PREHEAT_COUNT
PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Проверить сетку $");
#endif
PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Проверить свою сетку");
#else
#if PREHEAT_COUNT
PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Провер. сетку $");
#endif
PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Провер. свою сетку");
#endif
PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 нагрев стола");
@@ -239,11 +272,12 @@ namespace Language_ru {
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Сохранить сетку снаружи");
PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Вывод информации UBL");
PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Кол-во заполнителя");
#else
PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Сохранить снаружи");
PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Информация UBL");
PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Кол-во заполн.");
#endif
PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Кол-во заполнителя");
PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ручное заполнение");
PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Умное заполнение");
PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Заполнить сетку");
@@ -303,6 +337,9 @@ namespace Language_ru {
PROGMEM Language_Str MSG_MOVE_X = _UxGT("Движение по X");
PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Движение по Y");
PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Движение по Z");
PROGMEM Language_Str MSG_MOVE_I = _UxGT("Движение по ") LCD_STR_I;
PROGMEM Language_Str MSG_MOVE_J = _UxGT("Движение по ") LCD_STR_J;
PROGMEM Language_Str MSG_MOVE_K = _UxGT("Движение по ") LCD_STR_K;
PROGMEM Language_Str MSG_MOVE_E = _UxGT("Экструдер");
PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Экструдер *");
PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Сопло не нагрето");
@@ -310,6 +347,7 @@ namespace Language_ru {
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("Движение 100mm");
PROGMEM Language_Str MSG_SPEED = _UxGT("Скорость");
PROGMEM Language_Str MSG_BED_Z = _UxGT("Z стола");
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Сопло, ") LCD_STR_DEGREE "C";
@@ -318,6 +356,15 @@ namespace Language_ru {
PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Сопло ожидает");
PROGMEM Language_Str MSG_BED = _UxGT("Стол, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_CHAMBER = _UxGT("Камера,") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_COOLER = _UxGT("Охлаждение лазера");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_COOLER_TOGGLE = _UxGT("Переключить охлаждение");
PROGMEM Language_Str MSG_FLOWMETER_SAFETY = _UxGT("Безопасность потока");
#else
PROGMEM Language_Str MSG_COOLER_TOGGLE = _UxGT("Переключить охлажд.");
PROGMEM Language_Str MSG_FLOWMETER_SAFETY = _UxGT("Безопасн. потока");
#endif
PROGMEM Language_Str MSG_LASER = _UxGT("Лазер");
PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Кулер");
PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Кулер ~");
PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Сохранённый кулер ~");
@@ -352,6 +399,9 @@ namespace Language_ru {
PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-рывок");
PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-рывок");
PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-рывок");
PROGMEM Language_Str MSG_VI_JERK = _UxGT("V") LCD_STR_I _UxGT("-рывок");
PROGMEM Language_Str MSG_VJ_JERK = _UxGT("V") LCD_STR_J _UxGT("-рывок");
PROGMEM Language_Str MSG_VK_JERK = _UxGT("V") LCD_STR_K _UxGT("-рывок");
PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-рывок");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Отклонение узла");
@@ -362,6 +412,9 @@ namespace Language_ru {
PROGMEM Language_Str MSG_VMAX_A = _UxGT("Скор.макс ") LCD_STR_A;
PROGMEM Language_Str MSG_VMAX_B = _UxGT("Скор.макс ") LCD_STR_B;
PROGMEM Language_Str MSG_VMAX_C = _UxGT("Скор.макс ") LCD_STR_C;
PROGMEM Language_Str MSG_VMAX_I = _UxGT("Скор.макс ") LCD_STR_I;
PROGMEM Language_Str MSG_VMAX_J = _UxGT("Скор.макс ") LCD_STR_J;
PROGMEM Language_Str MSG_VMAX_K = _UxGT("Скор.макс ") LCD_STR_K;
PROGMEM Language_Str MSG_VMAX_E = _UxGT("Скор.макс ") LCD_STR_E;
PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Скор.макс *");
PROGMEM Language_Str MSG_VMIN = _UxGT("Скор.мин");
@@ -370,6 +423,9 @@ namespace Language_ru {
PROGMEM Language_Str MSG_AMAX_A = _UxGT("Ускор.макс ") LCD_STR_A;
PROGMEM Language_Str MSG_AMAX_B = _UxGT("Ускор.макс ") LCD_STR_B;
PROGMEM Language_Str MSG_AMAX_C = _UxGT("Ускор.макс ") LCD_STR_C;
PROGMEM Language_Str MSG_AMAX_I = _UxGT("Ускор.макс ") LCD_STR_I;
PROGMEM Language_Str MSG_AMAX_J = _UxGT("Ускор.макс ") LCD_STR_J;
PROGMEM Language_Str MSG_AMAX_K = _UxGT("Ускор.макс ") LCD_STR_K;
PROGMEM Language_Str MSG_AMAX_E = _UxGT("Ускор.макс ") LCD_STR_E;
PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Ускор.макс *");
PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Ускор.втягив.");
@@ -380,6 +436,9 @@ namespace Language_ru {
PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" шаг/мм");
PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" шаг/мм");
PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" шаг/мм");
PROGMEM Language_Str MSG_I_STEPS = LCD_STR_I _UxGT(" шаг/мм");
PROGMEM Language_Str MSG_J_STEPS = LCD_STR_J _UxGT(" шаг/мм");
PROGMEM Language_Str MSG_K_STEPS = LCD_STR_K _UxGT(" шаг/мм");
PROGMEM Language_Str MSG_E_STEPS = _UxGT("E шаг/мм");
PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* шаг/мм");
PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура");
@@ -402,10 +461,11 @@ namespace Language_ru {
PROGMEM Language_Str MSG_CONTRAST = _UxGT("Контраст экрана");
PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Сохранить настройки");
PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Загрузить настройки");
PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("На базовые параметры");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("На базовые параметры");
PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Инициализация EEPROM");
#else
PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("На базовые парам.");
PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Инициализ. EEPROM");
#endif
PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Сбой EEPROM: CRC");
@@ -541,10 +601,17 @@ namespace Language_ru {
PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Смещение X");
PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Смещение Y");
PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Смещение Z");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Двигать сопло к столу");
#else
PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Двиг. сопло к столу");
#endif
PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Микрошаг X");
PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Микрошаг Y");
PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Микрошаг Z");
PROGMEM Language_Str MSG_BABYSTEP_I = _UxGT("Микрошаг ") LCD_STR_I;
PROGMEM Language_Str MSG_BABYSTEP_J = _UxGT("Микрошаг ") LCD_STR_J;
PROGMEM Language_Str MSG_BABYSTEP_K = _UxGT("Микрошаг ") LCD_STR_K;
PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Сумарно");
PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Сработал концевик");
PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Разогрев не удался");
@@ -552,6 +619,8 @@ namespace Language_ru {
PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("УТЕЧКА ТЕПЛА");
PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("УТЕЧКА ТЕПЛА СТОЛА");
PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("УТЕЧКА ТЕПЛА КАМЕРЫ");
PROGMEM Language_Str MSG_THERMAL_RUNAWAY_COOLER = _UxGT("УТЕЧКА ОХЛАЖДЕНИЯ");
PROGMEM Language_Str MSG_COOLING_FAILED = _UxGT("ОХЛАДИТЬ НЕ УДАЛОСЬ");
PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Ошибка: Т макс.");
PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Ошибка: Т мин.");
PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИНТЕР ОСТАНОВЛЕН");
@@ -567,6 +636,7 @@ namespace Language_ru {
PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Охлаждение зонда...");
PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Нагрев камеры...");
PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охладжение камеры...");
PROGMEM Language_Str MSG_LASER_COOLING = _UxGT("Охлаждение лазера...");
PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калибровка Delta");
PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калибровать X");
PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Калибровать Y");
@@ -575,13 +645,12 @@ namespace Language_ru {
PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Настройки Delta");
PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Авто калибровка");
PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Высота Delta");
#if LCD_WIDTH >= 20
PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Зондировать Z-смещение");
PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стержень диагонали");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Зондировать Z-смещения");
#else
PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Зондир. Z-смещения");
PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стержень диаг.");
#endif
PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стержень диаг.");
PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Высота");
PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Радиус");
PROGMEM Language_Str MSG_INFO_MENU = _UxGT("О принтере");
@@ -597,6 +666,11 @@ namespace Language_ru {
#endif
PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Управление UBL");
PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Выравнивание сетки");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_MESH_DONE = _UxGT("Зондирование выполнено");
#else
PROGMEM Language_Str MSG_MESH_DONE = _UxGT("Зондиров. выполнено");
#endif
PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Статистика принтера");
PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Данные платы");
@@ -617,14 +691,14 @@ namespace Language_ru {
PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Яркость подсветки");
PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Неверный принтер");
#if LCD_WIDTH >= 20
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Счётчик печати");
PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Общее время печати");
PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Наидольшее задание");
PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Длина филамента");
#else
PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Отпечатков");
PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Всего");
PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Напечатано");
PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Общее время");
PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Наидольшее");
PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Выдавлено");
#endif
@@ -637,6 +711,9 @@ namespace Language_ru {
PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Привод, %");
PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Привод, %");
PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Привод, %");
PROGMEM Language_Str MSG_DAC_PERCENT_I = LCD_STR_I _UxGT(" Привод, %");
PROGMEM Language_Str MSG_DAC_PERCENT_J = LCD_STR_J _UxGT(" Привод, %");
PROGMEM Language_Str MSG_DAC_PERCENT_K = LCD_STR_K _UxGT(" Привод, %");
PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Привод, %");
PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("СБОЙ СВЯЗИ С TMC");
PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Запись DAC в EEPROM");
@@ -749,11 +826,11 @@ namespace Language_ru {
#endif
PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Пароль удалён");
PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Парковка..."));
//
// Filament Change screens show up to 3 lines on a 4-line display
// ...or up to 2 lines on a 3-line display
//
PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Парковка..."));
#if LCD_HEIGHT >= 4
PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Нажмите кнопку", "для продолжения", "печати"));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Ожидайте начала", "смены филамента"));
@@ -803,8 +880,8 @@ namespace Language_ru {
PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Мастер Z-зонда");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Зондиров. контрольной точки Z");
PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Движение к точке зондирования");
PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Зондиров. контр. точки Z");
PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Движение к точке зондиров.");
#else
PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Зондир.контр.точки Z");
PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Движ. к точке зондир.");
@@ -818,6 +895,11 @@ namespace Language_ru {
PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Нижний правый");
PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Калибровка успешна");
PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Ошибка калибровки");
PROGMEM Language_Str MSG_DRIVER_BACKWARD = _UxGT(" драйвер назад");
PROGMEM Language_Str MSG_SD_CARD = _UxGT("SD Карта");
PROGMEM Language_Str MSG_USB_DISK = _UxGT("USB Диск");
}
#if FAN_COUNT == 1

View File

@@ -272,6 +272,7 @@ namespace Language_sk {
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunúť o 0,1mm");
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunúť o 1mm");
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunúť o 10mm");
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Posunúť o 100mm");
PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Posunúť o 0,001in");
PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Posunúť o 0,01in");
PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Posunúť o 0,1in");

View File

@@ -260,6 +260,7 @@ namespace Language_sv {
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Flytta 0.1mm");
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Flytta 1mm");
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Flytta 10mm");
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Flytta 100mm");
PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Flytta 0.001tum");
PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Flytta 0.01tum");
PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Flytta 0.1tum");

View File

@@ -235,6 +235,7 @@ namespace Language_tr {
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("Hız");
PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Mesafesi");
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozul");

View File

@@ -71,6 +71,9 @@ namespace Language_uk {
PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Паркування X");
PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Паркування Y");
PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Паркування Z");
PROGMEM Language_Str MSG_AUTO_HOME_I = _UxGT("Паркування ") LCD_STR_I;
PROGMEM Language_Str MSG_AUTO_HOME_J = _UxGT("Паркування ") LCD_STR_J;
PROGMEM Language_Str MSG_AUTO_HOME_K = _UxGT("Паркування ") LCD_STR_K;
PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Авто Z-вирівнювання");
PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Ітерація: %i");
PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Зменьшення точності!");
@@ -82,11 +85,29 @@ namespace Language_uk {
PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Висота спаду");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Встанов. зміщення дому");
PROGMEM Language_Str MSG_HOME_OFFSET_X = _UxGT("Зміщення дому X");
PROGMEM Language_Str MSG_HOME_OFFSET_Y = _UxGT("Зміщення дому Y");
PROGMEM Language_Str MSG_HOME_OFFSET_Z = _UxGT("Зміщення дому Z");
PROGMEM Language_Str MSG_HOME_OFFSET_I = _UxGT("Зміщення дому ") LCD_STR_I;
PROGMEM Language_Str MSG_HOME_OFFSET_J = _UxGT("Зміщення дому ") LCD_STR_J;
PROGMEM Language_Str MSG_HOME_OFFSET_K = _UxGT("Зміщення дому ") LCD_STR_K;
#else
PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Встанов. зміщ. дому");
PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Встан. зміщ. дому");
PROGMEM Language_Str MSG_HOME_OFFSET_X = _UxGT("Зміщ. дому X");
PROGMEM Language_Str MSG_HOME_OFFSET_Y = _UxGT("Зміщ. дому Y");
PROGMEM Language_Str MSG_HOME_OFFSET_Z = _UxGT("Зміщ. дому Z");
PROGMEM Language_Str MSG_HOME_OFFSET_I = _UxGT("Зміщ. дому ") LCD_STR_I;
PROGMEM Language_Str MSG_HOME_OFFSET_J = _UxGT("Зміщ. дому ") LCD_STR_J;
PROGMEM Language_Str MSG_HOME_OFFSET_K = _UxGT("Зміщ. дому ") LCD_STR_K;
#endif
PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Зміщення прийняті");
PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Встановити нуль");
PROGMEM Language_Str MSG_SELECT_ORIGIN = _UxGT("Оберіть нуль");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_LAST_VALUE_SP = _UxGT("Останнє значення ");
#else
PROGMEM Language_Str MSG_LAST_VALUE_SP = _UxGT("Останнє знач. ");
#endif
#if PREHEAT_COUNT
PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Нагрів ") PREHEAT_1_LABEL;
PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Нагрів ") PREHEAT_1_LABEL " ~";
@@ -106,22 +127,29 @@ namespace Language_uk {
#endif
PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Нагрів свого");
PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Вимкнути нагрів");
PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Частота");
PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Керування лазером");
PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Керування шпінделем");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Потужність лазера");
PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Керування шпінделем");
#else
PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Потуж.лазера");
PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Керув. шпінделем");
#endif
PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Перемкнути шпіндель");
PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Перемкнути лазер");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Потуж. шпінделя");
PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Тестовий імпульс мс");
#else
PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Потуж. шпінд.");
PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Тест. імп. мс");
#endif
PROGMEM Language_Str MSG_LASER_EVAC_TOGGLE = _UxGT("Перемкнути обдув");
PROGMEM Language_Str MSG_LASER_ASSIST_TOGGLE = _UxGT("Керування обдувом");
PROGMEM Language_Str MSG_FLOWMETER_FAULT = _UxGT("Помилка обдуву");
PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Імпульс лазеру");
PROGMEM Language_Str MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Перемкнути вакуум");
PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Шпіндель вперед");
PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Шпіндель назад");
@@ -134,11 +162,14 @@ namespace Language_uk {
PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Вирівняти стіл");
PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Вирівняти кути");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Вгору до спрацювання зонду"); // not sure about this one
#else
PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Вгору до спрацюв. зонду");
PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Кути в межах. Вирів.столу");
#else
PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Вгору до спрац.зонду");
PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Кути в межах. Вирівн");
#endif
PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Кути в межах. Вирівнювання столу"); // Too long?
PROGMEM Language_Str MSG_LEVEL_CORNERS_GOOD_POINTS = _UxGT("Хороші точки: ");
PROGMEM Language_Str MSG_LEVEL_CORNERS_LAST_Z = _UxGT("Остання Z: ");
PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Наступний кут");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Зміщення по Z");
@@ -181,24 +212,25 @@ namespace Language_uk {
PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ручне введ. сітки");
PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Розм. шайбу і вимір.");
#endif
PROGMEM Language_Str MSG_UBL_MESH_WIZARD = _UxGT("Майстер сіток UBL");
PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Вимірювання");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Видалити і виміряти стіл");
#else
PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Видали і вимір. стіл");
#endif
PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Рух до наступної");
PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Активувати UBL");
PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Деактивувати UBL");
PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = LCD_STR_THERMOMETER _UxGT(" столу, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Своя ") LCD_STR_THERMOMETER _UxGT(" столу,") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = LCD_STR_THERMOMETER _UxGT(" сопла, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Своя ") LCD_STR_THERMOMETER _UxGT(" сопла,") LCD_STR_DEGREE "C";
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Температура столу");
PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Температура свого столу");
PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Температура сопла");
PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Температура свого сопла");
PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Редагувати свою сітку");
PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Точне редагування сітки");
PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Будувати свою сітку");
#else
PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = LCD_STR_THERMOMETER _UxGT(" столу, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" столу, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = LCD_STR_THERMOMETER _UxGT(" сопла, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" сопла, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Редагувати свою");
PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Точне редаг. сітки");
PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Будувати свою");
@@ -206,10 +238,8 @@ namespace Language_uk {
PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Редагування сітки");
PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Сітка побудована");
PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Будувати сітку");
#if PREHEAT_COUNT
PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Будувати сітку ($)");
PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Підтвердити ($)");
#endif
PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Буд. холодну сітку");
PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Встан.висоту сітки");
PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Висота");
@@ -219,7 +249,7 @@ namespace Language_uk {
PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 нагрів столу");
PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 нагрів сопла");
PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ручне грунтування");
PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Фікс. довж. грунт."); // ґ is not supported
PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Фікс. довж. грунт.");
PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Грунтув. виконане");
PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 скасовано");
PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Вийти з G26");
@@ -240,7 +270,7 @@ namespace Language_uk {
PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Зберегти зовні");
PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Інформація по UBL");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Обсяг заповнювача");
PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Обсяг заповнюв.");
#else
PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Обсяг заповн.");
#endif
@@ -251,12 +281,9 @@ namespace Language_uk {
PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Анулювати найближчу");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно налаштувати все");
#else
PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно налашт. все");
#endif
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Точно налашт.найближчу");
#else
PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно налашт. все");
PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Точно найближчу");
#endif
PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Збереження сітки");
@@ -300,7 +327,7 @@ namespace Language_uk {
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Передустановка світла #2");
#else
PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Передустан. світла #2");
PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Передуст. світла #2");
#endif
PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Яскравість");
PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Своє світло");
@@ -315,6 +342,9 @@ namespace Language_uk {
PROGMEM Language_Str MSG_MOVE_X = _UxGT("Рух по X");
PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Рух по Y");
PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Рух по Z");
PROGMEM Language_Str MSG_MOVE_I = _UxGT("Рух по ") LCD_STR_I;
PROGMEM Language_Str MSG_MOVE_J = _UxGT("Рух по ") LCD_STR_J;
PROGMEM Language_Str MSG_MOVE_K = _UxGT("Рух по ") LCD_STR_K;
PROGMEM Language_Str MSG_MOVE_E = _UxGT("Екструдер");
PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Екструдер *");
PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Сопло дуже холодне");
@@ -322,6 +352,7 @@ namespace Language_uk {
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("Рух 100mm");
PROGMEM Language_Str MSG_SPEED = _UxGT("Швидкість");
PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Столу");
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Сопло, ") LCD_STR_DEGREE "C";
@@ -330,6 +361,14 @@ namespace Language_uk {
PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Сопло очікує");
PROGMEM Language_Str MSG_BED = _UxGT("Стіл, ") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_CHAMBER = _UxGT("Камера,") LCD_STR_DEGREE "C";
PROGMEM Language_Str MSG_COOLER = _UxGT("Охолодження лазеру");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_COOLER_TOGGLE = _UxGT("Перемкнути охолодження");
#else
PROGMEM Language_Str MSG_COOLER_TOGGLE = _UxGT("Перемкнути охолодж.");
#endif
PROGMEM Language_Str MSG_FLOWMETER_SAFETY = _UxGT("Безпека потоку");
PROGMEM Language_Str MSG_LASER = _UxGT("Лазер");
PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Швидк. вент.");
PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Швидк. вент. ~");
#if LCD_WIDTH > 21
@@ -339,8 +378,8 @@ namespace Language_uk {
PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Збереж. вент. ~");
PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Додат.вент. ~");
#endif
PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Вент. контролера");
PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Дод. швидк. вент.");
PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Вент. контролера");
PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Холості оберти");
PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Авто-режим");
PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Робочі оберти");
@@ -369,6 +408,9 @@ namespace Language_uk {
PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-ривок");
PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-ривок");
PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-ривок");
PROGMEM Language_Str MSG_VI_JERK = _UxGT("V") LCD_STR_I _UxGT("-ривок");
PROGMEM Language_Str MSG_VJ_JERK = _UxGT("V") LCD_STR_J _UxGT("-ривок");
PROGMEM Language_Str MSG_VK_JERK = _UxGT("V") LCD_STR_K _UxGT("-ривок");
PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-ривок");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Відхилення вузла");
@@ -379,6 +421,9 @@ namespace Language_uk {
PROGMEM Language_Str MSG_VMAX_A = _UxGT("Швидк.макс ") LCD_STR_A;
PROGMEM Language_Str MSG_VMAX_B = _UxGT("Швидк.макс ") LCD_STR_B;
PROGMEM Language_Str MSG_VMAX_C = _UxGT("Швидк.макс ") LCD_STR_C;
PROGMEM Language_Str MSG_VMAX_I = _UxGT("Швидк.макс ") LCD_STR_I;
PROGMEM Language_Str MSG_VMAX_J = _UxGT("Швидк.макс ") LCD_STR_J;
PROGMEM Language_Str MSG_VMAX_K = _UxGT("Швидк.макс ") LCD_STR_K;
PROGMEM Language_Str MSG_VMAX_E = _UxGT("Швидк.макс ") LCD_STR_E;
PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Швидк.макс *");
PROGMEM Language_Str MSG_VMIN = _UxGT("Швидк.мін");
@@ -387,6 +432,9 @@ namespace Language_uk {
PROGMEM Language_Str MSG_AMAX_A = _UxGT("Приск.макс ") LCD_STR_A;
PROGMEM Language_Str MSG_AMAX_B = _UxGT("Приск.макс ") LCD_STR_B;
PROGMEM Language_Str MSG_AMAX_C = _UxGT("Приск.макс ") LCD_STR_C;
PROGMEM Language_Str MSG_AMAX_I = _UxGT("Приск.макс ") LCD_STR_I;
PROGMEM Language_Str MSG_AMAX_J = _UxGT("Приск.макс ") LCD_STR_J;
PROGMEM Language_Str MSG_AMAX_K = _UxGT("Приск.макс ") LCD_STR_K;
PROGMEM Language_Str MSG_AMAX_E = _UxGT("Приск.макс ") LCD_STR_E;
PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Приск.макс *");
PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Приск.втягув.");
@@ -397,6 +445,9 @@ namespace Language_uk {
PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" кроків/мм");
PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" кроків/мм");
PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" кроків/мм");
PROGMEM Language_Str MSG_I_STEPS = LCD_STR_I _UxGT(" кроків/мм");
PROGMEM Language_Str MSG_J_STEPS = LCD_STR_J _UxGT(" кроків/мм");
PROGMEM Language_Str MSG_K_STEPS = LCD_STR_K _UxGT(" кроків/мм");
PROGMEM Language_Str MSG_E_STEPS = _UxGT("E кроків/мм");
PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* кроків/мм");
PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура");
@@ -472,8 +523,6 @@ namespace Language_uk {
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Втягування, мм");
PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Зміна втягув.,мм");
PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ретракт V");
PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Стрибок, мм");
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Повернення, мм");
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Поверн.зміни, мм");
PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Автовтягування");
@@ -556,6 +605,9 @@ namespace Language_uk {
PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Мікрокрок X");
PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Мікрокрок Y");
PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Мікрокрок Z");
PROGMEM Language_Str MSG_BABYSTEP_I = _UxGT("Мікрокрок ") LCD_STR_I;
PROGMEM Language_Str MSG_BABYSTEP_J = _UxGT("Мікрокрок ") LCD_STR_J;
PROGMEM Language_Str MSG_BABYSTEP_K = _UxGT("Мікрокрок ") LCD_STR_K;
PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Сумарно");
PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Кінцевик спрацював");
PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Збій нагріву");
@@ -563,7 +615,13 @@ namespace Language_uk {
PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ВИТІК ТЕПЛА");
PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ВИТІК ТЕПЛА СТОЛУ");
PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ВИТІК ТЕПЛА КАМЕРИ");
PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("МАКСИМАЛЬНА Т");
PROGMEM Language_Str MSG_THERMAL_RUNAWAY_COOLER = _UxGT("ВИТІК ОХОЛОДЖЕННЯ");
#if LCD_WIDTH >= 20
PROGMEM Language_Str MSG_COOLING_FAILED = _UxGT("ОХОЛОДЖЕННЯ НЕ ВДАЛОСЬ");
#else
PROGMEM Language_Str MSG_COOLING_FAILED = _UxGT("ОХОЛОДЖ. НЕ ВДАЛОСЬ");
#endif
PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("МАКСИМАЛЬНА Т") LCD_STR_DEGREE;
PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("МІНІМАЛЬНА Т") LCD_STR_DEGREE;
PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИНТЕР ЗУПИНЕНО");
PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Перезавантажте");
@@ -573,18 +631,20 @@ namespace Language_uk {
PROGMEM Language_Str MSG_HEATING = _UxGT("Нагрівання...");
PROGMEM Language_Str MSG_COOLING = _UxGT("Охолодження...");
PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Нагрів столу...");
PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Нагрів камери...");
PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Нагрів зонду...");
PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калібрування Delta");
PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Нагрів камери...");
#if LCD_WIDTH >= 20
PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охолодження столу...");
PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охолодження камери...");
PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Охолодження зонду...");
PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охолодження камери...");
PROGMEM Language_Str MSG_LASER_COOLING = _UxGT("Охолодження лазеру...");
#else
PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охол. столу...");
PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охол. камери...");
PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Охол. зонду...");
PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охолодж. столу...");
PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Охолодж. зонду...");
PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охолодж. камери...");
PROGMEM Language_Str MSG_LASER_COOLING = _UxGT("Охолодж. лазеру...");
#endif
PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калібрування Delta");
PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калібрувати X");
PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Калібрувати Y");
PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Калібрувати Z");
@@ -611,6 +671,11 @@ namespace Language_uk {
#endif
PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("UBL");
PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Вирівнювання сітки");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_MESH_DONE = _UxGT("Зондування сітки виконано");
#else
PROGMEM Language_Str MSG_MESH_DONE = _UxGT("Зондування виконано");
#endif
PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Статистика принтера");
PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Про плату");
@@ -651,6 +716,9 @@ namespace Language_uk {
PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("Драйвер X, %");
PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Драйвер Y, %");
PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Драйвер Z, %");
PROGMEM Language_Str MSG_DAC_PERCENT_I = _UxGT("Драйвер ") AXIS4_STR _UxGT(", %");
PROGMEM Language_Str MSG_DAC_PERCENT_J = _UxGT("Драйвер ") AXIS5_STR _UxGT(", %");
PROGMEM Language_Str MSG_DAC_PERCENT_K = _UxGT("Драйвер ") AXIS6_STR _UxGT(", %");
PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("Драйвер E, %");
PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ЗБІЙ ЗВ'ЯЗКУ З TMC");
PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Запис ЦАП у EEPROM");
@@ -687,19 +755,19 @@ namespace Language_uk {
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Завантажити в сопло");
#else
PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Завантаж. в сопло");
PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Завант. в сопло");
#endif
PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU Звільнити");
PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU Звільнити ~");
PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU Вивантажити");
PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("MMU Завантаж. %i...");
PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("MMU Звільнення...");
PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("MMU Вивантаження...");
PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("MMU Все");
PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("MMU Пруток ~");
PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("MMU Перезапуск");
PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Завантаж. %i...");
PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Викидання прутка...");
PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Вивантаження...");
PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Все");
PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Пруток ~");
PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Перезапуск MMU");
PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU Перезапуск...");
PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("MMU Видаліть, натисніть");
PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Видаліть, натисніть");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_MIX = _UxGT("Змішування");
@@ -710,7 +778,11 @@ namespace Language_uk {
PROGMEM Language_Str MSG_MIXER = _UxGT("Змішувач");
PROGMEM Language_Str MSG_GRADIENT = _UxGT("Градієнт");
PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Повний градієнт");
PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Змішування переключ.");
#if LCD_WIDTH > 21
PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Переключити змішування");
#else
PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Переключ.змішування");
#endif
PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Циклічне змішування");
PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Градієнт змішування");
PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Змінити градієнт");
@@ -721,14 +793,13 @@ namespace Language_uk {
PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Зкидання В-інструментів");
#else
PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Актив. В-інструм.");
PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Псевдонім В-інструм.");
PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Псевдонім В-інструм");
PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Зкидання В-інструм.");
#endif
PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Початок В-інструменту");
PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Кінець В-інструменту");
PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Змішати В-інструменти");
PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("В-інструменти зкинуті");
PROGMEM Language_Str MSG_START_Z = _UxGT("Початок Z:");
PROGMEM Language_Str MSG_END_Z = _UxGT(" Кінець Z:");
@@ -756,12 +827,12 @@ namespace Language_uk {
PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Не забудь зберегти!");
PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Пароль видалений");
PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Паркування..."));
//
// Filament Change screens show up to 3 lines on a 4-line display
// ...or up to 2 lines on a 3-line display
//
PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Паркування..."));
#if LCD_HEIGHT >= 4
// Up to 3 lines allowed
PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Натисніть кнопку", "для продовження", "друку"));
@@ -828,6 +899,11 @@ namespace Language_uk {
PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Нижній правий");
PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Калібрування успішне");
PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Збій калібрування");
PROGMEM Language_Str MSG_DRIVER_BACKWARD = _UxGT(" драйвер назад");
PROGMEM Language_Str MSG_SD_CARD = _UxGT("SD Картка");
PROGMEM Language_Str MSG_USB_DISK = _UxGT("USB Диск");
}
#if FAN_COUNT == 1

View File

@@ -205,6 +205,7 @@ namespace Language_vi {
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Di chuyển 0.1mm"); // Move 0.1mm
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Di chuyển 1mm"); // Move 1mm
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Di chuyển 10mm"); // Move 10mm
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("Di chuyển 100mm"); // Move 100mm
PROGMEM Language_Str MSG_SPEED = _UxGT("Tốc độ"); // Speed
PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Bàn");
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Đầu phun"); // Nozzle

View File

@@ -230,6 +230,7 @@ namespace Language_zh_CN {
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("移动 0.1 mm"); //"Move 0.1mm"
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("移动 1 mm"); //"Move 1mm"
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("移动 10 mm"); //"Move 10mm"
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("移动 100 mm"); //"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" 噴嘴

View File

@@ -228,6 +228,7 @@ namespace Language_zh_TW {
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("移動 0.1 mm"); //"Move 0.1mm"
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("移動 1 mm"); //"Move 1mm"
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("移動 10 mm"); //"Move 10mm"
PROGMEM Language_Str MSG_MOVE_100MM = _UxGT("移動 100 mm"); //"Move 100mm"
PROGMEM Language_Str MSG_SPEED = _UxGT("速率"); //"Speed"
PROGMEM Language_Str MSG_BED_Z = _UxGT("熱床Z"); //"Bed Z"
PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴"); //"Nozzle" 噴嘴

View File

@@ -41,6 +41,7 @@
* * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL)
*/
lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const inStr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) {
const uint8_t prop = USE_WIDE_GLYPH ? 2 : 1;
uint8_t *p = (uint8_t*)pstr;
int8_t n = maxlen;
while (n > 0) {
@@ -73,10 +74,27 @@ lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const i
}
else {
lcd_put_wchar(ch);
n--;
n -= ch > 255 ? prop : 1;
}
}
return n;
}
// Calculate UTF8 width with a simple check
int calculateWidth(PGM_P const pstr) {
if (!USE_WIDE_GLYPH) return utf8_strlen_P(pstr) * MENU_FONT_WIDTH;
const uint8_t prop = 2;
uint8_t *p = (uint8_t*)pstr;
int n = 0;
do {
wchar_t ch;
p = get_utf8_value_cb(p, read_byte_rom, &ch);
if (!ch) break;
n += (ch > 255) ? prop : 1;
} while (1);
return n * MENU_FONT_WIDTH;
}
#endif // HAS_WIRED_LCD

View File

@@ -172,3 +172,5 @@ inline int lcd_put_wchar(const lcd_uint_t col, const lcd_uint_t row, const wchar
lcd_moveto(col, row);
return lcd_put_wchar(c);
}
int calculateWidth(PGM_P const pstr);

View File

@@ -165,8 +165,9 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
#endif
#endif
#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0
#if SCREENS_CAN_TIME_OUT
bool MarlinUI::defer_return_to_status;
millis_t MarlinUI::return_to_status_ms = 0;
#endif
uint8_t MarlinUI::lcd_status_update_delay = 1; // First update one loop delayed
@@ -815,9 +816,6 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) {
LCDViewAction MarlinUI::lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW;
millis_t next_lcd_update_ms;
#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS
millis_t MarlinUI::return_to_status_ms = 0;
#endif
inline bool can_encode() {
return !BUTTON_PRESSED(ENC_EN); // Update encoder only when ENC_EN is not LOW (pressed)
@@ -828,12 +826,6 @@ void MarlinUI::update() {
static uint16_t max_display_update_time = 0;
millis_t ms = millis();
#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0
#define RESET_STATUS_TIMEOUT() (return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS)
#else
#define RESET_STATUS_TIMEOUT() NOOP
#endif
#ifdef LED_BACKLIGHT_TIMEOUT
leds.update_timeout(powersupply_on);
#endif
@@ -859,7 +851,7 @@ void MarlinUI::update() {
#if HAS_TOUCH_BUTTONS
if (touch_buttons) {
RESET_STATUS_TIMEOUT();
reset_status_timeout(ms);
if (touch_buttons & (EN_A | EN_B)) { // Menu arrows, in priority
if (ELAPSED(ms, next_button_update_ms)) {
encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * epps * encoderDirection;
@@ -914,7 +906,7 @@ void MarlinUI::update() {
TERN_(HAS_SLOW_BUTTONS, slow_buttons = read_slow_buttons()); // Buttons that take too long to read in interrupt context
if (TERN0(IS_RRW_KEYPAD, handle_keypad()))
RESET_STATUS_TIMEOUT();
reset_status_timeout(ms);
uint8_t abs_diff = ABS(encoderDiff);
@@ -980,7 +972,7 @@ void MarlinUI::update() {
encoderDiff = 0;
}
RESET_STATUS_TIMEOUT();
reset_status_timeout(ms);
refresh(LCDVIEW_REDRAW_NOW);
@@ -1006,7 +998,7 @@ void MarlinUI::update() {
lcd_status_update_delay = ++filename_scroll_pos >= filename_scroll_max ? 12 : 4; // Long delay at end and start
if (filename_scroll_pos > filename_scroll_max) filename_scroll_pos = 0;
refresh(LCDVIEW_REDRAW_NOW);
RESET_STATUS_TIMEOUT();
reset_status_timeout(ms);
}
#endif
@@ -1075,10 +1067,10 @@ void MarlinUI::update() {
NOLESS(max_display_update_time, millis() - ms);
}
#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0
#if SCREENS_CAN_TIME_OUT
// Return to Status Screen after a timeout
if (on_status_screen() || defer_return_to_status)
RESET_STATUS_TIMEOUT();
reset_status_timeout(ms);
else if (ELAPSED(ms, return_to_status_ms))
return_to_status();
#endif
@@ -1609,8 +1601,9 @@ void MarlinUI::update() {
if (status) {
if (old_status < 2) {
TERN_(EXTENSIBLE_UI, ExtUI::onMediaInserted()); // ExtUI response
#if ENABLED(BROWSE_MEDIA_ON_INSERT)
#if ENABLED(EXTENSIBLE_UI)
ExtUI::onMediaInserted();
#elif ENABLED(BROWSE_MEDIA_ON_INSERT)
clear_menu_history();
quick_feedback();
goto_screen(MEDIA_MENU_GATEWAY);
@@ -1621,8 +1614,9 @@ void MarlinUI::update() {
}
else {
if (old_status < 2) {
TERN_(EXTENSIBLE_UI, ExtUI::onMediaRemoved()); // ExtUI response
#if PIN_EXISTS(SD_DETECT)
#if ENABLED(EXTENSIBLE_UI)
ExtUI::onMediaRemoved();
#elif PIN_EXISTS(SD_DETECT)
LCD_MESSAGEPGM(MSG_MEDIA_REMOVED);
#if HAS_LCD_MENU
if (!defer_return_to_status) return_to_status();

View File

@@ -445,11 +445,14 @@ public:
static PGM_P get_preheat_label(const uint8_t m);
#endif
#if HAS_LCD_MENU
#if LCD_TIMEOUT_TO_STATUS
static millis_t return_to_status_ms;
#if SCREENS_CAN_TIME_OUT
static inline void reset_status_timeout(const millis_t ms) { return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS; }
#else
static inline void reset_status_timeout(const millis_t) {}
#endif
#if HAS_LCD_MENU
#if HAS_TOUCH_BUTTONS
static uint8_t touch_buttons;
static uint8_t repeat_delay;
@@ -479,7 +482,7 @@ public:
static screenFunc_t currentScreen;
static bool screen_changed;
static void goto_screen(const screenFunc_t screen, const uint16_t encoder=0, const uint8_t top=0, const uint8_t items=0);
static void save_previous_screen();
static void push_current_screen();
// goto_previous_screen and go_back may also be used as menu item callbacks
static void _goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_back));
@@ -494,12 +497,12 @@ public:
static void lcd_in_status(const bool inStatus);
#endif
FORCE_INLINE static bool screen_is_sticky() {
return TERN1(SCREENS_CAN_TIME_OUT, defer_return_to_status);
}
FORCE_INLINE static void defer_status_screen(const bool defer=true) {
#if LCD_TIMEOUT_TO_STATUS > 0
defer_return_to_status = defer;
#else
UNUSED(defer);
#endif
TERN(SCREENS_CAN_TIME_OUT, defer_return_to_status = defer, UNUSED(defer));
}
static inline void goto_previous_screen_no_defer() {
@@ -651,16 +654,18 @@ public:
private:
#if SCREENS_CAN_TIME_OUT
static millis_t return_to_status_ms;
static bool defer_return_to_status;
#else
static constexpr bool defer_return_to_status = false;
#endif
#if HAS_STATUS_MESSAGE
static void finish_status(const bool persist);
#endif
#if HAS_WIRED_LCD
#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0
static bool defer_return_to_status;
#else
static constexpr bool defer_return_to_status = false;
#endif
static void draw_status_screen();
#if HAS_GRAPHICAL_TFT
static void tft_idle();

View File

@@ -50,9 +50,12 @@
int8_t encoderTopLine, encoderLine, screen_items;
typedef struct {
screenFunc_t menu_function;
uint32_t encoder_position;
int8_t top_line, items;
screenFunc_t menu_function; // The screen's function
uint32_t encoder_position; // The position of the encoder
int8_t top_line, items; // The amount of scroll, and the number of items
#if SCREENS_CAN_TIME_OUT
bool sticky; // The screen is sticky
#endif
} menuPosition;
menuPosition screen_history[6];
uint8_t screen_history_depth = 0;
@@ -75,9 +78,9 @@ bool MenuEditItemBase::liveEdit;
void MarlinUI::return_to_status() { goto_screen(status_screen); }
void MarlinUI::save_previous_screen() {
void MarlinUI::push_current_screen() {
if (screen_history_depth < COUNT(screen_history))
screen_history[screen_history_depth++] = { currentScreen, encoderPosition, encoderTopLine, screen_items };
screen_history[screen_history_depth++] = { currentScreen, encoderPosition, encoderTopLine, screen_items OPTARG(SCREENS_CAN_TIME_OUT, screen_is_sticky()) };
}
void MarlinUI::_goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_back/*=false*/)) {
@@ -90,6 +93,7 @@ void MarlinUI::_goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_b
is_back ? 0 : sh.top_line,
sh.items
);
defer_status_screen(TERN_(SCREENS_CAN_TIME_OUT, sh.sticky));
}
else
return_to_status();
@@ -147,7 +151,7 @@ void MenuEditItemBase::goto_edit_screen(
) {
TERN_(HAS_TOUCH_BUTTONS, ui.on_edit_screen = true);
ui.screen_changed = true;
ui.save_previous_screen();
ui.push_current_screen();
ui.refresh();
editLabel = el;
editValue = ev;
@@ -237,7 +241,7 @@ void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, co
//
void MarlinUI::synchronize(PGM_P const msg/*=nullptr*/) {
static PGM_P sync_message = msg ?: GET_TEXT(MSG_MOVING);
save_previous_screen();
push_current_screen();
goto_screen([]{
if (should_draw()) MenuItem_static::draw(LCD_HEIGHT >= 4, sync_message);
});
@@ -371,6 +375,7 @@ void MenuItem_confirm::select_screen(
selectFunc_t yesFunc, selectFunc_t noFunc,
PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/
) {
ui.defer_status_screen();
const bool ui_selection = ui.update_selection(), got_click = ui.use_click();
if (got_click || ui.should_draw()) {
draw_select_screen(yes, no, ui_selection, pref, string, suff);
@@ -378,7 +383,6 @@ void MenuItem_confirm::select_screen(
selectFunc_t callFunc = ui_selection ? yesFunc : noFunc;
if (callFunc) callFunc(); else ui.goto_previous_screen();
}
ui.defer_status_screen();
}
}

View File

@@ -140,6 +140,7 @@ typedef union {
uint8_t uint8;
uint16_t uint16;
uint32_t uint32;
celsius_t celsius;
} chimera_t;
extern chimera_t editable;

View File

@@ -39,7 +39,7 @@ class MenuItem_submenu : public MenuItemBase {
FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) {
_draw(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0]);
}
static inline void action(PGM_P const, const screenFunc_t func) { ui.save_previous_screen(); ui.goto_screen(func); }
static inline void action(PGM_P const, const screenFunc_t func) { ui.push_current_screen(); ui.goto_screen(func); }
};
// Any menu item that invokes an immediate action
@@ -406,7 +406,7 @@ class MenuItem_bool : public MenuEditItemBase {
#define _CONFIRM_ITEM_INNER_P(PLABEL, V...) do { \
if (encoderLine == _thisItemNr && ui.use_click()) { \
ui.save_previous_screen(); \
ui.push_current_screen(); \
ui.goto_screen([]{MenuItem_confirm::select_screen(V);}); \
return; \
} \

View File

@@ -28,6 +28,8 @@
#if HAS_LCD_MENU
#define LARGE_AREA_TEST ((X_BED_SIZE) >= 1000 || (Y_BED_SIZE) >= 1000 || (Z_MAX_POS) >= 1000)
#include "menu_item.h"
#include "menu_addon.h"
@@ -85,7 +87,7 @@ static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) {
MenuEditItemBase::draw_edit_screen(name, ftostr63(imp_pos));
}
else
MenuEditItemBase::draw_edit_screen(name, ui.manual_move.menu_scale >= 0.1f ? ftostr41sign(pos) : ftostr63(pos));
MenuEditItemBase::draw_edit_screen(name, ui.manual_move.menu_scale >= 0.1f ? (LARGE_AREA_TEST ? ftostr51sign(pos) : ftostr41sign(pos)) : ftostr63(pos));
}
}
void lcd_move_x() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_X), X_AXIS); }
@@ -165,11 +167,13 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int
BACK_ITEM(MSG_MOVE_AXIS);
if (parser.using_inch_units()) {
if (LARGE_AREA_TEST) SUBMENU(MSG_MOVE_1IN, []{ _goto_manual_move(IN_TO_MM(1.000f)); });
SUBMENU(MSG_MOVE_01IN, []{ _goto_manual_move(IN_TO_MM(0.100f)); });
SUBMENU(MSG_MOVE_001IN, []{ _goto_manual_move(IN_TO_MM(0.010f)); });
SUBMENU(MSG_MOVE_0001IN, []{ _goto_manual_move(IN_TO_MM(0.001f)); });
}
else {
if (LARGE_AREA_TEST) SUBMENU(MSG_MOVE_100MM, []{ _goto_manual_move(100); });
SUBMENU(MSG_MOVE_10MM, []{ _goto_manual_move(10); });
SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); });
SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); });

View File

@@ -177,7 +177,7 @@ void Password::menu_password() {
START_MENU();
BACK_ITEM(MSG_ADVANCED_SETTINGS);
SUBMENU(MSG_CHANGE_PASSWORD, screen_set_password);
ACTION_ITEM(MSG_REMOVE_PASSWORD, []{ ui.save_previous_screen(); remove_password(); } );
ACTION_ITEM(MSG_REMOVE_PASSWORD, []{ ui.push_current_screen(); remove_password(); } );
#if ENABLED(EEPROM_SETTINGS)
ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings);
#endif

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