Merge branch 'bugfix-2.0.x' into CrealityDwin2.0_Bleeding
This commit is contained in:
+53
-21
@@ -163,7 +163,7 @@
|
||||
|
||||
//#define CHAMBER_FAN // Enable a fan on the chamber
|
||||
#if ENABLED(CHAMBER_FAN)
|
||||
#define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve.
|
||||
#define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve; 3=similar to 1 but fan is always on.
|
||||
#if CHAMBER_FAN_MODE == 0
|
||||
#define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255)
|
||||
#elif CHAMBER_FAN_MODE == 1
|
||||
@@ -172,6 +172,9 @@
|
||||
#elif CHAMBER_FAN_MODE == 2
|
||||
#define CHAMBER_FAN_BASE 128 // Minimum chamber fan PWM (0-255)
|
||||
#define CHAMBER_FAN_FACTOR 25 // PWM increase per °C difference from target
|
||||
#elif CHAMBER_FAN_MODE == 3
|
||||
#define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255)
|
||||
#define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1549,6 +1552,15 @@
|
||||
// Enable if SD detect is rendered useless (e.g., by using an SD extender)
|
||||
//#define NO_SD_DETECT
|
||||
|
||||
// Multiple volume support - EXPERIMENTAL.
|
||||
//#define MULTI_VOLUME
|
||||
#if ENABLED(MULTI_VOLUME)
|
||||
#define VOLUME_SD_ONBOARD
|
||||
#define VOLUME_USB_FLASH_DRIVE
|
||||
#define DEFAULT_VOLUME SD_ONBOARD
|
||||
#define DEFAULT_SHARED_VOLUME USB_FLASH_DRIVE
|
||||
#endif
|
||||
|
||||
#endif // SDSUPPORT
|
||||
|
||||
/**
|
||||
@@ -2210,6 +2222,15 @@
|
||||
#define EMERGENCY_PARSER
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Realtime Reporting
|
||||
* Add support for commands S000 State, P000 Pause, and R000 Resume
|
||||
*/
|
||||
//#define REALTIME_REPORTING_COMMANDS
|
||||
#if ENABLED(REALTIME_REPORTING_COMMANDS)
|
||||
//#define FULL_REPORT_TO_HOST_FEATURE // Auto-report the machine status like Grbl CNC
|
||||
#endif
|
||||
|
||||
// Bad Serial-connections can miss a received command by sending an 'ok'
|
||||
// Therefore some clients abort after 30 seconds in a timeout.
|
||||
// Some other clients start sending commands while receiving a 'wait'.
|
||||
@@ -2292,6 +2313,12 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Tool Sensors detect when tools have been picked up or dropped.
|
||||
* Requires the pins TOOL_SENSOR1_PIN, TOOL_SENSOR2_PIN, etc.
|
||||
*/
|
||||
//#define TOOL_SENSOR
|
||||
|
||||
/**
|
||||
* Retract and prime filament on tool-change to reduce
|
||||
* ooze and stringing and to get cleaner transitions.
|
||||
@@ -2801,22 +2828,22 @@
|
||||
* { <off_time[1..15]>, <hysteresis_end[-3..12]>, hysteresis_start[1..8] }
|
||||
*/
|
||||
#define CHOPPER_TIMING CHOPPER_DEFAULT_12V // All axes (override below)
|
||||
//#define CHOPPER_TIMING_X CHOPPER_DEFAULT_12V // For X Axes (override below)
|
||||
//#define CHOPPER_TIMING_X2 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_Y CHOPPER_DEFAULT_12V // For Y Axes (override below)
|
||||
//#define CHOPPER_TIMING_Y2 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_Z CHOPPER_DEFAULT_12V // For Z Axes (override below)
|
||||
//#define CHOPPER_TIMING_Z2 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_Z3 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_Z4 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_E CHOPPER_DEFAULT_12V // For Extruders (override below)
|
||||
//#define CHOPPER_TIMING_E1 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_E2 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_E3 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_E4 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_E5 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_E6 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_E7 CHOPPER_DEFAULT_12V
|
||||
//#define CHOPPER_TIMING_X CHOPPER_TIMING // For X Axes (override below)
|
||||
//#define CHOPPER_TIMING_X2 CHOPPER_TIMING_X
|
||||
//#define CHOPPER_TIMING_Y CHOPPER_TIMING // For Y Axes (override below)
|
||||
//#define CHOPPER_TIMING_Y2 CHOPPER_TIMING_Y
|
||||
//#define CHOPPER_TIMING_Z CHOPPER_TIMING // For Z Axes (override below)
|
||||
//#define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z
|
||||
//#define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z
|
||||
//#define CHOPPER_TIMING_Z4 CHOPPER_TIMING_Z
|
||||
//#define CHOPPER_TIMING_E CHOPPER_TIMING // For Extruders (override below)
|
||||
//#define CHOPPER_TIMING_E1 CHOPPER_TIMING_E
|
||||
//#define CHOPPER_TIMING_E2 CHOPPER_TIMING_E
|
||||
//#define CHOPPER_TIMING_E3 CHOPPER_TIMING_E
|
||||
//#define CHOPPER_TIMING_E4 CHOPPER_TIMING_E
|
||||
//#define CHOPPER_TIMING_E5 CHOPPER_TIMING_E
|
||||
//#define CHOPPER_TIMING_E6 CHOPPER_TIMING_E
|
||||
//#define CHOPPER_TIMING_E7 CHOPPER_TIMING_E
|
||||
|
||||
/**
|
||||
* Monitor Trinamic drivers
|
||||
@@ -3454,13 +3481,18 @@
|
||||
*/
|
||||
//#define POWER_MONITOR_CURRENT // Monitor the system current
|
||||
//#define POWER_MONITOR_VOLTAGE // Monitor the system voltage
|
||||
#if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE)
|
||||
#define POWER_MONITOR_VOLTS_PER_AMP 0.05000 // Input voltage to the MCU analog pin per amp - DO NOT apply more than ADC_VREF!
|
||||
#define POWER_MONITOR_CURRENT_OFFSET -1 // Offset value for current sensors with linear function output
|
||||
#define POWER_MONITOR_VOLTS_PER_VOLT 0.11786 // Input voltage to the MCU analog pin per volt - DO NOT apply more than ADC_VREF!
|
||||
|
||||
#if ENABLED(POWER_MONITOR_CURRENT)
|
||||
#define POWER_MONITOR_VOLTS_PER_AMP 0.05000 // Input voltage to the MCU analog pin per amp - DO NOT apply more than ADC_VREF!
|
||||
#define POWER_MONITOR_CURRENT_OFFSET 0 // Offset (in amps) applied to the calculated current
|
||||
#define POWER_MONITOR_FIXED_VOLTAGE 13.6 // Voltage for a current sensor with no voltage sensor (for power display)
|
||||
#endif
|
||||
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
#define POWER_MONITOR_VOLTS_PER_VOLT 0.077933 // Input voltage to the MCU analog pin per volt - DO NOT apply more than ADC_VREF!
|
||||
#define POWER_MONITOR_VOLTAGE_OFFSET 0 // Offset (in volts) applied to the calculated voltage
|
||||
#endif
|
||||
|
||||
/**
|
||||
* CNC Coordinate Systems
|
||||
*
|
||||
|
||||
@@ -454,7 +454,7 @@ void MarlinSerial<Cfg>::flush() {
|
||||
}
|
||||
|
||||
template<typename Cfg>
|
||||
size_t MarlinSerial<Cfg>::write(const uint8_t c) {
|
||||
void MarlinSerial<Cfg>::write(const uint8_t c) {
|
||||
if (Cfg::TX_SIZE == 0) {
|
||||
|
||||
_written = true;
|
||||
@@ -480,7 +480,7 @@ size_t MarlinSerial<Cfg>::write(const uint8_t c) {
|
||||
// location". This makes sure flush() won't return until the bytes
|
||||
// actually got written
|
||||
B_TXC = 1;
|
||||
return 1;
|
||||
return;
|
||||
}
|
||||
|
||||
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
|
||||
@@ -510,7 +510,6 @@ size_t MarlinSerial<Cfg>::write(const uint8_t c) {
|
||||
// Enable TX ISR - Non atomic, but it will eventually enable TX ISR
|
||||
B_UDRIE = 1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
template<typename Cfg>
|
||||
|
||||
@@ -210,7 +210,7 @@
|
||||
static int read();
|
||||
static void flush();
|
||||
static ring_buffer_pos_t available();
|
||||
static size_t write(const uint8_t c);
|
||||
static void write(const uint8_t c);
|
||||
static void flushTX();
|
||||
#if HAS_DGUS_LCD
|
||||
static ring_buffer_pos_t get_tx_buffer_free();
|
||||
|
||||
@@ -32,7 +32,7 @@ Ctrl_status sd_mmc_spi_test_unit_ready() {
|
||||
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
||||
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
||||
return CTRL_NO_PRESENT;
|
||||
*nb_sector = card.getSd2Card().cardSize() - 1;
|
||||
*nb_sector = card.diskIODriver()->cardSize() - 1;
|
||||
return CTRL_GOOD;
|
||||
}
|
||||
|
||||
@@ -74,24 +74,24 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
||||
#endif
|
||||
|
||||
// Start reading
|
||||
if (!card.getSd2Card().readStart(addr))
|
||||
if (!card.diskIODriver()->readStart(addr))
|
||||
return CTRL_FAIL;
|
||||
|
||||
// For each specified sector
|
||||
while (nb_sector--) {
|
||||
|
||||
// Read a sector
|
||||
card.getSd2Card().readData(sector_buf);
|
||||
card.diskIODriver()->readData(sector_buf);
|
||||
|
||||
// RAM -> USB
|
||||
if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) {
|
||||
card.getSd2Card().readStop();
|
||||
card.diskIODriver()->readStop();
|
||||
return CTRL_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
// Stop reading
|
||||
card.getSd2Card().readStop();
|
||||
card.diskIODriver()->readStop();
|
||||
|
||||
// Done
|
||||
return CTRL_GOOD;
|
||||
@@ -113,7 +113,7 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!card.getSd2Card().writeStart(addr, nb_sector))
|
||||
if (!card.diskIODriver()->writeStart(addr, nb_sector))
|
||||
return CTRL_FAIL;
|
||||
|
||||
// For each specified sector
|
||||
@@ -121,16 +121,16 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
||||
|
||||
// USB -> RAM
|
||||
if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) {
|
||||
card.getSd2Card().writeStop();
|
||||
card.diskIODriver()->writeStop();
|
||||
return CTRL_FAIL;
|
||||
}
|
||||
|
||||
// Write a sector
|
||||
card.getSd2Card().writeData(sector_buf);
|
||||
card.diskIODriver()->writeData(sector_buf);
|
||||
}
|
||||
|
||||
// Stop writing
|
||||
card.getSd2Card().writeStop();
|
||||
card.diskIODriver()->writeStop();
|
||||
|
||||
// Done
|
||||
return CTRL_GOOD;
|
||||
|
||||
@@ -322,7 +322,7 @@ void usb_task_init(void) {
|
||||
char *sptr;
|
||||
|
||||
// Patch in the filament diameter
|
||||
sprintf_P(diam, PSTR("%d"), (int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000.0));
|
||||
itoa((int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000), diam, 10);
|
||||
|
||||
// And copy it to the proper place, expanding it to unicode
|
||||
sptr = &diam[0];
|
||||
|
||||
@@ -85,8 +85,8 @@
|
||||
#define SDIO_CMD_PIN PD2
|
||||
|
||||
SD_HandleTypeDef hsd; // create SDIO structure
|
||||
// F4 support one dma for RX and another for TX.
|
||||
// But Marlin will never do read and write at same time, so we use always one dma for both.
|
||||
// F4 supports one DMA for RX and another for TX, but Marlin will never
|
||||
// do read and write at same time, so we use the same DMA for both.
|
||||
DMA_HandleTypeDef hdma_sdio;
|
||||
|
||||
/*
|
||||
@@ -274,7 +274,7 @@
|
||||
}
|
||||
|
||||
static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t *src, uint8_t *dst) {
|
||||
if(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) return false;
|
||||
if (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) return false;
|
||||
|
||||
TERN_(USE_WATCHDOG, HAL_watchdog_refresh());
|
||||
|
||||
@@ -296,10 +296,10 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t timeout = millis() + 500;
|
||||
millis_t timeout = millis() + 500;
|
||||
// Wait the transfer
|
||||
while (hsd.State != HAL_SD_STATE_READY) {
|
||||
if (millis() > timeout) {
|
||||
if (ELAPSED(millis(), timeout)) {
|
||||
HAL_DMA_Abort_IT(&hdma_sdio);
|
||||
HAL_DMA_DeInit(&hdma_sdio);
|
||||
return false;
|
||||
@@ -313,8 +313,7 @@
|
||||
HAL_DMA_DeInit(&hdma_sdio);
|
||||
|
||||
timeout = millis() + 500;
|
||||
while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER)
|
||||
if (millis() > timeout) return false;
|
||||
while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) if (ELAPSED(millis(), timeout)) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -30,54 +30,66 @@
|
||||
|
||||
class Sd2CardUSBMscHandler : public USBMscHandler {
|
||||
public:
|
||||
DiskIODriver* diskIODriver() {
|
||||
#if ENABLED(MULTI_VOLUME)
|
||||
#if SHARED_VOLUME_IS(SD_ONBOARD)
|
||||
return &card.media_sd_spi;
|
||||
#elif SHARED_VOLUME_IS(USB_FLASH_DRIVE)
|
||||
return &card.media_usbFlashDrive;
|
||||
#endif
|
||||
#else
|
||||
return diskIODriver();
|
||||
#endif
|
||||
}
|
||||
|
||||
bool GetCapacity(uint32_t *pBlockNum, uint16_t *pBlockSize) {
|
||||
*pBlockNum = card.getSd2Card().cardSize();
|
||||
*pBlockNum = diskIODriver()->cardSize();
|
||||
*pBlockSize = BLOCK_SIZE;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Write(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) {
|
||||
auto sd2card = card.getSd2Card();
|
||||
auto sd2card = diskIODriver();
|
||||
// single block
|
||||
if (blkLen == 1) {
|
||||
watchdog_refresh();
|
||||
sd2card.writeBlock(blkAddr, pBuf);
|
||||
sd2card->writeBlock(blkAddr, pBuf);
|
||||
return true;
|
||||
}
|
||||
|
||||
// multi block optmization
|
||||
sd2card.writeStart(blkAddr, blkLen);
|
||||
sd2card->writeStart(blkAddr, blkLen);
|
||||
while (blkLen--) {
|
||||
watchdog_refresh();
|
||||
sd2card.writeData(pBuf);
|
||||
sd2card->writeData(pBuf);
|
||||
pBuf += BLOCK_SIZE;
|
||||
}
|
||||
sd2card.writeStop();
|
||||
sd2card->writeStop();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Read(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) {
|
||||
auto sd2card = card.getSd2Card();
|
||||
auto sd2card = diskIODriver();
|
||||
// single block
|
||||
if (blkLen == 1) {
|
||||
watchdog_refresh();
|
||||
sd2card.readBlock(blkAddr, pBuf);
|
||||
sd2card->readBlock(blkAddr, pBuf);
|
||||
return true;
|
||||
}
|
||||
|
||||
// multi block optmization
|
||||
sd2card.readStart(blkAddr);
|
||||
sd2card->readStart(blkAddr);
|
||||
while (blkLen--) {
|
||||
watchdog_refresh();
|
||||
sd2card.readData(pBuf);
|
||||
sd2card->readData(pBuf);
|
||||
pBuf += BLOCK_SIZE;
|
||||
}
|
||||
sd2card.readStop();
|
||||
sd2card->readStop();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IsReady() {
|
||||
return card.isMounted();
|
||||
return diskIODriver()->isReady();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -105,8 +117,8 @@ USBMscHandler *pSingleMscHandler = &usbMscHandler;
|
||||
void MSC_SD_init() {
|
||||
USBDevice.end();
|
||||
delay(200);
|
||||
USBDevice.begin();
|
||||
USBDevice.registerMscHandlers(1, &pSingleMscHandler, Marlin_STORAGE_Inquirydata);
|
||||
USBDevice.begin();
|
||||
}
|
||||
|
||||
#endif // __STM32F1__ && HAS_SD_HOST_DRIVE
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
// ------------------------
|
||||
|
||||
#ifndef STM32_FLASH_SIZE
|
||||
#if EITHER(MCU_STM32F103RE, MCU_STM32F103VE)
|
||||
#if ANY(MCU_STM32F103RE, MCU_STM32F103VE, MCU_STM32F103ZE)
|
||||
#define STM32_FLASH_SIZE 512
|
||||
#else
|
||||
#define STM32_FLASH_SIZE 256
|
||||
|
||||
@@ -320,8 +320,8 @@ void hook_cpu_exceptions() {
|
||||
// So we'll simply mask the top 8 bits of the first handler as an hint of being in the flash or not -that's poor and will
|
||||
// probably break if the flash happens to be more than 128MB, but in this case, we are not magician, we need help from outside.
|
||||
|
||||
unsigned long * vecAddr = (unsigned long*)get_vtor();
|
||||
SERIAL_ECHO("Vector table addr: ");
|
||||
unsigned long *vecAddr = (unsigned long*)get_vtor();
|
||||
SERIAL_ECHOPGM("Vector table addr: ");
|
||||
SERIAL_PRINTLN(get_vtor(), HEX);
|
||||
|
||||
#ifdef VECTOR_TABLE_SIZE
|
||||
@@ -348,7 +348,7 @@ void hook_cpu_exceptions() {
|
||||
// 128 bytes alignement is required for writing the VTOR register
|
||||
alignas(128) static unsigned long vectable[VECTOR_TABLE_SENTINEL];
|
||||
|
||||
SERIAL_ECHO("Detected vector table size: ");
|
||||
SERIAL_ECHOPGM("Detected vector table size: ");
|
||||
SERIAL_PRINTLN(vec_size, HEX);
|
||||
#endif
|
||||
|
||||
@@ -372,7 +372,7 @@ void hook_cpu_exceptions() {
|
||||
|
||||
HW_REG(0xE000ED08) = (unsigned long)vectable | _BV32(29); // 29th bit is for telling the CPU the table is now in SRAM (should be present already)
|
||||
|
||||
SERIAL_ECHOLN("Installed fault handlers");
|
||||
SERIAL_ECHOLNPGM("Installed fault handlers");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -210,9 +210,7 @@
|
||||
#include "feature/fanmux.h"
|
||||
#endif
|
||||
|
||||
#if DO_SWITCH_EXTRUDER || ANY(SWITCHING_NOZZLE, PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER, ELECTROMAGNETIC_SWITCHING_TOOLHEAD, SWITCHING_TOOLHEAD)
|
||||
#include "module/tool_change.h"
|
||||
#endif
|
||||
#include "module/tool_change.h"
|
||||
|
||||
#if ENABLED(USE_CONTROLLER_FAN)
|
||||
#include "feature/controllerfan.h"
|
||||
@@ -731,6 +729,9 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
|
||||
// Return if setup() isn't completed
|
||||
if (marlin_state == MF_INITIALIZING) goto IDLE_DONE;
|
||||
|
||||
// TODO: Still causing errors
|
||||
(void)check_tool_sensor_stats(active_extruder, true);
|
||||
|
||||
// Handle filament runout sensors
|
||||
TERN_(HAS_FILAMENT_SENSOR, runout.run());
|
||||
|
||||
@@ -757,7 +758,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
|
||||
TERN_(SDSUPPORT, card.manage_media());
|
||||
|
||||
// Handle USB Flash Drive insert / remove
|
||||
TERN_(USB_FLASH_DRIVE_SUPPORT, Sd2Card::idle());
|
||||
TERN_(USB_FLASH_DRIVE_SUPPORT, card.diskIODriver()->idle());
|
||||
|
||||
// Announce Host Keepalive state (if any)
|
||||
TERN_(HOST_KEEPALIVE_FEATURE, gcode.host_keepalive());
|
||||
|
||||
@@ -28,11 +28,11 @@
|
||||
// This is used like SERIAL_ECHOPAIR, that is: a key-value call of the local variables you want
|
||||
// to dump to the serial port before stopping the CPU.
|
||||
// \/ Don't replace by SERIAL_ECHOPAIR since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building
|
||||
#define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLN(": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0)
|
||||
#define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLNPGM(": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0)
|
||||
#elif ENABLED(MARLIN_DEV_MODE)
|
||||
// Don't stop the CPU here, but at least dump the bug on the serial port
|
||||
// \/ Don't replace by SERIAL_ECHOPAIR since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building
|
||||
#define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLN(": BUG!"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0)
|
||||
#define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLNPGM(": BUG!"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0)
|
||||
#else
|
||||
// Release mode, let's ignore the bug
|
||||
#define BUG_ON(V...) NOOP
|
||||
|
||||
@@ -187,14 +187,21 @@
|
||||
#define DISABLED(V...) DO(DIS,&&,V)
|
||||
#define COUNT_ENABLED(V...) DO(ENA,+,V)
|
||||
|
||||
#define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION converted to '0' or '1'
|
||||
#define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION converted to A or '0'
|
||||
#define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION converted to A or '1'
|
||||
#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION converted to A or '<nul>'
|
||||
#define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION ? 'A' : 'B'
|
||||
#define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION ? 'A' : '0'
|
||||
#define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION ? 'A' : '1'
|
||||
#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION ? 'A' : '<nul>'
|
||||
#define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1'
|
||||
#define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1'
|
||||
#define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B.
|
||||
|
||||
// Macros to avoid 'f + 0.0' which is not always optimized away. Minus included for symmetry.
|
||||
// Compiler flags -fno-signed-zeros -ffinite-math-only also cover 'f * 1.0', 'f - f', etc.
|
||||
#define PLUS_TERN0(O,A) _TERN(_ENA_1(O),,+ (A)) // OPTION ? '+ (A)' : '<nul>'
|
||||
#define MINUS_TERN0(O,A) _TERN(_ENA_1(O),,- (A)) // OPTION ? '- (A)' : '<nul>'
|
||||
#define SUM_TERN(O,B,A) ((B) PLUS_TERN0(O,A)) // ((B) (OPTION ? '+ (A)' : '<nul>'))
|
||||
#define DIFF_TERN(O,B,A) ((B) MINUS_TERN0(O,A)) // ((B) (OPTION ? '- (A)' : '<nul>'))
|
||||
|
||||
#define IF_ENABLED TERN_
|
||||
#define IF_DISABLED(O,A) TERN(O,,A)
|
||||
|
||||
|
||||
@@ -144,6 +144,7 @@ void SERIAL_ECHO(T x) { SERIAL_IMPL.print(x); }
|
||||
typedef struct SerialChar { char c; SerialChar(char n) : c(n) { } } serial_char_t;
|
||||
inline void SERIAL_ECHO(serial_char_t x) { SERIAL_IMPL.write(x.c); }
|
||||
#define AS_CHAR(C) serial_char_t(C)
|
||||
#define AS_DIGIT(C) AS_CHAR('0' + (C))
|
||||
|
||||
// SERIAL_ECHO_F prints a floating point value with optional precision
|
||||
inline void SERIAL_ECHO_F(EnsureDouble x, int digit=2) { SERIAL_IMPL.print(x, digit); }
|
||||
|
||||
@@ -100,7 +100,7 @@ struct SerialBase {
|
||||
|
||||
// Static dispatch methods below:
|
||||
// The most important method here is where it all ends to:
|
||||
size_t write(uint8_t c) { return SerialChild->write(c); }
|
||||
void write(uint8_t c) { SerialChild->write(c); }
|
||||
|
||||
// Called when the parser finished processing an instruction, usually build to nothing
|
||||
void msgDone() const { SerialChild->msgDone(); }
|
||||
|
||||
@@ -209,11 +209,9 @@ struct MultiSerial : public SerialBase< MultiSerial<Serial0T, Serial1T, offset,
|
||||
static constexpr uint8_t SecondOutput = (Usage << (offset + step));
|
||||
static constexpr uint8_t Both = FirstOutput | SecondOutput;
|
||||
|
||||
NO_INLINE size_t write(uint8_t c) {
|
||||
size_t ret = 0;
|
||||
if (portMask.enabled(FirstOutput)) ret = serial0.write(c);
|
||||
if (portMask.enabled(SecondOutput)) ret = serial1.write(c) | ret;
|
||||
return ret;
|
||||
NO_INLINE void write(uint8_t c) {
|
||||
if (portMask.enabled(FirstOutput)) serial0.write(c);
|
||||
if (portMask.enabled(SecondOutput)) serial1.write(c);
|
||||
}
|
||||
NO_INLINE void msgDone() {
|
||||
if (portMask.enabled(FirstOutput)) serial0.msgDone();
|
||||
|
||||
@@ -114,9 +114,10 @@ public:
|
||||
const float x1 = index_to_xpos[ind.x], x2 = index_to_xpos[ind.x+1],
|
||||
y1 = index_to_xpos[ind.y], y2 = index_to_xpos[ind.y+1],
|
||||
z1 = calc_z0(pos.x, x1, z_values[ind.x][ind.y ], x2, z_values[ind.x+1][ind.y ]),
|
||||
z2 = calc_z0(pos.x, x1, z_values[ind.x][ind.y+1], x2, z_values[ind.x+1][ind.y+1]);
|
||||
z2 = calc_z0(pos.x, x1, z_values[ind.x][ind.y+1], x2, z_values[ind.x+1][ind.y+1]),
|
||||
zf = calc_z0(pos.y, y1, z1, y2, z2);
|
||||
|
||||
return z_offset + calc_z0(pos.y, y1, z1, y2, z2) * factor;
|
||||
return z_offset + zf * factor;
|
||||
}
|
||||
|
||||
#if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES)
|
||||
|
||||
@@ -264,24 +264,10 @@ public:
|
||||
return UBL_Z_RAISE_WHEN_OFF_MESH;
|
||||
#endif
|
||||
|
||||
const float z1 = calc_z0(rx0,
|
||||
mesh_index_to_xpos(cx), z_values[cx][cy],
|
||||
mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, (GRID_MAX_POINTS_X) - 2) + 1][cy]);
|
||||
|
||||
const float z2 = calc_z0(rx0,
|
||||
mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, (GRID_MAX_POINTS_Y) - 2) + 1],
|
||||
mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, (GRID_MAX_POINTS_X) - 2) + 1][_MIN(cy, (GRID_MAX_POINTS_Y) - 2) + 1]);
|
||||
|
||||
float z0 = calc_z0(ry0,
|
||||
mesh_index_to_ypos(cy), z1,
|
||||
mesh_index_to_ypos(cy + 1), z2);
|
||||
|
||||
if (DEBUGGING(MESH_ADJUST)) {
|
||||
DEBUG_ECHOPAIR(" raw get_z_correction(", rx0);
|
||||
DEBUG_CHAR(','); DEBUG_ECHO(ry0);
|
||||
DEBUG_ECHOPAIR_F(") = ", z0, 6);
|
||||
DEBUG_ECHOLNPAIR_F(" >>>---> ", z0, 6);
|
||||
}
|
||||
const uint8_t mx = _MIN(cx, (GRID_MAX_POINTS_X) - 2) + 1, my = _MIN(cy, (GRID_MAX_POINTS_Y) - 2) + 1;
|
||||
const float z1 = calc_z0(rx0, mesh_index_to_xpos(cx), z_values[cx][cy], mesh_index_to_xpos(cx + 1), z_values[mx][cy]);
|
||||
const float z2 = calc_z0(rx0, mesh_index_to_xpos(cx), z_values[cx][my], mesh_index_to_xpos(cx + 1), z_values[mx][my]);
|
||||
float z0 = calc_z0(ry0, mesh_index_to_ypos(cy), z1, mesh_index_to_ypos(cy + 1), z2);
|
||||
|
||||
if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN
|
||||
z0 = 0.0; // in ubl.z_values[][] and propagate through the
|
||||
@@ -289,14 +275,14 @@ public:
|
||||
// because part of the Mesh is undefined and we don't have the
|
||||
// information we need to complete the height correction.
|
||||
|
||||
if (DEBUGGING(MESH_ADJUST)) {
|
||||
DEBUG_ECHOPAIR("??? Yikes! NAN in get_z_correction(", rx0);
|
||||
DEBUG_CHAR(',');
|
||||
DEBUG_ECHO(ry0);
|
||||
DEBUG_CHAR(')');
|
||||
DEBUG_EOL();
|
||||
}
|
||||
if (DEBUGGING(MESH_ADJUST)) DEBUG_ECHOLNPAIR("??? Yikes! NAN in ");
|
||||
}
|
||||
|
||||
if (DEBUGGING(MESH_ADJUST)) {
|
||||
DEBUG_ECHOPAIR("get_z_correction(", rx0, ", ", ry0);
|
||||
DEBUG_ECHOLNPAIR_F(") => ", z0, 6);
|
||||
}
|
||||
|
||||
return z0;
|
||||
}
|
||||
static inline float get_z_correction(const xy_pos_t &pos) { return get_z_correction(pos.x, pos.y); }
|
||||
|
||||
@@ -34,29 +34,33 @@
|
||||
// External references
|
||||
extern bool wait_for_user, wait_for_heatup;
|
||||
|
||||
#if ENABLED(REALTIME_REPORTING_COMMANDS)
|
||||
// From motion.h, which cannot be included here
|
||||
void report_current_position_moving();
|
||||
void quickpause_stepper();
|
||||
void quickresume_stepper();
|
||||
#endif
|
||||
|
||||
class EmergencyParser {
|
||||
|
||||
public:
|
||||
|
||||
// Currently looking for: M108, M112, M410, M876
|
||||
enum State : char {
|
||||
// Currently looking for: M108, M112, M410, M876 S[0-9], S000, P000, R000
|
||||
enum State : uint8_t {
|
||||
EP_RESET,
|
||||
EP_N,
|
||||
EP_M,
|
||||
EP_M1,
|
||||
EP_M10,
|
||||
EP_M108,
|
||||
EP_M11,
|
||||
EP_M112,
|
||||
EP_M4,
|
||||
EP_M41,
|
||||
EP_M410,
|
||||
EP_M10, EP_M108,
|
||||
EP_M11, EP_M112,
|
||||
EP_M4, EP_M41, EP_M410,
|
||||
#if ENABLED(HOST_PROMPT_SUPPORT)
|
||||
EP_M8,
|
||||
EP_M87,
|
||||
EP_M876,
|
||||
EP_M876S,
|
||||
EP_M876SN,
|
||||
EP_M8, EP_M87, EP_M876, EP_M876S, EP_M876SN,
|
||||
#endif
|
||||
#if ENABLED(REALTIME_REPORTING_COMMANDS)
|
||||
EP_S, EP_S0, EP_S00, EP_GRBL_STATUS,
|
||||
EP_R, EP_R0, EP_R00, EP_GRBL_RESUME,
|
||||
EP_P, EP_P0, EP_P00, EP_GRBL_PAUSE,
|
||||
#endif
|
||||
EP_IGNORE // to '\n'
|
||||
};
|
||||
@@ -71,7 +75,6 @@ public:
|
||||
EmergencyParser() { enable(); }
|
||||
|
||||
FORCE_INLINE static void enable() { enabled = true; }
|
||||
|
||||
FORCE_INLINE static void disable() { enabled = false; }
|
||||
|
||||
FORCE_INLINE static void update(State &state, const uint8_t c) {
|
||||
@@ -79,21 +82,45 @@ public:
|
||||
case EP_RESET:
|
||||
switch (c) {
|
||||
case ' ': case '\n': case '\r': break;
|
||||
case 'N': state = EP_N; break;
|
||||
case 'M': state = EP_M; break;
|
||||
default: state = EP_IGNORE;
|
||||
case 'N': state = EP_N; break;
|
||||
case 'M': state = EP_M; break;
|
||||
#if ENABLED(REALTIME_REPORTING_COMMANDS)
|
||||
case 'S': state = EP_S; break;
|
||||
case 'P': state = EP_P; break;
|
||||
case 'R': state = EP_R; break;
|
||||
#endif
|
||||
default: state = EP_IGNORE;
|
||||
}
|
||||
break;
|
||||
|
||||
case EP_N:
|
||||
switch (c) {
|
||||
case '0' ... '9':
|
||||
case '-': case ' ': break;
|
||||
case 'M': state = EP_M; break;
|
||||
default: state = EP_IGNORE;
|
||||
case '-': case ' ': break;
|
||||
case 'M': state = EP_M; break;
|
||||
#if ENABLED(REALTIME_REPORTING_COMMANDS)
|
||||
case 'S': state = EP_S; break;
|
||||
case 'P': state = EP_P; break;
|
||||
case 'R': state = EP_R; break;
|
||||
#endif
|
||||
default: state = EP_IGNORE;
|
||||
}
|
||||
break;
|
||||
|
||||
#if ENABLED(REALTIME_REPORTING_COMMANDS)
|
||||
case EP_S: state = (c == '0') ? EP_S0 : EP_IGNORE; break;
|
||||
case EP_S0: state = (c == '0') ? EP_S00 : EP_IGNORE; break;
|
||||
case EP_S00: state = (c == '0') ? EP_GRBL_STATUS : EP_IGNORE; break;
|
||||
|
||||
case EP_R: state = (c == '0') ? EP_R0 : EP_IGNORE; break;
|
||||
case EP_R0: state = (c == '0') ? EP_R00 : EP_IGNORE; break;
|
||||
case EP_R00: state = (c == '0') ? EP_GRBL_RESUME : EP_IGNORE; break;
|
||||
|
||||
case EP_P: state = (c == '0') ? EP_P0 : EP_IGNORE; break;
|
||||
case EP_P0: state = (c == '0') ? EP_P00 : EP_IGNORE; break;
|
||||
case EP_P00: state = (c == '0') ? EP_GRBL_PAUSE : EP_IGNORE; break;
|
||||
#endif
|
||||
|
||||
case EP_M:
|
||||
switch (c) {
|
||||
case ' ': break;
|
||||
@@ -114,48 +141,34 @@ public:
|
||||
}
|
||||
break;
|
||||
|
||||
case EP_M10:
|
||||
state = (c == '8') ? EP_M108 : EP_IGNORE;
|
||||
break;
|
||||
|
||||
case EP_M11:
|
||||
state = (c == '2') ? EP_M112 : EP_IGNORE;
|
||||
break;
|
||||
|
||||
case EP_M4:
|
||||
state = (c == '1') ? EP_M41 : EP_IGNORE;
|
||||
break;
|
||||
|
||||
case EP_M41:
|
||||
state = (c == '0') ? EP_M410 : EP_IGNORE;
|
||||
break;
|
||||
case EP_M10: state = (c == '8') ? EP_M108 : EP_IGNORE; break;
|
||||
case EP_M11: state = (c == '2') ? EP_M112 : EP_IGNORE; break;
|
||||
case EP_M4: state = (c == '1') ? EP_M41 : EP_IGNORE; break;
|
||||
case EP_M41: state = (c == '0') ? EP_M410 : EP_IGNORE; break;
|
||||
|
||||
#if ENABLED(HOST_PROMPT_SUPPORT)
|
||||
case EP_M8:
|
||||
state = (c == '7') ? EP_M87 : EP_IGNORE;
|
||||
break;
|
||||
|
||||
case EP_M87:
|
||||
state = (c == '6') ? EP_M876 : EP_IGNORE;
|
||||
break;
|
||||
case EP_M8: state = (c == '7') ? EP_M87 : EP_IGNORE; break;
|
||||
case EP_M87: state = (c == '6') ? EP_M876 : EP_IGNORE; break;
|
||||
|
||||
case EP_M876:
|
||||
switch (c) {
|
||||
case ' ': break;
|
||||
case 'S': state = EP_M876S; break;
|
||||
default: state = EP_IGNORE; break;
|
||||
}
|
||||
break;
|
||||
case EP_M876:
|
||||
switch (c) {
|
||||
case ' ': break;
|
||||
case 'S': state = EP_M876S; break;
|
||||
default: state = EP_IGNORE; break;
|
||||
}
|
||||
break;
|
||||
|
||||
case EP_M876S:
|
||||
switch (c) {
|
||||
case ' ': break;
|
||||
case '0' ... '9':
|
||||
state = EP_M876SN;
|
||||
M876_reason = uint8_t(c - '0');
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case EP_M876S:
|
||||
switch (c) {
|
||||
case ' ': break;
|
||||
case '0' ... '9':
|
||||
state = EP_M876SN;
|
||||
M876_reason = (uint8_t)(c - '0');
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case EP_IGNORE:
|
||||
@@ -171,6 +184,11 @@ public:
|
||||
#if ENABLED(HOST_PROMPT_SUPPORT)
|
||||
case EP_M876SN: host_response_handler(M876_reason); break;
|
||||
#endif
|
||||
#if ENABLED(REALTIME_REPORTING_COMMANDS)
|
||||
case EP_GRBL_STATUS: report_current_position_moving(); break;
|
||||
case EP_GRBL_PAUSE: quickpause_stepper(); break;
|
||||
case EP_GRBL_RESUME: quickresume_stepper(); break;
|
||||
#endif
|
||||
default: break;
|
||||
}
|
||||
state = EP_RESET;
|
||||
|
||||
@@ -111,14 +111,14 @@ void FWRetract::retract(const bool retracting
|
||||
|
||||
/* // debugging
|
||||
SERIAL_ECHOLNPAIR(
|
||||
"retracting ", retracting,
|
||||
"retracting ", AS_DIGIT(retracting),
|
||||
" swapping ", swapping,
|
||||
" active extruder ", active_extruder
|
||||
);
|
||||
LOOP_L_N(i, EXTRUDERS) {
|
||||
SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]);
|
||||
SERIAL_ECHOLNPAIR("retracted[", i, "] ", AS_DIGIT(retracted[i]));
|
||||
#if HAS_MULTI_EXTRUDER
|
||||
SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]);
|
||||
SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", AS_DIGIT(retracted_swap[i]));
|
||||
#endif
|
||||
}
|
||||
SERIAL_ECHOLNPAIR("current_position.z ", current_position.z);
|
||||
@@ -185,13 +185,13 @@ void FWRetract::retract(const bool retracting
|
||||
#endif
|
||||
|
||||
/* // debugging
|
||||
SERIAL_ECHOLNPAIR("retracting ", retracting);
|
||||
SERIAL_ECHOLNPAIR("swapping ", swapping);
|
||||
SERIAL_ECHOLNPAIR("retracting ", AS_DIGIT(retracting));
|
||||
SERIAL_ECHOLNPAIR("swapping ", AS_DIGIT(swapping));
|
||||
SERIAL_ECHOLNPAIR("active_extruder ", active_extruder);
|
||||
LOOP_L_N(i, EXTRUDERS) {
|
||||
SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]);
|
||||
SERIAL_ECHOLNPAIR("retracted[", i, "] ", AS_DIGIT(retracted[i]));
|
||||
#if HAS_MULTI_EXTRUDER
|
||||
SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]);
|
||||
SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", AS_DIGIT(retracted_swap[i]));
|
||||
#endif
|
||||
}
|
||||
SERIAL_ECHOLNPAIR("current_position.z ", current_position.z);
|
||||
@@ -268,7 +268,7 @@ void FWRetract::M208_report(const bool forReplay/*=false*/) {
|
||||
|
||||
void FWRetract::M209_report(const bool forReplay/*=false*/) {
|
||||
if (!forReplay) { SERIAL_ECHO_MSG("; Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); SERIAL_ECHO_START(); }
|
||||
SERIAL_ECHOLNPAIR(" M209 S", autoretract_enabled);
|
||||
SERIAL_ECHOLNPAIR(" M209 S", AS_DIGIT(autoretract_enabled));
|
||||
}
|
||||
|
||||
#endif // FWRETRACT_AUTORETRACT
|
||||
|
||||
@@ -133,7 +133,7 @@ struct MeatpackSerial : public SerialBase <MeatpackSerial < SerialT >> {
|
||||
uint8_t charCount;
|
||||
uint8_t readIndex;
|
||||
|
||||
NO_INLINE size_t write(uint8_t c) { return out.write(c); }
|
||||
NO_INLINE void write(uint8_t c) { out.write(c); }
|
||||
void flush() { out.flush(); }
|
||||
void begin(long br) { out.begin(br); readIndex = 0; }
|
||||
void end() { out.end(); }
|
||||
|
||||
@@ -597,11 +597,13 @@ void resume_print(const_float_t slow_load_length/*=0*/, const_float_t fast_load_
|
||||
unscaled_e_move(-(PAUSE_PARK_RETRACT_LENGTH), feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE));
|
||||
|
||||
if (!axes_should_home()) {
|
||||
// Move XY to starting position, then Z
|
||||
do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE));
|
||||
// Move XY back to saved position
|
||||
destination.set(resume_position.x, resume_position.y, current_position.z);
|
||||
prepare_internal_move_to_destination(NOZZLE_PARK_XY_FEEDRATE);
|
||||
|
||||
// Move Z_AXIS to saved position
|
||||
do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
|
||||
// Move Z back to saved position
|
||||
destination.z = resume_position.z;
|
||||
prepare_internal_move_to_destination(NOZZLE_PARK_Z_FEEDRATE);
|
||||
}
|
||||
|
||||
// Unretract
|
||||
|
||||
@@ -26,8 +26,11 @@
|
||||
|
||||
#include "power_monitor.h"
|
||||
|
||||
#include "../lcd/marlinui.h"
|
||||
#include "../lcd/lcdprint.h"
|
||||
#if HAS_LCD_MENU
|
||||
#include "../lcd/marlinui.h"
|
||||
#include "../lcd/lcdprint.h"
|
||||
#endif
|
||||
|
||||
#include "../libs/numtostr.h"
|
||||
|
||||
uint8_t PowerMonitor::flags; // = 0
|
||||
@@ -54,7 +57,7 @@ PowerMonitor power_monitor; // Single instance - this calls the constructor
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HAS_POWER_MONITOR_VREF
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
void PowerMonitor::draw_voltage() {
|
||||
const float volts = getVolts();
|
||||
lcd_put_u8str(volts < 100 ? ftostr31ns(volts) : ui16tostr4rj((uint16_t)volts));
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "../inc/MarlinConfig.h"
|
||||
|
||||
#define PM_SAMPLE_RANGE 1024
|
||||
#define PM_SAMPLE_RANGE HAL_ADC_RANGE
|
||||
#define PM_K_VALUE 6
|
||||
#define PM_K_SCALE 6
|
||||
|
||||
@@ -35,7 +35,7 @@ struct pm_lpf_t {
|
||||
filter_buf = filter_buf - (filter_buf >> K_VALUE) + (uint32_t(sample) << K_SCALE);
|
||||
}
|
||||
void capture() {
|
||||
value = filter_buf * (SCALE * (1.0f / (1UL << (PM_K_VALUE + PM_K_SCALE)))) + (POWER_MONITOR_CURRENT_OFFSET);
|
||||
value = filter_buf * (SCALE * (1.0f / (1UL << (PM_K_VALUE + PM_K_SCALE))));
|
||||
}
|
||||
void reset(uint16_t reset_value = 0) {
|
||||
filter_buf = uint32_t(reset_value) << (K_VALUE + K_SCALE);
|
||||
@@ -69,19 +69,15 @@ public:
|
||||
};
|
||||
|
||||
#if ENABLED(POWER_MONITOR_CURRENT)
|
||||
FORCE_INLINE static float getAmps() { return amps.value; }
|
||||
FORCE_INLINE static float getAmps() { return amps.value + (POWER_MONITOR_CURRENT_OFFSET); }
|
||||
void add_current_sample(const uint16_t value) { amps.add_sample(value); }
|
||||
#endif
|
||||
|
||||
#if HAS_POWER_MONITOR_VREF
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
FORCE_INLINE static float getVolts() { return volts.value; }
|
||||
#else
|
||||
FORCE_INLINE static float getVolts() { return POWER_MONITOR_FIXED_VOLTAGE; } // using a specified fixed valtage as the voltage measurement
|
||||
#endif
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
void add_voltage_sample(const uint16_t value) { volts.add_sample(value); }
|
||||
#endif
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
FORCE_INLINE static float getVolts() { return volts.value + (POWER_MONITOR_VOLTAGE_OFFSET); }
|
||||
void add_voltage_sample(const uint16_t value) { volts.add_sample(value); }
|
||||
#else
|
||||
FORCE_INLINE static float getVolts() { return POWER_MONITOR_FIXED_VOLTAGE; }
|
||||
#endif
|
||||
|
||||
#if HAS_POWER_MONITOR_WATTS
|
||||
@@ -98,7 +94,7 @@ public:
|
||||
FORCE_INLINE static void set_current_display(const bool b) { SET_BIT_TO(flags, PM_DISP_BIT_I, b); }
|
||||
FORCE_INLINE static void toggle_current_display() { TBI(flags, PM_DISP_BIT_I); }
|
||||
#endif
|
||||
#if HAS_POWER_MONITOR_VREF
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
static void draw_voltage();
|
||||
FORCE_INLINE static bool voltage_display_enabled() { return TEST(flags, PM_DISP_BIT_V); }
|
||||
FORCE_INLINE static void set_voltage_display(const bool b) { SET_BIT_TO(flags, PM_DISP_BIT_V, b); }
|
||||
|
||||
@@ -612,7 +612,7 @@ void PrintJobRecovery::resume() {
|
||||
DEBUG_ECHOLNPAIR("sd_filename: ", info.sd_filename);
|
||||
DEBUG_ECHOLNPAIR("sdpos: ", info.sdpos);
|
||||
DEBUG_ECHOLNPAIR("print_job_elapsed: ", info.print_job_elapsed);
|
||||
DEBUG_ECHOLNPAIR("dryrun: ", info.flag.dryrun);
|
||||
DEBUG_ECHOLNPAIR("dryrun: ", AS_DIGIT(info.flag.dryrun));
|
||||
DEBUG_ECHOLNPAIR("allow_cold_extrusion: ", info.flag.allow_cold_extrusion);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -205,8 +205,8 @@ typedef struct {
|
||||
layer_height = MESH_TEST_LAYER_HEIGHT,
|
||||
prime_length = PRIME_LENGTH;
|
||||
|
||||
int16_t bed_temp = MESH_TEST_BED_TEMP,
|
||||
hotend_temp = MESH_TEST_HOTEND_TEMP;
|
||||
celsius_t bed_temp = MESH_TEST_BED_TEMP,
|
||||
hotend_temp = MESH_TEST_HOTEND_TEMP;
|
||||
|
||||
float nozzle = MESH_TEST_NOZZLE_SIZE,
|
||||
filament_diameter = DEFAULT_NOMINAL_FILAMENT_DIA,
|
||||
|
||||
@@ -102,7 +102,7 @@ void GcodeSuite::G35() {
|
||||
// In BLTOUCH HS mode, the probe travels in a deployed state.
|
||||
// Users of G35 might have a badly misaligned bed, so raise Z by the
|
||||
// length of the deployed pin (BLTOUCH stroke < 7mm)
|
||||
do_blocking_move_to_z((Z_CLEARANCE_BETWEEN_PROBES) + TERN0(BLTOUCH_HS_MODE, 7));
|
||||
do_blocking_move_to_z(SUM_TERN(BLTOUCH_HS_MODE, Z_CLEARANCE_BETWEEN_PROBES, 7));
|
||||
const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[i], PROBE_PT_RAISE, 0, true);
|
||||
|
||||
if (isnan(z_probed_height)) {
|
||||
|
||||
@@ -217,9 +217,10 @@ public:
|
||||
* There's no extra effect if you have a fixed Z probe.
|
||||
*/
|
||||
G29_TYPE GcodeSuite::G29() {
|
||||
|
||||
TERN_(PROBE_MANUALLY, static) G29_State abl;
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_PROBE));
|
||||
|
||||
reset_stepper_timeout();
|
||||
|
||||
const bool seenQ = EITHER(DEBUG_LEVELING_FEATURE, PROBE_MANUALLY) && parser.seen('Q');
|
||||
@@ -897,7 +898,10 @@ G29_TYPE GcodeSuite::G29() {
|
||||
|
||||
report_current_position();
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE));
|
||||
|
||||
G29_RETURN(isnan(abl.measured_z));
|
||||
|
||||
}
|
||||
|
||||
#endif // HAS_ABL_NOT_UBL
|
||||
|
||||
@@ -60,6 +60,8 @@ inline void echo_not_entered(const char c) { SERIAL_CHAR(c); SERIAL_ECHOLNPGM("
|
||||
*/
|
||||
void GcodeSuite::G29() {
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_PROBE));
|
||||
|
||||
static int mbl_probe_index = -1;
|
||||
|
||||
MeshLevelingState state = (MeshLevelingState)parser.byteval('S', (int8_t)MeshReport);
|
||||
@@ -187,6 +189,8 @@ void GcodeSuite::G29() {
|
||||
}
|
||||
|
||||
report_current_position();
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE));
|
||||
}
|
||||
|
||||
#endif // MESH_BED_LEVELING
|
||||
|
||||
@@ -31,6 +31,17 @@
|
||||
#include "../../gcode.h"
|
||||
#include "../../../feature/bedlevel/bedlevel.h"
|
||||
|
||||
void GcodeSuite::G29() { ubl.G29(); }
|
||||
#if ENABLED(FULL_REPORT_TO_HOST_FEATURE)
|
||||
#include "../../../module/motion.h"
|
||||
#endif
|
||||
|
||||
void GcodeSuite::G29() {
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_PROBE));
|
||||
|
||||
ubl.G29();
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE));
|
||||
}
|
||||
|
||||
#endif // AUTO_BED_LEVELING_UBL
|
||||
|
||||
@@ -211,6 +211,8 @@ void GcodeSuite::G28() {
|
||||
|
||||
TERN_(LASER_MOVE_G28_OFF, cutter.set_inline_enabled(false)); // turn off laser
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_HOMING));
|
||||
|
||||
#if ENABLED(DUAL_X_CARRIAGE)
|
||||
bool IDEX_saved_duplication_state = extruder_duplication_enabled;
|
||||
DualXMode IDEX_saved_mode = dual_x_carriage_mode;
|
||||
@@ -479,6 +481,8 @@ void GcodeSuite::G28() {
|
||||
if (ENABLED(NANODLP_Z_SYNC) && (doZ || ENABLED(NANODLP_ALL_AXIS)))
|
||||
SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP);
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE));
|
||||
|
||||
#if HAS_L64XX
|
||||
// Set L6470 absolute position registers to counts
|
||||
// constexpr *might* move this to PROGMEM.
|
||||
|
||||
@@ -387,6 +387,8 @@ static float auto_tune_a() {
|
||||
*/
|
||||
void GcodeSuite::G33() {
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_PROBE));
|
||||
|
||||
const int8_t probe_points = parser.intval('P', DELTA_CALIBRATION_DEFAULT_POINTS);
|
||||
if (!WITHIN(probe_points, 0, 10)) {
|
||||
SERIAL_ECHOLNPGM("?(P)oints implausible (0-10).");
|
||||
@@ -645,6 +647,8 @@ void GcodeSuite::G33() {
|
||||
while (((zero_std_dev < test_precision && iterations < 31) || iterations <= force_iterations) && zero_std_dev > calibration_precision);
|
||||
|
||||
ac_cleanup(TERN_(HAS_MULTI_HOTEND, old_tool_index));
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE));
|
||||
}
|
||||
|
||||
#endif // DELTA_AUTO_CALIBRATION
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
if (parser.seen(XYZ_CHAR(i))) {
|
||||
const float v = parser.value_linear_units();
|
||||
if (v * Z_HOME_DIR <= 0) delta_endstop_adj[i] = v;
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("delta_endstop_adj[", XYZ_CHAR(i), "] = ", delta_endstop_adj[i]);
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("delta_endstop_adj[", AS_CHAR(XYZ_CHAR(i)), "] = ", delta_endstop_adj[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
|
||||
HOTEND_LOOP() {
|
||||
DEBUG_ECHOPAIR_P(SP_T_STR, e);
|
||||
LOOP_XYZ(a) DEBUG_ECHOPAIR(" hotend_offset[", e, "].", XYZ_CHAR(a) | 0x20, "=", hotend_offset[e][a]);
|
||||
LOOP_XYZ(a) DEBUG_ECHOPAIR(" hotend_offset[", e, "].", AS_CHAR(XYZ_CHAR(a) | 0x20), "=", hotend_offset[e][a]);
|
||||
DEBUG_EOL();
|
||||
}
|
||||
DEBUG_EOL();
|
||||
|
||||
@@ -88,9 +88,17 @@ void GcodeSuite::M701() {
|
||||
tool_change(target_extruder, false);
|
||||
#endif
|
||||
|
||||
// Lift Z axis
|
||||
if (park_point.z > 0)
|
||||
do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
|
||||
auto move_z_by = [](const_float_t zdist) {
|
||||
if (zdist) {
|
||||
destination = current_position;
|
||||
destination.z += zdist;
|
||||
prepare_internal_move_to_destination(NOZZLE_PARK_Z_FEEDRATE);
|
||||
}
|
||||
};
|
||||
|
||||
// Raise the Z axis (with max limit)
|
||||
const float park_raise = _MIN(0, park_point.z, (Z_MAX_POS) - current_position.z);
|
||||
move_z_by(park_raise);
|
||||
|
||||
// Load filament
|
||||
#if HAS_PRUSA_MMU2
|
||||
@@ -113,8 +121,7 @@ void GcodeSuite::M701() {
|
||||
#endif
|
||||
|
||||
// Restore Z axis
|
||||
if (park_point.z > 0)
|
||||
do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
|
||||
move_z_by(-park_raise);
|
||||
|
||||
#if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU)
|
||||
// Restore toolhead if it was changed
|
||||
|
||||
@@ -42,7 +42,7 @@ void GcodeSuite::M430() {
|
||||
#if ENABLED(POWER_MONITOR_CURRENT)
|
||||
if (parser.seen('I')) { power_monitor.set_current_display(parser.value_bool()); do_report = false; }
|
||||
#endif
|
||||
#if HAS_POWER_MONITOR_VREF
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
if (parser.seen('V')) { power_monitor.set_voltage_display(parser.value_bool()); do_report = false; }
|
||||
#endif
|
||||
#if HAS_POWER_MONITOR_WATTS
|
||||
@@ -53,11 +53,11 @@ void GcodeSuite::M430() {
|
||||
SERIAL_ECHOLNPAIR(
|
||||
#if ENABLED(POWER_MONITOR_CURRENT)
|
||||
"Current: ", power_monitor.getAmps(), "A"
|
||||
#if HAS_POWER_MONITOR_VREF
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
" "
|
||||
#endif
|
||||
#endif
|
||||
#if HAS_POWER_MONITOR_VREF
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
"Voltage: ", power_monitor.getVolts(), "V"
|
||||
#endif
|
||||
#if HAS_POWER_MONITOR_WATTS
|
||||
|
||||
@@ -289,8 +289,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
|
||||
}
|
||||
#endif
|
||||
|
||||
// Handle a known G, M, or T
|
||||
// Handle a known command or reply "unknown command"
|
||||
|
||||
switch (parser.command_letter) {
|
||||
|
||||
case 'G': switch (parser.codenum) {
|
||||
|
||||
case 0: case 1: // G0: Fast Move, G1: Linear Move
|
||||
@@ -977,6 +979,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
|
||||
case 1001: M1001(); break; // M1001: [INTERNAL] Handle SD completion
|
||||
#endif
|
||||
|
||||
#if ENABLED(DGUS_LCD_UI_MKS)
|
||||
case 1002: M1002(); break; // M1002: [INTERNAL] Tool-change and Relative E Move
|
||||
#endif
|
||||
|
||||
#if ENABLED(MAX7219_GCODE)
|
||||
case 7219: M7219(); break; // M7219: Set LEDs, columns, and rows
|
||||
#endif
|
||||
@@ -991,6 +997,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
|
||||
case 'D': D(parser.codenum); break; // Dn: Debug codes
|
||||
#endif
|
||||
|
||||
#if ENABLED(REALTIME_REPORTING_COMMANDS)
|
||||
case 'S': case 'P': case 'R': break; // Invalid S, P, R commands already filtered
|
||||
#endif
|
||||
|
||||
default:
|
||||
#if ENABLED(WIFI_CUSTOM_COMMAND)
|
||||
if (wifi_custom_command(parser.command_ptr)) break;
|
||||
@@ -1083,12 +1093,15 @@ void GcodeSuite::process_subcommands_now(char * gcode) {
|
||||
case IN_HANDLER:
|
||||
case IN_PROCESS:
|
||||
SERIAL_ECHO_MSG(STR_BUSY_PROCESSING);
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, report_current_position_moving());
|
||||
break;
|
||||
case PAUSED_FOR_USER:
|
||||
SERIAL_ECHO_MSG(STR_BUSY_PAUSED_FOR_USER);
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_HOLD));
|
||||
break;
|
||||
case PAUSED_FOR_INPUT:
|
||||
SERIAL_ECHO_MSG(STR_BUSY_PAUSED_FOR_INPUT);
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_HOLD));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -1069,6 +1069,10 @@ private:
|
||||
static void M1001();
|
||||
#endif
|
||||
|
||||
#if ENABLED(DGUS_LCD_UI_MKS)
|
||||
static void M1002();
|
||||
#endif
|
||||
|
||||
#if ENABLED(MAX7219_GCODE)
|
||||
static void M7219();
|
||||
#endif
|
||||
|
||||
@@ -176,6 +176,8 @@
|
||||
const xyze_float_t diff = from_steppers - leveled;
|
||||
SERIAL_ECHOPGM("Diff: ");
|
||||
report_xyze(diff);
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, report_current_grblstate_moving());
|
||||
}
|
||||
|
||||
#endif // M114_DETAIL
|
||||
@@ -211,4 +213,6 @@ void GcodeSuite::M114() {
|
||||
|
||||
TERN_(M114_LEGACY, planner.synchronize());
|
||||
report_current_position_projected();
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, report_current_grblstate_moving());
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@ void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) {
|
||||
| (parser.seen('Z') ? _BV(Z_AXIS) : 0) )
|
||||
#endif
|
||||
) {
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_RUNNING));
|
||||
|
||||
#ifdef G0_FEEDRATE
|
||||
feedRate_t old_feedrate;
|
||||
@@ -116,6 +117,9 @@ void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) {
|
||||
planner.synchronize();
|
||||
SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP);
|
||||
}
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE));
|
||||
#else
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, report_current_grblstate_moving());
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -306,6 +306,8 @@ void plan_arc(
|
||||
void GcodeSuite::G2_G3(const bool clockwise) {
|
||||
if (MOTION_CONDITIONS) {
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_RUNNING));
|
||||
|
||||
#if ENABLED(SF_ARC_FIX)
|
||||
const bool relative_mode_backup = relative_mode;
|
||||
relative_mode = true;
|
||||
@@ -364,6 +366,8 @@ void GcodeSuite::G2_G3(const bool clockwise) {
|
||||
}
|
||||
else
|
||||
SERIAL_ERROR_MSG(STR_ERR_ARC_ARGS);
|
||||
|
||||
TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -106,8 +106,10 @@ void GCodeParser::reset() {
|
||||
|
||||
#endif
|
||||
|
||||
// Populate all fields by parsing a single line of GCode
|
||||
// 58 bytes of SRAM are used to speed up seen/value
|
||||
/**
|
||||
* Populate the command line state (command_letter, codenum, subcode, and string_arg)
|
||||
* by parsing a single line of GCode. 58 bytes of SRAM are used to speed up seen/value.
|
||||
*/
|
||||
void GCodeParser::parse(char *p) {
|
||||
|
||||
reset(); // No codes to report
|
||||
@@ -147,10 +149,12 @@ void GCodeParser::parse(char *p) {
|
||||
#define SIGNED_CODENUM 1
|
||||
#endif
|
||||
|
||||
// Bail if the letter is not G, M, or T
|
||||
// (or a valid parameter for the current motion mode)
|
||||
/**
|
||||
* Screen for good command letters. G, M, and T are always accepted.
|
||||
* With Motion Modes enabled any axis letter can come first.
|
||||
* With Realtime Reporting, commands S000, P000, and R000 are allowed.
|
||||
*/
|
||||
switch (letter) {
|
||||
|
||||
case 'G': case 'M': case 'T': TERN_(MARLIN_DEV_MODE, case 'D':)
|
||||
// Skip spaces to get the numeric part
|
||||
while (*p == ' ') p++;
|
||||
@@ -213,10 +217,10 @@ void GCodeParser::parse(char *p) {
|
||||
|
||||
#if ENABLED(GCODE_MOTION_MODES)
|
||||
#if ENABLED(ARC_SUPPORT)
|
||||
case 'I' ... 'J': case 'R':
|
||||
case 'I' ... 'J':
|
||||
if (motion_mode_codenum != 2 && motion_mode_codenum != 3) return;
|
||||
#endif
|
||||
case 'P' ... 'Q':
|
||||
case 'Q':
|
||||
if (motion_mode_codenum != 5) return;
|
||||
case 'X' ... 'Z': case 'E' ... 'F':
|
||||
if (motion_mode_codenum < 0) return;
|
||||
@@ -225,7 +229,24 @@ void GCodeParser::parse(char *p) {
|
||||
TERN_(USE_GCODE_SUBCODES, subcode = motion_mode_subcode);
|
||||
p--; // Back up one character to use the current parameter
|
||||
break;
|
||||
#endif // GCODE_MOTION_MODES
|
||||
#endif
|
||||
|
||||
#if ENABLED(REALTIME_REPORTING_COMMANDS)
|
||||
case 'P': case 'R': {
|
||||
if (letter == 'R') {
|
||||
#if ENABLED(GCODE_MOTION_MODES)
|
||||
if (ENABLED(ARC_SUPPORT) && !WITHIN(motion_mode_codenum, 2, 3)) return;
|
||||
#endif
|
||||
}
|
||||
else if (TERN0(GCODE_MOTION_MODES, motion_mode_codenum != 5)) return;
|
||||
} // fall-thru
|
||||
case 'S': {
|
||||
codenum = 0; // The only valid codenum is 0
|
||||
uint8_t digits = 0;
|
||||
while (*p++ == '0') digits++; // Count up '0' characters
|
||||
command_letter = (digits == 3) ? letter : '?'; // Three '0' digits is a good command
|
||||
} return; // No parameters needed, so return now
|
||||
#endif
|
||||
|
||||
default: return;
|
||||
}
|
||||
@@ -307,7 +328,7 @@ void GCodeParser::parse(char *p) {
|
||||
|
||||
#if ENABLED(DEBUG_GCODE_PARSER)
|
||||
if (debug) {
|
||||
SERIAL_ECHOPAIR("Got param ", param, " at index ", p - command_ptr - 1);
|
||||
SERIAL_ECHOPAIR("Got param ", AS_CHAR(param), " at index ", p - command_ptr - 1);
|
||||
if (has_val) SERIAL_ECHOPGM(" (has_val)");
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -245,7 +245,7 @@
|
||||
#define _CUTTER_POWER_PERCENT 2
|
||||
#define _CUTTER_POWER_RPM 3
|
||||
#define _CUTTER_POWER(V) _CAT(_CUTTER_POWER_, V)
|
||||
#define CUTTER_UNIT_IS(V) (_CUTTER_POWER(CUTTER_POWER_UNIT) == _CUTTER_POWER(V))
|
||||
#define CUTTER_UNIT_IS(V) (_CUTTER_POWER(CUTTER_POWER_UNIT) == _CUTTER_POWER(V))
|
||||
#endif
|
||||
|
||||
// Add features that need hardware PWM here
|
||||
@@ -498,12 +498,9 @@
|
||||
// Power Monitor sensors
|
||||
#if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE)
|
||||
#define HAS_POWER_MONITOR 1
|
||||
#endif
|
||||
#if ENABLED(POWER_MONITOR_CURRENT) && defined(POWER_MONITOR_FIXED_VOLTAGE)
|
||||
#define HAS_POWER_MONITOR_VREF 1
|
||||
#endif
|
||||
#if BOTH(HAS_POWER_MONITOR_VREF, POWER_MONITOR_CURRENT)
|
||||
#define HAS_POWER_MONITOR_WATTS 1
|
||||
#if ENABLED(POWER_MONITOR_CURRENT) && (ENABLED(POWER_MONITOR_VOLTAGE) || defined(POWER_MONITOR_FIXED_VOLTAGE))
|
||||
#define HAS_POWER_MONITOR_WATTS 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Flag if an EEPROM type is pre-selected
|
||||
|
||||
@@ -356,6 +356,15 @@
|
||||
#define SD_DETECT_STATE LOW
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if DISABLED(USB_FLASH_DRIVE_SUPPORT) || BOTH(MULTI_VOLUME, VOLUME_SD_ONBOARD)
|
||||
#if ENABLED(SDIO_SUPPORT)
|
||||
#define NEED_SD2CARD_SDIO 1
|
||||
#else
|
||||
#define NEED_SD2CARD_SPI 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#if ANY(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, HAS_FSMC_GRAPHICAL_TFT, HAS_SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT)
|
||||
|
||||
@@ -60,18 +60,23 @@
|
||||
#undef TEST4
|
||||
|
||||
/**
|
||||
* We try our best to include sanity checks for all changed configuration
|
||||
* directives because users have a tendency to use outdated config files with
|
||||
* the bleeding-edge source code, but sometimes this is not enough. This check
|
||||
* forces a minimum config file revision. Otherwise Marlin will not build.
|
||||
* This is to alert you about non-matching versions of config files.
|
||||
*
|
||||
* You can edit the version tag in your old config files and try the build again.
|
||||
* The checks below will alert you about options that need to be changed, but they won't
|
||||
* tell you about new options that you might find useful. So it's recommended to transfer
|
||||
* your settings to new Configuration files matching your Marlin version as soon as possible.
|
||||
*/
|
||||
#define HEXIFY(H) _CAT(0x,H)
|
||||
#if !defined(CONFIGURATION_H_VERSION) || HEXIFY(CONFIGURATION_H_VERSION) < HEXIFY(REQUIRED_CONFIGURATION_H_VERSION)
|
||||
#error "You are using an old Configuration.h file, update it before building Marlin."
|
||||
#error "Your Configuration.h file is for an old version of Marlin. Downgrade Marlin or upgrade your Configuration.h."
|
||||
#elif HEXIFY(CONFIGURATION_H_VERSION) > HEXIFY(REQUIRED_CONFIGURATION_H_VERSION)
|
||||
#error "Your Configuration.h file is for a newer version of Marlin. Upgrade Marlin or downgrade your Configuration.h."
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIGURATION_ADV_H_VERSION) || HEXIFY(CONFIGURATION_ADV_H_VERSION) < HEXIFY(REQUIRED_CONFIGURATION_ADV_H_VERSION)
|
||||
#error "You are using an old Configuration_adv.h file, update it before building Marlin."
|
||||
#error "Your Configuration_adv.h file is for an old version of Marlin. Downgrade Marlin or upgrade your Configuration_adv.h."
|
||||
#elif HEXIFY(CONFIGURATION_ADV_H_VERSION) > HEXIFY(REQUIRED_CONFIGURATION_ADV_H_VERSION)
|
||||
#error "Your Configuration_adv.h file is for a newer version of Marlin. Upgrade Marlin or downgrade your Configuration_adv.h."
|
||||
#endif
|
||||
#undef HEXIFY
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
* version was tagged.
|
||||
*/
|
||||
#ifndef STRING_DISTRIBUTION_DATE
|
||||
#define STRING_DISTRIBUTION_DATE "2021-04-07"
|
||||
#define STRING_DISTRIBUTION_DATE "2021-04-18"
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
@@ -684,12 +684,15 @@ void MarlinUI::draw_status_message(const bool blink) {
|
||||
|
||||
// If the remaining string doesn't completely fill the screen
|
||||
if (rlen < LCD_WIDTH) {
|
||||
lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot
|
||||
uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters
|
||||
if (--chars) { // Draw a second dot if there's space
|
||||
lcd_put_wchar('.');
|
||||
if (--chars)
|
||||
lcd_put_u8str_max(status_message, chars); // Print a second copy of the message
|
||||
lcd_put_wchar(' '); // Always at 1+ spaces left, draw a space
|
||||
if (--chars) { // Draw a second space if there's room
|
||||
lcd_put_wchar(' ');
|
||||
if (--chars) { // Draw a third space if there's room
|
||||
lcd_put_wchar(' ');
|
||||
if (--chars)
|
||||
lcd_put_u8str_max(status_message, chars); // Print a second copy of the message
|
||||
}
|
||||
}
|
||||
}
|
||||
if (last_blink != blink) {
|
||||
@@ -944,7 +947,7 @@ void MarlinUI::draw_status_screen() {
|
||||
#if ENABLED(ADAPTIVE_FAN_SLOWING)
|
||||
else { c = '*'; spd = thermalManager.scaledFanSpeed(0, spd); }
|
||||
#endif
|
||||
per = thermalManager.fanPercent(spd);
|
||||
per = thermalManager.pwmToPercent(spd);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
|
||||
@@ -581,12 +581,15 @@ void MarlinUI::draw_status_message(const bool blink) {
|
||||
|
||||
// If the remaining string doesn't completely fill the screen
|
||||
if (rlen < LCD_WIDTH) {
|
||||
lcd.write('.'); // Always at 1+ spaces left, draw a dot
|
||||
uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters
|
||||
if (--chars) { // Draw a second dot if there's space
|
||||
lcd.write('.');
|
||||
if (--chars)
|
||||
lcd_put_u8str_max(status_message, chars); // Print a second copy of the message
|
||||
lcd.write(' '); // Always at 1+ spaces left, draw a space
|
||||
if (--chars) { // Draw a second space if there's room
|
||||
lcd.write(' ');
|
||||
if (--chars) { // Draw a third space if there's room
|
||||
lcd.write(' ');
|
||||
if (--chars)
|
||||
lcd_put_u8str_max(status_message, chars); // Print a second copy of the message
|
||||
}
|
||||
}
|
||||
}
|
||||
if (last_blink != blink) {
|
||||
@@ -668,9 +671,9 @@ void MarlinUI::draw_status_screen() {
|
||||
//
|
||||
|
||||
lcd.setCursor(0, 0);
|
||||
_draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); lcd.write(' ');
|
||||
_draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); lcd.write(' ');
|
||||
_draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink);
|
||||
_draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position.x)), blink); lcd.write(' ');
|
||||
_draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position.y)), blink); lcd.write(' ');
|
||||
_draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position.z)), blink);
|
||||
|
||||
#if HAS_LEVELING && !HAS_HEATED_BED
|
||||
lcd.write(planner.leveling_active || blink ? '_' : ' ');
|
||||
@@ -750,7 +753,7 @@ void MarlinUI::draw_status_screen() {
|
||||
#if HOTENDS > 2
|
||||
_draw_heater_status(H_E2, "HE3", blink); // Hotend 3 Temperature
|
||||
#endif
|
||||
#endif // HOTENDS <= 1
|
||||
#endif
|
||||
|
||||
#if HAS_HEATED_BED
|
||||
#if HAS_LEVELING
|
||||
@@ -758,16 +761,15 @@ void MarlinUI::draw_status_screen() {
|
||||
#else
|
||||
_draw_heater_status(H_BED, "BED", blink);
|
||||
#endif
|
||||
#endif // HAS_HEATED_BED
|
||||
#endif
|
||||
|
||||
#if HAS_FAN
|
||||
uint16_t spd = thermalManager.fan_speed[0];
|
||||
|
||||
#if ENABLED(ADAPTIVE_FAN_SLOWING)
|
||||
if (!blink) spd = thermalManager.scaledFanSpeed(0, spd);
|
||||
#endif
|
||||
uint16_t per = thermalManager.pwmToPercent(spd);
|
||||
|
||||
uint16_t per = thermalManager.fanPercent(spd);
|
||||
#if HOTENDS < 2
|
||||
#define FANX 11
|
||||
#else
|
||||
|
||||
@@ -30,12 +30,15 @@ extern u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_hw_spi;
|
||||
|
||||
class U8GLIB_64128N_2X_HAL : public U8GLIB {
|
||||
public:
|
||||
U8GLIB_64128N_2X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE)
|
||||
: U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset)
|
||||
{ }
|
||||
U8GLIB_64128N_2X_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE)
|
||||
: U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset)
|
||||
{ }
|
||||
U8GLIB_64128N_2X_HAL() : U8GLIB() { }
|
||||
U8GLIB_64128N_2X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { init(sck, mosi, cs, a0, reset); }
|
||||
U8GLIB_64128N_2X_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { init(cs, a0, reset); }
|
||||
void init(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) {
|
||||
U8GLIB::init(&u8g_dev_st7565_64128n_HAL_2x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset);
|
||||
}
|
||||
void init(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) {
|
||||
U8GLIB::init(&u8g_dev_st7565_64128n_HAL_2x_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset);
|
||||
}
|
||||
};
|
||||
|
||||
extern u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi;
|
||||
@@ -43,12 +46,15 @@ extern u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi;
|
||||
|
||||
class U8GLIB_ST7920_128X64_4X_HAL : public U8GLIB {
|
||||
public:
|
||||
U8GLIB_ST7920_128X64_4X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE)
|
||||
: U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE
|
||||
{ }
|
||||
U8GLIB_ST7920_128X64_4X_HAL(pin_t cs, pin_t reset = U8G_PIN_NONE)
|
||||
: U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_hw_spi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE
|
||||
{ }
|
||||
U8GLIB_ST7920_128X64_4X_HAL() : U8GLIB() { }
|
||||
U8GLIB_ST7920_128X64_4X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) { init(sck, mosi, cs, reset); }
|
||||
U8GLIB_ST7920_128X64_4X_HAL(pin_t cs, pin_t reset = U8G_PIN_NONE) { init(cs, reset); }
|
||||
void init(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) {
|
||||
U8GLIB::init(&u8g_dev_st7920_128x64_HAL_4x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset); // a0 = U8G_PIN_NONE
|
||||
}
|
||||
void init(pin_t cs, pin_t reset = U8G_PIN_NONE) {
|
||||
U8GLIB::init(&u8g_dev_st7920_128x64_HAL_4x_hw_spi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset); // a0 = U8G_PIN_NONE
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
@@ -59,27 +65,29 @@ extern u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi;
|
||||
|
||||
class U8GLIB_ST7920_128X64_RRD : public U8GLIB {
|
||||
public:
|
||||
U8GLIB_ST7920_128X64_RRD(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE)
|
||||
: U8GLIB(&u8g_dev_st7920_128x64_rrd_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE
|
||||
{ }
|
||||
U8GLIB_ST7920_128X64_RRD() : U8GLIB() { }
|
||||
U8GLIB_ST7920_128X64_RRD(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) { init(sck, mosi, cs, reset); }
|
||||
void init(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) {
|
||||
U8GLIB::init(&u8g_dev_st7920_128x64_rrd_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset); // a0 = U8G_PIN_NONE
|
||||
}
|
||||
};
|
||||
|
||||
extern u8g_dev_t u8g_dev_sh1106_128x64_2x_i2c_2_wire;
|
||||
|
||||
class U8GLIB_SH1106_128X64_2X_I2C_2_WIRE : public U8GLIB {
|
||||
public:
|
||||
U8GLIB_SH1106_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE)
|
||||
: U8GLIB(&u8g_dev_sh1106_128x64_2x_i2c_2_wire, options)
|
||||
{ }
|
||||
U8GLIB_SH1106_128X64_2X_I2C_2_WIRE() : U8GLIB() { }
|
||||
U8GLIB_SH1106_128X64_2X_I2C_2_WIRE(uint8_t options) { init(options); }
|
||||
void init(uint8_t options = U8G_I2C_OPT_NONE) { U8GLIB::init(&u8g_dev_sh1106_128x64_2x_i2c_2_wire, options); }
|
||||
};
|
||||
|
||||
extern u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire;
|
||||
|
||||
class U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE : public U8GLIB {
|
||||
public:
|
||||
U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE)
|
||||
: U8GLIB(&u8g_dev_ssd1306_128x64_2x_i2c_2_wire, options)
|
||||
{ }
|
||||
U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE() : U8GLIB() { }
|
||||
U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE(uint8_t options) { init(options); }
|
||||
void init(uint8_t options = U8G_I2C_OPT_NONE) { U8GLIB::init(&u8g_dev_ssd1306_128x64_2x_i2c_2_wire, options); }
|
||||
};
|
||||
|
||||
//
|
||||
@@ -90,9 +98,9 @@ extern u8g_dev_t u8g_dev_tft_320x240_upscale_from_128x64;
|
||||
|
||||
class U8GLIB_TFT_320X240_UPSCALE_FROM_128X64 : public U8GLIB {
|
||||
public:
|
||||
U8GLIB_TFT_320X240_UPSCALE_FROM_128X64(uint8_t cs, uint8_t rs, uint8_t reset = U8G_PIN_NONE)
|
||||
: U8GLIB(&u8g_dev_tft_320x240_upscale_from_128x64, cs, rs, reset)
|
||||
{ }
|
||||
U8GLIB_TFT_320X240_UPSCALE_FROM_128X64() : U8GLIB() { }
|
||||
U8GLIB_TFT_320X240_UPSCALE_FROM_128X64(uint8_t cs, uint8_t rs, uint8_t reset = U8G_PIN_NONE) { init(cs, rs, reset); }
|
||||
void init(uint8_t cs, uint8_t rs, uint8_t reset = U8G_PIN_NONE) { U8GLIB::init(&u8g_dev_tft_320x240_upscale_from_128x64, cs, rs, reset); }
|
||||
};
|
||||
|
||||
|
||||
@@ -100,12 +108,15 @@ extern u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, u8g_dev_uc1701_mini1286
|
||||
|
||||
class U8GLIB_MINI12864_2X_HAL : public U8GLIB {
|
||||
public:
|
||||
U8GLIB_MINI12864_2X_HAL(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||
: U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, sck, mosi, cs, a0, reset)
|
||||
{ }
|
||||
U8GLIB_MINI12864_2X_HAL(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||
: U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_hw_spi, cs, a0, reset)
|
||||
{ }
|
||||
U8GLIB_MINI12864_2X_HAL() : U8GLIB() { }
|
||||
U8GLIB_MINI12864_2X_HAL(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) { init(sck, mosi, cs, a0, reset); }
|
||||
U8GLIB_MINI12864_2X_HAL(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) { init(cs, a0, reset); }
|
||||
void init(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) {
|
||||
U8GLIB::init(&u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, sck, mosi, cs, a0, reset);
|
||||
}
|
||||
void init(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) {
|
||||
U8GLIB::init(&u8g_dev_uc1701_mini12864_HAL_2x_hw_spi, cs, a0, reset);
|
||||
}
|
||||
};
|
||||
|
||||
extern u8g_dev_t u8g_dev_ssd1309_sw_spi;
|
||||
@@ -113,10 +124,13 @@ extern u8g_dev_t u8g_dev_ssd1309_hw_spi;
|
||||
|
||||
class U8GLIB_SSD1309_128X64_HAL : public U8GLIB {
|
||||
public:
|
||||
U8GLIB_SSD1309_128X64_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE)
|
||||
: U8GLIB(&u8g_dev_ssd1309_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset)
|
||||
{ }
|
||||
U8GLIB_SSD1309_128X64_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE)
|
||||
: U8GLIB(&u8g_dev_ssd1309_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset)
|
||||
{ }
|
||||
U8GLIB_SSD1309_128X64_HAL() : U8GLIB() { }
|
||||
U8GLIB_SSD1309_128X64_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { init(sck, mosi, cs, a0, reset); }
|
||||
U8GLIB_SSD1309_128X64_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { init(cs, a0, reset); }
|
||||
void init(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) {
|
||||
U8GLIB::init(&u8g_dev_ssd1309_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset);
|
||||
}
|
||||
void init(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) {
|
||||
U8GLIB::init(&u8g_dev_ssd1309_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -547,7 +547,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef STATUS_COOLER_TEXT_X
|
||||
#define STATUS_COOLER_TEXT_X (STATUS_COOLER_X + 8)
|
||||
#define STATUS_COOLER_TEXT_X (STATUS_COOLER_X + 12)
|
||||
#endif
|
||||
|
||||
static_assert(
|
||||
@@ -583,7 +583,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef STATUS_FLOWMETER_TEXT_X
|
||||
#define STATUS_FLOWMETER_TEXT_X (STATUS_FLOWMETER_X + 8)
|
||||
#define STATUS_FLOWMETER_TEXT_X (STATUS_FLOWMETER_X + 12)
|
||||
#endif
|
||||
|
||||
static_assert(
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
#define FONT_STATUSMENU_NAME MENU_FONT_NAME
|
||||
#endif
|
||||
|
||||
U8G_CLASS u8g(U8G_PARAM);
|
||||
U8G_CLASS u8g;
|
||||
|
||||
#include LANGUAGE_DATA_INCL(LCD_LANGUAGE)
|
||||
|
||||
@@ -252,6 +252,13 @@ bool MarlinUI::detected() { return true; }
|
||||
|
||||
// Initialize or re-initialize the LCD
|
||||
void MarlinUI::init_lcd() {
|
||||
|
||||
static bool did_init_u8g = false;
|
||||
if (!did_init_u8g) {
|
||||
u8g.init(U8G_PARAM);
|
||||
did_init_u8g = true;
|
||||
}
|
||||
|
||||
#if PIN_EXISTS(LCD_BACKLIGHT)
|
||||
OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away
|
||||
#endif
|
||||
|
||||
@@ -25,90 +25,95 @@
|
||||
// lcd/dogm/status/cooler.h - Status Screen Laser Cooler bitmaps
|
||||
//
|
||||
#if HAS_COOLER
|
||||
#define STATUS_COOLER_WIDTH 16
|
||||
|
||||
#define STATUS_COOLER_WIDTH 22
|
||||
|
||||
const unsigned char status_cooler_bmp2[] PROGMEM = {
|
||||
B00010000,B00001000,
|
||||
B00010010,B01001001,
|
||||
B01010100,B00101010,
|
||||
B00111000,B00011100,
|
||||
B11111110,B11111111,
|
||||
B00111000,B00011100,
|
||||
B01010100,B00101010,
|
||||
B10010000,B10001001,
|
||||
B00010000,B10000000,
|
||||
B00000100,B10010000,
|
||||
B00000010,B10100000,
|
||||
B00000001,B11000000,
|
||||
B00011111,B11111100,
|
||||
B00000001,B11000000,
|
||||
B00000010,B10100000,
|
||||
B00000100,B10010000
|
||||
B00000100,B00000010,B00000000,
|
||||
B00000100,B10010010,B01000000,
|
||||
B00010101,B00001010,B10000000,
|
||||
B00001110,B00000111,B00000000,
|
||||
B00111111,B10111111,B11000000,
|
||||
B00001110,B00000111,B00000000,
|
||||
B00010101,B00001010,B10000000,
|
||||
B00100100,B00100010,B01000000,
|
||||
B00000100,B00100000,B00000000,
|
||||
B00000001,B00100100,B00000000,
|
||||
B00000000,B10101000,B00000000,
|
||||
B00000000,B01110000,B00000000,
|
||||
B00000111,B11111111,B00000000,
|
||||
B00000000,B01110000,B00000000,
|
||||
B00000000,B10101000,B00000000,
|
||||
B00000001,B00100100,B00000000
|
||||
};
|
||||
const unsigned char status_cooler_bmp1[] PROGMEM = {
|
||||
B00010000,B00001000,
|
||||
B00010010,B01001001,
|
||||
B01010100,B00101010,
|
||||
B00101000,B00010100,
|
||||
B11000111,B01100011,
|
||||
B00101000,B00010100,
|
||||
B01010100,B00101010,
|
||||
B10010000,B10001001,
|
||||
B00010000,B10000000,
|
||||
B00000100,B10010000,
|
||||
B00000010,B10100000,
|
||||
B00000001,B01000000,
|
||||
B00011110,B00111100,
|
||||
B00000001,B01000000,
|
||||
B00000010,B10100000,
|
||||
B00000100,B10010000
|
||||
B00000100,B00000010,B00000000,
|
||||
B00000100,B10010010,B01000000,
|
||||
B00010101,B00001010,B10000000,
|
||||
B00001010,B00000101,B00000000,
|
||||
B00110001,B11011000,B11000000,
|
||||
B00001010,B00000101,B00000000,
|
||||
B00010101,B00001010,B10000000,
|
||||
B00100100,B00100010,B01000000,
|
||||
B00000100,B00100000,B00000000,
|
||||
B00000001,B00100100,B00000000,
|
||||
B00000000,B10101000,B00000000,
|
||||
B00000000,B01010000,B00000000,
|
||||
B00000111,B10001111,B00000000,
|
||||
B00000000,B01010000,B00000000,
|
||||
B00000000,B10101000,B00000000,
|
||||
B00000001,B00100100,B00000000
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#if ENABLED(LASER_COOLANT_FLOW_METER)
|
||||
|
||||
#define STATUS_FLOWMETER_WIDTH 24
|
||||
|
||||
const unsigned char status_flowmeter_bmp2[] PROGMEM = {
|
||||
B00000001,B11111000,B00000000,
|
||||
B00000110,B00000110,B00000000,
|
||||
B00001000,B01100001,B00000000,
|
||||
B00010000,B01100000,B10000000,
|
||||
B00100000,B01100000,B01000000,
|
||||
B00100000,B01100000,B01000000,
|
||||
B01000000,B01100000,B00100000,
|
||||
B01000000,B01100000,B00100000,
|
||||
B01011111,B11111111,B10100000,
|
||||
B01011111,B11111111,B10100000,
|
||||
B01000000,B01100000,B00100000,
|
||||
B01000000,B01100000,B00100000,
|
||||
B00100000,B01100000,B01000000,
|
||||
B00100000,B01100000,B01000000,
|
||||
B00010000,B01100000,B10000000,
|
||||
B00001000,B01100001,B00000000,
|
||||
B00000110,B00000110,B00000000,
|
||||
B00000001,B11111000,B00000000,
|
||||
B00000000,B01100000,B00000000,
|
||||
B00011111,B11111111,B10000000
|
||||
B00000000,B01111110,B00000000,
|
||||
B00000001,B10000001,B10000000,
|
||||
B00000010,B00011000,B01000000,
|
||||
B00000100,B00011000,B00100000,
|
||||
B00001000,B00011000,B00010000,
|
||||
B00001000,B00011000,B00010000,
|
||||
B00010000,B00011000,B00001000,
|
||||
B00010000,B00011000,B00001000,
|
||||
B00010111,B11111111,B11101000,
|
||||
B00010111,B11111111,B11101000,
|
||||
B00010000,B00011000,B00001000,
|
||||
B00010000,B00011000,B00001000,
|
||||
B00001000,B00011000,B00010000,
|
||||
B00001000,B00011000,B00010000,
|
||||
B00000100,B00011000,B00100000,
|
||||
B00000010,B00011000,B01000000,
|
||||
B00000001,B10000001,B10000000,
|
||||
B00000000,B01111110,B00000000,
|
||||
B00000000,B00011000,B00000000,
|
||||
B00000111,B11111111,B11100000
|
||||
};
|
||||
const unsigned char status_flowmeter_bmp1[] PROGMEM = {
|
||||
B00000001,B11111000,B00000000,
|
||||
B00000110,B00000110,B00000000,
|
||||
B00001000,B00000001,B00000000,
|
||||
B00010100,B00000010,B10000000,
|
||||
B00101110,B00000111,B01000000,
|
||||
B00100111,B00001110,B01000000,
|
||||
B01000011,B10011100,B00100000,
|
||||
B01000001,B11111000,B00100000,
|
||||
B01000000,B11110000,B00100000,
|
||||
B01000000,B11110000,B00100000,
|
||||
B01000001,B11111000,B00100000,
|
||||
B01000011,B10011100,B00100000,
|
||||
B00100111,B00001110,B01000000,
|
||||
B00101110,B00000111,B01000000,
|
||||
B00010100,B00000010,B10000000,
|
||||
B00001000,B00000001,B00000000,
|
||||
B00000110,B00000110,B00000000,
|
||||
B00000001,B11111000,B00000000,
|
||||
B00000000,B01100000,B00000000,
|
||||
B00011111,B11111111,B10000000
|
||||
B00000000,B01111110,B00000000,
|
||||
B00000001,B10000001,B10000000,
|
||||
B00000010,B00000000,B01000000,
|
||||
B00000101,B00000000,B10100000,
|
||||
B00001011,B10000001,B11010000,
|
||||
B00001001,B11000011,B10010000,
|
||||
B00010000,B11100111,B00001000,
|
||||
B00010000,B01111110,B00001000,
|
||||
B00010000,B00111100,B00001000,
|
||||
B00010000,B00111100,B00001000,
|
||||
B00010000,B01111110,B00001000,
|
||||
B00010000,B11100111,B00001000,
|
||||
B00001001,B11000011,B10010000,
|
||||
B00001011,B10000001,B11010000,
|
||||
B00000101,B00000000,B10100000,
|
||||
B00000010,B00000000,B01000000,
|
||||
B00000001,B10000001,B10000000,
|
||||
B00000000,B01111110,B00000000,
|
||||
B00000000,B00011000,B00000000,
|
||||
B00000111,B11111111,B11100000
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
#if ENABLED(POWER_MONITOR_CURRENT)
|
||||
const bool iflag = power_monitor.current_display_enabled();
|
||||
#endif
|
||||
#if HAS_POWER_MONITOR_VREF
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
const bool vflag = power_monitor.voltage_display_enabled();
|
||||
#endif
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
}
|
||||
#elif ENABLED(POWER_MONITOR_CURRENT)
|
||||
power_monitor.display_item = 0;
|
||||
#elif HAS_POWER_MONITOR_VREF
|
||||
#elif ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
power_monitor.display_item = 1;
|
||||
#endif
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
#if ENABLED(POWER_MONITOR_CURRENT)
|
||||
if (power_monitor.display_item == 0 && !iflag) ++power_monitor.display_item;
|
||||
#endif
|
||||
#if HAS_POWER_MONITOR_VREF
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE)
|
||||
if (power_monitor.display_item == 1 && !vflag) ++power_monitor.display_item;
|
||||
#endif
|
||||
#if HAS_POWER_MONITOR_WATTS
|
||||
@@ -170,7 +170,7 @@
|
||||
#if ENABLED(POWER_MONITOR_CURRENT) // Current
|
||||
case 0: if (iflag) power_monitor.draw_current(); break;
|
||||
#endif
|
||||
#if HAS_POWER_MONITOR_VREF // Voltage
|
||||
#if ENABLED(POWER_MONITOR_VOLTAGE) // Voltage
|
||||
case 1: if (vflag) power_monitor.draw_voltage(); break;
|
||||
#endif
|
||||
#if HAS_POWER_MONITOR_WATTS // Power
|
||||
@@ -696,7 +696,7 @@ void MarlinUI::draw_status_screen() {
|
||||
c = '*';
|
||||
}
|
||||
#endif
|
||||
lcd_put_u8str(STATUS_FAN_TEXT_X, STATUS_FAN_TEXT_Y, i16tostr3rj(thermalManager.fanPercent(spd)));
|
||||
lcd_put_u8str(STATUS_FAN_TEXT_X, STATUS_FAN_TEXT_Y, i16tostr3rj(thermalManager.pwmToPercent(spd)));
|
||||
lcd_put_wchar(c);
|
||||
}
|
||||
}
|
||||
@@ -835,13 +835,17 @@ void MarlinUI::draw_status_screen() {
|
||||
mix_label = PSTR("Mx");
|
||||
}
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wformat-overflow"
|
||||
#if GCC_VERSION <= 50000
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wformat-overflow"
|
||||
#endif
|
||||
|
||||
sprintf_P(mixer_messages, PSTR(S_FMT " %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1]));
|
||||
lcd_put_u8str(X_LABEL_POS, XYZ_BASELINE, mixer_messages);
|
||||
|
||||
#pragma GCC diagnostic pop
|
||||
#if GCC_VERSION <= 50000
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
@@ -955,13 +959,16 @@ void MarlinUI::draw_status_message(const bool blink) {
|
||||
|
||||
// If the remaining string doesn't completely fill the screen
|
||||
if (rlen < lcd_width) {
|
||||
lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot
|
||||
uint8_t chars = lcd_width - rlen; // Amount of space left in characters
|
||||
if (--chars) { // Draw a second dot if there's space
|
||||
lcd_put_wchar('.');
|
||||
if (--chars) { // Print a second copy of the message
|
||||
lcd_put_u8str_max(status_message, pixel_width - (rlen + 2) * (MENU_FONT_WIDTH));
|
||||
lcd_put_wchar(' '); // Always at 1+ spaces left, draw a space
|
||||
if (--chars) { // Draw a second space if there's room
|
||||
lcd_put_wchar(' ');
|
||||
if (--chars) { // Draw a third space if there's room
|
||||
lcd_put_wchar(' ');
|
||||
if (--chars) { // Print a second copy of the message
|
||||
lcd_put_u8str_max(status_message, pixel_width - (rlen + 2) * (MENU_FONT_WIDTH));
|
||||
lcd_put_wchar(' ');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -642,11 +642,14 @@ void ST7920_Lite_Status_Screen::draw_status_message() {
|
||||
|
||||
// If the remaining string doesn't completely fill the screen
|
||||
if (rlen < TEXT_MODE_LCD_WIDTH) {
|
||||
write_byte('.'); // Always at 1+ spaces left, draw a dot
|
||||
uint8_t chars = TEXT_MODE_LCD_WIDTH - rlen; // Amount of space left in characters
|
||||
if (--chars) { // Draw a second dot if there's space
|
||||
write_byte('.');
|
||||
if (--chars) write_str(str, chars); // Print a second copy of the message
|
||||
uint8_t chars = TEXT_MODE_LCD_WIDTH - rlen; // Amount of space left in characters
|
||||
write_byte(' '); // Always at 1+ spaces left, draw a space
|
||||
if (--chars) { // Draw a second space if there's room
|
||||
write_byte(' ');
|
||||
if (--chars) { // Draw a third space if there's room
|
||||
write_byte(' ');
|
||||
if (--chars) write_str(str, chars); // Print a second copy of the message
|
||||
}
|
||||
}
|
||||
}
|
||||
ui.advance_status_scroll();
|
||||
@@ -733,14 +736,12 @@ void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) {
|
||||
TERN_(HAS_MULTI_HOTEND, draw_extruder_2_temp(extruder_2_temp, extruder_2_target, forceUpdate));
|
||||
TERN_(HAS_HEATED_BED, draw_bed_temp(bed_temp, bed_target, forceUpdate));
|
||||
|
||||
uint16_t spd = thermalManager.fan_speed[0];
|
||||
|
||||
uint8_t spd = thermalManager.fan_speed[0];
|
||||
#if ENABLED(ADAPTIVE_FAN_SLOWING)
|
||||
if (!blink && thermalManager.fan_speed_scaler[0] < 128)
|
||||
spd = thermalManager.scaledFanSpeed(0, spd);
|
||||
#endif
|
||||
|
||||
draw_fan_speed(thermalManager.fanPercent(spd));
|
||||
draw_fan_speed(thermalManager.pwmToPercent(spd));
|
||||
|
||||
// Draw elapsed/remaining time
|
||||
const bool show_remaining = ENABLED(SHOW_REMAINING_TIME) && (DISABLED(ROTATE_PROGRESS_DISPLAY) || blink);
|
||||
|
||||
@@ -88,7 +88,7 @@ static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = {
|
||||
};
|
||||
|
||||
uint8_t u8g_dev_ssd1309_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
|
||||
switch(msg) {
|
||||
switch (msg) {
|
||||
case U8G_DEV_MSG_INIT:
|
||||
u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS);
|
||||
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1309_128x64_init_seq);
|
||||
|
||||
@@ -35,22 +35,27 @@
|
||||
using namespace ExtUI;
|
||||
|
||||
namespace Anycubic {
|
||||
class FileNavigator {
|
||||
public:
|
||||
FileNavigator();
|
||||
void reset();
|
||||
void getFiles(uint16_t);
|
||||
void upDIR();
|
||||
void changeDIR(char *);
|
||||
void sendFile();
|
||||
void refresh();
|
||||
char * getCurrentFolderName();
|
||||
private:
|
||||
static FileList filelist;
|
||||
static char currentfoldername[MAX_PATH_LEN];
|
||||
static uint16_t lastindex;
|
||||
static uint8_t folderdepth;
|
||||
static uint16_t currentindex;
|
||||
};
|
||||
extern FileNavigator filenavigator;
|
||||
|
||||
class FileNavigator {
|
||||
public:
|
||||
FileNavigator();
|
||||
void reset();
|
||||
void getFiles(uint16_t, panel_type_t, uint8_t filesneeded=4);
|
||||
void upDIR();
|
||||
void changeDIR(const char *);
|
||||
void sendFile(panel_type_t);
|
||||
void refresh();
|
||||
void skiptofileindex(uint16_t);
|
||||
|
||||
static FileList filelist;
|
||||
private:
|
||||
static uint16_t lastpanelindex;
|
||||
static uint16_t currentindex;
|
||||
static uint8_t currentfolderdepth;
|
||||
static uint16_t currentfolderindex[MAX_FOLDER_DEPTH];
|
||||
static char currentfoldername[MAX_PATH_LEN];
|
||||
};
|
||||
|
||||
extern FileNavigator filenavigator;
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -35,46 +35,46 @@
|
||||
|
||||
namespace Anycubic {
|
||||
|
||||
class ChironTFT {
|
||||
private:
|
||||
static printer_state_t printer_state;
|
||||
static paused_state_t pause_state;
|
||||
static heater_state_t hotend_state;
|
||||
static heater_state_t hotbed_state;
|
||||
static xy_uint8_t selectedmeshpoint;
|
||||
static char panel_command[MAX_CMND_LEN];
|
||||
static uint8_t command_len;
|
||||
static char selectedfile[MAX_PATH_LEN];
|
||||
static float live_Zoffset;
|
||||
static file_menu_t file_menu;
|
||||
class ChironTFT {
|
||||
private:
|
||||
static printer_state_t printer_state;
|
||||
static paused_state_t pause_state;
|
||||
static heater_state_t hotend_state;
|
||||
static heater_state_t hotbed_state;
|
||||
static xy_uint8_t selectedmeshpoint;
|
||||
static char panel_command[MAX_CMND_LEN];
|
||||
static uint8_t command_len;
|
||||
static char selectedfile[MAX_PATH_LEN];
|
||||
static float live_Zoffset;
|
||||
static file_menu_t file_menu;
|
||||
|
||||
public:
|
||||
ChironTFT();
|
||||
static void Startup();
|
||||
static void IdleLoop();
|
||||
static void PrinterKilled(PGM_P,PGM_P);
|
||||
static void MediaEvent(media_event_t);
|
||||
static void TimerEvent(timer_event_t);
|
||||
static void FilamentRunout();
|
||||
static void ConfirmationRequest(const char * const );
|
||||
static void StatusChange(const char * const );
|
||||
static void PowerLossRecovery();
|
||||
public:
|
||||
ChironTFT();
|
||||
static void Startup();
|
||||
static void IdleLoop();
|
||||
static void PrinterKilled(PGM_P,PGM_P);
|
||||
static void MediaEvent(media_event_t);
|
||||
static void TimerEvent(timer_event_t);
|
||||
static void FilamentRunout();
|
||||
static void ConfirmationRequest(const char * const );
|
||||
static void StatusChange(const char * const );
|
||||
static void PowerLossRecovery();
|
||||
|
||||
private:
|
||||
static void SendtoTFT(PGM_P);
|
||||
static void SendtoTFTLN(PGM_P);
|
||||
static bool ReadTFTCommand();
|
||||
static int8_t Findcmndpos(const char *, char);
|
||||
static void CheckHeaters();
|
||||
static void SendFileList(int8_t);
|
||||
static void SelectFile();
|
||||
static void InjectCommandandWait(PGM_P);
|
||||
static void ProcessPanelRequest();
|
||||
static void PanelInfo(uint8_t);
|
||||
static void PanelAction(uint8_t);
|
||||
static void PanelProcess(uint8_t);
|
||||
};
|
||||
private:
|
||||
static void SendtoTFT(PGM_P);
|
||||
static void SendtoTFTLN(PGM_P);
|
||||
static bool ReadTFTCommand();
|
||||
static int8_t Findcmndpos(const char *, char);
|
||||
static void CheckHeaters();
|
||||
static void SendFileList(int8_t);
|
||||
static void SelectFile();
|
||||
static void InjectCommandandWait(PGM_P);
|
||||
static void ProcessPanelRequest();
|
||||
static void PanelInfo(uint8_t);
|
||||
static void PanelAction(uint8_t);
|
||||
static void PanelProcess(uint8_t);
|
||||
};
|
||||
|
||||
extern ChironTFT Chiron;
|
||||
extern ChironTFT Chiron;
|
||||
|
||||
} // Anycubic
|
||||
|
||||
@@ -109,19 +109,16 @@
|
||||
#define AC_cmnd_power_loss_recovery PSTR("G28XYR5\nG28Z") // Lift, home X and Y then home Z when in 'safe' position
|
||||
|
||||
namespace Anycubic {
|
||||
|
||||
enum heater_state_t : uint8_t {
|
||||
AC_heater_off,
|
||||
AC_heater_temp_set,
|
||||
AC_heater_temp_reached
|
||||
};
|
||||
|
||||
enum paused_state_t : uint8_t {
|
||||
AC_paused_heater_timed_out,
|
||||
AC_paused_purging_filament,
|
||||
AC_paused_idle
|
||||
};
|
||||
|
||||
enum printer_state_t : uint8_t {
|
||||
AC_printer_idle,
|
||||
AC_printer_probing,
|
||||
@@ -131,13 +128,11 @@ namespace Anycubic {
|
||||
AC_printer_stopping,
|
||||
AC_printer_resuming_from_power_outage
|
||||
};
|
||||
|
||||
enum timer_event_t : uint8_t {
|
||||
AC_timer_started,
|
||||
AC_timer_paused,
|
||||
AC_timer_stopped
|
||||
};
|
||||
|
||||
enum media_event_t : uint8_t {
|
||||
AC_media_inserted,
|
||||
AC_media_removed,
|
||||
@@ -149,5 +144,4 @@ namespace Anycubic {
|
||||
AC_menu_change_to_file,
|
||||
AC_menu_change_to_command
|
||||
};
|
||||
|
||||
} // Anycubic
|
||||
|
||||
@@ -583,8 +583,7 @@ void AnycubicTFTClass::GetCommandFromTFT() {
|
||||
} break;
|
||||
|
||||
case 4: { // A4 GET FAN SPEED
|
||||
const float fanPercent = getActualFan_percent(FAN0);
|
||||
SEND_PGM_VAL("A4V ", int(LIMIT(fanPercent, 0, 100)));
|
||||
SEND_PGM_VAL("A4V ", int(getActualFan_percent(FAN0)));
|
||||
} break;
|
||||
|
||||
case 5: { // A5 GET CURRENT COORDINATE
|
||||
|
||||
@@ -188,7 +188,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
|
||||
if (!movevalue) {
|
||||
// homing
|
||||
DEBUG_ECHOPAIR(" homing ", axiscode);
|
||||
DEBUG_ECHOPAIR(" homing ", AS_CHAR(axiscode));
|
||||
char buf[6] = "G28 X";
|
||||
buf[4] = axiscode;
|
||||
//DEBUG_ECHOPAIR(" ", buf);
|
||||
@@ -199,7 +199,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
}
|
||||
else {
|
||||
// movement
|
||||
DEBUG_ECHOPAIR(" move ", axiscode);
|
||||
DEBUG_ECHOPAIR(" move ", AS_CHAR(axiscode));
|
||||
bool old_relative_mode = relative_mode;
|
||||
if (!relative_mode) {
|
||||
//DEBUG_ECHOPGM(" G91");
|
||||
@@ -235,7 +235,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
return;
|
||||
|
||||
cannotmove:
|
||||
DEBUG_ECHOLNPAIR(" cannot move ", axiscode);
|
||||
DEBUG_ECHOLNPAIR(" cannot move ", AS_CHAR(axiscode));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -188,7 +188,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
|
||||
if (!movevalue) {
|
||||
// homing
|
||||
DEBUG_ECHOPAIR(" homing ", axiscode);
|
||||
DEBUG_ECHOPAIR(" homing ", AS_CHAR(axiscode));
|
||||
char buf[6] = "G28 X";
|
||||
buf[4] = axiscode;
|
||||
//DEBUG_ECHOPAIR(" ", buf);
|
||||
@@ -199,7 +199,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
}
|
||||
else {
|
||||
// movement
|
||||
DEBUG_ECHOPAIR(" move ", axiscode);
|
||||
DEBUG_ECHOPAIR(" move ", AS_CHAR(axiscode));
|
||||
bool old_relative_mode = relative_mode;
|
||||
if (!relative_mode) {
|
||||
//DEBUG_ECHOPGM(" G91");
|
||||
@@ -235,7 +235,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
return;
|
||||
|
||||
cannotmove:
|
||||
DEBUG_ECHOLNPAIR(" cannot move ", axiscode);
|
||||
DEBUG_ECHOLNPAIR(" cannot move ", AS_CHAR(axiscode));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
uint16_t manualMoveStep = 1;
|
||||
uint16_t distanceFilament = 10;
|
||||
uint16_t FilamentSpeed = 25;
|
||||
uint16_t filamentSpeed_mm_s = 25;
|
||||
float ZOffset_distance = 0.1;
|
||||
float mesh_adj_distance = 0.01;
|
||||
float Z_distance = 0.1;
|
||||
@@ -72,12 +72,24 @@ void MKS_reset_settings() {
|
||||
}
|
||||
|
||||
xyz_pos_t position_before_pause;
|
||||
constexpr feedRate_t park_speed_xy = TERN(NOZZLE_PARK_FEATURE, NOZZLE_PARK_XY_FEEDRATE, 100),
|
||||
park_speed_z = TERN(NOZZLE_PARK_FEATURE, NOZZLE_PARK_Z_FEEDRATE, 5);
|
||||
|
||||
void MKS_pause_print_move() {
|
||||
queue.exhaust();
|
||||
position_before_pause = current_position;
|
||||
do_blocking_move_to(X_MIN_POS + mks_park_pos.x, Y_MIN_POS + mks_park_pos.y, current_position.z + mks_park_pos.z);
|
||||
destination.z = _MIN(current_position.z + mks_park_pos.z, Z_MAX_POS);
|
||||
prepare_internal_move_to_destination(park_speed_z);
|
||||
destination.set(X_MIN_POS + mks_park_pos.x, Y_MIN_POS + mks_park_pos.y);
|
||||
prepare_internal_move_to_destination(park_speed_xy);
|
||||
}
|
||||
|
||||
void MKS_resume_print_move() {
|
||||
destination.set(position_before_pause.x, position_before_pause.y);
|
||||
prepare_internal_move_to_destination(park_speed_xy);
|
||||
destination.z = position_before_pause.z;
|
||||
prepare_internal_move_to_destination(park_speed_z);
|
||||
}
|
||||
void MKS_resume_print_move() { do_blocking_move_to(position_before_pause); }
|
||||
|
||||
float z_offset_add = 0;
|
||||
|
||||
@@ -555,7 +567,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
|
||||
VPHELPER(VP_LOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentLoad, nullptr),
|
||||
VPHELPER(VP_UNLOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentUnLoad, nullptr),
|
||||
VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
|
||||
VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
|
||||
VPHELPER(VP_Filament_speed, &filamentSpeed_mm_s, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -569,7 +581,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
|
||||
|
||||
#if ENABLED(DGUS_FILAMENT_LOADUNLOAD)
|
||||
VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>),
|
||||
VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
|
||||
VPHELPER(VP_Filament_speed, &filamentSpeed_mm_s, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
|
||||
#endif
|
||||
|
||||
#if ENABLED(PIDTEMP)
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
extern uint16_t manualMoveStep;
|
||||
extern uint16_t distanceFilament;
|
||||
extern uint16_t FilamentSpeed;
|
||||
extern uint16_t filamentSpeed_mm_s;
|
||||
extern float ZOffset_distance;
|
||||
extern float mesh_adj_distance;
|
||||
extern float Z_distance;
|
||||
|
||||
@@ -835,12 +835,12 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
|
||||
if (!movevalue) {
|
||||
// homing
|
||||
DEBUG_ECHOPAIR(" homing ", axiscode);
|
||||
DEBUG_ECHOPAIR(" homing ", AS_CHAR(axiscode));
|
||||
// char buf[6] = "G28 X";
|
||||
// buf[4] = axiscode;
|
||||
|
||||
char buf[6];
|
||||
sprintf(buf,"G28 %c",axiscode);
|
||||
sprintf(buf, "G28 %c", axiscode);
|
||||
//DEBUG_ECHOPAIR(" ", buf);
|
||||
queue.enqueue_one_now(buf);
|
||||
//DEBUG_ECHOLNPGM(" ✓");
|
||||
@@ -850,14 +850,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
else if (movevalue == 5) {
|
||||
DEBUG_ECHOPAIR("send M84");
|
||||
char buf[6];
|
||||
snprintf_P(buf,6,PSTR("M84 %c"),axiscode);
|
||||
snprintf_P(buf,6,PSTR("M84 %c"), axiscode);
|
||||
queue.enqueue_one_now(buf);
|
||||
ForceCompleteUpdate();
|
||||
return;
|
||||
}
|
||||
else {
|
||||
// movement
|
||||
DEBUG_ECHOPAIR(" move ", axiscode);
|
||||
DEBUG_ECHOPAIR(" move ", AS_CHAR(axiscode));
|
||||
bool old_relative_mode = relative_mode;
|
||||
|
||||
if (!relative_mode) {
|
||||
@@ -895,7 +895,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
return;
|
||||
|
||||
cannotmove:
|
||||
DEBUG_ECHOLNPAIR(" cannot move ", axiscode);
|
||||
DEBUG_ECHOLNPAIR(" cannot move ", AS_CHAR(axiscode));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1190,17 +1190,18 @@ void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_
|
||||
|
||||
uint16_t value_len = swap16(*(uint16_t*)val_ptr);
|
||||
|
||||
DEBUG_ECHOLNPAIR_F("FilamentSpeed value:", value_len);
|
||||
DEBUG_ECHOLNPAIR_F("filamentSpeed_mm_s value:", value_len);
|
||||
|
||||
FilamentSpeed = value_len;
|
||||
filamentSpeed_mm_s = value_len;
|
||||
|
||||
skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel
|
||||
}
|
||||
|
||||
void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir) {
|
||||
#if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE)
|
||||
char buf[40];
|
||||
uint8_t swap_tool = 0;
|
||||
#else
|
||||
constexpr uint8_t swap_tool = 1; // T0 (or none at all)
|
||||
#endif
|
||||
|
||||
#if HAS_HOTEND
|
||||
@@ -1215,9 +1216,8 @@ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_
|
||||
default: break;
|
||||
case 0:
|
||||
#if HAS_HOTEND
|
||||
if (thermalManager.tooColdToExtrude(0)) {
|
||||
if (thermalManager.tooColdToExtrude(0))
|
||||
hotend_too_cold = 1;
|
||||
}
|
||||
else {
|
||||
#if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE)
|
||||
swap_tool = 1;
|
||||
@@ -1243,15 +1243,41 @@ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_
|
||||
}
|
||||
#endif
|
||||
|
||||
if (swap_tool) {
|
||||
char buf[30];
|
||||
snprintf_P(buf, 30
|
||||
#if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE)
|
||||
, PSTR("M1002T%cE%dF%d"), char('0' + swap_tool - 1)
|
||||
#else
|
||||
, PSTR("M1002E%dF%d")
|
||||
#endif
|
||||
, (int)distanceFilament * filamentDir, filamentSpeed_mm_s * 60
|
||||
);
|
||||
queue.inject(buf);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* M1002: Do a tool-change and relative move for MKS_FilamentLoadUnload
|
||||
* within the G-code execution window for best concurrency.
|
||||
*/
|
||||
void GcodeSuite::M1002() {
|
||||
#if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE)
|
||||
if (swap_tool) {
|
||||
queue.enqueue_now_P(swap_tool == 2 ? PSTR("T1") : PSTR("T0"));
|
||||
queue.enqueue_now_P(PSTR("G91"));
|
||||
snprintf_P(buf, 40, PSTR("G1 E%d F%d"), (int)distanceFilament * filamentDir, FilamentSpeed * 60);
|
||||
queue.enqueue_one_now(buf);
|
||||
queue.enqueue_now_P(PSTR("G90"));
|
||||
}
|
||||
{
|
||||
char buf[3];
|
||||
sprintf_P(buf, PSTR("T%c"), char('0' + parser.intval('T')));
|
||||
process_subcommands_now(buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
const uint8_t old_axis_relative = axis_relative;
|
||||
set_e_relative(); // M83
|
||||
{
|
||||
char buf[20];
|
||||
snprintf_P(buf, 20, PSTR("G1E%dF%d"), parser.intval('E'), parser.intval('F'));
|
||||
process_subcommands_now(buf);
|
||||
}
|
||||
axis_relative = old_axis_relative;
|
||||
}
|
||||
|
||||
void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
@@ -1445,7 +1471,7 @@ void DGUSScreenHandler::LanguagePInit() {
|
||||
void DGUSScreenHandler::DGUS_ExtrudeLoadInit(void) {
|
||||
ex_filament.ex_length = distanceFilament;
|
||||
ex_filament.ex_load_unload_flag = 0;
|
||||
ex_filament.ex_need_time = FilamentSpeed;
|
||||
ex_filament.ex_need_time = filamentSpeed_mm_s;
|
||||
ex_filament.ex_speed = 0;
|
||||
ex_filament.ex_status = EX_NONE;
|
||||
ex_filament.ex_tick_end = 0;
|
||||
|
||||
@@ -188,7 +188,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
|
||||
if (!movevalue) {
|
||||
// homing
|
||||
DEBUG_ECHOPAIR(" homing ", axiscode);
|
||||
DEBUG_ECHOPAIR(" homing ", AS_CHAR(axiscode));
|
||||
char buf[6] = "G28 X";
|
||||
buf[4] = axiscode;
|
||||
//DEBUG_ECHOPAIR(" ", buf);
|
||||
@@ -199,7 +199,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
}
|
||||
else {
|
||||
// movement
|
||||
DEBUG_ECHOPAIR(" move ", axiscode);
|
||||
DEBUG_ECHOPAIR(" move ", AS_CHAR(axiscode));
|
||||
bool old_relative_mode = relative_mode;
|
||||
if (!relative_mode) {
|
||||
//DEBUG_ECHOPGM(" G91");
|
||||
@@ -235,7 +235,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
return;
|
||||
|
||||
cannotmove:
|
||||
DEBUG_ECHOLNPAIR(" cannot move ", axiscode);
|
||||
DEBUG_ECHOLNPAIR(" cannot move ", AS_CHAR(axiscode));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -147,6 +147,7 @@ namespace Language_en {
|
||||
PROGMEM Language_Str MSG_PROBE_BED = u8"Probe Mesh";
|
||||
PROGMEM Language_Str MSG_SHOW_MESH = u8"View Mesh";
|
||||
PROGMEM Language_Str MSG_PRINT_TEST = u8"Print Test";
|
||||
PROGMEM Language_Str MSG_MOVE_Z_TO_TOP = u8"Raise Z to Top";
|
||||
|
||||
#if ENABLED(TOUCH_UI_LULZBOT_BIO)
|
||||
PROGMEM Language_Str MSG_MOVE_TO_HOME = u8"Move to Home";
|
||||
|
||||
@@ -30,7 +30,7 @@ using namespace Theme;
|
||||
using namespace ExtUI;
|
||||
|
||||
constexpr static BedMeshEditScreenData &mydata = screen_data.BedMeshEditScreen;
|
||||
constexpr static float gaugeThickness = 0.25;
|
||||
constexpr static float gaugeThickness = 0.1;
|
||||
|
||||
#if ENABLED(TOUCH_UI_PORTRAIT)
|
||||
#define GRID_COLS 3
|
||||
@@ -54,20 +54,29 @@ constexpr static float gaugeThickness = 0.25;
|
||||
#define SAVE_POS BTN_POS(5,5), BTN_SIZE(1,1)
|
||||
#endif
|
||||
|
||||
constexpr uint8_t NONE = 255;
|
||||
|
||||
static float meshGetter(uint8_t x, uint8_t y, void*) {
|
||||
xy_uint8_t pos;
|
||||
pos.x = x;
|
||||
pos.y = y;
|
||||
return ExtUI::getMeshPoint(pos) + (mydata.highlight.x != -1 && mydata.highlight == pos ? mydata.zAdjustment : 0);
|
||||
return ExtUI::getMeshPoint(pos) + (mydata.highlight.x != NONE && mydata.highlight == pos ? mydata.zAdjustment : 0);
|
||||
}
|
||||
|
||||
void BedMeshEditScreen::onEntry() {
|
||||
mydata.needSave = false;
|
||||
mydata.highlight.x = -1;
|
||||
mydata.highlight.x = NONE;
|
||||
mydata.zAdjustment = 0;
|
||||
mydata.savedMeshLevelingState = ExtUI::getLevelingActive();
|
||||
mydata.savedEndstopState = ExtUI::getSoftEndstopState();
|
||||
BaseScreen::onEntry();
|
||||
}
|
||||
|
||||
void BedMeshEditScreen::onExit() {
|
||||
ExtUI::setLevelingActive(mydata.savedMeshLevelingState);
|
||||
ExtUI::setSoftEndstopState(mydata.savedEndstopState);
|
||||
}
|
||||
|
||||
float BedMeshEditScreen::getHighlightedValue() {
|
||||
const float val = ExtUI::getMeshPoint(mydata.highlight);
|
||||
return (isnan(val) ? 0 : val) + mydata.zAdjustment;
|
||||
@@ -80,12 +89,13 @@ void BedMeshEditScreen::setHighlightedValue(float value) {
|
||||
void BedMeshEditScreen::moveToHighlightedValue() {
|
||||
if (ExtUI::getMeshValid()) {
|
||||
ExtUI::setLevelingActive(true);
|
||||
ExtUI::setSoftEndstopState(false);
|
||||
ExtUI::moveToMeshPoint(mydata.highlight, gaugeThickness + mydata.zAdjustment);
|
||||
}
|
||||
}
|
||||
|
||||
void BedMeshEditScreen::adjustHighlightedValue(float increment) {
|
||||
if(mydata.highlight.x != -1) {
|
||||
if (mydata.highlight.x != NONE) {
|
||||
mydata.zAdjustment += increment;
|
||||
moveToHighlightedValue();
|
||||
mydata.needSave = true;
|
||||
@@ -114,7 +124,7 @@ void BedMeshEditScreen::drawHighlightedPointValue() {
|
||||
.colors(normal_btn)
|
||||
.text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z))
|
||||
.font(font_small);
|
||||
if(mydata.highlight.x != -1)
|
||||
if (mydata.highlight.x != NONE)
|
||||
draw_adjuster(cmd, Z_VALUE_POS, 3, getHighlightedValue(), GET_TEXT_F(MSG_UNITS_MM), 4, 3);
|
||||
cmd.colors(mydata.needSave ? normal_btn : action_btn)
|
||||
.tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_BACK))
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#define FTDI_BED_MESH_EDIT_SCREEN_CLASS BedMeshEditScreen
|
||||
|
||||
struct BedMeshEditScreenData {
|
||||
bool needSave;
|
||||
bool needSave, savedMeshLevelingState, savedEndstopState;
|
||||
xy_uint8_t highlight;
|
||||
float zAdjustment;
|
||||
};
|
||||
@@ -41,6 +41,7 @@ class BedMeshEditScreen : public BedMeshBase, public CachedScreen<BED_MESH_EDIT_
|
||||
static void drawHighlightedPointValue();
|
||||
public:
|
||||
static void onEntry();
|
||||
static void onExit();
|
||||
static void onRedraw(draw_mode_t);
|
||||
static bool onTouchHeld(uint8_t tag);
|
||||
static bool onTouchEnd(uint8_t tag);
|
||||
|
||||
@@ -73,14 +73,14 @@ void BedMeshViewScreen::drawHighlightedPointValue() {
|
||||
.text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z))
|
||||
.font(font_small);
|
||||
|
||||
if(mydata.highlight.x != -1)
|
||||
if (mydata.highlight.x != -1)
|
||||
draw_adjuster_value(cmd, Z_VALUE_POS, ExtUI::getMeshPoint(mydata.highlight), GET_TEXT_F(MSG_UNITS_MM), 4, 3);
|
||||
|
||||
cmd.colors(action_btn)
|
||||
.tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY))
|
||||
.tag(0);
|
||||
|
||||
if(mydata.message) cmd.text(MESSAGE_POS, mydata.message);
|
||||
if (mydata.message) cmd.text(MESSAGE_POS, mydata.message);
|
||||
}
|
||||
|
||||
void BedMeshViewScreen::onRedraw(draw_mode_t what) {
|
||||
|
||||
@@ -66,6 +66,9 @@ void MoveAxisScreen::onRedraw(draw_mode_t what) {
|
||||
w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), mydata.e_rel[3], canMove(E3));
|
||||
#endif
|
||||
#endif
|
||||
#if Z_HOME_DIR < 0
|
||||
w.button(24, GET_TEXT_F(MSG_MOVE_Z_TO_TOP), !axis_should_home(Z_AXIS));
|
||||
#endif
|
||||
w.increments();
|
||||
}
|
||||
|
||||
@@ -98,7 +101,8 @@ bool BaseMoveAxisScreen::onTouchHeld(uint8_t tag) {
|
||||
case 20: SpinnerDialogBox::enqueueAndWait_P(F("G28X")); break;
|
||||
case 21: SpinnerDialogBox::enqueueAndWait_P(F("G28Y")); break;
|
||||
case 22: SpinnerDialogBox::enqueueAndWait_P(F("G28Z")); break;
|
||||
case 23: SpinnerDialogBox::enqueueAndWait_P(F("G28")); break;
|
||||
case 23: SpinnerDialogBox::enqueueAndWait_P(F("G28")); break;
|
||||
case 24: raiseZtoTop(); break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@@ -107,6 +111,11 @@ bool BaseMoveAxisScreen::onTouchHeld(uint8_t tag) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void BaseMoveAxisScreen::raiseZtoTop() {
|
||||
constexpr xyze_feedrate_t homing_feedrate = HOMING_FEEDRATE_MM_M;
|
||||
setAxisPosition_mm(Z_MAX_POS - 5, Z, homing_feedrate[Z_AXIS]);
|
||||
}
|
||||
|
||||
float BaseMoveAxisScreen::getManualFeedrate(uint8_t axis, float increment_mm) {
|
||||
// Compute feedrate so that the tool lags the adjuster when it is
|
||||
// being held down, this allows enough margin for the planner to
|
||||
|
||||
@@ -34,6 +34,7 @@ class BaseMoveAxisScreen : public BaseNumericAdjustmentScreen {
|
||||
private:
|
||||
static float getManualFeedrate(uint8_t axis, float increment_mm);
|
||||
public:
|
||||
static void raiseZtoTop();
|
||||
static void setManualFeedrate(ExtUI::axis_t, float increment_mm);
|
||||
static void setManualFeedrate(ExtUI::extruder_t, float increment_mm);
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@ union screen_data_t {
|
||||
DECL_DATA_IF_INCLUDED(FTDI_COCOA_PREHEAT_SCREEN)
|
||||
DECL_DATA_IF_INCLUDED(FTDI_COCOA_LOAD_CHOCOLATE_SCREEN)
|
||||
DECL_DATA_IF_INCLUDED(FTDI_NUDGE_NOZZLE_SCREEN)
|
||||
DECL_DATA_IF_INCLUDED(FTDI_Z_OFFSET_SCREEN)
|
||||
DECL_DATA_IF_INCLUDED(FTDI_BASE_NUMERIC_ADJ_SCREEN)
|
||||
DECL_DATA_IF_INCLUDED(FTDI_ALERT_DIALOG_BOX)
|
||||
};
|
||||
|
||||
@@ -316,8 +316,8 @@ void StatusScreen::draw_interaction_buttons(draw_mode_t what) {
|
||||
cmd.colors(normal_btn)
|
||||
.font(Theme::font_medium)
|
||||
.colors(has_media ? action_btn : normal_btn)
|
||||
.enabled(has_media)
|
||||
.tag(3).button(MEDIA_BTN_POS, isPrintingFromMedia() ? GET_TEXT_F(MSG_PRINTING) : GET_TEXT_F(MSG_BUTTON_MEDIA))
|
||||
.enabled(has_media && !isPrinting())
|
||||
.tag(3).button(MEDIA_BTN_POS, isPrinting() ? GET_TEXT_F(MSG_PRINTING) : GET_TEXT_F(MSG_BUTTON_MEDIA))
|
||||
.colors(!has_media ? action_btn : normal_btn)
|
||||
.tag(4).button(MENU_BTN_POS, GET_TEXT_F(MSG_BUTTON_MENU));
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include "../config.h"
|
||||
#include "screens.h"
|
||||
#include "screen_data.h"
|
||||
|
||||
#ifdef FTDI_Z_OFFSET_SCREEN
|
||||
|
||||
@@ -29,6 +30,15 @@ using namespace FTDI;
|
||||
using namespace ExtUI;
|
||||
using namespace Theme;
|
||||
|
||||
#define SHEET_THICKNESS 0.1
|
||||
|
||||
constexpr static ZOffsetScreenData &mydata = screen_data.ZOffsetScreen;
|
||||
|
||||
void ZOffsetScreen::onEntry() {
|
||||
mydata.z = SHEET_THICKNESS;
|
||||
BaseNumericAdjustmentScreen::onEntry();
|
||||
}
|
||||
|
||||
void ZOffsetScreen::onRedraw(draw_mode_t what) {
|
||||
widgets_t w(what);
|
||||
w.precision(2, BaseNumericAdjustmentScreen::DEFAULT_MIDRANGE).units(GET_TEXT_F(MSG_UNITS_MM));
|
||||
@@ -36,13 +46,45 @@ void ZOffsetScreen::onRedraw(draw_mode_t what) {
|
||||
w.heading( GET_TEXT_F(MSG_ZPROBE_ZOFFSET));
|
||||
w.color(z_axis).adjuster(4, GET_TEXT_F(MSG_ZPROBE_ZOFFSET), getZOffset_mm());
|
||||
w.increments();
|
||||
w.button( 2, GET_TEXT_F(MSG_PROBE_WIZARD));
|
||||
}
|
||||
|
||||
void ZOffsetScreen::move(float inc) {
|
||||
// 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) {
|
||||
mydata.z += inc;
|
||||
setAxisPosition_mm(mydata.z, Z);
|
||||
}
|
||||
}
|
||||
|
||||
void ZOffsetScreen::runWizard() {
|
||||
// Restore the default Z offset
|
||||
constexpr float offset[] = NOZZLE_TO_PROBE_OFFSET;
|
||||
setZOffset_mm(offset[Z_AXIS]);
|
||||
// Move above probe point
|
||||
char cmd[64], str[10];
|
||||
strcpy_P(cmd, PSTR("G28 Z\nG0 F1000 X"));
|
||||
dtostrf(TERN(Z_SAFE_HOMING,Z_SAFE_HOMING_X_POINT,X_CENTER), 3, 1, str);
|
||||
strcat(cmd, str);
|
||||
strcat_P(cmd, PSTR("Y"));
|
||||
dtostrf(TERN(Z_SAFE_HOMING,Z_SAFE_HOMING_Y_POINT,Y_CENTER), 3, 1, str);
|
||||
strcat(cmd, str);
|
||||
strcat_P(cmd, PSTR("Z"));
|
||||
dtostrf(SHEET_THICKNESS, 3, 1, str);
|
||||
strcat(cmd, str);
|
||||
injectCommands(cmd);
|
||||
// Show instructions for user.
|
||||
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::onTouchHeld(uint8_t tag) {
|
||||
const float increment = getIncrement();
|
||||
switch (tag) {
|
||||
case 4: UI_DECREMENT(ZOffset_mm); break;
|
||||
case 5: UI_INCREMENT(ZOffset_mm); break;
|
||||
case 2: runWizard(); break;
|
||||
case 4: UI_DECREMENT(ZOffset_mm); move(-increment); break;
|
||||
case 5: UI_INCREMENT(ZOffset_mm); move( increment); break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -25,8 +25,16 @@
|
||||
#define FTDI_Z_OFFSET_SCREEN
|
||||
#define FTDI_Z_OFFSET_SCREEN_CLASS ZOffsetScreen
|
||||
|
||||
struct ZOffsetScreenData : public BaseNumericAdjustmentScreenData {
|
||||
float z;
|
||||
};
|
||||
|
||||
class ZOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen<ZOFFSET_SCREEN_CACHE> {
|
||||
private:
|
||||
static void move(float inc);
|
||||
static void runWizard();
|
||||
public:
|
||||
static void onEntry();
|
||||
static void onRedraw(draw_mode_t);
|
||||
static bool onTouchHeld(uint8_t tag);
|
||||
};
|
||||
|
||||
@@ -109,33 +109,32 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
|
||||
void lv_draw_acceleration_settings() {
|
||||
scr = lv_screen_create(ACCELERATION_UI, machine_menu.AccelerationConfTitle);
|
||||
char str_1[16];
|
||||
if (!uiCfg.para_ui_page) {
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.acceleration, 1, 1, str_1));
|
||||
dtostrf(planner.settings.acceleration, 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.PrintAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_ACCE_PRINT, 0, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.retract_acceleration, 1, 1, str_1));
|
||||
dtostrf(planner.settings.retract_acceleration, 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.RetractAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_ACCE_RETRA, 1, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.travel_acceleration, 1, 1, str_1));
|
||||
dtostrf(planner.settings.travel_acceleration, 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.TravelAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_ACCE_TRAVEL, 2, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]);
|
||||
itoa(planner.settings.max_acceleration_mm_per_s2[X_AXIS], public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.X_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_ACCE_X, 3, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_ACCE_DOWN, true);
|
||||
}
|
||||
else {
|
||||
sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]);
|
||||
itoa(planner.settings.max_acceleration_mm_per_s2[Y_AXIS], public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Y_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_ACCE_Y, 0, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]);
|
||||
itoa(planner.settings.max_acceleration_mm_per_s2[Z_AXIS], public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Z_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_ACCE_Z, 1, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]);
|
||||
itoa(planner.settings.max_acceleration_mm_per_s2[E_AXIS], public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.E0_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_ACCE_E0, 2, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]);
|
||||
itoa(planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.E1_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_ACCE_E1, 3, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_ACCE_UP, true);
|
||||
|
||||
@@ -65,16 +65,15 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
}
|
||||
|
||||
void lv_draw_auto_level_offset_settings() {
|
||||
char str_1[16];
|
||||
scr = lv_screen_create(NOZZLE_PROBE_OFFSET_UI, machine_menu.OffsetConfTitle);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), TERN(HAS_PROBE_XY_OFFSET, dtostrf(probe.offset.x, 1, 1, str_1) , 0));
|
||||
dtostrf(TERN0(HAS_PROBE_XY_OFFSET, probe.offset.x), 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Xoffset, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_OFFSET_X, 0, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), TERN(HAS_PROBE_XY_OFFSET, dtostrf(probe.offset.y, 1, 1, str_1) , 0));
|
||||
dtostrf(TERN0(HAS_PROBE_XY_OFFSET, probe.offset.y), 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Yoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_OFFSET_Y, 1, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), TERN(HAS_PROBE_XY_OFFSET, dtostrf(probe.offset.z, 1, 1, str_1) , 0));
|
||||
dtostrf(TERN0(HAS_PROBE_XY_OFFSET, probe.offset.z), 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Zoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_OFFSET_Z, 2, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_OFFSET_RETURN, true);
|
||||
|
||||
@@ -190,7 +190,7 @@ void display_qrcode(uint8_t *qrcode_data) {
|
||||
}
|
||||
|
||||
void cloud_unbind() {
|
||||
package_to_wifi(WIFI_CLOUD_UNBIND, (uint8_t *)0, 0);
|
||||
package_to_wifi(WIFI_CLOUD_UNBIND, nullptr, 0);
|
||||
unbinding_flag = 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -92,22 +92,22 @@ void lv_draw_filament_settings() {
|
||||
scr = lv_screen_create(FILAMENT_SETTINGS_UI, machine_menu.FilamentConfTitle);
|
||||
|
||||
if (!uiCfg.para_ui_page) {
|
||||
sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_length);
|
||||
itoa(gCfgItems.filamentchange_load_length, public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.InLength, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FILAMENT_SET_IN_LENGTH, 0, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_speed);
|
||||
itoa(gCfgItems.filamentchange_load_speed, public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.InSpeed, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FILAMENT_SET_IN_SPEED, 1, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_length);
|
||||
itoa(gCfgItems.filamentchange_unload_length, public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.OutLength, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_FILAMENT_SET_OUT_LENGTH, 2, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_speed);
|
||||
itoa(gCfgItems.filamentchange_unload_speed, public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.OutSpeed, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_FILAMENT_SET_OUT_SPEED, 3, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FILAMENT_SET_DOWN, true);
|
||||
}
|
||||
else {
|
||||
sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temp);
|
||||
itoa(gCfgItems.filament_limit_temp, public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.FilamentTemperature, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FILAMENT_SET_TEMP, 0, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FILAMENT_SET_UP, true);
|
||||
|
||||
@@ -77,17 +77,17 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
void lv_draw_homing_sensitivity_settings() {
|
||||
scr = lv_screen_create(HOMING_SENSITIVITY_UI, machine_menu.HomingSensitivityConfTitle);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0));
|
||||
itoa(TERN(X_SENSORLESS, stepperX.homing_threshold(), 0), public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.X_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_SENSITIVITY_X, 0, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0));
|
||||
itoa(TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0), public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Y_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_SENSITIVITY_Y, 1, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0));
|
||||
itoa(TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0), public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Z_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_SENSITIVITY_Z, 2, public_buf_l);
|
||||
|
||||
#if Z2_SENSORLESS
|
||||
sprintf_P(public_buf_l, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0));
|
||||
itoa(TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0), public_buf_l, 10);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Z2_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_SENSITIVITY_Z2, 3, public_buf_l);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -71,19 +71,18 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
}
|
||||
|
||||
void lv_draw_jerk_settings() {
|
||||
char str_1[16];
|
||||
scr = lv_screen_create(JERK_UI, machine_menu.JerkConfTitle);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[X_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.max_jerk[X_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.X_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_JERK_X, 0, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[Y_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.max_jerk[Y_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Y_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_JERK_Y, 1, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[Z_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.max_jerk[Z_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Z_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_JERK_Z, 2, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[E_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.max_jerk[E_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.E_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_JERK_E, 3, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_JERK_RETURN, true);
|
||||
|
||||
@@ -137,7 +137,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) {
|
||||
|
||||
gCfgItems.wifi_mode_sel = STA_MODEL;
|
||||
|
||||
package_to_wifi(WIFI_PARA_SET, (uint8_t *)0, 0);
|
||||
package_to_wifi(WIFI_PARA_SET, nullptr, 0);
|
||||
|
||||
public_buf_l[0] = 0xA5;
|
||||
public_buf_l[1] = 0x09;
|
||||
@@ -148,7 +148,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) {
|
||||
public_buf_l[6] = 0x00;
|
||||
raw_send_to_wifi((uint8_t*)public_buf_l, 6);
|
||||
|
||||
last_disp_state = KEY_BOARD_UI;
|
||||
last_disp_state = KEYBOARD_UI;
|
||||
lv_clear_keyboard();
|
||||
wifi_tips_type = TIPS_TYPE_JOINING;
|
||||
lv_draw_wifi_tips();
|
||||
@@ -216,7 +216,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) {
|
||||
}
|
||||
|
||||
void lv_draw_keyboard() {
|
||||
scr = lv_screen_create(KEY_BOARD_UI, "");
|
||||
scr = lv_screen_create(KEYBOARD_UI, "");
|
||||
|
||||
// Create styles for the keyboard
|
||||
static lv_style_t rel_style, pr_style;
|
||||
|
||||
@@ -54,7 +54,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
queue.inject_P(G28_STR);
|
||||
}
|
||||
const int ind = obj->mks_obj_id - ID_M_POINT1;
|
||||
sprintf_P(public_buf_l, PSTR("G1 Z10\nG1 X%d Y%d\nG1 Z0"), (int)gCfgItems.trammingPos[ind][X_AXIS], (int)gCfgItems.trammingPos[ind][Y_AXIS]);
|
||||
sprintf_P(public_buf_l, PSTR("G1Z10\nG1X%dY%d\nG1Z0"), gCfgItems.trammingPos[ind].x, gCfgItems.trammingPos[ind].y);
|
||||
queue.inject(public_buf_l);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -80,26 +80,25 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
}
|
||||
|
||||
void lv_draw_max_feedrate_settings() {
|
||||
char str_1[16];
|
||||
scr = lv_screen_create(MAXFEEDRATE_UI, machine_menu.MaxFeedRateConfTitle);
|
||||
|
||||
if (!uiCfg.para_ui_page) {
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.XMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FEED_X, 0, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.YMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FEED_Y, 1, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.ZMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_FEED_Z, 2, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.E0MaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_FEED_E0, 3, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FEED_DOWN, true);
|
||||
}
|
||||
else {
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], 1, 1, str_1));
|
||||
dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.E1MaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FEED_E1, 0, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FEED_UP, true);
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "../../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if BOTH(HAS_TFT_LVGL_UI, MULTI_VOLUME)
|
||||
|
||||
#include "draw_ui.h"
|
||||
#include <lv_conf.h>
|
||||
|
||||
#include "../../../../inc/MarlinConfig.h"
|
||||
#include "../../../../sd/cardreader.h"
|
||||
|
||||
extern lv_group_t *g;
|
||||
static lv_obj_t *scr;
|
||||
|
||||
enum {
|
||||
ID_T_USB_DISK = 1,
|
||||
ID_T_SD_DISK,
|
||||
ID_T_RETURN
|
||||
};
|
||||
|
||||
#if ENABLED(MKS_TEST)
|
||||
extern uint8_t curent_disp_ui;
|
||||
#endif
|
||||
|
||||
static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
if (event != LV_EVENT_RELEASED) return;
|
||||
lv_clear_media_select();
|
||||
switch (obj->mks_obj_id) {
|
||||
case ID_T_USB_DISK: card.changeMedia(&card.media_usbFlashDrive); break;
|
||||
case ID_T_SD_DISK: card.changeMedia(&card.media_sd_spi); break;
|
||||
case ID_T_RETURN:
|
||||
TERN_(MKS_TEST, curent_disp_ui = 1);
|
||||
lv_draw_ready_print();
|
||||
return;
|
||||
}
|
||||
lv_draw_print_file();
|
||||
}
|
||||
|
||||
void lv_draw_media_select() {
|
||||
scr = lv_screen_create(MEDIA_SELECT_UI);
|
||||
lv_big_button_create(scr, "F:/bmp_sd.bin", media_select_menu.sd_disk, INTERVAL_V, titleHeight, event_handler, ID_T_SD_DISK);
|
||||
lv_big_button_create(scr, "F:/bmp_usb_disk.bin", media_select_menu.usb_disk, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_USB_DISK);
|
||||
lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_RETURN);
|
||||
}
|
||||
|
||||
void lv_clear_media_select() {
|
||||
#if HAS_ROTARY_ENCODER
|
||||
if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g);
|
||||
#endif
|
||||
lv_obj_del(scr);
|
||||
}
|
||||
|
||||
#endif // HAS_TFT_LVGL_UI
|
||||
@@ -0,0 +1,33 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* C-declarations for C++ */
|
||||
#endif
|
||||
|
||||
extern void lv_draw_media_select();
|
||||
extern void lv_clear_media_select();
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* C-declarations for C++ */
|
||||
#endif
|
||||
@@ -73,214 +73,211 @@ enum {
|
||||
|
||||
static void disp_key_value() {
|
||||
char *temp;
|
||||
char str_1[16];
|
||||
#if HAS_TRINAMIC_CONFIG
|
||||
float milliamps;
|
||||
#endif
|
||||
TERN_(HAS_TRINAMIC_CONFIG, float milliamps);
|
||||
|
||||
switch (value) {
|
||||
case PrintAcceleration:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.acceleration, 1, 1, str_1));
|
||||
dtostrf(planner.settings.acceleration, 1, 1, public_buf_m);
|
||||
break;
|
||||
case RetractAcceleration:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.retract_acceleration, 1, 1, str_1));
|
||||
dtostrf(planner.settings.retract_acceleration, 1, 1, public_buf_m);
|
||||
break;
|
||||
case TravelAcceleration:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.travel_acceleration, 1, 1, str_1));
|
||||
dtostrf(planner.settings.travel_acceleration, 1, 1, public_buf_m);
|
||||
break;
|
||||
case XAcceleration:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]);
|
||||
itoa(planner.settings.max_acceleration_mm_per_s2[X_AXIS], public_buf_m, 10);
|
||||
break;
|
||||
case YAcceleration:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]);
|
||||
itoa(planner.settings.max_acceleration_mm_per_s2[Y_AXIS], public_buf_m, 10);
|
||||
break;
|
||||
case ZAcceleration:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]);
|
||||
itoa(planner.settings.max_acceleration_mm_per_s2[Z_AXIS], public_buf_m, 10);
|
||||
break;
|
||||
case E0Acceleration:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]);
|
||||
itoa(planner.settings.max_acceleration_mm_per_s2[E_AXIS], public_buf_m, 10);
|
||||
break;
|
||||
case E1Acceleration:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]);
|
||||
itoa(planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], public_buf_m, 10);
|
||||
break;
|
||||
case XMaxFeedRate:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, public_buf_m);
|
||||
break;
|
||||
case YMaxFeedRate:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, public_buf_m);
|
||||
break;
|
||||
case ZMaxFeedRate:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, public_buf_m);
|
||||
break;
|
||||
case E0MaxFeedRate:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, public_buf_m);
|
||||
break;
|
||||
case E1MaxFeedRate:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], 1, 1, str_1));
|
||||
dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], 1, 1, public_buf_m);
|
||||
break;
|
||||
|
||||
case XJerk:
|
||||
#if HAS_CLASSIC_JERK
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[X_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.max_jerk[X_AXIS], 1, 1, public_buf_m);
|
||||
#endif
|
||||
break;
|
||||
case YJerk:
|
||||
#if HAS_CLASSIC_JERK
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[Y_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.max_jerk[Y_AXIS], 1, 1, public_buf_m);
|
||||
#endif
|
||||
break;
|
||||
case ZJerk:
|
||||
#if HAS_CLASSIC_JERK
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[Z_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.max_jerk[Z_AXIS], 1, 1, public_buf_m);
|
||||
#endif
|
||||
break;
|
||||
case EJerk:
|
||||
#if HAS_CLASSIC_JERK
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[E_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.max_jerk[E_AXIS], 1, 1, public_buf_m);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case Xstep:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, public_buf_m);
|
||||
break;
|
||||
case Ystep:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, public_buf_m);
|
||||
|
||||
break;
|
||||
case Zstep:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, public_buf_m);
|
||||
|
||||
break;
|
||||
case E0step:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, public_buf_m);
|
||||
|
||||
break;
|
||||
case E1step:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS_N(1)], 1, 1, str_1));
|
||||
dtostrf(planner.settings.axis_steps_per_mm[E_AXIS_N(1)], 1, 1, public_buf_m);
|
||||
break;
|
||||
|
||||
case Xcurrent:
|
||||
#if AXIS_IS_TMC(X)
|
||||
milliamps = stepperX.getMilliamps();
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
|
||||
dtostrf(milliamps, 1, 1, public_buf_m);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case Ycurrent:
|
||||
#if AXIS_IS_TMC(Y)
|
||||
milliamps = stepperY.getMilliamps();
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
|
||||
dtostrf(milliamps, 1, 1, public_buf_m);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case Zcurrent:
|
||||
#if AXIS_IS_TMC(Z)
|
||||
milliamps = stepperZ.getMilliamps();
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
|
||||
dtostrf(milliamps, 1, 1, public_buf_m);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case E0current:
|
||||
#if AXIS_IS_TMC(E0)
|
||||
milliamps = stepperE0.getMilliamps();
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
|
||||
dtostrf(milliamps, 1, 1, public_buf_m);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case E1current:
|
||||
#if AXIS_IS_TMC(E1)
|
||||
milliamps = stepperE1.getMilliamps();
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
|
||||
dtostrf(milliamps, 1, 1, public_buf_m);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case pause_pos_x:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosX, 1, 1, str_1));
|
||||
dtostrf(gCfgItems.pausePosX, 1, 1, public_buf_m);
|
||||
break;
|
||||
case pause_pos_y:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosY, 1, 1, str_1));
|
||||
dtostrf(gCfgItems.pausePosY, 1, 1, public_buf_m);
|
||||
break;
|
||||
case pause_pos_z:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosZ, 1, 1, str_1));
|
||||
dtostrf(gCfgItems.pausePosZ, 1, 1, public_buf_m);
|
||||
break;
|
||||
case level_pos_x1:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[0][X_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[0].x, public_buf_m, 10);
|
||||
break;
|
||||
case level_pos_y1:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[0][Y_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[0].y, public_buf_m, 10);
|
||||
break;
|
||||
case level_pos_x2:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[1][X_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[1].x, public_buf_m, 10);
|
||||
break;
|
||||
case level_pos_y2:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[1][Y_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[1].y, public_buf_m, 10);
|
||||
break;
|
||||
case level_pos_x3:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[2][X_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[2].x, public_buf_m, 10);
|
||||
break;
|
||||
case level_pos_y3:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[2][Y_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[2].y, public_buf_m, 10);
|
||||
break;
|
||||
case level_pos_x4:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[3][X_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[3].x, public_buf_m, 10);
|
||||
break;
|
||||
case level_pos_y4:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[3][Y_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[3].y, public_buf_m, 10);
|
||||
break;
|
||||
case level_pos_x5:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[4][X_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[4].x, public_buf_m, 10);
|
||||
break;
|
||||
case level_pos_y5:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[4][Y_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[4].y, public_buf_m, 10);
|
||||
break;
|
||||
#if HAS_BED_PROBE
|
||||
case x_offset:
|
||||
#if HAS_PROBE_XY_OFFSET
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.x, 1, 3, str_1));
|
||||
dtostrf(probe.offset.x, 1, 3, public_buf_m);
|
||||
#endif
|
||||
break;
|
||||
case y_offset:
|
||||
#if HAS_PROBE_XY_OFFSET
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.y, 1, 3, str_1));
|
||||
dtostrf(probe.offset.y, 1, 3, public_buf_m);
|
||||
#endif
|
||||
break;
|
||||
case z_offset:
|
||||
sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.z, 1, 3, str_1));
|
||||
dtostrf(probe.offset.z, 1, 3, public_buf_m);
|
||||
break;
|
||||
#endif
|
||||
case load_length:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_length);
|
||||
itoa(gCfgItems.filamentchange_load_length, public_buf_m, 10);
|
||||
break;
|
||||
case load_speed:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_speed);
|
||||
itoa(gCfgItems.filamentchange_load_speed, public_buf_m, 10);
|
||||
break;
|
||||
case unload_length:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_length);
|
||||
itoa(gCfgItems.filamentchange_unload_length, public_buf_m, 10);
|
||||
break;
|
||||
case unload_speed:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_speed);
|
||||
itoa(gCfgItems.filamentchange_unload_speed, public_buf_m, 10);
|
||||
break;
|
||||
case filament_temp:
|
||||
sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filament_limit_temp);
|
||||
itoa(gCfgItems.filament_limit_temp, public_buf_m, 10);
|
||||
break;
|
||||
case x_sensitivity:
|
||||
#if X_SENSORLESS
|
||||
sprintf_P(public_buf_m, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0));
|
||||
itoa(TERN(X_SENSORLESS, stepperX.homing_threshold(), 0), public_buf_m, 10);
|
||||
#endif
|
||||
break;
|
||||
case y_sensitivity:
|
||||
#if Y_SENSORLESS
|
||||
sprintf_P(public_buf_m, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0));
|
||||
itoa(TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0), public_buf_m, 10);
|
||||
#endif
|
||||
break;
|
||||
case z_sensitivity:
|
||||
#if Z_SENSORLESS
|
||||
sprintf_P(public_buf_m, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0));
|
||||
itoa(TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0), public_buf_m, 10);
|
||||
#endif
|
||||
break;
|
||||
case z2_sensitivity:
|
||||
#if Z2_SENSORLESS
|
||||
sprintf_P(public_buf_m, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0));
|
||||
itoa(TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0), public_buf_m, 10);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
@@ -346,16 +343,16 @@ static void set_value_confirm() {
|
||||
case pause_pos_x: gCfgItems.pausePosX = atof(key_value); update_spi_flash(); break;
|
||||
case pause_pos_y: gCfgItems.pausePosY = atof(key_value); update_spi_flash(); break;
|
||||
case pause_pos_z: gCfgItems.pausePosZ = atof(key_value); update_spi_flash(); break;
|
||||
case level_pos_x1: gCfgItems.trammingPos[0][X_AXIS] = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_y1: gCfgItems.trammingPos[0][Y_AXIS] = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_x2: gCfgItems.trammingPos[1][X_AXIS] = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_y2: gCfgItems.trammingPos[1][Y_AXIS] = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_x3: gCfgItems.trammingPos[2][X_AXIS] = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_y3: gCfgItems.trammingPos[2][Y_AXIS] = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_x4: gCfgItems.trammingPos[3][X_AXIS] = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_y4: gCfgItems.trammingPos[3][Y_AXIS] = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_x5: gCfgItems.trammingPos[4][X_AXIS] = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_y5: gCfgItems.trammingPos[4][Y_AXIS] = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_x1: gCfgItems.trammingPos[0].x = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_y1: gCfgItems.trammingPos[0].y = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_x2: gCfgItems.trammingPos[1].x = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_y2: gCfgItems.trammingPos[1].y = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_x3: gCfgItems.trammingPos[2].x = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_y3: gCfgItems.trammingPos[2].y = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_x4: gCfgItems.trammingPos[3].x = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_y4: gCfgItems.trammingPos[3].y = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_x5: gCfgItems.trammingPos[4].x = atoi(key_value); update_spi_flash(); break;
|
||||
case level_pos_y5: gCfgItems.trammingPos[4].y = atoi(key_value); update_spi_flash(); break;
|
||||
#if HAS_BED_PROBE
|
||||
case x_offset: {
|
||||
#if HAS_PROBE_XY_OFFSET
|
||||
|
||||
@@ -60,16 +60,15 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
}
|
||||
|
||||
void lv_draw_pause_position() {
|
||||
char str_1[16];
|
||||
scr = lv_screen_create(PAUSE_POS_UI, machine_menu.PausePosText);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(gCfgItems.pausePosX, 1, 1, str_1));
|
||||
dtostrf(gCfgItems.pausePosX, 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.xPos, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PAUSE_X, 0, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(gCfgItems.pausePosY, 1, 1, str_1));
|
||||
dtostrf(gCfgItems.pausePosY, 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.yPos, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_PAUSE_Y, 1, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(gCfgItems.pausePosZ, 1, 1, str_1));
|
||||
dtostrf(gCfgItems.pausePosZ, 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.zPos, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_PAUSE_Z, 2, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_PAUSE_RETURN, true);
|
||||
|
||||
@@ -177,7 +177,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
}
|
||||
else {
|
||||
lv_clear_print_file();
|
||||
lv_draw_ready_print();
|
||||
TERN(MULTI_VOLUME, lv_draw_media_select(), lv_draw_ready_print());
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -248,6 +248,7 @@ static char test_public_buf_l[40];
|
||||
void disp_gcode_icon(uint8_t file_num) {
|
||||
uint8_t i;
|
||||
|
||||
// TODO: set current media title?!
|
||||
scr = lv_screen_create(PRINT_FILE_UI, "");
|
||||
|
||||
// Create image buttons
|
||||
|
||||
@@ -236,7 +236,7 @@ void disp_bed_temp() {
|
||||
}
|
||||
|
||||
void disp_fan_speed() {
|
||||
sprintf_P(public_buf_l, PSTR("%d%%"), thermalManager.fanPercent(thermalManager.fan_speed[0]));
|
||||
sprintf_P(public_buf_l, PSTR("%d%%"), thermalManager.fanSpeedPercent(0));
|
||||
lv_label_set_text(labelFan, public_buf_l);
|
||||
}
|
||||
|
||||
@@ -251,8 +251,7 @@ void disp_print_time() {
|
||||
}
|
||||
|
||||
void disp_fan_Zpos() {
|
||||
char str_1[16];
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(current_position[Z_AXIS], 1, 3, str_1));
|
||||
dtostrf(current_position.z, 1, 3, public_buf_l);
|
||||
lv_label_set_text(labelZpos, public_buf_l);
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
#define ICON_POS_Y 38
|
||||
#define TARGET_LABEL_MOD_Y -36
|
||||
#define LABEL_MOD_Y 30
|
||||
#define SECOND_EXT_MOD_Y 100
|
||||
|
||||
extern lv_group_t* g;
|
||||
static lv_obj_t *scr;
|
||||
@@ -74,7 +73,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
case ID_INFO_EXT: uiCfg.curTempType = 0; lv_draw_preHeat(); break;
|
||||
case ID_INFO_BED: uiCfg.curTempType = 1; lv_draw_preHeat(); break;
|
||||
case ID_INFO_FAN: lv_draw_fan(); break;
|
||||
case ID_PRINT: lv_draw_print_file(); break;
|
||||
case ID_PRINT: TERN(MULTI_VOLUME, lv_draw_media_select(), lv_draw_print_file()); break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -186,29 +185,38 @@ void lv_draw_ready_print() {
|
||||
// Monitoring
|
||||
lv_obj_t *buttonExt1 = lv_big_button_create(scr, "F:/bmp_ext1_state.bin", " ", 55, ICON_POS_Y, event_handler, ID_INFO_EXT);
|
||||
#if HAS_MULTI_EXTRUDER
|
||||
lv_obj_t *buttonExt2 = lv_big_button_create(scr, "F:/bmp_ext2_state.bin", " ", 55, ICON_POS_Y + SECOND_EXT_MOD_Y, event_handler, ID_INFO_EXT);
|
||||
#endif
|
||||
#if HAS_HEATED_BED
|
||||
lv_obj_t *buttonExt2 = lv_big_button_create(scr, "F:/bmp_ext2_state.bin", " ", 163, ICON_POS_Y, event_handler, ID_INFO_EXT);
|
||||
#if HAS_HEATED_BED
|
||||
lv_obj_t *buttonBedstate = lv_big_button_create(scr, "F:/bmp_bed_state.bin", " ", 271, ICON_POS_Y, event_handler, ID_INFO_BED);
|
||||
#endif
|
||||
#else
|
||||
#if HAS_HEATED_BED
|
||||
lv_obj_t *buttonBedstate = lv_big_button_create(scr, "F:/bmp_bed_state.bin", " ", 210, ICON_POS_Y, event_handler, ID_INFO_BED);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
lv_obj_t *buttonFanstate = lv_big_button_create(scr, "F:/bmp_fan_state.bin", " ", 380, ICON_POS_Y, event_handler, ID_INFO_FAN);
|
||||
|
||||
labelExt1 = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr);
|
||||
labelExt1Target = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr);
|
||||
|
||||
#if HAS_MULTI_EXTRUDER
|
||||
labelExt2 = lv_label_create(scr, 55, LABEL_MOD_Y + SECOND_EXT_MOD_Y, nullptr);
|
||||
labelExt2Target = lv_label_create(scr, 55, LABEL_MOD_Y + SECOND_EXT_MOD_Y, nullptr);
|
||||
#endif
|
||||
|
||||
#if HAS_HEATED_BED
|
||||
labelBed = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr);
|
||||
labelBedTarget = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr);
|
||||
labelExt2 = lv_label_create(scr, 163, LABEL_MOD_Y, nullptr);
|
||||
labelExt2Target = lv_label_create(scr, 163, LABEL_MOD_Y, nullptr);
|
||||
#if HAS_HEATED_BED
|
||||
labelBed = lv_label_create(scr, 271, LABEL_MOD_Y, nullptr);
|
||||
labelBedTarget = lv_label_create(scr, 271, LABEL_MOD_Y, nullptr);
|
||||
#endif
|
||||
#else
|
||||
#if HAS_HEATED_BED
|
||||
labelBed = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr);
|
||||
labelBedTarget = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
labelFan = lv_label_create(scr, 380, 80, nullptr);
|
||||
|
||||
sprintf_P(buf, PSTR("%d"), (int)thermalManager.degHotend(0));
|
||||
itoa(thermalManager.degHotend(0), buf, 10);
|
||||
lv_label_set_text(labelExt1, buf);
|
||||
lv_obj_align(labelExt1, buttonExt1, LV_ALIGN_CENTER, 0, LABEL_MOD_Y);
|
||||
sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetHotend(0));
|
||||
@@ -216,7 +224,7 @@ void lv_draw_ready_print() {
|
||||
lv_obj_align(labelExt1Target, buttonExt1, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y);
|
||||
|
||||
#if HAS_MULTI_EXTRUDER
|
||||
sprintf_P(buf, PSTR("%d"), (int)thermalManager.degHotend(1));
|
||||
itoa(thermalManager.degHotend(1), buf, 10);
|
||||
lv_label_set_text(labelExt2, buf);
|
||||
lv_obj_align(labelExt2, buttonExt2, LV_ALIGN_CENTER, 0, LABEL_MOD_Y);
|
||||
sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetHotend(1));
|
||||
@@ -225,7 +233,7 @@ void lv_draw_ready_print() {
|
||||
#endif
|
||||
|
||||
#if HAS_HEATED_BED
|
||||
sprintf_P(buf, PSTR("%d"), (int)thermalManager.degBed());
|
||||
itoa(thermalManager.degBed(), buf, 10);
|
||||
lv_label_set_text(labelBed, buf);
|
||||
lv_obj_align(labelBed, buttonBedstate, LV_ALIGN_CENTER, 0, LABEL_MOD_Y);
|
||||
sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetBed());
|
||||
@@ -233,7 +241,7 @@ void lv_draw_ready_print() {
|
||||
lv_obj_align(labelBedTarget, buttonBedstate, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y);
|
||||
#endif
|
||||
|
||||
sprintf_P(buf, PSTR("%d%%"), thermalManager.fanPercent(thermalManager.fan_speed[0]));
|
||||
sprintf_P(buf, PSTR("%d%%"), (int)thermalManager.fanSpeedPercent(0));
|
||||
lv_label_set_text(labelFan, buf);
|
||||
lv_obj_align(labelFan, buttonFanstate, LV_ALIGN_CENTER, 0, LABEL_MOD_Y);
|
||||
}
|
||||
|
||||
@@ -79,26 +79,25 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
}
|
||||
|
||||
void lv_draw_step_settings() {
|
||||
char str_1[16];
|
||||
scr = lv_screen_create(STEPS_UI, machine_menu.StepsConfTitle);
|
||||
|
||||
if (!uiCfg.para_ui_page) {
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.X_Steps, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_STEP_X, 0, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Y_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_STEP_Y, 1, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Z_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_STEP_Z, 2, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, str_1));
|
||||
dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.E0_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_STEP_E0, 3, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_STEP_DOWN, true);
|
||||
}
|
||||
else {
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS_N(1)], 1, 1, str_1));
|
||||
dtostrf(planner.settings.axis_steps_per_mm[E_AXIS_N(1)], 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.E1_Steps, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_STEP_E1, 0, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_STEP_UP, true);
|
||||
|
||||
@@ -95,14 +95,13 @@ void lv_draw_tmc_current_settings() {
|
||||
scr = lv_screen_create(TMC_CURRENT_UI, machine_menu.TmcCurrentConfTitle);
|
||||
|
||||
float milliamps;
|
||||
char str_1[16];
|
||||
if (!uiCfg.para_ui_page) {
|
||||
#if AXIS_IS_TMC(X)
|
||||
milliamps = stepperX.getMilliamps();
|
||||
#else
|
||||
milliamps = -1;
|
||||
#endif
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
|
||||
dtostrf(milliamps, 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.X_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_X, 0, public_buf_l);
|
||||
|
||||
#if AXIS_IS_TMC(Y)
|
||||
@@ -110,7 +109,7 @@ void lv_draw_tmc_current_settings() {
|
||||
#else
|
||||
milliamps = -1;
|
||||
#endif
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
|
||||
dtostrf(milliamps, 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Y_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_TMC_CURRENT_Y, 1, public_buf_l);
|
||||
|
||||
#if AXIS_IS_TMC(Z)
|
||||
@@ -118,7 +117,7 @@ void lv_draw_tmc_current_settings() {
|
||||
#else
|
||||
milliamps = -1;
|
||||
#endif
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
|
||||
dtostrf(milliamps, 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.Z_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_TMC_CURRENT_Z, 2, public_buf_l);
|
||||
|
||||
#if AXIS_IS_TMC(E0)
|
||||
@@ -126,7 +125,7 @@ void lv_draw_tmc_current_settings() {
|
||||
#else
|
||||
milliamps = -1;
|
||||
#endif
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
|
||||
dtostrf(milliamps, 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.E0_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_TMC_CURRENT_E0, 3, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_CURRENT_DOWN, true);
|
||||
@@ -137,7 +136,7 @@ void lv_draw_tmc_current_settings() {
|
||||
#else
|
||||
milliamps = -1;
|
||||
#endif
|
||||
sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
|
||||
dtostrf(milliamps, 1, 1, public_buf_l);
|
||||
lv_screen_menu_item_1_edit(scr, machine_menu.E1_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_E1, 0, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_CURRENT_UP, true);
|
||||
|
||||
@@ -107,27 +107,27 @@ void lv_draw_tramming_pos_settings() {
|
||||
scr = lv_screen_create(MANUAL_LEVELING_POSIGION_UI, machine_menu.LevelingParaConfTitle);
|
||||
|
||||
if (!uiCfg.para_ui_page) {
|
||||
sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[0][X_AXIS]);
|
||||
sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[0][Y_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[0].x, public_buf_l, 10);
|
||||
itoa(gCfgItems.trammingPos[0].y, buf2, 10);
|
||||
lv_screen_menu_item_2_edit(scr, leveling_menu.position1, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y1, 0, buf2, ID_MANUAL_POS_X1, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[1][X_AXIS]);
|
||||
sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[1][Y_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[1].x, public_buf_l, 10);
|
||||
itoa(gCfgItems.trammingPos[1].y, buf2, 10);
|
||||
lv_screen_menu_item_2_edit(scr, leveling_menu.position2, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_MANUAL_POS_Y2, 1, buf2, ID_MANUAL_POS_X2, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[2][X_AXIS]);
|
||||
sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[2][Y_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[2].x, public_buf_l, 10);
|
||||
itoa(gCfgItems.trammingPos[2].y, buf2, 10);
|
||||
lv_screen_menu_item_2_edit(scr, leveling_menu.position3, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_MANUAL_POS_Y3, 2, buf2, ID_MANUAL_POS_X3, public_buf_l);
|
||||
|
||||
sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[3][X_AXIS]);
|
||||
sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[3][Y_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[3].x, public_buf_l, 10);
|
||||
itoa(gCfgItems.trammingPos[3].y, buf2, 10);
|
||||
lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_MANUAL_POS_Y4, 3, buf2, ID_MANUAL_POS_X4, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_DOWN, true);
|
||||
}
|
||||
else {
|
||||
sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[4][X_AXIS]);
|
||||
sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[4][Y_AXIS]);
|
||||
itoa(gCfgItems.trammingPos[4].x, public_buf_l, 10);
|
||||
itoa(gCfgItems.trammingPos[4].y, buf2, 10);
|
||||
lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y5, 0, buf2, ID_MANUAL_POS_X5, public_buf_l);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_UP, true);
|
||||
|
||||
@@ -125,16 +125,16 @@ void gCfgItems_init() {
|
||||
gCfgItems.pausePosX = -1;
|
||||
gCfgItems.pausePosY = -1;
|
||||
gCfgItems.pausePosZ = 5;
|
||||
gCfgItems.trammingPos[0][X_AXIS] = X_MIN_POS + 30;
|
||||
gCfgItems.trammingPos[0][Y_AXIS] = Y_MIN_POS + 30;
|
||||
gCfgItems.trammingPos[1][X_AXIS] = X_MAX_POS - 30;
|
||||
gCfgItems.trammingPos[1][Y_AXIS] = Y_MIN_POS + 30;
|
||||
gCfgItems.trammingPos[2][X_AXIS] = X_MAX_POS - 30;
|
||||
gCfgItems.trammingPos[2][Y_AXIS] = Y_MAX_POS - 30;
|
||||
gCfgItems.trammingPos[3][X_AXIS] = X_MIN_POS + 30;
|
||||
gCfgItems.trammingPos[3][Y_AXIS] = Y_MAX_POS - 30;
|
||||
gCfgItems.trammingPos[4][X_AXIS] = X_BED_SIZE / 2;
|
||||
gCfgItems.trammingPos[4][Y_AXIS] = Y_BED_SIZE / 2;
|
||||
gCfgItems.trammingPos[0].x = X_MIN_POS + 30;
|
||||
gCfgItems.trammingPos[0].y = Y_MIN_POS + 30;
|
||||
gCfgItems.trammingPos[1].x = X_MAX_POS - 30;
|
||||
gCfgItems.trammingPos[1].y = Y_MIN_POS + 30;
|
||||
gCfgItems.trammingPos[2].x = X_MAX_POS - 30;
|
||||
gCfgItems.trammingPos[2].y = Y_MAX_POS - 30;
|
||||
gCfgItems.trammingPos[3].x = X_MIN_POS + 30;
|
||||
gCfgItems.trammingPos[3].y = Y_MAX_POS - 30;
|
||||
gCfgItems.trammingPos[4].x = X_BED_SIZE / 2;
|
||||
gCfgItems.trammingPos[4].y = Y_BED_SIZE / 2;
|
||||
gCfgItems.cloud_enable = false;
|
||||
gCfgItems.wifi_mode_sel = STA_MODEL;
|
||||
gCfgItems.fileSysType = FILE_SYS_SD;
|
||||
@@ -447,111 +447,63 @@ char *getDispText(int index) {
|
||||
ZERO(public_buf_l);
|
||||
|
||||
switch (disp_state_stack._disp_state[index]) {
|
||||
case PRINT_READY_UI:
|
||||
strcpy(public_buf_l, main_menu.title);
|
||||
break;
|
||||
case PRINT_FILE_UI:
|
||||
strcpy(public_buf_l, file_menu.title);
|
||||
break;
|
||||
case PRINT_READY_UI: strcpy(public_buf_l, main_menu.title); break;
|
||||
case PRINT_FILE_UI: strcpy(public_buf_l, file_menu.title); break;
|
||||
case PRINTING_UI:
|
||||
if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
|
||||
#ifndef TFT35
|
||||
|| disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
|
||||
|| disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
|
||||
#endif
|
||||
) strcpy(public_buf_l, common_menu.print_special_title);
|
||||
else strcpy(public_buf_l, printing_menu.title);
|
||||
break;
|
||||
case MOVE_MOTOR_UI:
|
||||
strcpy(public_buf_l, move_menu.title);
|
||||
switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
|
||||
IF_DISABLED(TFT35, case OPERATE_UI: case PAUSE_UI:)
|
||||
case PRINTING_UI: strcpy(public_buf_l, common_menu.print_special_title); break;
|
||||
default: strcpy(public_buf_l, printing_menu.title); break;
|
||||
}
|
||||
break;
|
||||
case MOVE_MOTOR_UI: strcpy(public_buf_l, move_menu.title); break;
|
||||
case OPERATE_UI:
|
||||
if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
|
||||
#ifndef TFT35
|
||||
|| disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
|
||||
|| disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
|
||||
#endif
|
||||
) strcpy(public_buf_l, common_menu.operate_special_title);
|
||||
else strcpy(public_buf_l, operation_menu.title);
|
||||
switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
|
||||
IF_DISABLED(TFT35, case OPERATE_UI: case PAUSE_UI:)
|
||||
case PRINTING_UI: strcpy(public_buf_l, common_menu.operate_special_title); break;
|
||||
default: strcpy(public_buf_l, operation_menu.title); break;
|
||||
}
|
||||
break;
|
||||
|
||||
case PAUSE_UI:
|
||||
if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
|
||||
|| disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
|
||||
|| disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
|
||||
) strcpy(public_buf_l, common_menu.pause_special_title);
|
||||
else strcpy(public_buf_l, pause_menu.title);
|
||||
break;
|
||||
|
||||
case EXTRUSION_UI:
|
||||
strcpy(public_buf_l, extrude_menu.title);
|
||||
break;
|
||||
case CHANGE_SPEED_UI:
|
||||
strcpy(public_buf_l, speed_menu.title);
|
||||
break;
|
||||
case FAN_UI:
|
||||
strcpy(public_buf_l, fan_menu.title);
|
||||
switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
|
||||
case OPERATE_UI:
|
||||
case PAUSE_UI:
|
||||
case PRINTING_UI: strcpy(public_buf_l, common_menu.pause_special_title); break;
|
||||
default: strcpy(public_buf_l, pause_menu.title); break;
|
||||
}
|
||||
break;
|
||||
case EXTRUSION_UI: strcpy(public_buf_l, extrude_menu.title); break;
|
||||
case CHANGE_SPEED_UI: strcpy(public_buf_l, speed_menu.title); break;
|
||||
case FAN_UI: strcpy(public_buf_l, fan_menu.title); break;
|
||||
case PRE_HEAT_UI:
|
||||
if ((disp_state_stack._disp_state[disp_state_stack._disp_index - 1] == OPERATE_UI))
|
||||
strcpy(public_buf_l, preheat_menu.adjust_title);
|
||||
else strcpy(public_buf_l, preheat_menu.title);
|
||||
break;
|
||||
case SET_UI:
|
||||
strcpy(public_buf_l, set_menu.title);
|
||||
break;
|
||||
case ZERO_UI:
|
||||
strcpy(public_buf_l, home_menu.title);
|
||||
break;
|
||||
case SPRAYER_UI: break;
|
||||
case MACHINE_UI: break;
|
||||
case LANGUAGE_UI:
|
||||
strcpy(public_buf_l, language_menu.title);
|
||||
break;
|
||||
case ABOUT_UI:
|
||||
strcpy(public_buf_l, about_menu.title);
|
||||
break;
|
||||
case LOG_UI: break;
|
||||
case DISK_UI:
|
||||
strcpy(public_buf_l, filesys_menu.title);
|
||||
break;
|
||||
case DIALOG_UI:
|
||||
strcpy(public_buf_l, common_menu.dialog_confirm_title);
|
||||
break;
|
||||
case WIFI_UI:
|
||||
strcpy(public_buf_l, wifi_menu.title);
|
||||
switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
|
||||
case OPERATE_UI: strcpy(public_buf_l, preheat_menu.adjust_title);
|
||||
default: strcpy(public_buf_l, preheat_menu.title); break;
|
||||
}
|
||||
break;
|
||||
case SET_UI: strcpy(public_buf_l, set_menu.title); break;
|
||||
case ZERO_UI: strcpy(public_buf_l, home_menu.title); break;
|
||||
case SPRAYER_UI: break;
|
||||
case MACHINE_UI: break;
|
||||
case LANGUAGE_UI: strcpy(public_buf_l, language_menu.title); break;
|
||||
case ABOUT_UI: strcpy(public_buf_l, about_menu.title); break;
|
||||
case LOG_UI: break;
|
||||
case DISK_UI: strcpy(public_buf_l, filesys_menu.title); break;
|
||||
case DIALOG_UI: strcpy(public_buf_l, common_menu.dialog_confirm_title); break;
|
||||
case WIFI_UI: strcpy(public_buf_l, wifi_menu.title); break;
|
||||
case MORE_UI:
|
||||
case PRINT_MORE_UI:
|
||||
strcpy(public_buf_l, more_menu.title);
|
||||
break;
|
||||
case FILAMENTCHANGE_UI:
|
||||
strcpy(public_buf_l, filament_menu.title);
|
||||
break;
|
||||
case PRINT_MORE_UI: strcpy(public_buf_l, more_menu.title); break;
|
||||
case FILAMENTCHANGE_UI: strcpy(public_buf_l, filament_menu.title); break;
|
||||
case LEVELING_UI:
|
||||
case MESHLEVELING_UI:
|
||||
strcpy(public_buf_l, leveling_menu.title);
|
||||
break;
|
||||
case BIND_UI:
|
||||
strcpy(public_buf_l, cloud_menu.title);
|
||||
break;
|
||||
case TOOL_UI:
|
||||
strcpy(public_buf_l, tool_menu.title);
|
||||
break;
|
||||
case WIFI_LIST_UI:
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
strcpy(public_buf_l, list_menu.title);
|
||||
break;
|
||||
#endif
|
||||
case MACHINE_PARA_UI:
|
||||
strcpy(public_buf_l, MachinePara_menu.title);
|
||||
break;
|
||||
case BABY_STEP_UI:
|
||||
strcpy(public_buf_l, operation_menu.babystep);
|
||||
break;
|
||||
case EEPROM_SETTINGS_UI:
|
||||
strcpy(public_buf_l, eeprom_menu.title);
|
||||
break;
|
||||
case MESHLEVELING_UI: strcpy(public_buf_l, leveling_menu.title); break;
|
||||
case BIND_UI: strcpy(public_buf_l, cloud_menu.title); break;
|
||||
case TOOL_UI: strcpy(public_buf_l, tool_menu.title); break;
|
||||
case WIFI_LIST_UI: TERN_(MKS_WIFI_MODULE, strcpy(public_buf_l, list_menu.title)); break;
|
||||
case MACHINE_PARA_UI: strcpy(public_buf_l, MachinePara_menu.title); break;
|
||||
case BABY_STEP_UI: strcpy(public_buf_l, operation_menu.babystep); break;
|
||||
case EEPROM_SETTINGS_UI: strcpy(public_buf_l, eeprom_menu.title); break;
|
||||
case MEDIA_SELECT_UI: strcpy(public_buf_l, media_select_menu.title); break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
@@ -828,11 +780,9 @@ void GUI_RefreshPage() {
|
||||
}
|
||||
break;
|
||||
|
||||
case OPERATE_UI:
|
||||
break;
|
||||
case OPERATE_UI: break;
|
||||
|
||||
case PAUSE_UI:
|
||||
break;
|
||||
case PAUSE_UI: break;
|
||||
|
||||
case FAN_UI:
|
||||
if (temps_update_flag) {
|
||||
@@ -841,8 +791,7 @@ void GUI_RefreshPage() {
|
||||
}
|
||||
break;
|
||||
|
||||
case MOVE_MOTOR_UI:
|
||||
break;
|
||||
case MOVE_MOTOR_UI: break;
|
||||
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_UI:
|
||||
@@ -852,10 +801,9 @@ void GUI_RefreshPage() {
|
||||
}
|
||||
break;
|
||||
|
||||
case BIND_UI:
|
||||
refresh_bind_ui();
|
||||
break;
|
||||
case BIND_UI: refresh_bind_ui(); break;
|
||||
#endif
|
||||
|
||||
case FILAMENTCHANGE_UI:
|
||||
if (temps_update_flag) {
|
||||
temps_update_flag = false;
|
||||
@@ -866,10 +814,8 @@ void GUI_RefreshPage() {
|
||||
filament_dialog_handle();
|
||||
TERN_(MKS_WIFI_MODULE, wifi_scan_handle());
|
||||
break;
|
||||
case MESHLEVELING_UI:
|
||||
break;
|
||||
case HARDWARE_TEST_UI:
|
||||
break;
|
||||
case MESHLEVELING_UI: break;
|
||||
case HARDWARE_TEST_UI: break;
|
||||
case WIFI_LIST_UI:
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
if (printing_rate_update_flag) {
|
||||
@@ -878,8 +824,8 @@ void GUI_RefreshPage() {
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case KEY_BOARD_UI:
|
||||
break;
|
||||
case KEYBOARD_UI: break;
|
||||
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_TIPS_UI:
|
||||
switch (wifi_tips_type) {
|
||||
@@ -932,6 +878,7 @@ void GUI_RefreshPage() {
|
||||
disp_z_offset_value();
|
||||
}
|
||||
break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
|
||||
@@ -982,7 +929,7 @@ void clear_cur_ui() {
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_LIST_UI: lv_clear_wifi_list(); break;
|
||||
#endif
|
||||
case KEY_BOARD_UI: lv_clear_keyboard(); break;
|
||||
case KEYBOARD_UI: lv_clear_keyboard(); break;
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_TIPS_UI: lv_clear_wifi_tips(); break;
|
||||
#endif
|
||||
@@ -1013,9 +960,9 @@ void clear_cur_ui() {
|
||||
case NUMBER_KEY_UI: lv_clear_number_key(); break;
|
||||
case BABY_STEP_UI: lv_clear_baby_stepping(); break;
|
||||
case PAUSE_POS_UI: lv_clear_pause_position(); break;
|
||||
#if HAS_TRINAMIC_CONFIG
|
||||
case TMC_CURRENT_UI: lv_clear_tmc_current_settings(); break;
|
||||
#endif
|
||||
#if HAS_TRINAMIC_CONFIG
|
||||
case TMC_CURRENT_UI: lv_clear_tmc_current_settings(); break;
|
||||
#endif
|
||||
case EEPROM_SETTINGS_UI: lv_clear_eeprom_settings(); break;
|
||||
#if HAS_STEALTHCHOP
|
||||
case TMC_MODE_UI: lv_clear_tmc_step_mode_settings(); break;
|
||||
@@ -1032,6 +979,9 @@ void clear_cur_ui() {
|
||||
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
|
||||
case TOUCH_CALIBRATION_UI: lv_clear_touch_calibration_screen(); break;
|
||||
#endif
|
||||
#if ENABLED(MULTI_VOLUME)
|
||||
case MEDIA_SELECT_UI: lv_clear_media_select(); break;
|
||||
#endif
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
@@ -1087,7 +1037,7 @@ void draw_return_ui() {
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_LIST_UI: lv_draw_wifi_list(); break;
|
||||
#endif
|
||||
case KEY_BOARD_UI: lv_draw_keyboard(); break;
|
||||
case KEYBOARD_UI: lv_draw_keyboard(); break;
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_TIPS_UI: lv_draw_wifi_tips(); break;
|
||||
#endif
|
||||
|
||||
@@ -76,6 +76,7 @@
|
||||
#include "draw_homing_sensitivity_settings.h"
|
||||
#include "draw_baby_stepping.h"
|
||||
#include "draw_keyboard.h"
|
||||
#include "draw_media_select.h"
|
||||
#include "draw_encoder_settings.h"
|
||||
|
||||
#include "../../../../inc/MarlinConfigPre.h"
|
||||
@@ -197,7 +198,7 @@ typedef struct {
|
||||
uint8_t wifi_type;
|
||||
bool cloud_enable,
|
||||
encoder_enable;
|
||||
int trammingPos[5][2]; // XY
|
||||
xy_int_t trammingPos[5];
|
||||
int filamentchange_load_length,
|
||||
filamentchange_load_speed,
|
||||
filamentchange_unload_length,
|
||||
@@ -289,7 +290,7 @@ typedef enum {
|
||||
TOOL_UI,
|
||||
HARDWARE_TEST_UI,
|
||||
WIFI_LIST_UI,
|
||||
KEY_BOARD_UI,
|
||||
KEYBOARD_UI,
|
||||
WIFI_TIPS_UI,
|
||||
MACHINE_PARA_UI,
|
||||
MACHINE_SETTINGS_UI,
|
||||
@@ -327,6 +328,7 @@ typedef enum {
|
||||
ENCODER_SETTINGS_UI,
|
||||
TOUCH_CALIBRATION_UI,
|
||||
GCODE_UI,
|
||||
MEDIA_SELECT_UI,
|
||||
} DISP_STATE;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -197,6 +197,13 @@ static const char assets[][LONG_FILENAME_LENGTH] = {
|
||||
"bmp_cloud.bin",
|
||||
#endif
|
||||
|
||||
#if ENABLED(MULTI_VOLUME)
|
||||
"bmp_usb_disk.bin",
|
||||
// "bmp_usb_disk_sel.bin",
|
||||
"bmp_sd.bin",
|
||||
// "bmp_sd_sel.bin",
|
||||
#endif
|
||||
|
||||
// Babystep screen
|
||||
"bmp_baby_move0_01.bin",
|
||||
"bmp_baby_move0_05.bin",
|
||||
|
||||
@@ -540,6 +540,7 @@
|
||||
#define USB_DRIVE_BACK_EN "< Back"
|
||||
#define FILE_PAGES_EN "%d/%d"
|
||||
#define FILE_NEXT_PAGE_EN "Next Page"
|
||||
#define MEDIA_SELECT_TITLE_EN "Select Media"
|
||||
|
||||
//BUILD PLATE
|
||||
#define PLATE_TITLE_EN "Build Plate"
|
||||
|
||||
@@ -56,6 +56,7 @@ tool_menu_def tool_menu;
|
||||
MachinePara_menu_def MachinePara_menu;
|
||||
pause_msg_def pause_msg_menu;
|
||||
eeprom_def eeprom_menu;
|
||||
media_select_menu_def media_select_menu;
|
||||
|
||||
machine_common_def machine_menu;
|
||||
void machine_setting_disp() {
|
||||
@@ -821,6 +822,10 @@ void disp_language_init() {
|
||||
|
||||
filament_menu.stat_temp = TEXT_VALUE;
|
||||
|
||||
media_select_menu.title = MEDIA_SELECT_TITLE_EN;
|
||||
media_select_menu.sd_disk = SD_CARD_TITLE_EN;
|
||||
media_select_menu.usb_disk = USB_DRIVE_TITLE_EN;
|
||||
|
||||
machine_menu.key_0 = KEYBOARD_KEY0_EN;
|
||||
machine_menu.key_1 = KEYBOARD_KEY1_EN;
|
||||
machine_menu.key_2 = KEYBOARD_KEY2_EN;
|
||||
|
||||
@@ -706,6 +706,14 @@ typedef struct tool_menu_disp {
|
||||
|
||||
extern tool_menu_def tool_menu;
|
||||
|
||||
typedef struct media_select_menu_disp {
|
||||
const char *title;
|
||||
const char *sd_disk;
|
||||
const char *usb_disk;
|
||||
} media_select_menu_def;
|
||||
|
||||
extern media_select_menu_def media_select_menu;
|
||||
|
||||
typedef struct MachinePara_menu_disp {
|
||||
const char *title;
|
||||
const char *MachineSetting;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user