Merge branch 'bugfix-2.0.x' into CrealityDwin2.0_Bleeding
This commit is contained in:
@@ -280,7 +280,7 @@
|
||||
*
|
||||
* Advanced settings can be found in Configuration_adv.h
|
||||
*/
|
||||
#define CONFIGURATION_H_VERSION 02000901
|
||||
#define CONFIGURATION_H_VERSION 02000902
|
||||
|
||||
//===========================================================================
|
||||
//============================= Getting Started =============================
|
||||
@@ -3898,7 +3898,7 @@
|
||||
// - Copy the downloaded DWIN_SET folder to the SD card.
|
||||
//
|
||||
// RELOADED (T5UID1)
|
||||
// - Download https://github.com/Desuuuu/DGUS-reloaded
|
||||
// - Download https://github.com/Desuuuu/DGUS-reloaded/releases
|
||||
// - Copy the downloaded DWIN_SET folder to the SD card.
|
||||
//
|
||||
//#define DGUS_LCD_UI_ORIGIN
|
||||
@@ -4124,6 +4124,8 @@
|
||||
#define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens
|
||||
#define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus
|
||||
|
||||
//#define TOUCH_IDLE_SLEEP 300 // (secs) Turn off the TFT backlight if set (5mn)
|
||||
|
||||
#define TOUCH_SCREEN_CALIBRATION
|
||||
|
||||
//#define TOUCH_CALIBRATION_X 12316
|
||||
|
||||
+19
-13
@@ -30,7 +30,7 @@
|
||||
*
|
||||
* Basic settings can be found in Configuration.h
|
||||
*/
|
||||
#define CONFIGURATION_ADV_H_VERSION 02000901
|
||||
#define CONFIGURATION_ADV_H_VERSION 02000902
|
||||
|
||||
//===========================================================================
|
||||
//============================= Thermal Settings ============================
|
||||
@@ -3472,11 +3472,13 @@
|
||||
//#define SPINDLE_FEATURE
|
||||
//#define LASER_FEATURE
|
||||
#if EITHER(SPINDLE_FEATURE, LASER_FEATURE)
|
||||
#define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if the on/off function is active HIGH
|
||||
#define SPINDLE_LASER_PWM true // Set to "true" if your controller supports setting the speed/power
|
||||
#define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower
|
||||
#define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if SPINDLE_LASER_ENA_PIN is active HIGH
|
||||
|
||||
#define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR and LPC)
|
||||
#define SPINDLE_LASER_USE_PWM // Enable if your controller supports setting the speed/power
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
#define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower
|
||||
#define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR and LPC)
|
||||
#endif
|
||||
|
||||
//#define AIR_EVACUATION // Cutter Vacuum / Laser Blower motor control with G-codes M10-M11
|
||||
#if ENABLED(AIR_EVACUATION)
|
||||
@@ -3532,17 +3534,21 @@
|
||||
* Speed/Power = (PWMDC / 255 * 100 - SPEED_POWER_INTERCEPT) / SPEED_POWER_SLOPE
|
||||
* PWMDC = (spdpwr - SPEED_POWER_MIN) / (SPEED_POWER_MAX - SPEED_POWER_MIN) / SPEED_POWER_SLOPE
|
||||
*/
|
||||
#define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
|
||||
#define SPEED_POWER_MIN 5000 // (RPM)
|
||||
#define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM
|
||||
#define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
#define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
|
||||
#define SPEED_POWER_MIN 5000 // (RPM)
|
||||
#define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM
|
||||
#define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments)
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
|
||||
#define SPEED_POWER_MIN 0 // (%) 0-100
|
||||
#define SPEED_POWER_MAX 100 // (%) 0-100
|
||||
#define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
#define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
|
||||
#define SPEED_POWER_MIN 0 // (%) 0-100
|
||||
#define SPEED_POWER_MAX 100 // (%) 0-100
|
||||
#define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments)
|
||||
#endif
|
||||
|
||||
// Define the minimum and maximum test pulse time values for a laser test fire function
|
||||
#define LASER_TEST_PULSE_MIN 1 // Used with Laser Control Menu
|
||||
|
||||
+1
-1
@@ -119,7 +119,7 @@
|
||||
* here we define this default string as the date where the latest release
|
||||
* version was tagged.
|
||||
*/
|
||||
#define STRING_DISTRIBUTION_DATE "2021-09-10"
|
||||
#define STRING_DISTRIBUTION_DATE "2021-09-14"
|
||||
|
||||
/**
|
||||
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
/**
|
||||
* Sanity checks for Spindle / Laser PWM
|
||||
*/
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
#include "../ServoTimers.h" // Needed to check timer availability (_useTimer3)
|
||||
#if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13)
|
||||
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt."
|
||||
@@ -43,7 +43,7 @@
|
||||
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system."
|
||||
#endif
|
||||
#elif defined(SPINDLE_LASER_FREQUENCY)
|
||||
#error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_PWM."
|
||||
#error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_USE_PWM."
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
*/
|
||||
|
||||
// Emulating RAMPS
|
||||
#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
|
||||
#error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
|
||||
#endif
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@ extern DefaultSerial1 USBSerial;
|
||||
#error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
||||
#endif
|
||||
#if HAS_DGUS_LCD
|
||||
#define SERIAL_GET_TX_BUFFER_FREE() MSerial0.available()
|
||||
#define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.available()
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -46,6 +46,8 @@ public:
|
||||
|
||||
void end() {}
|
||||
|
||||
uint8_t availableForWrite(void) { /* flushTX(); */ return TX_BUFFER_SIZE; }
|
||||
|
||||
#if ENABLED(EMERGENCY_PARSER)
|
||||
bool recv_callback(const char c) override;
|
||||
#endif
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
*
|
||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
||||
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
|
||||
* Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
|
||||
*
|
||||
* 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
|
||||
@@ -20,12 +19,19 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implementation of EEPROM settings in SD Card
|
||||
*/
|
||||
|
||||
#ifdef TARGET_LPC1768
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
|
||||
#if ENABLED(SDCARD_EEPROM_EMULATION)
|
||||
|
||||
//#define DEBUG_SD_EEPROM_EMULATION
|
||||
|
||||
#include "../shared/eeprom_api.h"
|
||||
|
||||
#include <chanfs/diskio.h>
|
||||
@@ -38,9 +44,11 @@ FATFS fat_fs;
|
||||
FIL eeprom_file;
|
||||
bool eeprom_file_open = false;
|
||||
|
||||
#define EEPROM_FILENAME "eeprom.dat"
|
||||
#ifndef MARLIN_EEPROM_SIZE
|
||||
#define MARLIN_EEPROM_SIZE size_t(0x1000) // 4KiB of Emulated EEPROM
|
||||
#endif
|
||||
|
||||
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
|
||||
|
||||
bool PersistentStore::access_start() {
|
||||
@@ -50,7 +58,7 @@ bool PersistentStore::access_start() {
|
||||
MSC_Release_Lock();
|
||||
return false;
|
||||
}
|
||||
FRESULT res = f_open(&eeprom_file, "eeprom.dat", FA_OPEN_ALWAYS | FA_WRITE | FA_READ);
|
||||
FRESULT res = f_open(&eeprom_file, EEPROM_FILENAME, FA_OPEN_ALWAYS | FA_WRITE | FA_READ);
|
||||
if (res) MSC_Release_Lock();
|
||||
|
||||
if (res == FR_OK) {
|
||||
@@ -81,18 +89,20 @@ bool PersistentStore::access_finish() {
|
||||
// This extra chit-chat goes away soon, but is helpful for now
|
||||
// to see errors that are happening in read_data / write_data
|
||||
static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) {
|
||||
PGM_P const rw_str = write ? PSTR("write") : PSTR("read");
|
||||
SERIAL_CHAR(' ');
|
||||
SERIAL_ECHOPGM_P(rw_str);
|
||||
SERIAL_ECHOLNPGM("_data(", pos, ",", value, ",", size, ", ...)");
|
||||
if (total) {
|
||||
SERIAL_ECHOPGM(" f_");
|
||||
#if ENABLED(DEBUG_SD_EEPROM_EMULATION)
|
||||
PGM_P const rw_str = write ? PSTR("write") : PSTR("read");
|
||||
SERIAL_CHAR(' ');
|
||||
SERIAL_ECHOPGM_P(rw_str);
|
||||
SERIAL_ECHOPGM("()=", s, "\n size=", size, "\n bytes_");
|
||||
SERIAL_ECHOLNPGM_P(write ? PSTR("written=") : PSTR("read="), total);
|
||||
}
|
||||
else
|
||||
SERIAL_ECHOLNPGM(" f_lseek()=", s);
|
||||
SERIAL_ECHOLNPGM("_data(", pos, ",", *value, ",", size, ", ...)");
|
||||
if (total) {
|
||||
SERIAL_ECHOPGM(" f_");
|
||||
SERIAL_ECHOPGM_P(rw_str);
|
||||
SERIAL_ECHOPGM("()=", s, "\n size=", size, "\n bytes_");
|
||||
SERIAL_ECHOLNPGM_P(write ? PSTR("written=") : PSTR("read="), total);
|
||||
}
|
||||
else
|
||||
SERIAL_ECHOLNPGM(" f_lseek()=", s);
|
||||
#endif
|
||||
}
|
||||
|
||||
// File function return codes for type FRESULT. This goes away soon, but
|
||||
|
||||
@@ -67,7 +67,7 @@ static_assert(!(NUM_SERVOS && ENABLED(FAST_PWM_FAN)), "BLTOUCH and Servos are in
|
||||
* Test LPC176x-specific configuration values for errors at compile-time.
|
||||
*/
|
||||
|
||||
//#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
|
||||
//#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
|
||||
// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
|
||||
//#endif
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
*/
|
||||
|
||||
// Emulating RAMPS
|
||||
#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
|
||||
#error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
|
||||
#endif
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
/**
|
||||
* Test STM32-specific configuration values for errors at compile-time.
|
||||
*/
|
||||
//#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
|
||||
//#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
|
||||
// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
|
||||
//#endif
|
||||
|
||||
|
||||
@@ -542,6 +542,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
|
||||
next_cub_ms_##N = ms + CUB_DEBOUNCE_DELAY_##N; \
|
||||
CODE; \
|
||||
queue.inject_P(PSTR(BUTTON##N##_GCODE)); \
|
||||
TERN_(HAS_LCD_MENU, ui.quick_feedback()); \
|
||||
} \
|
||||
} \
|
||||
}while(0)
|
||||
@@ -1354,7 +1355,7 @@ void setup() {
|
||||
#endif
|
||||
|
||||
#if HAS_TOUCH_BUTTONS
|
||||
SETUP_RUN(touch.init());
|
||||
SETUP_RUN(touchBt.init());
|
||||
#endif
|
||||
|
||||
TERN_(HAS_M206_COMMAND, current_position += home_offset); // Init current position based on home_offset
|
||||
|
||||
@@ -23,10 +23,6 @@
|
||||
|
||||
#include "inc/MarlinConfig.h"
|
||||
|
||||
#ifdef DEBUG_GCODE_PARSER
|
||||
#include "gcode/parser.h"
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
+16
-11
@@ -340,17 +340,21 @@
|
||||
#define BOARD_CREALITY_V427 4040 // Creality v4.2.7 (STM32F103RE)
|
||||
#define BOARD_CREALITY_V4210 4041 // Creality v4.2.10 (STM32F103RE) as found in the CR-30
|
||||
#define BOARD_CREALITY_V431 4042 // Creality v4.3.1 (STM32F103RE)
|
||||
#define BOARD_CREALITY_V452 4043 // Creality v4.5.2 (STM32F103RE)
|
||||
#define BOARD_CREALITY_V453 4044 // Creality v4.5.3 (STM32F103RE)
|
||||
#define BOARD_TRIGORILLA_PRO 4045 // Trigorilla Pro (STM32F103ZET6)
|
||||
#define BOARD_FLY_MINI 4046 // FLYmaker FLY MINI (STM32F103RCT6)
|
||||
#define BOARD_FLSUN_HISPEED 4047 // FLSUN HiSpeedV1 (STM32F103VET6)
|
||||
#define BOARD_BEAST 4048 // STM32F103RET6 Libmaple-based controller
|
||||
#define BOARD_MINGDA_MPX_ARM_MINI 4049 // STM32F103ZET6 Mingda MD-16
|
||||
#define BOARD_GTM32_PRO_VD 4050 // STM32F103VET6 controller
|
||||
#define BOARD_ZONESTAR_ZM3E2 4051 // Zonestar ZM3E2 (STM32F103RCT6)
|
||||
#define BOARD_ZONESTAR_ZM3E4 4052 // Zonestar ZM3E4 V1 (STM32F103VCT6)
|
||||
#define BOARD_ZONESTAR_ZM3E4V2 4053 // Zonestar ZM3E4 V2 (STM32F103VCT6)
|
||||
#define BOARD_CREALITY_V431_A 4043 // Creality v4.3.1a (STM32F103RE)
|
||||
#define BOARD_CREALITY_V431_B 4044 // Creality v4.3.1b (STM32F103RE)
|
||||
#define BOARD_CREALITY_V431_C 4045 // Creality v4.3.1c (STM32F103RE)
|
||||
#define BOARD_CREALITY_V431_D 4046 // Creality v4.3.1d (STM32F103RE)
|
||||
#define BOARD_CREALITY_V452 4047 // Creality v4.5.2 (STM32F103RE)
|
||||
#define BOARD_CREALITY_V453 4048 // Creality v4.5.3 (STM32F103RE)
|
||||
#define BOARD_TRIGORILLA_PRO 4049 // Trigorilla Pro (STM32F103ZET6)
|
||||
#define BOARD_FLY_MINI 4050 // FLYmaker FLY MINI (STM32F103RCT6)
|
||||
#define BOARD_FLSUN_HISPEED 4051 // FLSUN HiSpeedV1 (STM32F103VET6)
|
||||
#define BOARD_BEAST 4052 // STM32F103RET6 Libmaple-based controller
|
||||
#define BOARD_MINGDA_MPX_ARM_MINI 4053 // STM32F103ZET6 Mingda MD-16
|
||||
#define BOARD_GTM32_PRO_VD 4054 // STM32F103VET6 controller
|
||||
#define BOARD_ZONESTAR_ZM3E2 4055 // Zonestar ZM3E2 (STM32F103RCT6)
|
||||
#define BOARD_ZONESTAR_ZM3E4 4056 // Zonestar ZM3E4 V1 (STM32F103VCT6)
|
||||
#define BOARD_ZONESTAR_ZM3E4V2 4057 // Zonestar ZM3E4 V2 (STM32F103VCT6)
|
||||
|
||||
//
|
||||
// ARM Cortex-M4F
|
||||
@@ -397,6 +401,7 @@
|
||||
#define BOARD_FYSETC_CHEETAH_V20 4231 // FYSETC Cheetah V2.0
|
||||
#define BOARD_TH3D_EZBOARD_LITE_V2 4232 // TH3D EZBoard Lite v2.0
|
||||
#define BOARD_INDEX_REV03 4233 // Index PnP Controller REV03 (STM32F407VET6/VGT6)
|
||||
#define BOARD_MKS_ROBIN_NANO_V1_3_F4 4234 // MKS Robin Nano V1.3 and MKS Robin Nano-S V1.3 (STM32F407VET6)
|
||||
|
||||
//
|
||||
// ARM Cortex M7
|
||||
|
||||
@@ -56,7 +56,6 @@
|
||||
#include "debug_section.h"
|
||||
#define DEBUG_SECTION(N,S,D) SectionLog N(PSTR(S),D)
|
||||
|
||||
#define DEBUG_ECHOPGM_P(P) SERIAL_ECHOPGM_P(P)
|
||||
#define DEBUG_ECHO_START SERIAL_ECHO_START
|
||||
#define DEBUG_ERROR_START SERIAL_ERROR_START
|
||||
#define DEBUG_CHAR SERIAL_CHAR
|
||||
|
||||
@@ -962,7 +962,7 @@ bool MMU2::eject_filament(const uint8_t index, const bool recover) {
|
||||
BUZZ(200, 404);
|
||||
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("MMU2 Eject Recover"), CONTINUE_STR));
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("MMU2 Eject Recover")));
|
||||
wait_for_user_response();
|
||||
TERN_(HAS_RESUME_CONTINUE, wait_for_user_response());
|
||||
BUZZ(200, 404);
|
||||
BUZZ(200, 404);
|
||||
|
||||
|
||||
@@ -525,7 +525,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep
|
||||
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_HEATER_TIMEOUT)));
|
||||
|
||||
wait_for_user_response(0, true); // Wait for LCD click or M108
|
||||
TERN_(HAS_RESUME_CONTINUE, wait_for_user_response(0, true)); // Wait for LCD click or M108
|
||||
|
||||
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_INFO, GET_TEXT(MSG_REHEATING)));
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ void SpindleLaser::init() {
|
||||
#if ENABLED(SPINDLE_CHANGE_DIR)
|
||||
OUT_WRITE(SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR ? 255 : 0); // Init rotation to clockwise (M3)
|
||||
#endif
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
SET_PWM(SPINDLE_LASER_PWM_PIN);
|
||||
analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed
|
||||
#endif
|
||||
@@ -83,7 +83,7 @@ void SpindleLaser::init() {
|
||||
#endif
|
||||
}
|
||||
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
/**
|
||||
* Set the cutter PWM directly to the given ocr value
|
||||
*
|
||||
@@ -107,7 +107,7 @@ void SpindleLaser::init() {
|
||||
WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Cutter OFF
|
||||
_set_ocr(0);
|
||||
}
|
||||
#endif // SPINDLE_LASER_PWM
|
||||
#endif // SPINDLE_LASER_USE_PWM
|
||||
|
||||
/**
|
||||
* Apply power for laser/spindle
|
||||
@@ -121,7 +121,7 @@ void SpindleLaser::apply_power(const uint8_t opwr) {
|
||||
if (opwr == last_power_applied) return;
|
||||
last_power_applied = opwr;
|
||||
power = opwr;
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
if (cutter.unitPower == 0 && CUTTER_UNIT_IS(RPM)) {
|
||||
ocr_off();
|
||||
isReady = false;
|
||||
|
||||
@@ -123,7 +123,7 @@ public:
|
||||
FORCE_INLINE static void refresh() { apply_power(power); }
|
||||
FORCE_INLINE static void set_power(const uint8_t upwr) { power = upwr; refresh(); }
|
||||
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
|
||||
private:
|
||||
|
||||
@@ -186,7 +186,7 @@ public:
|
||||
}
|
||||
return upwr;
|
||||
}
|
||||
#endif // SPINDLE_LASER_PWM
|
||||
#endif // SPINDLE_LASER_USE_PWM
|
||||
|
||||
/**
|
||||
* Enable/Disable spindle/laser
|
||||
@@ -195,7 +195,7 @@ public:
|
||||
static inline void set_enabled(const bool enable) {
|
||||
uint8_t value = 0;
|
||||
if (enable) {
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
if (power)
|
||||
value = power;
|
||||
else if (unitPower)
|
||||
@@ -249,7 +249,7 @@ public:
|
||||
#if HAS_LCD_MENU
|
||||
static inline void enable_with_dir(const bool reverse) {
|
||||
isReady = true;
|
||||
const uint8_t ocr = TERN(SPINDLE_LASER_PWM, upower_to_ocr(menuPower), 255);
|
||||
const uint8_t ocr = TERN(SPINDLE_LASER_USE_PWM, upower_to_ocr(menuPower), 255);
|
||||
if (menuPower)
|
||||
power = ocr;
|
||||
else
|
||||
@@ -262,7 +262,7 @@ public:
|
||||
FORCE_INLINE static void enable_reverse() { enable_with_dir(true); }
|
||||
FORCE_INLINE static void enable_same_dir() { enable_with_dir(is_reverse()); }
|
||||
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
static inline void update_from_mpower() {
|
||||
if (isReady) power = upower_to_ocr(menuPower);
|
||||
unitPower = menuPower;
|
||||
@@ -308,14 +308,14 @@ public:
|
||||
isReady = false;
|
||||
unitPower = menuPower = 0;
|
||||
planner.laser_inline.status.isPlanned = false;
|
||||
TERN(SPINDLE_LASER_PWM, inline_ocr_power, inline_power)(0);
|
||||
TERN(SPINDLE_LASER_USE_PWM, inline_ocr_power, inline_power)(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the power for subsequent movement blocks
|
||||
static void inline_power(const cutter_power_t upwr) {
|
||||
unitPower = menuPower = upwr;
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
#if ENABLED(SPEED_POWER_RELATIVE) && !CUTTER_UNIT_IS(RPM) // relative mode does not turn laser off at 0, except for RPM
|
||||
planner.laser_inline.status.isEnabled = true;
|
||||
planner.laser_inline.power = upower_to_ocr(upwr);
|
||||
@@ -332,7 +332,7 @@ public:
|
||||
|
||||
static inline void inline_direction(const bool) { /* never */ }
|
||||
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
static inline void inline_ocr_power(const uint8_t ocrpwr) {
|
||||
isReady = ocrpwr > 0;
|
||||
planner.laser_inline.status.isEnabled = ocrpwr > 0;
|
||||
|
||||
@@ -69,6 +69,8 @@ enum CalEnum : char { // the 7 main calibration points -
|
||||
|
||||
float lcd_probe_pt(const xy_pos_t &xy);
|
||||
|
||||
float dcr;
|
||||
|
||||
void ac_home() {
|
||||
endstops.enable(true);
|
||||
TERN_(SENSORLESS_HOMING, probe.set_homing_current(true));
|
||||
@@ -175,9 +177,9 @@ static float std_dev_points(float z_pt[NPP + 1], const bool _0p_cal, const bool
|
||||
/**
|
||||
* - Probe a point
|
||||
*/
|
||||
static float calibration_probe(const xy_pos_t &xy, const bool stow) {
|
||||
static float calibration_probe(const xy_pos_t &xy, const bool stow, const bool probe_at_offset) {
|
||||
#if HAS_BED_PROBE
|
||||
return probe.probe_at_point(xy, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, true, false);
|
||||
return probe.probe_at_point(xy, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, true, probe_at_offset);
|
||||
#else
|
||||
UNUSED(stow);
|
||||
return lcd_probe_pt(xy);
|
||||
@@ -187,7 +189,7 @@ static float calibration_probe(const xy_pos_t &xy, const bool stow) {
|
||||
/**
|
||||
* - Probe a grid
|
||||
*/
|
||||
static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each) {
|
||||
static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each, const bool probe_at_offset) {
|
||||
const bool _0p_calibration = probe_points == 0,
|
||||
_1p_calibration = probe_points == 1 || probe_points == -1,
|
||||
_4p_calibration = probe_points == 2,
|
||||
@@ -209,11 +211,9 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi
|
||||
|
||||
if (!_0p_calibration) {
|
||||
|
||||
const float dcr = delta_calibration_radius();
|
||||
|
||||
if (!_7p_no_intermediates && !_7p_4_intermediates && !_7p_11_intermediates) { // probe the center
|
||||
const xy_pos_t center{0};
|
||||
z_pt[CEN] += calibration_probe(center, stow_after_each);
|
||||
z_pt[CEN] += calibration_probe(center, stow_after_each, probe_at_offset);
|
||||
if (isnan(z_pt[CEN])) return false;
|
||||
}
|
||||
|
||||
@@ -224,7 +224,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi
|
||||
const float a = RADIANS(210 + (360 / NPP) * (rad - 1)),
|
||||
r = dcr * 0.1;
|
||||
const xy_pos_t vec = { cos(a), sin(a) };
|
||||
z_pt[CEN] += calibration_probe(vec * r, stow_after_each);
|
||||
z_pt[CEN] += calibration_probe(vec * r, stow_after_each, probe_at_offset);
|
||||
if (isnan(z_pt[CEN])) return false;
|
||||
}
|
||||
z_pt[CEN] /= float(_7p_2_intermediates ? 7 : probe_points);
|
||||
@@ -249,7 +249,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi
|
||||
r = dcr * (1 - 0.1 * (zig_zag ? offset - circle : circle)),
|
||||
interpol = FMOD(rad, 1);
|
||||
const xy_pos_t vec = { cos(a), sin(a) };
|
||||
const float z_temp = calibration_probe(vec * r, stow_after_each);
|
||||
const float z_temp = calibration_probe(vec * r, stow_after_each, probe_at_offset);
|
||||
if (isnan(z_temp)) return false;
|
||||
// split probe point to neighbouring calibration points
|
||||
z_pt[uint8_t(LROUND(rad - interpol + NPP - 1)) % NPP + 1] += z_temp * sq(cos(RADIANS(interpol * 90)));
|
||||
@@ -276,7 +276,6 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi
|
||||
static void reverse_kinematics_probe_points(float z_pt[NPP + 1], abc_float_t mm_at_pt_axis[NPP + 1]) {
|
||||
xyz_pos_t pos{0};
|
||||
|
||||
const float dcr = delta_calibration_radius();
|
||||
LOOP_CAL_ALL(rad) {
|
||||
const float a = RADIANS(210 + (360 / NPP) * (rad - 1)),
|
||||
r = (rad == CEN ? 0.0f : dcr);
|
||||
@@ -287,7 +286,7 @@ static void reverse_kinematics_probe_points(float z_pt[NPP + 1], abc_float_t mm_
|
||||
}
|
||||
|
||||
static void forward_kinematics_probe_points(abc_float_t mm_at_pt_axis[NPP + 1], float z_pt[NPP + 1]) {
|
||||
const float r_quot = delta_calibration_radius() / delta_radius;
|
||||
const float r_quot = dcr / delta_radius;
|
||||
|
||||
#define ZPP(N,I,A) (((1.0f + r_quot * (N)) / 3.0f) * mm_at_pt_axis[I].A)
|
||||
#define Z00(I, A) ZPP( 0, I, A)
|
||||
@@ -328,7 +327,7 @@ static void calc_kinematics_diff_probe_points(float z_pt[NPP + 1], abc_float_t d
|
||||
}
|
||||
|
||||
static float auto_tune_h() {
|
||||
const float r_quot = delta_calibration_radius() / delta_radius;
|
||||
const float r_quot = dcr / delta_radius;
|
||||
return RECIPROCAL(r_quot / (2.0f / 3.0f)); // (2/3)/CR
|
||||
}
|
||||
|
||||
@@ -373,6 +372,8 @@ static float auto_tune_a() {
|
||||
* P3 Probe all positions: center, towers and opposite towers. Calibrate all.
|
||||
* P4-P10 Probe all positions at different intermediate locations and average them.
|
||||
*
|
||||
* Rn.nn override default calibration Radius
|
||||
*
|
||||
* T Don't calibrate tower angle corrections
|
||||
*
|
||||
* Cn.nn Calibration precision; when omitted calibrates to maximum precision
|
||||
@@ -387,6 +388,8 @@ static float auto_tune_a() {
|
||||
*
|
||||
* E Engage the probe for each point
|
||||
*
|
||||
* O Probe at offset points (this is wrong but it seems to work)
|
||||
*
|
||||
* With SENSORLESS_PROBING:
|
||||
* Use these flags to calibrate stall sensitivity: (e.g., `G33 P1 Y Z` to calibrate X only.)
|
||||
* X Don't activate stallguard on X.
|
||||
@@ -403,7 +406,27 @@ void GcodeSuite::G33() {
|
||||
return;
|
||||
}
|
||||
|
||||
const bool towers_set = !parser.seen_test('T');
|
||||
const bool probe_at_offset = TERN0(HAS_PROBE_XY_OFFSET, parser.boolval('O')),
|
||||
towers_set = !parser.seen_test('T');
|
||||
|
||||
float max_dcr = dcr = DELTA_PRINTABLE_RADIUS;
|
||||
#if HAS_PROBE_XY_OFFSET
|
||||
// For offset probes the calibration radius is set to a safe but non-optimal value
|
||||
dcr -= HYPOT(probe.offset_xy.x, probe.offset_xy.y);
|
||||
if (probe_at_offset) {
|
||||
// With probe positions both probe and nozzle need to be within the printable area
|
||||
max_dcr = dcr;
|
||||
}
|
||||
// else with nozzle positions there is a risk of the probe being outside the bed
|
||||
// but as long the nozzle stays within the printable area there is no risk of
|
||||
// the effector crashing into the towers.
|
||||
#endif
|
||||
|
||||
if (parser.seenval('R')) dcr = parser.value_float();
|
||||
if (!WITHIN(dcr, 0, max_dcr)) {
|
||||
SERIAL_ECHOLNPGM("?calibration (R)adius implausible.");
|
||||
return;
|
||||
}
|
||||
|
||||
const float calibration_precision = parser.floatval('C', 0.0f);
|
||||
if (calibration_precision < 0) {
|
||||
@@ -425,7 +448,7 @@ void GcodeSuite::G33() {
|
||||
|
||||
const bool stow_after_each = parser.seen_test('E');
|
||||
|
||||
#if ENABLED(SENSORLESS_PROBING)
|
||||
#if HAS_DELTA_SENSORLESS_PROBING
|
||||
probe.test_sensitivity.x = !parser.seen_test('X');
|
||||
TERN_(HAS_Y_AXIS, probe.test_sensitivity.y = !parser.seen_test('Y'));
|
||||
TERN_(HAS_Z_AXIS, probe.test_sensitivity.z = !parser.seen_test('Z'));
|
||||
@@ -453,18 +476,6 @@ void GcodeSuite::G33() {
|
||||
|
||||
SERIAL_ECHOLNPGM("G33 Auto Calibrate");
|
||||
|
||||
const float dcr = delta_calibration_radius();
|
||||
|
||||
if (!_1p_calibration && !_0p_calibration) { // test if the outer radius is reachable
|
||||
LOOP_CAL_RAD(axis) {
|
||||
const float a = RADIANS(210 + (360 / NPP) * (axis - 1));
|
||||
if (!position_is_reachable(cos(a) * dcr, sin(a) * dcr)) {
|
||||
SERIAL_ECHOLNPGM("?Bed calibration radius implausible.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Report settings
|
||||
PGM_P const checkingac = PSTR("Checking... AC");
|
||||
SERIAL_ECHOPGM_P(checkingac);
|
||||
@@ -487,7 +498,7 @@ void GcodeSuite::G33() {
|
||||
|
||||
// Probe the points
|
||||
zero_std_dev_old = zero_std_dev;
|
||||
if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each)) {
|
||||
if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each, probe_at_offset)) {
|
||||
SERIAL_ECHOLNPGM("Correct delta settings with M665 and M666");
|
||||
return ac_cleanup(TERN_(HAS_MULTI_HOTEND, old_tool_index));
|
||||
}
|
||||
@@ -526,11 +537,11 @@ void GcodeSuite::G33() {
|
||||
#define Z0(I) ZP(0, I)
|
||||
|
||||
// calculate factors
|
||||
if (_7p_9_center) calibration_radius_factor = 0.9f;
|
||||
if (_7p_9_center) dcr *= 0.9f;
|
||||
h_factor = auto_tune_h();
|
||||
r_factor = auto_tune_r();
|
||||
a_factor = auto_tune_a();
|
||||
calibration_radius_factor = 1.0f;
|
||||
dcr /= 0.9f;
|
||||
|
||||
switch (probe_points) {
|
||||
case 0:
|
||||
|
||||
@@ -72,7 +72,7 @@ void GcodeSuite::M3_M4(const bool is_M4) {
|
||||
#if ENABLED(SPINDLE_SERVO)
|
||||
cutter.unitPower = spwr;
|
||||
#else
|
||||
cutter.unitPower = TERN(SPINDLE_LASER_PWM,
|
||||
cutter.unitPower = TERN(SPINDLE_LASER_USE_PWM,
|
||||
cutter.power_to_range(cutter_power_t(round(spwr))),
|
||||
spwr > 0 ? 255 : 0);
|
||||
#endif
|
||||
@@ -86,7 +86,7 @@ void GcodeSuite::M3_M4(const bool is_M4) {
|
||||
if (parser.seen('I') == DISABLED(LASER_POWER_INLINE_INVERT)) {
|
||||
// Laser power in inline mode
|
||||
cutter.inline_direction(is_M4); // Should always be unused
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
if (parser.seen('O')) {
|
||||
cutter.unitPower = cutter.power_to_range(parser.value_byte(), 0);
|
||||
cutter.inline_ocr_power(cutter.unitPower); // The OCR is a value from 0 to 255 (uint8_t)
|
||||
@@ -105,7 +105,7 @@ void GcodeSuite::M3_M4(const bool is_M4) {
|
||||
planner.synchronize(); // Wait for previous movement commands (G0/G0/G2/G3) to complete before changing power
|
||||
cutter.set_reverse(is_M4);
|
||||
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
if (parser.seenval('O')) {
|
||||
cutter.unitPower = cutter.power_to_range(parser.value_byte(), 0);
|
||||
cutter.ocr_set_power(cutter.unitPower); // The OCR is a value from 0 to 255 (uint8_t)
|
||||
|
||||
@@ -215,7 +215,7 @@ void GcodeSuite::get_destination_from_command() {
|
||||
// Set the laser power in the planner to configure this move
|
||||
if (parser.seen('S')) {
|
||||
const float spwr = parser.value_float();
|
||||
cutter.inline_power(TERN(SPINDLE_LASER_PWM, cutter.power_to_range(cutter_power_t(round(spwr))), spwr > 0 ? 255 : 0));
|
||||
cutter.inline_power(TERN(SPINDLE_LASER_USE_PWM, cutter.power_to_range(cutter_power_t(round(spwr))), spwr > 0 ? 255 : 0));
|
||||
}
|
||||
else if (ENABLED(LASER_MOVE_G0_OFF) && parser.codenum == 0) // G0
|
||||
cutter.set_inline_enabled(false);
|
||||
|
||||
@@ -21,10 +21,6 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
/**
|
||||
* gcode.h - Temporary container for all gcode handlers
|
||||
*/
|
||||
|
||||
/**
|
||||
* -----------------
|
||||
* G-Codes in Marlin
|
||||
|
||||
@@ -83,7 +83,7 @@ void GcodeSuite::M0_M1() {
|
||||
|
||||
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, parser.codenum ? PSTR("M1 Stop") : PSTR("M0 Stop"), CONTINUE_STR));
|
||||
|
||||
wait_for_user_response(ms);
|
||||
TERN_(HAS_RESUME_CONTINUE, wait_for_user_response(ms));
|
||||
|
||||
TERN_(HAS_LCD_MENU, ui.reset_status());
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ void GcodeSuite::M1001() {
|
||||
printerEventLEDs.onPrintCompleted();
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_PRINT_DONE)));
|
||||
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_PRINT_DONE), CONTINUE_STR));
|
||||
wait_for_user_response(SEC_TO_MS(TERN(HAS_LCD_MENU, PE_LEDS_COMPLETED_TIME, 30)));
|
||||
TERN_(HAS_RESUME_CONTINUE, wait_for_user_response(SEC_TO_MS(TERN(HAS_LCD_MENU, PE_LEDS_COMPLETED_TIME, 30))));
|
||||
printerEventLEDs.onResumeAfterWait();
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -241,7 +241,7 @@
|
||||
#define LCD_ST7920_DELAY_2 125
|
||||
#define LCD_ST7920_DELAY_3 125
|
||||
|
||||
#elif ENABLED(ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING)
|
||||
#elif EITHER(ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING)
|
||||
|
||||
#define IS_RRD_FG_SC 1
|
||||
#define LCD_ST7920_DELAY_1 150
|
||||
@@ -931,7 +931,10 @@
|
||||
#if DISABLED(NOZZLE_AS_PROBE)
|
||||
#define HAS_PROBE_XY_OFFSET 1
|
||||
#endif
|
||||
#if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && !BOTH(DELTA, SENSORLESS_PROBING)
|
||||
#if BOTH(DELTA, SENSORLESS_PROBING)
|
||||
#define HAS_DELTA_SENSORLESS_PROBING 1
|
||||
#endif
|
||||
#if NONE(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, HAS_DELTA_SENSORLESS_PROBING)
|
||||
#define USES_Z_MIN_PROBE_PIN 1
|
||||
#endif
|
||||
#if Z_HOME_TO_MIN && TERN1(USES_Z_MIN_PROBE_PIN, ENABLED(USE_PROBE_FOR_Z_HOMING))
|
||||
@@ -1357,6 +1360,9 @@
|
||||
|
||||
// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046'
|
||||
#if ENABLED(TOUCH_SCREEN)
|
||||
#if TOUCH_IDLE_SLEEP
|
||||
#define HAS_TOUCH_SLEEP 1
|
||||
#endif
|
||||
#if NONE(TFT_TOUCH_DEVICE_GT911, TFT_TOUCH_DEVICE_XPT2046)
|
||||
#define TFT_TOUCH_DEVICE_XPT2046 // ADS7843/XPT2046 ADC Touchscreen such as ILI9341 2.8
|
||||
#endif
|
||||
|
||||
@@ -658,7 +658,7 @@
|
||||
#endif
|
||||
|
||||
// Add features that need hardware PWM here
|
||||
#if ANY(FAST_PWM_FAN, SPINDLE_LASER_PWM)
|
||||
#if ANY(FAST_PWM_FAN, SPINDLE_LASER_USE_PWM)
|
||||
#define NEEDS_HARDWARE_PWM 1
|
||||
#endif
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
#define TEST2 1
|
||||
#define TEST3 0
|
||||
#define TEST4 true
|
||||
#if ENABLED(TEST0) || !ENABLED(TEST2) || ENABLED(TEST3)
|
||||
#if ENABLED(TEST0) || !ENABLED(TEST2) || ENABLED(TEST3) || !ENABLED(TEST1, TEST2, TEST4)
|
||||
#error "ENABLED is borked!"
|
||||
#endif
|
||||
#if BOTH(TEST0, TEST1)
|
||||
@@ -593,6 +593,8 @@
|
||||
#error "ARC_SUPPORT no longer uses ARC_SEGMENTS_PER_R."
|
||||
#elif ENABLED(ARC_SUPPORT) && (!defined(MIN_ARC_SEGMENT_MM) || !defined(MAX_ARC_SEGMENT_MM))
|
||||
#error "ARC_SUPPORT now requires MIN_ARC_SEGMENT_MM and MAX_ARC_SEGMENT_MM."
|
||||
#elif defined(SPINDLE_LASER_PWM)
|
||||
#error "SPINDLE_LASER_PWM (true) is now set with SPINDLE_LASER_USE_PWM (enabled)."
|
||||
#endif
|
||||
|
||||
#if MOTHERBOARD == BOARD_DUE3DOM_MINI && PIN_EXISTS(TEMP_2) && DISABLED(TEMP_SENSOR_BOARD)
|
||||
@@ -999,6 +1001,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
||||
static_assert(WITHIN(npp_xyz.z, Z_MIN_POS, Z_MAX_POS), "NOZZLE_PARK_POINT.Z is out of bounds (Z_MIN_POS, Z_MAX_POS).");
|
||||
#endif
|
||||
|
||||
#if !HAS_RESUME_CONTINUE && DISABLED(HOST_PROMPT_SUPPORT) && DISABLED(EXTENSIBLE_UI)
|
||||
#warning "Your Configuration provides no method to acquire user feedback!"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Instant Freeze
|
||||
*/
|
||||
@@ -3554,8 +3560,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
|
||||
#error "LASER_MOVE_G0_OFF requires LASER_MOVE_POWER."
|
||||
#endif
|
||||
#if ENABLED(LASER_POWER_INLINE_TRAPEZOID)
|
||||
#if DISABLED(SPINDLE_LASER_PWM)
|
||||
#error "LASER_POWER_INLINE_TRAPEZOID requires SPINDLE_LASER_PWM to function."
|
||||
#if DISABLED(SPINDLE_LASER_USE_PWM)
|
||||
#error "LASER_POWER_INLINE_TRAPEZOID requires SPINDLE_LASER_USE_PWM to function."
|
||||
#elif ENABLED(S_CURVE_ACCELERATION)
|
||||
//#ifndef LASER_POWER_INLINE_S_CURVE_ACCELERATION_WARN
|
||||
// #define LASER_POWER_INLINE_S_CURVE_ACCELERATION_WARN
|
||||
@@ -3587,21 +3593,21 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
|
||||
#error "(SPINDLE|LASER)_FEATURE requires SPINDLE_LASER_ENA_PIN or SPINDLE_SERVO to control the power."
|
||||
#elif ENABLED(SPINDLE_CHANGE_DIR) && !PIN_EXISTS(SPINDLE_DIR)
|
||||
#error "SPINDLE_DIR_PIN is required for SPINDLE_CHANGE_DIR."
|
||||
#elif ENABLED(SPINDLE_LASER_PWM)
|
||||
#elif ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
#if !defined(SPINDLE_LASER_PWM_PIN) || SPINDLE_LASER_PWM_PIN < 0
|
||||
#error "SPINDLE_LASER_PWM_PIN is required for SPINDLE_LASER_PWM."
|
||||
#error "SPINDLE_LASER_PWM_PIN is required for SPINDLE_LASER_USE_PWM."
|
||||
#elif !_TEST_PWM(SPINDLE_LASER_PWM_PIN)
|
||||
#error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin."
|
||||
#elif !defined(SPINDLE_LASER_PWM_INVERT)
|
||||
#error "SPINDLE_LASER_PWM_INVERT is required for (SPINDLE|LASER)_FEATURE."
|
||||
#elif !(defined(SPEED_POWER_INTERCEPT) && defined(SPEED_POWER_MIN) && defined(SPEED_POWER_MAX) && defined(SPEED_POWER_STARTUP))
|
||||
#error "SPINDLE_LASER_PWM equation constant(s) missing."
|
||||
#error "SPINDLE_LASER_USE_PWM equation constant(s) missing."
|
||||
#elif _PIN_CONFLICT(X_MIN)
|
||||
#error "SPINDLE_LASER_PWM pin conflicts with X_MIN_PIN."
|
||||
#error "SPINDLE_LASER_USE_PWM pin conflicts with X_MIN_PIN."
|
||||
#elif _PIN_CONFLICT(X_MAX)
|
||||
#error "SPINDLE_LASER_PWM pin conflicts with X_MAX_PIN."
|
||||
#error "SPINDLE_LASER_USE_PWM pin conflicts with X_MAX_PIN."
|
||||
#elif _PIN_CONFLICT(Z_STEP)
|
||||
#error "SPINDLE_LASER_PWM pin conflicts with Z_STEP_PIN."
|
||||
#error "SPINDLE_LASER_USE_PWM pin conflicts with Z_STEP_PIN."
|
||||
#elif _PIN_CONFLICT(CASE_LIGHT)
|
||||
#error "SPINDLE_LASER_PWM_PIN conflicts with CASE_LIGHT_PIN."
|
||||
#elif _PIN_CONFLICT(E0_AUTO_FAN)
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
* version was tagged.
|
||||
*/
|
||||
#ifndef STRING_DISTRIBUTION_DATE
|
||||
#define STRING_DISTRIBUTION_DATE "2021-09-10"
|
||||
#define STRING_DISTRIBUTION_DATE "2021-09-14"
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -52,7 +52,7 @@
|
||||
* to alert users to major changes.
|
||||
*/
|
||||
|
||||
#define MARLIN_HEX_VERSION 02000901
|
||||
#define MARLIN_HEX_VERSION 02000902
|
||||
#ifndef REQUIRED_CONFIGURATION_H_VERSION
|
||||
#define REQUIRED_CONFIGURATION_H_VERSION MARLIN_HEX_VERSION
|
||||
#endif
|
||||
|
||||
@@ -73,13 +73,18 @@ TFT_IO tftio;
|
||||
#define HEIGHT LCD_PIXEL_HEIGHT
|
||||
#define PAGE_HEIGHT 8
|
||||
|
||||
#include "../touch/touch_buttons.h"
|
||||
|
||||
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
|
||||
#include "../tft_io/touch_calibration.h"
|
||||
#include "../marlinui.h"
|
||||
#endif
|
||||
|
||||
#if HAS_TOUCH_BUTTONS
|
||||
#include "../touch/touch_buttons.h"
|
||||
#if HAS_TOUCH_SLEEP
|
||||
#define HAS_TOUCH_BUTTONS_SLEEP 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1)
|
||||
#define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1)
|
||||
|
||||
@@ -340,6 +345,18 @@ static uint8_t page;
|
||||
}
|
||||
#endif // HAS_TOUCH_BUTTONS
|
||||
|
||||
static void u8g_upscale_clear_lcd(u8g_t *u8g, u8g_dev_t *dev, uint16_t *buffer) {
|
||||
setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1);
|
||||
#if HAS_LCD_IO
|
||||
UNUSED(buffer);
|
||||
tftio.WriteMultiple(TFT_MARLINBG_COLOR, (TFT_WIDTH) * (TFT_HEIGHT));
|
||||
#else
|
||||
memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2);
|
||||
for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++)
|
||||
u8g_WriteSequence(u8g, dev, (TFT_WIDTH) / 2, (uint8_t *)buffer);
|
||||
#endif
|
||||
}
|
||||
|
||||
static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT
|
||||
|
||||
uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
|
||||
@@ -365,27 +382,32 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
|
||||
tftio.Init();
|
||||
tftio.InitTFT();
|
||||
TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset());
|
||||
|
||||
// Clear Screen
|
||||
setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1);
|
||||
#if HAS_LCD_IO
|
||||
tftio.WriteMultiple(TFT_MARLINBG_COLOR, (TFT_WIDTH) * (TFT_HEIGHT));
|
||||
#else
|
||||
memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2);
|
||||
for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++)
|
||||
u8g_WriteSequence(u8g, dev, (TFT_WIDTH) / 2, (uint8_t *)buffer);
|
||||
#endif
|
||||
u8g_upscale_clear_lcd(u8g, dev, buffer);
|
||||
return 0;
|
||||
|
||||
case U8G_DEV_MSG_STOP: preinit = true; break;
|
||||
|
||||
case U8G_DEV_MSG_PAGE_FIRST:
|
||||
case U8G_DEV_MSG_PAGE_FIRST: {
|
||||
page = 0;
|
||||
#if HAS_TOUCH_BUTTONS_SLEEP
|
||||
static bool sleepCleared;
|
||||
if (touchBt.isSleeping()) {
|
||||
if (!sleepCleared) {
|
||||
sleepCleared = true;
|
||||
u8g_upscale_clear_lcd(u8g, dev, buffer);
|
||||
IF_ENABLED(HAS_TOUCH_BUTTONS, redrawTouchButtons = true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
sleepCleared = false;
|
||||
#endif
|
||||
TERN_(HAS_TOUCH_BUTTONS, drawTouchButtons(u8g, dev));
|
||||
setWindow(u8g, dev, TFT_PIXEL_OFFSET_X, TFT_PIXEL_OFFSET_Y, X_HI, Y_HI);
|
||||
break;
|
||||
} break;
|
||||
|
||||
case U8G_DEV_MSG_PAGE_NEXT:
|
||||
if (TERN0(HAS_TOUCH_BUTTONS_SLEEP, touchBt.isSleeping())) break;
|
||||
if (++page > (HEIGHT / PAGE_HEIGHT)) return 1;
|
||||
|
||||
LOOP_L_N(y, PAGE_HEIGHT) {
|
||||
|
||||
@@ -145,7 +145,9 @@ ENCODER_DiffState Encoder_ReceiveAnalyze() {
|
||||
const float encoderStepRate = encoderMovementSteps / float(ms - EncoderRate.lastEncoderTime) * 1000;
|
||||
if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100;
|
||||
else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10;
|
||||
else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
|
||||
#if ENCODER_5X_STEPS_PER_SEC
|
||||
else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
|
||||
#endif
|
||||
}
|
||||
EncoderRate.lastEncoderTime = ms;
|
||||
}
|
||||
|
||||
@@ -33,13 +33,15 @@
|
||||
#include "../../../MarlinCore.h"
|
||||
#include "../../../core/serial.h"
|
||||
#include "../../../core/macros.h"
|
||||
#include "../../../gcode/queue.h"
|
||||
|
||||
#include "../../../module/temperature.h"
|
||||
#include "../../../module/printcounter.h"
|
||||
#include "../../../module/motion.h"
|
||||
#include "../../../module/planner.h"
|
||||
|
||||
#include "../../../gcode/gcode.h"
|
||||
#include "../../../gcode/queue.h"
|
||||
|
||||
#if HAS_FILAMENT_SENSOR
|
||||
#include "../../../feature/runout.h"
|
||||
#endif
|
||||
@@ -187,16 +189,24 @@ MenuClass *LevBedMenu = nullptr;
|
||||
MenuClass *MoveMenu = nullptr;
|
||||
MenuClass *ControlMenu = nullptr;
|
||||
MenuClass *AdvancedSettings = nullptr;
|
||||
TERN_(HAS_HOME_OFFSET, MenuClass *HomeOffMenu = nullptr);
|
||||
TERN_(HAS_BED_PROBE, MenuClass *ProbeSetMenu = nullptr);
|
||||
#if HAS_HOME_OFFSET
|
||||
MenuClass *HomeOffMenu = nullptr;
|
||||
#endif
|
||||
#if HAS_BED_PROBE
|
||||
MenuClass *ProbeSetMenu = nullptr;
|
||||
#endif
|
||||
MenuClass *FilSetMenu = nullptr;
|
||||
MenuClass *SelectColorMenu = nullptr;
|
||||
MenuClass *GetColorMenu = nullptr;
|
||||
MenuClass *TuneMenu = nullptr;
|
||||
MenuClass *MotionMenu = nullptr;
|
||||
MenuClass *FilamentMenu = nullptr;
|
||||
TERN_(MESH_BED_LEVELING, MenuClass *ManualMesh = nullptr);
|
||||
TERN_(HAS_HOTEND, MenuClass *PreheatMenu = nullptr);
|
||||
#if ENABLED(MESH_BED_LEVELING)
|
||||
MenuClass *ManualMesh = nullptr;
|
||||
#endif
|
||||
#if HAS_HOTEND
|
||||
MenuClass *PreheatMenu = nullptr;
|
||||
#endif
|
||||
MenuClass *TemperatureMenu = nullptr;
|
||||
MenuClass *MaxSpeedMenu = nullptr;
|
||||
MenuClass *MaxAccelMenu = nullptr;
|
||||
@@ -1558,6 +1568,7 @@ void EachMomentUpdate() {
|
||||
select_page.set(0);
|
||||
Goto_Main_Menu();
|
||||
}
|
||||
|
||||
#if ENABLED(POWER_LOSS_RECOVERY)
|
||||
else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off
|
||||
static bool recovery_flag = false;
|
||||
@@ -1679,7 +1690,7 @@ void DWIN_MeshLevelingStart() {
|
||||
|
||||
void DWIN_CompletedLeveling() { HMI_ReturnScreen(); }
|
||||
|
||||
#if ENABLED(MESH_BED_LEVELING)
|
||||
#if HAS_MESH
|
||||
void DWIN_MeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {
|
||||
char msg[33] = "";
|
||||
char str_1[6] = "";
|
||||
@@ -1837,10 +1848,10 @@ void DWIN_SetColorDefaults() {
|
||||
void DWIN_SetDataDefaults() {
|
||||
DWIN_SetColorDefaults();
|
||||
DWINUI::SetColors(HMI_data.Text_Color, HMI_data.Background_Color);
|
||||
TERN_(HAS_HOTEND, HMI_data.HotendPidT = PREHEAT_1_TEMP_HOTEND);
|
||||
TERN_(HAS_HEATED_BED, HMI_data.BedPidT = PREHEAT_1_TEMP_BED);
|
||||
TERN_(HAS_HOTEND, HMI_data.PidCycles = 5);
|
||||
TERN_(PREVENT_COLD_EXTRUSION, HMI_data.ExtMinT = EXTRUDE_MINTEMP);
|
||||
TERN_(HAS_HOTEND, HMI_data.HotendPidT = PREHEAT_1_TEMP_HOTEND);
|
||||
TERN_(HAS_HEATED_BED, HMI_data.BedPidT = PREHEAT_1_TEMP_BED);
|
||||
TERN_(HAS_HOTEND, HMI_data.PidCycles = 5);
|
||||
TERN_(PREVENT_COLD_EXTRUSION, HMI_data.ExtMinT = EXTRUDE_MINTEMP);
|
||||
}
|
||||
|
||||
void DWIN_StoreSettings(char *buff) {
|
||||
@@ -2112,9 +2123,9 @@ void SetHome() {
|
||||
|
||||
#if HAS_PREHEAT
|
||||
void SetPreheat(const uint8_t i) {
|
||||
TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[i].hotend_temp, 0));
|
||||
TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[i].hotend_temp, 0));
|
||||
TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(ui.material_preset[i].bed_temp));
|
||||
TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[i].fan_speed));
|
||||
TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[i].fan_speed));
|
||||
}
|
||||
void SetPreheat0() { SetPreheat(0); }
|
||||
void SetPreheat1() { SetPreheat(1); }
|
||||
@@ -2193,14 +2204,20 @@ void SetPID(celsius_t t, heater_id_t h) {
|
||||
planner.synchronize();
|
||||
thermalManager.PID_autotune(t, h, HMI_data.PidCycles, true);
|
||||
}
|
||||
TERN_(HAS_HOTEND, void HotendPID() { SetPID(HMI_data.HotendPidT, H_E0); })
|
||||
TERN_(HAS_HEATED_BED, void BedPID() { SetPID(HMI_data.BedPidT, H_BED); })
|
||||
#if HAS_HOTEND
|
||||
void HotendPID() { SetPID(HMI_data.HotendPidT, H_E0); }
|
||||
#endif
|
||||
#if HAS_HEATED_BED
|
||||
void BedPID() { SetPID(HMI_data.BedPidT, H_BED); }
|
||||
#endif
|
||||
|
||||
void SetPwrLossr() {
|
||||
recovery.enable(!recovery.enabled);
|
||||
Draw_Chkb_Line(CurrentMenu->line(), recovery.enabled);
|
||||
DWIN_UpdateLCD();
|
||||
}
|
||||
#if ENABLED(POWER_LOSS_RECOVERY)
|
||||
void SetPwrLossr() {
|
||||
recovery.enable(!recovery.enabled);
|
||||
Draw_Chkb_Line(CurrentMenu->line(), recovery.enabled);
|
||||
DWIN_UpdateLCD();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HAS_LCD_BRIGHTNESS
|
||||
void ApplyBrightness() { ui.set_brightness(HMI_value.Value); }
|
||||
@@ -2250,11 +2267,15 @@ void Goto_LockScreen() {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
TERN_(ADVANCED_PAUSE_FEATURE, void SetFilLoad() { SetPFloatOnClick(0, MAX_LOAD_UNLOAD, UNITFDIGITS); });
|
||||
TERN_(ADVANCED_PAUSE_FEATURE, void SetFilUnload() { SetPFloatOnClick(0, MAX_LOAD_UNLOAD, UNITFDIGITS); });
|
||||
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
||||
void SetFilLoad() { SetPFloatOnClick(0, MAX_LOAD_UNLOAD, UNITFDIGITS); }
|
||||
void SetFilUnload() { SetPFloatOnClick(0, MAX_LOAD_UNLOAD, UNITFDIGITS); }
|
||||
#endif
|
||||
|
||||
TERN_(PREVENT_COLD_EXTRUSION, void ApplyExtMinT() { thermalManager.extrude_min_temp = HMI_data.ExtMinT; thermalManager.allow_cold_extrude = (HMI_data.ExtMinT == 0); });
|
||||
TERN_(PREVENT_COLD_EXTRUSION, void SetExtMinT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP, ApplyExtMinT); });
|
||||
#if ENABLED(PREVENT_COLD_EXTRUSION)
|
||||
void ApplyExtMinT() { thermalManager.extrude_min_temp = HMI_data.ExtMinT; thermalManager.allow_cold_extrude = (HMI_data.ExtMinT == 0); }
|
||||
void SetExtMinT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP, ApplyExtMinT); }
|
||||
#endif
|
||||
|
||||
void RestoreDefaultsColors() {
|
||||
DWIN_SetColorDefaults();
|
||||
@@ -2425,38 +2446,53 @@ void LevBedC () { LevBed(4); }
|
||||
#endif
|
||||
|
||||
#if HAS_PREHEAT
|
||||
TERN_(HAS_HOTEND, void SetPreheatEndTemp() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); });
|
||||
TERN_(HAS_HEATED_BED, void SetPreheatBedTemp() { SetPIntOnClick(BED_MINTEMP, BED_MAX_TARGET); });
|
||||
TERN_(HAS_FAN, void SetPreheatFanSpeed() { SetPIntOnClick(0, 255); });
|
||||
#if HAS_HOTEND
|
||||
void SetPreheatEndTemp() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); }
|
||||
#endif
|
||||
#if HAS_HEATED_BED
|
||||
void SetPreheatBedTemp() { SetPIntOnClick(BED_MINTEMP, BED_MAX_TARGET); }
|
||||
#endif
|
||||
#if HAS_FAN
|
||||
void SetPreheatFanSpeed() { SetPIntOnClick(0, 255); }
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void ApplyMaxSpeed() { planner.set_max_feedrate(HMI_value.axis, HMI_value.Value / MINUNITMULT); }
|
||||
void SetMaxSpeedX() { HMI_value.axis = X_AXIS, SetFloatOnClick(MIN_MAXFEEDSPEED, default_max_feedrate[X_AXIS] * 2, UNITFDIGITS, planner.settings.max_feedrate_mm_s[X_AXIS], ApplyMaxSpeed); }
|
||||
void SetMaxSpeedY() { HMI_value.axis = Y_AXIS, SetFloatOnClick(MIN_MAXFEEDSPEED, default_max_feedrate[Y_AXIS] * 2, UNITFDIGITS, planner.settings.max_feedrate_mm_s[Y_AXIS], ApplyMaxSpeed); }
|
||||
void SetMaxSpeedZ() { HMI_value.axis = Z_AXIS, SetFloatOnClick(MIN_MAXFEEDSPEED, default_max_feedrate[Z_AXIS] * 2, UNITFDIGITS, planner.settings.max_feedrate_mm_s[Z_AXIS], ApplyMaxSpeed); }
|
||||
TERN_(HAS_HOTEND, void SetMaxSpeedE() { HMI_value.axis = E_AXIS; SetFloatOnClick(MIN_MAXFEEDSPEED, default_max_feedrate[E_AXIS] * 2, UNITFDIGITS, planner.settings.max_feedrate_mm_s[E_AXIS], ApplyMaxSpeed); });
|
||||
#if HAS_HOTEND
|
||||
void SetMaxSpeedE() { HMI_value.axis = E_AXIS; SetFloatOnClick(MIN_MAXFEEDSPEED, default_max_feedrate[E_AXIS] * 2, UNITFDIGITS, planner.settings.max_feedrate_mm_s[E_AXIS], ApplyMaxSpeed); }
|
||||
#endif
|
||||
|
||||
void ApplyMaxAccel() { planner.set_max_acceleration(HMI_value.axis, HMI_value.Value); }
|
||||
void SetMaxAccelX() { HMI_value.axis = X_AXIS, SetIntOnClick(MIN_MAXACCELERATION, default_max_acceleration[X_AXIS] * 2, planner.settings.max_acceleration_mm_per_s2[X_AXIS], ApplyMaxAccel); }
|
||||
void SetMaxAccelY() { HMI_value.axis = Y_AXIS, SetIntOnClick(MIN_MAXACCELERATION, default_max_acceleration[Y_AXIS] * 2, planner.settings.max_acceleration_mm_per_s2[Y_AXIS], ApplyMaxAccel); }
|
||||
void SetMaxAccelZ() { HMI_value.axis = Z_AXIS, SetIntOnClick(MIN_MAXACCELERATION, default_max_acceleration[Z_AXIS] * 2, planner.settings.max_acceleration_mm_per_s2[Z_AXIS], ApplyMaxAccel); }
|
||||
TERN_(HAS_HOTEND, void SetMaxAccelE() { HMI_value.axis = E_AXIS; SetIntOnClick(MIN_MAXACCELERATION, default_max_acceleration[E_AXIS] * 2, planner.settings.max_acceleration_mm_per_s2[E_AXIS], ApplyMaxAccel); });
|
||||
#if HAS_HOTEND
|
||||
void SetMaxAccelE() { HMI_value.axis = E_AXIS; SetIntOnClick(MIN_MAXACCELERATION, default_max_acceleration[E_AXIS] * 2, planner.settings.max_acceleration_mm_per_s2[E_AXIS], ApplyMaxAccel); }
|
||||
#endif
|
||||
|
||||
#if HAS_CLASSIC_JERK
|
||||
void ApplyMaxJerk() { planner.set_max_jerk(HMI_value.axis, HMI_value.Value / MINUNITMULT); }
|
||||
void SetMaxJerkX() { HMI_value.axis = X_AXIS, SetFloatOnClick(MIN_MAXJERK, default_max_jerk[X_AXIS] * 2, UNITFDIGITS, planner.max_jerk[X_AXIS], ApplyMaxJerk); }
|
||||
void SetMaxJerkY() { HMI_value.axis = Y_AXIS, SetFloatOnClick(MIN_MAXJERK, default_max_jerk[Y_AXIS] * 2, UNITFDIGITS, planner.max_jerk[Y_AXIS], ApplyMaxJerk); }
|
||||
void SetMaxJerkZ() { HMI_value.axis = Z_AXIS, SetFloatOnClick(MIN_MAXJERK, default_max_jerk[Z_AXIS] * 2, UNITFDIGITS, planner.max_jerk[Z_AXIS], ApplyMaxJerk); }
|
||||
TERN_(HAS_HOTEND, void SetMaxJerkE() { HMI_value.axis = E_AXIS; SetFloatOnClick(MIN_MAXJERK, default_max_jerk[E_AXIS] * 2, UNITFDIGITS, planner.max_jerk[E_AXIS], ApplyMaxJerk); });
|
||||
#if HAS_HOTEND
|
||||
void SetMaxJerkE() { HMI_value.axis = E_AXIS; SetFloatOnClick(MIN_MAXJERK, default_max_jerk[E_AXIS] * 2, UNITFDIGITS, planner.max_jerk[E_AXIS], ApplyMaxJerk); }
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void SetStepsX() { HMI_value.axis = X_AXIS, SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
|
||||
void SetStepsY() { HMI_value.axis = Y_AXIS, SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
|
||||
void SetStepsZ() { HMI_value.axis = Z_AXIS, SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
|
||||
TERN_(HAS_HOTEND, void SetStepsE() { HMI_value.axis = E_AXIS; SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); });
|
||||
|
||||
TERN_(HAS_HOTEND, void SetHotendPidT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); })
|
||||
TERN_(HAS_HEATED_BED, void SetBedPidT() { SetPIntOnClick(BED_MINTEMP, BED_MAX_TARGET); })
|
||||
#if HAS_HOTEND
|
||||
void SetStepsE() { HMI_value.axis = E_AXIS; SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
|
||||
void SetHotendPidT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); }
|
||||
#endif
|
||||
#if HAS_HEATED_BED
|
||||
void SetBedPidT() { SetPIntOnClick(BED_MINTEMP, BED_MAX_TARGET); }
|
||||
#endif
|
||||
|
||||
#if HAS_HOTEND || HAS_HEATED_BED
|
||||
void SetPidCycles() { SetPIntOnClick(3, 50); }
|
||||
@@ -2649,7 +2685,9 @@ void onDrawLanguage(MenuItemClass* menuitem, int8_t line) {
|
||||
DWINUI::Draw_String(VALX, MBASE(line), HMI_IsChinese() ? F("CN") : F("EN"));
|
||||
}
|
||||
|
||||
void onDrawPwrLossR(MenuItemClass* menuitem, int8_t line) { onDrawChkbMenu(menuitem, line, recovery.enabled); }
|
||||
#if ENABLED(POWER_LOSS_RECOVERY)
|
||||
void onDrawPwrLossR(MenuItemClass* menuitem, int8_t line) { onDrawChkbMenu(menuitem, line, recovery.enabled); }
|
||||
#endif
|
||||
|
||||
void onDrawEnableSound(MenuItemClass* menuitem, int8_t line) { onDrawChkbMenu(menuitem, line, ui.buzzer_enabled); }
|
||||
|
||||
@@ -3076,12 +3114,16 @@ void Draw_Prepare_Menu() {
|
||||
SetMenuTitle({133, 1, 28, 13}, {179, 0, 48, 14}, GET_TEXT_F(MSG_PREPARE));
|
||||
DWINUI::MenuItemsPrepare(13);
|
||||
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Goto_Main_Menu);
|
||||
TERN_(ADVANCED_PAUSE_FEATURE, ADDMENUITEM(ICON_FilMan, GET_TEXT(MSG_FILAMENT_MAN), onDrawSubMenu, Draw_FilamentMan_Menu));
|
||||
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
||||
ADDMENUITEM(ICON_FilMan, GET_TEXT(MSG_FILAMENT_MAN), onDrawSubMenu, Draw_FilamentMan_Menu);
|
||||
#endif
|
||||
ADDMENUITEM(ICON_Axis, GET_TEXT(MSG_MOVE_AXIS), onDrawMoveSubMenu, Draw_Move_Menu);
|
||||
ADDMENUITEM(ICON_LevBed, GET_TEXT(MSG_BED_LEVELING), onDrawSubMenu, Draw_LevBedCorners_Menu);
|
||||
ADDMENUITEM(ICON_CloseMotor, GET_TEXT(MSG_DISABLE_STEPPERS), onDrawDisableMotors, DisableMotors);
|
||||
ADDMENUITEM(ICON_Homing, GET_TEXT(MSG_AUTO_HOME), onDrawAutoHome, AutoHome);
|
||||
TERN_(MESH_BED_LEVELING, ADDMENUITEM(ICON_ManualMesh, GET_TEXT(MSG_MANUAL_MESH), onDrawSubMenu, Draw_ManualMesh_Menu));
|
||||
#if ENABLED(MESH_BED_LEVELING)
|
||||
ADDMENUITEM(ICON_ManualMesh, GET_TEXT(MSG_MANUAL_MESH), onDrawSubMenu, Draw_ManualMesh_Menu);
|
||||
#endif
|
||||
#if HAS_ZOFFSET_ITEM
|
||||
#if EITHER(HAS_BED_PROBE, BABYSTEPPING)
|
||||
ADDMENUITEM(ICON_SetZOffset, GET_TEXT(MSG_PROBE_WIZARD), onDrawSubMenu, Draw_ZOffsetWiz_Menu);
|
||||
@@ -3094,7 +3136,9 @@ void Draw_Prepare_Menu() {
|
||||
ADDMENUITEM(ICON_ABSPreheat, PSTR("Preheat " PREHEAT_2_LABEL), onDrawPreheat2, SetPreheat1);
|
||||
ADDMENUITEM(ICON_CustomPreheat, GET_TEXT(MSG_PREHEAT_CUSTOM), onDrawMenuItem, SetPreheat2);
|
||||
#endif
|
||||
TERN_(HAS_PREHEAT, ADDMENUITEM(ICON_Cool, GET_TEXT(MSG_COOLDOWN), onDrawCooldown, SetCoolDown));
|
||||
#if HAS_PREHEAT
|
||||
ADDMENUITEM(ICON_Cool, GET_TEXT(MSG_COOLDOWN), onDrawCooldown, SetCoolDown);
|
||||
#endif
|
||||
ADDMENUITEM(ICON_Language, PSTR("UI Language"), onDrawLanguage, SetLanguage);
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
@@ -3148,15 +3192,31 @@ void Draw_AdvancedSettings_Menu() {
|
||||
SetMenuTitle({0}, {0}, GET_TEXT_F(MSG_ADVANCED_SETTINGS)); // TODO: Chinese, English "Advanced Settings" JPG
|
||||
DWINUI::MenuItemsPrepare(11);
|
||||
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Draw_Control_Menu);
|
||||
TERN_(HAS_HOME_OFFSET, ADDMENUITEM(ICON_HomeOffset, GET_TEXT(MSG_SET_HOME_OFFSETS), onDrawSubMenu, Draw_HomeOffset_Menu));
|
||||
TERN_(HAS_BED_PROBE, ADDMENUITEM(ICON_ProbeSet, GET_TEXT(MSG_ZPROBE_SETTINGS), onDrawSubMenu, Draw_ProbeSet_Menu));
|
||||
TERN_(HAS_HOTEND, ADDMENUITEM(ICON_PIDNozzle, F("Hotend PID Settings"), onDrawSubMenu, Draw_HotendPID_Menu));
|
||||
TERN_(HAS_HEATED_BED, ADDMENUITEM(ICON_PIDbed, F("Bed PID Settings"), onDrawSubMenu, Draw_BedPID_Menu));
|
||||
TERN_(HAS_FILAMENT_SENSOR, ADDMENUITEM(ICON_FilSet, GET_TEXT(MSG_FILAMENT_SET), onDrawSubMenu, Draw_FilSet_Menu));
|
||||
TERN_(POWER_LOSS_RECOVERY, ADDMENUITEM(ICON_Pwrlossr, F("Power-loss recovery"), onDrawPwrLossR, SetPwrLossr));
|
||||
TERN_(HAS_LCD_BRIGHTNESS, ADDMENUITEM_P(ICON_Brightness, F("LCD Brightness"), onDrawPInt8Menu, SetBrightness, &ui.brightness));
|
||||
#if HAS_HOME_OFFSET
|
||||
ADDMENUITEM(ICON_HomeOffset, GET_TEXT(MSG_SET_HOME_OFFSETS), onDrawSubMenu, Draw_HomeOffset_Menu);
|
||||
#endif
|
||||
#if HAS_BED_PROBE
|
||||
ADDMENUITEM(ICON_ProbeSet, GET_TEXT(MSG_ZPROBE_SETTINGS), onDrawSubMenu, Draw_ProbeSet_Menu);
|
||||
#endif
|
||||
#if HAS_HOTEND
|
||||
ADDMENUITEM(ICON_PIDNozzle, F("Hotend PID Settings"), onDrawSubMenu, Draw_HotendPID_Menu);
|
||||
#endif
|
||||
#if HAS_HEATED_BED
|
||||
ADDMENUITEM(ICON_PIDbed, F("Bed PID Settings"), onDrawSubMenu, Draw_BedPID_Menu);
|
||||
#endif
|
||||
#if HAS_FILAMENT_SENSOR
|
||||
ADDMENUITEM(ICON_FilSet, GET_TEXT(MSG_FILAMENT_SET), onDrawSubMenu, Draw_FilSet_Menu);
|
||||
#endif
|
||||
#if ENABLED(POWER_LOSS_RECOVERY)
|
||||
ADDMENUITEM(ICON_Pwrlossr, F("Power-loss recovery"), onDrawPwrLossR, SetPwrLossr);
|
||||
#endif
|
||||
#if HAS_LCD_BRIGHTNESS
|
||||
ADDMENUITEM_P(ICON_Brightness, F("LCD Brightness"), onDrawPInt8Menu, SetBrightness, &ui.brightness);
|
||||
#endif
|
||||
ADDMENUITEM(ICON_Scolor, F("Select Colors"), onDrawSubMenu, Draw_SelectColors_Menu);
|
||||
TERN_(SOUND_MENU_ITEM, ADDMENUITEM(ICON_Sound, F("Enable Sound"), onDrawEnableSound, SetEnableSound));
|
||||
#if ENABLED(SOUND_MENU_ITEM)
|
||||
ADDMENUITEM(ICON_Sound, F("Enable Sound"), onDrawEnableSound, SetEnableSound);
|
||||
#endif
|
||||
ADDMENUITEM(ICON_Lock, F("Lock Screen"), onDrawMenuItem, Goto_LockScreen);
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
@@ -3173,7 +3233,9 @@ void Draw_Move_Menu() {
|
||||
ADDMENUITEM_P(ICON_MoveX, GET_TEXT(MSG_MOVE_X), onDrawMoveX, SetMoveX, ¤t_position.x);
|
||||
ADDMENUITEM_P(ICON_MoveY, GET_TEXT(MSG_MOVE_Y), onDrawMoveY, SetMoveY, ¤t_position.y);
|
||||
ADDMENUITEM_P(ICON_MoveZ, GET_TEXT(MSG_MOVE_Z), onDrawMoveZ, SetMoveZ, ¤t_position.z);
|
||||
TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_Extruder, GET_TEXT(MSG_MOVE_E), onDrawMoveE, SetMoveE, ¤t_position.e));
|
||||
#if HAS_HOTEND
|
||||
ADDMENUITEM_P(ICON_Extruder, GET_TEXT(MSG_MOVE_E), onDrawMoveE, SetMoveE, ¤t_position.e);
|
||||
#endif
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
if (!all_axes_trusted()) ui.set_status_P(PSTR("WARNING: position is unknow"));
|
||||
@@ -3223,11 +3285,19 @@ void Draw_Move_Menu() {
|
||||
CurrentMenu->MenuTitle.SetCaption(GET_TEXT_F(MSG_FILAMENT_SET));
|
||||
DWINUI::MenuItemsPrepare(6);
|
||||
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawMenuItem, Draw_AdvancedSettings_Menu);
|
||||
TERN_(HAS_FILAMENT_SENSOR, ADDMENUITEM(ICON_Runout, GET_TEXT(MSG_RUNOUT_ENABLE), onDrawRunoutEnable, SetRunoutEnable));
|
||||
TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, ADDMENUITEM_P(ICON_Runout, F("Runout Distance"), onDrawPFloatMenu, SetRunoutDistance, &runout.runout_distance()));
|
||||
TERN_(PREVENT_COLD_EXTRUSION, ADDMENUITEM_P(ICON_ExtrudeMinT, F("Extrude Min Temp."), onDrawPIntMenu, SetExtMinT, &HMI_data.ExtMinT));
|
||||
TERN_(ADVANCED_PAUSE_FEATURE, ADDMENUITEM_P(ICON_FilLoad, GET_TEXT(MSG_FILAMENT_LOAD), onDrawPFloatMenu, SetFilLoad, &fc_settings[0].load_length));
|
||||
TERN_(ADVANCED_PAUSE_FEATURE, ADDMENUITEM_P(ICON_FilUnload, GET_TEXT(MSG_FILAMENT_UNLOAD), onDrawPFloatMenu, SetFilUnload, &fc_settings[0].unload_length));
|
||||
#if HAS_FILAMENT_SENSOR
|
||||
ADDMENUITEM(ICON_Runout, GET_TEXT(MSG_RUNOUT_ENABLE), onDrawRunoutEnable, SetRunoutEnable);
|
||||
#endif
|
||||
#if HAS_FILAMENT_RUNOUT_DISTANCE
|
||||
ADDMENUITEM_P(ICON_Runout, F("Runout Distance"), onDrawPFloatMenu, SetRunoutDistance, &runout.runout_distance());
|
||||
#endif
|
||||
#if ENABLED(PREVENT_COLD_EXTRUSION)
|
||||
ADDMENUITEM_P(ICON_ExtrudeMinT, F("Extrude Min Temp."), onDrawPIntMenu, SetExtMinT, &HMI_data.ExtMinT);
|
||||
#endif
|
||||
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
||||
ADDMENUITEM_P(ICON_FilLoad, GET_TEXT(MSG_FILAMENT_LOAD), onDrawPFloatMenu, SetFilLoad, &fc_settings[0].load_length);
|
||||
ADDMENUITEM_P(ICON_FilUnload, GET_TEXT(MSG_FILAMENT_UNLOAD), onDrawPFloatMenu, SetFilUnload, &fc_settings[0].unload_length);
|
||||
#endif
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
}
|
||||
@@ -3289,16 +3359,26 @@ void Draw_Tune_Menu() {
|
||||
DWINUI::MenuItemsPrepare(10);
|
||||
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Goto_PrintProcess);
|
||||
ADDMENUITEM_P(ICON_Speed, GET_TEXT(MSG_SPEED), onDrawSpeedItem, SetSpeed, &feedrate_percentage);
|
||||
TERN_(HAS_HOTEND, HotendTargetItem = ADDMENUITEM_P(ICON_HotendTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawHotendTemp, SetHotendTemp, &thermalManager.temp_hotend[0].target));
|
||||
TERN_(HAS_HEATED_BED, BedTargetItem = ADDMENUITEM_P(ICON_BedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawBedTemp, SetBedTemp, &thermalManager.temp_bed.target));
|
||||
TERN_(HAS_FAN, FanSpeedItem = ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawFanSpeed, SetFanSpeed, &thermalManager.fan_speed[0]));
|
||||
#if HAS_HOTEND
|
||||
HotendTargetItem = ADDMENUITEM_P(ICON_HotendTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawHotendTemp, SetHotendTemp, &thermalManager.temp_hotend[0].target);
|
||||
#endif
|
||||
#if HAS_HEATED_BED
|
||||
BedTargetItem = ADDMENUITEM_P(ICON_BedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawBedTemp, SetBedTemp, &thermalManager.temp_bed.target);
|
||||
#endif
|
||||
#if HAS_FAN
|
||||
FanSpeedItem = ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawFanSpeed, SetFanSpeed, &thermalManager.fan_speed[0]);
|
||||
#endif
|
||||
#if HAS_ZOFFSET_ITEM && EITHER(HAS_BED_PROBE, BABYSTEPPING)
|
||||
ADDMENUITEM_P(ICON_Zoffset, GET_TEXT(MSG_ZPROBE_ZOFFSET), onDrawZOffset, SetZOffset, &BABY_Z_VAR);
|
||||
#endif
|
||||
ADDMENUITEM_P(ICON_Flow, GET_TEXT(MSG_FLOW), onDrawPIntMenu, SetFlow, &planner.flow_percentage[0]);
|
||||
TERN_(ADVANCED_PAUSE_FEATURE, ADDMENUITEM(ICON_FilMan, GET_TEXT(MSG_FILAMENTCHANGE), onDrawMenuItem, ChangeFilament));
|
||||
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
||||
ADDMENUITEM(ICON_FilMan, GET_TEXT(MSG_FILAMENTCHANGE), onDrawMenuItem, ChangeFilament);
|
||||
#endif
|
||||
ADDMENUITEM(ICON_Lock, F("Lock Screen"), onDrawMenuItem, Goto_LockScreen);
|
||||
TERN_(HAS_LCD_BRIGHTNESS, ADDMENUITEM_P(ICON_Brightness, F("LCD Brightness"), onDrawPInt8Menu, SetBrightness, &ui.brightness));
|
||||
#if HAS_LCD_BRIGHTNESS
|
||||
ADDMENUITEM_P(ICON_Brightness, F("LCD Brightness"), onDrawPInt8Menu, SetBrightness, &ui.brightness);
|
||||
#endif
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
}
|
||||
@@ -3313,7 +3393,9 @@ void Draw_Motion_Menu() {
|
||||
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Draw_Control_Menu);
|
||||
ADDMENUITEM(ICON_MaxSpeed, GET_TEXT(MSG_SPEED), onDrawSpeed, Draw_MaxSpeed_Menu);
|
||||
ADDMENUITEM(ICON_MaxAccelerated, GET_TEXT(MSG_ACCELERATION), onDrawAcc, Draw_MaxAccel_Menu);
|
||||
TERN_(HAS_CLASSIC_JERK, ADDMENUITEM(ICON_MaxJerk, GET_TEXT(MSG_JERK), onDrawJerk, Draw_MaxJerk_Menu));
|
||||
#if HAS_CLASSIC_JERK
|
||||
ADDMENUITEM(ICON_MaxJerk, GET_TEXT(MSG_JERK), onDrawJerk, Draw_MaxJerk_Menu);
|
||||
#endif
|
||||
ADDMENUITEM(ICON_Step, GET_TEXT(MSG_STEPS_PER_MM), onDrawSteps, Draw_Steps_Menu);
|
||||
ADDMENUITEM_P(ICON_Flow, GET_TEXT(MSG_FLOW), onDrawPIntMenu, SetFlow, &planner.flow_percentage[0]);
|
||||
}
|
||||
@@ -3331,8 +3413,10 @@ void Draw_Motion_Menu() {
|
||||
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Draw_Prepare_Menu);
|
||||
ADDMENUITEM(ICON_Park, GET_TEXT(MSG_FILAMENT_PARK_ENABLED), onDrawMenuItem, ParkHead);
|
||||
ADDMENUITEM(ICON_FilMan, GET_TEXT(MSG_FILAMENTCHANGE), onDrawMenuItem, ChangeFilament);
|
||||
TERN_(FILAMENT_LOAD_UNLOAD_GCODES, ADDMENUITEM(ICON_FilUnload, GET_TEXT(MSG_FILAMENTUNLOAD), onDrawMenuItem, UnloadFilament));
|
||||
TERN_(FILAMENT_LOAD_UNLOAD_GCODES, ADDMENUITEM(ICON_FilLoad, GET_TEXT(MSG_FILAMENTLOAD), onDrawMenuItem, LoadFilament));
|
||||
#if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
|
||||
ADDMENUITEM(ICON_FilUnload, GET_TEXT(MSG_FILAMENTUNLOAD), onDrawMenuItem, UnloadFilament);
|
||||
ADDMENUITEM(ICON_FilLoad, GET_TEXT(MSG_FILAMENTLOAD), onDrawMenuItem, LoadFilament);
|
||||
#endif
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
}
|
||||
@@ -3364,10 +3448,18 @@ void Draw_Motion_Menu() {
|
||||
SetMenuTitle(cn, en, text);
|
||||
DWINUI::MenuItemsPrepare(5);
|
||||
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Draw_Temperature_Menu);
|
||||
TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_SetEndTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawSetPreheatHotend, SetPreheatEndTemp, &ui.material_preset[HMI_value.Preheat].hotend_temp));
|
||||
TERN_(HAS_HEATED_BED, ADDMENUITEM_P(ICON_SetBedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawSetPreheatBed, SetPreheatBedTemp, &ui.material_preset[HMI_value.Preheat].bed_temp));
|
||||
TERN_(HAS_FAN, ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawSetPreheatFan, SetPreheatFanSpeed, &ui.material_preset[HMI_value.Preheat].fan_speed));
|
||||
TERN_(EEPROM_SETTINGS, ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawWriteEeprom, WriteEeprom));
|
||||
#if HAS_HOTEND
|
||||
ADDMENUITEM_P(ICON_SetEndTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawSetPreheatHotend, SetPreheatEndTemp, &ui.material_preset[HMI_value.Preheat].hotend_temp);
|
||||
#endif
|
||||
#if HAS_HEATED_BED
|
||||
ADDMENUITEM_P(ICON_SetBedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawSetPreheatBed, SetPreheatBedTemp, &ui.material_preset[HMI_value.Preheat].bed_temp);
|
||||
#endif
|
||||
#if HAS_FAN
|
||||
ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawSetPreheatFan, SetPreheatFanSpeed, &ui.material_preset[HMI_value.Preheat].fan_speed);
|
||||
#endif
|
||||
#if ENABLED(EEPROM_SETTINGS)
|
||||
ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawWriteEeprom, WriteEeprom);
|
||||
#endif
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
}
|
||||
@@ -3403,9 +3495,15 @@ void Draw_Temperature_Menu() {
|
||||
SetMenuTitle({236, 2, 28, 12}, {56, 15, 85, 14}, GET_TEXT_F(MSG_TEMPERATURE));
|
||||
DWINUI::MenuItemsPrepare(7);
|
||||
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Draw_Control_Menu);
|
||||
TERN_(HAS_HOTEND, HotendTargetItem = ADDMENUITEM_P(ICON_SetEndTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawHotendTemp, SetHotendTemp, &thermalManager.temp_hotend[0].target));
|
||||
TERN_(HAS_HEATED_BED, BedTargetItem = ADDMENUITEM_P(ICON_SetBedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawBedTemp, SetBedTemp, &thermalManager.temp_bed.target));
|
||||
TERN_(HAS_FAN, FanSpeedItem = ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawFanSpeed, SetFanSpeed, &thermalManager.fan_speed[0]));
|
||||
#if HAS_HOTEND
|
||||
HotendTargetItem = ADDMENUITEM_P(ICON_SetEndTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawHotendTemp, SetHotendTemp, &thermalManager.temp_hotend[0].target);
|
||||
#endif
|
||||
#if HAS_HEATED_BED
|
||||
BedTargetItem = ADDMENUITEM_P(ICON_SetBedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawBedTemp, SetBedTemp, &thermalManager.temp_bed.target);
|
||||
#endif
|
||||
#if HAS_FAN
|
||||
FanSpeedItem = ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawFanSpeed, SetFanSpeed, &thermalManager.fan_speed[0]);
|
||||
#endif
|
||||
#if HAS_HOTEND
|
||||
ADDMENUITEM(ICON_SetPLAPreheat, F(PREHEAT_1_LABEL " Preheat Settings"), onDrawPLAPreheatSubMenu, Draw_Preheat1_Menu);
|
||||
ADDMENUITEM(ICON_SetABSPreheat, F(PREHEAT_2_LABEL " Preheat Settings"), onDrawABSPreheatSubMenu, Draw_Preheat2_Menu);
|
||||
@@ -3428,7 +3526,9 @@ void Draw_MaxSpeed_Menu() {
|
||||
ADDMENUITEM_P(ICON_MaxSpeedX, GET_TEXT(MSG_MAXSPEED_X), onDrawMaxSpeedX, SetMaxSpeedX, &planner.settings.max_feedrate_mm_s[X_AXIS]);
|
||||
ADDMENUITEM_P(ICON_MaxSpeedY, GET_TEXT(MSG_MAXSPEED_Y), onDrawMaxSpeedY, SetMaxSpeedY, &planner.settings.max_feedrate_mm_s[Y_AXIS]);
|
||||
ADDMENUITEM_P(ICON_MaxSpeedZ, GET_TEXT(MSG_MAXSPEED_Z), onDrawMaxSpeedZ, SetMaxSpeedZ, &planner.settings.max_feedrate_mm_s[Z_AXIS]);
|
||||
TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_MaxSpeedE, GET_TEXT(MSG_MAXSPEED_E), onDrawMaxSpeedE, SetMaxSpeedE, &planner.settings.max_feedrate_mm_s[Z_AXIS]));
|
||||
#if HAS_HOTEND
|
||||
ADDMENUITEM_P(ICON_MaxSpeedE, GET_TEXT(MSG_MAXSPEED_E), onDrawMaxSpeedE, SetMaxSpeedE, &planner.settings.max_feedrate_mm_s[Z_AXIS]);
|
||||
#endif
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
}
|
||||
@@ -3444,7 +3544,9 @@ void Draw_MaxAccel_Menu() {
|
||||
ADDMENUITEM_P(ICON_MaxAccX, GET_TEXT(MSG_AMAX_A), onDrawMaxAccelX, SetMaxAccelX, &planner.settings.max_acceleration_mm_per_s2[X_AXIS]);
|
||||
ADDMENUITEM_P(ICON_MaxAccY, GET_TEXT(MSG_AMAX_B), onDrawMaxAccelY, SetMaxAccelY, &planner.settings.max_acceleration_mm_per_s2[Y_AXIS]);
|
||||
ADDMENUITEM_P(ICON_MaxAccZ, GET_TEXT(MSG_AMAX_C), onDrawMaxAccelZ, SetMaxAccelZ, &planner.settings.max_acceleration_mm_per_s2[Z_AXIS]);
|
||||
TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_MaxAccE, GET_TEXT(MSG_AMAX_E), onDrawMaxAccelE, SetMaxAccelE, &planner.settings.max_acceleration_mm_per_s2[E_AXIS]));
|
||||
#if HAS_HOTEND
|
||||
ADDMENUITEM_P(ICON_MaxAccE, GET_TEXT(MSG_AMAX_E), onDrawMaxAccelE, SetMaxAccelE, &planner.settings.max_acceleration_mm_per_s2[E_AXIS]);
|
||||
#endif
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
}
|
||||
@@ -3461,7 +3563,9 @@ void Draw_MaxAccel_Menu() {
|
||||
ADDMENUITEM_P(ICON_MaxSpeedJerkX, GET_TEXT(MSG_VA_JERK), onDrawMaxJerkX, SetMaxJerkX, &planner.max_jerk[X_AXIS]);
|
||||
ADDMENUITEM_P(ICON_MaxSpeedJerkY, GET_TEXT(MSG_VB_JERK), onDrawMaxJerkY, SetMaxJerkY, &planner.max_jerk[Y_AXIS]);
|
||||
ADDMENUITEM_P(ICON_MaxSpeedJerkZ, GET_TEXT(MSG_VC_JERK), onDrawMaxJerkZ, SetMaxJerkZ, &planner.max_jerk[Z_AXIS]);
|
||||
TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_MaxSpeedJerkE, GET_TEXT(MSG_VE_JERK), onDrawMaxJerkE, SetMaxJerkE, &planner.max_jerk[E_AXIS]));
|
||||
#if HAS_HOTEND
|
||||
ADDMENUITEM_P(ICON_MaxSpeedJerkE, GET_TEXT(MSG_VE_JERK), onDrawMaxJerkE, SetMaxJerkE, &planner.max_jerk[E_AXIS]);
|
||||
#endif
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
}
|
||||
@@ -3478,7 +3582,9 @@ void Draw_Steps_Menu() {
|
||||
ADDMENUITEM_P(ICON_StepX, GET_TEXT(MSG_A_STEPS), onDrawStepsX, SetStepsX, &planner.settings.axis_steps_per_mm[X_AXIS]);
|
||||
ADDMENUITEM_P(ICON_StepY, GET_TEXT(MSG_B_STEPS), onDrawStepsY, SetStepsY, &planner.settings.axis_steps_per_mm[Y_AXIS]);
|
||||
ADDMENUITEM_P(ICON_StepZ, GET_TEXT(MSG_C_STEPS), onDrawStepsZ, SetStepsZ, &planner.settings.axis_steps_per_mm[Z_AXIS]);
|
||||
TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_StepE, GET_TEXT(MSG_E_STEPS), onDrawStepsE, SetStepsE, &planner.settings.axis_steps_per_mm[E_AXIS]));
|
||||
#if HAS_HOTEND
|
||||
ADDMENUITEM_P(ICON_StepE, GET_TEXT(MSG_E_STEPS), onDrawStepsE, SetStepsE, &planner.settings.axis_steps_per_mm[E_AXIS]);
|
||||
#endif
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
}
|
||||
@@ -3498,7 +3604,9 @@ void Draw_Steps_Menu() {
|
||||
ADDMENUITEM_P(ICON_PIDValue, F("Set" STR_KD), onDrawPIDd, SetKd, &thermalManager.temp_hotend[0].pid.Kd);
|
||||
ADDMENUITEM_P(ICON_Temperature, GET_TEXT(MSG_TEMPERATURE), onDrawPIntMenu, SetHotendPidT, &HMI_data.HotendPidT);
|
||||
ADDMENUITEM_P(ICON_PIDcycles, GET_TEXT(MSG_PID_CYCLE), onDrawPIntMenu, SetPidCycles, &HMI_data.PidCycles);
|
||||
TERN_(EEPROM_SETTINGS, ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawMenuItem, WriteEeprom));
|
||||
#if ENABLED(EEPROM_SETTINGS)
|
||||
ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawMenuItem, WriteEeprom);
|
||||
#endif
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
}
|
||||
@@ -3519,7 +3627,9 @@ void Draw_Steps_Menu() {
|
||||
ADDMENUITEM_P(ICON_PIDValue, F("Set" STR_KD), onDrawPIDd, SetKd, &thermalManager.temp_bed.pid.Kd);
|
||||
ADDMENUITEM_P(ICON_Temperature, GET_TEXT(MSG_TEMPERATURE), onDrawPIntMenu, SetBedPidT, &HMI_data.BedPidT);
|
||||
ADDMENUITEM_P(ICON_PIDcycles, GET_TEXT(MSG_PID_CYCLE), onDrawPIntMenu, SetPidCycles, &HMI_data.PidCycles);
|
||||
TERN_(EEPROM_SETTINGS, ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawMenuItem, WriteEeprom));
|
||||
#if ENABLED(EEPROM_SETTINGS)
|
||||
ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawMenuItem, WriteEeprom);
|
||||
#endif
|
||||
}
|
||||
CurrentMenu->Draw();
|
||||
}
|
||||
|
||||
@@ -196,7 +196,9 @@ void DWIN_StatusChanged(const char * const text);
|
||||
void DWIN_StatusChanged_P(PGM_P const text);
|
||||
void DWIN_StartHoming();
|
||||
void DWIN_CompletedHoming();
|
||||
TERN_(MESH_BED_LEVELING, void DWIN_MeshUpdate(const int8_t xpos, const int8_t ypos, const float zval));
|
||||
#if HAS_MESH
|
||||
void DWIN_MeshUpdate(const int8_t xpos, const int8_t ypos, const float zval);
|
||||
#endif
|
||||
void DWIN_MeshLevelingStart();
|
||||
void DWIN_CompletedLeveling();
|
||||
void DWIN_PidTuning(pidresult_t result);
|
||||
|
||||
@@ -145,7 +145,9 @@ ENCODER_DiffState Encoder_ReceiveAnalyze() {
|
||||
const float encoderStepRate = encoderMovementSteps / float(ms - EncoderRate.lastEncoderTime) * 1000;
|
||||
if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100;
|
||||
else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10;
|
||||
else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
|
||||
#if ENCODER_5X_STEPS_PER_SEC
|
||||
else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
|
||||
#endif
|
||||
}
|
||||
EncoderRate.lastEncoderTime = ms;
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include "../../marlinui.h"
|
||||
#include "../../../MarlinCore.h"
|
||||
|
||||
#include "../../../gcode/gcode.h"
|
||||
#include "../../../module/temperature.h"
|
||||
#include "../../../module/planner.h"
|
||||
#include "../../../module/settings.h"
|
||||
@@ -180,6 +181,7 @@ bool probe_deployed = false;
|
||||
CrealityDWINClass CrealityDWIN;
|
||||
|
||||
#if HAS_MESH
|
||||
|
||||
struct Mesh_Settings {
|
||||
bool viewer_asymmetric_range = false;
|
||||
bool viewer_print_value = false;
|
||||
@@ -305,16 +307,16 @@ CrealityDWINClass CrealityDWIN;
|
||||
const uint16_t total_width_px = DWIN_WIDTH - padding_x - padding_x;
|
||||
const uint16_t cell_width_px = total_width_px / GRID_MAX_POINTS_X;
|
||||
const uint16_t cell_height_px = total_width_px / GRID_MAX_POINTS_Y;
|
||||
const float v_max = abs(get_max_value()), v_min = abs(get_min_value()), range = max(v_min, v_max);
|
||||
const float v_max = abs(get_max_value()), v_min = abs(get_min_value()), range = _MAX(v_min, v_max);
|
||||
|
||||
// Clear background from previous selection and select new square
|
||||
DWIN_Draw_Rectangle(1, Color_Bg_Black, max(0, padding_x - gridline_width), max(0, padding_y_top - gridline_width), padding_x + total_width_px, padding_y_top + total_width_px);
|
||||
DWIN_Draw_Rectangle(1, Color_Bg_Black, _MAX(0, padding_x - gridline_width), _MAX(0, padding_y_top - gridline_width), padding_x + total_width_px, padding_y_top + total_width_px);
|
||||
if (selected >= 0) {
|
||||
const auto selected_y = selected / GRID_MAX_POINTS_X;
|
||||
const auto selected_x = selected - (GRID_MAX_POINTS_X * selected_y);
|
||||
const auto start_y_px = padding_y_top + selected_y * cell_height_px;
|
||||
const auto start_x_px = padding_x + selected_x * cell_width_px;
|
||||
DWIN_Draw_Rectangle(1, Color_White, max(0, start_x_px - gridline_width), max(0, start_y_px - gridline_width), start_x_px + cell_width_px, start_y_px + cell_height_px);
|
||||
DWIN_Draw_Rectangle(1, Color_White, _MAX(0, start_x_px - gridline_width), _MAX(0, start_y_px - gridline_width), start_x_px + cell_width_px, start_y_px + cell_height_px);
|
||||
}
|
||||
|
||||
// Draw value square grid
|
||||
@@ -324,21 +326,20 @@ CrealityDWINClass CrealityDWIN;
|
||||
const auto end_x_px = start_x_px + cell_width_px - 1 - gridline_width;
|
||||
const auto start_y_px = padding_y_top + (GRID_MAX_POINTS_Y - y - 1) * cell_height_px;
|
||||
const auto end_y_px = start_y_px + cell_height_px - 1 - gridline_width;
|
||||
DWIN_Draw_Rectangle(1, // RGB565 colors: http://www.barth-dev.de/online/rgb565-color-picker/
|
||||
isnan(mesh_z_values[x][y]) ? Color_Grey : ( // gray if undefined
|
||||
DWIN_Draw_Rectangle(1, // RGB565 colors: http://www.barth-dev.de/online/rgb565-color-picker/
|
||||
isnan(mesh_z_values[x][y]) ? Color_Grey : ( // gray if undefined
|
||||
(mesh_z_values[x][y] < 0 ?
|
||||
(uint16_t)round(0b11111 * -mesh_z_values[x][y] / (!viewer_asymmetric_range ? range : v_min)) << 11 : // red if mesh point value is negative
|
||||
(uint16_t)round(0b111111 * mesh_z_values[x][y] / (!viewer_asymmetric_range ? range : v_max)) << 5) | // green if mesh point value is positive
|
||||
min(0b11111, (((uint8_t)abs(mesh_z_values[x][y]) / 10) * 4))), // + blue stepping for every mm
|
||||
start_x_px, start_y_px, end_x_px, end_y_px);
|
||||
while (LCD_SERIAL.availableForWrite() < 32) { // wait for serial to be available without blocking and resetting the MCU
|
||||
gcode.process_subcommands_now_P("G4 P10");
|
||||
planner.synchronize();
|
||||
}
|
||||
(uint16_t)round(0x1F * -mesh_z_values[x][y] / (!viewer_asymmetric_range ? range : v_min)) << 11 : // red if mesh point value is negative
|
||||
(uint16_t)round(0x3F * mesh_z_values[x][y] / (!viewer_asymmetric_range ? range : v_max)) << 5) | // green if mesh point value is positive
|
||||
_MIN(0x1F, (((uint8_t)abs(mesh_z_values[x][y]) / 10) * 4))), // + blue stepping for every mm
|
||||
start_x_px, start_y_px, end_x_px, end_y_px
|
||||
);
|
||||
|
||||
safe_delay(10);
|
||||
LCD_SERIAL.flushTX();
|
||||
|
||||
// Draw value text on
|
||||
if (viewer_print_value) {
|
||||
gcode.process_subcommands_now_P("G4 P10"); // still fails without additional delay...
|
||||
planner.synchronize();
|
||||
int8_t offset_x, offset_y = cell_height_px / 2 - 6;
|
||||
if (isnan(mesh_z_values[x][y])) { // undefined
|
||||
DWIN_Draw_String(false, false, font6x12, Color_White, Color_Bg_Blue, start_x_px + cell_width_px / 2 - 5, start_y_px + offset_y, F("X"));
|
||||
@@ -353,16 +354,18 @@ CrealityDWINClass CrealityDWIN;
|
||||
DWIN_Draw_String(false, false, font6x12, Color_White, Color_Bg_Blue, start_x_px - 2 + offset_x, start_y_px + offset_y /*+ square / 2 - 6*/, F("."));
|
||||
DWIN_Draw_String(false, false, font6x12, Color_White, Color_Bg_Blue, start_x_px + 1 + offset_x, start_y_px + offset_y /*+ square / 2 - 6*/, buf);
|
||||
}
|
||||
safe_delay(10);
|
||||
LCD_SERIAL.flushTX();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Set_Mesh_Viewer_Status() { // TODO: draw gradient with values as a legend instead
|
||||
float v_max = abs(get_max_value()), v_min = abs(get_min_value()), range = max(v_min, v_max);
|
||||
float v_max = abs(get_max_value()), v_min = abs(get_min_value()), range = _MAX(v_min, v_max);
|
||||
if (v_min > 3e+10F) v_min = 0.0000001;
|
||||
if (v_max > 3e+10F) v_max = 0.0000001;
|
||||
if (range > 3e+10F) range = 0.0000001;
|
||||
char msg[32];
|
||||
char msg[46];
|
||||
if (viewer_asymmetric_range) {
|
||||
dtostrf(-v_min, 1, 3, str_1);
|
||||
dtostrf( v_max, 1, 3, str_2);
|
||||
@@ -378,7 +381,8 @@ CrealityDWINClass CrealityDWIN;
|
||||
|
||||
};
|
||||
Mesh_Settings mesh_conf;
|
||||
#endif
|
||||
|
||||
#endif // HAS_MESH
|
||||
|
||||
/* General Display Functions */
|
||||
|
||||
@@ -467,8 +471,8 @@ void CrealityDWINClass::Draw_Title(const char * title) {
|
||||
|
||||
void CrealityDWINClass::Draw_Menu_Item(uint8_t row, uint8_t icon/*=0*/, const char * label1, const char * label2, bool more/*=false*/, bool centered/*=false*/) {
|
||||
const uint8_t label_offset_y = !(label1 && label2) ? 0 : MENU_CHR_H * 3 / 5;
|
||||
const uint8_t label1_offset_x = !centered ? LBLX : LBLX * 4/5 + max(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (label1 ? strlen(label1) : 0) * MENU_CHR_W) / 2);
|
||||
const uint8_t label2_offset_x = !centered ? LBLX : LBLX * 4/5 + max(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (label2 ? strlen(label2) : 0) * MENU_CHR_W) / 2);
|
||||
const uint8_t label1_offset_x = !centered ? LBLX : LBLX * 4/5 + _MAX(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (label1 ? strlen(label1) : 0) * MENU_CHR_W) / 2);
|
||||
const uint8_t label2_offset_x = !centered ? LBLX : LBLX * 4/5 + _MAX(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (label2 ? strlen(label2) : 0) * MENU_CHR_W) / 2);
|
||||
if (label1) DWIN_Draw_String(false, false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label1_offset_x, MBASE(row) - 1 - label_offset_y, label1); // Draw Label
|
||||
if (label2) DWIN_Draw_String(false, false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label2_offset_x, MBASE(row) - 1 + label_offset_y, label2); // Draw Label
|
||||
if (icon) DWIN_ICON_Show(ICON, icon, 26, MBASE(row) - 3); //Draw Menu Icon
|
||||
@@ -498,7 +502,7 @@ void CrealityDWINClass::Draw_Menu(uint8_t menu, uint8_t select/*=0*/, uint8_t sc
|
||||
last_menu = active_menu;
|
||||
if (process == Menu) last_selection = selection;
|
||||
}
|
||||
selection = min(select, Get_Menu_Size(menu));
|
||||
selection = _MIN(select, Get_Menu_Size(menu));
|
||||
scrollpos = scroll;
|
||||
if (selection - scrollpos > MROWS)
|
||||
scrollpos = selection - MROWS;
|
||||
@@ -4754,11 +4758,13 @@ void CrealityDWINClass::Start_Print(bool sd) {
|
||||
printing = true;
|
||||
statusmsg[0] = '\0';
|
||||
if (sd) {
|
||||
if (recovery.valid()) {
|
||||
SdFile *diveDir = nullptr;
|
||||
const char * const fname = card.diveToFile(true, diveDir, recovery.info.sd_filename);
|
||||
card.selectFileByName(fname);
|
||||
}
|
||||
#if ENABLED(POWER_LOSS_RECOVERY)
|
||||
if (recovery.valid()) {
|
||||
SdFile *diveDir = nullptr;
|
||||
const char * const fname = card.diveToFile(true, diveDir, recovery.info.sd_filename);
|
||||
card.selectFileByName(fname);
|
||||
}
|
||||
#endif
|
||||
strcpy_P(filename, card.longest_filename());
|
||||
}
|
||||
else
|
||||
@@ -4798,7 +4804,7 @@ void MarlinUI::update() { CrealityDWIN.Update(); }
|
||||
|
||||
void CrealityDWINClass::State_Update() {
|
||||
if ((print_job_timer.isRunning() || print_job_timer.isPaused()) != printing) {
|
||||
if (!printing) Start_Print((card.isFileOpen() || recovery.valid()));
|
||||
if (!printing) Start_Print(card.isFileOpen() || TERN0(POWER_LOSS_RECOVERY, recovery.valid()));
|
||||
else Stop_Print();
|
||||
}
|
||||
if (print_job_timer.isPaused() != paused) {
|
||||
@@ -4970,11 +4976,11 @@ void CrealityDWINClass::AudioFeedback(const bool success/*=true*/) {
|
||||
void CrealityDWINClass::Save_Settings(char *buff) {
|
||||
TERN_(AUTO_BED_LEVELING_UBL, eeprom_settings.tilt_grid_size = mesh_conf.tilt_grid - 1);
|
||||
eeprom_settings.corner_pos = corner_pos * 10;
|
||||
memcpy(buff, &eeprom_settings, min(sizeof(eeprom_settings), eeprom_data_size));
|
||||
memcpy(buff, &eeprom_settings, _MIN(sizeof(eeprom_settings), eeprom_data_size));
|
||||
}
|
||||
|
||||
void CrealityDWINClass::Load_Settings(const char *buff) {
|
||||
memcpy(&eeprom_settings, buff, min(sizeof(eeprom_settings), eeprom_data_size));
|
||||
memcpy(&eeprom_settings, buff, _MIN(sizeof(eeprom_settings), eeprom_data_size));
|
||||
TERN_(AUTO_BED_LEVELING_UBL, mesh_conf.tilt_grid = eeprom_settings.tilt_grid_size + 1);
|
||||
if (eeprom_settings.corner_pos == 0) eeprom_settings.corner_pos = 325;
|
||||
corner_pos = eeprom_settings.corner_pos / 10.0f;
|
||||
|
||||
@@ -92,7 +92,7 @@ bool DWIN_Handshake(void) {
|
||||
#endif
|
||||
LCD_SERIAL.begin(LCD_BAUDRATE);
|
||||
const millis_t serial_connect_timeout = millis() + 1000UL;
|
||||
while (!LCD_SERIAL && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
|
||||
while (!LCD_SERIAL.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
|
||||
|
||||
size_t i = 0;
|
||||
DWIN_Byte(i, 0x00);
|
||||
|
||||
@@ -145,7 +145,9 @@ ENCODER_DiffState Encoder_ReceiveAnalyze() {
|
||||
const float encoderStepRate = encoderMovementSteps / float(ms - EncoderRate.lastEncoderTime) * 1000;
|
||||
if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100;
|
||||
else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10;
|
||||
else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
|
||||
#if ENCODER_5X_STEPS_PER_SEC
|
||||
else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
|
||||
#endif
|
||||
}
|
||||
EncoderRate.lastEncoderTime = ms;
|
||||
}
|
||||
|
||||
@@ -63,13 +63,13 @@ void DGUSRxHandler::ScreenChange(DGUS_VP &vp, void *data_ptr) {
|
||||
}
|
||||
|
||||
if (vp.addr == DGUS_Addr::SCREENCHANGE_Idle
|
||||
&& (printingIsActive() || printingIsPaused())) {
|
||||
&& (ExtUI::isPrinting() || ExtUI::isPrintingPaused())) {
|
||||
dgus_screen_handler.SetStatusMessagePGM(PSTR("Impossible while printing"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (vp.addr == DGUS_Addr::SCREENCHANGE_Printing
|
||||
&& (!printingIsActive() && !printingIsPaused())) {
|
||||
&& (!ExtUI::isPrinting() && !ExtUI::isPrintingPaused())) {
|
||||
dgus_screen_handler.SetStatusMessagePGM(PSTR("Impossible while idle"));
|
||||
return;
|
||||
}
|
||||
@@ -166,7 +166,7 @@ void DGUSRxHandler::PrintAbort(DGUS_VP &vp, void *data_ptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!printingIsActive() && !printingIsPaused()) {
|
||||
if (!ExtUI::isPrinting() && !ExtUI::isPrintingPaused()) {
|
||||
dgus_screen_handler.TriggerFullUpdate();
|
||||
return;
|
||||
}
|
||||
@@ -183,7 +183,7 @@ void DGUSRxHandler::PrintPause(DGUS_VP &vp, void *data_ptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!printingIsActive()) {
|
||||
if (!ExtUI::isPrinting()) {
|
||||
dgus_screen_handler.TriggerFullUpdate();
|
||||
return;
|
||||
}
|
||||
@@ -200,7 +200,7 @@ void DGUSRxHandler::PrintResume(DGUS_VP &vp, void *data_ptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!printingIsPaused()) {
|
||||
if (!ExtUI::isPrintingPaused()) {
|
||||
dgus_screen_handler.TriggerFullUpdate();
|
||||
return;
|
||||
}
|
||||
@@ -984,20 +984,11 @@ void DGUSRxHandler::WaitAbort(DGUS_VP &vp, void *data_ptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!printingIsPaused()
|
||||
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
||||
|| !did_pause_print
|
||||
#endif
|
||||
) {
|
||||
if (!ExtUI::isPrintingPaused()) {
|
||||
dgus_screen_handler.TriggerFullUpdate();
|
||||
return;
|
||||
}
|
||||
|
||||
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
||||
did_pause_print = 0;
|
||||
#endif
|
||||
|
||||
ExtUI::setUserConfirmed();
|
||||
ExtUI::stopPrint();
|
||||
|
||||
dgus_screen_handler.TriggerFullUpdate();
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
#endif
|
||||
|
||||
bool DGUSSetupHandler::PrintStatus() {
|
||||
if (printingIsActive() || printingIsPaused()) {
|
||||
if (ExtUI::isPrinting() || ExtUI::isPrintingPaused()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ bool DGUSSetupHandler::PrintStatus() {
|
||||
}
|
||||
|
||||
bool DGUSSetupHandler::PrintAdjust() {
|
||||
if (printingIsActive() || printingIsPaused()) {
|
||||
if (ExtUI::isPrinting() || ExtUI::isPrintingPaused()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -214,7 +214,7 @@ void DGUSTxHandler::Percent(DGUS_VP &vp) {
|
||||
void DGUSTxHandler::StatusIcons(DGUS_VP &vp) {
|
||||
uint16_t icons = 0;
|
||||
|
||||
if (printingIsActive()) {
|
||||
if (ExtUI::isPrinting()) {
|
||||
icons |= (uint16_t)DGUS_Data::StatusIcon::PAUSE;
|
||||
|
||||
dgus_display.EnableControl(DGUS_Screen::PRINT_STATUS,
|
||||
@@ -227,7 +227,7 @@ void DGUSTxHandler::StatusIcons(DGUS_VP &vp) {
|
||||
DGUS_Control::PAUSE);
|
||||
}
|
||||
|
||||
if (printingIsPaused()) {
|
||||
if (ExtUI::isPrintingPaused()) {
|
||||
icons |= (uint16_t)DGUS_Data::StatusIcon::RESUME;
|
||||
|
||||
dgus_display.EnableControl(DGUS_Screen::PRINT_STATUS,
|
||||
@@ -561,11 +561,7 @@ void DGUSTxHandler::FilamentUsed(DGUS_VP &vp) {
|
||||
void DGUSTxHandler::WaitIcons(DGUS_VP &vp) {
|
||||
uint16_t icons = 0;
|
||||
|
||||
if (printingIsPaused()
|
||||
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
||||
&& did_pause_print
|
||||
#endif
|
||||
) {
|
||||
if (ExtUI::isPrintingPaused()) {
|
||||
icons |= (uint16_t)DGUS_Data::WaitIcon::ABORT;
|
||||
|
||||
dgus_display.EnableControl(DGUS_Screen::WAIT,
|
||||
|
||||
@@ -296,3 +296,7 @@
|
||||
#endif
|
||||
|
||||
#endif // !__MARLIN_FIRMWARE__
|
||||
|
||||
#ifndef SD_SPI_SPEED
|
||||
#define SD_SPI_SPEED SPI_FULL_SPEED
|
||||
#endif
|
||||
|
||||
@@ -34,7 +34,6 @@ namespace FTDI {
|
||||
#define CHAR_WIDTH(c) use_utf8 ? utf8_fm.get_char_width(c) : clcd_fm.char_widths[(uint8_t)c]
|
||||
#else
|
||||
#define CHAR_WIDTH(c) utf8_fm.get_char_width(c)
|
||||
constexpr bool use_utf8 = false;
|
||||
#endif
|
||||
FontMetrics utf8_fm(font);
|
||||
CLCD::FontMetrics clcd_fm;
|
||||
@@ -46,12 +45,12 @@ namespace FTDI {
|
||||
// split and still allow the ellipsis to fit.
|
||||
int16_t lineWidth = 0;
|
||||
char *breakPoint = str;
|
||||
char *next = str;
|
||||
const char *next = str;
|
||||
while (*next) {
|
||||
const utf8_char_t c = get_utf8_char_and_inc(next);
|
||||
lineWidth += CHAR_WIDTH(c);
|
||||
if (lineWidth + ellipsisWidth < w)
|
||||
breakPoint = next;
|
||||
breakPoint = (char*)next;
|
||||
}
|
||||
|
||||
if (lineWidth > w) {
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
* character (this is not the unicode codepoint)
|
||||
*/
|
||||
|
||||
utf8_char_t FTDI::get_utf8_char_and_inc(const char *&c) {
|
||||
utf8_char_t FTDI::get_utf8_char_and_inc(char *&c) {
|
||||
utf8_char_t val = *(uint8_t*)c++;
|
||||
if ((val & 0xC0) == 0xC0)
|
||||
while ((*c & 0xC0) == 0x80)
|
||||
|
||||
@@ -51,14 +51,14 @@ namespace FTDI {
|
||||
|
||||
/* Returns the next character in a UTF8 string, without incrementing */
|
||||
|
||||
inline utf8_char_t get_utf8_char(const char *c) {return get_utf8_char_and_inc(c);}
|
||||
inline utf8_char_t get_utf8_char(const char *c) { return get_utf8_char_and_inc(c); }
|
||||
|
||||
void load_utf8_data(uint32_t addr);
|
||||
#else
|
||||
typedef char utf8_char_t;
|
||||
|
||||
inline utf8_char_t get_utf8_char_and_inc(const char *&c) {return *c++;}
|
||||
inline utf8_char_t get_utf8_char(const char *c) {return *c;}
|
||||
inline utf8_char_t get_utf8_char_and_inc(const char *&c) { return *c++; }
|
||||
inline utf8_char_t get_utf8_char(const char *c) { return *c; }
|
||||
|
||||
inline void load_utf8_data(uint32_t) {}
|
||||
#endif
|
||||
|
||||
@@ -33,7 +33,7 @@ using namespace ExtUI;
|
||||
constexpr static ConfirmStartPrintDialogBoxData &mydata = screen_data.ConfirmStartPrintDialogBox;
|
||||
|
||||
void ConfirmStartPrintDialogBox::onRedraw(draw_mode_t) {
|
||||
const char *filename = getLongFilename();
|
||||
const char *filename = getFilename();
|
||||
char buffer[strlen_P(GET_TEXT(MSG_START_PRINT_CONFIRMATION)) + strlen(filename) + 1];
|
||||
sprintf_P(buffer, GET_TEXT(MSG_START_PRINT_CONFIRMATION), filename);
|
||||
drawMessage((const char *)buffer);
|
||||
@@ -52,10 +52,10 @@ bool ConfirmStartPrintDialogBox::onTouchEnd(uint8_t tag) {
|
||||
}
|
||||
}
|
||||
|
||||
const char *ConfirmStartPrintDialogBox::getFilename(bool longName) {
|
||||
const char *ConfirmStartPrintDialogBox::getFilename(bool shortName) {
|
||||
FileList files;
|
||||
files.seek(mydata.file_index, true);
|
||||
return longName ? files.longFilename() : files.shortFilename();
|
||||
return shortName ? files.shortFilename() : files.filename();
|
||||
}
|
||||
|
||||
void ConfirmStartPrintDialogBox::show(uint8_t file_index) {
|
||||
|
||||
@@ -31,10 +31,9 @@ struct ConfirmStartPrintDialogBoxData {
|
||||
|
||||
class ConfirmStartPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen {
|
||||
private:
|
||||
inline static const char *getShortFilename() {return getFilename(false);}
|
||||
inline static const char *getLongFilename() {return getFilename(true);}
|
||||
inline static const char *getShortFilename() {return getFilename(true);}
|
||||
|
||||
static const char *getFilename(bool longName);
|
||||
static const char *getFilename(bool shortName = false);
|
||||
public:
|
||||
static void onRedraw(draw_mode_t);
|
||||
static bool onTouchEnd(uint8_t);
|
||||
|
||||
@@ -70,10 +70,10 @@ void FilesScreen::onEntry() {
|
||||
BaseScreen::onEntry();
|
||||
}
|
||||
|
||||
const char *FilesScreen::getSelectedFilename(bool longName) {
|
||||
const char *FilesScreen::getSelectedFilename(bool shortName) {
|
||||
FileList files;
|
||||
files.seek(getSelectedFileIndex(), true);
|
||||
return longName ? files.longFilename() : files.shortFilename();
|
||||
return shortName ? files.shortFilename() : files.filename();
|
||||
}
|
||||
|
||||
void FilesScreen::drawSelectedFile() {
|
||||
@@ -132,13 +132,13 @@ void FilesScreen::drawFileList() {
|
||||
mydata.num_page = max(1,ceil(float(files.count()) / FILES_PER_PAGE));
|
||||
mydata.cur_page = min(mydata.cur_page, mydata.num_page-1);
|
||||
mydata.flags.is_root = files.isAtRootDir();
|
||||
mydata.flags.is_empty = true;
|
||||
|
||||
uint16_t fileIndex = mydata.cur_page * FILES_PER_PAGE;
|
||||
for (uint8_t i = 0; i < FILES_PER_PAGE; i++, fileIndex++) {
|
||||
if (files.seek(fileIndex))
|
||||
drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false);
|
||||
else
|
||||
break;
|
||||
if (!files.seek(fileIndex)) break;
|
||||
drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false);
|
||||
mydata.flags.is_empty = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,11 +252,11 @@ bool FilesScreen::onTouchEnd(uint8_t tag) {
|
||||
mydata.scroll_pos = 0;
|
||||
mydata.scroll_max = 0;
|
||||
if (FTDI::ftdi_chip >= 810) {
|
||||
const char *longFilename = getSelectedLongFilename();
|
||||
if (longFilename[0]) {
|
||||
const char *filename = getSelectedFilename();
|
||||
if (filename[0]) {
|
||||
CommandProcessor cmd;
|
||||
constexpr int dim[4] = {LIST_POS};
|
||||
const uint16_t text_width = cmd.font(font_medium).text_width(longFilename);
|
||||
const uint16_t text_width = cmd.font(font_medium).text_width(filename);
|
||||
if (text_width > dim[2])
|
||||
mydata.scroll_max = text_width - dim[2] + MARGIN_L + MARGIN_R + 10;
|
||||
}
|
||||
|
||||
@@ -27,8 +27,9 @@
|
||||
|
||||
struct FilesScreenData {
|
||||
struct {
|
||||
uint8_t is_dir : 1;
|
||||
uint8_t is_root : 1;
|
||||
uint8_t is_dir : 1;
|
||||
uint8_t is_root : 1;
|
||||
uint8_t is_empty : 1;
|
||||
} flags;
|
||||
uint8_t selected_tag;
|
||||
uint8_t num_page;
|
||||
@@ -46,9 +47,8 @@ class FilesScreen : public BaseScreen, public CachedScreen<FILES_SCREEN_CACHE, F
|
||||
static uint16_t getFileForTag(uint8_t tag);
|
||||
static uint16_t getSelectedFileIndex();
|
||||
|
||||
inline static const char *getSelectedShortFilename() {return getSelectedFilename(false);}
|
||||
inline static const char *getSelectedLongFilename() {return getSelectedFilename(true);}
|
||||
static const char *getSelectedFilename(bool longName);
|
||||
inline static const char *getSelectedShortFilename() {return getSelectedFilename(true);}
|
||||
static const char *getSelectedFilename(bool shortName = false);
|
||||
|
||||
static void drawFileButton(int x, int y, int w, int h, const char *filename, uint8_t tag, bool is_dir, bool is_highlighted);
|
||||
static void drawFileButton(const char *filename, uint8_t tag, bool is_dir, bool is_highlighted);
|
||||
|
||||
@@ -27,8 +27,10 @@
|
||||
|
||||
#define ROUND(val) uint16_t((val)+0.5)
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wno-format"
|
||||
#if GCC_VERSION <= 50000
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wno-format"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Formats a temperature string (e.g. "100°C")
|
||||
@@ -103,6 +105,8 @@ void format_position(char *str, float x, float y, float z) {
|
||||
sprintf_P(str, PSTR("%s; %s; %s " S_FMT), num1, num2, num3, GET_TEXT(MSG_UNITS_MM));
|
||||
}
|
||||
|
||||
#pragma GCC diagnostic pop
|
||||
#if GCC_VERSION <= 50000
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
#endif // TOUCH_UI_FTDI_EVE
|
||||
|
||||
@@ -347,13 +347,8 @@ void tft_style_init() {
|
||||
style_num_key_rel.body.grad_color = LV_COLOR_KEY_BACKGROUND;
|
||||
style_num_key_rel.text.color = LV_COLOR_TEXT;
|
||||
style_num_key_rel.text.sel_color = LV_COLOR_TEXT;
|
||||
#if HAS_SPI_FLASH_FONT
|
||||
style_num_key_pre.text.font = &gb2312_puhui32;
|
||||
style_num_key_rel.text.font = &gb2312_puhui32;
|
||||
#else
|
||||
style_num_key_pre.text.font = LV_FONT_DEFAULT;
|
||||
style_num_key_rel.text.font = LV_FONT_DEFAULT;
|
||||
#endif
|
||||
style_num_key_pre.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
|
||||
style_num_key_rel.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
|
||||
|
||||
style_num_key_pre.line.width = 0;
|
||||
style_num_key_rel.line.width = 0;
|
||||
|
||||
@@ -192,9 +192,7 @@ void tft_lvgl_init() {
|
||||
|
||||
systick_attach_callback(SysTick_Callback);
|
||||
|
||||
#if HAS_SPI_FLASH_FONT
|
||||
init_gb2312_font();
|
||||
#endif
|
||||
TERN_(HAS_SPI_FLASH_FONT, init_gb2312_font());
|
||||
|
||||
tft_style_init();
|
||||
filament_pin_setup();
|
||||
|
||||
@@ -68,10 +68,22 @@ namespace Language_sk {
|
||||
PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Uvolniť motory");
|
||||
PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Ponuka ladenia");
|
||||
PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test uk. priebehu");
|
||||
PROGMEM Language_Str MSG_HOMING = _UxGT("Parkovanie");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Domovská pozícia");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Domov os X");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Domov os Y");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Domov os Z");
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_I = _UxGT("Domov os ") LCD_STR_I;
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_J = _UxGT("Domov os ") LCD_STR_J;
|
||||
PROGMEM Language_Str MSG_AUTO_HOME_K = _UxGT("Domov os ") LCD_STR_K;
|
||||
PROGMEM Language_Str MSG_FILAMENT_SET = _UxGT("Nastav. filamentu");
|
||||
PROGMEM Language_Str MSG_FILAMENT_MAN = _UxGT("Správa filamentu");
|
||||
PROGMEM Language_Str MSG_LEVBED_FL = _UxGT("Ľavý predný");
|
||||
PROGMEM Language_Str MSG_LEVBED_FR = _UxGT("Pravý predný");
|
||||
PROGMEM Language_Str MSG_LEVBED_C = _UxGT("Stred");
|
||||
PROGMEM Language_Str MSG_LEVBED_BL = _UxGT("Ľavý zadný");
|
||||
PROGMEM Language_Str MSG_LEVBED_BR = _UxGT("Pravý zadný");
|
||||
PROGMEM Language_Str MSG_MANUAL_MESH = _UxGT("Ručná mriežka");
|
||||
PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto-zarovn. Z");
|
||||
PROGMEM Language_Str MSG_ITERATION = _UxGT("Iterácia G34: %i");
|
||||
PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Klesajúca presnosť!");
|
||||
@@ -85,6 +97,9 @@ namespace Language_sk {
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_X = _UxGT("X Ofset");
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_Y = _UxGT("Y Ofset");
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_Z = _UxGT("Z Ofset");
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_I = LCD_STR_I _UxGT(" Ofset");
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_J = LCD_STR_J _UxGT(" Ofset");
|
||||
PROGMEM Language_Str MSG_HOME_OFFSET_K = LCD_STR_K _UxGT(" Ofset");
|
||||
PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofsety nastavené");
|
||||
PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Nastaviť začiatok");
|
||||
PROGMEM Language_Str MSG_TRAMMING_WIZARD = _UxGT("Spriev. vyrovn.");
|
||||
@@ -264,6 +279,9 @@ namespace Language_sk {
|
||||
PROGMEM Language_Str MSG_MOVE_X = _UxGT("Posunúť X");
|
||||
PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Posunúť Y");
|
||||
PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Posunúť Z");
|
||||
PROGMEM Language_Str MSG_MOVE_I = _UxGT("Posunúť ") LCD_STR_I;
|
||||
PROGMEM Language_Str MSG_MOVE_J = _UxGT("Posunúť ") LCD_STR_J;
|
||||
PROGMEM Language_Str MSG_MOVE_K = _UxGT("Posunúť ") LCD_STR_K;
|
||||
PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudér");
|
||||
PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrudér *");
|
||||
PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend je studený");
|
||||
@@ -275,7 +293,13 @@ namespace Language_sk {
|
||||
PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Posunúť o 0,001in");
|
||||
PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Posunúť o 0,01in");
|
||||
PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Posunúť o 0,1in");
|
||||
PROGMEM Language_Str MSG_MOVE_1IN = _UxGT("Posunúť o 1,0in");
|
||||
PROGMEM Language_Str MSG_SPEED = _UxGT("Rýchlosť");
|
||||
PROGMEM Language_Str MSG_MAXSPEED = _UxGT("Max rýchl. (mm/s)");
|
||||
PROGMEM Language_Str MSG_MAXSPEED_X = _UxGT("Max rýchl. ") LCD_STR_A;
|
||||
PROGMEM Language_Str MSG_MAXSPEED_Y = _UxGT("Max rýchl. ") LCD_STR_B;
|
||||
PROGMEM Language_Str MSG_MAXSPEED_Z = _UxGT("Max rýchl. ") LCD_STR_C;
|
||||
PROGMEM Language_Str MSG_MAXSPEED_E = _UxGT("Max rýchl. ") LCD_STR_E;
|
||||
PROGMEM Language_Str MSG_BED_Z = _UxGT("Výška podl.");
|
||||
PROGMEM Language_Str MSG_NOZZLE = _UxGT("Tryska");
|
||||
PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Tryska ~");
|
||||
@@ -306,9 +330,10 @@ namespace Language_sk {
|
||||
PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto-teplota");
|
||||
PROGMEM Language_Str MSG_LCD_ON = _UxGT("Zap");
|
||||
PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Vyp");
|
||||
PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID kalibrácia");
|
||||
PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID kalibrácia *");
|
||||
PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID kal. dokončená");
|
||||
PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("Kalibrácia PID");
|
||||
PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("Kalibrácia PID *");
|
||||
PROGMEM Language_Str MSG_PID_CYCLE = _UxGT("Cykly PID");
|
||||
PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("Kal. PID dokončená");
|
||||
PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Auto-kal. zlyhala. Zlý extrúder.");
|
||||
PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Auto-kal. zlyhala. Príliš vysoká tepl.");
|
||||
PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Auto-kal. zlyhala! Čas vypršal.");
|
||||
@@ -480,6 +505,7 @@ namespace Language_sk {
|
||||
PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Zasunúť sondu Z");
|
||||
PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Vysunúť sondu Z");
|
||||
PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Najskôr os %s%s%s domov");
|
||||
PROGMEM Language_Str MSG_ZPROBE_SETTINGS = _UxGT("Nastav. sondy");
|
||||
PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Ofsety sondy Z");
|
||||
PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X ofset");
|
||||
PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y ofset");
|
||||
@@ -488,6 +514,9 @@ namespace Language_sk {
|
||||
PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X");
|
||||
PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y");
|
||||
PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z");
|
||||
PROGMEM Language_Str MSG_BABYSTEP_I = _UxGT("Babystep ") LCD_STR_I;
|
||||
PROGMEM Language_Str MSG_BABYSTEP_J = _UxGT("Babystep ") LCD_STR_J;
|
||||
PROGMEM Language_Str MSG_BABYSTEP_K = _UxGT("Babystep ") LCD_STR_K;
|
||||
PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Celkom");
|
||||
PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Zastavenie Endstop");
|
||||
PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Chyba ohrevu");
|
||||
@@ -584,6 +613,7 @@ namespace Language_sk {
|
||||
PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Tryska: ");
|
||||
PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Senzor filamentu");
|
||||
PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Vzd. mm fil. senz.");
|
||||
PROGMEM Language_Str MSG_RUNOUT_ENABLE = _UxGT("Zapnúť senzor");
|
||||
PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Parkovanie zlyhalo");
|
||||
PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Kalibrácia zlyhala");
|
||||
|
||||
@@ -703,6 +733,7 @@ namespace Language_sk {
|
||||
#endif
|
||||
PROGMEM Language_Str MSG_REHEAT = _UxGT("Zohriať");
|
||||
PROGMEM Language_Str MSG_REHEATING = _UxGT("Zohrievanie...");
|
||||
PROGMEM Language_Str MSG_REHEATDONE = _UxGT("Zohrievanie dokonč.");
|
||||
|
||||
PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Sprievodca sondy Z");
|
||||
PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Referencia Z");
|
||||
@@ -718,4 +749,7 @@ namespace Language_sk {
|
||||
PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Kalibrácia zlyhala");
|
||||
|
||||
PROGMEM Language_Str MSG_DRIVER_BACKWARD = _UxGT(" spätný chod ovl.");
|
||||
|
||||
PROGMEM Language_Str MSG_SD_CARD = _UxGT("SD karta");
|
||||
PROGMEM Language_Str MSG_USB_DISK = _UxGT("USB disk");
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#include "../feature/host_actions.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(BROWSE_MEDIA_ON_INSERT, PASSWORD_ON_SD_PRINT_MENU)
|
||||
#if BOTH(BROWSE_MEDIA_ON_INSERT, PASSWORD_ON_SD_PRINT_MENU)
|
||||
#include "../feature/password/password.h"
|
||||
#endif
|
||||
|
||||
@@ -673,8 +673,20 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
|
||||
draw_kill_screen();
|
||||
}
|
||||
|
||||
void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) {
|
||||
#if HAS_TOUCH_SLEEP
|
||||
#if HAS_TOUCH_BUTTONS
|
||||
#include "touch/touch_buttons.h"
|
||||
#else
|
||||
#include "tft/touch.h"
|
||||
#endif
|
||||
// Wake up a sleeping TFT
|
||||
void MarlinUI::wakeup_screen() {
|
||||
TERN(HAS_TOUCH_BUTTONS, touchBt.wakeUp(), touch.wakeUp());
|
||||
}
|
||||
#endif
|
||||
|
||||
void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) {
|
||||
TERN_(HAS_TOUCH_SLEEP, wakeup_screen()); // Wake up the TFT with most buttons
|
||||
TERN_(HAS_LCD_MENU, refresh());
|
||||
|
||||
#if HAS_ENCODER_ACTION
|
||||
@@ -926,7 +938,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
|
||||
|
||||
if (on_status_screen()) next_lcd_update_ms += (LCD_UPDATE_INTERVAL) * 2;
|
||||
|
||||
TERN_(HAS_ENCODER_ACTION, touch_buttons = touch.read_buttons());
|
||||
TERN_(HAS_ENCODER_ACTION, touch_buttons = touchBt.read_buttons());
|
||||
|
||||
#endif
|
||||
|
||||
@@ -955,6 +967,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
|
||||
abs_diff = epps; // Treat as a full step size
|
||||
encoderDiff = (encoderDiff < 0 ? -1 : 1) * abs_diff; // ...in the spin direction.
|
||||
}
|
||||
TERN_(HAS_TOUCH_SLEEP, if (lastEncoderDiff != encoderDiff) wakeup_screen());
|
||||
lastEncoderDiff = encoderDiff;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -435,11 +435,15 @@ public:
|
||||
static millis_t next_filament_display;
|
||||
#endif
|
||||
|
||||
#if HAS_TOUCH_SLEEP
|
||||
static void wakeup_screen();
|
||||
#endif
|
||||
|
||||
static void quick_feedback(const bool clear_buttons=true);
|
||||
#if HAS_BUZZER
|
||||
static void completion_feedback(const bool good=true);
|
||||
#else
|
||||
static inline void completion_feedback(const bool=true) {}
|
||||
static inline void completion_feedback(const bool=true) { TERN_(HAS_TOUCH_SLEEP, wakeup_screen()); }
|
||||
#endif
|
||||
|
||||
#if DISABLED(LIGHTWEIGHT_UI)
|
||||
@@ -596,7 +600,7 @@ public:
|
||||
static inline bool use_click() { return false; }
|
||||
#endif
|
||||
|
||||
#if ENABLED(ADVANCED_PAUSE_FEATURE) && ANY(HAS_LCD_MENU, EXTENSIBLE_UI, HAS_DWIN_E3V2)
|
||||
#if ENABLED(ADVANCED_PAUSE_FEATURE) && ANY(HAS_LCD_MENU, EXTENSIBLE_UI, DWIN_CREALITY_LCD_ENHANCED, DWIN_CREALITY_LCD_JYERSUI)
|
||||
static void pause_show_message(const PauseMessage message, const PauseMode mode=PAUSE_MODE_SAME, const uint8_t extruder=active_extruder);
|
||||
#else
|
||||
static inline void _pause_show_message() {}
|
||||
|
||||
@@ -285,6 +285,7 @@ void scroll_screen(const uint8_t limit, const bool is_menu) {
|
||||
|
||||
#if HAS_BUZZER
|
||||
void MarlinUI::completion_feedback(const bool good/*=true*/) {
|
||||
TERN_(HAS_TOUCH_SLEEP, wakeup_screen()); // Wake up on rotary encoder click...
|
||||
if (good) {
|
||||
BUZZ(100, 659);
|
||||
BUZZ(100, 698);
|
||||
|
||||
@@ -353,11 +353,6 @@ void menu_advanced_settings();
|
||||
|
||||
#define HAS_CUSTOM_ITEM_CONF(N) (defined(CONFIG_MENU_ITEM_##N##_DESC) && defined(CONFIG_MENU_ITEM_##N##_GCODE))
|
||||
|
||||
#define CUSTOM_TEST_CONF(N) do{ \
|
||||
constexpr char c = CONFIG_MENU_ITEM_##N##_GCODE[strlen(CONFIG_MENU_ITEM_##N##_GCODE) - 1]; \
|
||||
static_assert(c != '\n' && c != '\r', "CONFIG_MENU_ITEM_" STRINGIFY(N) "_GCODE cannot have a newline at the end. Please remove it."); \
|
||||
}while(0)
|
||||
|
||||
#ifdef CUSTOM_MENU_CONFIG_SCRIPT_DONE
|
||||
#define _DONE_SCRIPT "\n" CUSTOM_MENU_CONFIG_SCRIPT_DONE
|
||||
#else
|
||||
@@ -365,115 +360,97 @@ void menu_advanced_settings();
|
||||
#endif
|
||||
#define GCODE_LAMBDA_CONF(N) []{ _lcd_custom_menus_configuration_gcode(PSTR(CONFIG_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); }
|
||||
#define _CUSTOM_ITEM_CONF(N) ACTION_ITEM_P(PSTR(CONFIG_MENU_ITEM_##N##_DESC), GCODE_LAMBDA_CONF(N));
|
||||
#define _CUSTOM_ITEM_CONF_CONFIRM(N) \
|
||||
#define _CUSTOM_ITEM_CONF_CONFIRM(N) \
|
||||
SUBMENU_P(PSTR(CONFIG_MENU_ITEM_##N##_DESC), []{ \
|
||||
MenuItem_confirm::confirm_screen( \
|
||||
GCODE_LAMBDA_CONF(N), \
|
||||
ui.goto_previous_screen, \
|
||||
MenuItem_confirm::confirm_screen( \
|
||||
GCODE_LAMBDA_CONF(N), \
|
||||
ui.goto_previous_screen, \
|
||||
PSTR(CONFIG_MENU_ITEM_##N##_DESC "?") \
|
||||
); \
|
||||
); \
|
||||
})
|
||||
|
||||
#define CUSTOM_ITEM_CONF(N) do{ if (ENABLED(CONFIG_MENU_ITEM_##N##_CONFIRM)) _CUSTOM_ITEM_CONF_CONFIRM(N); else _CUSTOM_ITEM_CONF(N); }while(0)
|
||||
#define CUSTOM_ITEM_CONF(N) do{ \
|
||||
constexpr char c = CONFIG_MENU_ITEM_##N##_GCODE[strlen(CONFIG_MENU_ITEM_##N##_GCODE) - 1]; \
|
||||
static_assert(c != '\n' && c != '\r', "CONFIG_MENU_ITEM_" STRINGIFY(N) "_GCODE cannot have a newline at the end. Please remove it."); \
|
||||
if (ENABLED(CONFIG_MENU_ITEM_##N##_CONFIRM)) \
|
||||
_CUSTOM_ITEM_CONF_CONFIRM(N); \
|
||||
else \
|
||||
_CUSTOM_ITEM_CONF(N); \
|
||||
}while(0)
|
||||
|
||||
#if HAS_CUSTOM_ITEM_CONF(1)
|
||||
CUSTOM_TEST_CONF(1);
|
||||
CUSTOM_ITEM_CONF(1);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(2)
|
||||
CUSTOM_TEST_CONF(2);
|
||||
CUSTOM_ITEM_CONF(2);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(3)
|
||||
CUSTOM_TEST_CONF(3);
|
||||
CUSTOM_ITEM_CONF(3);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(4)
|
||||
CUSTOM_TEST_CONF(4);
|
||||
CUSTOM_ITEM_CONF(4);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(5)
|
||||
CUSTOM_TEST_CONF(5);
|
||||
CUSTOM_ITEM_CONF(5);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(6)
|
||||
CUSTOM_TEST_CONF(6);
|
||||
CUSTOM_ITEM_CONF(6);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(7)
|
||||
CUSTOM_TEST_CONF(7);
|
||||
CUSTOM_ITEM_CONF(7);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(8)
|
||||
CUSTOM_TEST_CONF(8);
|
||||
CUSTOM_ITEM_CONF(8);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(9)
|
||||
CUSTOM_TEST_CONF(9);
|
||||
CUSTOM_ITEM_CONF(9);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(10)
|
||||
CUSTOM_TEST_CONF(10);
|
||||
CUSTOM_ITEM_CONF(10);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(11)
|
||||
CUSTOM_TEST_CONF(11);
|
||||
CUSTOM_ITEM_CONF(11);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(12)
|
||||
CUSTOM_TEST_CONF(12);
|
||||
CUSTOM_ITEM_CONF(12);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(13)
|
||||
CUSTOM_TEST_CONF(13);
|
||||
CUSTOM_ITEM_CONF(13);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(14)
|
||||
CUSTOM_TEST_CONF(14);
|
||||
CUSTOM_ITEM_CONF(14);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(15)
|
||||
CUSTOM_TEST_CONF(15);
|
||||
CUSTOM_ITEM_CONF(15);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(16)
|
||||
CUSTOM_TEST_CONF(16);
|
||||
CUSTOM_ITEM_CONF(16);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(17)
|
||||
CUSTOM_TEST_CONF(17);
|
||||
CUSTOM_ITEM_CONF(17);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(18)
|
||||
CUSTOM_TEST_CONF(18);
|
||||
CUSTOM_ITEM_CONF(18);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(19)
|
||||
CUSTOM_TEST_CONF(19);
|
||||
CUSTOM_ITEM_CONF(19);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(20)
|
||||
CUSTOM_TEST_CONF(20);
|
||||
CUSTOM_ITEM_CONF(20);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(21)
|
||||
CUSTOM_TEST_CONF(21);
|
||||
CUSTOM_ITEM_CONF(21);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(22)
|
||||
CUSTOM_TEST_CONF(22);
|
||||
CUSTOM_ITEM_CONF(22);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(23)
|
||||
CUSTOM_TEST_CONF(23);
|
||||
CUSTOM_ITEM_CONF(23);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(24)
|
||||
CUSTOM_TEST_CONF(24);
|
||||
CUSTOM_ITEM_CONF(24);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_CONF(25)
|
||||
CUSTOM_TEST_CONF(25);
|
||||
CUSTOM_ITEM_CONF(25);
|
||||
#endif
|
||||
END_MENU();
|
||||
|
||||
@@ -54,9 +54,9 @@ void _man_probe_pt(const xy_pos_t &xy) {
|
||||
|
||||
#if ENABLED(DELTA_AUTO_CALIBRATION)
|
||||
|
||||
#include "../../MarlinCore.h" // for wait_for_user_response()
|
||||
#include "../../gcode/gcode.h"
|
||||
|
||||
#if HAS_RESUME_CONTINUE
|
||||
#include "../../MarlinCore.h" // for wait_for_user_response()
|
||||
#endif
|
||||
#if ENABLED(HOST_PROMPT_SUPPORT)
|
||||
#include "../../feature/host_actions.h" // for host_prompt_do
|
||||
#endif
|
||||
@@ -66,7 +66,7 @@ void _man_probe_pt(const xy_pos_t &xy) {
|
||||
ui.defer_status_screen();
|
||||
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Delta Calibration in progress"), CONTINUE_STR));
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Delta Calibration in progress")));
|
||||
wait_for_user_response();
|
||||
TERN_(HAS_RESUME_CONTINUE, wait_for_user_response());
|
||||
ui.goto_previous_screen_no_defer();
|
||||
return current_position.z;
|
||||
}
|
||||
@@ -88,8 +88,9 @@ void _man_probe_pt(const xy_pos_t &xy) {
|
||||
}
|
||||
|
||||
void _goto_tower_a(const_float_t a) {
|
||||
constexpr float dcr = DELTA_PRINTABLE_RADIUS;
|
||||
xy_pos_t tower_vec = { cos(RADIANS(a)), sin(RADIANS(a)) };
|
||||
_man_probe_pt(tower_vec * delta_calibration_radius());
|
||||
_man_probe_pt(tower_vec * dcr);
|
||||
}
|
||||
void _goto_tower_x() { _goto_tower_a(210); }
|
||||
void _goto_tower_y() { _goto_tower_a(330); }
|
||||
|
||||
@@ -118,13 +118,8 @@ void menu_configuration();
|
||||
|
||||
#define HAS_CUSTOM_ITEM_MAIN(N) (defined(MAIN_MENU_ITEM_##N##_DESC) && defined(MAIN_MENU_ITEM_##N##_GCODE))
|
||||
|
||||
#define CUSTOM_TEST_MAIN(N) do{ \
|
||||
constexpr char c = MAIN_MENU_ITEM_##N##_GCODE[strlen(MAIN_MENU_ITEM_##N##_GCODE) - 1]; \
|
||||
static_assert(c != '\n' && c != '\r', "MAIN_MENU_ITEM_" STRINGIFY(N) "_GCODE cannot have a newline at the end. Please remove it."); \
|
||||
}while(0)
|
||||
|
||||
#ifdef MAIN_MENU_ITEM_SCRIPT_DONE
|
||||
#define _DONE_SCRIPT "\n" MAIN_MENU_ITEM_SCRIPT_DONE
|
||||
#ifdef CUSTOM_MENU_MAIN_SCRIPT_DONE
|
||||
#define _DONE_SCRIPT "\n" CUSTOM_MENU_MAIN_SCRIPT_DONE
|
||||
#else
|
||||
#define _DONE_SCRIPT ""
|
||||
#endif
|
||||
@@ -139,106 +134,88 @@ void menu_configuration();
|
||||
); \
|
||||
})
|
||||
|
||||
#define CUSTOM_ITEM_MAIN(N) do{ if (ENABLED(MAIN_MENU_ITEM_##N##_CONFIRM)) _CUSTOM_ITEM_MAIN_CONFIRM(N); else _CUSTOM_ITEM_MAIN(N); }while(0)
|
||||
#define CUSTOM_ITEM_MAIN(N) do{ \
|
||||
constexpr char c = MAIN_MENU_ITEM_##N##_GCODE[strlen(MAIN_MENU_ITEM_##N##_GCODE) - 1]; \
|
||||
static_assert(c != '\n' && c != '\r', "MAIN_MENU_ITEM_" STRINGIFY(N) "_GCODE cannot have a newline at the end. Please remove it."); \
|
||||
if (ENABLED(MAIN_MENU_ITEM_##N##_CONFIRM)) \
|
||||
_CUSTOM_ITEM_MAIN_CONFIRM(N); \
|
||||
else \
|
||||
_CUSTOM_ITEM_MAIN(N); \
|
||||
}while(0)
|
||||
|
||||
#if HAS_CUSTOM_ITEM_MAIN(1)
|
||||
CUSTOM_TEST_MAIN(1);
|
||||
CUSTOM_ITEM_MAIN(1);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(2)
|
||||
CUSTOM_TEST_MAIN(2);
|
||||
CUSTOM_ITEM_MAIN(2);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(3)
|
||||
CUSTOM_TEST_MAIN(3);
|
||||
CUSTOM_ITEM_MAIN(3);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(4)
|
||||
CUSTOM_TEST_MAIN(4);
|
||||
CUSTOM_ITEM_MAIN(4);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(5)
|
||||
CUSTOM_TEST_MAIN(5);
|
||||
CUSTOM_ITEM_MAIN(5);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(6)
|
||||
CUSTOM_TEST_MAIN(6);
|
||||
CUSTOM_ITEM_MAIN(6);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(7)
|
||||
CUSTOM_TEST_MAIN(7);
|
||||
CUSTOM_ITEM_MAIN(7);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(8)
|
||||
CUSTOM_TEST_MAIN(8);
|
||||
CUSTOM_ITEM_MAIN(8);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(9)
|
||||
CUSTOM_TEST_MAIN(9);
|
||||
CUSTOM_ITEM_MAIN(9);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(10)
|
||||
CUSTOM_TEST_MAIN(10);
|
||||
CUSTOM_ITEM_MAIN(10);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(11)
|
||||
CUSTOM_TEST_MAIN(11);
|
||||
CUSTOM_ITEM_MAIN(11);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(12)
|
||||
CUSTOM_TEST_MAIN(12);
|
||||
CUSTOM_ITEM_MAIN(12);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(13)
|
||||
CUSTOM_TEST_MAIN(13);
|
||||
CUSTOM_ITEM_MAIN(13);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(14)
|
||||
CUSTOM_TEST_MAIN(14);
|
||||
CUSTOM_ITEM_MAIN(14);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(15)
|
||||
CUSTOM_TEST_MAIN(15);
|
||||
CUSTOM_ITEM_MAIN(15);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(16)
|
||||
CUSTOM_TEST_MAIN(16);
|
||||
CUSTOM_ITEM_MAIN(16);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(17)
|
||||
CUSTOM_TEST_MAIN(17);
|
||||
CUSTOM_ITEM_MAIN(17);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(18)
|
||||
CUSTOM_TEST_MAIN(18);
|
||||
CUSTOM_ITEM_MAIN(18);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(19)
|
||||
CUSTOM_TEST_MAIN(19);
|
||||
CUSTOM_ITEM_MAIN(19);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(20)
|
||||
CUSTOM_TEST_MAIN(20);
|
||||
CUSTOM_ITEM_MAIN(20);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(21)
|
||||
CUSTOM_TEST_MAIN(21);
|
||||
CUSTOM_ITEM_MAIN(21);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(22)
|
||||
CUSTOM_TEST_MAIN(22);
|
||||
CUSTOM_ITEM_MAIN(22);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(23)
|
||||
CUSTOM_TEST_MAIN(23);
|
||||
CUSTOM_ITEM_MAIN(23);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(24)
|
||||
CUSTOM_TEST_MAIN(24);
|
||||
CUSTOM_ITEM_MAIN(24);
|
||||
#endif
|
||||
#if HAS_CUSTOM_ITEM_MAIN(25)
|
||||
CUSTOM_TEST_MAIN(25);
|
||||
CUSTOM_ITEM_MAIN(25);
|
||||
#endif
|
||||
END_MENU();
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
START_MENU();
|
||||
BACK_ITEM(MSG_MAIN);
|
||||
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
// Change the cutter's "current power" value without turning the cutter on or off
|
||||
// Power is displayed and set in units and range according to CUTTER_POWER_UNIT
|
||||
EDIT_ITEM_FAST(CUTTER_MENU_POWER_TYPE, MSG_CUTTER(POWER), &cutter.menuPower,
|
||||
|
||||
@@ -47,7 +47,10 @@ millis_t Touch::last_touch_ms = 0,
|
||||
Touch::time_to_hold,
|
||||
Touch::repeat_delay,
|
||||
Touch::touch_time;
|
||||
TouchControlType Touch::touch_control_type = NONE;
|
||||
TouchControlType Touch::touch_control_type = NONE;
|
||||
#if HAS_TOUCH_SLEEP
|
||||
millis_t Touch::next_sleep_ms; // = 0
|
||||
#endif
|
||||
#if HAS_RESUME_CONTINUE
|
||||
extern bool wait_for_user;
|
||||
#endif
|
||||
@@ -56,6 +59,7 @@ void Touch::init() {
|
||||
TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset());
|
||||
reset();
|
||||
io.Init();
|
||||
TERN_(HAS_TOUCH_SLEEP, wakeUp());
|
||||
enable();
|
||||
}
|
||||
|
||||
@@ -271,9 +275,34 @@ bool Touch::get_point(int16_t *x, int16_t *y) {
|
||||
#elif ENABLED(TFT_TOUCH_DEVICE_GT911)
|
||||
bool is_touched = (TOUCH_ORIENTATION == TOUCH_PORTRAIT ? io.getPoint(y, x) : io.getPoint(x, y));
|
||||
#endif
|
||||
|
||||
#if HAS_TOUCH_SLEEP
|
||||
if (is_touched)
|
||||
wakeUp();
|
||||
else if (!isSleeping() && ELAPSED(millis(), next_sleep_ms) && ui.on_status_screen())
|
||||
sleepTimeout();
|
||||
#endif
|
||||
return is_touched;
|
||||
}
|
||||
|
||||
#if HAS_TOUCH_SLEEP
|
||||
|
||||
void Touch::sleepTimeout() {
|
||||
#if PIN_EXISTS(TFT_BACKLIGHT)
|
||||
OUT_WRITE(TFT_BACKLIGHT_PIN, LOW);
|
||||
#endif
|
||||
next_sleep_ms = TSLP_SLEEPING;
|
||||
}
|
||||
void Touch::wakeUp() {
|
||||
if (isSleeping()) {
|
||||
#if PIN_EXISTS(TFT_BACKLIGHT)
|
||||
WRITE(TFT_BACKLIGHT_PIN, HIGH);
|
||||
#endif
|
||||
}
|
||||
next_sleep_ms = millis() + SEC_TO_MS(TOUCH_IDLE_SLEEP);
|
||||
}
|
||||
|
||||
#endif // HAS_TOUCH_SLEEP
|
||||
|
||||
Touch touch;
|
||||
|
||||
bool MarlinUI::touch_pressed() {
|
||||
|
||||
@@ -90,6 +90,9 @@ typedef struct __attribute__((__packed__)) {
|
||||
#define UBL_REPEAT_DELAY 125
|
||||
#define FREE_MOVE_RANGE 32
|
||||
|
||||
#define TSLP_PREINIT 0
|
||||
#define TSLP_SLEEPING 1
|
||||
|
||||
class Touch {
|
||||
private:
|
||||
static TOUCH_DRIVER_CLASS io;
|
||||
@@ -121,7 +124,12 @@ class Touch {
|
||||
}
|
||||
static void disable() { enabled = false; }
|
||||
static void enable() { enabled = true; }
|
||||
|
||||
#if HAS_TOUCH_SLEEP
|
||||
static millis_t next_sleep_ms;
|
||||
static inline bool isSleeping() { return next_sleep_ms == TSLP_SLEEPING; }
|
||||
static void sleepTimeout();
|
||||
static void wakeUp();
|
||||
#endif
|
||||
static void add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, intptr_t data = 0);
|
||||
};
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
|
||||
void MarlinUI::tft_idle() {
|
||||
#if ENABLED(TOUCH_SCREEN)
|
||||
if (TERN0(HAS_TOUCH_SLEEP, lcd_sleep_task())) return;
|
||||
if (draw_menu_navigation) {
|
||||
add_control(164, TFT_HEIGHT - 50, PAGE_UP, imgPageUp, encoderTopLine > 0);
|
||||
add_control(796, TFT_HEIGHT - 50, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items);
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
|
||||
void MarlinUI::tft_idle() {
|
||||
#if ENABLED(TOUCH_SCREEN)
|
||||
if (TERN0(HAS_TOUCH_SLEEP, lcd_sleep_task())) return;
|
||||
if (draw_menu_navigation) {
|
||||
add_control(48, 206, PAGE_UP, imgPageUp, encoderTopLine > 0);
|
||||
add_control(240, 206, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items);
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
|
||||
void MarlinUI::tft_idle() {
|
||||
#if ENABLED(TOUCH_SCREEN)
|
||||
if (TERN0(HAS_TOUCH_SLEEP, lcd_sleep_task())) return;
|
||||
if (draw_menu_navigation) {
|
||||
add_control(104, TFT_HEIGHT - 34, PAGE_UP, imgPageUp, encoderTopLine > 0);
|
||||
add_control(344, TFT_HEIGHT - 34, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items);
|
||||
|
||||
@@ -37,6 +37,27 @@ static xy_uint_t cursor;
|
||||
bool draw_menu_navigation = false;
|
||||
#endif
|
||||
|
||||
#if HAS_TOUCH_SLEEP
|
||||
|
||||
bool lcd_sleep_task() {
|
||||
static bool sleepCleared;
|
||||
if (touch.isSleeping()) {
|
||||
tft.queue.reset();
|
||||
if (!sleepCleared) {
|
||||
sleepCleared = true;
|
||||
ui.clear_lcd();
|
||||
tft.queue.async();
|
||||
}
|
||||
touch.idle();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
sleepCleared = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void menu_line(const uint8_t row, uint16_t color) {
|
||||
cursor.set(0, row);
|
||||
tft.canvas(0, TFT_TOP_LINE_Y + cursor.y * MENU_LINE_HEIGHT, TFT_WIDTH, MENU_ITEM_HEIGHT);
|
||||
|
||||
@@ -51,6 +51,10 @@ void draw_fan_status(uint16_t x, uint16_t y, const bool blink);
|
||||
void menu_line(const uint8_t row, uint16_t color=COLOR_BACKGROUND);
|
||||
void menu_item(const uint8_t row, bool sel = false);
|
||||
|
||||
#if HAS_TOUCH_SLEEP
|
||||
bool lcd_sleep_task();
|
||||
#endif
|
||||
|
||||
#define ABSOLUTE_ZERO -273.15
|
||||
|
||||
#if HAS_TEMP_CHAMBER && HOTENDS > 1
|
||||
|
||||
@@ -59,7 +59,6 @@
|
||||
#define TFT_ROTATION TFT_NO_ROTATION
|
||||
#endif
|
||||
|
||||
|
||||
// TFT_ORIENTATION is the "sum" of TFT_DEFAULT_ORIENTATION plus user TFT_ROTATION
|
||||
#define TFT_ORIENTATION ((TFT_DEFAULT_ORIENTATION) ^ (TFT_ROTATION))
|
||||
|
||||
|
||||
@@ -38,6 +38,10 @@
|
||||
#include "../tft_io/touch_calibration.h"
|
||||
#endif
|
||||
|
||||
#if HAS_TOUCH_SLEEP
|
||||
millis_t TouchButtons::next_sleep_ms;
|
||||
#endif
|
||||
|
||||
#include "../buttons.h" // For EN_C bit mask
|
||||
#include "../marlinui.h" // For ui.refresh
|
||||
#include "../tft_io/tft_io.h"
|
||||
@@ -50,15 +54,24 @@
|
||||
#define BUTTON_AREA_TOP BUTTON_Y_LO
|
||||
#define BUTTON_AREA_BOT BUTTON_Y_HI
|
||||
|
||||
TouchButtons touch;
|
||||
TouchButtons touchBt;
|
||||
|
||||
void TouchButtons::init() { touchIO.Init(); }
|
||||
void TouchButtons::init() {
|
||||
touchIO.Init();
|
||||
TERN_(HAS_TOUCH_SLEEP, next_sleep_ms = millis() + SEC_TO_MS(TOUCH_IDLE_SLEEP));
|
||||
}
|
||||
|
||||
uint8_t TouchButtons::read_buttons() {
|
||||
#ifdef HAS_WIRED_LCD
|
||||
int16_t x, y;
|
||||
|
||||
const bool is_touched = (TERN(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration.orientation, TOUCH_ORIENTATION) == TOUCH_PORTRAIT ? touchIO.getRawPoint(&y, &x) : touchIO.getRawPoint(&x, &y));
|
||||
#if HAS_TOUCH_SLEEP
|
||||
if (is_touched)
|
||||
wakeUp();
|
||||
else if (!isSleeping() && ELAPSED(millis(), next_sleep_ms) && ui.on_status_screen())
|
||||
sleepTimeout();
|
||||
#endif
|
||||
if (!is_touched) return 0;
|
||||
|
||||
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
|
||||
@@ -96,4 +109,23 @@ uint8_t TouchButtons::read_buttons() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if HAS_TOUCH_SLEEP
|
||||
|
||||
void TouchButtons::sleepTimeout() {
|
||||
#if PIN_EXISTS(TFT_BACKLIGHT)
|
||||
OUT_WRITE(TFT_BACKLIGHT_PIN, LOW);
|
||||
#endif
|
||||
next_sleep_ms = TSLP_SLEEPING;
|
||||
}
|
||||
void TouchButtons::wakeUp() {
|
||||
if (isSleeping()) {
|
||||
#if PIN_EXISTS(TFT_BACKLIGHT)
|
||||
WRITE(TFT_BACKLIGHT_PIN, HIGH);
|
||||
#endif
|
||||
}
|
||||
next_sleep_ms = millis() + SEC_TO_MS(TOUCH_IDLE_SLEEP);
|
||||
}
|
||||
|
||||
#endif // HAS_TOUCH_SLEEP
|
||||
|
||||
#endif // HAS_TOUCH_BUTTONS
|
||||
|
||||
@@ -50,10 +50,19 @@
|
||||
#define BUTTON_Y_HI (TFT_HEIGHT) - BUTTON_SPACING
|
||||
#define BUTTON_Y_LO BUTTON_Y_HI - BUTTON_HEIGHT
|
||||
|
||||
#define TSLP_PREINIT 0
|
||||
#define TSLP_SLEEPING 1
|
||||
|
||||
class TouchButtons {
|
||||
public:
|
||||
static void init();
|
||||
static uint8_t read_buttons();
|
||||
#if HAS_TOUCH_SLEEP
|
||||
static millis_t next_sleep_ms;
|
||||
static bool isSleeping() { return next_sleep_ms == TSLP_SLEEPING; }
|
||||
static void sleepTimeout();
|
||||
static void wakeUp();
|
||||
#endif
|
||||
};
|
||||
|
||||
extern TouchButtons touch;
|
||||
extern TouchButtons touchBt;
|
||||
|
||||
@@ -82,28 +82,6 @@ void recalc_delta_settings() {
|
||||
set_all_unhomed();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a safe radius for calibration
|
||||
*/
|
||||
|
||||
#if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU)
|
||||
|
||||
#if ENABLED(DELTA_AUTO_CALIBRATION)
|
||||
float calibration_radius_factor = 1;
|
||||
#endif
|
||||
|
||||
float delta_calibration_radius() {
|
||||
return calibration_radius_factor * (
|
||||
#if HAS_BED_PROBE
|
||||
FLOOR((DELTA_PRINTABLE_RADIUS) - _MAX(HYPOT(probe.offset_xy.x, probe.offset_xy.y), PROBING_MARGIN))
|
||||
#else
|
||||
DELTA_PRINTABLE_RADIUS
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Delta Inverse Kinematics
|
||||
*
|
||||
@@ -254,7 +232,7 @@ void home_delta() {
|
||||
current_position.z = DIFF_TERN(HAS_BED_PROBE, delta_height + 10, probe.offset.z);
|
||||
line_to_current_position(homing_feedrate(Z_AXIS));
|
||||
planner.synchronize();
|
||||
TERN_(SENSORLESS_PROBING,endstops.report_states());
|
||||
TERN_(HAS_DELTA_SENSORLESS_PROBING, endstops.report_states());
|
||||
|
||||
// Re-enable stealthChop if used. Disable diag1 pin on driver.
|
||||
#if ENABLED(SENSORLESS_HOMING) && DISABLED(ENDSTOPS_ALWAYS_ON_DEFAULT)
|
||||
|
||||
@@ -45,19 +45,6 @@ extern abc_float_t delta_diagonal_rod_trim;
|
||||
*/
|
||||
void recalc_delta_settings();
|
||||
|
||||
/**
|
||||
* Get a safe radius for calibration
|
||||
*/
|
||||
#if ENABLED(DELTA_AUTO_CALIBRATION)
|
||||
extern float calibration_radius_factor;
|
||||
#else
|
||||
constexpr float calibration_radius_factor = 1;
|
||||
#endif
|
||||
|
||||
#if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU)
|
||||
float delta_calibration_radius();
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Delta Inverse Kinematics
|
||||
*
|
||||
|
||||
@@ -595,7 +595,7 @@ void _O2 Endstops::report_states() {
|
||||
// The following routines are called from an ISR context. It could be the temperature ISR, the
|
||||
// endstop ISR or the Stepper ISR.
|
||||
|
||||
#if BOTH(DELTA, SENSORLESS_PROBING)
|
||||
#if HAS_DELTA_SENSORLESS_PROBING
|
||||
#define __ENDSTOP(AXIS, ...) AXIS ##_MAX
|
||||
#define _ENDSTOP_PIN(AXIS, ...) AXIS ##_MAX_PIN
|
||||
#define _ENDSTOP_INVERTING(AXIS, ...) AXIS ##_MAX_ENDSTOP_INVERTING
|
||||
|
||||
@@ -59,7 +59,9 @@ enum EndstopEnum : char {
|
||||
_ES_ITEM(HAS_Z4_MAX, Z4_MAX)
|
||||
|
||||
// Bed Probe state is distinct or shared with Z_MIN (i.e., when the probe is the only Z endstop)
|
||||
_ES_ITEM(HAS_BED_PROBE, Z_MIN_PROBE IF_DISABLED(USES_Z_MIN_PROBE_PIN, = Z_MIN))
|
||||
#if !HAS_DELTA_SENSORLESS_PROBING
|
||||
_ES_ITEM(HAS_BED_PROBE, Z_MIN_PROBE IF_DISABLED(USES_Z_MIN_PROBE_PIN, = Z_MIN))
|
||||
#endif
|
||||
|
||||
// The total number of states
|
||||
NUM_ENDSTOP_STATES
|
||||
|
||||
@@ -141,7 +141,7 @@ xyz_pos_t Probe::offset; // Initialized by settings.load()
|
||||
ui.return_to_status();
|
||||
|
||||
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Deploy TouchMI"), CONTINUE_STR));
|
||||
wait_for_user_response();
|
||||
TERN_(HAS_RESUME_CONTINUE, wait_for_user_response());
|
||||
ui.reset_status();
|
||||
ui.goto_screen(prev_screen);
|
||||
|
||||
@@ -298,7 +298,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) {
|
||||
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Stow Probe"), CONTINUE_STR));
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Stow Probe")));
|
||||
TERN_(DWIN_CREALITY_LCD_ENHANCED, DWIN_Popup_Confirm(ICON_BLTouch, PSTR("Stow Probe"), CONTINUE_STR));
|
||||
wait_for_user_response();
|
||||
TERN_(HAS_RESUME_CONTINUE, wait_for_user_response());
|
||||
ui.reset_status();
|
||||
|
||||
} while (ENABLED(PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED));
|
||||
@@ -493,7 +493,7 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) {
|
||||
// Disable stealthChop if used. Enable diag1 pin on driver.
|
||||
#if ENABLED(SENSORLESS_PROBING)
|
||||
sensorless_t stealth_states { false };
|
||||
#if ENABLED(DELTA)
|
||||
#if HAS_DELTA_SENSORLESS_PROBING
|
||||
if (probe.test_sensitivity.x) stealth_states.x = tmc_enable_stallguard(stepperX); // Delta watches all DIAG pins for a stall
|
||||
if (probe.test_sensitivity.y) stealth_states.y = tmc_enable_stallguard(stepperY);
|
||||
#endif
|
||||
@@ -509,7 +509,7 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) {
|
||||
|
||||
// Check to see if the probe was triggered
|
||||
const bool probe_triggered =
|
||||
#if BOTH(DELTA, SENSORLESS_PROBING)
|
||||
#if HAS_DELTA_SENSORLESS_PROBING
|
||||
endstops.trigger_state() & (_BV(X_MAX) | _BV(Y_MAX) | _BV(Z_MAX))
|
||||
#else
|
||||
TEST(endstops.trigger_state(), Z_MIN_PROBE)
|
||||
@@ -521,7 +521,7 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) {
|
||||
// Re-enable stealthChop if used. Disable diag1 pin on driver.
|
||||
#if ENABLED(SENSORLESS_PROBING)
|
||||
endstops.not_homing();
|
||||
#if ENABLED(DELTA)
|
||||
#if HAS_DELTA_SENSORLESS_PROBING
|
||||
if (probe.test_sensitivity.x) tmc_disable_stallguard(stepperX, stealth_states.x);
|
||||
if (probe.test_sensitivity.y) tmc_disable_stallguard(stepperY, stealth_states.y);
|
||||
#endif
|
||||
@@ -765,7 +765,7 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai
|
||||
#endif
|
||||
|
||||
// On delta keep Z below clip height or do_blocking_move_to will abort
|
||||
xyz_pos_t npos = { rx, ry, _MIN(TERN(DELTA, delta_clip_start_height, current_position.z), current_position.z) };
|
||||
xyz_pos_t npos = { rx, ry, TERN(DELTA, _MIN(delta_clip_start_height, current_position.z), current_position.z) };
|
||||
if (probe_relative) { // The given position is in terms of the probe
|
||||
if (!can_reach(npos)) {
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Position Not Reachable");
|
||||
@@ -827,7 +827,7 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai
|
||||
*/
|
||||
void Probe::enable_stallguard_diag1() {
|
||||
#if ENABLED(SENSORLESS_PROBING)
|
||||
#if ENABLED(DELTA)
|
||||
#if HAS_DELTA_SENSORLESS_PROBING
|
||||
stealth_states.x = tmc_enable_stallguard(stepperX);
|
||||
stealth_states.y = tmc_enable_stallguard(stepperY);
|
||||
#endif
|
||||
@@ -842,7 +842,7 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai
|
||||
void Probe::disable_stallguard_diag1() {
|
||||
#if ENABLED(SENSORLESS_PROBING)
|
||||
endstops.not_homing();
|
||||
#if ENABLED(DELTA)
|
||||
#if HAS_DELTA_SENSORLESS_PROBING
|
||||
tmc_disable_stallguard(stepperX, stealth_states.x);
|
||||
tmc_disable_stallguard(stepperY, stealth_states.y);
|
||||
#endif
|
||||
@@ -907,6 +907,6 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // SENSORLESS_PROBING
|
||||
#endif // SENSORLESS_PROBING || SENSORLESS_HOMING
|
||||
|
||||
#endif // HAS_BED_PROBE
|
||||
|
||||
@@ -2255,7 +2255,7 @@ uint32_t Stepper::block_phase_isr() {
|
||||
}
|
||||
#else
|
||||
if (stat.isPlanned) { // Planner controls the laser
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
cutter.ocr_set_power(
|
||||
stat.isEnabled ? current_block->laser.power : 0 // ON with power or OFF
|
||||
);
|
||||
@@ -2303,7 +2303,7 @@ uint32_t Stepper::block_phase_isr() {
|
||||
// This should mean ending file with 'M5 I' will stop the laser; thus the inline flag isn't needed
|
||||
const power_status_t stat = planner.laser_inline.status;
|
||||
if (stat.isPlanned) { // Planner controls the laser
|
||||
#if ENABLED(SPINDLE_LASER_PWM)
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
cutter.ocr_set_power(
|
||||
stat.isEnabled ? planner.laser_inline.power : 0 // ON with power or OFF
|
||||
);
|
||||
|
||||
@@ -372,11 +372,11 @@ class Stepper {
|
||||
uint8_t cur_power; // Current laser power
|
||||
bool cruise_set; // Power set up for cruising?
|
||||
|
||||
#if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT)
|
||||
#if ENABLED(LASER_POWER_INLINE_TRAPEZOID_CONT)
|
||||
uint16_t till_update; // Countdown to the next update
|
||||
#else
|
||||
uint32_t last_step_count, // Step count from the last update
|
||||
acc_step_count; // Bresenham counter for laser accel/decel
|
||||
#else
|
||||
uint16_t till_update; // Countdown to the next update
|
||||
#endif
|
||||
} stepper_laser_t;
|
||||
|
||||
|
||||
@@ -112,9 +112,9 @@
|
||||
//
|
||||
// M3/M4/M5 - Spindle/Laser Control
|
||||
//
|
||||
#if ENABLED(SPINDLE_LASER_ENABLE)
|
||||
#if EITHER(SPINDLE_FEATURE, LASER_FEATURE)
|
||||
#define SPINDLE_DIR_PIN 16
|
||||
#define SPINDLE_LASER_ENABLE_PIN 17 // Pin should have a pullup!
|
||||
#define SPINDLE_LASER_ENA_PIN 17 // Pin should have a pullup!
|
||||
#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM
|
||||
#endif
|
||||
|
||||
|
||||
@@ -549,7 +549,7 @@
|
||||
#include "stm32f1/pins_CREALITY_V4210.h" // STM32F1 env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
|
||||
#elif MB(CREALITY_V427)
|
||||
#include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
|
||||
#elif MB(CREALITY_V431)
|
||||
#elif MB(CREALITY_V431, CREALITY_V431_A, CREALITY_V431_B, CREALITY_V431_C, CREALITY_V431_D)
|
||||
#include "stm32f1/pins_CREALITY_V431.h" // STM32F1 env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
|
||||
#elif MB(CREALITY_V452)
|
||||
#include "stm32f1/pins_CREALITY_V452.h" // STM32F1 env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
|
||||
@@ -649,6 +649,8 @@
|
||||
#include "stm32f4/pins_TH3D_EZBOARD_LITE_V2.h" // STM32F4 env:TH3D_EZBoard_Lite_V2
|
||||
#elif MB(INDEX_REV03)
|
||||
#include "stm32f4/pins_INDEX_REV03.h" // STM32F4 env:Index_Mobo_Rev03
|
||||
#elif MB(MKS_ROBIN_NANO_V1_3_F4)
|
||||
#include "stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h" // STM32F4 env:mks_robin_nano_v1_3_f4
|
||||
|
||||
//
|
||||
// ARM Cortex M7
|
||||
|
||||
@@ -224,28 +224,28 @@
|
||||
#endif
|
||||
|
||||
//
|
||||
// Case Light
|
||||
// M3/M4/M5 - Spindle/Laser Control
|
||||
//
|
||||
#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) && !defined(SPINDLE_LASER_ENABLE_PIN)
|
||||
#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) && !PIN_EXISTS(SPINDLE_LASER_ENA)
|
||||
#if !NUM_SERVOS // Prefer the servo connector
|
||||
#define CASE_LIGHT_PIN 6 // Hardware PWM
|
||||
#define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown!
|
||||
#define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM
|
||||
#define SPINDLE_DIR_PIN 5
|
||||
#elif HAS_FREE_AUX2_PINS // Try to use AUX 2
|
||||
#define CASE_LIGHT_PIN 44 // Hardware PWM
|
||||
#define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown!
|
||||
#define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM
|
||||
#define SPINDLE_DIR_PIN 65
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//
|
||||
// M3/M4/M5 - Spindle/Laser Control
|
||||
// Case Light
|
||||
//
|
||||
#if ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENABLE)
|
||||
#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) && !defined(SPINDLE_LASER_ENA_PIN)
|
||||
#if !NUM_SERVOS // Prefer the servo connector
|
||||
#define SPINDLE_LASER_ENABLE_PIN 4 // Pullup or pulldown!
|
||||
#define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM
|
||||
#define SPINDLE_DIR_PIN 5
|
||||
#define CASE_LIGHT_PIN 6 // Hardware PWM
|
||||
#elif HAS_FREE_AUX2_PINS // Try to use AUX 2
|
||||
#define SPINDLE_LASER_ENABLE_PIN 40 // Pullup or pulldown!
|
||||
#define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM
|
||||
#define SPINDLE_DIR_PIN 65
|
||||
#define CASE_LIGHT_PIN 44 // Hardware PWM
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -88,37 +88,37 @@
|
||||
//
|
||||
// Steppers
|
||||
//
|
||||
#define X_ENABLE_PIN PC3
|
||||
#ifndef X_STEP_PIN
|
||||
#define X_STEP_PIN PC2
|
||||
#endif
|
||||
#ifndef X_DIR_PIN
|
||||
#define X_DIR_PIN PB9
|
||||
#endif
|
||||
#define X_ENABLE_PIN PC3 // Shared
|
||||
|
||||
#define Y_ENABLE_PIN PC3
|
||||
#ifndef Y_STEP_PIN
|
||||
#define Y_STEP_PIN PB8
|
||||
#endif
|
||||
#ifndef Y_DIR_PIN
|
||||
#define Y_DIR_PIN PB7
|
||||
#endif
|
||||
#define Y_ENABLE_PIN X_ENABLE_PIN
|
||||
|
||||
#define Z_ENABLE_PIN PC3
|
||||
#ifndef Z_STEP_PIN
|
||||
#define Z_STEP_PIN PB6
|
||||
#endif
|
||||
#ifndef Z_DIR_PIN
|
||||
#define Z_DIR_PIN PB5
|
||||
#endif
|
||||
#define Z_ENABLE_PIN X_ENABLE_PIN
|
||||
|
||||
#define E0_ENABLE_PIN PC3
|
||||
#ifndef E0_STEP_PIN
|
||||
#define E0_STEP_PIN PB4
|
||||
#endif
|
||||
#ifndef E0_DIR_PIN
|
||||
#define E0_DIR_PIN PB3
|
||||
#endif
|
||||
#define E0_ENABLE_PIN X_ENABLE_PIN
|
||||
|
||||
//
|
||||
// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role
|
||||
|
||||
@@ -31,10 +31,21 @@
|
||||
//
|
||||
// Steppers
|
||||
//
|
||||
#define X_STEP_PIN PB8
|
||||
#define X_DIR_PIN PB7
|
||||
#if MB(CREALITY_V431, CREALITY_V431_A, CREALITY_V431_B)
|
||||
|
||||
#define Y_STEP_PIN PC2
|
||||
#define Y_DIR_PIN PB9
|
||||
#define X_STEP_PIN PB8
|
||||
#define X_DIR_PIN PB7
|
||||
|
||||
#define Y_STEP_PIN PC2
|
||||
#define Y_DIR_PIN PB9
|
||||
|
||||
#endif
|
||||
|
||||
#if MB(CREALITY_V431_B, CREALITY_V431_C)
|
||||
|
||||
#define E0_STEP_PIN PB3
|
||||
#define E0_DIR_PIN PB4
|
||||
|
||||
#endif
|
||||
|
||||
#include "pins_CREALITY_V4.h"
|
||||
|
||||
@@ -26,200 +26,22 @@
|
||||
* https://github.com/makerbase-mks/MKS-Robin-Nano-V1.X/tree/master/hardware
|
||||
*/
|
||||
|
||||
#if NOT_TARGET(STM32F1, STM32F1xx)
|
||||
#error "Oops! Select an STM32F1 board in 'Tools > Board.'"
|
||||
#elif HOTENDS > 2 || E_STEPPERS > 2
|
||||
#error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue."
|
||||
#endif
|
||||
#define ALLOW_STM32DUINO
|
||||
#include "env_validate.h"
|
||||
|
||||
#define BOARD_INFO_NAME "MKS Robin Nano"
|
||||
|
||||
#define BOARD_NO_NATIVE_USB
|
||||
|
||||
// Avoid conflict with TIMER_SERVO when using the STM32 HAL
|
||||
#define TEMP_TIMER 5
|
||||
|
||||
//
|
||||
// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role
|
||||
//
|
||||
#define DISABLE_JTAG
|
||||
|
||||
//
|
||||
// EEPROM
|
||||
//
|
||||
#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION)
|
||||
#define FLASH_EEPROM_EMULATION
|
||||
#define EEPROM_PAGE_SIZE (0x800U) // 2KB
|
||||
#define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL)
|
||||
#define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB
|
||||
#endif
|
||||
|
||||
#define SPI_DEVICE 2
|
||||
|
||||
//
|
||||
// Servos
|
||||
//
|
||||
#define SERVO0_PIN PA8 // Enable BLTOUCH
|
||||
|
||||
//
|
||||
// Limit Switches
|
||||
//
|
||||
#define X_STOP_PIN PA15
|
||||
#define Y_STOP_PIN PA12
|
||||
#define Z_MIN_PIN PA11
|
||||
#define Z_MAX_PIN PC4
|
||||
|
||||
//
|
||||
// Steppers
|
||||
//
|
||||
#define X_ENABLE_PIN PE4
|
||||
#define X_STEP_PIN PE3
|
||||
#define X_DIR_PIN PE2
|
||||
|
||||
#define Y_ENABLE_PIN PE1
|
||||
#define Y_STEP_PIN PE0
|
||||
#define Y_DIR_PIN PB9
|
||||
|
||||
#define Z_ENABLE_PIN PB8
|
||||
#define Z_STEP_PIN PB5
|
||||
#define Z_DIR_PIN PB4
|
||||
|
||||
#define E0_ENABLE_PIN PB3
|
||||
#define E0_STEP_PIN PD6
|
||||
#define E0_DIR_PIN PD3
|
||||
|
||||
#define E1_ENABLE_PIN PA3
|
||||
#define E1_STEP_PIN PA6
|
||||
#define E1_DIR_PIN PA1
|
||||
|
||||
//
|
||||
// Temperature Sensors
|
||||
//
|
||||
#define TEMP_0_PIN PC1 // TH1
|
||||
#define TEMP_1_PIN PC2 // TH2
|
||||
#define TEMP_BED_PIN PC0 // TB1
|
||||
|
||||
//
|
||||
// Heaters / Fans
|
||||
//
|
||||
#ifndef HEATER_0_PIN
|
||||
#define HEATER_0_PIN PC3
|
||||
#endif
|
||||
#if HOTENDS == 1 && DISABLED(HEATERS_PARALLEL)
|
||||
#ifndef FAN1_PIN
|
||||
#define FAN1_PIN PB0
|
||||
#endif
|
||||
#else
|
||||
#ifndef HEATER_1_PIN
|
||||
#define HEATER_1_PIN PB0
|
||||
#endif
|
||||
#endif
|
||||
#ifndef FAN_PIN
|
||||
#define FAN_PIN PB1 // FAN
|
||||
#endif
|
||||
#ifndef HEATER_BED_PIN
|
||||
#define HEATER_BED_PIN PA0
|
||||
#endif
|
||||
|
||||
//
|
||||
// Thermocouples
|
||||
//
|
||||
//#define TEMP_0_CS_PIN PE5 // TC1 - CS1
|
||||
//#define TEMP_0_CS_PIN PE6 // TC2 - CS2
|
||||
|
||||
//
|
||||
// Power Supply Control
|
||||
//
|
||||
#if ENABLED(MKS_PWC)
|
||||
#if ENABLED(TFT_LVGL_UI)
|
||||
#undef PSU_CONTROL
|
||||
#undef MKS_PWC
|
||||
#define SUICIDE_PIN PB2
|
||||
#define SUICIDE_PIN_STATE LOW
|
||||
#else
|
||||
#define PS_ON_PIN PB2 // PW_OFF
|
||||
#endif
|
||||
#define KILL_PIN PA2
|
||||
#define KILL_PIN_STATE HIGH
|
||||
#endif
|
||||
|
||||
//
|
||||
// Misc. Functions
|
||||
//
|
||||
#if HAS_TFT_LVGL_UI
|
||||
#define MT_DET_1_PIN PA4
|
||||
#define MT_DET_2_PIN PE6
|
||||
#define MT_DET_PIN_STATE LOW
|
||||
|
||||
#define WIFI_IO0_PIN PC13
|
||||
#define WIFI_IO1_PIN PC7
|
||||
#define WIFI_RESET_PIN PA5
|
||||
#else
|
||||
//#define POWER_LOSS_PIN PA2 // PW_DET
|
||||
//#define PS_ON_PIN PB2 // PW_OFF
|
||||
#define FIL_RUNOUT_PIN PA4
|
||||
#define FIL_RUNOUT2_PIN PE6
|
||||
#endif
|
||||
|
||||
//#define LED_PIN PB2
|
||||
|
||||
//
|
||||
// SD Card
|
||||
//
|
||||
#ifndef SDCARD_CONNECTION
|
||||
#define SDCARD_CONNECTION ONBOARD
|
||||
#endif
|
||||
|
||||
#define SDIO_SUPPORT
|
||||
#define SDIO_CLOCK 4500000 // 4.5 MHz
|
||||
#define SD_DETECT_PIN PD12
|
||||
#define ONBOARD_SD_CS_PIN PC11
|
||||
|
||||
//
|
||||
// LCD / Controller
|
||||
//
|
||||
#define BEEPER_PIN PC5
|
||||
|
||||
//
|
||||
// TFT with FSMC interface
|
||||
//
|
||||
#if HAS_FSMC_TFT
|
||||
/**
|
||||
* Note: MKS Robin TFT screens use various TFT controllers.
|
||||
* If the screen stays white, disable 'TFT_RESET_PIN'
|
||||
* to let the bootloader init the screen.
|
||||
*/
|
||||
#define TFT_RESET_PIN PC6 // FSMC_RST
|
||||
#define TFT_BACKLIGHT_PIN PD13
|
||||
|
||||
#define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h
|
||||
#define DOGLCD_SCK -1
|
||||
|
||||
#define TOUCH_CS_PIN PA7 // SPI2_NSS
|
||||
#define TOUCH_SCK_PIN PB13 // SPI2_SCK
|
||||
#define TOUCH_MISO_PIN PB14 // SPI2_MISO
|
||||
#define TOUCH_MOSI_PIN PB15 // SPI2_MOSI
|
||||
|
||||
#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT
|
||||
#define FSMC_CS_PIN PD7
|
||||
#define FSMC_RS_PIN PD11
|
||||
#define FSMC_DMA_DEV DMA2
|
||||
#define FSMC_DMA_CHANNEL DMA_CH5
|
||||
|
||||
#define TFT_CS_PIN FSMC_CS_PIN
|
||||
#define TFT_RS_PIN FSMC_RS_PIN
|
||||
|
||||
#define TOUCH_BUTTONS_HW_SPI
|
||||
#define TOUCH_BUTTONS_HW_SPI_DEVICE 2
|
||||
|
||||
#define TFT_BUFFER_SIZE 14400
|
||||
#endif
|
||||
|
||||
#define HAS_SPI_FLASH 1
|
||||
#if HAS_SPI_FLASH
|
||||
#define SPI_FLASH_SIZE 0x1000000 // 16MB
|
||||
#define SPI_FLASH_CS_PIN PB12
|
||||
#define SPI_FLASH_MOSI_PIN PB15
|
||||
#define SPI_FLASH_MISO_PIN PB14
|
||||
#define SPI_FLASH_SCK_PIN PB13
|
||||
#endif
|
||||
#include "pins_MKS_ROBIN_NANO_common.h"
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
/**
|
||||
* MKS Robin Nano board common pin assignments
|
||||
*/
|
||||
|
||||
#if HOTENDS > 2 || E_STEPPERS > 2
|
||||
#error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue."
|
||||
#endif
|
||||
|
||||
#define BOARD_NO_NATIVE_USB
|
||||
|
||||
// Avoid conflict with TIMER_SERVO when using the STM32 HAL
|
||||
#define TEMP_TIMER 5
|
||||
|
||||
//
|
||||
// EEPROM
|
||||
//
|
||||
#if ENABLED(SRAM_EEPROM_EMULATION)
|
||||
#undef NO_EEPROM_SELECTED
|
||||
#endif
|
||||
#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION)
|
||||
#define FLASH_EEPROM_EMULATION
|
||||
#define EEPROM_PAGE_SIZE (0x800U) // 2KB
|
||||
#define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL)
|
||||
#define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB
|
||||
#endif
|
||||
|
||||
#define SPI_DEVICE 2
|
||||
|
||||
//
|
||||
// Servos
|
||||
//
|
||||
#define SERVO0_PIN PA8 // Enable BLTOUCH
|
||||
|
||||
//
|
||||
// Limit Switches
|
||||
//
|
||||
#define X_STOP_PIN PA15
|
||||
#define Y_STOP_PIN PA12
|
||||
#define Z_MIN_PIN PA11
|
||||
#define Z_MAX_PIN PC4
|
||||
|
||||
//
|
||||
// Steppers
|
||||
//
|
||||
#define X_ENABLE_PIN PE4
|
||||
#define X_STEP_PIN PE3
|
||||
#define X_DIR_PIN PE2
|
||||
|
||||
#define Y_ENABLE_PIN PE1
|
||||
#define Y_STEP_PIN PE0
|
||||
#define Y_DIR_PIN PB9
|
||||
|
||||
#define Z_ENABLE_PIN PB8
|
||||
#define Z_STEP_PIN PB5
|
||||
#define Z_DIR_PIN PB4
|
||||
|
||||
#define E0_ENABLE_PIN PB3
|
||||
#define E0_STEP_PIN PD6
|
||||
#define E0_DIR_PIN PD3
|
||||
|
||||
#define E1_ENABLE_PIN PA3
|
||||
#define E1_STEP_PIN PA6
|
||||
#define E1_DIR_PIN PA1
|
||||
|
||||
//
|
||||
// Temperature Sensors
|
||||
//
|
||||
#define TEMP_0_PIN PC1 // TH1
|
||||
#define TEMP_1_PIN PC2 // TH2
|
||||
#define TEMP_BED_PIN PC0 // TB1
|
||||
|
||||
//
|
||||
// Heaters / Fans
|
||||
//
|
||||
#ifndef HEATER_0_PIN
|
||||
#define HEATER_0_PIN PC3
|
||||
#endif
|
||||
#if HOTENDS == 1 && DISABLED(HEATERS_PARALLEL)
|
||||
#ifndef FAN1_PIN
|
||||
#define FAN1_PIN PB0
|
||||
#endif
|
||||
#else
|
||||
#ifndef HEATER_1_PIN
|
||||
#define HEATER_1_PIN PB0
|
||||
#endif
|
||||
#endif
|
||||
#ifndef FAN_PIN
|
||||
#define FAN_PIN PB1 // FAN
|
||||
#endif
|
||||
#ifndef HEATER_BED_PIN
|
||||
#define HEATER_BED_PIN PA0
|
||||
#endif
|
||||
|
||||
//
|
||||
// Power Supply Control
|
||||
//
|
||||
#if ENABLED(MKS_PWC)
|
||||
#if ENABLED(TFT_LVGL_UI)
|
||||
#undef PSU_CONTROL
|
||||
#undef MKS_PWC
|
||||
#define SUICIDE_PIN PB2
|
||||
#define SUICIDE_PIN_STATE LOW
|
||||
#else
|
||||
#define PS_ON_PIN PB2 // PW_OFF
|
||||
#endif
|
||||
#define KILL_PIN PA2
|
||||
#define KILL_PIN_STATE HIGH
|
||||
#endif
|
||||
|
||||
//
|
||||
// Misc. Functions
|
||||
//
|
||||
#if HAS_TFT_LVGL_UI
|
||||
#define MT_DET_1_PIN PA4
|
||||
#define MT_DET_2_PIN PE6
|
||||
#define MT_DET_PIN_STATE LOW
|
||||
|
||||
#define WIFI_IO0_PIN PC13
|
||||
#define WIFI_IO1_PIN PC7
|
||||
#define WIFI_RESET_PIN PA5
|
||||
#else
|
||||
//#define POWER_LOSS_PIN PA2 // PW_DET
|
||||
//#define PS_ON_PIN PB2 // PW_OFF
|
||||
#define FIL_RUNOUT_PIN PA4
|
||||
#define FIL_RUNOUT2_PIN PE6
|
||||
#endif
|
||||
|
||||
//
|
||||
// SD Card
|
||||
//
|
||||
#ifndef SDCARD_CONNECTION
|
||||
#define SDCARD_CONNECTION ONBOARD
|
||||
#endif
|
||||
|
||||
#define SDIO_SUPPORT
|
||||
#define SDIO_CLOCK 4500000 // 4.5 MHz
|
||||
#define SD_DETECT_PIN PD12
|
||||
#define ONBOARD_SD_CS_PIN PC11
|
||||
|
||||
//
|
||||
// LCD / Controller
|
||||
//
|
||||
#define BEEPER_PIN PC5
|
||||
|
||||
//
|
||||
// TFT with FSMC interface
|
||||
//
|
||||
#if HAS_FSMC_TFT
|
||||
/**
|
||||
* Note: MKS Robin TFT screens use various TFT controllers.
|
||||
* If the screen stays white, disable 'TFT_RESET_PIN'
|
||||
* to let the bootloader init the screen.
|
||||
*/
|
||||
#define TFT_RESET_PIN PC6 // FSMC_RST
|
||||
#define TFT_BACKLIGHT_PIN PD13
|
||||
|
||||
#define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h
|
||||
#define DOGLCD_SCK -1
|
||||
|
||||
#define TOUCH_CS_PIN PA7 // SPI2_NSS
|
||||
#define TOUCH_SCK_PIN PB13 // SPI2_SCK
|
||||
#define TOUCH_MISO_PIN PB14 // SPI2_MISO
|
||||
#define TOUCH_MOSI_PIN PB15 // SPI2_MOSI
|
||||
|
||||
#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT
|
||||
#define FSMC_CS_PIN PD7
|
||||
#define FSMC_RS_PIN PD11
|
||||
#define FSMC_DMA_DEV DMA2
|
||||
#define FSMC_DMA_CHANNEL DMA_CH5
|
||||
|
||||
#define TFT_CS_PIN FSMC_CS_PIN
|
||||
#define TFT_RS_PIN FSMC_RS_PIN
|
||||
|
||||
#define TOUCH_BUTTONS_HW_SPI
|
||||
#define TOUCH_BUTTONS_HW_SPI_DEVICE 2
|
||||
|
||||
#define TFT_BUFFER_SIZE 14400
|
||||
#endif
|
||||
|
||||
#define HAS_SPI_FLASH 1
|
||||
#if HAS_SPI_FLASH
|
||||
#define SPI_FLASH_SIZE 0x1000000 // 16MB
|
||||
#define SPI_FLASH_CS_PIN PB12
|
||||
#define SPI_FLASH_MOSI_PIN PB15
|
||||
#define SPI_FLASH_MISO_PIN PB14
|
||||
#define SPI_FLASH_SCK_PIN PB13
|
||||
#endif
|
||||
@@ -38,8 +38,10 @@
|
||||
#define BOARD_INFO_NAME "Arm'ed"
|
||||
#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME
|
||||
|
||||
#define I2C_EEPROM
|
||||
#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
|
||||
#if NO_EEPROM_SELECTED
|
||||
#define I2C_EEPROM
|
||||
#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
|
||||
#endif
|
||||
|
||||
//
|
||||
// Limit Switches
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
/**
|
||||
* MKS Robin nano V1.3 (STM32F407VET6) board pin assignments
|
||||
* https://github.com/makerbase-mks/MKS-Robin-Nano-V1.X/tree/master/hardware
|
||||
*/
|
||||
|
||||
#define ALLOW_STM32DUINO
|
||||
#include "env_validate.h"
|
||||
|
||||
#define BOARD_INFO_NAME "MKS Robin Nano V1.3"
|
||||
|
||||
//
|
||||
// EEPROM
|
||||
// Use one of these or SDCard-based Emulation will be used
|
||||
//
|
||||
#if NO_EEPROM_SELECTED
|
||||
//#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation
|
||||
//#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation
|
||||
#endif
|
||||
|
||||
#define LED_PIN PB1
|
||||
|
||||
#include "../stm32f1/pins_MKS_ROBIN_NANO_common.h"
|
||||
@@ -67,11 +67,10 @@
|
||||
#define E0_DIAG_PIN PC4
|
||||
#define E1_DIAG_PIN PE7
|
||||
|
||||
//
|
||||
#define X_STOP_PIN PA15
|
||||
#define Y_STOP_PIN PD2
|
||||
#define Z_MIN_PIN PC8
|
||||
#define Z_MAX_PIN PC4
|
||||
#define X_STOP_PIN X_DIAG_PIN
|
||||
#define Y_STOP_PIN Y_DIAG_PIN
|
||||
#define Z_MIN_PIN Z_DIAG_PIN
|
||||
#define Z_MAX_PIN E0_DIAG_PIN
|
||||
|
||||
//
|
||||
// Steppers
|
||||
|
||||
@@ -352,7 +352,6 @@ platform = ${stm32_variant.platform}
|
||||
extends = stm32_variant
|
||||
board = genericSTM32F103ZE
|
||||
board_build.variant = MARLIN_F103Zx
|
||||
board_build.offset = 0x7000
|
||||
build_flags = ${stm32_variant.build_flags}
|
||||
-DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5
|
||||
build_unflags = ${stm32_variant.build_unflags}
|
||||
|
||||
@@ -464,3 +464,27 @@ board_upload.offset_address = 0x0800C000
|
||||
build_flags = ${stm32_variant.build_flags} -DHSE_VALUE=12000000U -O0
|
||||
debug_tool = stlink
|
||||
upload_protocol = stlink
|
||||
|
||||
#
|
||||
# BOARD_MKS_ROBIN_NANO_V1_3_F4
|
||||
# - MKS Robin Nano V1.3 (STM32F407VET6) 5 Pololu Plug
|
||||
# - MKS Robin Nano-S V1.3 (STM32F407VET6) 4 TMC2225 + 1 Pololu Plug
|
||||
#
|
||||
[env:mks_robin_nano_v1_3_f4]
|
||||
platform = ${common_stm32.platform}
|
||||
extends = stm32_variant
|
||||
board = marlin_STM32F407VGT6_CCM
|
||||
board_build.variant = MARLIN_F4x7Vx
|
||||
board_build.offset = 0x8000
|
||||
board_upload.offset_address = 0x08008000
|
||||
board_build.rename = Robin_nano35.bin
|
||||
build_flags = ${stm32_variant.build_flags}
|
||||
-DMCU_STM32F407VE -DSS_TIMER=4 -DENABLE_HWSERIAL3
|
||||
-DSTM32_FLASH_SIZE=512
|
||||
-DTIMER_TONE=TIM3 -DTIMER_SERVO=TIM2
|
||||
-DHAL_SD_MODULE_ENABLED
|
||||
-DHAL_SRAM_MODULE_ENABLED
|
||||
build_unflags = ${stm32_variant.build_unflags}
|
||||
-DUSBCON -DUSBD_USE_CDC
|
||||
debug_tool = jlink
|
||||
upload_protocol = jlink
|
||||
|
||||
Reference in New Issue
Block a user