Merge branch 'bugfix-2.0.x' into CR-6Devel
This commit is contained in:
@@ -1568,7 +1568,9 @@
|
||||
|
||||
// @section temperature
|
||||
|
||||
// Preheat Constants
|
||||
//
|
||||
// Preheat Constants - Up to 5 are supported without changes
|
||||
//
|
||||
#define PREHEAT_1_LABEL "PLA"
|
||||
#define PREHEAT_1_TEMP_HOTEND 200
|
||||
#define PREHEAT_1_TEMP_BED 60
|
||||
@@ -2403,6 +2405,10 @@
|
||||
//#define TOUCH_OFFSET_Y 257
|
||||
//#define TOUCH_ORIENTATION TOUCH_LANDSCAPE
|
||||
|
||||
#if BOTH(TOUCH_SCREEN_CALIBRATION, EEPROM_SETTINGS)
|
||||
#define TOUCH_CALIBRATION_AUTO_SAVE // Auto save successful calibration values to EEPROM
|
||||
#endif
|
||||
|
||||
#if ENABLED(TFT_COLOR_UI)
|
||||
//#define SINGLE_TOUCH_NAVIGATION
|
||||
#endif
|
||||
|
||||
@@ -1526,7 +1526,7 @@
|
||||
//
|
||||
// Specify additional languages for the UI. Default specified by LCD_LANGUAGE.
|
||||
//
|
||||
#if EITHER(DOGLCD, TOUCH_UI_FTDI_EVE)
|
||||
#if ANY(DOGLCD, TFT_COLOR_UI, TOUCH_UI_FTDI_EVE)
|
||||
//#define LCD_LANGUAGE_2 fr
|
||||
//#define LCD_LANGUAGE_3 de
|
||||
//#define LCD_LANGUAGE_4 es
|
||||
@@ -3339,7 +3339,8 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* User-defined menu items that execute custom GCode
|
||||
* User-defined menu items to run custom G-code.
|
||||
* Up to 25 may be defined, but the actual number is LCD-dependent.
|
||||
*/
|
||||
//#define CUSTOM_USER_MENUS
|
||||
#if ENABLED(CUSTOM_USER_MENUS)
|
||||
|
||||
@@ -82,14 +82,14 @@ typedef int8_t pin_t;
|
||||
|
||||
// Serial ports
|
||||
#ifdef USBCON
|
||||
#include "../../core/serial_hook.h"
|
||||
#include "../../core/serial_hook.h"
|
||||
typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial;
|
||||
extern DefaultSerial MSerial;
|
||||
#ifdef BLUETOOTH
|
||||
typedef ForwardSerial0Type< decltype(bluetoothSerial) > BTSerial;
|
||||
extern BTSerial btSerial;
|
||||
#endif
|
||||
|
||||
|
||||
#define MYSERIAL0 TERN(BLUETOOTH, btSerial, MSerial)
|
||||
#else
|
||||
#if !WITHIN(SERIAL_PORT, -1, 3)
|
||||
|
||||
@@ -240,7 +240,7 @@
|
||||
}
|
||||
|
||||
// all the others
|
||||
static uint32_t spiDelayCyclesX4 = (F_CPU) / 1000000; // 4µs => 125khz
|
||||
static uint32_t spiDelayCyclesX4 = 4 * (F_CPU) / 1000000; // 4µs => 125khz
|
||||
|
||||
static uint8_t spiTransferX(uint8_t b) { // using Mode 0
|
||||
int bits = 8;
|
||||
@@ -249,12 +249,12 @@
|
||||
b <<= 1; // little setup time
|
||||
|
||||
WRITE(SD_SCK_PIN, HIGH);
|
||||
__delay_4cycles(spiDelayCyclesX4);
|
||||
DELAY_CYCLES(spiDelayCyclesX4);
|
||||
|
||||
b |= (READ(SD_MISO_PIN) != 0);
|
||||
|
||||
WRITE(SD_SCK_PIN, LOW);
|
||||
__delay_4cycles(spiDelayCyclesX4);
|
||||
DELAY_CYCLES(spiDelayCyclesX4);
|
||||
} while (--bits);
|
||||
return b;
|
||||
}
|
||||
@@ -510,7 +510,7 @@
|
||||
spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
||||
break;
|
||||
default:
|
||||
spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate);
|
||||
spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate) << 2; // spiRate of 2 gives the maximum error with current CPU
|
||||
spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
||||
spiTransferRx = (pfnSpiTransfer)spiTransferX;
|
||||
spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
|
||||
#if ENABLED(U8GLIB_ST7920)
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
#include "../../shared/Delay.h"
|
||||
|
||||
#include <U8glib.h>
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
|
||||
#if HAS_MARLINUI_U8GLIB
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
#include "../../shared/Delay.h"
|
||||
|
||||
#include <U8glib.h>
|
||||
|
||||
@@ -63,7 +63,11 @@ int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) {
|
||||
return ind > -1 ? ind : dval;
|
||||
}
|
||||
|
||||
void flashFirmware(const int16_t) { NVIC_SystemReset(); }
|
||||
void flashFirmware(const int16_t) {
|
||||
USB_Connect(false); // USB clear connection
|
||||
delay(2000); // Give OS time to notice
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
void HAL_clear_reset_source(void) {
|
||||
TERN_(USE_WATCHDOG, watchdog_clear_timeout_flag());
|
||||
|
||||
@@ -24,19 +24,19 @@
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
#include "MarlinSerial.h"
|
||||
|
||||
#if USING_SERIAL_0
|
||||
#if ANY_SERIAL_IS(0)
|
||||
MSerialT MSerial(true, LPC_UART0);
|
||||
extern "C" void UART0_IRQHandler() { MSerial.IRQHandler(); }
|
||||
#endif
|
||||
#if USING_SERIAL_1
|
||||
#if ANY_SERIAL_IS(1)
|
||||
MSerialT MSerial1(true, (LPC_UART_TypeDef *) LPC_UART1);
|
||||
extern "C" void UART1_IRQHandler() { MSerial1.IRQHandler(); }
|
||||
#endif
|
||||
#if USING_SERIAL_2
|
||||
#if ANY_SERIAL_IS(2)
|
||||
MSerialT MSerial2(true, LPC_UART2);
|
||||
extern "C" void UART2_IRQHandler() { MSerial2.IRQHandler(); }
|
||||
#endif
|
||||
#if USING_SERIAL_3
|
||||
#if ANY_SERIAL_IS(3)
|
||||
MSerialT MSerial3(true, LPC_UART3);
|
||||
extern "C" void UART3_IRQHandler() { MSerial3.IRQHandler(); }
|
||||
#endif
|
||||
|
||||
@@ -92,7 +92,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
||||
#define ANY_TX(N,V...) DO(IS_TX##N,||,V)
|
||||
#define ANY_RX(N,V...) DO(IS_RX##N,||,V)
|
||||
|
||||
#if USING_SERIAL_0
|
||||
#if ANY_SERIAL_IS(0)
|
||||
#define IS_TX0(P) (P == P0_02)
|
||||
#define IS_RX0(P) (P == P0_03)
|
||||
#if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI)
|
||||
@@ -106,7 +106,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
||||
#undef IS_RX0
|
||||
#endif
|
||||
|
||||
#if USING_SERIAL_1
|
||||
#if ANY_SERIAL_IS(1)
|
||||
#define IS_TX1(P) (P == P0_15)
|
||||
#define IS_RX1(P) (P == P0_16)
|
||||
#define _IS_TX1_1 IS_TX1
|
||||
@@ -127,7 +127,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
||||
#undef _IS_RX1_1
|
||||
#endif
|
||||
|
||||
#if USING_SERIAL_2
|
||||
#if ANY_SERIAL_IS(2)
|
||||
#define IS_TX2(P) (P == P0_10)
|
||||
#define IS_RX2(P) (P == P0_11)
|
||||
#define _IS_TX2_1 IS_TX2
|
||||
@@ -161,7 +161,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
||||
#undef _IS_RX2_1
|
||||
#endif
|
||||
|
||||
#if USING_SERIAL_3
|
||||
#if ANY_SERIAL_IS(3)
|
||||
#define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00)
|
||||
#define PIN_IS_RX3(P) (P##_PIN == P0_01)
|
||||
#if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX)
|
||||
|
||||
@@ -119,9 +119,9 @@ void HAL_init() {
|
||||
#endif
|
||||
|
||||
USB_Init(); // USB Initialization
|
||||
USB_Connect(FALSE); // USB clear connection
|
||||
USB_Connect(false); // USB clear connection
|
||||
delay(1000); // Give OS time to notice
|
||||
USB_Connect(TRUE);
|
||||
USB_Connect(true);
|
||||
|
||||
#if HAS_SD_HOST_DRIVE
|
||||
MSC_SD_Init(0); // Enable USB SD card access
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
|
||||
#if USING_SERIAL_1
|
||||
#if ANY_SERIAL_IS(1)
|
||||
UartT Serial2(false, &sercom4, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX);
|
||||
void SERCOM4_0_Handler() { Serial2.IrqHandler(); }
|
||||
void SERCOM4_1_Handler() { Serial2.IrqHandler(); }
|
||||
@@ -35,7 +35,7 @@
|
||||
void SERCOM4_3_Handler() { Serial2.IrqHandler(); }
|
||||
#endif
|
||||
|
||||
#if USING_SERIAL_2
|
||||
#if ANY_SERIAL_IS(2)
|
||||
UartT Serial3(false, &sercom1, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX);
|
||||
void SERCOM1_0_Handler() { Serial3.IrqHandler(); }
|
||||
void SERCOM1_1_Handler() { Serial3.IrqHandler(); }
|
||||
@@ -43,7 +43,7 @@
|
||||
void SERCOM1_3_Handler() { Serial3.IrqHandler(); }
|
||||
#endif
|
||||
|
||||
#if USING_SERIAL_3
|
||||
#if ANY_SERIAL_IS(3)
|
||||
UartT Serial4(false, &sercom5, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX, PAD_SERIAL4_TX);
|
||||
void SERCOM5_0_Handler() { Serial4.IrqHandler(); }
|
||||
void SERCOM5_1_Handler() { Serial4.IrqHandler(); }
|
||||
|
||||
@@ -42,6 +42,11 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if HAS_SD_HOST_DRIVE
|
||||
#include "msc_sd.h"
|
||||
#include "usbd_cdc_if.h"
|
||||
#endif
|
||||
|
||||
// ------------------------
|
||||
// Public Variables
|
||||
// ------------------------
|
||||
@@ -52,17 +57,6 @@ uint16_t HAL_adc_result;
|
||||
// Public functions
|
||||
// ------------------------
|
||||
|
||||
// Needed for DELAY_NS() / DELAY_US() on CORTEX-M7
|
||||
#if (defined(__arm__) || defined(__thumb__)) && __CORTEX_M == 7
|
||||
// HAL pre-initialization task
|
||||
// Force the preinit function to run between the premain() and main() function
|
||||
// of the STM32 arduino core
|
||||
__attribute__((constructor (102)))
|
||||
void HAL_preinit() {
|
||||
enableCycleCounter();
|
||||
}
|
||||
#endif
|
||||
|
||||
// HAL initialization task
|
||||
void HAL_init() {
|
||||
FastIO_init();
|
||||
@@ -88,6 +82,19 @@ void HAL_init() {
|
||||
#if ENABLED(EMERGENCY_PARSER) && USBD_USE_CDC
|
||||
USB_Hook_init();
|
||||
#endif
|
||||
|
||||
#if HAS_SD_HOST_DRIVE
|
||||
MSC_SD_init(); // Enable USB SD card access
|
||||
#endif
|
||||
}
|
||||
|
||||
// HAL idle task
|
||||
void HAL_idletask() {
|
||||
#if HAS_SHARED_MEDIA
|
||||
// Stm32duino currently doesn't have a "loop/idle" method
|
||||
CDC_resume_receive();
|
||||
CDC_continue_transmit();
|
||||
#endif
|
||||
}
|
||||
|
||||
void HAL_clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); }
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
#ifdef USBCON
|
||||
#include <USBSerial.h>
|
||||
#include "../../core/serial_hook.h"
|
||||
#include "../../core/serial_hook.h"
|
||||
typedef ForwardSerial0Type< decltype(SerialUSB) > DefaultSerial;
|
||||
extern DefaultSerial MSerial;
|
||||
#endif
|
||||
@@ -135,6 +135,8 @@ extern uint16_t HAL_adc_result;
|
||||
|
||||
// Enable hooks into setup for HAL
|
||||
void HAL_init();
|
||||
#define HAL_IDLETASK 1
|
||||
void HAL_idletask();
|
||||
|
||||
// Clear reset reason
|
||||
void HAL_clear_reset_source();
|
||||
@@ -192,6 +194,7 @@ void flashFirmware(const int16_t);
|
||||
typedef void (*systickCallback_t)(void);
|
||||
void systick_attach_callback(systickCallback_t cb);
|
||||
void HAL_SYSTICK_Callback();
|
||||
|
||||
extern volatile uint32_t systick_uptime_millis;
|
||||
|
||||
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
||||
|
||||
@@ -51,18 +51,28 @@ static SPISettings spiConfig;
|
||||
OUT_WRITE(SD_MOSI_PIN, HIGH);
|
||||
}
|
||||
|
||||
static uint16_t delay_STM32_soft_spi;
|
||||
// Use function with compile-time value so we can actually reach the desired frequency
|
||||
// Need to adjust this a little bit: on a 72MHz clock, we have 14ns/clock
|
||||
// and we'll use ~3 cycles to jump to the method and going back, so it'll take ~40ns from the given clock here
|
||||
#define CALLING_COST_NS (3U * 1000000000U) / (F_CPU)
|
||||
void (*delaySPIFunc)();
|
||||
void delaySPI_125() { DELAY_NS(125 - CALLING_COST_NS); }
|
||||
void delaySPI_250() { DELAY_NS(250 - CALLING_COST_NS); }
|
||||
void delaySPI_500() { DELAY_NS(500 - CALLING_COST_NS); }
|
||||
void delaySPI_1000() { DELAY_NS(1000 - CALLING_COST_NS); }
|
||||
void delaySPI_2000() { DELAY_NS(2000 - CALLING_COST_NS); }
|
||||
void delaySPI_4000() { DELAY_NS(4000 - CALLING_COST_NS); }
|
||||
|
||||
void spiInit(uint8_t spiRate) {
|
||||
// Use datarates Marlin uses
|
||||
switch (spiRate) {
|
||||
case SPI_FULL_SPEED: delay_STM32_soft_spi = 125; break; // desired: 8,000,000 actual: ~1.1M
|
||||
case SPI_HALF_SPEED: delay_STM32_soft_spi = 125; break; // desired: 4,000,000 actual: ~1.1M
|
||||
case SPI_QUARTER_SPEED:delay_STM32_soft_spi = 250; break; // desired: 2,000,000 actual: ~890K
|
||||
case SPI_EIGHTH_SPEED: delay_STM32_soft_spi = 500; break; // desired: 1,000,000 actual: ~590K
|
||||
case SPI_SPEED_5: delay_STM32_soft_spi = 1000; break; // desired: 500,000 actual: ~360K
|
||||
case SPI_SPEED_6: delay_STM32_soft_spi = 2000; break; // desired: 250,000 actual: ~210K
|
||||
default: delay_STM32_soft_spi = 4000; break; // desired: 125,000 actual: ~123K
|
||||
case SPI_FULL_SPEED: delaySPIFunc = &delaySPI_125; break; // desired: 8,000,000 actual: ~1.1M
|
||||
case SPI_HALF_SPEED: delaySPIFunc = &delaySPI_125; break; // desired: 4,000,000 actual: ~1.1M
|
||||
case SPI_QUARTER_SPEED:delaySPIFunc = &delaySPI_250; break; // desired: 2,000,000 actual: ~890K
|
||||
case SPI_EIGHTH_SPEED: delaySPIFunc = &delaySPI_500; break; // desired: 1,000,000 actual: ~590K
|
||||
case SPI_SPEED_5: delaySPIFunc = &delaySPI_1000; break; // desired: 500,000 actual: ~360K
|
||||
case SPI_SPEED_6: delaySPIFunc = &delaySPI_2000; break; // desired: 250,000 actual: ~210K
|
||||
default: delaySPIFunc = &delaySPI_4000; break; // desired: 125,000 actual: ~123K
|
||||
}
|
||||
SPI.begin();
|
||||
}
|
||||
@@ -75,9 +85,9 @@ static SPISettings spiConfig;
|
||||
WRITE(SD_SCK_PIN, LOW);
|
||||
WRITE(SD_MOSI_PIN, b & 0x80);
|
||||
|
||||
DELAY_NS(delay_STM32_soft_spi);
|
||||
delaySPIFunc();
|
||||
WRITE(SD_SCK_PIN, HIGH);
|
||||
DELAY_NS(delay_STM32_soft_spi);
|
||||
delaySPIFunc();
|
||||
|
||||
b <<= 1; // little setup time
|
||||
b |= (READ(SD_MISO_PIN) != 0);
|
||||
|
||||
@@ -81,7 +81,7 @@ void MarlinSerial::_rx_complete_irq(serial_t *obj) {
|
||||
}
|
||||
|
||||
#if ENABLED(EMERGENCY_PARSER)
|
||||
emergency_parser.update(emergency_state, c);
|
||||
emergency_parser.update(static_cast<MSerialT*>(this)->emergency_state, c);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,7 +163,6 @@
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_2;
|
||||
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
|
||||
|
||||
|
||||
#if DISABLED(STM32F1xx)
|
||||
// TODO: use __HAL_RCC_SDIO_RELEASE_RESET() and __HAL_RCC_SDIO_CLK_ENABLE();
|
||||
RCC->APB2RSTR &= ~RCC_APB2RSTR_SDIORST_Msk; // take SDIO out of reset
|
||||
|
||||
@@ -21,6 +21,6 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#if defined(USBD_USE_CDC_COMPOSITE) && DISABLED(NO_SD_HOST_DRIVE)
|
||||
#if defined(USBD_USE_CDC_MSC) && DISABLED(NO_SD_HOST_DRIVE)
|
||||
#define HAS_SD_HOST_DRIVE 1
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
*
|
||||
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
* Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech]
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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 defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && HAS_SD_HOST_DRIVE
|
||||
|
||||
#include "msc_sd.h"
|
||||
#include "../shared/Marduino.h"
|
||||
#include "usbd_core.h"
|
||||
#include <USB.h>
|
||||
#include <USBMscHandler.h>
|
||||
|
||||
#define BLOCK_SIZE 512
|
||||
#define PRODUCT_ID 0x29
|
||||
|
||||
#include "../../sd/cardreader.h"
|
||||
|
||||
class Sd2CardUSBMscHandler : public USBMscHandler {
|
||||
public:
|
||||
bool GetCapacity(uint32_t *pBlockNum, uint16_t *pBlockSize) {
|
||||
*pBlockNum = card.getSd2Card().cardSize();
|
||||
*pBlockSize = BLOCK_SIZE;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Write(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) {
|
||||
auto sd2card = card.getSd2Card();
|
||||
// single block
|
||||
if (blkLen == 1) {
|
||||
watchdog_refresh();
|
||||
sd2card.writeBlock(blkAddr, pBuf);
|
||||
return true;
|
||||
}
|
||||
|
||||
// multi block optmization
|
||||
sd2card.writeStart(blkAddr, blkLen);
|
||||
while (blkLen--) {
|
||||
watchdog_refresh();
|
||||
sd2card.writeData(pBuf);
|
||||
pBuf += BLOCK_SIZE;
|
||||
}
|
||||
sd2card.writeStop();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Read(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) {
|
||||
auto sd2card = card.getSd2Card();
|
||||
// single block
|
||||
if (blkLen == 1) {
|
||||
watchdog_refresh();
|
||||
sd2card.readBlock(blkAddr, pBuf);
|
||||
return true;
|
||||
}
|
||||
|
||||
// multi block optmization
|
||||
sd2card.readStart(blkAddr);
|
||||
while (blkLen--) {
|
||||
watchdog_refresh();
|
||||
sd2card.readData(pBuf);
|
||||
pBuf += BLOCK_SIZE;
|
||||
}
|
||||
sd2card.readStop();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IsReady() {
|
||||
return card.isMounted();
|
||||
}
|
||||
};
|
||||
|
||||
Sd2CardUSBMscHandler usbMscHandler;
|
||||
|
||||
/* USB Mass storage Standard Inquiry Data */
|
||||
uint8_t Marlin_STORAGE_Inquirydata[] = { /* 36 */
|
||||
/* LUN 0 */
|
||||
0x00,
|
||||
0x80,
|
||||
0x02,
|
||||
0x02,
|
||||
(STANDARD_INQUIRY_DATA_LEN - 5),
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
'M', 'A', 'R', 'L', 'I', 'N', ' ', ' ', /* Manufacturer : 8 bytes */
|
||||
'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product : 16 Bytes */
|
||||
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
|
||||
'0', '.', '0', '1', /* Version : 4 Bytes */
|
||||
};
|
||||
|
||||
USBMscHandler *pSingleMscHandler = &usbMscHandler;
|
||||
|
||||
void MSC_SD_init() {
|
||||
USBDevice.end();
|
||||
delay(200);
|
||||
USBDevice.begin();
|
||||
USBDevice.registerMscHandlers(1, &pSingleMscHandler, Marlin_STORAGE_Inquirydata);
|
||||
}
|
||||
|
||||
#endif // __STM32F1__ && HAS_SD_HOST_DRIVE
|
||||
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
*
|
||||
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
* Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech]
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
|
||||
void MSC_SD_init();
|
||||
@@ -28,6 +28,10 @@
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
#include "../../core/serial_hook.h"
|
||||
|
||||
#if HAS_TFT_LVGL_UI
|
||||
extern "C" { extern char public_buf_m[100]; }
|
||||
#endif
|
||||
|
||||
// Increase priority of serial interrupts, to reduce overflow errors
|
||||
#define UART_IRQ_PRIO 1
|
||||
|
||||
@@ -45,6 +49,28 @@ struct MarlinSerial : public HardwareSerial {
|
||||
nvic_irq_set_priority(c_dev()->irq_num, UART_IRQ_PRIO);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HAS_TFT_LVGL_UI
|
||||
// Hook the serial write method to capture the output of GCode command sent via LCD
|
||||
uint32_t current_wpos;
|
||||
void (*line_callback)(void *, const char * msg);
|
||||
void *user_pointer;
|
||||
|
||||
void set_hook(void (*hook)(void *, const char *), void * that) { line_callback = hook; user_pointer = that; current_wpos = 0; }
|
||||
|
||||
size_t write(uint8_t c) {
|
||||
if (line_callback) {
|
||||
if (c == '\n' || current_wpos == sizeof(public_buf_m) - 1) { // End of line, probably end of command anyway
|
||||
public_buf_m[current_wpos] = 0;
|
||||
line_callback(user_pointer, public_buf_m);
|
||||
current_wpos = 0;
|
||||
}
|
||||
else
|
||||
public_buf_m[current_wpos++] = c;
|
||||
}
|
||||
return HardwareSerial::write(c);
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
typedef Serial0Type<MarlinSerial> MSerialT;
|
||||
|
||||
@@ -0,0 +1,176 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "Delay.h"
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
|
||||
#if defined(__arm__) || defined(__thumb__)
|
||||
|
||||
static uint32_t ASM_CYCLES_PER_ITERATION = 4; // Initial bet which will be adjusted in calibrate_delay_loop
|
||||
|
||||
// Simple assembler loop counting down
|
||||
void delay_asm(uint32_t cy) {
|
||||
cy = _MAX(cy / ASM_CYCLES_PER_ITERATION, 1U); // Zero is forbidden here
|
||||
__asm__ __volatile__(
|
||||
A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax
|
||||
L("1")
|
||||
A("subs %[cnt],#1")
|
||||
A("bne 1b")
|
||||
: [cnt]"+r"(cy) // output: +r means input+output
|
||||
: // input:
|
||||
: "cc" // clobbers:
|
||||
);
|
||||
}
|
||||
|
||||
// We can't use CMSIS since it's not available on all platform, so fallback to hardcoded register values
|
||||
#define HW_REG(X) *(volatile uint32_t *)(X)
|
||||
#define _DWT_CTRL 0xE0001000
|
||||
#define _DWT_CYCCNT 0xE0001004 // CYCCNT is 32bits, takes 37s or so to wrap.
|
||||
#define _DEM_CR 0xE000EDFC
|
||||
#define _LAR 0xE0001FB0
|
||||
|
||||
// Use hardware cycle counter instead, it's much safer
|
||||
void delay_dwt(uint32_t count) {
|
||||
// Reuse the ASM_CYCLES_PER_ITERATION variable to avoid wasting another useless variable
|
||||
register uint32_t start = HW_REG(_DWT_CYCCNT) - ASM_CYCLES_PER_ITERATION, elapsed;
|
||||
do {
|
||||
elapsed = HW_REG(_DWT_CYCCNT) - start;
|
||||
} while (elapsed < count);
|
||||
}
|
||||
|
||||
// Pointer to asm function, calling the functions has a ~20 cycles overhead
|
||||
DelayImpl DelayCycleFnc = delay_asm;
|
||||
|
||||
void calibrate_delay_loop() {
|
||||
// Check if we have a working DWT implementation in the CPU (see https://developer.arm.com/documentation/ddi0439/b/Data-Watchpoint-and-Trace-Unit/DWT-Programmers-Model)
|
||||
if (!HW_REG(_DWT_CTRL)) {
|
||||
// No DWT present, so fallback to plain old ASM nop counting
|
||||
// Unfortunately, we don't exactly know how many iteration it'll take to decrement a counter in a loop
|
||||
// It depends on the CPU architecture, the code current position (flash vs SRAM)
|
||||
// So, instead of wild guessing and making mistake, instead
|
||||
// compute it once for all
|
||||
ASM_CYCLES_PER_ITERATION = 1;
|
||||
// We need to fetch some reference clock before waiting
|
||||
cli();
|
||||
uint32_t start = micros();
|
||||
delay_asm(1000); // On a typical CPU running in MHz, waiting 1000 "unknown cycles" means it'll take between 1ms to 6ms, that's perfectly acceptable
|
||||
uint32_t end = micros();
|
||||
sei();
|
||||
uint32_t expectedCycles = (end - start) * ((F_CPU) / 1000000UL); // Convert microseconds to cycles
|
||||
// Finally compute the right scale
|
||||
ASM_CYCLES_PER_ITERATION = (uint32_t)(expectedCycles / 1000);
|
||||
|
||||
// No DWT present, likely a Cortex M0 so NOP counting is our best bet here
|
||||
DelayCycleFnc = delay_asm;
|
||||
}
|
||||
else {
|
||||
// Enable DWT counter
|
||||
// From https://stackoverflow.com/a/41188674/1469714
|
||||
HW_REG(_DEM_CR) = HW_REG(_DEM_CR) | 0x01000000; // Enable trace
|
||||
#if __CORTEX_M == 7
|
||||
HW_REG(_LAR) = 0xC5ACCE55; // Unlock access to DWT registers, see https://developer.arm.com/documentation/ihi0029/e/ section B2.3.10
|
||||
#endif
|
||||
HW_REG(_DWT_CYCCNT) = 0; // Clear DWT cycle counter
|
||||
HW_REG(_DWT_CTRL) = HW_REG(_DWT_CTRL) | 1; // Enable DWT cycle counter
|
||||
|
||||
// Then calibrate the constant offset from the counter
|
||||
ASM_CYCLES_PER_ITERATION = 0;
|
||||
uint32_t s = HW_REG(_DWT_CYCCNT);
|
||||
uint32_t e = HW_REG(_DWT_CYCCNT); // (e - s) contains the number of cycle required to read the cycle counter
|
||||
delay_dwt(0);
|
||||
uint32_t f = HW_REG(_DWT_CYCCNT); // (f - e) contains the delay to call the delay function + the time to read the cycle counter
|
||||
ASM_CYCLES_PER_ITERATION = (f - e) - (e - s);
|
||||
|
||||
// Use safer DWT function
|
||||
DelayCycleFnc = delay_dwt;
|
||||
}
|
||||
}
|
||||
|
||||
#if ENABLED(MARLIN_DEV_MODE)
|
||||
void dump_delay_accuracy_check()
|
||||
{
|
||||
auto report_call_time = [](PGM_P const name, const uint32_t cycles, const uint32_t total, const bool do_flush=true) {
|
||||
SERIAL_ECHOPGM("Calling ");
|
||||
serialprintPGM(name);
|
||||
SERIAL_ECHOLNPAIR(" for ", cycles, "cycles took: ", total, "cycles");
|
||||
if (do_flush) SERIAL_FLUSH();
|
||||
};
|
||||
|
||||
uint32_t s, e;
|
||||
|
||||
SERIAL_ECHOLNPAIR("Computed delay calibration value: ", ASM_CYCLES_PER_ITERATION);
|
||||
SERIAL_FLUSH();
|
||||
// Display the results of the calibration above
|
||||
constexpr uint32_t testValues[] = { 1, 5, 10, 20, 50, 100, 150, 200, 350, 500, 750, 1000 };
|
||||
for (auto i : testValues) {
|
||||
s = micros(); DELAY_US(i); e = micros();
|
||||
report_call_time(PSTR("delay"), i, e - s);
|
||||
}
|
||||
|
||||
if (HW_REG(_DWT_CTRL)) {
|
||||
for (auto i : testValues) {
|
||||
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(i); e = HW_REG(_DWT_CYCCNT);
|
||||
report_call_time(PSTR("delay"), i, e - s);
|
||||
}
|
||||
|
||||
// Measure the delay to call a real function compared to a function pointer
|
||||
s = HW_REG(_DWT_CYCCNT); delay_dwt(1); e = HW_REG(_DWT_CYCCNT);
|
||||
report_call_time(PSTR("delay_dwt"), 1, e - s);
|
||||
|
||||
static PGMSTR(dcd, "DELAY_CYCLES directly ");
|
||||
|
||||
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES( 1); e = HW_REG(_DWT_CYCCNT);
|
||||
report_call_time(dcd, 1, e - s, false);
|
||||
|
||||
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES( 5); e = HW_REG(_DWT_CYCCNT);
|
||||
report_call_time(dcd, 5, e - s, false);
|
||||
|
||||
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(10); e = HW_REG(_DWT_CYCCNT);
|
||||
report_call_time(dcd, 10, e - s, false);
|
||||
|
||||
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(20); e = HW_REG(_DWT_CYCCNT);
|
||||
report_call_time(dcd, 20, e - s, false);
|
||||
|
||||
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(50); e = HW_REG(_DWT_CYCCNT);
|
||||
report_call_time(dcd, 50, e - s, false);
|
||||
|
||||
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(100); e = HW_REG(_DWT_CYCCNT);
|
||||
report_call_time(dcd, 100, e - s, false);
|
||||
|
||||
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(200); e = HW_REG(_DWT_CYCCNT);
|
||||
report_call_time(dcd, 200, e - s, false);
|
||||
}
|
||||
}
|
||||
#endif // MARLIN_DEV_MODE
|
||||
|
||||
|
||||
#else
|
||||
|
||||
void calibrate_delay_loop() {}
|
||||
#if ENABLED(MARLIN_DEV_MODE)
|
||||
void dump_delay_accuracy_check() {
|
||||
static PGMSTR(none, "N/A on this platform");
|
||||
serialprintPGM(none);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -21,6 +21,8 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
|
||||
/**
|
||||
* Busy wait delay cycles routines:
|
||||
*
|
||||
@@ -31,79 +33,68 @@
|
||||
|
||||
#include "../../core/macros.h"
|
||||
|
||||
void calibrate_delay_loop();
|
||||
|
||||
#if defined(__arm__) || defined(__thumb__)
|
||||
|
||||
#if __CORTEX_M == 7
|
||||
// We want to have delay_cycle function with the lowest possible overhead, so we adjust at the function at runtime based on the current CPU best feature
|
||||
typedef void (*DelayImpl)(uint32_t);
|
||||
extern DelayImpl DelayCycleFnc;
|
||||
|
||||
// Cortex-M3 through M7 can use the cycle counter of the DWT unit
|
||||
// https://www.anthonyvh.com/2017/05/18/cortex_m-cycle_counter/
|
||||
// I've measured 36 cycles on my system to call the cycle waiting method, but it shouldn't change much to have a bit more margin, it only consume a bit more flash
|
||||
#define TRIP_POINT_FOR_CALLING_FUNCTION 40
|
||||
|
||||
FORCE_INLINE static void enableCycleCounter() {
|
||||
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
|
||||
|
||||
#if __CORTEX_M == 7
|
||||
DWT->LAR = 0xC5ACCE55; // Unlock DWT on the M7
|
||||
#endif
|
||||
|
||||
DWT->CYCCNT = 0;
|
||||
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
|
||||
// A simple recursive template class that output exactly one 'nop' of code per recursion
|
||||
template <int N> struct NopWriter {
|
||||
FORCE_INLINE static void build() {
|
||||
__asm__ __volatile__("nop");
|
||||
NopWriter<N-1>::build();
|
||||
}
|
||||
};
|
||||
// End the loop
|
||||
template <> struct NopWriter<0> { FORCE_INLINE static void build() {} };
|
||||
|
||||
FORCE_INLINE volatile uint32_t getCycleCount() { return DWT->CYCCNT; }
|
||||
|
||||
FORCE_INLINE static void DELAY_CYCLES(const uint32_t x) {
|
||||
const uint32_t endCycles = getCycleCount() + x;
|
||||
while (PENDING(getCycleCount(), endCycles)) {}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// https://blueprints.launchpad.net/gcc-arm-embedded/+spec/delay-cycles
|
||||
|
||||
#define nop() __asm__ __volatile__("nop;\n\t":::)
|
||||
|
||||
FORCE_INLINE static void __delay_4cycles(uint32_t cy) { // +1 cycle
|
||||
#if ARCH_PIPELINE_RELOAD_CYCLES < 2
|
||||
#define EXTRA_NOP_CYCLES A("nop")
|
||||
#else
|
||||
#define EXTRA_NOP_CYCLES ""
|
||||
#endif
|
||||
|
||||
__asm__ __volatile__(
|
||||
A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax
|
||||
L("1")
|
||||
A("subs %[cnt],#1")
|
||||
EXTRA_NOP_CYCLES
|
||||
A("bne 1b")
|
||||
: [cnt]"+r"(cy) // output: +r means input+output
|
||||
: // input:
|
||||
: "cc" // clobbers:
|
||||
);
|
||||
}
|
||||
|
||||
// Delay in cycles
|
||||
FORCE_INLINE static void DELAY_CYCLES(uint32_t x) {
|
||||
|
||||
if (__builtin_constant_p(x)) {
|
||||
#define MAXNOPS 4
|
||||
|
||||
if (x <= (MAXNOPS)) {
|
||||
switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); }
|
||||
}
|
||||
else { // because of +1 cycle inside delay_4cycles
|
||||
const uint32_t rem = (x - 1) % (MAXNOPS);
|
||||
switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); }
|
||||
if ((x = (x - 1) / (MAXNOPS)))
|
||||
__delay_4cycles(x); // if need more then 4 nop loop is more optimal
|
||||
}
|
||||
#undef MAXNOPS
|
||||
namespace Private {
|
||||
// Split recursing template in 2 different class so we don't reach the maximum template instantiation depth limit
|
||||
template <bool belowTP, int N> struct Helper {
|
||||
FORCE_INLINE static void build() {
|
||||
DelayCycleFnc(N - 2); // Approximative cost of calling the function (might be off by one or 2 cycles)
|
||||
}
|
||||
else if ((x >>= 2))
|
||||
__delay_4cycles(x);
|
||||
}
|
||||
#undef nop
|
||||
};
|
||||
|
||||
#endif
|
||||
template <int N> struct Helper<true, N> {
|
||||
FORCE_INLINE static void build() {
|
||||
NopWriter<N - 1>::build();
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct Helper<true, 0> {
|
||||
FORCE_INLINE static void build() {}
|
||||
};
|
||||
|
||||
}
|
||||
// Select a behavior based on the constexpr'ness of the parameter
|
||||
// If called with a compile-time parameter, then write as many NOP as required to reach the asked cycle count
|
||||
// (there is some tripping point here to start looping when it's more profitable than gruntly executing NOPs)
|
||||
// If not called from a compile-time parameter, fallback to a runtime loop counting version instead
|
||||
template <bool compileTime, int Cycles>
|
||||
struct SmartDelay {
|
||||
FORCE_INLINE SmartDelay(int) {
|
||||
if (Cycles == 0) return;
|
||||
Private::Helper<Cycles < TRIP_POINT_FOR_CALLING_FUNCTION, Cycles>::build();
|
||||
}
|
||||
};
|
||||
// Runtime version below. There is no way this would run under less than ~TRIP_POINT_FOR_CALLING_FUNCTION cycles
|
||||
template <int T>
|
||||
struct SmartDelay<false, T> {
|
||||
FORCE_INLINE SmartDelay(int v) { DelayCycleFnc(v); }
|
||||
};
|
||||
|
||||
#define DELAY_CYCLES(X) do { SmartDelay<IS_CONSTEXPR(X), IS_CONSTEXPR(X) ? X : 0> _smrtdly_X(X); } while(0)
|
||||
|
||||
// For delay in microseconds, no smart delay selection is required, directly call the delay function
|
||||
// Teensy compiler is too old and does not accept smart delay compile-time / run-time selection correctly
|
||||
#define DELAY_US(x) DelayCycleFnc((x) * ((F_CPU) / 1000000UL))
|
||||
|
||||
#elif defined(__AVR__)
|
||||
|
||||
@@ -144,10 +135,15 @@
|
||||
}
|
||||
#undef nop
|
||||
|
||||
// Delay in microseconds
|
||||
#define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL))
|
||||
|
||||
#elif defined(__PLAT_LINUX__) || defined(ESP32)
|
||||
|
||||
// specified inside platform
|
||||
// DELAY_CYCLES specified inside platform
|
||||
|
||||
// Delay in microseconds
|
||||
#define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL))
|
||||
#else
|
||||
|
||||
#error "Unsupported MCU architecture"
|
||||
@@ -157,5 +153,5 @@
|
||||
// Delay in nanoseconds
|
||||
#define DELAY_NS(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL) / 1000UL)
|
||||
|
||||
// Delay in microseconds
|
||||
#define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL))
|
||||
|
||||
|
||||
|
||||
@@ -34,9 +34,9 @@ static bool UnwReportOut(void* ctx, const UnwReport* bte) {
|
||||
|
||||
(*p)++;
|
||||
|
||||
SERIAL_CHAR('#'); SERIAL_PRINT(*p, DEC); SERIAL_ECHOPGM(" : ");
|
||||
SERIAL_CHAR('#'); SERIAL_ECHO(*p); SERIAL_ECHOPGM(" : ");
|
||||
SERIAL_ECHOPGM(bte->name ? bte->name : "unknown"); SERIAL_ECHOPGM("@0x"); SERIAL_PRINT(bte->function, HEX);
|
||||
SERIAL_CHAR('+'); SERIAL_PRINT(bte->address - bte->function,DEC);
|
||||
SERIAL_CHAR('+'); SERIAL_ECHO(bte->address - bte->function);
|
||||
SERIAL_ECHOPGM(" PC:"); SERIAL_PRINT(bte->address,HEX); SERIAL_CHAR('\n');
|
||||
return true;
|
||||
}
|
||||
|
||||
+17
-15
@@ -419,8 +419,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) {
|
||||
if (parked_or_ignoring) gcode.reset_stepper_timeout(ms);
|
||||
|
||||
if (gcode.stepper_max_timed_out(ms)) {
|
||||
SERIAL_ERROR_START();
|
||||
SERIAL_ECHOLNPAIR(STR_KILL_INACTIVE_TIME, parser.command_ptr);
|
||||
SERIAL_ERROR_MSG(STR_KILL_INACTIVE_TIME, parser.command_ptr);
|
||||
kill();
|
||||
}
|
||||
|
||||
@@ -614,8 +613,8 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) {
|
||||
*/
|
||||
void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
|
||||
#if ENABLED(MARLIN_DEV_MODE)
|
||||
static uint8_t idle_depth = 0;
|
||||
if (++idle_depth > 5) SERIAL_ECHOLNPAIR("idle() call depth: ", int(idle_depth));
|
||||
static uint16_t idle_depth = 0;
|
||||
if (++idle_depth > 5) SERIAL_ECHOLNPAIR("idle() call depth: ", idle_depth);
|
||||
#endif
|
||||
|
||||
// Core Marlin activities
|
||||
@@ -886,6 +885,17 @@ void setup() {
|
||||
#endif
|
||||
#define SETUP_RUN(C) do{ SETUP_LOG(STRINGIFY(C)); C; }while(0)
|
||||
|
||||
MYSERIAL0.begin(BAUDRATE);
|
||||
millis_t serial_connect_timeout = millis() + 1000UL;
|
||||
while (!MYSERIAL0.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
|
||||
|
||||
#if HAS_MULTI_SERIAL && !HAS_ETHERNET
|
||||
MYSERIAL1.begin(BAUDRATE);
|
||||
serial_connect_timeout = millis() + 1000UL;
|
||||
while (!MYSERIAL1.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
|
||||
#endif
|
||||
SERIAL_ECHOLNPGM("start");
|
||||
|
||||
// Set up these pins early to prevent suicide
|
||||
#if HAS_KILL
|
||||
SETUP_LOG("KILL_PIN");
|
||||
@@ -918,17 +928,6 @@ void setup() {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
MYSERIAL0.begin(BAUDRATE);
|
||||
millis_t serial_connect_timeout = millis() + 1000UL;
|
||||
while (!MYSERIAL0.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
|
||||
|
||||
#if HAS_MULTI_SERIAL && !HAS_ETHERNET
|
||||
MYSERIAL1.begin(BAUDRATE);
|
||||
serial_connect_timeout = millis() + 1000UL;
|
||||
while (!MYSERIAL1.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
|
||||
#endif
|
||||
SERIAL_ECHOLNPGM("start");
|
||||
|
||||
#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE)
|
||||
mks_esp_wifi_init();
|
||||
WIFISERIAL.begin(WIFI_BAUDRATE);
|
||||
@@ -1006,6 +1005,9 @@ void setup() {
|
||||
SERIAL_ECHO_MSG("Compiled: " __DATE__);
|
||||
SERIAL_ECHO_MSG(STR_FREE_MEMORY, freeMemory(), STR_PLANNER_BUFFER_BYTES, (int)sizeof(block_t) * (BLOCK_BUFFER_SIZE));
|
||||
|
||||
// Some HAL need precise delay adjustment
|
||||
calibrate_delay_loop();
|
||||
|
||||
// Init buzzer pin(s)
|
||||
#if USE_BEEPER
|
||||
SETUP_RUN(buzzer.init());
|
||||
|
||||
@@ -61,6 +61,8 @@
|
||||
#define _O2 __attribute__((optimize("O2")))
|
||||
#define _O3 __attribute__((optimize("O3")))
|
||||
|
||||
#define IS_CONSTEXPR(...) __builtin_constant_p(__VA_ARGS__) // Only valid solution with C++14. Should use std::is_constant_evaluated() in C++20 instead
|
||||
|
||||
#ifndef UNUSED
|
||||
#define UNUSED(x) ((void)(x))
|
||||
#endif
|
||||
@@ -320,8 +322,8 @@
|
||||
template<bool, typename _Tp = void> struct enable_if { };
|
||||
template<typename _Tp> struct enable_if<true, _Tp> { typedef _Tp type; };
|
||||
}
|
||||
// C++11 solution using SFINAE to detect the existance of a member in a class at compile time.
|
||||
// It creates a HasMember<Type> structure containing 'value' set to true if the member exists
|
||||
// C++11 solution using SFINAE to detect the existance of a member in a class at compile time.
|
||||
// It creates a HasMember<Type> structure containing 'value' set to true if the member exists
|
||||
#define HAS_MEMBER_IMPL(Member) \
|
||||
namespace Private { \
|
||||
template <typename Type, typename Yes=char, typename No=long> struct HasMember_ ## Member { \
|
||||
|
||||
@@ -78,13 +78,22 @@ struct SerialBase {
|
||||
FORCE_INLINE void write(const char* str) { while (*str) write(*str++); }
|
||||
FORCE_INLINE void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
||||
FORCE_INLINE void print(const char* str) { write(str); }
|
||||
NO_INLINE void print(char c, int base = 0) { print((long)c, base); }
|
||||
NO_INLINE void print(unsigned char c, int base = 0) { print((unsigned long)c, base); }
|
||||
NO_INLINE void print(int c, int base = DEC) { print((long)c, base); }
|
||||
NO_INLINE void print(unsigned int c, int base = DEC) { print((unsigned long)c, base); }
|
||||
void print(long c, int base = DEC) { if (!base) write(c); write((const uint8_t*)"-", c < 0); printNumber(c < 0 ? -c : c, base); }
|
||||
void print(unsigned long c, int base = DEC) { printNumber(c, base); }
|
||||
void print(double c, int digits = 2) { printFloat(c, digits); }
|
||||
NO_INLINE void print(char c, int base = 0) { print((long)c, base); }
|
||||
NO_INLINE void print(unsigned char c, int base = 0) { print((unsigned long)c, base); }
|
||||
NO_INLINE void print(int c, int base = DEC) { print((long)c, base); }
|
||||
NO_INLINE void print(unsigned int c, int base = DEC) { print((unsigned long)c, base); }
|
||||
void print(unsigned long c, int base = DEC) { printNumber(c, base); }
|
||||
void print(double c, int digits = 2) { printFloat(c, digits); }
|
||||
void print(long c, int base = DEC) {
|
||||
if (!base) {
|
||||
write(c);
|
||||
return;
|
||||
}
|
||||
if (base == DEC && c < 0) {
|
||||
write((uint8_t)'-'); c = -c;
|
||||
}
|
||||
printNumber(c, base);
|
||||
}
|
||||
|
||||
NO_INLINE void println(const char s[]) { print(s); println(); }
|
||||
NO_INLINE void println(char c, int base = 0) { print(c, base); println(); }
|
||||
@@ -98,6 +107,10 @@ struct SerialBase {
|
||||
|
||||
// Print a number with the given base
|
||||
void printNumber(unsigned long n, const uint8_t base) {
|
||||
if (!base) {
|
||||
write((uint8_t)n);
|
||||
return;
|
||||
}
|
||||
if (n) {
|
||||
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
||||
int8_t i = 0;
|
||||
|
||||
@@ -131,10 +131,11 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial<SerialT> >, public Seria
|
||||
using BaseClassT::print;
|
||||
using BaseClassT::println;
|
||||
|
||||
|
||||
// Underlying implementation might use Arduino's bool operator
|
||||
bool connected() {
|
||||
return Private::HasMember_connected<SerialT>::value ? CALL_IF_EXISTS(bool, static_cast<SerialT*>(this), connected) : static_cast<SerialT*>(this)->operator bool();
|
||||
}
|
||||
bool connected() {
|
||||
return Private::HasMember_connected<SerialT>::value ? CALL_IF_EXISTS(bool, static_cast<SerialT*>(this), connected) : static_cast<SerialT*>(this)->operator bool();
|
||||
}
|
||||
|
||||
void setHook(WriteHook writeHook = 0, EndOfMessageHook eofHook = 0, void * userPointer = 0) {
|
||||
// Order is important here as serial code can be called inside interrupts
|
||||
|
||||
@@ -196,7 +196,7 @@ void reset_bed_level() {
|
||||
#endif
|
||||
}
|
||||
#ifdef SCAD_MESH_OUTPUT
|
||||
SERIAL_CHAR(' ', ']'); // close sub-array
|
||||
SERIAL_ECHOPGM(" ]"); // close sub-array
|
||||
if (y < sy - 1) SERIAL_CHAR(',');
|
||||
#endif
|
||||
SERIAL_EOL();
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
SERIAL_ECHO_SP(7);
|
||||
LOOP_L_N(i, GRID_MAX_POINTS_X) {
|
||||
if (i < 10) SERIAL_CHAR(' ');
|
||||
SERIAL_ECHO(i);
|
||||
SERIAL_ECHO((int)i);
|
||||
SERIAL_ECHO_SP(sp);
|
||||
}
|
||||
serial_delay(10);
|
||||
@@ -214,7 +214,7 @@
|
||||
else if (isnan(f))
|
||||
serialprintPGM(human ? PSTR(" . ") : PSTR("NAN"));
|
||||
else if (human || csv) {
|
||||
if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Space for positive ('-' for negative)
|
||||
if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0)
|
||||
SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits
|
||||
}
|
||||
if (csv && i < GRID_MAX_POINTS_X - 1) SERIAL_CHAR('\t');
|
||||
|
||||
@@ -742,7 +742,7 @@
|
||||
if (do_ubl_mesh_map) display_map(g29_map_type);
|
||||
|
||||
const int point_num = (GRID_MAX_POINTS) - count + 1;
|
||||
SERIAL_ECHOLNPAIR("\nProbing mesh point ", point_num, "/", int(GRID_MAX_POINTS), ".\n");
|
||||
SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", int(GRID_MAX_POINTS), ".");
|
||||
TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS)));
|
||||
|
||||
#if HAS_LCD_MENU
|
||||
|
||||
@@ -352,8 +352,7 @@ public:
|
||||
}
|
||||
}
|
||||
else {
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("Packet header(", packet.header.sync, "?) corrupt");
|
||||
SERIAL_ECHO_MSG("Packet header(", packet.header.sync, "?) corrupt");
|
||||
stream_state = StreamState::PACKET_RESEND;
|
||||
}
|
||||
}
|
||||
@@ -387,8 +386,7 @@ public:
|
||||
stream_state = StreamState::PACKET_PROCESS;
|
||||
}
|
||||
else {
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("Packet(", packet.header.sync, ") payload corrupt");
|
||||
SERIAL_ECHO_MSG("Packet(", packet.header.sync, ") payload corrupt");
|
||||
stream_state = StreamState::PACKET_RESEND;
|
||||
}
|
||||
}
|
||||
@@ -406,8 +404,7 @@ public:
|
||||
if (packet_retries < MAX_RETRIES || MAX_RETRIES == 0) {
|
||||
packet_retries++;
|
||||
stream_state = StreamState::PACKET_RESET;
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("Resend request ", int(packet_retries));
|
||||
SERIAL_ECHO_MSG("Resend request ", int(packet_retries));
|
||||
SERIAL_ECHOLNPAIR("rs", sync);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -67,8 +67,7 @@ void CancelObject::uncancel_object(const int8_t obj) {
|
||||
|
||||
void CancelObject::report() {
|
||||
if (active_object >= 0) {
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("Active Object: ", int(active_object));
|
||||
SERIAL_ECHO_MSG("Active Object: ", int(active_object));
|
||||
}
|
||||
|
||||
if (canceled) {
|
||||
|
||||
@@ -180,7 +180,7 @@ namespace DirectStepping {
|
||||
if (!page_states_dirty) return;
|
||||
page_states_dirty = false;
|
||||
|
||||
SERIAL_ECHO(Cfg::CONTROL_CHAR);
|
||||
SERIAL_CHAR(Cfg::CONTROL_CHAR);
|
||||
constexpr int state_bits = 2;
|
||||
constexpr int n_bytes = Cfg::NUM_PAGES >> state_bits;
|
||||
volatile uint8_t bits_b[n_bytes] = { 0 };
|
||||
@@ -192,10 +192,10 @@ namespace DirectStepping {
|
||||
uint8_t crc = 0;
|
||||
for (uint8_t i = 0 ; i < n_bytes ; i++) {
|
||||
crc ^= bits_b[i];
|
||||
SERIAL_ECHO(bits_b[i]);
|
||||
SERIAL_CHAR(bits_b[i]);
|
||||
}
|
||||
|
||||
SERIAL_ECHO(crc);
|
||||
SERIAL_CHAR(crc);
|
||||
SERIAL_EOL();
|
||||
}
|
||||
|
||||
|
||||
@@ -172,7 +172,7 @@ void I2CPositionEncoder::update() {
|
||||
float sumP = 0;
|
||||
LOOP_L_N(i, I2CPE_ERR_PRST_ARRAY_SIZE) sumP += errPrst[i];
|
||||
const int32_t errorP = int32_t(sumP * RECIPROCAL(I2CPE_ERR_PRST_ARRAY_SIZE));
|
||||
SERIAL_ECHO(axis_codes[encoderAxis]);
|
||||
SERIAL_CHAR(axis_codes[encoderAxis]);
|
||||
SERIAL_ECHOLNPAIR(" : CORRECT ERR ", errorP * planner.steps_to_mm[encoderAxis], "mm");
|
||||
babystep.add_steps(encoderAxis, -LROUND(errorP));
|
||||
errPrstIdx = 0;
|
||||
@@ -192,7 +192,7 @@ void I2CPositionEncoder::update() {
|
||||
if (ABS(error) > I2CPE_ERR_CNT_THRESH * planner.settings.axis_steps_per_mm[encoderAxis]) {
|
||||
const millis_t ms = millis();
|
||||
if (ELAPSED(ms, nextErrorCountTime)) {
|
||||
SERIAL_ECHO(axis_codes[encoderAxis]);
|
||||
SERIAL_CHAR(axis_codes[encoderAxis]);
|
||||
SERIAL_ECHOLNPAIR(" : LARGE ERR ", int(error), "; diffSum=", diffSum);
|
||||
errorCount++;
|
||||
nextErrorCountTime = ms + I2CPE_ERR_CNT_DEBOUNCE_MS;
|
||||
@@ -213,7 +213,7 @@ void I2CPositionEncoder::set_homed() {
|
||||
trusted++;
|
||||
|
||||
#ifdef I2CPE_DEBUG
|
||||
SERIAL_ECHO(axis_codes[encoderAxis]);
|
||||
SERIAL_CHAR(axis_codes[encoderAxis]);
|
||||
SERIAL_ECHOLNPAIR(" axis encoder homed, offset of ", zeroOffset, " ticks.");
|
||||
#endif
|
||||
}
|
||||
@@ -224,7 +224,7 @@ void I2CPositionEncoder::set_unhomed() {
|
||||
homed = trusted = false;
|
||||
|
||||
#ifdef I2CPE_DEBUG
|
||||
SERIAL_ECHO(axis_codes[encoderAxis]);
|
||||
SERIAL_CHAR(axis_codes[encoderAxis]);
|
||||
SERIAL_ECHOLNPGM(" axis encoder unhomed.");
|
||||
#endif
|
||||
}
|
||||
@@ -232,7 +232,7 @@ void I2CPositionEncoder::set_unhomed() {
|
||||
bool I2CPositionEncoder::passes_test(const bool report) {
|
||||
if (report) {
|
||||
if (H != I2CPE_MAG_SIG_GOOD) SERIAL_ECHOPGM("Warning. ");
|
||||
SERIAL_ECHO(axis_codes[encoderAxis]);
|
||||
SERIAL_CHAR(axis_codes[encoderAxis]);
|
||||
serial_ternary(H == I2CPE_MAG_SIG_BAD, PSTR(" axis "), PSTR("magnetic strip "), PSTR("encoder "));
|
||||
switch (H) {
|
||||
case I2CPE_MAG_SIG_GOOD:
|
||||
@@ -253,7 +253,7 @@ float I2CPositionEncoder::get_axis_error_mm(const bool report) {
|
||||
error = ABS(diff) > 10000 ? 0 : diff; // Huge error is a bad reading
|
||||
|
||||
if (report) {
|
||||
SERIAL_ECHO(axis_codes[encoderAxis]);
|
||||
SERIAL_CHAR(axis_codes[encoderAxis]);
|
||||
SERIAL_ECHOLNPAIR(" axis target=", target, "mm; actual=", actual, "mm; err=", error, "mm");
|
||||
}
|
||||
|
||||
@@ -263,7 +263,7 @@ float I2CPositionEncoder::get_axis_error_mm(const bool report) {
|
||||
int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) {
|
||||
if (!active) {
|
||||
if (report) {
|
||||
SERIAL_ECHO(axis_codes[encoderAxis]);
|
||||
SERIAL_CHAR(axis_codes[encoderAxis]);
|
||||
SERIAL_ECHOLNPGM(" axis encoder not active!");
|
||||
}
|
||||
return 0;
|
||||
@@ -288,7 +288,7 @@ int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) {
|
||||
errorPrev = error;
|
||||
|
||||
if (report) {
|
||||
SERIAL_ECHO(axis_codes[encoderAxis]);
|
||||
SERIAL_CHAR(axis_codes[encoderAxis]);
|
||||
SERIAL_ECHOLNPAIR(" axis target=", target, "; actual=", encoderCountInStepperTicksScaled, "; err=", error);
|
||||
}
|
||||
|
||||
@@ -667,8 +667,7 @@ void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units,
|
||||
else {
|
||||
if (noOffset) {
|
||||
const int32_t raw_count = encoders[idx].get_raw_count();
|
||||
SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]);
|
||||
SERIAL_CHAR(' ');
|
||||
SERIAL_CHAR(axis_codes[encoders[idx].get_axis()], ' ');
|
||||
|
||||
for (uint8_t j = 31; j > 0; j--)
|
||||
SERIAL_ECHO((bool)(0x00000001 & (raw_count >> j)));
|
||||
@@ -723,7 +722,7 @@ void I2CPositionEncodersMgr::change_module_address(const uint8_t oldaddr, const
|
||||
// and enable it (it will likely have failed initialization on power-up, before the address change).
|
||||
const int8_t idx = idx_from_addr(newaddr);
|
||||
if (idx >= 0 && !encoders[idx].get_active()) {
|
||||
SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]);
|
||||
SERIAL_CHAR(axis_codes[encoders[idx].get_axis()]);
|
||||
SERIAL_ECHOLNPGM(" axis encoder was not detected on printer startup. Trying again.");
|
||||
encoders[idx].set_active(encoders[idx].passes_test(true));
|
||||
}
|
||||
@@ -748,7 +747,7 @@ void I2CPositionEncodersMgr::report_module_firmware(const uint8_t address) {
|
||||
if (Wire.requestFrom(I2C_ADDRESS(address), uint8_t(32))) {
|
||||
char c;
|
||||
while (Wire.available() > 0 && (c = (char)Wire.read()) > 0)
|
||||
SERIAL_ECHO(c);
|
||||
SERIAL_CHAR(c);
|
||||
SERIAL_EOL();
|
||||
}
|
||||
|
||||
|
||||
@@ -182,7 +182,7 @@ void host_action(PGM_P const pstr, const bool eol) {
|
||||
break;
|
||||
case PROMPT_PAUSE_RESUME:
|
||||
msg = PSTR("LCD_PAUSE_RESUME");
|
||||
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
||||
#if BOTH(ADVANCED_PAUSE_FEATURE, SDSUPPORT)
|
||||
extern const char M24_STR[];
|
||||
queue.inject_P(M24_STR);
|
||||
#endif
|
||||
|
||||
@@ -514,8 +514,7 @@ static void mmu2_not_responding() {
|
||||
extruder = index; // filament change is finished
|
||||
active_extruder = 0;
|
||||
ENABLE_AXIS_E0();
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder));
|
||||
SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(extruder));
|
||||
}
|
||||
ui.reset_status();
|
||||
}
|
||||
@@ -602,8 +601,7 @@ static void mmu2_not_responding() {
|
||||
active_extruder = 0;
|
||||
|
||||
ENABLE_AXIS_E0();
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder));
|
||||
SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(extruder));
|
||||
|
||||
ui.reset_status();
|
||||
}
|
||||
@@ -698,8 +696,7 @@ static void mmu2_not_responding() {
|
||||
extruder = index; //filament change is finished
|
||||
active_extruder = 0;
|
||||
ENABLE_AXIS_E0();
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder));
|
||||
SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(extruder));
|
||||
ui.reset_status();
|
||||
}
|
||||
|
||||
|
||||
@@ -233,10 +233,10 @@
|
||||
void report_polled_driver_data(TMC &st, const TMC_driver_data &data) {
|
||||
const uint32_t pwm_scale = get_pwm_scale(st);
|
||||
st.printLabel();
|
||||
SERIAL_CHAR(':'); SERIAL_PRINT(pwm_scale, DEC);
|
||||
SERIAL_CHAR(':'); SERIAL_ECHO(pwm_scale);
|
||||
#if ENABLED(TMC_DEBUG)
|
||||
#if HAS_TMCX1X0 || HAS_TMC220x
|
||||
SERIAL_CHAR('/'); SERIAL_PRINT(data.cs_actual, DEC);
|
||||
SERIAL_CHAR('/'); SERIAL_ECHO(data.cs_actual);
|
||||
#endif
|
||||
#if HAS_STALLGUARD
|
||||
SERIAL_CHAR('/');
|
||||
@@ -257,7 +257,7 @@
|
||||
#endif
|
||||
if (st.flag_otpw) SERIAL_CHAR('F'); // otpw Flag
|
||||
SERIAL_CHAR('|');
|
||||
if (st.otpw_count > 0) SERIAL_PRINT(st.otpw_count, DEC);
|
||||
if (st.otpw_count > 0) SERIAL_ECHO(st.otpw_count);
|
||||
SERIAL_CHAR('\t');
|
||||
}
|
||||
|
||||
@@ -551,8 +551,8 @@
|
||||
#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130)
|
||||
static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) {
|
||||
switch (i) {
|
||||
case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break;
|
||||
case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break;
|
||||
case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break;
|
||||
case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
|
||||
case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break;
|
||||
case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
|
||||
default: break;
|
||||
@@ -563,9 +563,9 @@
|
||||
static void _tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) {
|
||||
switch (i) {
|
||||
case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('*'); break;
|
||||
case TMC_SG_RESULT: SERIAL_PRINT(st.sg_result(), DEC); break;
|
||||
case TMC_SG_RESULT: SERIAL_ECHO(st.sg_result()); break;
|
||||
case TMC_FSACTIVE: if (st.fsactive()) SERIAL_CHAR('*'); break;
|
||||
case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break;
|
||||
case TMC_DRV_CS_ACTUAL: SERIAL_ECHO(st.cs_actual()); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
@@ -580,13 +580,13 @@
|
||||
|
||||
static void _tmc_status(TMC2160Stepper &st, const TMC_debug_enum i) {
|
||||
switch (i) {
|
||||
case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break;
|
||||
case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break;
|
||||
case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break;
|
||||
case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
|
||||
case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break;
|
||||
case TMC_GLOBAL_SCALER:
|
||||
{
|
||||
uint16_t value = st.GLOBAL_SCALER();
|
||||
SERIAL_PRINT(value ?: 256, DEC);
|
||||
SERIAL_ECHO(value ? value : 256);
|
||||
SERIAL_ECHOPGM("/256");
|
||||
}
|
||||
break;
|
||||
@@ -599,10 +599,10 @@
|
||||
#if HAS_TMC220x
|
||||
static void _tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) {
|
||||
switch (i) {
|
||||
case TMC_PWM_SCALE_SUM: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break;
|
||||
case TMC_PWM_SCALE_AUTO: SERIAL_PRINT(st.pwm_scale_auto(), DEC); break;
|
||||
case TMC_PWM_OFS_AUTO: SERIAL_PRINT(st.pwm_ofs_auto(), DEC); break;
|
||||
case TMC_PWM_GRAD_AUTO: SERIAL_PRINT(st.pwm_grad_auto(), DEC); break;
|
||||
case TMC_PWM_SCALE_SUM: SERIAL_ECHO(st.pwm_scale_sum()); break;
|
||||
case TMC_PWM_SCALE_AUTO: SERIAL_ECHO(st.pwm_scale_auto()); break;
|
||||
case TMC_PWM_OFS_AUTO: SERIAL_ECHO(st.pwm_ofs_auto()); break;
|
||||
case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break;
|
||||
case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break;
|
||||
case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
|
||||
default: break;
|
||||
@@ -613,8 +613,8 @@
|
||||
template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
|
||||
static void _tmc_status(TMCMarlin<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const TMC_debug_enum i) {
|
||||
switch (i) {
|
||||
case TMC_SGT: SERIAL_PRINT(st.SGTHRS(), DEC); break;
|
||||
case TMC_UART_ADDR: SERIAL_PRINT(st.get_address(), DEC); break;
|
||||
case TMC_SGT: SERIAL_ECHO(st.SGTHRS()); break;
|
||||
case TMC_UART_ADDR: SERIAL_ECHO(st.get_address()); break;
|
||||
default:
|
||||
TMC2208Stepper *parent = &st;
|
||||
_tmc_status(*parent, i);
|
||||
@@ -631,7 +631,7 @@
|
||||
case TMC_T120: if (st.t120()) SERIAL_CHAR('*'); break;
|
||||
case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('*'); break;
|
||||
case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('*'); break;
|
||||
case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break;
|
||||
case TMC_DRV_CS_ACTUAL: SERIAL_ECHO(st.cs_actual()); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
@@ -639,7 +639,7 @@
|
||||
#if HAS_DRIVER(TMC2209)
|
||||
static void _tmc_parse_drv_status(TMC2209Stepper &st, const TMC_drv_status_enum i) {
|
||||
switch (i) {
|
||||
case TMC_SG_RESULT: SERIAL_PRINT(st.SG_RESULT(), DEC); break;
|
||||
case TMC_SG_RESULT: SERIAL_ECHO(st.SG_RESULT()); break;
|
||||
default: _tmc_parse_drv_status(static_cast<TMC2208Stepper &>(st), i); break;
|
||||
}
|
||||
}
|
||||
@@ -666,15 +666,15 @@
|
||||
case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break;
|
||||
case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break;
|
||||
case TMC_IRUN:
|
||||
SERIAL_PRINT(st.irun(), DEC);
|
||||
SERIAL_ECHO(st.irun());
|
||||
SERIAL_ECHOPGM("/31");
|
||||
break;
|
||||
case TMC_IHOLD:
|
||||
SERIAL_PRINT(st.ihold(), DEC);
|
||||
SERIAL_ECHO(st.ihold());
|
||||
SERIAL_ECHOPGM("/31");
|
||||
break;
|
||||
case TMC_CS_ACTUAL:
|
||||
SERIAL_PRINT(st.cs_actual(), DEC);
|
||||
SERIAL_ECHO(st.cs_actual());
|
||||
SERIAL_ECHOPGM("/31");
|
||||
break;
|
||||
case TMC_VSENSE: print_vsense(st); break;
|
||||
@@ -694,11 +694,11 @@
|
||||
#if ENABLED(MONITOR_DRIVER_STATUS)
|
||||
case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break;
|
||||
#endif
|
||||
case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break;
|
||||
case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break;
|
||||
case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break;
|
||||
case TMC_HSTRT: SERIAL_PRINT(st.hysteresis_start(), DEC); break;
|
||||
case TMC_MSCNT: SERIAL_PRINT(st.get_microstep_counter(), DEC); break;
|
||||
case TMC_TOFF: SERIAL_ECHO(st.toff()); break;
|
||||
case TMC_TBL: SERIAL_ECHO(st.blank_time()); break;
|
||||
case TMC_HEND: SERIAL_ECHO(st.hysteresis_end()); break;
|
||||
case TMC_HSTRT: SERIAL_ECHO(st.hysteresis_start()); break;
|
||||
case TMC_MSCNT: SERIAL_ECHO(st.get_microstep_counter()); break;
|
||||
default: _tmc_status(st, i); break;
|
||||
}
|
||||
}
|
||||
@@ -714,18 +714,18 @@
|
||||
case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break;
|
||||
case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break;
|
||||
case TMC_IRUN:
|
||||
SERIAL_PRINT(st.cs(), DEC);
|
||||
SERIAL_ECHO(st.cs());
|
||||
SERIAL_ECHOPGM("/31");
|
||||
break;
|
||||
case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.165") : PSTR("0=.310")); break;
|
||||
case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
|
||||
//case TMC_OTPW: serialprint_truefalse(st.otpw()); break;
|
||||
//case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break;
|
||||
case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break;
|
||||
case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break;
|
||||
case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break;
|
||||
case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break;
|
||||
case TMC_HSTRT: SERIAL_PRINT(st.hysteresis_start(), DEC); break;
|
||||
case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
|
||||
case TMC_TOFF: SERIAL_ECHO(st.toff()); break;
|
||||
case TMC_TBL: SERIAL_ECHO(st.blank_time()); break;
|
||||
case TMC_HEND: SERIAL_ECHO(st.hysteresis_end()); break;
|
||||
case TMC_HSTRT: SERIAL_ECHO(st.hysteresis_start()); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -142,8 +142,7 @@ void GcodeSuite::G29() {
|
||||
if (parser.seenval('I')) {
|
||||
ix = parser.value_int();
|
||||
if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1)) {
|
||||
SERIAL_ECHOPAIR("I out of range (0-", int(GRID_MAX_POINTS_X - 1));
|
||||
SERIAL_ECHOLNPGM(")");
|
||||
SERIAL_ECHOLNPAIR("I out of range (0-", int(GRID_MAX_POINTS_X - 1), ")");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -153,8 +152,7 @@ void GcodeSuite::G29() {
|
||||
if (parser.seenval('J')) {
|
||||
iy = parser.value_int();
|
||||
if (!WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) {
|
||||
SERIAL_ECHOPAIR("J out of range (0-", int(GRID_MAX_POINTS_Y - 1));
|
||||
SERIAL_ECHOLNPGM(")");
|
||||
SERIAL_ECHOLNPAIR("J out of range (0-", int(GRID_MAX_POINTS_Y - 1), ")");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -182,10 +180,8 @@ void GcodeSuite::G29() {
|
||||
|
||||
} // switch(state)
|
||||
|
||||
if (state == MeshNext) {
|
||||
SERIAL_ECHOPAIR("MBL G29 point ", _MIN(mbl_probe_index, GRID_MAX_POINTS));
|
||||
SERIAL_ECHOLNPAIR(" of ", int(GRID_MAX_POINTS));
|
||||
}
|
||||
if (state == MeshNext)
|
||||
SERIAL_ECHOLNPAIR("MBL G29 point ", _MIN(mbl_probe_index, GRID_MAX_POINTS), " of ", int(GRID_MAX_POINTS));
|
||||
|
||||
report_current_position();
|
||||
}
|
||||
|
||||
@@ -240,8 +240,8 @@ void GcodeSuite::M48() {
|
||||
sigma = SQRT(dev_sum / (n + 1));
|
||||
|
||||
if (verbose_level > 1) {
|
||||
SERIAL_ECHO(n + 1);
|
||||
SERIAL_ECHOPAIR(" of ", int(n_samples));
|
||||
SERIAL_ECHO((int)(n + 1));
|
||||
SERIAL_ECHOPAIR(" of ", (int)n_samples);
|
||||
SERIAL_ECHOPAIR_F(": z: ", pz, 3);
|
||||
SERIAL_CHAR(' ');
|
||||
dev_report(verbose_level > 2, mean, sigma, min, max);
|
||||
|
||||
@@ -34,7 +34,9 @@
|
||||
* U<angle> - Stowed Angle
|
||||
*/
|
||||
void GcodeSuite::M281() {
|
||||
|
||||
if (!parser.seenval('P')) return;
|
||||
|
||||
const int servo_index = parser.value_int();
|
||||
if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) {
|
||||
#if ENABLED(BLTOUCH)
|
||||
@@ -53,16 +55,14 @@ void GcodeSuite::M281() {
|
||||
angle_change = true;
|
||||
}
|
||||
if (!angle_change) {
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" Servo ", servo_index,
|
||||
" L", servo_angles[servo_index][0],
|
||||
" U", servo_angles[servo_index][1]);
|
||||
SERIAL_ECHO_MSG(" Servo ", servo_index,
|
||||
" L", servo_angles[servo_index][0],
|
||||
" U", servo_angles[servo_index][1]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
SERIAL_ERROR_START();
|
||||
SERIAL_ECHOLNPAIR("Servo ", servo_index, " out of range");
|
||||
}
|
||||
else
|
||||
SERIAL_ERROR_MSG("Servo ", servo_index, " out of range");
|
||||
|
||||
}
|
||||
|
||||
#endif // EDITABLE_SERVO_ANGLES
|
||||
|
||||
@@ -35,14 +35,15 @@
|
||||
* D<dval> - Set the D value
|
||||
*/
|
||||
void GcodeSuite::M304() {
|
||||
|
||||
if (parser.seen('P')) thermalManager.temp_bed.pid.Kp = parser.value_float();
|
||||
if (parser.seen('I')) thermalManager.temp_bed.pid.Ki = scalePID_i(parser.value_float());
|
||||
if (parser.seen('D')) thermalManager.temp_bed.pid.Kd = scalePID_d(parser.value_float());
|
||||
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" p:", thermalManager.temp_bed.pid.Kp,
|
||||
" i:", unscalePID_i(thermalManager.temp_bed.pid.Ki),
|
||||
" d:", unscalePID_d(thermalManager.temp_bed.pid.Kd));
|
||||
SERIAL_ECHO_MSG(" p:", thermalManager.temp_bed.pid.Kp,
|
||||
" i:", unscalePID_i(thermalManager.temp_bed.pid.Ki),
|
||||
" d:", unscalePID_d(thermalManager.temp_bed.pid.Kd));
|
||||
|
||||
}
|
||||
|
||||
#endif // PIDTEMPBED
|
||||
|
||||
@@ -49,10 +49,8 @@ void GcodeSuite::M305() {
|
||||
const bool do_set = parser.seen("BCRT");
|
||||
|
||||
// A valid P index is required
|
||||
if (t_index >= (USER_THERMISTORS) || (do_set && t_index < 0)) {
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("!Invalid index. (0 <= P <= ", int(USER_THERMISTORS - 1), ")");
|
||||
}
|
||||
if (t_index >= (USER_THERMISTORS) || (do_set && t_index < 0))
|
||||
SERIAL_ECHO_MSG("!Invalid index. (0 <= P <= ", int(USER_THERMISTORS - 1), ")");
|
||||
else if (do_set) {
|
||||
if (parser.seen('R')) // Pullup resistor value
|
||||
if (!thermalManager.set_pull_up_res(t_index, parser.value_float()))
|
||||
|
||||
@@ -31,7 +31,9 @@
|
||||
* M280: Get or set servo position. P<index> [S<angle>]
|
||||
*/
|
||||
void GcodeSuite::M280() {
|
||||
|
||||
if (!parser.seen('P')) return;
|
||||
|
||||
const int servo_index = parser.value_int();
|
||||
if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) {
|
||||
if (parser.seen('S')) {
|
||||
@@ -41,15 +43,12 @@ void GcodeSuite::M280() {
|
||||
else
|
||||
MOVE_SERVO(servo_index, a);
|
||||
}
|
||||
else {
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" Servo ", servo_index, ": ", servo[servo_index].read());
|
||||
}
|
||||
}
|
||||
else {
|
||||
SERIAL_ERROR_START();
|
||||
SERIAL_ECHOLNPAIR("Servo ", servo_index, " out of range");
|
||||
else
|
||||
SERIAL_ECHO_MSG(" Servo ", servo_index, ": ", servo[servo_index].read());
|
||||
}
|
||||
else
|
||||
SERIAL_ERROR_MSG("Servo ", servo_index, " out of range");
|
||||
|
||||
}
|
||||
|
||||
#endif // HAS_SERVOS
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
void GcodeSuite::M900() {
|
||||
|
||||
auto echo_value_oor = [](const char ltr, const bool ten=true) {
|
||||
SERIAL_CHAR('?'); SERIAL_CHAR(ltr);
|
||||
SERIAL_CHAR('?', ltr);
|
||||
SERIAL_ECHOPGM(" value out of range");
|
||||
if (ten) SERIAL_ECHOPGM(" (0-10)");
|
||||
SERIAL_ECHOLNPGM(".");
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
#include "../HAL/shared/eeprom_if.h"
|
||||
#include "../HAL/shared/Delay.h"
|
||||
|
||||
extern void dump_delay_accuracy_check();
|
||||
|
||||
/**
|
||||
* Dn: G-code for development and testing
|
||||
*
|
||||
@@ -141,7 +143,7 @@
|
||||
}
|
||||
} break;
|
||||
|
||||
case 5: { // D4 Read / Write onboard Flash
|
||||
case 5: { // D5 Read / Write onboard Flash
|
||||
#define FLASH_SIZE 1024
|
||||
uint8_t *pointer = parser.hex_adr_val('A');
|
||||
uint16_t len = parser.ushortval('C', 1);
|
||||
@@ -162,6 +164,10 @@
|
||||
}
|
||||
} break;
|
||||
|
||||
case 6: // D6 Check delay loop accuracy
|
||||
dump_delay_accuracy_check();
|
||||
break;
|
||||
|
||||
case 100: { // D100 Disable heaters and attempt a hard hang (Watchdog Test)
|
||||
SERIAL_ECHOLNPGM("Disabling heaters and attempting to trigger Watchdog");
|
||||
SERIAL_ECHOLNPGM("(USE_WATCHDOG " TERN(USE_WATCHDOG, "ENABLED", "DISABLED") ")");
|
||||
|
||||
@@ -32,14 +32,14 @@
|
||||
* S<seconds> Optional. Set the keepalive interval.
|
||||
*/
|
||||
void GcodeSuite::M113() {
|
||||
|
||||
if (parser.seenval('S')) {
|
||||
host_keepalive_interval = parser.value_byte();
|
||||
NOMORE(host_keepalive_interval, 60);
|
||||
}
|
||||
else {
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("M113 S", (unsigned long)host_keepalive_interval);
|
||||
}
|
||||
else
|
||||
SERIAL_ECHO_MSG("M113 S", (uint16_t)host_keepalive_interval);
|
||||
|
||||
}
|
||||
|
||||
#endif // HOST_KEEPALIVE_FEATURE
|
||||
|
||||
@@ -35,8 +35,8 @@
|
||||
static void cap_line(PGM_P const name, bool ena=false) {
|
||||
SERIAL_ECHOPGM("Cap:");
|
||||
serialprintPGM(name);
|
||||
SERIAL_CHAR(':');
|
||||
SERIAL_ECHOLN(int(ena ? 1 : 0));
|
||||
SERIAL_CHAR(':', ena ? '1' : '0');
|
||||
SERIAL_EOL();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -42,14 +42,12 @@
|
||||
FORCE_INLINE void mod_probe_offset(const float &offs) {
|
||||
if (TERN1(BABYSTEP_HOTEND_Z_OFFSET, active_extruder == 0)) {
|
||||
probe.offset.z += offs;
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(STR_PROBE_OFFSET " " STR_Z, probe.offset.z);
|
||||
SERIAL_ECHO_MSG(STR_PROBE_OFFSET " " STR_Z, probe.offset.z);
|
||||
}
|
||||
else {
|
||||
#if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
|
||||
hotend_offset[active_extruder].z -= offs;
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(STR_PROBE_OFFSET STR_Z ": ", hotend_offset[active_extruder].z);
|
||||
SERIAL_ECHO_MSG(STR_PROBE_OFFSET STR_Z ": ", hotend_offset[active_extruder].z);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -298,10 +298,9 @@ void GCodeQueue::ok_to_send() {
|
||||
#if ENABLED(ADVANCED_OK)
|
||||
char* p = command_buffer[index_r];
|
||||
if (*p == 'N') {
|
||||
SERIAL_ECHO(' ');
|
||||
SERIAL_ECHO(*p++);
|
||||
SERIAL_CHAR(' ', *p++);
|
||||
while (NUMERIC_SIGNED(*p))
|
||||
SERIAL_ECHO(*p++);
|
||||
SERIAL_CHAR(*p++);
|
||||
}
|
||||
SERIAL_ECHOPAIR_P(SP_P_STR, int(planner.moves_free()),
|
||||
SP_B_STR, int(BUFSIZE - length));
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
#include "../gcode.h"
|
||||
#include "../../sd/cardreader.h"
|
||||
#include "../../lcd/marlinui.h"
|
||||
|
||||
/**
|
||||
* M21: Init SD Card
|
||||
@@ -36,9 +37,8 @@ void GcodeSuite::M21() { card.mount(); }
|
||||
* M22: Release SD Card
|
||||
*/
|
||||
void GcodeSuite::M22() {
|
||||
|
||||
if (!IS_SD_PRINTING()) card.release();
|
||||
|
||||
IF_ENABLED(TFT_COLOR_UI, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT));
|
||||
}
|
||||
|
||||
#endif // SDSUPPORT
|
||||
|
||||
@@ -35,6 +35,5 @@ void GcodeSuite::M31() {
|
||||
|
||||
ui.set_status(buffer);
|
||||
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("Print time: ", buffer);
|
||||
SERIAL_ECHO_MSG("Print time: ", buffer);
|
||||
}
|
||||
|
||||
@@ -516,34 +516,3 @@
|
||||
(defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || \
|
||||
(defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT == (N)) || \
|
||||
(defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N))
|
||||
#if ANY_SERIAL_IS(-1)
|
||||
#define USING_SERIAL_DEFAULT
|
||||
#endif
|
||||
#if ANY_SERIAL_IS(0)
|
||||
#define USING_SERIAL_0 1
|
||||
#endif
|
||||
#if ANY_SERIAL_IS(1)
|
||||
#define USING_SERIAL_1 1
|
||||
#endif
|
||||
#if ANY_SERIAL_IS(2)
|
||||
#define USING_SERIAL_2 1
|
||||
#endif
|
||||
#if ANY_SERIAL_IS(3)
|
||||
#define USING_SERIAL_3 1
|
||||
#endif
|
||||
#if ANY_SERIAL_IS(4)
|
||||
#define USING_SERIAL_4 1
|
||||
#endif
|
||||
#if ANY_SERIAL_IS(5)
|
||||
#define USING_SERIAL_5 1
|
||||
#endif
|
||||
#if ANY_SERIAL_IS(6)
|
||||
#define USING_SERIAL_6 1
|
||||
#endif
|
||||
#if ANY_SERIAL_IS(7)
|
||||
#define USING_SERIAL_7 1
|
||||
#endif
|
||||
#if ANY_SERIAL_IS(8)
|
||||
#define USING_SERIAL_8 1
|
||||
#endif
|
||||
#undef ANY_SERIAL_IS
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
* version was tagged.
|
||||
*/
|
||||
#ifndef STRING_DISTRIBUTION_DATE
|
||||
#define STRING_DISTRIBUTION_DATE "2021-01-30"
|
||||
#define STRING_DISTRIBUTION_DATE "2021-02-06"
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
@@ -141,9 +141,7 @@ void AnycubicTFTClass::OnKillTFT() {
|
||||
|
||||
void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) {
|
||||
#if ENABLED(ANYCUBIC_LCD_DEBUG)
|
||||
SERIAL_ECHOPGM("TFT Serial Debug: OnSDCardStateChange event triggered...");
|
||||
SERIAL_ECHO(ui8tostr2(isInserted));
|
||||
SERIAL_EOL();
|
||||
SERIAL_ECHOLNPAIR("TFT Serial Debug: OnSDCardStateChange event triggered...", (int)isInserted);
|
||||
#endif
|
||||
DoSDCardStateCheck();
|
||||
}
|
||||
@@ -164,8 +162,7 @@ void AnycubicTFTClass::OnFilamentRunout() {
|
||||
|
||||
void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) {
|
||||
#if ENABLED(ANYCUBIC_LCD_DEBUG)
|
||||
SERIAL_ECHOPGM("TFT Serial Debug: OnUserConfirmRequired triggered... ");
|
||||
SERIAL_ECHOLN(msg);
|
||||
SERIAL_ECHOLNPAIR("TFT Serial Debug: OnUserConfirmRequired triggered... ", msg);
|
||||
#endif
|
||||
|
||||
#if ENABLED(SDSUPPORT)
|
||||
@@ -555,10 +552,8 @@ void AnycubicTFTClass::GetCommandFromTFT() {
|
||||
a_command = ((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], nullptr))));
|
||||
|
||||
#if ENABLED(ANYCUBIC_LCD_DEBUG)
|
||||
if ((a_command > 7) && (a_command != 20)) { // No debugging of status polls, please!
|
||||
SERIAL_ECHOPGM("TFT Serial Command: ");
|
||||
SERIAL_ECHOLN(TFTcmdbuffer[TFTbufindw]);
|
||||
}
|
||||
if ((a_command > 7) && (a_command != 20)) // No debugging of status polls, please!
|
||||
SERIAL_ECHOLNPAIR("TFT Serial Command: ", TFTcmdbuffer[TFTbufindw]);
|
||||
#endif
|
||||
|
||||
switch (a_command) {
|
||||
|
||||
@@ -1074,7 +1074,7 @@ void CLCD::init() {
|
||||
uint8_t device_id = mem_read_8(REG::ID); // Read Device ID, Should Be 0x7C;
|
||||
if (device_id == 0x7C) {
|
||||
#if ENABLED(TOUCH_UI_DEBUG)
|
||||
SERIAL_ECHO_MSG("FTDI chip initialized ");
|
||||
SERIAL_ECHO_MSG("FTDI chip initialized");
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
@@ -1082,11 +1082,10 @@ void CLCD::init() {
|
||||
delay(1);
|
||||
|
||||
if (counter == 249) {
|
||||
#if ENABLED(TOUCH_UI_DEBUG)
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("Timeout waiting for device ID, should be 124, got ", device_id);
|
||||
#endif
|
||||
}
|
||||
#if ENABLED(TOUCH_UI_DEBUG)
|
||||
SERIAL_ECHO_MSG("Timeout waiting for device ID, should be 124, got ", int(device_id));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/* make sure that all units are in working conditions, usually the touch-controller needs a little more time */
|
||||
@@ -1101,10 +1100,8 @@ void CLCD::init() {
|
||||
else
|
||||
delay(1);
|
||||
|
||||
if (ENABLED(TOUCH_UI_DEBUG) && counter == 99) {
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("Timeout waiting for reset status. Should be 0x00, got ", reset_status);
|
||||
}
|
||||
if (ENABLED(TOUCH_UI_DEBUG) && counter == 99)
|
||||
SERIAL_ECHO_MSG("Timeout waiting for reset status. Should be 0x00, got ", int(reset_status));
|
||||
}
|
||||
|
||||
mem_write_8(REG::PWM_DUTY, 0); // turn off Backlight, Frequency already is set to 250Hz default
|
||||
|
||||
@@ -124,8 +124,7 @@ namespace FTDI {
|
||||
case UNPRESSED:
|
||||
if (tag != 0) {
|
||||
#if ENABLED(TOUCH_UI_DEBUG)
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("Touch start: ", tag);
|
||||
SERIAL_ECHO_MSG("Touch start: ", int(tag));
|
||||
#endif
|
||||
|
||||
pressed_tag = tag;
|
||||
@@ -186,8 +185,7 @@ namespace FTDI {
|
||||
if (UIData::flags.bits.touch_end_sound) sound.play(unpress_sound);
|
||||
|
||||
#if ENABLED(TOUCH_UI_DEBUG)
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("Touch end: ", pressed_tag);
|
||||
SERIAL_ECHO_MSG("Touch end: ", int(pressed_tag));
|
||||
#endif
|
||||
|
||||
const uint8_t saved_pressed_tag = pressed_tag;
|
||||
|
||||
@@ -43,8 +43,7 @@ void ScreenRef::setScreen(onRedraw_func_t onRedraw_ptr) {
|
||||
if (type != 0xFF) {
|
||||
setType(type);
|
||||
#if ENABLED(TOUCH_UI_DEBUG)
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("New screen: ", type);
|
||||
SERIAL_ECHO_MSG("New screen: ", int(type));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,8 +127,7 @@ void BioPrintingDialogBox::setStatusMessage(const char* message) {
|
||||
storeBackground();
|
||||
|
||||
#if ENABLED(TOUCH_UI_DEBUG)
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("New status message: ", message);
|
||||
SERIAL_ECHO_MSG("New status message: ", message);
|
||||
#endif
|
||||
|
||||
if (AT_SCREEN(BioPrintingDialogBox))
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "../../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if HAS_TFT_LVGL_UI
|
||||
|
||||
#include "draw_ui.h"
|
||||
#include <lv_conf.h>
|
||||
|
||||
#include "../../../../inc/MarlinConfig.h"
|
||||
|
||||
extern lv_group_t *g;
|
||||
static lv_obj_t *scr,*outL,*outV = 0;
|
||||
static int currentWritePos = 0;
|
||||
extern uint8_t public_buf[513];
|
||||
extern "C" { extern char public_buf_m[100]; }
|
||||
|
||||
enum {
|
||||
ID_GCODE_RETURN = 1,
|
||||
ID_GCODE_COMMAND,
|
||||
};
|
||||
|
||||
static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
if (event != LV_EVENT_RELEASED) return;
|
||||
lv_clear_gcode();
|
||||
switch (obj->mks_obj_id) {
|
||||
case ID_GCODE_RETURN:
|
||||
lv_draw_more();
|
||||
return;
|
||||
case ID_GCODE_COMMAND:
|
||||
keyboard_value = GCodeCommand;
|
||||
lv_draw_keyboard();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void lv_show_gcode_output(void * that, const char * txt) {
|
||||
// Ignore echo of command
|
||||
if (!memcmp(txt, "echo:", 5)) {
|
||||
public_buf[0] = 0; // Clear output buffer
|
||||
return;
|
||||
}
|
||||
|
||||
// Avoid overflow if the answer is too large
|
||||
size_t len = strlen((const char*)public_buf), tlen = strlen(txt);
|
||||
if (len + tlen + 1 < sizeof(public_buf)) {
|
||||
memcpy(public_buf + len, txt, tlen);
|
||||
public_buf[len + tlen] = '\n';
|
||||
}
|
||||
}
|
||||
|
||||
void lv_serial_capt_hook(void * userPointer, uint8_t c)
|
||||
{
|
||||
if (c == '\n' || currentWritePos == sizeof(public_buf_m) - 1) { // End of line, probably end of command anyway
|
||||
public_buf_m[currentWritePos] = 0;
|
||||
lv_show_gcode_output(userPointer, public_buf_m);
|
||||
currentWritePos = 0;
|
||||
}
|
||||
else public_buf_m[currentWritePos++] = c;
|
||||
}
|
||||
void lv_eom_hook(void *)
|
||||
{
|
||||
// Message is done, let's remove the hook now
|
||||
MYSERIAL0.setHook();
|
||||
// We are back from the keyboard, so let's redraw ourselves
|
||||
draw_return_ui();
|
||||
}
|
||||
|
||||
void lv_draw_gcode(bool clear) {
|
||||
if (clear) {
|
||||
currentWritePos = 0;
|
||||
public_buf[0] = 0;
|
||||
}
|
||||
scr = lv_screen_create(GCODE_UI, more_menu.gcode);
|
||||
lv_screen_menu_item(scr, more_menu.entergcode, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_GCODE_COMMAND, 1);
|
||||
outL = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2, "Result:");
|
||||
outV = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3, (const char*)public_buf);
|
||||
|
||||
lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_GCODE_RETURN, true);
|
||||
}
|
||||
|
||||
void lv_clear_gcode() {
|
||||
#if HAS_ROTARY_ENCODER
|
||||
if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g);
|
||||
#endif
|
||||
lv_obj_del(scr);
|
||||
outV = 0;
|
||||
}
|
||||
|
||||
#endif // HAS_TFT_LVGL_UI
|
||||
@@ -0,0 +1,33 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* C-declarations for C++ */
|
||||
#endif
|
||||
|
||||
extern void lv_draw_gcode(bool clear = false);
|
||||
extern void lv_clear_gcode();
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* C-declarations for C++ */
|
||||
#endif
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <lv_conf.h>
|
||||
|
||||
#include "../../../../inc/MarlinConfig.h"
|
||||
#include "../../../../gcode/queue.h"
|
||||
|
||||
extern lv_group_t *g;
|
||||
static lv_obj_t *scr;
|
||||
@@ -153,13 +154,22 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) {
|
||||
lv_draw_wifi_tips();
|
||||
break;
|
||||
#endif // MKS_WIFI_MODULE
|
||||
case gcodeCommand:
|
||||
case autoLevelGcodeCommand:
|
||||
uint8_t buf[100];
|
||||
strncpy((char *)buf,ret_ta_txt,sizeof(buf));
|
||||
update_gcode_command(AUTO_LEVELING_COMMAND_ADDR,buf);
|
||||
lv_clear_keyboard();
|
||||
draw_return_ui();
|
||||
break;
|
||||
case GCodeCommand:
|
||||
if (queue.length <= (BUFSIZE - 3)) {
|
||||
// Hook anything that goes to the serial port
|
||||
MYSERIAL0.setHook(lv_serial_capt_hook, lv_eom_hook, 0);
|
||||
queue.enqueue_one_now(ret_ta_txt);
|
||||
}
|
||||
lv_clear_keyboard();
|
||||
// draw_return_ui is called in the end of message hook
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
@@ -238,12 +248,18 @@ void lv_draw_keyboard() {
|
||||
// Create a text area. The keyboard will write here
|
||||
lv_obj_t *ta = lv_ta_create(scr, nullptr);
|
||||
lv_obj_align(ta, nullptr, LV_ALIGN_IN_TOP_MID, 0, 10);
|
||||
if (keyboard_value == gcodeCommand) {
|
||||
switch (keyboard_value) {
|
||||
case autoLevelGcodeCommand:
|
||||
get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m);
|
||||
public_buf_m[sizeof(public_buf_m)-1] = 0;
|
||||
lv_ta_set_text(ta, public_buf_m);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
case GCodeCommand:
|
||||
// Start with uppercase by default
|
||||
lv_btnm_set_map(kb, kb_map_uc);
|
||||
lv_btnm_set_ctrl_map(kb, kb_ctrl_uc_map);
|
||||
// Fallthrough
|
||||
default:
|
||||
lv_ta_set_text(ta, "");
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
lv_draw_manual_level_pos_settings();
|
||||
break;
|
||||
case ID_LEVEL_COMMAND:
|
||||
keyboard_value = gcodeCommand;
|
||||
keyboard_value = autoLevelGcodeCommand;
|
||||
lv_draw_keyboard();
|
||||
break;
|
||||
#if HAS_BED_PROBE
|
||||
|
||||
@@ -33,28 +33,53 @@
|
||||
extern lv_group_t * g;
|
||||
static lv_obj_t * scr;
|
||||
|
||||
#define HAS_USER_ITEM(N) (ENABLED(CUSTOM_USER_MENUS) && defined(USER_DESC_##N) && defined(USER_GCODE_##N))
|
||||
|
||||
enum {
|
||||
ID_GCODE = 1,
|
||||
ID_CUSTOM_1,
|
||||
ID_CUSTOM_2,
|
||||
ID_CUSTOM_3,
|
||||
ID_CUSTOM_4,
|
||||
ID_CUSTOM_5,
|
||||
ID_CUSTOM_6,
|
||||
ID_CUSTOM_7,
|
||||
#if HAS_USER_ITEM(1)
|
||||
ID_CUSTOM_1,
|
||||
#endif
|
||||
#if HAS_USER_ITEM(2)
|
||||
ID_CUSTOM_2,
|
||||
#endif
|
||||
#if HAS_USER_ITEM(3)
|
||||
ID_CUSTOM_3,
|
||||
#endif
|
||||
#if HAS_USER_ITEM(4)
|
||||
ID_CUSTOM_4,
|
||||
#endif
|
||||
#if HAS_USER_ITEM(5)
|
||||
ID_CUSTOM_5,
|
||||
#endif
|
||||
#if HAS_USER_ITEM(6)
|
||||
ID_CUSTOM_6,
|
||||
#endif
|
||||
ID_M_RETURN,
|
||||
};
|
||||
|
||||
static void event_handler(lv_obj_t * obj, lv_event_t event) {
|
||||
if (event != LV_EVENT_RELEASED) return;
|
||||
switch (obj->mks_obj_id) {
|
||||
case ID_CUSTOM_1: TERN_(USER_CMD_1_ENABLE, queue.inject_P(PSTR(USER_GCODE_1))); break;
|
||||
case ID_CUSTOM_2: TERN_(USER_CMD_2_ENABLE, queue.inject_P(PSTR(USER_GCODE_2))); break;
|
||||
case ID_CUSTOM_3: TERN_(USER_CMD_3_ENABLE, queue.inject_P(PSTR(USER_GCODE_3))); break;
|
||||
case ID_CUSTOM_4: TERN_(USER_CMD_4_ENABLE, queue.inject_P(PSTR(USER_GCODE_4))); break;
|
||||
case ID_CUSTOM_5: TERN_(USER_CMD_5_ENABLE, queue.inject_P(PSTR(USER_GCODE_5))); break;
|
||||
case ID_CUSTOM_6: TERN_(USER_CMD_6_ENABLE, queue.inject_P(PSTR(USER_GCODE_6))); break;
|
||||
case ID_CUSTOM_7: TERN_(USER_CMD_7_ENABLE, queue.inject_P(PSTR(USER_GCODE_7))); break;
|
||||
case ID_GCODE: lv_clear_more(); lv_draw_gcode(true); break;
|
||||
#if HAS_USER_ITEM(1)
|
||||
case ID_CUSTOM_1: queue.inject_P(PSTR(USER_GCODE_1)); break;
|
||||
#endif
|
||||
#if HAS_USER_ITEM(2)
|
||||
case ID_CUSTOM_2: queue.inject_P(PSTR(USER_GCODE_2)); break;
|
||||
#endif
|
||||
#if HAS_USER_ITEM(3)
|
||||
case ID_CUSTOM_3: queue.inject_P(PSTR(USER_GCODE_3)); break;
|
||||
#endif
|
||||
#if HAS_USER_ITEM(4)
|
||||
case ID_CUSTOM_4: queue.inject_P(PSTR(USER_GCODE_4)); break;
|
||||
#endif
|
||||
#if HAS_USER_ITEM(5)
|
||||
case ID_CUSTOM_5: queue.inject_P(PSTR(USER_GCODE_5)); break;
|
||||
#endif
|
||||
#if HAS_USER_ITEM(6)
|
||||
case ID_CUSTOM_6: queue.inject_P(PSTR(USER_GCODE_6)); break;
|
||||
#endif
|
||||
case ID_M_RETURN:
|
||||
lv_clear_more();
|
||||
lv_draw_tool();
|
||||
@@ -67,94 +92,103 @@ void lv_draw_more() {
|
||||
|
||||
const bool enc_ena = TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable);
|
||||
|
||||
#if ENABLED(USER_CMD_1_ENABLE)
|
||||
lv_obj_t *buttonCustom1 = lv_imgbtn_create(scr, "F:/bmp_custom1.bin", INTERVAL_V, titleHeight, event_handler, ID_CUSTOM_1);
|
||||
lv_obj_t *buttonGCode = lv_imgbtn_create(scr, "F:/bmp_machine_para.bin", INTERVAL_V, titleHeight, event_handler, ID_GCODE);
|
||||
if (enc_ena) lv_group_add_obj(g, buttonGCode);
|
||||
lv_obj_t *labelGCode = lv_label_create_empty(buttonGCode);
|
||||
|
||||
#if HAS_USER_ITEM(1)
|
||||
lv_obj_t *buttonCustom1 = lv_imgbtn_create(scr, "F:/bmp_custom1.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_CUSTOM_1);
|
||||
if (enc_ena) lv_group_add_obj(g, buttonCustom1);
|
||||
lv_obj_t *labelCustom1 = lv_label_create_empty(buttonCustom1);
|
||||
#endif
|
||||
|
||||
#if ENABLED(USER_CMD_2_ENABLE)
|
||||
lv_obj_t *buttonCustom2 = lv_imgbtn_create(scr, "F:/bmp_custom2.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_CUSTOM_2);
|
||||
#if HAS_USER_ITEM(2)
|
||||
lv_obj_t *buttonCustom2 = lv_imgbtn_create(scr, "F:/bmp_custom2.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_CUSTOM_2);
|
||||
if (enc_ena) lv_group_add_obj(g, buttonCustom2);
|
||||
lv_obj_t *labelCustom2 = lv_label_create_empty(buttonCustom2);
|
||||
#endif
|
||||
|
||||
#if ENABLED(USER_CMD_3_ENABLE)
|
||||
lv_obj_t *buttonCustom3 = lv_imgbtn_create(scr, "F:/bmp_custom3.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_CUSTOM_3);
|
||||
#if HAS_USER_ITEM(3)
|
||||
lv_obj_t *buttonCustom3 = lv_imgbtn_create(scr, "F:/bmp_custom3.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_CUSTOM_3);
|
||||
if (enc_ena) lv_group_add_obj(g, buttonCustom3);
|
||||
lv_obj_t *labelCustom3 = lv_label_create_empty(buttonCustom3);
|
||||
#endif
|
||||
|
||||
#if ENABLED(USER_CMD_4_ENABLE)
|
||||
lv_obj_t *buttonCustom4 = lv_imgbtn_create(scr, "F:/bmp_custom4.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_CUSTOM_4);
|
||||
#if HAS_USER_ITEM(4)
|
||||
lv_obj_t *buttonCustom4 = lv_imgbtn_create(scr, "F:/bmp_custom4.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_4);
|
||||
if (enc_ena) lv_group_add_obj(g, buttonCustom4);
|
||||
lv_obj_t *labelCustom4 = lv_label_create_empty(buttonCustom4);
|
||||
#endif
|
||||
|
||||
#if ENABLED(USER_CMD_5_ENABLE)
|
||||
lv_obj_t *buttonCustom5 = lv_imgbtn_create(scr, "F:/bmp_custom5.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_5);
|
||||
#if HAS_USER_ITEM(5)
|
||||
lv_obj_t *buttonCustom5 = lv_imgbtn_create(scr, "F:/bmp_custom5.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_5);
|
||||
if (enc_ena) lv_group_add_obj(g, buttonCustom5);
|
||||
lv_obj_t *labelCustom5 = lv_label_create_empty(buttonCustom5);
|
||||
#endif
|
||||
|
||||
#if ENABLED(USER_CMD_6_ENABLE)
|
||||
lv_obj_t *buttonCustom6 = lv_imgbtn_create(scr, "F:/bmp_custom6.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_6);
|
||||
#if HAS_USER_ITEM(6)
|
||||
lv_obj_t *buttonCustom6 = lv_imgbtn_create(scr, "F:/bmp_custom6.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_6);
|
||||
if (enc_ena) lv_group_add_obj(g, buttonCustom6);
|
||||
lv_obj_t *labelCustom6 = lv_label_create_empty(buttonCustom6);
|
||||
#endif
|
||||
|
||||
#if ENABLED(USER_CMD_7_ENABLE)
|
||||
blv_obj_t *uttonCustom7 = lv_imgbtn_create(scr, "F:/bmp_custom7.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_7);
|
||||
if (enc_ena) lv_group_add_obj(g, buttonCustom7);
|
||||
lv_obj_t *labelCustom7 = lv_label_create_empty(buttonCustom7);
|
||||
#endif
|
||||
|
||||
lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN);
|
||||
if (enc_ena) lv_group_add_obj(g, buttonBack);
|
||||
lv_obj_t *label_Back = lv_label_create_empty(buttonBack);
|
||||
|
||||
if (gCfgItems.multiple_language != 0) {
|
||||
#if ENABLED(USER_CMD_1_ENABLE)
|
||||
lv_label_set_text(labelGCode, more_menu.gcode);
|
||||
lv_obj_align(labelGCode, buttonGCode, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
|
||||
#if HAS_USER_ITEM(1)
|
||||
lv_label_set_text(labelCustom1, more_menu.custom1);
|
||||
lv_obj_align(labelCustom1, buttonCustom1, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
#endif
|
||||
#if ENABLED(USER_CMD_2_ENABLE)
|
||||
#if HAS_USER_ITEM(2)
|
||||
lv_label_set_text(labelCustom2, more_menu.custom2);
|
||||
lv_obj_align(labelCustom2, buttonCustom2, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
#endif
|
||||
#if ENABLED(USER_CMD_3_ENABLE)
|
||||
#if HAS_USER_ITEM(3)
|
||||
lv_label_set_text(labelCustom3, more_menu.custom3);
|
||||
lv_obj_align(labelCustom3, buttonCustom3, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
#endif
|
||||
#if ENABLED(USER_CMD_4_ENABLE)
|
||||
#if HAS_USER_ITEM(4)
|
||||
lv_label_set_text(labelCustom4, more_menu.custom4);
|
||||
lv_obj_align(labelCustom4, buttonCustom4, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
#endif
|
||||
#if ENABLED(USER_CMD_5_ENABLE)
|
||||
#if HAS_USER_ITEM(5)
|
||||
lv_label_set_text(labelCustom5, more_menu.custom5);
|
||||
lv_obj_align(labelCustom5, buttonCustom5, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
#endif
|
||||
#if ENABLED(USER_CMD_6_ENABLE)
|
||||
#if HAS_USER_ITEM(6)
|
||||
lv_label_set_text(labelCustom6, more_menu.custom6);
|
||||
lv_obj_align(labelCustom6, buttonCustom6, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
#endif
|
||||
#if ENABLED(USER_CMD_7_ENABLE)
|
||||
lv_label_set_text(labelCustom7, more_menu.custom7);
|
||||
lv_obj_align(labelCustom7, buttonCustom7, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
#endif
|
||||
lv_label_set_text(label_Back, common_menu.text_back);
|
||||
lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
}
|
||||
|
||||
#if BUTTONS_EXIST(EN1, EN2, ENC)
|
||||
if (enc_ena) {
|
||||
TERN_(USER_CMD_1_ENABLE, lv_group_add_obj(g, buttonCustom1));
|
||||
TERN_(USER_CMD_2_ENABLE, lv_group_add_obj(g, buttonCustom2));
|
||||
TERN_(USER_CMD_3_ENABLE, lv_group_add_obj(g, buttonCustom3));
|
||||
TERN_(USER_CMD_4_ENABLE, lv_group_add_obj(g, buttonCustom4));
|
||||
TERN_(USER_CMD_5_ENABLE, lv_group_add_obj(g, buttonCustom5));
|
||||
TERN_(USER_CMD_6_ENABLE, lv_group_add_obj(g, buttonCustom6));
|
||||
TERN_(USER_CMD_7_ENABLE, lv_group_add_obj(g, buttonCustom7));
|
||||
lv_group_add_obj(g, buttonGCode);
|
||||
#if HAS_USER_ITEM(1)
|
||||
lv_group_add_obj(g, buttonCustom1);
|
||||
#endif
|
||||
#if HAS_USER_ITEM(2)
|
||||
lv_group_add_obj(g, buttonCustom2);
|
||||
#endif
|
||||
#if HAS_USER_ITEM(3)
|
||||
lv_group_add_obj(g, buttonCustom3);
|
||||
#endif
|
||||
#if HAS_USER_ITEM(4)
|
||||
lv_group_add_obj(g, buttonCustom4);
|
||||
#endif
|
||||
#if HAS_USER_ITEM(5)
|
||||
lv_group_add_obj(g, buttonCustom5);
|
||||
#endif
|
||||
#if HAS_USER_ITEM(6)
|
||||
lv_group_add_obj(g, buttonCustom6);
|
||||
#endif
|
||||
lv_group_add_obj(g, buttonBack);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -71,7 +71,9 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[uiCfg.curSprayerChoose].target;
|
||||
lv_draw_filament_change();
|
||||
break;
|
||||
case ID_T_MORE: break;
|
||||
case ID_T_MORE:
|
||||
lv_draw_more();
|
||||
break;
|
||||
case ID_T_RETURN:
|
||||
TERN_(MKS_TEST, curent_disp_ui = 1);
|
||||
lv_draw_ready_print();
|
||||
@@ -87,6 +89,7 @@ void lv_draw_tool() {
|
||||
lv_big_button_create(scr, "F:/bmp_zero.bin", tool_menu.home, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_T_HOME);
|
||||
lv_big_button_create(scr, "F:/bmp_leveling.bin", tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling), INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_LEVELING);
|
||||
lv_big_button_create(scr, "F:/bmp_filamentchange.bin", tool_menu.filament, BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight, event_handler,ID_T_FILAMENT);
|
||||
lv_big_button_create(scr, "F:/bmp_more.bin", tool_menu.more, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_MORE);
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -1077,6 +1077,7 @@ void draw_return_ui() {
|
||||
case NOZZLE_PROBE_OFFSET_UI: lv_draw_auto_level_offset_settings(); break;
|
||||
#endif
|
||||
case TOOL_UI: lv_draw_tool(); break;
|
||||
case GCODE_UI: lv_draw_gcode(); break;
|
||||
case MESHLEVELING_UI: break;
|
||||
case HARDWARE_TEST_UI: break;
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#include "draw_preHeat.h"
|
||||
#include "draw_extrusion.h"
|
||||
#include "draw_home.h"
|
||||
#include "draw_gcode.h"
|
||||
#include "draw_more.h"
|
||||
#include "draw_move_motor.h"
|
||||
#include "draw_fan.h"
|
||||
@@ -326,7 +327,8 @@ typedef enum {
|
||||
WIFI_SETTINGS_UI,
|
||||
HOMING_SENSITIVITY_UI,
|
||||
ENCODER_SETTINGS_UI,
|
||||
TOUCH_CALIBRATION_UI
|
||||
TOUCH_CALIBRATION_UI,
|
||||
GCODE_UI,
|
||||
} DISP_STATE;
|
||||
|
||||
typedef struct {
|
||||
@@ -413,7 +415,8 @@ typedef enum {
|
||||
wifiName,
|
||||
wifiPassWord,
|
||||
wifiConfig,
|
||||
gcodeCommand
|
||||
autoLevelGcodeCommand,
|
||||
GCodeCommand,
|
||||
} keyboard_value_state;
|
||||
extern keyboard_value_state keyboard_value;
|
||||
|
||||
@@ -449,6 +452,8 @@ extern void preview_gcode_prehandle(char *path);
|
||||
extern void update_spi_flash();
|
||||
extern void update_gcode_command(int addr,uint8_t *s);
|
||||
extern void get_gcode_command(int addr,uint8_t *d);
|
||||
extern void lv_serial_capt_hook(void *, uint8_t);
|
||||
extern void lv_eom_hook(void *);
|
||||
#if HAS_GCODE_PREVIEW
|
||||
extern void disp_pre_gcode(int xpos_pixel, int ypos_pixel);
|
||||
#endif
|
||||
|
||||
@@ -279,6 +279,8 @@
|
||||
#define AUTO_LEVELING_TEXT_EN "AutoLevel"
|
||||
#define SET_TEXT_EN "Settings"
|
||||
#define MORE_TEXT_EN "More"
|
||||
#define MORE_GCODE_EN "G-Code"
|
||||
#define MORE_ENTER_GCODE_EN "Enter G-Code"
|
||||
|
||||
#define ADD_TEXT_EN "Add"
|
||||
#define DEC_TEXT_EN "Dec"
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#pragma once
|
||||
|
||||
//*************法文****************************//
|
||||
#define TOOL_TEXT_FR "prêt"
|
||||
#define TOOL_TEXT_FR "Prêt"
|
||||
#define PREHEAT_TEXT_FR "Préchauffe"
|
||||
#define MOVE_TEXT_FR "Déplace"
|
||||
#define HOME_TEXT_FR "Acceuil"
|
||||
@@ -32,6 +32,8 @@
|
||||
#define AUTO_LEVELING_TEXT_FR "AutoLevel"
|
||||
#define SET_TEXT_FR "Config"
|
||||
#define MORE_TEXT_FR "Plus"
|
||||
#define MORE_GCODE_FR "G-Code"
|
||||
#define MORE_ENTER_GCODE_FR "Saisir G-Code"
|
||||
|
||||
#define ADD_TEXT_FR "Ajouter"
|
||||
#define DEC_TEXT_FR "Réduire"
|
||||
@@ -74,7 +76,7 @@
|
||||
#define PAGE_DOWN_TEXT_FR "En bas"
|
||||
|
||||
#define EXTRUDER_IN_TEXT_FR "Insérer"
|
||||
#define EXTRUDER_OUT_TEXT_FR "éjecter"
|
||||
#define EXTRUDER_OUT_TEXT_FR "Éjecter"
|
||||
#define EXTRUDE_1MM_TEXT_FR "1mm"
|
||||
#define EXTRUDE_5MM_TEXT_FR "5mm"
|
||||
#define EXTRUDE_10MM_TEXT_FR "10mm"
|
||||
@@ -91,13 +93,13 @@
|
||||
#define FILESYS_TEXT_FR "Fichier"
|
||||
#define WIFI_TEXT_FR "WiFi"
|
||||
#define FAN_TEXT_FR "Fan"
|
||||
#define ABOUT_TEXT_FR "A propos"
|
||||
#define ABOUT_TEXT_FR "À propos"
|
||||
#define BREAK_POINT_TEXT_FR "Continuer"
|
||||
#define FILAMENT_TEXT_FR "Remplacer"
|
||||
#define LANGUAGE_TEXT_FR "Langue"
|
||||
#define MOTOR_OFF_TEXT_FR "M-hors"
|
||||
#define MOTOR_OFF_XY_TEXT_FR "M-hors-XY"
|
||||
#define SHUTDOWN_TEXT_FR "Eteindre"
|
||||
#define SHUTDOWN_TEXT_FR "Éteindre"
|
||||
#define MACHINE_PARA_FR "Config"
|
||||
#define EEPROM_SETTINGS_FR "Eeprom Set"
|
||||
|
||||
@@ -130,27 +132,27 @@
|
||||
#define FAN_TIPS2_TEXT_FR "ventilateur\n0"
|
||||
|
||||
#define FILAMENT_IN_TEXT_FR "Insérer"
|
||||
#define FILAMENT_OUT_TEXT_FR "éjecter"
|
||||
#define FILAMENT_OUT_TEXT_FR "Éjecter"
|
||||
#define FILAMENT_EXT0_TEXT_FR "Extr1"
|
||||
#define FILAMENT_EXT1_TEXT_FR "Extr2"
|
||||
#define FILAMENT_HEAT_TEXT_FR "Preheat"
|
||||
#define FILAMENT_STOP_TEXT_FR "Arrêter"
|
||||
#define FILAMENT_TIPS2_TEXT_FR "T:"
|
||||
#define FILAMENT_TIPS3_TEXT_FR "Insérer le filament..."
|
||||
#define FILAMENT_TIPS4_TEXT_FR "éjecter le filament..."
|
||||
#define FILAMENT_TIPS4_TEXT_FR "Éjecter le filament..."
|
||||
#define FILAMENT_TIPS5_TEXT_FR "Température trop basse pour démarrer, chauffez svp"
|
||||
#define FILAMENT_TIPS6_TEXT_FR "Terminé"
|
||||
|
||||
#define FILAMENT_CHANGE_TEXT_FR "Please click <Load> \nor <unload>,After \npinter pause."
|
||||
#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..."
|
||||
#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..."
|
||||
#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR "Heat completed,please load filament \nto extruder,and click <confirm> \nfor start loading."
|
||||
#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_FR "Please load filament to extruder,\nand click <confirm> for start loading."
|
||||
#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR "Heat completed,please \nclick <confirm> for start unloading.!"
|
||||
#define FILAMENT_DIALOG_LOADING_TIPS_FR "Is loading ,please wait!"
|
||||
#define FILAMENT_DIALOG_UNLOADING_TIPS_FR "Is unloading,please wait!"
|
||||
#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR "Load filament completed,\nclick <confirm> for return!"
|
||||
#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR "Unload filament completed,\nclick <confirm> for return!"
|
||||
#define FILAMENT_CHANGE_TEXT_FR "Veuillez presser <Load> \nou <unload>, après \nla pause."
|
||||
#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Chauffe de la tête\nPatientez SVP..."
|
||||
#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Chauffe de la tête\nPatientez SVP..."
|
||||
#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR "Tête chaude, veuillez charger le\nfilament dans l'extruder & <confirmer>\nle chargement."
|
||||
#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_FR "Veuillez charger le filament dans\nl'extruder & <confirmer> le chargement."
|
||||
#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR "Tête chaude, <confirmez>\npour le déchargement."
|
||||
#define FILAMENT_DIALOG_LOADING_TIPS_FR "Chargement, patientez SVP."
|
||||
#define FILAMENT_DIALOG_UNLOADING_TIPS_FR "Déchargement, patientez SVP."
|
||||
#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR "Chargement terminé,\n<confirmez> pour revenir!"
|
||||
#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR "Déchargement terminé,\n<confirmez> pour revenir!"
|
||||
|
||||
|
||||
#define PRE_HEAT_EXT_TEXT_FR "E"
|
||||
@@ -205,12 +207,12 @@
|
||||
#define TITLE_FAN_FR "Ventilateur"
|
||||
#define TITLE_LANGUAGE_FR "Langue"
|
||||
#define TITLE_PAUSE_FR "Pause"
|
||||
#define TITLE_CHANGESPEED_FR "Speed"
|
||||
#define TITLE_CHANGESPEED_FR "Vitesse"
|
||||
#define TITLE_CLOUD_TEXT_FR "Cloud"
|
||||
#define TITLE_DIALOG_CONFIRM_FR "Confirm"
|
||||
#define TITLE_DIALOG_CONFIRM_FR "Confirmer"
|
||||
#define TITLE_FILESYS_FR "FileSys"
|
||||
|
||||
#define DIALOG_CLOSE_MACHINE_FR "Closing machine......"
|
||||
#define DIALOG_CLOSE_MACHINE_FR "Extinction..."
|
||||
|
||||
#define AUTO_SHUTDOWN_FR "Auto"
|
||||
#define MANUAL_SHUTDOWN_FR "Manuel"
|
||||
@@ -220,7 +222,7 @@
|
||||
#define DIALOG_OK_FR "OK"
|
||||
#define DIALOG_RESET_FR "Réinitialiser"
|
||||
#define DIALOG_RETRY_FR "Recommencez"
|
||||
#define DIALOG_DISABLE_FR "Disable"
|
||||
#define DIALOG_DISABLE_FR "Désactiver"
|
||||
#define DIALOG_PRINT_MODEL_FR "Imprimer le fichier?"
|
||||
#define DIALOG_CANCEL_PRINT_FR "Arrêter?"
|
||||
|
||||
@@ -229,12 +231,12 @@
|
||||
#define DIALOG_ERROR_TIPS1_FR "Erreur:error:Aucun fichier, \nvérifiez à nouveau."
|
||||
#define DIALOG_ERROR_TIPS2_FR "Erreur:La opération a échoué. \nVerifiez que le baudrate de l'écran et de \nla carte mère soient identique!"
|
||||
#define DIALOG_ERROR_TIPS3_FR "Erreur: le nom du fichier ou le \nchemin d'accès est trop long."
|
||||
#define DIALOG_UNBIND_PRINTER_FR "Unbind the printer?"
|
||||
#define DIALOG_FILAMENT_NO_PRESS_FR "Filament detection switch is not pressed"
|
||||
#define DIALOG_UNBIND_PRINTER_FR "Déconnecter l'imprimante?"
|
||||
#define DIALOG_FILAMENT_NO_PRESS_FR "Détecteur de filament non pressé"
|
||||
#define DIALOG_PRINT_FINISH_FR "L'impression est terminée!"
|
||||
#define DIALOG_PRINT_TIME_FR "Temps d'impression: "
|
||||
#define DIALOG_REPRINT_FR "Print again"
|
||||
#define DIALOG_WIFI_ENABLE_TIPS_FR "The wifi module is being configured,\nplease wait a moment....."
|
||||
#define DIALOG_REPRINT_FR "Réimprimer"
|
||||
#define DIALOG_WIFI_ENABLE_TIPS_FR "Le module WIFI se charge\nAttendez SVP..."
|
||||
|
||||
#define MESSAGE_PAUSING_FR "Parking..."
|
||||
#define MESSAGE_CHANGING_FR "Attente filament pour démarrer"
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
#define AUTO_LEVELING_TEXT_IT "AutoLevel"
|
||||
#define SET_TEXT_IT "Imposta"
|
||||
#define MORE_TEXT_IT "Di più"
|
||||
#define MORE_GCODE_IT "G-Code"
|
||||
#define MORE_ENTER_GCODE_IT "Inserisci il G-Code"
|
||||
|
||||
#define ADD_TEXT_IT "Aumentare"
|
||||
#define DEC_TEXT_IT "Ridurre"
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
#define AUTO_LEVELING_TEXT_RU "aвтоуровень"
|
||||
#define SET_TEXT_RU "настройки"
|
||||
#define MORE_TEXT_RU "больше"
|
||||
#define MORE_GCODE_RU "G-код"
|
||||
#define MORE_ENTER_GCODE_RU "Введите G-код"
|
||||
|
||||
#define ADD_TEXT_RU "добавить"
|
||||
#define DEC_TEXT_RU "уменьшить"
|
||||
|
||||
@@ -263,6 +263,8 @@
|
||||
#define AUTO_LEVELING_TEXT_CN "自动调平"
|
||||
#define SET_TEXT_CN "设置"
|
||||
#define MORE_TEXT_CN "更多"
|
||||
#define MORE_GCODE_CN "G-Code"
|
||||
#define MORE_ENTER_GCODE_CN "Enter G-Code"
|
||||
|
||||
#define ADD_TEXT_CN "增加"
|
||||
#define DEC_TEXT_CN "减少"
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
#define AUTO_LEVELING_TEXT_SP "Autolevel"
|
||||
#define SET_TEXT_SP "Config"
|
||||
#define MORE_TEXT_SP "Más"
|
||||
#define MORE_GCODE_SP "G-Code"
|
||||
#define MORE_ENTER_GCODE_SP "Introduzca el G-Code"
|
||||
|
||||
#define ADD_TEXT_SP "Más"
|
||||
#define DEC_TEXT_SP "Menos"
|
||||
|
||||
@@ -263,6 +263,8 @@
|
||||
#define AUTO_LEVELING_TEXT_T_CN "自動調平"
|
||||
#define SET_TEXT_T_CN "設置"
|
||||
#define MORE_TEXT_T_CN "更多"
|
||||
#define MORE_GCODE_T_CN "G-Code"
|
||||
#define MORE_ENTER_GCODE_T_CN "Enter G-Code"
|
||||
|
||||
#define ADD_TEXT_T_CN "增加"
|
||||
#define DEC_TEXT_T_CN "減少"
|
||||
|
||||
@@ -943,6 +943,8 @@ void disp_language_init() {
|
||||
filesys_menu.usb_sys = U_DISK_TEXT_CN;
|
||||
//
|
||||
more_menu.title = TITLE_MORE_CN;
|
||||
more_menu.gcode = MORE_GCODE_CN;
|
||||
more_menu.entergcode = MORE_ENTER_GCODE_CN;
|
||||
TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_CN);
|
||||
TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_CN);
|
||||
TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_CN);
|
||||
@@ -1175,6 +1177,8 @@ void disp_language_init() {
|
||||
filesys_menu.usb_sys = U_DISK_TEXT_T_CN;
|
||||
//
|
||||
more_menu.title = TITLE_MORE_T_CN;
|
||||
more_menu.gcode = MORE_GCODE_T_CN;
|
||||
more_menu.entergcode = MORE_ENTER_GCODE_T_CN;
|
||||
TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_T_CN);
|
||||
TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_T_CN);
|
||||
TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_T_CN);
|
||||
@@ -1394,6 +1398,8 @@ void disp_language_init() {
|
||||
set_menu.eepromSet = EEPROM_SETTINGS_EN;
|
||||
//
|
||||
more_menu.title = TITLE_MORE_EN;
|
||||
more_menu.gcode = MORE_GCODE_EN;
|
||||
more_menu.entergcode = MORE_ENTER_GCODE_EN;
|
||||
TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_EN);
|
||||
TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_EN);
|
||||
TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_EN);
|
||||
@@ -1614,6 +1620,8 @@ void disp_language_init() {
|
||||
set_menu.machine_para = MACHINE_PARA_RU;
|
||||
set_menu.eepromSet = EEPROM_SETTINGS_RU;
|
||||
more_menu.title = TITLE_MORE_RU;
|
||||
more_menu.gcode = MORE_GCODE_RU;
|
||||
more_menu.entergcode = MORE_ENTER_GCODE_RU;
|
||||
#if ENABLED(USER_CMD_1_ENABLE)
|
||||
more_menu.custom1 = MORE_CUSTOM1_TEXT_RU;
|
||||
#endif
|
||||
@@ -1944,6 +1952,8 @@ void disp_language_init() {
|
||||
set_menu.machine_para = MACHINE_PARA_SP;
|
||||
set_menu.eepromSet = EEPROM_SETTINGS_SP;
|
||||
more_menu.title = TITLE_MORE_SP;
|
||||
more_menu.gcode = MORE_GCODE_SP;
|
||||
more_menu.entergcode = MORE_ENTER_GCODE_SP;
|
||||
#if ENABLED(USER_CMD_1_ENABLE)
|
||||
more_menu.custom1 = MORE_CUSTOM1_TEXT_SP;
|
||||
#endif
|
||||
@@ -2179,6 +2189,8 @@ void disp_language_init() {
|
||||
set_menu.machine_para = MACHINE_PARA_FR;
|
||||
set_menu.eepromSet = EEPROM_SETTINGS_FR;
|
||||
more_menu.title = TITLE_MORE_FR;
|
||||
more_menu.gcode = MORE_GCODE_FR;
|
||||
more_menu.entergcode = MORE_ENTER_GCODE_FR;
|
||||
#if ENABLED(USER_CMD_1_ENABLE)
|
||||
more_menu.custom1 = MORE_CUSTOM1_TEXT_FR;
|
||||
#endif
|
||||
@@ -2415,6 +2427,8 @@ void disp_language_init() {
|
||||
set_menu.machine_para = MACHINE_PARA_IT;
|
||||
set_menu.eepromSet = EEPROM_SETTINGS_IT;
|
||||
more_menu.title = TITLE_MORE_IT;
|
||||
more_menu.gcode = MORE_GCODE_IT;
|
||||
more_menu.entergcode = MORE_ENTER_GCODE_IT;
|
||||
#if ENABLED(USER_CMD_1_ENABLE)
|
||||
more_menu.custom1 = MORE_CUSTOM1_TEXT_IT;
|
||||
#endif
|
||||
@@ -2651,6 +2665,8 @@ void disp_language_init() {
|
||||
set_menu.eepromSet = EEPROM_SETTINGS_EN;
|
||||
//
|
||||
more_menu.title = TITLE_MORE_EN;
|
||||
more_menu.gcode = MORE_GCODE_EN;
|
||||
more_menu.entergcode = MORE_ENTER_GCODE_EN;
|
||||
TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_EN);
|
||||
TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_EN);
|
||||
TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_EN);
|
||||
|
||||
@@ -464,6 +464,8 @@ typedef struct more_menu_disp {
|
||||
const char *custom5;
|
||||
const char *custom6;
|
||||
const char *custom7;
|
||||
const char *gcode;
|
||||
const char *entergcode;
|
||||
const char *back;
|
||||
} more_menu_def;
|
||||
|
||||
|
||||
@@ -80,10 +80,10 @@ class WifiSerial {
|
||||
}
|
||||
/* TXE signifies readiness to send a byte to DR. */
|
||||
if ((regs->CR1 & USART_CR1_TXEIE) && (regs->SR & USART_SR_TXE)) {
|
||||
if (!rb_is_empty(this->usart_device->wb))
|
||||
regs->DR=rb_remove(this->usart_device->wb);
|
||||
else
|
||||
regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE
|
||||
if (!rb_is_empty(this->usart_device->wb))
|
||||
regs->DR=rb_remove(this->usart_device->wb);
|
||||
else
|
||||
regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tároló Behelyezve");
|
||||
PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tároló Eltávolítva");
|
||||
PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Várakozás a tárolóra");
|
||||
PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD-Kártya hiba");
|
||||
PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Tároló olvasási hiba");
|
||||
PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB eltávolítva");
|
||||
PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB eszköz hiba");
|
||||
@@ -56,7 +57,7 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_MAIN = _UxGT("<Fömenü>");
|
||||
PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("További Beállítások");
|
||||
PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguráció");
|
||||
PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Autoinditás");
|
||||
PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autoinditás");
|
||||
PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorok kikapcsolása");
|
||||
PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hiba Menü");
|
||||
PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Haladás sáv teszt");
|
||||
@@ -65,6 +66,10 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y Kezdöpont");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z Kezdöpont");
|
||||
PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Igazítás");
|
||||
PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Elektromos segéd");
|
||||
PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Ismétlés: %i");
|
||||
PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Pontosság csökken!");
|
||||
PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Pontosság elérve");
|
||||
PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ Kezdöpont");
|
||||
PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kattints a kezdéshez.");
|
||||
PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Következö Pont");
|
||||
@@ -94,8 +99,12 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Visszahütés");
|
||||
PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia");
|
||||
PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lézer Vezérlés");
|
||||
PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Lézer Ki");
|
||||
PROGMEM Language_Str MSG_LASER_ON = _UxGT("Lézer Be");
|
||||
PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lézer Teljesítmény");
|
||||
PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Orsó Vezérlés");
|
||||
PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Orsó Ki");
|
||||
PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Orsó Be");
|
||||
PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Orsó Teljesítmény");
|
||||
PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Orsó Hátra");
|
||||
PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Bekapcsolás");
|
||||
@@ -114,12 +123,13 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X");
|
||||
PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y");
|
||||
PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Érték");
|
||||
PROGMEM Language_Str MSG_USER_MENU = _UxGT("Egyéni Parancs");
|
||||
PROGMEM Language_Str MSG_USER_MENU = _UxGT("Egyéni parancs");
|
||||
PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Teszt");
|
||||
PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Pont");
|
||||
PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Szonda határon kívül");
|
||||
PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Eltérés");
|
||||
PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mód");
|
||||
PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Eszköz Eltolás");
|
||||
PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Eszköz eltolás");
|
||||
PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkolás");
|
||||
PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikálás");
|
||||
PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Tükrözött másolás");
|
||||
@@ -129,9 +139,9 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. fúvóka Z");
|
||||
PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Szintezz! G29");
|
||||
PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Eszköz");
|
||||
PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Egységes Ágy Szint");
|
||||
PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Döntési Pont");
|
||||
PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Kézi Háló Építés");
|
||||
PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Egységes ágy szint");
|
||||
PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Döntési pont");
|
||||
PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Kézi háló építés");
|
||||
PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Tégy alátétet és mérj");
|
||||
PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mérés");
|
||||
PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Üres ágyat mérj");
|
||||
@@ -148,14 +158,12 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Háló Kész");
|
||||
PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Egyéni Háló Építés");
|
||||
PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Háló Építés");
|
||||
#if PREHEAT_COUNT
|
||||
PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Háló Építés ($)");
|
||||
PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló Elfogadás ($)");
|
||||
#endif
|
||||
PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Hideg Háló Építés");
|
||||
PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("AHáló Magasság Állítása");
|
||||
PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Összmagasság");
|
||||
PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Háló Építés ($)");
|
||||
PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Hideg háló építés");
|
||||
PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Háló magasság állítás");
|
||||
PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Magasság összege");
|
||||
PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Háló Elfogadás");
|
||||
PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló Elfogadás ($)");
|
||||
PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valódi Háló Elfogadása");
|
||||
PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ágy Fűtés");
|
||||
PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fúvóka Fűtés");
|
||||
@@ -216,6 +224,10 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Viola");
|
||||
PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Fehér");
|
||||
PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Alapérték");
|
||||
PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Csatorna =");
|
||||
PROGMEM Language_Str MSG_LEDS2 = _UxGT("LEDek #2");
|
||||
PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Fény #2 Megadott");
|
||||
PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Fényerő");
|
||||
PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Egyéni Szín");
|
||||
PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Piros Intenzitás");
|
||||
PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zöld Intenzitás");
|
||||
@@ -231,7 +243,7 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_MOVE_E = _UxGT("Adagoló");
|
||||
PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Adagoló *");
|
||||
PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("A fúvóka túl hideg");
|
||||
PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mozgás %smm");
|
||||
PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mozgás %smm");
|
||||
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mozgás 0.1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mozgás 1mm");
|
||||
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mozgás 10mm");
|
||||
@@ -304,7 +316,9 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Höfok");
|
||||
PROGMEM Language_Str MSG_MOTION = _UxGT("Mozgatások");
|
||||
PROGMEM Language_Str MSG_FILAMENT = _UxGT("Nyomtatószál");
|
||||
PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm") SUPERSCRIPT_THREE _UxGT("-ben");
|
||||
PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm³-ben");
|
||||
PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit mm³-ben");
|
||||
PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *");
|
||||
PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Szál. Átm.");
|
||||
PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Szál. Átm. *");
|
||||
PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Kiadás mm");
|
||||
@@ -326,12 +340,17 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("<Infó Képernyö>");
|
||||
PROGMEM Language_Str MSG_PREPARE = _UxGT("Vezérlés");
|
||||
PROGMEM Language_Str MSG_TUNE = _UxGT("Hangolás");
|
||||
PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Teljesítménymonitor");
|
||||
PROGMEM Language_Str MSG_CURRENT = _UxGT("Jelenlegi");
|
||||
PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Feszültség");
|
||||
PROGMEM Language_Str MSG_POWER = _UxGT("Energia");
|
||||
PROGMEM Language_Str MSG_START_PRINT = _UxGT("Nyomtatás Indítása");
|
||||
PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Tovább");
|
||||
PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Kezdet");
|
||||
PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Állj");
|
||||
PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Nyomtatás");
|
||||
PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Újraindítás");
|
||||
PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Mellöz");
|
||||
PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Mégse");
|
||||
PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Kész");
|
||||
PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Vissza");
|
||||
@@ -339,6 +358,7 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_PAUSING = _UxGT("Szüneteltetve...");
|
||||
PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Nyomtatás Szünetelés");
|
||||
PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Nyomtatás folytatása");
|
||||
PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Hoszt indítás");
|
||||
PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Nyomtatás leállítása");
|
||||
PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Objektum Nyomtatása");
|
||||
PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Objektum Törlése");
|
||||
@@ -361,8 +381,8 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ugrás mm");
|
||||
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Visszah.helyre mm");
|
||||
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.Visszah.helyre mm");
|
||||
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Visszavonás V");
|
||||
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S Vi.vo V");
|
||||
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V");
|
||||
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V");
|
||||
PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVisszah.");
|
||||
PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás Távolság");
|
||||
PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra Csere");
|
||||
@@ -408,16 +428,17 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("VESZÉLY: A rossz beállítások kárt okozhatnak! Biztos továbblép?");
|
||||
PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
|
||||
PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Kezd TouchMI");
|
||||
PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Eltolás Teszt");
|
||||
PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Teszt");
|
||||
PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Mentés");
|
||||
PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI Használ");
|
||||
PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Szonda Használ");
|
||||
PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Szonda Elhelyezés");
|
||||
PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe Használ");
|
||||
PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe Elhelyezés");
|
||||
PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Elsö %s%s%s Kell");
|
||||
PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Szonda Eltolások");
|
||||
PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Szonda X Eltolás");
|
||||
PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Szonda Y Eltolás");
|
||||
PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Szonda Z Eltolás");
|
||||
PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Fúvóka az ágyhoz");
|
||||
PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Mikrolépés X");
|
||||
PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Mikrolépés Y");
|
||||
PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Mikrolépés Z");
|
||||
@@ -425,9 +446,9 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Végállás megszakítva!");
|
||||
PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Fütés hiba!");
|
||||
PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Hiba: SZÜKSÉGTELEN HÖFOK");
|
||||
PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FÜTÉSKIMARADÁS");
|
||||
PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ÁGY FÜTÉSKIMARADÁS");
|
||||
PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÜTÉSKIMARADÁS");
|
||||
PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FÜTÉS KIMARADÁS");
|
||||
PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ÁGY FÜTÉS KIMARADÁS");
|
||||
PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÜTÉS KIMARADÁS");
|
||||
PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hiba: MAX Höfok");
|
||||
PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hiba: MIN Höfok");
|
||||
PROGMEM Language_Str MSG_HALTED = _UxGT("A NYOMTATÓ LEFAGYOTT");
|
||||
@@ -439,6 +460,8 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_COOLING = _UxGT("Hütés...");
|
||||
PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ágy fütés...");
|
||||
PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Ágy hütés...");
|
||||
PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Szonda fütése...");
|
||||
PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Szonda hütése...");
|
||||
PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Kamra fütés...");
|
||||
PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Kamra hütés...");
|
||||
PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibráció");
|
||||
@@ -468,6 +491,7 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoll");
|
||||
PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Futáselemzés: KI");
|
||||
PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Futáselemzés: BE");
|
||||
PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend üresjárati idök.");
|
||||
|
||||
PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Munkalámpa");
|
||||
PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Fényerösség");
|
||||
@@ -556,6 +580,20 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3");
|
||||
PROGMEM Language_Str MSG_MAZE = _UxGT("Maze");
|
||||
|
||||
PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Rossz oldalindex");
|
||||
PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Rossz oldalsebesség");
|
||||
|
||||
PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Jelszó szerkesztése");
|
||||
PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Belépés szükséges");
|
||||
PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Jelszóbeállítások");
|
||||
PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Írja be a számokat");
|
||||
PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Jelszó Beáll/Szerk");
|
||||
PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Jelszó törlése");
|
||||
PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("A jelszó ");
|
||||
PROGMEM Language_Str MSG_START_OVER = _UxGT("Újrakezdés");
|
||||
PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Mentse el!");
|
||||
PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Jelszó törölve");
|
||||
|
||||
//
|
||||
// Filament Change screens show up to 3 lines on a 4-line display
|
||||
// ...or up to 2 lines on a 3-line display
|
||||
@@ -571,7 +609,7 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Várj a", "szál betöltésére"));
|
||||
PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Várj a", "szál tisztításra"));
|
||||
PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Kattints a készre", "szál tiszta"));
|
||||
PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Várj a nyomtatóra", "majd folytat..."));
|
||||
PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Várj a nyomtatóra", "majd foltyat..."));
|
||||
#else
|
||||
PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Katt a folytatáshoz"));
|
||||
PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás..."));
|
||||
@@ -600,11 +638,17 @@ namespace Language_hu {
|
||||
PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korrekció");
|
||||
PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Simítás");
|
||||
|
||||
PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X Tengely Szint");
|
||||
PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X Tengely szint");
|
||||
PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Önkalibrálás");
|
||||
PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Fűtéskimaradás");
|
||||
#if ENABLED(TOUCH_UI_FTDI_EVE)
|
||||
PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Tétlenségi idökorlát, a hömérséklet csökkent. Nyomja meg az OK gombot az ismételt felfűtéshez, és újra a folytatáshoz.");
|
||||
#else
|
||||
PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Fűtés idökorlátja");
|
||||
#endif
|
||||
PROGMEM Language_Str MSG_REHEAT = _UxGT("Újrafűt");
|
||||
PROGMEM Language_Str MSG_REHEATING = _UxGT("Újrafűtés...");
|
||||
|
||||
PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Szonda varázsló");
|
||||
}
|
||||
|
||||
#if FAN_COUNT == 1
|
||||
|
||||
@@ -1652,7 +1652,13 @@ void MarlinUI::update() {
|
||||
#endif // SDSUPPORT
|
||||
|
||||
#if HAS_LCD_MENU
|
||||
void MarlinUI::reset_settings() { settings.reset(); completion_feedback(); }
|
||||
void MarlinUI::reset_settings() {
|
||||
settings.reset();
|
||||
completion_feedback();
|
||||
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
|
||||
if (touch_calibration.need_calibration()) ui.goto_screen(touch_screen_calibration);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if ENABLED(EEPROM_SETTINGS)
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#if HAS_GRAPHICAL_TFT
|
||||
|
||||
#include "tft_image.h"
|
||||
#include "ui_common.h"
|
||||
|
||||
const tImage NoLogo = { nullptr, 0, 0, NOCOLORS };
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
#include "tft_string.h"
|
||||
#include "../fontutils.h"
|
||||
#include "../marlinui.h"
|
||||
|
||||
//#define DEBUG_TFT_FONT
|
||||
#define DEBUG_OUT ENABLED(DEBUG_TFT_FONT)
|
||||
|
||||
@@ -28,6 +28,10 @@
|
||||
#define DEBUG_OUT ENABLED(DEBUG_TOUCH_CALIBRATION)
|
||||
#include "../../core/debug_out.h"
|
||||
|
||||
#if ENABLED(TOUCH_CALIBRATION_AUTO_SAVE)
|
||||
#include "../../module/settings.h"
|
||||
#endif
|
||||
|
||||
TouchCalibration touch_calibration;
|
||||
|
||||
touch_calibration_t TouchCalibration::calibration;
|
||||
@@ -78,6 +82,7 @@ void TouchCalibration::validate_calibration() {
|
||||
SERIAL_ECHOLNPAIR("TOUCH_OFFSET_X ", calibration.offset_x);
|
||||
SERIAL_ECHOLNPAIR("TOUCH_OFFSET_Y ", calibration.offset_y);
|
||||
SERIAL_ECHO_TERNARY(calibration.orientation == TOUCH_LANDSCAPE, "TOUCH_ORIENTATION ", "TOUCH_LANDSCAPE", "TOUCH_PORTRAIT", "\n");
|
||||
TERN_(TOUCH_CALIBRATION_AUTO_SAVE, settings.save());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+12
-12
@@ -191,11 +191,11 @@ void W25QXXFlash::SPI_FLASH_SectorErase(uint32_t SectorAddr) {
|
||||
W25QXX_CS_L;
|
||||
// Send Sector Erase instruction
|
||||
spi_flash_Send(W25X_SectorErase);
|
||||
// Send SectorAddr high nibble address byte
|
||||
// Send SectorAddr high nybble address byte
|
||||
spi_flash_Send((SectorAddr & 0xFF0000) >> 16);
|
||||
// Send SectorAddr medium nibble address byte
|
||||
// Send SectorAddr medium nybble address byte
|
||||
spi_flash_Send((SectorAddr & 0xFF00) >> 8);
|
||||
// Send SectorAddr low nibble address byte
|
||||
// Send SectorAddr low nybble address byte
|
||||
spi_flash_Send(SectorAddr & 0xFF);
|
||||
// Deselect the FLASH: Chip Select high
|
||||
|
||||
@@ -209,11 +209,11 @@ void W25QXXFlash::SPI_FLASH_BlockErase(uint32_t BlockAddr) {
|
||||
W25QXX_CS_L;
|
||||
// Send Sector Erase instruction
|
||||
spi_flash_Send(W25X_BlockErase);
|
||||
// Send SectorAddr high nibble address byte
|
||||
// Send SectorAddr high nybble address byte
|
||||
spi_flash_Send((BlockAddr & 0xFF0000) >> 16);
|
||||
// Send SectorAddr medium nibble address byte
|
||||
// Send SectorAddr medium nybble address byte
|
||||
spi_flash_Send((BlockAddr & 0xFF00) >> 8);
|
||||
// Send SectorAddr low nibble address byte
|
||||
// Send SectorAddr low nybble address byte
|
||||
spi_flash_Send(BlockAddr & 0xFF);
|
||||
|
||||
W25QXX_CS_H;
|
||||
@@ -265,11 +265,11 @@ void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint
|
||||
W25QXX_CS_L;
|
||||
// Send "Write to Memory " instruction
|
||||
spi_flash_Send(W25X_PageProgram);
|
||||
// Send WriteAddr high nibble address byte to write to
|
||||
// Send WriteAddr high nybble address byte to write to
|
||||
spi_flash_Send((WriteAddr & 0xFF0000) >> 16);
|
||||
// Send WriteAddr medium nibble address byte to write to
|
||||
// Send WriteAddr medium nybble address byte to write to
|
||||
spi_flash_Send((WriteAddr & 0xFF00) >> 8);
|
||||
// Send WriteAddr low nibble address byte to write to
|
||||
// Send WriteAddr low nybble address byte to write to
|
||||
spi_flash_Send(WriteAddr & 0xFF);
|
||||
|
||||
NOMORE(NumByteToWrite, SPI_FLASH_PerWritePageSize);
|
||||
@@ -371,11 +371,11 @@ void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint
|
||||
// Send "Read from Memory " instruction
|
||||
spi_flash_Send(W25X_ReadData);
|
||||
|
||||
// Send ReadAddr high nibble address byte to read from
|
||||
// Send ReadAddr high nybble address byte to read from
|
||||
spi_flash_Send((ReadAddr & 0xFF0000) >> 16);
|
||||
// Send ReadAddr medium nibble address byte to read from
|
||||
// Send ReadAddr medium nybble address byte to read from
|
||||
spi_flash_Send((ReadAddr & 0xFF00) >> 8);
|
||||
// Send ReadAddr low nibble address byte to read from
|
||||
// Send ReadAddr low nybble address byte to read from
|
||||
spi_flash_Send(ReadAddr & 0xFF);
|
||||
|
||||
if (NumByteToRead <= 32 || !flash_dma_mode) {
|
||||
|
||||
@@ -23,14 +23,14 @@
|
||||
|
||||
#include "../inc/MarlinConfig.h"
|
||||
|
||||
template<serial_index_t AR_PORT_INDEX>
|
||||
class AutoReporter {
|
||||
public:
|
||||
template <typename Helper>
|
||||
struct AutoReporter {
|
||||
millis_t next_report_ms;
|
||||
uint8_t report_interval;
|
||||
|
||||
// Override this method
|
||||
inline void auto_report() { }
|
||||
#if HAS_MULTI_SERIAL
|
||||
serial_index_t report_port_mask;
|
||||
AutoReporter() : report_port_mask(SERIAL_ALL) {}
|
||||
#endif
|
||||
|
||||
inline void set_interval(uint8_t seconds, const uint8_t limit=60) {
|
||||
report_interval = _MIN(seconds, limit);
|
||||
@@ -42,8 +42,8 @@ public:
|
||||
const millis_t ms = millis();
|
||||
if (ELAPSED(ms, next_report_ms)) {
|
||||
next_report_ms = ms + SEC_TO_MS(report_interval);
|
||||
PORT_REDIRECT(AR_PORT_INDEX);
|
||||
auto_report();
|
||||
TERN_(HAS_MULTI_SERIAL, PORT_REDIRECT(report_port_mask));
|
||||
Helper::report();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -418,11 +418,11 @@ void Planner::init() {
|
||||
L("2")
|
||||
A("cpi %16,0x10") // (nr & 0xF00000) == 0 ?
|
||||
A("brcc 3f") // No, skip this
|
||||
A("swap %15") // Swap nibbles
|
||||
A("swap %16") // Swap nibbles. Low nibble is 0
|
||||
A("swap %15") // Swap nybbles
|
||||
A("swap %16") // Swap nybbles. Low nybble is 0
|
||||
A("mov %14, %15")
|
||||
A("andi %14,0x0F") // Isolate low nibble
|
||||
A("andi %15,0xF0") // Keep proper nibble in %15
|
||||
A("andi %14,0x0F") // Isolate low nybble
|
||||
A("andi %15,0xF0") // Keep proper nybble in %15
|
||||
A("or %16, %14") // %16:%15 <<= 4
|
||||
A("subi %3,-4") // idx += 4
|
||||
|
||||
@@ -473,10 +473,10 @@ void Planner::init() {
|
||||
L("9")
|
||||
A("sbrs %3,2") // shift by 4bits position?
|
||||
A("rjmp 16f") // No
|
||||
A("swap %15") // Swap nibbles. lo nibble of %15 will always be 0
|
||||
A("swap %14") // Swap nibbles
|
||||
A("swap %15") // Swap nybbles. lo nybble of %15 will always be 0
|
||||
A("swap %14") // Swap nybbles
|
||||
A("mov %12,%14")
|
||||
A("andi %12,0x0F") // isolate low nibble
|
||||
A("andi %12,0x0F") // isolate low nybble
|
||||
A("andi %14,0xF0") // and clear it
|
||||
A("or %15,%12") // %15:%16 <<= 4
|
||||
L("16")
|
||||
@@ -504,11 +504,11 @@ void Planner::init() {
|
||||
L("11")
|
||||
A("sbrs %3,2") // shift by 4 bit position ?
|
||||
A("rjmp 12f") // No, skip it
|
||||
A("swap %15") // Swap nibbles
|
||||
A("andi %14, 0xF0") // Lose the lowest nibble
|
||||
A("swap %14") // Swap nibbles. Upper nibble is 0
|
||||
A("or %14,%15") // Pass nibble from upper byte
|
||||
A("andi %15, 0x0F") // And get rid of that nibble
|
||||
A("swap %15") // Swap nybbles
|
||||
A("andi %14, 0xF0") // Lose the lowest nybble
|
||||
A("swap %14") // Swap nybbles. Upper nybble is 0
|
||||
A("or %14,%15") // Pass nybble from upper byte
|
||||
A("andi %15, 0x0F") // And get rid of that nybble
|
||||
L("12")
|
||||
A("sbrs %3,3") // shift by 8 bit position ?
|
||||
A("rjmp 6f") // No, skip it
|
||||
|
||||
@@ -2946,7 +2946,7 @@ void MarlinSettings::reset() {
|
||||
}
|
||||
|
||||
#define CONFIG_ECHO_START() do{ if (!forReplay) SERIAL_ECHO_START(); }while(0)
|
||||
#define CONFIG_ECHO_MSG(STR) do{ CONFIG_ECHO_START(); SERIAL_ECHOLNPGM(STR); }while(0)
|
||||
#define CONFIG_ECHO_MSG(V...) do{ CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR(V); }while(0)
|
||||
#define CONFIG_ECHO_HEADING(STR) config_heading(forReplay, PSTR(STR))
|
||||
|
||||
#if HAS_TRINAMIC_CONFIG
|
||||
@@ -3039,26 +3039,24 @@ void MarlinSettings::reset() {
|
||||
}
|
||||
|
||||
#if EXTRUDERS == 1
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" M200 S", int(parser.volumetric_enabled)
|
||||
, " D", LINEAR_UNIT(planner.filament_size[0])
|
||||
#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT)
|
||||
, " L", LINEAR_UNIT(planner.volumetric_extruder_limit[0])
|
||||
#endif
|
||||
);
|
||||
CONFIG_ECHO_MSG(" M200 S", int(parser.volumetric_enabled)
|
||||
, " D", LINEAR_UNIT(planner.filament_size[0])
|
||||
#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT)
|
||||
, " L", LINEAR_UNIT(planner.volumetric_extruder_limit[0])
|
||||
#endif
|
||||
);
|
||||
#else
|
||||
LOOP_L_N(i, EXTRUDERS) {
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" M200 T", int(i)
|
||||
, " D", LINEAR_UNIT(planner.filament_size[i])
|
||||
#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT)
|
||||
, " L", LINEAR_UNIT(planner.volumetric_extruder_limit[i])
|
||||
#endif
|
||||
);
|
||||
CONFIG_ECHO_MSG(" M200 T", int(i)
|
||||
, " D", LINEAR_UNIT(planner.filament_size[i])
|
||||
#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT)
|
||||
, " L", LINEAR_UNIT(planner.volumetric_extruder_limit[i])
|
||||
#endif
|
||||
);
|
||||
}
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" M200 S", int(parser.volumetric_enabled));
|
||||
CONFIG_ECHO_MSG(" M200 S", int(parser.volumetric_enabled));
|
||||
#endif
|
||||
|
||||
#endif // EXTRUDERS && !NO_VOLUMETRICS
|
||||
|
||||
CONFIG_ECHO_HEADING("Steps per unit:");
|
||||
@@ -3194,7 +3192,7 @@ void MarlinSettings::reset() {
|
||||
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR_P(
|
||||
PSTR(" M420 S"), planner.leveling_active ? 1 : 0
|
||||
PSTR(" M420 S"), int(planner.leveling_active)
|
||||
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
|
||||
, SP_Z_STR, LINEAR_UNIT(planner.z_fade_height)
|
||||
#endif
|
||||
@@ -3260,8 +3258,7 @@ void MarlinSettings::reset() {
|
||||
#elif ENABLED(BLTOUCH) || (HAS_Z_SERVO_PROBE && defined(Z_SERVO_ANGLES))
|
||||
case Z_PROBE_SERVO_NR:
|
||||
#endif
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" M281 P", int(i), " L", servo_angles[i][0], " U", servo_angles[i][1]);
|
||||
CONFIG_ECHO_MSG(" M281 P", int(i), " L", servo_angles[i][0], " U", servo_angles[i][1]);
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
@@ -3382,8 +3379,7 @@ void MarlinSettings::reset() {
|
||||
#endif // PIDTEMP
|
||||
|
||||
#if ENABLED(PIDTEMPBED)
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(
|
||||
CONFIG_ECHO_MSG(
|
||||
" M304 P", thermalManager.temp_bed.pid.Kp
|
||||
, " I", unscalePID_i(thermalManager.temp_bed.pid.Ki)
|
||||
, " D", unscalePID_d(thermalManager.temp_bed.pid.Kd)
|
||||
@@ -3400,16 +3396,14 @@ void MarlinSettings::reset() {
|
||||
|
||||
#if HAS_LCD_CONTRAST
|
||||
CONFIG_ECHO_HEADING("LCD Contrast:");
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" M250 C", ui.contrast);
|
||||
CONFIG_ECHO_MSG(" M250 C", ui.contrast);
|
||||
#endif
|
||||
|
||||
TERN_(CONTROLLER_FAN_EDITABLE, M710_report(forReplay));
|
||||
|
||||
#if ENABLED(POWER_LOSS_RECOVERY)
|
||||
CONFIG_ECHO_HEADING("Power-Loss Recovery:");
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" M413 S", int(recovery.enabled));
|
||||
CONFIG_ECHO_MSG(" M413 S", int(recovery.enabled));
|
||||
#endif
|
||||
|
||||
#if ENABLED(FWRETRACT)
|
||||
@@ -3424,8 +3418,7 @@ void MarlinSettings::reset() {
|
||||
);
|
||||
|
||||
CONFIG_ECHO_HEADING("Recover: S<length> F<units/m>");
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(
|
||||
CONFIG_ECHO_MSG(
|
||||
" M208 S", LINEAR_UNIT(fwretract.settings.retract_recover_extra)
|
||||
, " W", LINEAR_UNIT(fwretract.settings.swap_retract_recover_extra)
|
||||
, " F", LINEAR_UNIT(MMS_TO_MMM(fwretract.settings.retract_recover_feedrate_mm_s))
|
||||
@@ -3434,8 +3427,7 @@ void MarlinSettings::reset() {
|
||||
#if ENABLED(FWRETRACT_AUTORETRACT)
|
||||
|
||||
CONFIG_ECHO_HEADING("Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover");
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" M209 S", fwretract.autoretract_enabled ? 1 : 0);
|
||||
CONFIG_ECHO_MSG(" M209 S", int(fwretract.autoretract_enabled));
|
||||
|
||||
#endif // FWRETRACT_AUTORETRACT
|
||||
|
||||
@@ -3780,13 +3772,10 @@ void MarlinSettings::reset() {
|
||||
#if ENABLED(LIN_ADVANCE)
|
||||
CONFIG_ECHO_HEADING("Linear Advance:");
|
||||
#if EXTRUDERS < 2
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" M900 K", planner.extruder_advance_K[0]);
|
||||
CONFIG_ECHO_MSG(" M900 K", planner.extruder_advance_K[0]);
|
||||
#else
|
||||
LOOP_L_N(i, EXTRUDERS) {
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(" M900 T", int(i), " K", planner.extruder_advance_K[i]);
|
||||
}
|
||||
LOOP_L_N(i, EXTRUDERS)
|
||||
CONFIG_ECHO_MSG(" M900 T", int(i), " K", planner.extruder_advance_K[i]);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -3851,8 +3840,7 @@ void MarlinSettings::reset() {
|
||||
|
||||
#if HAS_FILAMENT_SENSOR
|
||||
CONFIG_ECHO_HEADING("Filament runout sensor:");
|
||||
CONFIG_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(
|
||||
CONFIG_ECHO_MSG(
|
||||
" M412 S", int(runout.enabled)
|
||||
#if HAS_FILAMENT_RUNOUT_DISTANCE
|
||||
, " D", LINEAR_UNIT(runout.runout_distance())
|
||||
|
||||
@@ -1037,8 +1037,7 @@ void Temperature::min_temp_error(const heater_id_t heater_id) {
|
||||
|
||||
#if ENABLED(PID_BED_DEBUG)
|
||||
{
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(
|
||||
SERIAL_ECHO_MSG(
|
||||
" PID_BED_DEBUG : Input ", temp_bed.celsius, " Output ", pid_output,
|
||||
#if DISABLED(PID_OPENLOOP)
|
||||
STR_PID_DEBUG_PTERM, work_pid.Kp,
|
||||
@@ -2062,7 +2061,7 @@ void Temperature::init() {
|
||||
switch (heater_id) {
|
||||
case H_BED: SERIAL_ECHOPGM("bed"); break;
|
||||
case H_CHAMBER: SERIAL_ECHOPGM("chamber"); break;
|
||||
default: SERIAL_ECHO(heater_id);
|
||||
default: SERIAL_ECHO((int)heater_id);
|
||||
}
|
||||
SERIAL_ECHOLNPAIR(
|
||||
" ; sizeof(running_temp):", sizeof(running_temp),
|
||||
@@ -3123,8 +3122,8 @@ void Temperature::tick() {
|
||||
}
|
||||
|
||||
#if ENABLED(AUTO_REPORT_TEMPERATURES)
|
||||
Temperature::AutoReportTemp Temperature::auto_reporter;
|
||||
void Temperature::AutoReportTemp::auto_report() {
|
||||
AutoReporter<Temperature::AutoReportTemp> Temperature::auto_reporter;
|
||||
void Temperature::AutoReportTemp::report() {
|
||||
PORT_REDIRECT(SERIAL_ALL);
|
||||
print_heater_states(active_extruder);
|
||||
SERIAL_EOL();
|
||||
|
||||
@@ -798,8 +798,8 @@ class Temperature {
|
||||
#endif
|
||||
);
|
||||
#if ENABLED(AUTO_REPORT_TEMPERATURES)
|
||||
class AutoReportTemp : public AutoReporter<SERIAL_ALL> { void auto_report(); };
|
||||
static AutoReportTemp auto_reporter;
|
||||
struct AutoReportTemp { static void report(); };
|
||||
static AutoReporter<AutoReportTemp> auto_reporter;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -709,7 +709,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a
|
||||
#if EXTRUDERS
|
||||
inline void invalid_extruder_error(const uint8_t e) {
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_CHAR('T'); SERIAL_ECHO(int(e));
|
||||
SERIAL_CHAR('T'); SERIAL_ECHO((int)e);
|
||||
SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(STR_INVALID_EXTRUDER);
|
||||
}
|
||||
#endif
|
||||
@@ -1196,8 +1196,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
|
||||
gcode.process_subcommands_now_P(PSTR(EVENT_GCODE_AFTER_TOOLCHANGE));
|
||||
#endif
|
||||
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(active_extruder));
|
||||
SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(active_extruder));
|
||||
|
||||
#endif // HAS_MULTI_EXTRUDER
|
||||
}
|
||||
|
||||
@@ -337,7 +337,7 @@
|
||||
#define DOGLCD_CS P0_18
|
||||
#define DOGLCD_A0 P0_16
|
||||
#define DOGLCD_SCK P0_07
|
||||
#define DOGLCD_MOSI P1_20
|
||||
#define DOGLCD_MOSI P0_09
|
||||
|
||||
#define LCD_BACKLIGHT_PIN -1
|
||||
|
||||
|
||||
@@ -926,7 +926,7 @@ int SdBaseFile::peek() {
|
||||
// print uint8_t with width 2
|
||||
static void print2u(const uint8_t v) {
|
||||
if (v < 10) SERIAL_CHAR('0');
|
||||
SERIAL_ECHO(int(v));
|
||||
SERIAL_ECHO((int)v);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -270,10 +270,9 @@ void CardReader::printListing(SdFile parent, const char * const prepend/*=nullpt
|
||||
// Get a new directory object using the full path
|
||||
// and dive recursively into it.
|
||||
SdFile child;
|
||||
if (!child.open(&parent, dosFilename, O_READ)) {
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(STR_SD_CANT_OPEN_SUBDIR, dosFilename);
|
||||
}
|
||||
if (!child.open(&parent, dosFilename, O_READ))
|
||||
SERIAL_ECHO_MSG(STR_SD_CANT_OPEN_SUBDIR, dosFilename);
|
||||
|
||||
printListing(child, path);
|
||||
// close() is done automatically by destructor of SdFile
|
||||
}
|
||||
@@ -369,7 +368,7 @@ void CardReader::printFilename() {
|
||||
#if ENABLED(LONG_FILENAME_HOST_SUPPORT)
|
||||
selectFileByName(dosFilename);
|
||||
if (longFilename[0]) {
|
||||
SERIAL_ECHO(' ');
|
||||
SERIAL_CHAR(' ');
|
||||
SERIAL_ECHO(longFilename);
|
||||
}
|
||||
#endif
|
||||
@@ -594,8 +593,7 @@ void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0*
|
||||
filespos[file_subcall_ctr] = sdpos;
|
||||
|
||||
// For sub-procedures say 'SUBROUTINE CALL target: "..." parent: "..." pos12345'
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR("SUBROUTINE CALL target:\"", path, "\" parent:\"", proc_filenames[file_subcall_ctr], "\" pos", sdpos);
|
||||
SERIAL_ECHO_MSG("SUBROUTINE CALL target:\"", path, "\" parent:\"", proc_filenames[file_subcall_ctr], "\" pos", sdpos);
|
||||
file_subcall_ctr++;
|
||||
break;
|
||||
|
||||
@@ -941,10 +939,8 @@ void CardReader::cd(const char * relpath) {
|
||||
workDirParents[workDirDepth++] = workDir;
|
||||
TERN_(SDCARD_SORT_ALPHA, presort());
|
||||
}
|
||||
else {
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(STR_SD_CANT_ENTER_SUBDIR, relpath);
|
||||
}
|
||||
else
|
||||
SERIAL_ECHO_MSG(STR_SD_CANT_ENTER_SUBDIR, relpath);
|
||||
}
|
||||
|
||||
int8_t CardReader::cdup() {
|
||||
@@ -1226,9 +1222,7 @@ void CardReader::fileHasFinished() {
|
||||
}
|
||||
|
||||
#if ENABLED(AUTO_REPORT_SD_STATUS)
|
||||
TERN_(HAS_MULTI_SERIAL, serial_index_t CardReader::auto_report_port);
|
||||
CardReader::AutoReportSD CardReader::auto_reporter;
|
||||
void CardReader::AutoReportSD::auto_report() { report_status(); }
|
||||
AutoReporter<CardReader::AutoReportSD> CardReader::auto_reporter;
|
||||
#endif
|
||||
|
||||
#if ENABLED(POWER_LOSS_RECOVERY)
|
||||
|
||||
@@ -179,13 +179,8 @@ public:
|
||||
//
|
||||
// SD Auto Reporting
|
||||
//
|
||||
#if HAS_MULTI_SERIAL
|
||||
static serial_index_t auto_report_port;
|
||||
#else
|
||||
static constexpr serial_index_t auto_report_port = 0;
|
||||
#endif
|
||||
class AutoReportSD : public AutoReporter<auto_report_port> { void auto_report(); };
|
||||
static AutoReportSD auto_reporter;
|
||||
struct AutoReportSD { static void report() { report_status(); } };
|
||||
static AutoReporter<AutoReportSD> auto_reporter;
|
||||
#endif
|
||||
|
||||
private:
|
||||
|
||||
@@ -32,12 +32,12 @@ void E_Notifyc(char c, int lvl);
|
||||
|
||||
template <class T>
|
||||
void PrintHex(T val, int lvl) {
|
||||
int num_nibbles = sizeof (T) * 2;
|
||||
int num_nybbles = sizeof (T) * 2;
|
||||
do {
|
||||
char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F);
|
||||
char v = 48 + (((val >> (num_nybbles - 1) * 4)) & 0x0F);
|
||||
if (v > 57) v += 7;
|
||||
E_Notifyc(v, lvl);
|
||||
} while (--num_nibbles);
|
||||
} while (--num_nybbles);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
@@ -48,12 +48,12 @@ void PrintBin(T val, int lvl) {
|
||||
|
||||
template <class T>
|
||||
void SerialPrintHex(T val) {
|
||||
int num_nibbles = sizeof (T) * 2;
|
||||
int num_nybbles = sizeof (T) * 2;
|
||||
do {
|
||||
char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F);
|
||||
char v = 48 + (((val >> (num_nybbles - 1) * 4)) & 0x0F);
|
||||
if (v > 57) v += 7;
|
||||
USB_HOST_SERIAL.print(v);
|
||||
} while (--num_nibbles);
|
||||
} while (--num_nybbles);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
|
||||
@@ -33,13 +33,13 @@ void E_Notifyc(char c, int lvl);
|
||||
|
||||
template <class T>
|
||||
void PrintHex(T val, int lvl) {
|
||||
int num_nibbles = sizeof (T) * 2;
|
||||
int num_nybbles = sizeof (T) * 2;
|
||||
|
||||
do {
|
||||
char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F);
|
||||
char v = 48 + (((val >> (num_nybbles - 1) * 4)) & 0x0F);
|
||||
if(v > 57) v += 7;
|
||||
E_Notifyc(v, lvl);
|
||||
} while(--num_nibbles);
|
||||
} while(--num_nybbles);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
@@ -53,13 +53,13 @@ void PrintBin(T val, int lvl) {
|
||||
|
||||
template <class T>
|
||||
void SerialPrintHex(T val) {
|
||||
int num_nibbles = sizeof (T) * 2;
|
||||
int num_nybbles = sizeof (T) * 2;
|
||||
|
||||
do {
|
||||
char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F);
|
||||
char v = 48 + (((val >> (num_nybbles - 1) * 4)) & 0x0F);
|
||||
if(v > 57) v += 7;
|
||||
USB_HOST_SERIAL.print(v);
|
||||
} while(--num_nibbles);
|
||||
} while(--num_nybbles);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
|
||||
+3
-3
@@ -96,7 +96,7 @@ uint8_t* UHS_NI MAX3421E_HOST::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* dat
|
||||
/* GPIO write */
|
||||
/*GPIO byte is split between 2 registers, so two writes are needed to write one byte */
|
||||
|
||||
/* GPOUT bits are in the low nibble. 0-3 in IOPINS1, 4-7 in IOPINS2 */
|
||||
/* GPOUT bits are in the low nybble. 0-3 in IOPINS1, 4-7 in IOPINS2 */
|
||||
void UHS_NI MAX3421E_HOST::gpioWr(uint8_t data) {
|
||||
regWr(rIOPINS1, data);
|
||||
data >>= 4;
|
||||
@@ -132,11 +132,11 @@ uint8_t* UHS_NI MAX3421E_HOST::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* dat
|
||||
|
||||
/* GPIO read. See gpioWr for explanation */
|
||||
|
||||
/* GPIN pins are in high nibbles of IOPINS1, IOPINS2 */
|
||||
/* GPIN pins are in high nybbles of IOPINS1, IOPINS2 */
|
||||
uint8_t UHS_NI MAX3421E_HOST::gpioRd() {
|
||||
uint8_t gpin = 0;
|
||||
gpin = regRd(rIOPINS2); //pins 4-7
|
||||
gpin &= 0xF0; //clean lower nibble
|
||||
gpin &= 0xF0; //clean lower nybble
|
||||
gpin |= (regRd(rIOPINS1) >> 4); //shift low bits and OR with upper from previous operation.
|
||||
return ( gpin);
|
||||
}
|
||||
|
||||
@@ -37,14 +37,15 @@ opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB
|
||||
opt_set EXTRUDERS 2
|
||||
opt_set TEMP_SENSOR_1 -1
|
||||
opt_set TEMP_SENSOR_BED 5
|
||||
opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \
|
||||
opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \
|
||||
FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY PID_EXTRUSION_SCALING SOUND_MENU_ITEM \
|
||||
NOZZLE_AS_PROBE AUTO_BED_LEVELING_BILINEAR PREHEAT_BEFORE_LEVELING G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \
|
||||
BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \
|
||||
PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \
|
||||
Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \
|
||||
HOST_KEEPALIVE_FEATURE HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT \
|
||||
LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER
|
||||
LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES \
|
||||
SDSUPPORT SDCARD_SORT_ALPHA AUTO_REPORT_SD_STATUS EMERGENCY_PARSER
|
||||
opt_set GRID_MAX_POINTS_X 16
|
||||
opt_set NOZZLE_TO_PROBE_OFFSET "{ 0, 0, 0 }"
|
||||
opt_set NOZZLE_CLEAN_MIN_TEMP 170
|
||||
|
||||
@@ -27,7 +27,7 @@ opt_set TEMP_SENSOR_4 1000
|
||||
opt_set TEMP_SENSOR_BED 1
|
||||
opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \
|
||||
REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \
|
||||
SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS SOUND_MENU_ITEM \
|
||||
SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT AUTO_REPORT_SD_STATUS SCROLL_LONG_FILENAMES CANCEL_OBJECTS SOUND_MENU_ITEM \
|
||||
EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \
|
||||
MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE EXTRA_LIN_ADVANCE_K QUICK_HOME \
|
||||
LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \
|
||||
@@ -72,8 +72,9 @@ opt_set TEMP_SENSOR_1 1
|
||||
opt_set TEMP_SENSOR_2 1
|
||||
opt_set TEMP_SENSOR_3 1
|
||||
opt_set TEMP_SENSOR_4 1
|
||||
opt_enable VIKI2 Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \
|
||||
AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \
|
||||
opt_enable VIKI2 BOOT_MARLIN_LOGO_ANIMATED SDSUPPORT AUTO_REPORT_SD_STATUS \
|
||||
Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE \
|
||||
EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \
|
||||
NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \
|
||||
DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \
|
||||
FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING FIL_RUNOUT3_PULLUP
|
||||
|
||||
+8
-8
@@ -10,13 +10,13 @@ Starting with version `2.0.9`, Marlin provides a common interface for its serial
|
||||
|
||||
## Common interface
|
||||
|
||||
This interface is declared in `Marlin/src/core/serial_base.h`
|
||||
This interface is declared in `Marlin/src/core/serial_base.h`
|
||||
Any implementation will need to follow this interface for being used transparently in Marlin's codebase.
|
||||
|
||||
The implementation was written to prioritize performance over abstraction, so the base interface is not using virtual inheritance to avoid the cost of virtual dispatching while calling methods.
|
||||
Instead, the Curiously Recurring Template Pattern (**CRTP**) is used so that, upon compilation, the interface abstraction does not incur a performance cost.
|
||||
|
||||
Because some platform do not follow the same interface, the missing method in the actual low-level implementation are detected via SFINAE and a wrapper is generated when such method are missing. See `CALL_IF_EXISTS` macro in `Marlin/src/core/macros.h` for the documentation of this technic.
|
||||
Because some platform do not follow the same interface, the missing method in the actual low-level implementation are detected via SFINAE and a wrapper is generated when such method are missing. See `CALL_IF_EXISTS` macro in `Marlin/src/core/macros.h` for the documentation of this technic.
|
||||
|
||||
## Composing the desired feature
|
||||
The different specificities for each architecture are provided by composing the serial type based on desired functionality.
|
||||
@@ -25,11 +25,11 @@ In the `Marlin/src/core/serial_hook.h` file, the different serial feature are de
|
||||
2. `ForwardSerial` is a composing wrapper. It references an actual Arduino compatible `Serial` instance. You'll use this if the instance is declared in the platform's framework and is being referred directly in the framework. This is not as efficient as the `BaseSerial` implementation since static dereferencing is done for each method call (it'll still be faster than virtual dispatching)
|
||||
3. `ConditionalSerial` is working a bit like the `ForwardSerial` interface, but it checks a boolean condition before calling the referenced instance. You'll use it when the serial output can be switch off at runtime, for example in a *telnet* like serial output that should not emit any packet if no client is connected.
|
||||
4. `RuntimeSerial` is providing a runtime-modifiable hooking method for its `write` and `msgDone` method. You'll use it if you need to capture the serial output of Marlin, for example to display the G-Code parser's output on a GUI interface. The hooking interface is setup via the `setHook` method.
|
||||
5. `MultiSerial` is a runtime modifiable serial output multiplexer. It can output (*respectively input*) to 2 different interface based on a port *mask*. You'll use this if you need to output the same serial stream to multiple port. You can plug a `MultiSerial` to itself to duplicate to more than 2 ports.
|
||||
5. `MultiSerial` is a runtime modifiable serial output multiplexer. It can output (*respectively input*) to 2 different interface based on a port *mask*. You'll use this if you need to output the same serial stream to multiple port. You can plug a `MultiSerial` to itself to duplicate to more than 2 ports.
|
||||
|
||||
## Plumbing
|
||||
Since all the types above are using CRTP, it's possible to combine them to get the appropriate functionality.
|
||||
This is easily done via type definition of the feature.
|
||||
Since all the types above are using CRTP, it's possible to combine them to get the appropriate functionality.
|
||||
This is easily done via type definition of the feature.
|
||||
|
||||
For example, to present a serial interface that's outputting to 2 serial port, the first one being hooked at runtime and the second one connected to a runtime switchable telnet client, you'll declare the type to use as:
|
||||
```
|
||||
@@ -37,8 +37,8 @@ typedef MultiSerial< RuntimeSerial<Serial>, ConditionalSerial<TelnetClient> > Se
|
||||
```
|
||||
|
||||
## Emergency parser
|
||||
By default, the serial base interface provide an emergency parser that's only enable for serial classes that support it.
|
||||
Because of this condition, all underlying type takes a first `bool emergencyParserEnabled` argument to their constructor. You must take into account this parameter when defining the actual type used.
|
||||
By default, the serial base interface provide an emergency parser that's only enable for serial classes that support it.
|
||||
Because of this condition, all underlying type takes a first `bool emergencyParserEnabled` argument to their constructor. You must take into account this parameter when defining the actual type used.
|
||||
|
||||
|
||||
*This document was written by [X-Ryl669](https://blog.cyril.by) and is under [CC-SA license](https://creativecommons.org/licenses/by-sa)*
|
||||
*This document was written by [X-Ryl669](https://blog.cyril.by) and is under [CC-SA license](https://creativecommons.org/licenses/by-sa)*
|
||||
|
||||
@@ -1526,6 +1526,22 @@ build_flags = ${stm32_flash_drive.build_flags}
|
||||
-DUSE_USB_HS_IN_FS
|
||||
-DUSBD_USE_CDC
|
||||
|
||||
#
|
||||
# MKS Robin Nano V3 with USB Flash Drive Support and Shared Media
|
||||
# Currently, using a STM32duino fork, until USB Host and USB Device MSC get merged
|
||||
#
|
||||
[env:mks_robin_nano_v3_usb_flash_drive_msc]
|
||||
extends = env:mks_robin_nano_v3
|
||||
platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc.zip
|
||||
build_unflags = ${common_stm32.build_unflags} -DUSBD_USE_CDC
|
||||
build_flags = ${stm32_flash_drive.build_flags}
|
||||
-DUSBCON
|
||||
-DUSE_USBHOST_HS
|
||||
-DUSBD_IRQ_PRIO=5
|
||||
-DUSBD_IRQ_SUBPRIO=6
|
||||
-DUSE_USB_HS_IN_FS
|
||||
-DUSBD_USE_CDC_MSC
|
||||
|
||||
#
|
||||
# Mingda MPX_ARM_MINI
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user