Merge branch 'bugfix-2.0.x' into Raptor_2.0.X_Devel
This commit is contained in:
@@ -119,8 +119,4 @@ jobs:
|
||||
|
||||
- name: Run ${{ matrix.test-platform }} Tests
|
||||
run: |
|
||||
# Inline tests script
|
||||
chmod +x buildroot/bin/*
|
||||
chmod +x buildroot/tests/*
|
||||
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH}
|
||||
run_tests . ${{ matrix.test-platform }}
|
||||
make tests-single-ci TEST_TARGET=${{ matrix.test-platform }}
|
||||
|
||||
+13
-6
@@ -148,7 +148,7 @@ Marlin/*/*/*/*/readme.txt
|
||||
# Secure Credentials
|
||||
Configuration_Secure.h
|
||||
|
||||
#Visual Studio
|
||||
# Visual Studio
|
||||
*.sln
|
||||
*.vcxproj
|
||||
*.vcxproj.user
|
||||
@@ -159,27 +159,34 @@ __vm/
|
||||
.vs/
|
||||
vc-fileutils.settings
|
||||
|
||||
#Visual Studio Code
|
||||
# Visual Studio Code
|
||||
.vscode
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/*.db
|
||||
|
||||
#cmake
|
||||
# cmake
|
||||
CMakeLists.txt
|
||||
src/CMakeLists.txt
|
||||
CMakeListsPrivate.txt
|
||||
|
||||
#CLion
|
||||
# CLion
|
||||
cmake-build-*
|
||||
|
||||
#Eclipse
|
||||
# Eclipse
|
||||
.project
|
||||
.cproject
|
||||
.pydevproject
|
||||
.settings
|
||||
.classpath
|
||||
|
||||
#Python
|
||||
# Python
|
||||
__pycache__
|
||||
|
||||
# IOLogger logs
|
||||
*_log.csv
|
||||
|
||||
# Simulation / Native
|
||||
eeprom.dat
|
||||
imgui.ini
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
help:
|
||||
@echo "Tasks for local development:"
|
||||
@echo "* tests-single-ci: Run a single test from inside the CI"
|
||||
@echo "* tests-single-local: Run a single test locally"
|
||||
@echo "* tests-single-local-docker: Run a single test locally, using docker-compose"
|
||||
@echo "* tests-all-local: Run all tests locally"
|
||||
@echo "* tests-all-local-docker: Run all tests locally, using docker-compose"
|
||||
@echo "* setup-local-docker: Setup local docker-compose"
|
||||
@echo ""
|
||||
@echo "Options for testing:"
|
||||
@echo " TEST_TARGET Set when running tests-single-*, to select the"
|
||||
@echo " test. If you set it to ALL it will run all "
|
||||
@echo " tests, but some of them are broken: use "
|
||||
@echo " tests-all-* instead to run only the ones that "
|
||||
@echo " run on GitHub CI"
|
||||
@echo " ONLY_TEST Limit tests to only those that contain this, or"
|
||||
@echo " the index of the test (1-based)"
|
||||
@echo " VERBOSE_PLATFORMIO If you want the full PIO output, set any value"
|
||||
@echo " GIT_RESET_HARD Used by CI: reset all local changes. WARNING:"
|
||||
@echo " THIS WILL UNDO ANY CHANGES YOU'VE MADE!"
|
||||
.PHONY: help
|
||||
|
||||
tests-single-ci:
|
||||
export GIT_RESET_HARD=true
|
||||
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET)
|
||||
.PHONY: tests-single-ci
|
||||
|
||||
tests-single-local:
|
||||
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local" ; return 1; fi
|
||||
chmod +x buildroot/bin/*
|
||||
chmod +x buildroot/tests/*
|
||||
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
|
||||
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
||||
&& run_tests . $(TEST_TARGET) "$(ONLY_TEST)"
|
||||
.PHONY: tests-single-local
|
||||
|
||||
tests-single-local-docker:
|
||||
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local-docker" ; return 1; fi
|
||||
docker-compose run --rm marlin $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
|
||||
.PHONY: tests-single-local-docker
|
||||
|
||||
tests-all-local:
|
||||
chmod +x buildroot/bin/*
|
||||
chmod +x buildroot/tests/*
|
||||
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
|
||||
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
||||
&& for TEST_TARGET in $$(./get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done
|
||||
.PHONY: tests-all-local
|
||||
|
||||
tests-all-local-docker:
|
||||
docker-compose run --rm marlin $(MAKE) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD)
|
||||
.PHONY: tests-all-local-docker
|
||||
|
||||
setup-local-docker:
|
||||
docker-compose build
|
||||
.PHONY: setup-local-docker
|
||||
+41
-35
@@ -274,33 +274,19 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants.
|
||||
* Multi-Material Unit
|
||||
* Set to one of these predefined models:
|
||||
*
|
||||
* This device allows one stepper driver on a control board to drive
|
||||
* two to eight stepper motors, one at a time, in a manner suitable
|
||||
* for extruders.
|
||||
*
|
||||
* This option only allows the multiplexer to switch on tool-change.
|
||||
* Additional options to configure custom E moves are pending.
|
||||
*/
|
||||
//#define MK2_MULTIPLEXER
|
||||
#if ENABLED(MK2_MULTIPLEXER)
|
||||
// Override the default DIO selector pins here, if needed.
|
||||
// Some pins files may provide defaults for these pins.
|
||||
//#define E_MUX0_PIN 40 // Always Required
|
||||
//#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs
|
||||
//#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Průša Multi-Material Unit v2
|
||||
* PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version)
|
||||
* PRUSA_MMU2 : Průša MMU2
|
||||
* PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5)
|
||||
* SMUFF_EMU_MMU2 : Technik Gegg SMUFF (Průša MMU2 emulation mode)
|
||||
* SMUFF_EMU_MMU2S : Technik Gegg SMUFF (Průša MMU2S emulation mode)
|
||||
*
|
||||
* Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails.
|
||||
* Requires EXTRUDERS = 5
|
||||
*
|
||||
* For additional configuration see Configuration_adv.h
|
||||
* See additional options in Configuration_adv.h.
|
||||
*/
|
||||
//#define PRUSA_MMU2
|
||||
//#define MMU_MODEL PRUSA_MMU2
|
||||
|
||||
// A dual extruder that uses a single stepper motor
|
||||
//#define SWITCHING_EXTRUDER
|
||||
@@ -505,8 +491,10 @@
|
||||
* 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE"
|
||||
* 15 : 100k thermistor calibration for JGAurora A5 hotend
|
||||
* 18 : ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327
|
||||
* 20 : Pt100 with circuit in the Ultimainboard V2.x with 5v excitation (AVR)
|
||||
* 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v excitation (STM32 \ LPC176x....)
|
||||
* 20 : Pt100 with circuit in the Ultimainboard V2.x with mainboard ADC reference voltage = INA826 amplifier-board supply voltage.
|
||||
* NOTES: (1) Must use an ADC input with no pullup. (2) Some INA826 amplifiers are unreliable at 3.3V so consider using sensor 147, 110, or 21.
|
||||
* 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v ADC reference voltage (STM32, LPC176x....) and 5V INA826 amplifier board supply.
|
||||
* NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C.
|
||||
* 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB)
|
||||
* 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB)
|
||||
* 30 : Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K / B3950 (4.7k pullup)
|
||||
@@ -564,11 +552,11 @@
|
||||
#define DUMMY_THERMISTOR_998_VALUE 25
|
||||
#define DUMMY_THERMISTOR_999_VALUE 100
|
||||
|
||||
// Resistor values when using a MAX31865 (sensor -5)
|
||||
// Sensor value is typically 100 (PT100) or 1000 (PT1000)
|
||||
// Calibration value is typically 430 ohm for AdaFruit PT100 modules and 4300 ohm for AdaFruit PT1000 modules.
|
||||
//#define MAX31865_SENSOR_OHMS 100
|
||||
//#define MAX31865_CALIBRATION_OHMS 430
|
||||
// Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1
|
||||
//#define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000)
|
||||
//#define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for AdaFruit PT100; 4300 for AdaFruit PT1000
|
||||
//#define MAX31865_SENSOR_OHMS_1 100
|
||||
//#define MAX31865_CALIBRATION_OHMS_1 430
|
||||
|
||||
// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings
|
||||
// from the two sensors differ too much the print will be aborted.
|
||||
@@ -1468,7 +1456,25 @@
|
||||
#define FIL_RUNOUT_STATE LOW // set to true to invert the logic of the sensor.
|
||||
#endif
|
||||
#define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins.
|
||||
//#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins.
|
||||
#define FIL_RUNOUT_PULL // Use internal pullup / pulldown for filament runout pins.
|
||||
|
||||
// Override individually if the runout sensors vary
|
||||
//#define FIL_RUNOUT1_STATE LOW
|
||||
//#define FIL_RUNOUT1_PULL
|
||||
//#define FIL_RUNOUT2_STATE LOW
|
||||
//#define FIL_RUNOUT2_PULL
|
||||
//#define FIL_RUNOUT3_STATE LOW
|
||||
//#define FIL_RUNOUT3_PULL
|
||||
//#define FIL_RUNOUT4_STATE LOW
|
||||
//#define FIL_RUNOUT4_PULL
|
||||
//#define FIL_RUNOUT5_STATE LOW
|
||||
//#define FIL_RUNOUT5_PULL
|
||||
//#define FIL_RUNOUT6_STATE LOW
|
||||
//#define FIL_RUNOUT6_PULL
|
||||
//#define FIL_RUNOUT7_STATE LOW
|
||||
//#define FIL_RUNOUT7_PULL
|
||||
//#define FIL_RUNOUT8_STATE LOW
|
||||
//#define FIL_RUNOUT8_PULL
|
||||
|
||||
// Set one or more commands to execute on filament runout.
|
||||
// (After 'M412 H' Marlin will ask the host to handle the process.)
|
||||
@@ -2630,10 +2636,10 @@
|
||||
|
||||
#define TOUCH_SCREEN_CALIBRATION
|
||||
|
||||
//#define XPT2046_X_CALIBRATION 12316
|
||||
//#define XPT2046_Y_CALIBRATION -8981
|
||||
//#define XPT2046_X_OFFSET -43
|
||||
//#define XPT2046_Y_OFFSET 257
|
||||
//#define TOUCH_CALIBRATION_X 12316
|
||||
//#define TOUCH_CALIBRATION_Y -8981
|
||||
//#define TOUCH_OFFSET_X -43
|
||||
//#define TOUCH_OFFSET_Y 257
|
||||
|
||||
#if ENABLED(TFT_COLOR_UI)
|
||||
//#define SINGLE_TOUCH_NAVIGATION
|
||||
|
||||
+51
-24
@@ -647,6 +647,9 @@
|
||||
|
||||
// Default x offset in duplication mode (typically set to half print bed width)
|
||||
#define DEFAULT_DUPLICATION_X_OFFSET 100
|
||||
|
||||
// Default action to execute following M605 mode change commands. Typically G28X to apply new mode.
|
||||
//#define EVENT_GCODE_IDEX_AFTER_MODECHANGE "G28X"
|
||||
#endif
|
||||
|
||||
// Activate a solenoid on the active extruder with M380. Disable all with M381.
|
||||
@@ -670,6 +673,7 @@
|
||||
|
||||
#define QUICK_HOME // If G28 contains XY do a diagonal move first
|
||||
//#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X
|
||||
//#define HOME_Z_FIRST // Home Z first. Requires a Z-MIN endstop (not a probe).
|
||||
//#define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first
|
||||
|
||||
// @section bltouch
|
||||
@@ -823,6 +827,7 @@
|
||||
|
||||
//#define ASSISTED_TRAMMING_MENU_ITEM // Add a menu item to run G35 Assisted Tramming (MarlinUI)
|
||||
//#define ASSISTED_TRAMMING_WIZARD // Make the menu item open a Tramming Wizard sub-menu
|
||||
//#define ASSISTED_TRAMMING_WAIT_POSITION { X_CENTER, Y_CENTER, 30 } // Move the nozzle out of the way for adjustment
|
||||
|
||||
/**
|
||||
* Screw thread:
|
||||
@@ -1095,6 +1100,7 @@
|
||||
//#define PROBE_OFFSET_WIZARD
|
||||
#if ENABLED(PROBE_OFFSET_WIZARD)
|
||||
#define PROBE_OFFSET_START -4.0 // Estimated nozzle-to-probe Z offset, plus a little extra
|
||||
//#define PROBE_OFFSET_WIZARD_XY_POS XY_CENTER // Set a convenient position to do the measurement
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1186,6 +1192,7 @@
|
||||
// Enable this option and set to HIGH if your SD cards are incorrectly detected.
|
||||
#define SD_DETECT_STATE HIGH
|
||||
|
||||
//#define SD_IGNORE_AT_STARTUP // Don't mount the SD card when starting up
|
||||
//#define SDCARD_READONLY // Read-only SD card (to save over 2K of flash)
|
||||
|
||||
#define SD_PROCEDURE_DEPTH 1 // Increase if you need more nested M32 calls
|
||||
@@ -1201,6 +1208,8 @@
|
||||
|
||||
//#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files
|
||||
|
||||
//#define BROWSE_MEDIA_ON_INSERT // Open the file browser when media is inserted
|
||||
|
||||
#define EVENT_GCODE_SD_ABORT "G28XY" // G-code to run on SD Abort Print (e.g., "G28XY" or "G27")
|
||||
|
||||
#if ENABLED(PRINTER_EVENT_LEDS)
|
||||
@@ -1272,6 +1281,10 @@
|
||||
// Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
|
||||
#endif
|
||||
|
||||
// Allow international symbols in long filenames. To display correctly, the
|
||||
// LCD's font must contain the characters. Check your selected LCD language.
|
||||
//#define UTF_FILENAME_SUPPORT
|
||||
|
||||
// This allows hosts to request long names for files and folders with M33
|
||||
#define LONG_FILENAME_HOST_SUPPORT
|
||||
|
||||
@@ -3511,7 +3524,7 @@
|
||||
#define GANTRY_CALIBRATION_FEEDRATE 500 // Feedrate for correction move
|
||||
//#define GANTRY_CALIBRATION_TO_MIN // Enable to calibrate Z in the MIN direction
|
||||
|
||||
//#define GANTRY_CALIBRATION_SAFE_POSITION { X_CENTER, Y_CENTER } // Safe position for nozzle
|
||||
//#define GANTRY_CALIBRATION_SAFE_POSITION XY_CENTER // Safe position for nozzle
|
||||
//#define GANTRY_CALIBRATION_XY_PARK_FEEDRATE 3000 // XY Park Feedrate - MMM
|
||||
//#define GANTRY_CALIBRATION_COMMANDS_PRE ""
|
||||
#define GANTRY_CALIBRATION_COMMANDS_POST "G28" // G28 highly recommended to ensure an accurate position
|
||||
@@ -3593,11 +3606,24 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Průša Multi-Material Unit v2
|
||||
* Průša Multi-Material Unit (MMU)
|
||||
* Enable in Configuration.h
|
||||
*
|
||||
* These devices allow a single stepper driver on the board to drive
|
||||
* multi-material feeders with any number of stepper motors.
|
||||
*/
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
|
||||
#if HAS_PRUSA_MMU1
|
||||
/**
|
||||
* This option only allows the multiplexer to switch on tool-change.
|
||||
* Additional options to configure custom E moves are pending.
|
||||
*
|
||||
* Override the default DIO selector pins here, if needed.
|
||||
* Some pins files may provide defaults for these pins.
|
||||
*/
|
||||
//#define E_MUX0_PIN 40 // Always Required
|
||||
//#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs
|
||||
//#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs
|
||||
#elif HAS_PRUSA_MMU2
|
||||
// Serial port used for communication with MMU2.
|
||||
// For AVR enable the UART port used for the MMU. (e.g., mmuSerial)
|
||||
// For 32-bit boards check your HAL for available serial ports. (e.g., Serial2)
|
||||
@@ -3615,7 +3641,7 @@
|
||||
|
||||
// Add an LCD menu for MMU2
|
||||
//#define MMU2_MENUS
|
||||
#if ENABLED(MMU2_MENUS)
|
||||
#if EITHER(MMU2_MENUS, HAS_PRUSA_MMU2S)
|
||||
// Settings for filament load / unload from the LCD menu.
|
||||
// This is for Průša MK3-style extruders. Customize for your hardware.
|
||||
#define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0
|
||||
@@ -3640,29 +3666,12 @@
|
||||
{ -50.0, 2000 }
|
||||
#endif
|
||||
|
||||
/**
|
||||
* MMU Extruder Sensor
|
||||
*
|
||||
* Support for a Průša (or other) IR Sensor to detect filament near the extruder
|
||||
* and make loading more reliable. Suitable for an extruder equipped with a filament
|
||||
* sensor less than 38mm from the gears.
|
||||
*
|
||||
* During loading the extruder will stop when the sensor is triggered, then do a last
|
||||
* move up to the gears. If no filament is detected, the MMU2 can make some more attempts.
|
||||
* If all attempts fail, a filament runout will be triggered.
|
||||
*/
|
||||
//#define MMU_EXTRUDER_SENSOR
|
||||
#if ENABLED(MMU_EXTRUDER_SENSOR)
|
||||
#define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Using a sensor like the MMU2S
|
||||
* This mode requires a MK3S extruder with a sensor at the extruder idler, like the MMU2S.
|
||||
* See https://help.prusa3d.com/en/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560, step 11
|
||||
*/
|
||||
//#define PRUSA_MMU2_S_MODE
|
||||
#if ENABLED(PRUSA_MMU2_S_MODE)
|
||||
#if HAS_PRUSA_MMU2S
|
||||
#define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries)
|
||||
|
||||
#define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/min)
|
||||
@@ -3678,11 +3687,29 @@
|
||||
#define MMU2_CAN_LOAD_INCREMENT_SEQUENCE \
|
||||
{ -MMU2_CAN_LOAD_INCREMENT, MMU2_CAN_LOAD_FEEDRATE }
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
* MMU1 Extruder Sensor
|
||||
*
|
||||
* Support for a Průša (or other) IR Sensor to detect filament near the extruder
|
||||
* and make loading more reliable. Suitable for an extruder equipped with a filament
|
||||
* sensor less than 38mm from the gears.
|
||||
*
|
||||
* During loading the extruder will stop when the sensor is triggered, then do a last
|
||||
* move up to the gears. If no filament is detected, the MMU2 can make some more attempts.
|
||||
* If all attempts fail, a filament runout will be triggered.
|
||||
*/
|
||||
//#define MMU_EXTRUDER_SENSOR
|
||||
#if ENABLED(MMU_EXTRUDER_SENSOR)
|
||||
#define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
//#define MMU2_DEBUG // Write debug info to serial output
|
||||
|
||||
#endif // PRUSA_MMU2
|
||||
#endif // HAS_PRUSA_MMU2
|
||||
|
||||
/**
|
||||
* Advanced Print Counter settings
|
||||
|
||||
@@ -163,6 +163,9 @@
|
||||
#define SET_INPUT(IO) _SET_INPUT(IO)
|
||||
// Set pin as input with pullup (wrapper)
|
||||
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
||||
// Set pin as input with pulldown (substitution)
|
||||
#define SET_INPUT_PULLDOWN SET_INPUT
|
||||
|
||||
// Set pin as output (wrapper) - reads the pin and sets the output to that value
|
||||
#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
|
||||
// Set pin as PWM
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
// Set pin as input with pullup wrapper
|
||||
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
||||
|
||||
// Set pin as input with pulldown (substitution)
|
||||
#define SET_INPUT_PULLDOWN SET_INPUT
|
||||
|
||||
// Set pin as output wrapper
|
||||
#define SET_OUTPUT(IO) do{ _SET_OUTPUT(IO); }while(0)
|
||||
|
||||
|
||||
@@ -19,22 +19,23 @@
|
||||
*/
|
||||
#ifdef __PLAT_LINUX__
|
||||
|
||||
extern void setup();
|
||||
extern void loop();
|
||||
|
||||
#include <thread>
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
//#define GPIO_LOGGING // Full GPIO and Positional Logging
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include "../shared/Delay.h"
|
||||
#include "hardware/IOLoggerCSV.h"
|
||||
#include "hardware/Heater.h"
|
||||
#include "hardware/LinearAxis.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <thread>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
extern void setup();
|
||||
extern void loop();
|
||||
|
||||
// simple stdout / stdin implementation for fake serial port
|
||||
void write_serial_thread() {
|
||||
for (;;) {
|
||||
@@ -64,8 +65,6 @@ void simulation_loop() {
|
||||
LinearAxis z_axis(Z_ENABLE_PIN, Z_DIR_PIN, Z_STEP_PIN, Z_MIN_PIN, Z_MAX_PIN);
|
||||
LinearAxis extruder0(E0_ENABLE_PIN, E0_DIR_PIN, E0_STEP_PIN, P_NC, P_NC);
|
||||
|
||||
//#define GPIO_LOGGING // Full GPIO and Positional Logging
|
||||
|
||||
#ifdef GPIO_LOGGING
|
||||
IOLoggerCSV logger("all_gpio_log.csv");
|
||||
Gpio::attachLogger(&logger);
|
||||
@@ -88,7 +87,7 @@ void simulation_loop() {
|
||||
|
||||
#ifdef GPIO_LOGGING
|
||||
if (x_axis.position != x || y_axis.position != y || z_axis.position != z) {
|
||||
uint64_t update = MAX3(x_axis.last_update, y_axis.last_update, z_axis.last_update);
|
||||
uint64_t update = _MAX(x_axis.last_update, y_axis.last_update, z_axis.last_update);
|
||||
position_log << update << ", " << x_axis.position << ", " << y_axis.position << ", " << z_axis.position << std::endl;
|
||||
position_log.flush();
|
||||
x = x_axis.position;
|
||||
|
||||
@@ -20,3 +20,7 @@
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#if DISABLED(NO_SD_HOST_DRIVE)
|
||||
#define HAS_SD_HOST_DRIVE 1
|
||||
#endif
|
||||
|
||||
@@ -97,8 +97,8 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
||||
#define IS_RX0(P) (P == P0_03)
|
||||
#if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI)
|
||||
#error "Serial port pins (0) conflict with Trinamic SPI pins!"
|
||||
#elif ENABLED(MK2_MULTIPLEXER) && (IS_TX0(E_MUX1_PIN) || IS_RX0(E_MUX0_PIN))
|
||||
#error "Serial port pins (0) conflict with MK2 multiplexer pins!"
|
||||
#elif HAS_PRUSA_MMU1 && (IS_TX0(E_MUX1_PIN) || IS_RX0(E_MUX0_PIN))
|
||||
#error "Serial port pins (0) conflict with Multi-Material-Unit multiplexer pins!"
|
||||
#elif (AXIS_HAS_SPI(X) && IS_TX0(X_CS_PIN)) || (AXIS_HAS_SPI(Y) && IS_RX0(Y_CS_PIN))
|
||||
#error "Serial port pins (0) conflict with X/Y axis SPI pins!"
|
||||
#endif
|
||||
|
||||
@@ -35,10 +35,11 @@ extern "C" {
|
||||
#include <debug_frmwrk.h>
|
||||
}
|
||||
|
||||
#include "../../sd/cardreader.h"
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
#include "../../core/millis_t.h"
|
||||
|
||||
#include "../../sd/cardreader.h"
|
||||
|
||||
extern uint32_t MSC_SD_Init(uint8_t pdrv);
|
||||
extern "C" int isLPC1769();
|
||||
extern "C" void disk_timerproc();
|
||||
@@ -122,7 +123,7 @@ void HAL_init() {
|
||||
delay(1000); // Give OS time to notice
|
||||
USB_Connect(TRUE);
|
||||
|
||||
#if DISABLED(NO_SD_HOST_DRIVE)
|
||||
#if HAS_SD_HOST_DRIVE
|
||||
MSC_SD_Init(0); // Enable USB SD card access
|
||||
#endif
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#if HAS_TFT_XPT2046 || HAS_TOUCH_XPT2046
|
||||
#if HAS_TFT_XPT2046 || HAS_TOUCH_BUTTONS
|
||||
|
||||
#include "xpt2046.h"
|
||||
#include <SPI.h>
|
||||
|
||||
@@ -23,63 +23,50 @@ def print_error(e):
|
||||
%(e, env.get('PIOENV')))
|
||||
|
||||
try:
|
||||
#
|
||||
# Find a disk for upload
|
||||
#
|
||||
upload_disk = 'Disk not found'
|
||||
target_file_found = False
|
||||
target_drive_found = False
|
||||
if current_OS == 'Windows':
|
||||
#
|
||||
# platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:'
|
||||
# Windows - doesn't care about the disk's name, only cares about the drive letter
|
||||
#
|
||||
|
||||
#
|
||||
# get all drives on this computer
|
||||
#
|
||||
import subprocess
|
||||
# typical result (string): 'Drives: C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\'
|
||||
driveStr = str(subprocess.check_output("fsutil fsinfo drives"))
|
||||
# typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\'
|
||||
# driveStr = driveStr.strip().lstrip('Drives: ') <- Doesn't work in other Languages as English. In German is "Drives:" = "Laufwerke:"
|
||||
FirstFound = driveStr.find(':',0,-1) # Find the first ":" and
|
||||
driveStr = driveStr[FirstFound + 1 : -1] # truncate to the rest
|
||||
# typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\',
|
||||
# 'G:\\', 'H:\\', 'I:\\', 'J:\\', 'K:\\', 'L:\\', 'M:\\', 'Y:\\', 'Z:\\']
|
||||
drives = driveStr.split()
|
||||
from ctypes import windll
|
||||
import string
|
||||
|
||||
# getting list of drives
|
||||
# https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python
|
||||
drives = []
|
||||
bitmask = windll.kernel32.GetLogicalDrives()
|
||||
for letter in string.ascii_uppercase:
|
||||
if bitmask & 1:
|
||||
drives.append(letter)
|
||||
bitmask >>= 1
|
||||
|
||||
upload_disk = 'Disk not found'
|
||||
target_file_found = False
|
||||
target_drive_found = False
|
||||
for drive in drives:
|
||||
final_drive_name = drive.strip().rstrip('\\') # typical result (string): 'C:'
|
||||
final_drive_name = drive + ':\\'
|
||||
# print ('disc check: {}'.format(final_drive_name))
|
||||
try:
|
||||
volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
|
||||
except Exception as e:
|
||||
print ('error:{}'.format(e))
|
||||
continue
|
||||
else:
|
||||
if target_drive in volume_info and target_file_found == False: # set upload if not found target file yet
|
||||
if target_drive in volume_info and not target_file_found: # set upload if not found target file yet
|
||||
target_drive_found = True
|
||||
upload_disk = final_drive_name
|
||||
if target_filename in volume_info:
|
||||
if target_file_found == False:
|
||||
if not target_file_found:
|
||||
upload_disk = final_drive_name
|
||||
target_file_found = True
|
||||
|
||||
#
|
||||
# set upload_port to drive if found
|
||||
#
|
||||
|
||||
if target_file_found == True or target_drive_found == True:
|
||||
env.Replace(
|
||||
UPLOAD_PORT=upload_disk
|
||||
)
|
||||
print('upload disk: ', upload_disk)
|
||||
else:
|
||||
print_error('Autodetect Error')
|
||||
|
||||
elif current_OS == 'Linux':
|
||||
#
|
||||
# platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive'
|
||||
#
|
||||
upload_disk = 'Disk not found'
|
||||
target_file_found = False
|
||||
target_drive_found = False
|
||||
drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser()))
|
||||
if target_drive in drives: # If target drive is found, use it.
|
||||
target_drive_found = True
|
||||
@@ -101,22 +88,15 @@ try:
|
||||
|
||||
if target_file_found or target_drive_found:
|
||||
env.Replace(
|
||||
UPLOAD_FLAGS="-P$UPLOAD_PORT",
|
||||
UPLOAD_PORT=upload_disk
|
||||
UPLOAD_FLAGS="-P$UPLOAD_PORT"
|
||||
)
|
||||
print('upload disk: ', upload_disk)
|
||||
else:
|
||||
print_error('Autodetect Error')
|
||||
|
||||
elif current_OS == 'Darwin': # MAC
|
||||
#
|
||||
# platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive'
|
||||
#
|
||||
upload_disk = 'Disk not found'
|
||||
drives = os.listdir('/Volumes') # human readable names
|
||||
target_file_found = False
|
||||
target_drive_found = False
|
||||
if target_drive in drives and target_file_found == False: # set upload if not found target file yet
|
||||
if target_drive in drives and not target_file_found: # set upload if not found target file yet
|
||||
target_drive_found = True
|
||||
upload_disk = '/Volumes/' + target_drive + '/'
|
||||
for drive in drives:
|
||||
@@ -126,20 +106,18 @@ try:
|
||||
continue
|
||||
else:
|
||||
if target_filename in filenames:
|
||||
if target_file_found == False:
|
||||
if not target_file_found:
|
||||
upload_disk = '/Volumes/' + drive + '/'
|
||||
target_file_found = True
|
||||
#
|
||||
# set upload_port to drive if found
|
||||
#
|
||||
|
||||
if target_file_found == True or target_drive_found == True:
|
||||
env.Replace(
|
||||
UPLOAD_PORT=upload_disk
|
||||
)
|
||||
print('\nupload disk: ', upload_disk, '\n')
|
||||
else:
|
||||
print_error('Autodetect Error')
|
||||
#
|
||||
# Set upload_port to drive if found
|
||||
#
|
||||
if target_file_found or target_drive_found:
|
||||
env.Replace(UPLOAD_PORT=upload_disk)
|
||||
print('\nUpload disk: ', upload_disk, '\n')
|
||||
else:
|
||||
print_error('Autodetect Error')
|
||||
|
||||
except Exception as e:
|
||||
print_error(str(e))
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
#error "ERROR - Only STM32F103xE, STM32F103xG, STM32F4xx or STM32F7xx CPUs supported"
|
||||
#endif
|
||||
|
||||
#ifdef USBD_USE_CDC_COMPOSITE
|
||||
#if HAS_SD_HOST_DRIVE
|
||||
|
||||
// use USB drivers
|
||||
|
||||
|
||||
@@ -20,3 +20,7 @@
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#if defined(USBD_USE_CDC_COMPOSITE) && DISABLED(NO_SD_HOST_DRIVE)
|
||||
#define HAS_SD_HOST_DRIVE 1
|
||||
#endif
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
// Public Variables
|
||||
// ------------------------
|
||||
|
||||
#if (defined(SERIAL_USB) && !defined(USE_USB_COMPOSITE))
|
||||
#if defined(SERIAL_USB) && !HAS_SD_HOST_DRIVE
|
||||
USBSerial SerialUSB;
|
||||
#endif
|
||||
|
||||
@@ -251,7 +251,7 @@ void HAL_init() {
|
||||
#if PIN_EXISTS(LED)
|
||||
OUT_WRITE(LED_PIN, LOW);
|
||||
#endif
|
||||
#ifdef USE_USB_COMPOSITE
|
||||
#if HAS_SD_HOST_DRIVE
|
||||
MSC_SD_init();
|
||||
#endif
|
||||
#if PIN_EXISTS(USB_CONNECT)
|
||||
@@ -263,17 +263,15 @@ void HAL_init() {
|
||||
|
||||
// HAL idle task
|
||||
void HAL_idletask() {
|
||||
#ifdef USE_USB_COMPOSITE
|
||||
#if HAS_SHARED_MEDIA
|
||||
// If Marlin is using the SD card we need to lock it to prevent access from
|
||||
// a PC via USB.
|
||||
// Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but
|
||||
// this will not reliably detect delete operations. To be safe we will lock
|
||||
// the disk if Marlin has it mounted. Unfortunately there is currently no way
|
||||
// to unmount the disk from the LCD menu.
|
||||
// if (IS_SD_PRINTING() || IS_SD_FILE_OPEN())
|
||||
/* copy from lpc1768 framework, should be fixed later for process HAS_SHARED_MEDIA*/
|
||||
#endif
|
||||
#if HAS_SHARED_MEDIA
|
||||
// If Marlin is using the SD card we need to lock it to prevent access from
|
||||
// a PC via USB.
|
||||
// Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but
|
||||
// this will not reliably detect delete operations. To be safe we will lock
|
||||
// the disk if Marlin has it mounted. Unfortunately there is currently no way
|
||||
// to unmount the disk from the LCD menu.
|
||||
// if (IS_SD_PRINTING() || IS_SD_FILE_OPEN())
|
||||
/* copy from lpc1768 framework, should be fixed later for process HAS_SD_HOST_DRIVE*/
|
||||
// process USB mass storage device class loop
|
||||
MarlinMSC.loop();
|
||||
#endif
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
|
||||
#ifdef USE_USB_COMPOSITE
|
||||
#if HAS_SD_HOST_DRIVE
|
||||
#include "msc_sd.h"
|
||||
#endif
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
#endif
|
||||
|
||||
#ifdef SERIAL_USB
|
||||
#ifndef USE_USB_COMPOSITE
|
||||
#if !HAS_SD_HOST_DRIVE
|
||||
#define UsbSerial Serial
|
||||
#else
|
||||
#define UsbSerial MarlinCompositeSerial
|
||||
|
||||
@@ -111,7 +111,9 @@ constexpr bool serial_handles_emergency(int port) {
|
||||
// Instantiate all UARTs even if they are not needed
|
||||
// This avoids a bunch of logic to figure out every serial
|
||||
// port which may be in use on the system.
|
||||
DEFINE_HWSERIAL_MARLIN(MSerial1, 1);
|
||||
#if DISABLED(MKS_WIFI_MODULE)
|
||||
DEFINE_HWSERIAL_MARLIN(MSerial1, 1);
|
||||
#endif
|
||||
DEFINE_HWSERIAL_MARLIN(MSerial2, 2);
|
||||
DEFINE_HWSERIAL_MARLIN(MSerial3, 3);
|
||||
#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY)
|
||||
|
||||
@@ -147,15 +147,15 @@ SPIClass::SPIClass(uint32_t spi_num) {
|
||||
_currentSetting->state = SPI_STATE_IDLE;
|
||||
}
|
||||
|
||||
SPIClass::SPIClass(int8_t mosi, int8_t miso, int8_t sclk, int8_t ssel) {
|
||||
SPIClass::SPIClass(int8_t mosi, int8_t miso, int8_t sclk, int8_t ssel) : SPIClass(1) {
|
||||
#if BOARD_NR_SPI >= 1
|
||||
if (mosi == BOARD_SPI1_MOSI_PIN) SPIClass(1);
|
||||
if (mosi == BOARD_SPI1_MOSI_PIN) setModule(1);
|
||||
#endif
|
||||
#if BOARD_NR_SPI >= 2
|
||||
if (mosi == BOARD_SPI2_MOSI_PIN) SPIClass(2);
|
||||
if (mosi == BOARD_SPI2_MOSI_PIN) setModule(2);
|
||||
#endif
|
||||
#if BOARD_NR_SPI >= 3
|
||||
if (mosi == BOARD_SPI3_MOSI_PIN) SPIClass(3);
|
||||
if (mosi == BOARD_SPI3_MOSI_PIN) setModule(3);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -20,8 +20,3 @@
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#if ENABLED(USE_USB_COMPOSITE)
|
||||
//#warning "SD_CHECK_AND_RETRY isn't needed with USE_USB_COMPOSITE."
|
||||
#undef SD_CHECK_AND_RETRY
|
||||
#endif
|
||||
|
||||
@@ -20,3 +20,11 @@
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#ifdef USE_USB_COMPOSITE
|
||||
//#warning "SD_CHECK_AND_RETRY isn't needed with USE_USB_COMPOSITE."
|
||||
#undef SD_CHECK_AND_RETRY
|
||||
#if DISABLED(NO_SD_HOST_DRIVE)
|
||||
#define HAS_SD_HOST_DRIVE 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#if defined(__STM32F1__) && defined(USE_USB_COMPOSITE)
|
||||
#if defined(__STM32F1__) && HAS_SD_HOST_DRIVE
|
||||
|
||||
#include "msc_sd.h"
|
||||
#include "SPI.h"
|
||||
@@ -77,4 +77,4 @@ void MSC_SD_init() {
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // __STM32F1__ && USE_USB_COMPOSITE
|
||||
#endif // __STM32F1__ && HAS_SD_HOST_DRIVE
|
||||
|
||||
@@ -21,10 +21,11 @@
|
||||
#include "SPI.h"
|
||||
#include "fastio.h"
|
||||
|
||||
#if HAS_SHARED_MEDIA
|
||||
#ifndef ONBOARD_SPI_DEVICE
|
||||
#define ONBOARD_SPI_DEVICE SPI_DEVICE
|
||||
#endif
|
||||
#ifndef ONBOARD_SPI_DEVICE
|
||||
#define ONBOARD_SPI_DEVICE SPI_DEVICE
|
||||
#endif
|
||||
|
||||
#if HAS_SD_HOST_DRIVE
|
||||
#define ONBOARD_SD_SPI SPI
|
||||
#else
|
||||
SPIClass OnboardSPI(ONBOARD_SPI_DEVICE);
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#if HAS_TFT_XPT2046 || HAS_TOUCH_XPT2046
|
||||
#if HAS_TFT_XPT2046 || HAS_TOUCH_BUTTONS
|
||||
|
||||
#include "xpt2046.h"
|
||||
#include <SPI.h>
|
||||
|
||||
+24
-15
@@ -60,7 +60,7 @@
|
||||
#include "sd/cardreader.h"
|
||||
|
||||
#include "lcd/marlinui.h"
|
||||
#if HAS_TOUCH_XPT2046
|
||||
#if HAS_TOUCH_BUTTONS
|
||||
#include "lcd/touch/touch_buttons.h"
|
||||
#endif
|
||||
|
||||
@@ -213,8 +213,8 @@
|
||||
#include "feature/controllerfan.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#include "feature/mmu2/mmu2.h"
|
||||
#if HAS_PRUSA_MMU2
|
||||
#include "feature/mmu/mmu2.h"
|
||||
#endif
|
||||
|
||||
#if HAS_L64XX
|
||||
@@ -713,9 +713,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
|
||||
TERN_(HAS_FILAMENT_SENSOR, runout.run());
|
||||
|
||||
// Run HAL idle tasks
|
||||
#ifdef HAL_IDLETASK
|
||||
HAL_idletask();
|
||||
#endif
|
||||
TERN_(HAL_IDLETASK, HAL_idletask());
|
||||
|
||||
// Check network connection
|
||||
TERN_(HAS_ETHERNET, ethernet.check());
|
||||
@@ -772,7 +770,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
|
||||
#endif
|
||||
|
||||
// Update the Průša MMU2
|
||||
TERN_(PRUSA_MMU2, mmu2.mmu_loop());
|
||||
TERN_(HAS_PRUSA_MMU2, mmu2.mmu_loop());
|
||||
|
||||
// Handle Joystick jogging
|
||||
TERN_(POLL_JOG, joystick.inject_jog_moves());
|
||||
@@ -780,9 +778,8 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
|
||||
// Direct Stepping
|
||||
TERN_(DIRECT_STEPPING, page_manager.write_responses());
|
||||
|
||||
#if HAS_TFT_LVGL_UI
|
||||
LV_TASK_HANDLER();
|
||||
#endif
|
||||
// Update the LVGL interface
|
||||
TERN_(HAS_TFT_LVGL_UI, LV_TASK_HANDLER());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -982,7 +979,7 @@ void setup() {
|
||||
#endif
|
||||
SERIAL_ECHO_MSG("start");
|
||||
|
||||
#if BOTH(HAS_TFT_LVGL_UI, USE_WIFI_FUNCTION)
|
||||
#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE)
|
||||
mks_esp_wifi_init();
|
||||
WIFISERIAL.begin(WIFI_BAUDRATE);
|
||||
serial_connect_timeout = millis() + 1000UL;
|
||||
@@ -991,6 +988,14 @@ void setup() {
|
||||
|
||||
SETUP_RUN(HAL_init());
|
||||
|
||||
// Init and disable SPI thermocouples
|
||||
#if HEATER_0_USES_MAX6675
|
||||
OUT_WRITE(MAX6675_SS_PIN, HIGH); // Disable
|
||||
#endif
|
||||
#if HEATER_1_USES_MAX6675
|
||||
OUT_WRITE(MAX6675_SS2_PIN, HIGH); // Disable
|
||||
#endif
|
||||
|
||||
#if HAS_L64XX
|
||||
SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers
|
||||
#endif
|
||||
@@ -1101,7 +1106,7 @@ void setup() {
|
||||
SETUP_RUN(ethernet.init());
|
||||
#endif
|
||||
|
||||
#if HAS_TOUCH_XPT2046
|
||||
#if HAS_TOUCH_BUTTONS
|
||||
SETUP_RUN(touch.init());
|
||||
#endif
|
||||
|
||||
@@ -1179,8 +1184,8 @@ void setup() {
|
||||
SETUP_RUN(caselight.update_brightness());
|
||||
#endif
|
||||
|
||||
#if ENABLED(MK2_MULTIPLEXER)
|
||||
SETUP_LOG("MK2_MULTIPLEXER");
|
||||
#if HAS_PRUSA_MMU1
|
||||
SETUP_LOG("Prusa MMU1");
|
||||
SET_OUTPUT(E_MUX0_PIN);
|
||||
SET_OUTPUT(E_MUX1_PIN);
|
||||
SET_OUTPUT(E_MUX2_PIN);
|
||||
@@ -1260,7 +1265,7 @@ void setup() {
|
||||
SETUP_RUN(test_tmc_connection(true, true, true, true));
|
||||
#endif
|
||||
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#if HAS_PRUSA_MMU2
|
||||
SETUP_RUN(mmu2.init());
|
||||
#endif
|
||||
|
||||
@@ -1299,6 +1304,10 @@ void setup() {
|
||||
SETUP_RUN(password.lock_machine()); // Will not proceed until correct password provided
|
||||
#endif
|
||||
|
||||
#if BOTH(HAS_LCD_MENU, TOUCH_SCREEN_CALIBRATION) && EITHER(TFT_CLASSIC_UI, TFT_COLOR_UI)
|
||||
ui.check_touch_calibration();
|
||||
#endif
|
||||
|
||||
marlin_state = MF_RUNNING;
|
||||
|
||||
SETUP_LOG("setup() completed.");
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
#define BOARD_RAMPS_S_12_EEFB 1157 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
|
||||
#define BOARD_RAMPS_S_12_EEEB 1158 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
|
||||
#define BOARD_RAMPS_S_12_EFFB 1159 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
|
||||
#define BOARD_RAMPS_LONGER3D_LK4PRO 1160 // Longer LKxxPRO/ Alfawise UxxPro (PRO version)
|
||||
|
||||
//
|
||||
// RAMBo and derivatives
|
||||
@@ -243,6 +244,7 @@
|
||||
#define BOARD_BTT_SKR_V1_4_TURBO 2508 // BigTreeTech SKR v1.4 TURBO (Power outputs: Hotend0, Hotend1, Fan, Bed)
|
||||
#define BOARD_MKS_SGEN_L_V2 2509 // MKS SGEN_L V2 (Power outputs: Hotend0, Hotend1, Bed, Fan)
|
||||
#define BOARD_BTT_SKR_E3_TURBO 2510 // BigTreeTech SKR E3 Turbo (Power outputs: Hotend0, Hotend1, Bed, Fan0, Fan1)
|
||||
#define BOARD_FLY_CDY 2511 // FLY_CDY (Power outputs: Hotend0, Hotend1, Hotend2, Bed, Fan0, Fan1, Fan2)
|
||||
|
||||
//
|
||||
// SAM3X8E ARM Cortex M3
|
||||
|
||||
@@ -380,6 +380,10 @@
|
||||
#define LCD_STR_E6 "E" LCD_STR_N6
|
||||
#define LCD_STR_E7 "E" LCD_STR_N7
|
||||
|
||||
// Use superscripts, if possible. Evaluated at point of use.
|
||||
#define SUPERSCRIPT_TWO TERN(NOT_EXTENDED_ISO10646_1_5X7, "^2", "²")
|
||||
#define SUPERSCRIPT_THREE TERN(NOT_EXTENDED_ISO10646_1_5X7, "^3", "³")
|
||||
|
||||
#include "multi_language.h" // Allow multiple languages
|
||||
|
||||
#include "../lcd/language/language_en.h"
|
||||
|
||||
@@ -303,14 +303,14 @@ extern uint8_t marlin_debug_flags;
|
||||
void serial_echopair_PGM(PGM_P const s_P, const char *v);
|
||||
void serial_echopair_PGM(PGM_P const s_P, char v);
|
||||
void serial_echopair_PGM(PGM_P const s_P, int v);
|
||||
void serial_echopair_PGM(PGM_P const s_P, unsigned int v);
|
||||
void serial_echopair_PGM(PGM_P const s_P, long v);
|
||||
void serial_echopair_PGM(PGM_P const s_P, unsigned long v);
|
||||
void serial_echopair_PGM(PGM_P const s_P, float v);
|
||||
void serial_echopair_PGM(PGM_P const s_P, double v);
|
||||
void serial_echopair_PGM(PGM_P const s_P, unsigned int v);
|
||||
void serial_echopair_PGM(PGM_P const s_P, unsigned long v);
|
||||
inline void serial_echopair_PGM(PGM_P const s_P, uint8_t v) { serial_echopair_PGM(s_P, (int)v); }
|
||||
inline void serial_echopair_PGM(PGM_P const s_P, bool v) { serial_echopair_PGM(s_P, (int)v); }
|
||||
inline void serial_echopair_PGM(PGM_P const s_P, void *v) { serial_echopair_PGM(s_P, (unsigned long)v); }
|
||||
inline void serial_echopair_PGM(PGM_P const s_P, void *v) { serial_echopair_PGM(s_P, (uintptr_t)v); }
|
||||
|
||||
void serialprintPGM(PGM_P str);
|
||||
void serial_echo_start();
|
||||
|
||||
@@ -161,6 +161,14 @@ void print_bilinear_leveling_grid() {
|
||||
#define LINEAR_EXTRAPOLATION(E, I) ((E) * 2 - (I))
|
||||
float bed_level_virt_coord(const uint8_t x, const uint8_t y) {
|
||||
uint8_t ep = 0, ip = 1;
|
||||
if (x > GRID_MAX_POINTS_X + 1 || y > GRID_MAX_POINTS_Y + 1) {
|
||||
// The requested point requires extrapolating two points beyond the mesh.
|
||||
// These values are only requested for the edges of the mesh, which are always an actual mesh point,
|
||||
// and do not require interpolation. When interpolation is not needed, this "Mesh + 2" point is
|
||||
// cancelled out in bed_level_virt_cmr and does not impact the result. Return 0.0 rather than
|
||||
// making this function more complex by extrapolating two points.
|
||||
return 0.0;
|
||||
}
|
||||
if (!x || x == ABL_TEMP_POINTS_X - 1) {
|
||||
if (x) {
|
||||
ep = GRID_MAX_POINTS_X - 1;
|
||||
|
||||
@@ -62,7 +62,7 @@ class unified_bed_leveling {
|
||||
#if IS_NEWPANEL
|
||||
static void move_z_with_encoder(const float &multiplier);
|
||||
static float measure_point_with_encoder();
|
||||
static float measure_business_card_thickness(float in_height);
|
||||
static float measure_business_card_thickness();
|
||||
static void manually_probe_remaining_mesh(const xy_pos_t&, const float&, const float&, const bool) _O0;
|
||||
static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0;
|
||||
#endif
|
||||
|
||||
@@ -484,7 +484,7 @@
|
||||
}
|
||||
|
||||
if (parser.seen('B')) {
|
||||
g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(float(Z_CLEARANCE_BETWEEN_PROBES));
|
||||
g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness();
|
||||
if (ABS(g29_card_thickness) > 1.5f) {
|
||||
SERIAL_ECHOLNPGM("?Error in Business Card measurement.");
|
||||
return;
|
||||
@@ -837,11 +837,11 @@
|
||||
|
||||
static void echo_and_take_a_measurement() { SERIAL_ECHOLNPGM(" and take a measurement."); }
|
||||
|
||||
float unified_bed_leveling::measure_business_card_thickness(float in_height) {
|
||||
float unified_bed_leveling::measure_business_card_thickness() {
|
||||
ui.capture();
|
||||
save_ubl_active_state_and_disable(); // Disable bed level correction for probing
|
||||
|
||||
do_blocking_move_to(0.5f * (MESH_MAX_X - (MESH_MIN_X)), 0.5f * (MESH_MAX_Y - (MESH_MIN_Y)), in_height);
|
||||
do_blocking_move_to(0.5f * (MESH_MAX_X - (MESH_MIN_X)), 0.5f * (MESH_MAX_Y - (MESH_MIN_Y)), MANUAL_PROBE_START_Z);
|
||||
//, _MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]) * 0.5f);
|
||||
planner.synchronize();
|
||||
|
||||
|
||||
@@ -123,8 +123,8 @@ uint8_t MCP4728::getDrvPct(const uint8_t channel) { return uint8_t(100.0 * dac_v
|
||||
* Receives all Drive strengths as 0-100 percent values, updates
|
||||
* DAC Values array and calls fastwrite to update the DAC.
|
||||
*/
|
||||
void MCP4728::setDrvPct(xyze_uint8_t &pct) {
|
||||
dac_values *= pct.asFloat() * 0.01f * (DAC_STEPPER_MAX);
|
||||
void MCP4728::setDrvPct(xyze_uint_t &pct) {
|
||||
dac_values = pct * (DAC_STEPPER_MAX) * 0.01f;
|
||||
fastWrite();
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ public:
|
||||
static uint8_t fastWrite();
|
||||
static uint8_t simpleCommand(const byte simpleCommand);
|
||||
static uint8_t getDrvPct(const uint8_t channel);
|
||||
static void setDrvPct(xyze_uint8_t &pct);
|
||||
static void setDrvPct(xyze_uint_t &pct);
|
||||
};
|
||||
|
||||
extern MCP4728 mcp4728;
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
bool dac_present = false;
|
||||
constexpr xyze_uint8_t dac_order = DAC_STEPPER_ORDER;
|
||||
xyze_uint8_t dac_channel_pct = DAC_MOTOR_CURRENT_DEFAULT;
|
||||
xyze_uint_t dac_channel_pct = DAC_MOTOR_CURRENT_DEFAULT;
|
||||
|
||||
StepperDAC stepper_dac;
|
||||
|
||||
@@ -72,8 +72,8 @@ void StepperDAC::set_current_percent(const uint8_t channel, float val) {
|
||||
set_current_value(channel, _MIN(val, 100.0f) * (DAC_STEPPER_MAX) / 100.0f);
|
||||
}
|
||||
|
||||
static float dac_perc(int8_t n) { return 100.0 * mcp4728.getValue(dac_order[n]) * RECIPROCAL(DAC_STEPPER_MAX); }
|
||||
static float dac_amps(int8_t n) { return mcp4728.getDrvPct(dac_order[n]) * (DAC_STEPPER_MAX) * 0.125 * RECIPROCAL(DAC_STEPPER_SENSE); }
|
||||
static float dac_perc(int8_t n) { return mcp4728.getDrvPct(dac_order[n]); }
|
||||
static float dac_amps(int8_t n) { return mcp4728.getValue(dac_order[n]) * 0.125 * RECIPROCAL(DAC_STEPPER_SENSE * 1000); }
|
||||
|
||||
uint8_t StepperDAC::get_current_percent(const AxisEnum axis) { return mcp4728.getDrvPct(dac_order[axis]); }
|
||||
void StepperDAC::set_current_percents(xyze_uint8_t &pct) {
|
||||
|
||||
@@ -41,6 +41,7 @@ PrinterEventLEDs printerEventLEDs;
|
||||
uint8_t PrinterEventLEDs::old_intensity = 0;
|
||||
|
||||
inline uint8_t pel_intensity(const float &start, const float ¤t, const float &target) {
|
||||
if (uint16_t(start) == uint16_t(target)) return 255;
|
||||
return (uint8_t)map(constrain(current, start, target), start, target, 0.f, 255.f);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,9 +20,9 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../inc/MarlinConfig.h"
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
|
||||
#if ENABLED(MK2_MULTIPLEXER)
|
||||
#if HAS_PRUSA_MMU1
|
||||
|
||||
#include "../module/stepper.h"
|
||||
|
||||
@@ -35,4 +35,4 @@ void select_multiplexed_stepper(const uint8_t e) {
|
||||
safe_delay(100);
|
||||
}
|
||||
|
||||
#endif // MK2_MULTIPLEXER
|
||||
#endif // HAS_PRUSA_MMU1
|
||||
+1
-1
@@ -26,7 +26,7 @@ Now we are sure MMU is available and ready. If there was a timeout or other comm
|
||||
|
||||
- *Firmware version* is an integer value, but we don't care about it
|
||||
- *Build number* is an integer value and has to be >=126, or =>132 if 12V mode is enabled
|
||||
- *FINDA status* is 1 if the is filament loaded to the extruder, 0 otherwise
|
||||
- *FINDA status* is 1 if the filament is loaded to the extruder, 0 otherwise
|
||||
|
||||
|
||||
*Build number* is checked against the required value, if it does not match, printer is halted.
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#if HAS_PRUSA_MMU2
|
||||
|
||||
#include "mmu2.h"
|
||||
#include "../../lcd/menu/menu_mmu2.h"
|
||||
@@ -94,7 +94,7 @@ MMU2 mmu2;
|
||||
#define mmuSerial MMU2_SERIAL
|
||||
|
||||
bool MMU2::enabled, MMU2::ready, MMU2::mmu_print_saved;
|
||||
#if ENABLED(PRUSA_MMU2_S_MODE)
|
||||
#if HAS_PRUSA_MMU2S
|
||||
bool MMU2::mmu2s_triggered;
|
||||
#endif
|
||||
uint8_t MMU2::cmd, MMU2::cmd_arg, MMU2::last_cmd, MMU2::extruder;
|
||||
@@ -105,23 +105,19 @@ int16_t MMU2::version = -1, MMU2::buildnr = -1;
|
||||
millis_t MMU2::prev_request, MMU2::prev_P0_request;
|
||||
char MMU2::rx_buffer[MMU_RX_SIZE], MMU2::tx_buffer[MMU_TX_SIZE];
|
||||
|
||||
#if BOTH(HAS_LCD_MENU, MMU2_MENUS)
|
||||
struct E_Step {
|
||||
float extrude; //!< extrude distance in mm
|
||||
feedRate_t feedRate; //!< feed rate in mm/s
|
||||
};
|
||||
|
||||
struct E_Step {
|
||||
float extrude; //!< extrude distance in mm
|
||||
feedRate_t feedRate; //!< feed rate in mm/s
|
||||
};
|
||||
|
||||
static constexpr E_Step
|
||||
ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE }
|
||||
, load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE }
|
||||
#if ENABLED(PRUSA_MMU2_S_MODE)
|
||||
, can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE }
|
||||
, can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE }
|
||||
#endif
|
||||
;
|
||||
|
||||
#endif // MMU2_MENUS
|
||||
static constexpr E_Step
|
||||
ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE }
|
||||
, load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE }
|
||||
#if HAS_PRUSA_MMU2S
|
||||
, can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE }
|
||||
, can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE }
|
||||
#endif
|
||||
;
|
||||
|
||||
MMU2::MMU2() {
|
||||
rx_buffer[0] = '\0';
|
||||
@@ -162,8 +158,8 @@ uint8_t MMU2::get_current_tool() {
|
||||
return extruder == MMU2_NO_TOOL ? -1 : extruder;
|
||||
}
|
||||
|
||||
#if EITHER(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR)
|
||||
#define FILAMENT_PRESENT() (READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_STATE)
|
||||
#if EITHER(HAS_PRUSA_MMU2S, MMU_EXTRUDER_SENSOR)
|
||||
#define FILAMENT_PRESENT() (READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE)
|
||||
#endif
|
||||
|
||||
void MMU2::mmu_loop() {
|
||||
@@ -188,7 +184,7 @@ void MMU2::mmu_loop() {
|
||||
|
||||
case -2:
|
||||
if (rx_ok()) {
|
||||
sscanf(rx_buffer, "%uok\n", &version);
|
||||
sscanf(rx_buffer, "%huok\n", &version);
|
||||
|
||||
DEBUG_ECHOLNPAIR("MMU => ", version, "\nMMU <= 'S2'");
|
||||
|
||||
@@ -199,7 +195,7 @@ void MMU2::mmu_loop() {
|
||||
|
||||
case -3:
|
||||
if (rx_ok()) {
|
||||
sscanf(rx_buffer, "%uok\n", &buildnr);
|
||||
sscanf(rx_buffer, "%huok\n", &buildnr);
|
||||
|
||||
DEBUG_ECHOLNPAIR("MMU => ", buildnr);
|
||||
|
||||
@@ -242,7 +238,7 @@ void MMU2::mmu_loop() {
|
||||
|
||||
enabled = true;
|
||||
state = 1;
|
||||
TERN_(PRUSA_MMU2_S_MODE, mmu2s_triggered = false);
|
||||
TERN_(HAS_PRUSA_MMU2S, mmu2s_triggered = false);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -307,7 +303,7 @@ void MMU2::mmu_loop() {
|
||||
state = 2; // wait for response
|
||||
}
|
||||
|
||||
TERN_(PRUSA_MMU2_S_MODE, check_filament());
|
||||
TERN_(HAS_PRUSA_MMU2S, check_filament());
|
||||
break;
|
||||
|
||||
case 2: // response to command P0
|
||||
@@ -324,7 +320,7 @@ void MMU2::mmu_loop() {
|
||||
else if (ELAPSED(millis(), prev_request + MMU_P0_TIMEOUT)) // Resend request after timeout (3s)
|
||||
state = 1;
|
||||
|
||||
TERN_(PRUSA_MMU2_S_MODE, check_filament());
|
||||
TERN_(HAS_PRUSA_MMU2S, check_filament());
|
||||
break;
|
||||
|
||||
case 3: // response to mmu commands
|
||||
@@ -340,9 +336,9 @@ void MMU2::mmu_loop() {
|
||||
#endif
|
||||
|
||||
if (rx_ok()) {
|
||||
// Response to C0 mmu command in PRUSA_MMU2_S_MODE
|
||||
// Response to C0 mmu command in MMU2S model
|
||||
bool can_reset = true;
|
||||
#if ENABLED(PRUSA_MMU2_S_MODE)
|
||||
#if HAS_PRUSA_MMU2S
|
||||
if (!mmu2s_triggered && last_cmd == MMU_CMD_C0) {
|
||||
can_reset = false;
|
||||
// MMU ok received but filament sensor not triggered, retrying...
|
||||
@@ -367,7 +363,7 @@ void MMU2::mmu_loop() {
|
||||
}
|
||||
state = 1;
|
||||
}
|
||||
TERN_(PRUSA_MMU2_S_MODE, check_filament());
|
||||
TERN_(HAS_PRUSA_MMU2S, check_filament());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -487,7 +483,7 @@ static void mmu2_not_responding() {
|
||||
BUZZ(100, 659);
|
||||
}
|
||||
|
||||
#if ENABLED(PRUSA_MMU2_S_MODE)
|
||||
#if HAS_PRUSA_MMU2S
|
||||
|
||||
bool MMU2::load_to_gears() {
|
||||
command(MMU_CMD_C0);
|
||||
@@ -541,33 +537,38 @@ static void mmu2_not_responding() {
|
||||
* Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated.
|
||||
*/
|
||||
void MMU2::tool_change(const char* special) {
|
||||
|
||||
if (!enabled) return;
|
||||
|
||||
#if ENABLED(MMU2_MENUS)
|
||||
if (!enabled) return;
|
||||
|
||||
set_runout_valid(false);
|
||||
|
||||
switch (*special) {
|
||||
case '?': {
|
||||
uint8_t index = mmu2_choose_filament();
|
||||
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100);
|
||||
load_filament_to_nozzle(index);
|
||||
#if ENABLED(MMU2_MENUS)
|
||||
const uint8_t index = mmu2_choose_filament();
|
||||
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100);
|
||||
load_filament_to_nozzle(index);
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
#endif
|
||||
} break;
|
||||
|
||||
case 'x': {
|
||||
planner.synchronize();
|
||||
uint8_t index = mmu2_choose_filament();
|
||||
DISABLE_AXIS_E0();
|
||||
command(MMU_CMD_T0 + index);
|
||||
manage_response(true, true);
|
||||
#if ENABLED(MMU2_MENUS)
|
||||
planner.synchronize();
|
||||
const uint8_t index = mmu2_choose_filament();
|
||||
DISABLE_AXIS_E0();
|
||||
command(MMU_CMD_T0 + index);
|
||||
manage_response(true, true);
|
||||
|
||||
if (load_to_gears()) {
|
||||
mmu_loop();
|
||||
ENABLE_AXIS_E0();
|
||||
extruder = index;
|
||||
active_extruder = 0;
|
||||
}
|
||||
if (load_to_gears()) {
|
||||
mmu_loop();
|
||||
ENABLE_AXIS_E0();
|
||||
extruder = index;
|
||||
active_extruder = 0;
|
||||
}
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
#endif
|
||||
} break;
|
||||
|
||||
case 'c': {
|
||||
@@ -577,8 +578,6 @@ static void mmu2_not_responding() {
|
||||
}
|
||||
|
||||
set_runout_valid(true);
|
||||
|
||||
#endif // MMU2_MENUS
|
||||
}
|
||||
|
||||
#elif ENABLED(MMU_EXTRUDER_SENSOR)
|
||||
@@ -628,20 +627,23 @@ static void mmu2_not_responding() {
|
||||
void MMU2::tool_change(const char* special) {
|
||||
if (!enabled) return;
|
||||
|
||||
#if ENABLED(MMU2_MENUS)
|
||||
set_runout_valid(false);
|
||||
|
||||
set_runout_valid(false);
|
||||
|
||||
switch (*special) {
|
||||
case '?': {
|
||||
DEBUG_ECHOLNPGM("case ?\n");
|
||||
switch (*special) {
|
||||
case '?': {
|
||||
DEBUG_ECHOLNPGM("case ?\n");
|
||||
#if ENABLED(MMU2_MENUS)
|
||||
uint8_t index = mmu2_choose_filament();
|
||||
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100);
|
||||
load_filament_to_nozzle(index);
|
||||
} break;
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
#endif
|
||||
} break;
|
||||
|
||||
case 'x': {
|
||||
DEBUG_ECHOLNPGM("case x\n");
|
||||
case 'x': {
|
||||
DEBUG_ECHOLNPGM("case x\n");
|
||||
#if ENABLED(MMU2_MENUS)
|
||||
planner.synchronize();
|
||||
uint8_t index = mmu2_choose_filament();
|
||||
DISABLE_AXIS_E0();
|
||||
@@ -654,18 +656,19 @@ static void mmu2_not_responding() {
|
||||
ENABLE_AXIS_E0();
|
||||
extruder = index;
|
||||
active_extruder = 0;
|
||||
} break;
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
#endif
|
||||
} break;
|
||||
|
||||
case 'c': {
|
||||
DEBUG_ECHOLNPGM("case c\n");
|
||||
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100);
|
||||
execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence));
|
||||
} break;
|
||||
}
|
||||
case 'c': {
|
||||
DEBUG_ECHOLNPGM("case c\n");
|
||||
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100);
|
||||
execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence));
|
||||
} break;
|
||||
}
|
||||
|
||||
set_runout_valid(true);
|
||||
|
||||
#endif // MMU2_MENUS
|
||||
set_runout_valid(true);
|
||||
}
|
||||
|
||||
void MMU2::mmu_continue_loading() {
|
||||
@@ -682,68 +685,74 @@ static void mmu2_not_responding() {
|
||||
mmu_idl_sens = 0;
|
||||
}
|
||||
|
||||
#elif DISABLED(MMU_EXTRUDER_SENSOR) && DISABLED(PRUSA_MMU2_S_MODE)
|
||||
#else // !HAS_PRUSA_MMU2S && !MMU_EXTRUDER_SENSOR
|
||||
|
||||
/**
|
||||
* Handle tool change
|
||||
*/
|
||||
void MMU2::tool_change(const uint8_t index) {
|
||||
if (!enabled) return;
|
||||
/**
|
||||
* Handle tool change
|
||||
*/
|
||||
void MMU2::tool_change(const uint8_t index) {
|
||||
if (!enabled) return;
|
||||
|
||||
set_runout_valid(false);
|
||||
set_runout_valid(false);
|
||||
|
||||
if (index != extruder) {
|
||||
DISABLE_AXIS_E0();
|
||||
ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1));
|
||||
command(MMU_CMD_T0 + index);
|
||||
manage_response(true, true);
|
||||
command(MMU_CMD_C0);
|
||||
extruder = index; //filament change is finished
|
||||
active_extruder = 0;
|
||||
ENABLE_AXIS_E0();
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder));
|
||||
ui.reset_status();
|
||||
if (index != extruder) {
|
||||
DISABLE_AXIS_E0();
|
||||
ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1));
|
||||
command(MMU_CMD_T0 + index);
|
||||
manage_response(true, true);
|
||||
command(MMU_CMD_C0);
|
||||
extruder = index; //filament change is finished
|
||||
active_extruder = 0;
|
||||
ENABLE_AXIS_E0();
|
||||
SERIAL_ECHO_START();
|
||||
SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder));
|
||||
ui.reset_status();
|
||||
}
|
||||
|
||||
set_runout_valid(true);
|
||||
}
|
||||
|
||||
set_runout_valid(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle special T?/Tx/Tc commands
|
||||
*
|
||||
* T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically
|
||||
* Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load.
|
||||
* Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated.
|
||||
*/
|
||||
void MMU2::tool_change(const char* special) {
|
||||
if (!enabled) return;
|
||||
|
||||
#if ENABLED(MMU2_MENUS)
|
||||
/**
|
||||
* Handle special T?/Tx/Tc commands
|
||||
*
|
||||
* T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically
|
||||
* Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load.
|
||||
* Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated.
|
||||
*/
|
||||
void MMU2::tool_change(const char* special) {
|
||||
if (!enabled) return;
|
||||
|
||||
set_runout_valid(false);
|
||||
|
||||
switch (*special) {
|
||||
case '?': {
|
||||
DEBUG_ECHOLNPGM("case ?\n");
|
||||
uint8_t index = mmu2_choose_filament();
|
||||
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100);
|
||||
load_filament_to_nozzle(index);
|
||||
#if ENABLED(MMU2_MENUS)
|
||||
uint8_t index = mmu2_choose_filament();
|
||||
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100);
|
||||
load_filament_to_nozzle(index);
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
#endif
|
||||
} break;
|
||||
|
||||
case 'x': {
|
||||
DEBUG_ECHOLNPGM("case x\n");
|
||||
planner.synchronize();
|
||||
uint8_t index = mmu2_choose_filament();
|
||||
DISABLE_AXIS_E0();
|
||||
command(MMU_CMD_T0 + index);
|
||||
manage_response(true, true);
|
||||
command(MMU_CMD_C0);
|
||||
mmu_loop();
|
||||
#if ENABLED(MMU2_MENUS)
|
||||
planner.synchronize();
|
||||
uint8_t index = mmu2_choose_filament();
|
||||
DISABLE_AXIS_E0();
|
||||
command(MMU_CMD_T0 + index);
|
||||
manage_response(true, true);
|
||||
command(MMU_CMD_C0);
|
||||
mmu_loop();
|
||||
|
||||
ENABLE_AXIS_E0();
|
||||
extruder = index;
|
||||
active_extruder = 0;
|
||||
ENABLE_AXIS_E0();
|
||||
extruder = index;
|
||||
active_extruder = 0;
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
#endif
|
||||
} break;
|
||||
|
||||
case 'c': {
|
||||
@@ -754,11 +763,9 @@ void MMU2::tool_change(const char* special) {
|
||||
}
|
||||
|
||||
set_runout_valid(true);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // MMU_EXTRUDER_SENSOR
|
||||
#endif // HAS_PRUSA_MMU2S
|
||||
|
||||
/**
|
||||
* Set next command
|
||||
@@ -866,7 +873,7 @@ void MMU2::filament_runout() {
|
||||
planner.synchronize();
|
||||
}
|
||||
|
||||
#if ENABLED(PRUSA_MMU2_S_MODE)
|
||||
#if HAS_PRUSA_MMU2S
|
||||
|
||||
void MMU2::check_filament() {
|
||||
const bool present = FILAMENT_PRESENT();
|
||||
@@ -907,162 +914,159 @@ void MMU2::filament_runout() {
|
||||
DEBUG_ECHOLNPGM(" succeeded.");
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if BOTH(HAS_LCD_MENU, MMU2_MENUS)
|
||||
// Load filament into MMU2
|
||||
void MMU2::load_filament(const uint8_t index) {
|
||||
if (!enabled) return;
|
||||
command(MMU_CMD_L0 + index);
|
||||
manage_response(false, false);
|
||||
BUZZ(200, 404);
|
||||
}
|
||||
|
||||
// Load filament into MMU2
|
||||
void MMU2::load_filament(const uint8_t index) {
|
||||
if (!enabled) return;
|
||||
command(MMU_CMD_L0 + index);
|
||||
/**
|
||||
* Switch material and load to nozzle
|
||||
*/
|
||||
bool MMU2::load_filament_to_nozzle(const uint8_t index) {
|
||||
|
||||
if (!enabled) return false;
|
||||
|
||||
if (thermalManager.tooColdToExtrude(active_extruder)) {
|
||||
BUZZ(200, 404);
|
||||
LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD);
|
||||
return false;
|
||||
}
|
||||
|
||||
command(MMU_CMD_T0 + index);
|
||||
manage_response(true, true);
|
||||
|
||||
const bool success = load_to_gears();
|
||||
if (success) {
|
||||
mmu_loop();
|
||||
extruder = index;
|
||||
active_extruder = 0;
|
||||
load_to_nozzle();
|
||||
BUZZ(200, 404);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load filament to nozzle of multimaterial printer
|
||||
*
|
||||
* This function is used only only after T? (user select filament) and M600 (change filament).
|
||||
* It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading
|
||||
* filament to nozzle.
|
||||
*/
|
||||
void MMU2::load_to_nozzle() {
|
||||
if (!enabled) return;
|
||||
execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence));
|
||||
}
|
||||
|
||||
bool MMU2::eject_filament(const uint8_t index, const bool recover) {
|
||||
|
||||
if (!enabled) return false;
|
||||
|
||||
if (thermalManager.tooColdToExtrude(active_extruder)) {
|
||||
BUZZ(200, 404);
|
||||
LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD);
|
||||
return false;
|
||||
}
|
||||
|
||||
LCD_MESSAGEPGM(MSG_MMU2_EJECTING_FILAMENT);
|
||||
|
||||
ENABLE_AXIS_E0();
|
||||
current_position.e -= MMU2_FILAMENTCHANGE_EJECT_FEED;
|
||||
line_to_current_position(MMM_TO_MMS(2500));
|
||||
planner.synchronize();
|
||||
command(MMU_CMD_E0 + index);
|
||||
manage_response(false, false);
|
||||
|
||||
if (recover) {
|
||||
LCD_MESSAGEPGM(MSG_MMU2_EJECT_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();
|
||||
BUZZ(200, 404);
|
||||
BUZZ(200, 404);
|
||||
|
||||
command(MMU_CMD_R0);
|
||||
manage_response(false, false);
|
||||
}
|
||||
|
||||
ui.reset_status();
|
||||
|
||||
// no active tool
|
||||
extruder = MMU2_NO_TOOL;
|
||||
|
||||
set_runout_valid(false);
|
||||
|
||||
BUZZ(200, 404);
|
||||
|
||||
DISABLE_AXIS_E0();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unload from hotend and retract to MMU
|
||||
*/
|
||||
bool MMU2::unload() {
|
||||
|
||||
if (!enabled) return false;
|
||||
|
||||
if (thermalManager.tooColdToExtrude(active_extruder)) {
|
||||
BUZZ(200, 404);
|
||||
LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch material and load to nozzle
|
||||
*/
|
||||
bool MMU2::load_filament_to_nozzle(const uint8_t index) {
|
||||
filament_ramming();
|
||||
|
||||
if (!enabled) return false;
|
||||
command(MMU_CMD_U0);
|
||||
manage_response(false, true);
|
||||
|
||||
if (thermalManager.tooColdToExtrude(active_extruder)) {
|
||||
BUZZ(200, 404);
|
||||
LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD);
|
||||
return false;
|
||||
}
|
||||
BUZZ(200, 404);
|
||||
|
||||
command(MMU_CMD_T0 + index);
|
||||
manage_response(true, true);
|
||||
// no active tool
|
||||
extruder = MMU2_NO_TOOL;
|
||||
|
||||
const bool success = load_to_gears();
|
||||
if (success) {
|
||||
mmu_loop();
|
||||
extruder = index;
|
||||
active_extruder = 0;
|
||||
load_to_nozzle();
|
||||
BUZZ(200, 404);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
set_runout_valid(false);
|
||||
|
||||
/**
|
||||
* Load filament to nozzle of multimaterial printer
|
||||
*
|
||||
* This function is used only only after T? (user select filament) and M600 (change filament).
|
||||
* It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading
|
||||
* filament to nozzle.
|
||||
*/
|
||||
void MMU2::load_to_nozzle() {
|
||||
if (!enabled) return;
|
||||
execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MMU2::eject_filament(const uint8_t index, const bool recover) {
|
||||
/**
|
||||
* Unload sequence to optimize shape of the tip of the unloaded filament
|
||||
*/
|
||||
void MMU2::filament_ramming() {
|
||||
execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step));
|
||||
}
|
||||
|
||||
if (!enabled) return false;
|
||||
void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) {
|
||||
|
||||
if (thermalManager.tooColdToExtrude(active_extruder)) {
|
||||
BUZZ(200, 404);
|
||||
LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD);
|
||||
return false;
|
||||
}
|
||||
planner.synchronize();
|
||||
ENABLE_AXIS_E0();
|
||||
|
||||
LCD_MESSAGEPGM(MSG_MMU2_EJECTING_FILAMENT);
|
||||
const E_Step* step = sequence;
|
||||
|
||||
ENABLE_AXIS_E0();
|
||||
current_position.e -= MMU2_FILAMENTCHANGE_EJECT_FEED;
|
||||
line_to_current_position(2500 / 60);
|
||||
LOOP_L_N(i, steps) {
|
||||
const float es = pgm_read_float(&(step->extrude));
|
||||
const feedRate_t fr_mm_m = pgm_read_float(&(step->feedRate));
|
||||
|
||||
DEBUG_ECHO_START();
|
||||
DEBUG_ECHOLNPAIR("E step ", es, "/", fr_mm_m);
|
||||
|
||||
current_position.e += es;
|
||||
line_to_current_position(MMM_TO_MMS(fr_mm_m));
|
||||
planner.synchronize();
|
||||
command(MMU_CMD_E0 + index);
|
||||
manage_response(false, false);
|
||||
|
||||
if (recover) {
|
||||
LCD_MESSAGEPGM(MSG_MMU2_EJECT_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();
|
||||
BUZZ(200, 404);
|
||||
BUZZ(200, 404);
|
||||
|
||||
command(MMU_CMD_R0);
|
||||
manage_response(false, false);
|
||||
}
|
||||
|
||||
ui.reset_status();
|
||||
|
||||
// no active tool
|
||||
extruder = MMU2_NO_TOOL;
|
||||
|
||||
set_runout_valid(false);
|
||||
|
||||
BUZZ(200, 404);
|
||||
|
||||
DISABLE_AXIS_E0();
|
||||
|
||||
return true;
|
||||
step++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unload from hotend and retract to MMU
|
||||
*/
|
||||
bool MMU2::unload() {
|
||||
DISABLE_AXIS_E0();
|
||||
}
|
||||
|
||||
if (!enabled) return false;
|
||||
|
||||
if (thermalManager.tooColdToExtrude(active_extruder)) {
|
||||
BUZZ(200, 404);
|
||||
LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD);
|
||||
return false;
|
||||
}
|
||||
|
||||
filament_ramming();
|
||||
|
||||
command(MMU_CMD_U0);
|
||||
manage_response(false, true);
|
||||
|
||||
BUZZ(200, 404);
|
||||
|
||||
// no active tool
|
||||
extruder = MMU2_NO_TOOL;
|
||||
|
||||
set_runout_valid(false);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unload sequence to optimize shape of the tip of the unloaded filament
|
||||
*/
|
||||
void MMU2::filament_ramming() {
|
||||
execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step));
|
||||
}
|
||||
|
||||
void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) {
|
||||
|
||||
planner.synchronize();
|
||||
ENABLE_AXIS_E0();
|
||||
|
||||
const E_Step* step = sequence;
|
||||
|
||||
LOOP_L_N(i, steps) {
|
||||
const float es = pgm_read_float(&(step->extrude));
|
||||
const feedRate_t fr_mm_m = pgm_read_float(&(step->feedRate));
|
||||
|
||||
DEBUG_ECHO_START();
|
||||
DEBUG_ECHOLNPAIR("E step ", es, "/", fr_mm_m);
|
||||
|
||||
current_position.e += es;
|
||||
line_to_current_position(MMM_TO_MMS(fr_mm_m));
|
||||
planner.synchronize();
|
||||
|
||||
step++;
|
||||
}
|
||||
|
||||
DISABLE_AXIS_E0();
|
||||
}
|
||||
|
||||
#endif // HAS_LCD_MENU && MMU2_MENUS
|
||||
|
||||
#endif // PRUSA_MMU2
|
||||
#endif // HAS_PRUSA_MMU2
|
||||
@@ -49,13 +49,11 @@ public:
|
||||
static uint8_t get_current_tool();
|
||||
static void set_filament_type(const uint8_t index, const uint8_t type);
|
||||
|
||||
#if BOTH(HAS_LCD_MENU, MMU2_MENUS)
|
||||
static bool unload();
|
||||
static void load_filament(uint8_t);
|
||||
static void load_all();
|
||||
static bool load_filament_to_nozzle(const uint8_t index);
|
||||
static bool eject_filament(const uint8_t index, const bool recover);
|
||||
#endif
|
||||
static bool unload();
|
||||
static void load_filament(uint8_t);
|
||||
static void load_all();
|
||||
static bool load_filament_to_nozzle(const uint8_t index);
|
||||
static bool eject_filament(const uint8_t index, const bool recover);
|
||||
|
||||
private:
|
||||
static bool rx_str_P(const char* str);
|
||||
@@ -72,15 +70,13 @@ private:
|
||||
static bool get_response();
|
||||
static void manage_response(const bool move_axes, const bool turn_off_nozzle);
|
||||
|
||||
#if BOTH(HAS_LCD_MENU, MMU2_MENUS)
|
||||
static void load_to_nozzle();
|
||||
static void filament_ramming();
|
||||
static void execute_extruder_sequence(const E_Step * sequence, int steps);
|
||||
#endif
|
||||
static void load_to_nozzle();
|
||||
static void filament_ramming();
|
||||
static void execute_extruder_sequence(const E_Step * sequence, int steps);
|
||||
|
||||
static void filament_runout();
|
||||
|
||||
#if ENABLED(PRUSA_MMU2_S_MODE)
|
||||
#if HAS_PRUSA_MMU2S
|
||||
static bool mmu2s_triggered;
|
||||
static void check_filament();
|
||||
static bool can_load();
|
||||
@@ -47,7 +47,7 @@ public:
|
||||
static void start_over();
|
||||
|
||||
static void digit_entered();
|
||||
static void set_password_done();
|
||||
static void set_password_done(const bool with_set=true);
|
||||
static void menu_password_report();
|
||||
|
||||
static void remove_password();
|
||||
|
||||
@@ -180,10 +180,10 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/
|
||||
|
||||
// Machine state
|
||||
info.current_position = current_position;
|
||||
info.feedrate = uint16_t(feedrate_mm_s * 60.0f);
|
||||
info.zraise = zraise;
|
||||
TERN_(HAS_HOME_OFFSET, info.home_offset = home_offset);
|
||||
TERN_(HAS_POSITION_SHIFT, info.position_shift = position_shift);
|
||||
info.feedrate = uint16_t(feedrate_mm_s * 60.0f);
|
||||
|
||||
#if HAS_MULTI_EXTRUDER
|
||||
info.active_extruder = active_extruder;
|
||||
@@ -209,7 +209,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/
|
||||
#endif
|
||||
|
||||
#if HAS_LEVELING
|
||||
info.leveling = planner.leveling_active;
|
||||
info.flag.leveling = planner.leveling_active;
|
||||
info.fade = TERN0(ENABLE_LEVELING_FADE_HEIGHT, planner.z_fade_height);
|
||||
#endif
|
||||
|
||||
@@ -220,12 +220,12 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/
|
||||
info.retract_hop = fwretract.current_hop;
|
||||
#endif
|
||||
|
||||
// Relative axis modes
|
||||
info.axis_relative = gcode.axis_relative;
|
||||
|
||||
// Elapsed print job time
|
||||
info.print_job_elapsed = print_job_timer.duration();
|
||||
|
||||
// Relative axis modes
|
||||
info.axis_relative = gcode.axis_relative;
|
||||
|
||||
// Misc. Marlin flags
|
||||
info.flag.dryrun = !!(marlin_debug_flags & MARLIN_DEBUG_DRYRUN);
|
||||
info.flag.allow_cold_extrusion = TERN0(PREVENT_COLD_EXTRUSION, thermalManager.allow_cold_extrude);
|
||||
@@ -433,13 +433,15 @@ void PrintJobRecovery::resume() {
|
||||
#endif
|
||||
|
||||
// Restore print cooling fan speeds
|
||||
FANS_LOOP(i) {
|
||||
uint8_t f = info.fan_speed[i];
|
||||
if (f) {
|
||||
sprintf_P(cmd, PSTR("M106 P%i S%i"), i, f);
|
||||
gcode.process_subcommands_now(cmd);
|
||||
#if HAS_FAN
|
||||
FANS_LOOP(i) {
|
||||
const int f = info.fan_speed[i];
|
||||
if (f) {
|
||||
sprintf_P(cmd, PSTR("M106 P%i S%i"), i, f);
|
||||
gcode.process_subcommands_now(cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Restore retract and hop state
|
||||
#if ENABLED(FWRETRACT)
|
||||
@@ -455,8 +457,8 @@ void PrintJobRecovery::resume() {
|
||||
#if HAS_LEVELING
|
||||
// Restore leveling state before 'G92 Z' to ensure
|
||||
// the Z stepper count corresponds to the native Z.
|
||||
if (info.fade || info.leveling) {
|
||||
sprintf_P(cmd, PSTR("M420 S%i Z%s"), int(info.leveling), dtostrf(info.fade, 1, 1, str_1));
|
||||
if (info.fade || info.flag.leveling) {
|
||||
sprintf_P(cmd, PSTR("M420 S%i Z%s"), int(info.flag.leveling), dtostrf(info.fade, 1, 1, str_1));
|
||||
gcode.process_subcommands_now(cmd);
|
||||
}
|
||||
#endif
|
||||
@@ -505,15 +507,15 @@ void PrintJobRecovery::resume() {
|
||||
sprintf_P(cmd, PSTR("G92.9 E%s"), dtostrf(info.current_position.e, 1, 3, str_1));
|
||||
gcode.process_subcommands_now(cmd);
|
||||
|
||||
// Relative axis modes
|
||||
gcode.axis_relative = info.axis_relative;
|
||||
|
||||
TERN_(HAS_HOME_OFFSET, home_offset = info.home_offset);
|
||||
TERN_(HAS_POSITION_SHIFT, position_shift = info.position_shift);
|
||||
#if HAS_HOME_OFFSET || HAS_POSITION_SHIFT
|
||||
LOOP_XYZ(i) update_workspace_offset((AxisEnum)i);
|
||||
#endif
|
||||
|
||||
// Relative axis modes
|
||||
gcode.axis_relative = info.axis_relative;
|
||||
|
||||
#if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
|
||||
const uint8_t old_flags = marlin_debug_flags;
|
||||
marlin_debug_flags |= MARLIN_DEBUG_ECHO;
|
||||
@@ -596,7 +598,7 @@ void PrintJobRecovery::resume() {
|
||||
#endif
|
||||
|
||||
#if HAS_LEVELING
|
||||
DEBUG_ECHOLNPAIR("leveling: ", int(info.leveling), " fade: ", info.fade);
|
||||
DEBUG_ECHOLNPAIR("leveling: ", int(info.flag.leveling), " fade: ", info.fade);
|
||||
#endif
|
||||
#if ENABLED(FWRETRACT)
|
||||
DEBUG_ECHOPGM("retract: ");
|
||||
|
||||
@@ -47,42 +47,24 @@ typedef struct {
|
||||
|
||||
// Machine state
|
||||
xyze_pos_t current_position;
|
||||
uint16_t feedrate;
|
||||
float zraise;
|
||||
|
||||
#if HAS_HOME_OFFSET
|
||||
xyz_pos_t home_offset;
|
||||
#endif
|
||||
#if HAS_POSITION_SHIFT
|
||||
xyz_pos_t position_shift;
|
||||
#endif
|
||||
|
||||
uint16_t feedrate;
|
||||
|
||||
#if HAS_MULTI_EXTRUDER
|
||||
uint8_t active_extruder;
|
||||
#endif
|
||||
TERN_(HAS_HOME_OFFSET, xyz_pos_t home_offset);
|
||||
TERN_(HAS_POSITION_SHIFT, xyz_pos_t position_shift);
|
||||
TERN_(HAS_MULTI_EXTRUDER, uint8_t active_extruder);
|
||||
|
||||
#if DISABLED(NO_VOLUMETRICS)
|
||||
bool volumetric_enabled;
|
||||
float filament_size[EXTRUDERS];
|
||||
#endif
|
||||
|
||||
#if HAS_HOTEND
|
||||
int16_t target_temperature[HOTENDS];
|
||||
#endif
|
||||
TERN_(HAS_HOTEND, int16_t target_temperature[HOTENDS]);
|
||||
TERN_(HAS_HEATED_BED, int16_t target_temperature_bed);
|
||||
TERN_(HAS_FAN, uint8_t fan_speed[FAN_COUNT]);
|
||||
|
||||
#if HAS_HEATED_BED
|
||||
int16_t target_temperature_bed;
|
||||
#endif
|
||||
|
||||
#if HAS_FAN
|
||||
uint8_t fan_speed[FAN_COUNT];
|
||||
#endif
|
||||
|
||||
#if HAS_LEVELING
|
||||
bool leveling;
|
||||
float fade;
|
||||
#endif
|
||||
TERN_(HAS_LEVELING, float fade);
|
||||
|
||||
#if ENABLED(FWRETRACT)
|
||||
float retract[EXTRUDERS], retract_hop;
|
||||
@@ -92,14 +74,9 @@ typedef struct {
|
||||
#if ENABLED(MIXING_EXTRUDER)
|
||||
//uint_fast8_t selected_vtool;
|
||||
//mixer_comp_t color[NR_MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS];
|
||||
#if ENABLED(GRADIENT_MIX)
|
||||
gradient_t gradient;
|
||||
#endif
|
||||
TERN_(GRADIENT_MIX, gradient_t gradient);
|
||||
#endif
|
||||
|
||||
// Relative axis modes
|
||||
uint8_t axis_relative;
|
||||
|
||||
// SD Filename and position
|
||||
char sd_filename[MAXPATHNAMELENGTH];
|
||||
volatile uint32_t sdpos;
|
||||
@@ -107,10 +84,14 @@ typedef struct {
|
||||
// Job elapsed time
|
||||
millis_t print_job_elapsed;
|
||||
|
||||
// Relative axis modes
|
||||
uint8_t axis_relative;
|
||||
|
||||
// Misc. Marlin flags
|
||||
struct {
|
||||
bool dryrun:1; // M111 S8
|
||||
bool allow_cold_extrusion:1; // M302 P1
|
||||
TERN_(HAS_LEVELING, bool leveling:1);
|
||||
} flag;
|
||||
|
||||
uint8_t valid_foot;
|
||||
|
||||
+52
-15
@@ -149,18 +149,34 @@ class FilamentSensorBase {
|
||||
|
||||
public:
|
||||
static inline void setup() {
|
||||
#if ENABLED(FIL_RUNOUT_PULLUP)
|
||||
#define INIT_RUNOUT_PIN(P) SET_INPUT_PULLUP(P)
|
||||
#elif ENABLED(FIL_RUNOUT_PULLDOWN)
|
||||
#define INIT_RUNOUT_PIN(P) SET_INPUT_PULLDOWN(P)
|
||||
#else
|
||||
#define INIT_RUNOUT_PIN(P) SET_INPUT(P)
|
||||
#define _INIT_RUNOUT_PIN(P,S,U) do{ if (DISABLED(U)) SET_INPUT(P); else if (S) SET_INPUT_PULLUP(P); else SET_INPUT_PULLDOWN(P); }while(0)
|
||||
#define INIT_RUNOUT_PIN(N) _INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN, FIL_RUNOUT##N##_STATE, FIL_RUNOUT##N##_PULL)
|
||||
#if NUM_RUNOUT_SENSORS >= 1
|
||||
INIT_RUNOUT_PIN(1);
|
||||
#endif
|
||||
|
||||
#define _INIT_RUNOUT(N) INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN);
|
||||
REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _INIT_RUNOUT)
|
||||
#undef _INIT_RUNOUT
|
||||
#undef INIT_RUNOUT_PIN
|
||||
#if NUM_RUNOUT_SENSORS >= 2
|
||||
INIT_RUNOUT_PIN(2);
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 3
|
||||
INIT_RUNOUT_PIN(3);
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 4
|
||||
INIT_RUNOUT_PIN(4);
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 5
|
||||
INIT_RUNOUT_PIN(5);
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 6
|
||||
INIT_RUNOUT_PIN(6);
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 7
|
||||
INIT_RUNOUT_PIN(7);
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 8
|
||||
INIT_RUNOUT_PIN(8);
|
||||
#endif
|
||||
#undef _INIT_RUNOUT_PIN
|
||||
#undef INIT_RUNOUT_PIN
|
||||
}
|
||||
|
||||
// Return a bitmask of runout pin states
|
||||
@@ -172,11 +188,32 @@ class FilamentSensorBase {
|
||||
|
||||
// Return a bitmask of runout flag states (1 bits always indicates runout)
|
||||
static inline uint8_t poll_runout_states() {
|
||||
return poll_runout_pins()
|
||||
#if FIL_RUNOUT_STATE == LOW
|
||||
^ uint8_t(_BV(NUM_RUNOUT_SENSORS) - 1)
|
||||
return poll_runout_pins() ^ uint8_t(0
|
||||
#if NUM_RUNOUT_SENSORS >= 1
|
||||
| (FIL_RUNOUT1_STATE ? 0 : _BV(1 - 1))
|
||||
#endif
|
||||
;
|
||||
#if NUM_RUNOUT_SENSORS >= 2
|
||||
| (FIL_RUNOUT2_STATE ? 0 : _BV(2 - 1))
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 3
|
||||
| (FIL_RUNOUT3_STATE ? 0 : _BV(3 - 1))
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 4
|
||||
| (FIL_RUNOUT4_STATE ? 0 : _BV(4 - 1))
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 5
|
||||
| (FIL_RUNOUT5_STATE ? 0 : _BV(5 - 1))
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 6
|
||||
| (FIL_RUNOUT6_STATE ? 0 : _BV(6 - 1))
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 7
|
||||
| (FIL_RUNOUT7_STATE ? 0 : _BV(7 - 1))
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 8
|
||||
| (FIL_RUNOUT8_STATE ? 0 : _BV(8 - 1))
|
||||
#endif
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -405,7 +405,7 @@ inline bool turn_on_heaters() {
|
||||
inline bool prime_nozzle() {
|
||||
|
||||
const feedRate_t fr_slow_e = planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0f;
|
||||
#if HAS_LCD_MENU && !HAS_TOUCH_XPT2046 // ui.button_pressed issue with touchscreen
|
||||
#if HAS_LCD_MENU && !HAS_TOUCH_BUTTONS // ui.button_pressed issue with touchscreen
|
||||
#if ENABLED(PREVENT_LENGTHY_EXTRUDE)
|
||||
float Total_Prime = 0.0;
|
||||
#endif
|
||||
|
||||
@@ -313,7 +313,7 @@ void GcodeSuite::G28() {
|
||||
home_all = homeX == homeY && homeX == homeZ, // All or None
|
||||
doX = home_all || homeX, doY = home_all || homeY, doZ = home_all || homeZ;
|
||||
|
||||
#if Z_HOME_DIR > 0 // If homing away from BED do Z first
|
||||
#if ENABLED(HOME_Z_FIRST)
|
||||
|
||||
if (doZ) homeaxis(Z_AXIS);
|
||||
|
||||
@@ -373,18 +373,18 @@ void GcodeSuite::G28() {
|
||||
TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing));
|
||||
|
||||
// Home Z last if homing towards the bed
|
||||
#if Z_HOME_DIR < 0
|
||||
|
||||
#if DISABLED(HOME_Z_FIRST)
|
||||
if (doZ) {
|
||||
#if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN)
|
||||
stepper.set_all_z_lock(false);
|
||||
stepper.set_separate_multi_axis(false);
|
||||
#endif
|
||||
|
||||
TERN_(BLTOUCH, bltouch.init());
|
||||
|
||||
TERN(Z_SAFE_HOMING, home_z_safely(), homeaxis(Z_AXIS));
|
||||
|
||||
probe.move_z_after_homing();
|
||||
|
||||
} // doZ
|
||||
|
||||
#endif // Z_HOME_DIR < 0
|
||||
}
|
||||
#endif
|
||||
|
||||
sync_plan_position();
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
|
||||
#if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN)
|
||||
|
||||
#include "../../feature/z_stepper_align.h"
|
||||
|
||||
@@ -51,364 +51,398 @@
|
||||
/**
|
||||
* G34: Z-Stepper automatic alignment
|
||||
*
|
||||
* I<iterations>
|
||||
* T<accuracy>
|
||||
* A<amplification>
|
||||
* R<recalculate> points based on current probe offsets
|
||||
* Manual stepper lock controls (reset by G28):
|
||||
* L Unlock all steppers
|
||||
* Z<1-4> Z stepper to lock / unlock
|
||||
* S<state> 0=UNLOCKED 1=LOCKED. If omitted, assume LOCKED.
|
||||
*
|
||||
* Examples:
|
||||
* G34 Z1 ; Lock Z1
|
||||
* G34 L Z2 ; Unlock all, then lock Z2
|
||||
* G34 Z2 S0 ; Unlock Z2
|
||||
*
|
||||
* With Z_STEPPER_AUTO_ALIGN:
|
||||
* I<iterations> Number of tests. If omitted, Z_STEPPER_ALIGN_ITERATIONS.
|
||||
* T<accuracy> Target Accuracy factor. If omitted, Z_STEPPER_ALIGN_ACC.
|
||||
* A<amplification> Provide an Amplification value. If omitted, Z_STEPPER_ALIGN_AMP.
|
||||
* R Flag to recalculate points based on current probe offsets
|
||||
*/
|
||||
void GcodeSuite::G34() {
|
||||
DEBUG_SECTION(log_G34, "G34", DEBUGGING(LEVELING));
|
||||
if (DEBUGGING(LEVELING)) log_machine_info();
|
||||
|
||||
do { // break out on error
|
||||
planner.synchronize(); // Prevent damage
|
||||
|
||||
#if NUM_Z_STEPPER_DRIVERS == 4
|
||||
SERIAL_ECHOLNPGM("Alignment for 4 steppers is Experimental!");
|
||||
#elif NUM_Z_STEPPER_DRIVERS > 4
|
||||
SERIAL_ECHOLNPGM("Alignment not supported for over 4 steppers");
|
||||
break;
|
||||
#endif
|
||||
const bool seenL = parser.seen('L');
|
||||
if (seenL) stepper.set_all_z_lock(false);
|
||||
|
||||
const int8_t z_auto_align_iterations = parser.intval('I', Z_STEPPER_ALIGN_ITERATIONS);
|
||||
if (!WITHIN(z_auto_align_iterations, 1, 30)) {
|
||||
SERIAL_ECHOLNPGM("?(I)teration out of bounds (1-30).");
|
||||
break;
|
||||
const bool seenZ = parser.seenval('Z');
|
||||
if (seenZ) {
|
||||
const bool state = parser.boolval('S', true);
|
||||
switch (parser.intval('Z')) {
|
||||
case 1: stepper.set_z1_lock(state); break;
|
||||
case 2: stepper.set_z2_lock(state); break;
|
||||
#if NUM_Z_STEPPER_DRIVERS >= 3
|
||||
case 3: stepper.set_z3_lock(state); break;
|
||||
#if NUM_Z_STEPPER_DRIVERS >= 4
|
||||
case 4: stepper.set_z4_lock(state); break;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
const float z_auto_align_accuracy = parser.floatval('T', Z_STEPPER_ALIGN_ACC);
|
||||
if (!WITHIN(z_auto_align_accuracy, 0.01f, 1.0f)) {
|
||||
SERIAL_ECHOLNPGM("?(T)arget accuracy out of bounds (0.01-1.0).");
|
||||
break;
|
||||
}
|
||||
if (seenL || seenZ) {
|
||||
stepper.set_separate_multi_axis(seenZ);
|
||||
return;
|
||||
}
|
||||
|
||||
const float z_auto_align_amplification =
|
||||
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
Z_STEPPER_ALIGN_AMP;
|
||||
#else
|
||||
parser.floatval('A', Z_STEPPER_ALIGN_AMP);
|
||||
if (!WITHIN(ABS(z_auto_align_amplification), 0.5f, 2.0f)) {
|
||||
SERIAL_ECHOLNPGM("?(A)mplification out of bounds (0.5-2.0).");
|
||||
break;
|
||||
}
|
||||
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
|
||||
do { // break out on error
|
||||
|
||||
#if NUM_Z_STEPPER_DRIVERS == 4
|
||||
SERIAL_ECHOLNPGM("Alignment for 4 steppers is Experimental!");
|
||||
#elif NUM_Z_STEPPER_DRIVERS > 4
|
||||
SERIAL_ECHOLNPGM("Alignment not supported for over 4 steppers");
|
||||
break;
|
||||
#endif
|
||||
|
||||
if (parser.seen('R')) z_stepper_align.reset_to_default();
|
||||
|
||||
const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE;
|
||||
|
||||
// Wait for planner moves to finish!
|
||||
planner.synchronize();
|
||||
|
||||
// Disable the leveling matrix before auto-aligning
|
||||
#if HAS_LEVELING
|
||||
TERN_(RESTORE_LEVELING_AFTER_G34, const bool leveling_was_active = planner.leveling_active);
|
||||
set_bed_leveling_enabled(false);
|
||||
#endif
|
||||
|
||||
TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY);
|
||||
|
||||
// Always home with tool 0 active
|
||||
#if HAS_MULTI_HOTEND
|
||||
const uint8_t old_tool_index = active_extruder;
|
||||
tool_change(0, true);
|
||||
#endif
|
||||
|
||||
TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false));
|
||||
|
||||
// In BLTOUCH HS mode, the probe travels in a deployed state.
|
||||
// Users of G34 might have a badly misaligned bed, so raise Z by the
|
||||
// length of the deployed pin (BLTOUCH stroke < 7mm)
|
||||
#define Z_BASIC_CLEARANCE (Z_CLEARANCE_BETWEEN_PROBES + 7.0f * BOTH(BLTOUCH, BLTOUCH_HS_MODE))
|
||||
|
||||
// Compute a worst-case clearance height to probe from. After the first
|
||||
// iteration this will be re-calculated based on the actual bed position
|
||||
auto magnitude2 = [&](const uint8_t i, const uint8_t j) {
|
||||
const xy_pos_t diff = z_stepper_align.xy[i] - z_stepper_align.xy[j];
|
||||
return HYPOT2(diff.x, diff.y);
|
||||
};
|
||||
float z_probe = Z_BASIC_CLEARANCE + (G34_MAX_GRADE) * 0.01f * SQRT(
|
||||
#if NUM_Z_STEPPER_DRIVERS == 3
|
||||
_MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 0))
|
||||
#elif NUM_Z_STEPPER_DRIVERS == 4
|
||||
_MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 3),
|
||||
magnitude2(3, 0), magnitude2(0, 2), magnitude2(1, 3))
|
||||
#else
|
||||
magnitude2(0, 1)
|
||||
#endif
|
||||
);
|
||||
|
||||
// Home before the alignment procedure
|
||||
if (!all_axes_known()) home_all_axes();
|
||||
|
||||
// Move the Z coordinate realm towards the positive - dirty trick
|
||||
current_position.z += z_probe * 0.5f;
|
||||
sync_plan_position();
|
||||
// Now, the Z origin lies below the build plate. That allows to probe deeper, before run_z_probe throws an error.
|
||||
// This hack is un-done at the end of G34 - either by re-homing, or by using the probed heights of the last iteration.
|
||||
|
||||
#if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
float last_z_align_move[NUM_Z_STEPPER_DRIVERS] = ARRAY_N(NUM_Z_STEPPER_DRIVERS, 10000.0f, 10000.0f, 10000.0f, 10000.0f);
|
||||
#else
|
||||
float last_z_align_level_indicator = 10000.0f;
|
||||
#endif
|
||||
float z_measured[NUM_Z_STEPPER_DRIVERS] = { 0 },
|
||||
z_maxdiff = 0.0f,
|
||||
amplification = z_auto_align_amplification;
|
||||
|
||||
#if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
bool adjustment_reverse = false;
|
||||
#endif
|
||||
|
||||
#if HAS_DISPLAY
|
||||
PGM_P const msg_iteration = GET_TEXT(MSG_ITERATION);
|
||||
const uint8_t iter_str_len = strlen_P(msg_iteration);
|
||||
#endif
|
||||
|
||||
// Final z and iteration values will be used after breaking the loop
|
||||
float z_measured_min;
|
||||
uint8_t iteration = 0;
|
||||
bool err_break = false; // To break out of nested loops
|
||||
while (iteration < z_auto_align_iterations) {
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> probing all positions.");
|
||||
|
||||
const int iter = iteration + 1;
|
||||
SERIAL_ECHOLNPAIR("\nG34 Iteration: ", iter);
|
||||
#if HAS_DISPLAY
|
||||
char str[iter_str_len + 2 + 1];
|
||||
sprintf_P(str, msg_iteration, iter);
|
||||
ui.set_status(str);
|
||||
#endif
|
||||
|
||||
// Initialize minimum value
|
||||
z_measured_min = 100000.0f;
|
||||
float z_measured_max = -100000.0f;
|
||||
|
||||
// Probe all positions (one per Z-Stepper)
|
||||
LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) {
|
||||
// iteration odd/even --> downward / upward stepper sequence
|
||||
const uint8_t iprobe = (iteration & 1) ? NUM_Z_STEPPER_DRIVERS - 1 - i : i;
|
||||
|
||||
// Safe clearance even on an incline
|
||||
if ((iteration == 0 || i > 0) && z_probe > current_position.z) do_blocking_move_to_z(z_probe);
|
||||
|
||||
if (DEBUGGING(LEVELING))
|
||||
DEBUG_ECHOLNPAIR_P(PSTR("Probing X"), z_stepper_align.xy[iprobe].x, SP_Y_STR, z_stepper_align.xy[iprobe].y);
|
||||
|
||||
// Probe a Z height for each stepper.
|
||||
// Probing sanity check is disabled, as it would trigger even in normal cases because
|
||||
// current_position.z has been manually altered in the "dirty trick" above.
|
||||
const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false);
|
||||
if (isnan(z_probed_height)) {
|
||||
SERIAL_ECHOLNPGM("Probing failed");
|
||||
LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED);
|
||||
err_break = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Add height to each value, to provide a more useful target height for
|
||||
// the next iteration of probing. This allows adjustments to be made away from the bed.
|
||||
z_measured[iprobe] = z_probed_height + Z_CLEARANCE_BETWEEN_PROBES;
|
||||
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(iprobe + 1), " measured position is ", z_measured[iprobe]);
|
||||
|
||||
// Remember the minimum measurement to calculate the correction later on
|
||||
z_measured_min = _MIN(z_measured_min, z_measured[iprobe]);
|
||||
z_measured_max = _MAX(z_measured_max, z_measured[iprobe]);
|
||||
} // for (i)
|
||||
|
||||
if (err_break) break;
|
||||
|
||||
// Adapt the next probe clearance height based on the new measurements.
|
||||
// Safe_height = lowest distance to bed (= highest measurement) plus highest measured misalignment.
|
||||
z_maxdiff = z_measured_max - z_measured_min;
|
||||
z_probe = Z_BASIC_CLEARANCE + z_measured_max + z_maxdiff;
|
||||
|
||||
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
// Replace the initial values in z_measured with calculated heights at
|
||||
// each stepper position. This allows the adjustment algorithm to be
|
||||
// shared between both possible probing mechanisms.
|
||||
|
||||
// This must be done after the next z_probe height is calculated, so that
|
||||
// the height is calculated from actual print area positions, and not
|
||||
// extrapolated motor movements.
|
||||
|
||||
// Compute the least-squares fit for all probed points.
|
||||
// Calculate the Z position of each stepper and store it in z_measured.
|
||||
// This allows the actual adjustment logic to be shared by both algorithms.
|
||||
linear_fit_data lfd;
|
||||
incremental_LSF_reset(&lfd);
|
||||
LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) {
|
||||
SERIAL_ECHOLNPAIR("PROBEPT_", int(i), ": ", z_measured[i]);
|
||||
incremental_LSF(&lfd, z_stepper_align.xy[i], z_measured[i]);
|
||||
}
|
||||
finish_incremental_LSF(&lfd);
|
||||
|
||||
z_measured_min = 100000.0f;
|
||||
LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) {
|
||||
z_measured[i] = -(lfd.A * z_stepper_align.stepper_xy[i].x + lfd.B * z_stepper_align.stepper_xy[i].y + lfd.D);
|
||||
z_measured_min = _MIN(z_measured_min, z_measured[i]);
|
||||
}
|
||||
|
||||
SERIAL_ECHOLNPAIR("CALCULATED STEPPER POSITIONS: Z1=", z_measured[0], " Z2=", z_measured[1], " Z3=", z_measured[2]);
|
||||
#endif
|
||||
|
||||
SERIAL_ECHOLNPAIR("\n"
|
||||
"DIFFERENCE Z1-Z2=", ABS(z_measured[0] - z_measured[1])
|
||||
#if NUM_Z_STEPPER_DRIVERS == 3
|
||||
, " Z2-Z3=", ABS(z_measured[1] - z_measured[2])
|
||||
, " Z3-Z1=", ABS(z_measured[2] - z_measured[0])
|
||||
#endif
|
||||
);
|
||||
#if HAS_DISPLAY
|
||||
char fstr1[10];
|
||||
#if NUM_Z_STEPPER_DRIVERS == 2
|
||||
char msg[6 + (6 + 5) * 1 + 1];
|
||||
#else
|
||||
char msg[6 + (6 + 5) * 3 + 1], fstr2[10], fstr3[10];
|
||||
#endif
|
||||
sprintf_P(msg,
|
||||
PSTR("Diffs Z1-Z2=%s"
|
||||
#if NUM_Z_STEPPER_DRIVERS == 3
|
||||
" Z2-Z3=%s"
|
||||
" Z3-Z1=%s"
|
||||
#endif
|
||||
), dtostrf(ABS(z_measured[0] - z_measured[1]), 1, 3, fstr1)
|
||||
#if NUM_Z_STEPPER_DRIVERS == 3
|
||||
, dtostrf(ABS(z_measured[1] - z_measured[2]), 1, 3, fstr2)
|
||||
, dtostrf(ABS(z_measured[2] - z_measured[0]), 1, 3, fstr3)
|
||||
#endif
|
||||
);
|
||||
ui.set_status(msg);
|
||||
#endif
|
||||
|
||||
auto decreasing_accuracy = [](const float &v1, const float &v2){
|
||||
if (v1 < v2 * 0.7f) {
|
||||
SERIAL_ECHOLNPGM("Decreasing Accuracy Detected.");
|
||||
LCD_MESSAGEPGM(MSG_DECREASING_ACCURACY);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
|
||||
// Check if the applied corrections go in the correct direction.
|
||||
// Calculate the sum of the absolute deviations from the mean of the probe measurements.
|
||||
// Compare to the last iteration to ensure it's getting better.
|
||||
|
||||
// Calculate mean value as a reference
|
||||
float z_measured_mean = 0.0f;
|
||||
LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) z_measured_mean += z_measured[zstepper];
|
||||
z_measured_mean /= NUM_Z_STEPPER_DRIVERS;
|
||||
|
||||
// Calculate the sum of the absolute deviations from the mean value
|
||||
float z_align_level_indicator = 0.0f;
|
||||
LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS)
|
||||
z_align_level_indicator += ABS(z_measured[zstepper] - z_measured_mean);
|
||||
|
||||
// If it's getting worse, stop and throw an error
|
||||
err_break = decreasing_accuracy(last_z_align_level_indicator, z_align_level_indicator);
|
||||
if (err_break) break;
|
||||
|
||||
last_z_align_level_indicator = z_align_level_indicator;
|
||||
#endif
|
||||
|
||||
// The following correction actions are to be enabled for select Z-steppers only
|
||||
stepper.set_separate_multi_axis(true);
|
||||
|
||||
bool success_break = true;
|
||||
// Correct the individual stepper offsets
|
||||
LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) {
|
||||
// Calculate current stepper move
|
||||
float z_align_move = z_measured[zstepper] - z_measured_min;
|
||||
const float z_align_abs = ABS(z_align_move);
|
||||
|
||||
#if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
// Optimize one iteration's correction based on the first measurements
|
||||
if (z_align_abs) amplification = (iteration == 1) ? _MIN(last_z_align_move[zstepper] / z_align_abs, 2.0f) : z_auto_align_amplification;
|
||||
|
||||
// Check for less accuracy compared to last move
|
||||
if (decreasing_accuracy(last_z_align_move[zstepper], z_align_abs)) {
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " last_z_align_move = ", last_z_align_move[zstepper]);
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " z_align_abs = ", z_align_abs);
|
||||
adjustment_reverse = !adjustment_reverse;
|
||||
}
|
||||
|
||||
// Remember the alignment for the next iteration, but only if steppers move,
|
||||
// otherwise it would be just zero (in case this stepper was at z_measured_min already)
|
||||
if (z_align_abs > 0) last_z_align_move[zstepper] = z_align_abs;
|
||||
#endif
|
||||
|
||||
// Stop early if all measured points achieve accuracy target
|
||||
if (z_align_abs > z_auto_align_accuracy) success_break = false;
|
||||
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " corrected by ", z_align_move);
|
||||
|
||||
// Lock all steppers except one
|
||||
stepper.set_all_z_lock(true, zstepper);
|
||||
|
||||
#if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
// Decreasing accuracy was detected so move was inverted.
|
||||
// Will match reversed Z steppers on dual steppers. Triple will need more work to map.
|
||||
if (adjustment_reverse) {
|
||||
z_align_move = -z_align_move;
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " correction reversed to ", z_align_move);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Do a move to correct part of the misalignment for the current stepper
|
||||
do_blocking_move_to_z(amplification * z_align_move + current_position.z);
|
||||
} // for (zstepper)
|
||||
|
||||
// Back to normal stepper operations
|
||||
stepper.set_all_z_lock(false);
|
||||
stepper.set_separate_multi_axis(false);
|
||||
|
||||
if (err_break) break;
|
||||
|
||||
if (success_break) {
|
||||
SERIAL_ECHOLNPGM("Target accuracy achieved.");
|
||||
LCD_MESSAGEPGM(MSG_ACCURACY_ACHIEVED);
|
||||
const int8_t z_auto_align_iterations = parser.intval('I', Z_STEPPER_ALIGN_ITERATIONS);
|
||||
if (!WITHIN(z_auto_align_iterations, 1, 30)) {
|
||||
SERIAL_ECHOLNPGM("?(I)teration out of bounds (1-30).");
|
||||
break;
|
||||
}
|
||||
|
||||
iteration++;
|
||||
} // while (iteration < z_auto_align_iterations)
|
||||
const float z_auto_align_accuracy = parser.floatval('T', Z_STEPPER_ALIGN_ACC);
|
||||
if (!WITHIN(z_auto_align_accuracy, 0.01f, 1.0f)) {
|
||||
SERIAL_ECHOLNPGM("?(T)arget accuracy out of bounds (0.01-1.0).");
|
||||
break;
|
||||
}
|
||||
|
||||
if (err_break)
|
||||
SERIAL_ECHOLNPGM("G34 aborted.");
|
||||
else {
|
||||
SERIAL_ECHOLNPAIR("Did ", int(iteration + (iteration != z_auto_align_iterations)), " of ", int(z_auto_align_iterations));
|
||||
SERIAL_ECHOLNPAIR_F("Accuracy: ", z_maxdiff);
|
||||
}
|
||||
const float z_auto_align_amplification = TERN(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS, Z_STEPPER_ALIGN_AMP, parser.floatval('A', Z_STEPPER_ALIGN_AMP));
|
||||
if (!WITHIN(ABS(z_auto_align_amplification), 0.5f, 2.0f)) {
|
||||
SERIAL_ECHOLNPGM("?(A)mplification out of bounds (0.5-2.0).");
|
||||
break;
|
||||
}
|
||||
|
||||
// Stow the probe, as the last call to probe.probe_at_point(...) left
|
||||
// the probe deployed if it was successful.
|
||||
probe.stow();
|
||||
if (parser.seen('R')) z_stepper_align.reset_to_default();
|
||||
|
||||
#if ENABLED(HOME_AFTER_G34)
|
||||
// After this operation the z position needs correction
|
||||
set_axis_never_homed(Z_AXIS);
|
||||
// Home Z after the alignment procedure
|
||||
process_subcommands_now_P(PSTR("G28Z"));
|
||||
#else
|
||||
// Use the probed height from the last iteration to determine the Z height.
|
||||
// z_measured_min is used, because all steppers are aligned to z_measured_min.
|
||||
// Ideally, this would be equal to the 'z_probe * 0.5f' which was added earlier.
|
||||
current_position.z -= z_measured_min - (float)Z_CLEARANCE_BETWEEN_PROBES;
|
||||
const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE;
|
||||
|
||||
// Disable the leveling matrix before auto-aligning
|
||||
#if HAS_LEVELING
|
||||
TERN_(RESTORE_LEVELING_AFTER_G34, const bool leveling_was_active = planner.leveling_active);
|
||||
set_bed_leveling_enabled(false);
|
||||
#endif
|
||||
|
||||
TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY);
|
||||
|
||||
// Always home with tool 0 active
|
||||
#if HAS_MULTI_HOTEND
|
||||
const uint8_t old_tool_index = active_extruder;
|
||||
tool_change(0, true);
|
||||
#endif
|
||||
|
||||
TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false));
|
||||
|
||||
// In BLTOUCH HS mode, the probe travels in a deployed state.
|
||||
// Users of G34 might have a badly misaligned bed, so raise Z by the
|
||||
// length of the deployed pin (BLTOUCH stroke < 7mm)
|
||||
#define Z_BASIC_CLEARANCE (Z_CLEARANCE_BETWEEN_PROBES + 7.0f * BOTH(BLTOUCH, BLTOUCH_HS_MODE))
|
||||
|
||||
// Compute a worst-case clearance height to probe from. After the first
|
||||
// iteration this will be re-calculated based on the actual bed position
|
||||
auto magnitude2 = [&](const uint8_t i, const uint8_t j) {
|
||||
const xy_pos_t diff = z_stepper_align.xy[i] - z_stepper_align.xy[j];
|
||||
return HYPOT2(diff.x, diff.y);
|
||||
};
|
||||
float z_probe = Z_BASIC_CLEARANCE + (G34_MAX_GRADE) * 0.01f * SQRT(
|
||||
#if NUM_Z_STEPPER_DRIVERS == 3
|
||||
_MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 0))
|
||||
#elif NUM_Z_STEPPER_DRIVERS == 4
|
||||
_MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 3),
|
||||
magnitude2(3, 0), magnitude2(0, 2), magnitude2(1, 3))
|
||||
#else
|
||||
magnitude2(0, 1)
|
||||
#endif
|
||||
);
|
||||
|
||||
// Home before the alignment procedure
|
||||
if (!all_axes_known()) home_all_axes();
|
||||
|
||||
// Move the Z coordinate realm towards the positive - dirty trick
|
||||
current_position.z += z_probe * 0.5f;
|
||||
sync_plan_position();
|
||||
#endif
|
||||
// Now, the Z origin lies below the build plate. That allows to probe deeper, before run_z_probe throws an error.
|
||||
// This hack is un-done at the end of G34 - either by re-homing, or by using the probed heights of the last iteration.
|
||||
|
||||
// Restore the active tool after homing
|
||||
TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index, DISABLED(PARKING_EXTRUDER))); // Fetch previous tool for parking extruder
|
||||
#if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
float last_z_align_move[NUM_Z_STEPPER_DRIVERS] = ARRAY_N(NUM_Z_STEPPER_DRIVERS, 10000.0f, 10000.0f, 10000.0f, 10000.0f);
|
||||
#else
|
||||
float last_z_align_level_indicator = 10000.0f;
|
||||
#endif
|
||||
float z_measured[NUM_Z_STEPPER_DRIVERS] = { 0 },
|
||||
z_maxdiff = 0.0f,
|
||||
amplification = z_auto_align_amplification;
|
||||
|
||||
#if BOTH(HAS_LEVELING, RESTORE_LEVELING_AFTER_G34)
|
||||
set_bed_leveling_enabled(leveling_was_active);
|
||||
#endif
|
||||
#if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
bool adjustment_reverse = false;
|
||||
#endif
|
||||
|
||||
}while(0);
|
||||
#if HAS_DISPLAY
|
||||
PGM_P const msg_iteration = GET_TEXT(MSG_ITERATION);
|
||||
const uint8_t iter_str_len = strlen_P(msg_iteration);
|
||||
#endif
|
||||
|
||||
// Final z and iteration values will be used after breaking the loop
|
||||
float z_measured_min;
|
||||
uint8_t iteration = 0;
|
||||
bool err_break = false; // To break out of nested loops
|
||||
while (iteration < z_auto_align_iterations) {
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> probing all positions.");
|
||||
|
||||
const int iter = iteration + 1;
|
||||
SERIAL_ECHOLNPAIR("\nG34 Iteration: ", iter);
|
||||
#if HAS_DISPLAY
|
||||
char str[iter_str_len + 2 + 1];
|
||||
sprintf_P(str, msg_iteration, iter);
|
||||
ui.set_status(str);
|
||||
#endif
|
||||
|
||||
// Initialize minimum value
|
||||
z_measured_min = 100000.0f;
|
||||
float z_measured_max = -100000.0f;
|
||||
|
||||
// Probe all positions (one per Z-Stepper)
|
||||
LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) {
|
||||
// iteration odd/even --> downward / upward stepper sequence
|
||||
const uint8_t iprobe = (iteration & 1) ? NUM_Z_STEPPER_DRIVERS - 1 - i : i;
|
||||
|
||||
// Safe clearance even on an incline
|
||||
if ((iteration == 0 || i > 0) && z_probe > current_position.z) do_blocking_move_to_z(z_probe);
|
||||
|
||||
if (DEBUGGING(LEVELING))
|
||||
DEBUG_ECHOLNPAIR_P(PSTR("Probing X"), z_stepper_align.xy[iprobe].x, SP_Y_STR, z_stepper_align.xy[iprobe].y);
|
||||
|
||||
// Probe a Z height for each stepper.
|
||||
// Probing sanity check is disabled, as it would trigger even in normal cases because
|
||||
// current_position.z has been manually altered in the "dirty trick" above.
|
||||
const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false);
|
||||
if (isnan(z_probed_height)) {
|
||||
SERIAL_ECHOLNPGM("Probing failed");
|
||||
LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED);
|
||||
err_break = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Add height to each value, to provide a more useful target height for
|
||||
// the next iteration of probing. This allows adjustments to be made away from the bed.
|
||||
z_measured[iprobe] = z_probed_height + Z_CLEARANCE_BETWEEN_PROBES;
|
||||
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(iprobe + 1), " measured position is ", z_measured[iprobe]);
|
||||
|
||||
// Remember the minimum measurement to calculate the correction later on
|
||||
z_measured_min = _MIN(z_measured_min, z_measured[iprobe]);
|
||||
z_measured_max = _MAX(z_measured_max, z_measured[iprobe]);
|
||||
} // for (i)
|
||||
|
||||
if (err_break) break;
|
||||
|
||||
// Adapt the next probe clearance height based on the new measurements.
|
||||
// Safe_height = lowest distance to bed (= highest measurement) plus highest measured misalignment.
|
||||
z_maxdiff = z_measured_max - z_measured_min;
|
||||
z_probe = Z_BASIC_CLEARANCE + z_measured_max + z_maxdiff;
|
||||
|
||||
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
// Replace the initial values in z_measured with calculated heights at
|
||||
// each stepper position. This allows the adjustment algorithm to be
|
||||
// shared between both possible probing mechanisms.
|
||||
|
||||
// This must be done after the next z_probe height is calculated, so that
|
||||
// the height is calculated from actual print area positions, and not
|
||||
// extrapolated motor movements.
|
||||
|
||||
// Compute the least-squares fit for all probed points.
|
||||
// Calculate the Z position of each stepper and store it in z_measured.
|
||||
// This allows the actual adjustment logic to be shared by both algorithms.
|
||||
linear_fit_data lfd;
|
||||
incremental_LSF_reset(&lfd);
|
||||
LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) {
|
||||
SERIAL_ECHOLNPAIR("PROBEPT_", int(i), ": ", z_measured[i]);
|
||||
incremental_LSF(&lfd, z_stepper_align.xy[i], z_measured[i]);
|
||||
}
|
||||
finish_incremental_LSF(&lfd);
|
||||
|
||||
z_measured_min = 100000.0f;
|
||||
LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) {
|
||||
z_measured[i] = -(lfd.A * z_stepper_align.stepper_xy[i].x + lfd.B * z_stepper_align.stepper_xy[i].y + lfd.D);
|
||||
z_measured_min = _MIN(z_measured_min, z_measured[i]);
|
||||
}
|
||||
|
||||
SERIAL_ECHOLNPAIR("CALCULATED STEPPER POSITIONS: Z1=", z_measured[0], " Z2=", z_measured[1], " Z3=", z_measured[2]);
|
||||
#endif
|
||||
|
||||
SERIAL_ECHOLNPAIR("\n"
|
||||
"DIFFERENCE Z1-Z2=", ABS(z_measured[0] - z_measured[1])
|
||||
#if NUM_Z_STEPPER_DRIVERS == 3
|
||||
, " Z2-Z3=", ABS(z_measured[1] - z_measured[2])
|
||||
, " Z3-Z1=", ABS(z_measured[2] - z_measured[0])
|
||||
#endif
|
||||
);
|
||||
#if HAS_DISPLAY
|
||||
char fstr1[10];
|
||||
#if NUM_Z_STEPPER_DRIVERS == 2
|
||||
char msg[6 + (6 + 5) * 1 + 1];
|
||||
#else
|
||||
char msg[6 + (6 + 5) * 3 + 1], fstr2[10], fstr3[10];
|
||||
#endif
|
||||
sprintf_P(msg,
|
||||
PSTR("Diffs Z1-Z2=%s"
|
||||
#if NUM_Z_STEPPER_DRIVERS == 3
|
||||
" Z2-Z3=%s"
|
||||
" Z3-Z1=%s"
|
||||
#endif
|
||||
), dtostrf(ABS(z_measured[0] - z_measured[1]), 1, 3, fstr1)
|
||||
#if NUM_Z_STEPPER_DRIVERS == 3
|
||||
, dtostrf(ABS(z_measured[1] - z_measured[2]), 1, 3, fstr2)
|
||||
, dtostrf(ABS(z_measured[2] - z_measured[0]), 1, 3, fstr3)
|
||||
#endif
|
||||
);
|
||||
ui.set_status(msg);
|
||||
#endif
|
||||
|
||||
auto decreasing_accuracy = [](const float &v1, const float &v2){
|
||||
if (v1 < v2 * 0.7f) {
|
||||
SERIAL_ECHOLNPGM("Decreasing Accuracy Detected.");
|
||||
LCD_MESSAGEPGM(MSG_DECREASING_ACCURACY);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
|
||||
// Check if the applied corrections go in the correct direction.
|
||||
// Calculate the sum of the absolute deviations from the mean of the probe measurements.
|
||||
// Compare to the last iteration to ensure it's getting better.
|
||||
|
||||
// Calculate mean value as a reference
|
||||
float z_measured_mean = 0.0f;
|
||||
LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) z_measured_mean += z_measured[zstepper];
|
||||
z_measured_mean /= NUM_Z_STEPPER_DRIVERS;
|
||||
|
||||
// Calculate the sum of the absolute deviations from the mean value
|
||||
float z_align_level_indicator = 0.0f;
|
||||
LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS)
|
||||
z_align_level_indicator += ABS(z_measured[zstepper] - z_measured_mean);
|
||||
|
||||
// If it's getting worse, stop and throw an error
|
||||
err_break = decreasing_accuracy(last_z_align_level_indicator, z_align_level_indicator);
|
||||
if (err_break) break;
|
||||
|
||||
last_z_align_level_indicator = z_align_level_indicator;
|
||||
#endif
|
||||
|
||||
// The following correction actions are to be enabled for select Z-steppers only
|
||||
stepper.set_separate_multi_axis(true);
|
||||
|
||||
bool success_break = true;
|
||||
// Correct the individual stepper offsets
|
||||
LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) {
|
||||
// Calculate current stepper move
|
||||
float z_align_move = z_measured[zstepper] - z_measured_min;
|
||||
const float z_align_abs = ABS(z_align_move);
|
||||
|
||||
#if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
// Optimize one iteration's correction based on the first measurements
|
||||
if (z_align_abs) amplification = (iteration == 1) ? _MIN(last_z_align_move[zstepper] / z_align_abs, 2.0f) : z_auto_align_amplification;
|
||||
|
||||
// Check for less accuracy compared to last move
|
||||
if (decreasing_accuracy(last_z_align_move[zstepper], z_align_abs)) {
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " last_z_align_move = ", last_z_align_move[zstepper]);
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " z_align_abs = ", z_align_abs);
|
||||
adjustment_reverse = !adjustment_reverse;
|
||||
}
|
||||
|
||||
// Remember the alignment for the next iteration, but only if steppers move,
|
||||
// otherwise it would be just zero (in case this stepper was at z_measured_min already)
|
||||
if (z_align_abs > 0) last_z_align_move[zstepper] = z_align_abs;
|
||||
#endif
|
||||
|
||||
// Stop early if all measured points achieve accuracy target
|
||||
if (z_align_abs > z_auto_align_accuracy) success_break = false;
|
||||
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " corrected by ", z_align_move);
|
||||
|
||||
// Lock all steppers except one
|
||||
stepper.set_all_z_lock(true, zstepper);
|
||||
|
||||
#if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||
// Decreasing accuracy was detected so move was inverted.
|
||||
// Will match reversed Z steppers on dual steppers. Triple will need more work to map.
|
||||
if (adjustment_reverse) {
|
||||
z_align_move = -z_align_move;
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " correction reversed to ", z_align_move);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Do a move to correct part of the misalignment for the current stepper
|
||||
do_blocking_move_to_z(amplification * z_align_move + current_position.z);
|
||||
} // for (zstepper)
|
||||
|
||||
// Back to normal stepper operations
|
||||
stepper.set_all_z_lock(false);
|
||||
stepper.set_separate_multi_axis(false);
|
||||
|
||||
if (err_break) break;
|
||||
|
||||
if (success_break) {
|
||||
SERIAL_ECHOLNPGM("Target accuracy achieved.");
|
||||
LCD_MESSAGEPGM(MSG_ACCURACY_ACHIEVED);
|
||||
break;
|
||||
}
|
||||
|
||||
iteration++;
|
||||
} // while (iteration < z_auto_align_iterations)
|
||||
|
||||
if (err_break)
|
||||
SERIAL_ECHOLNPGM("G34 aborted.");
|
||||
else {
|
||||
SERIAL_ECHOLNPAIR("Did ", int(iteration + (iteration != z_auto_align_iterations)), " of ", int(z_auto_align_iterations));
|
||||
SERIAL_ECHOLNPAIR_F("Accuracy: ", z_maxdiff);
|
||||
}
|
||||
|
||||
// Stow the probe, as the last call to probe.probe_at_point(...) left
|
||||
// the probe deployed if it was successful.
|
||||
probe.stow();
|
||||
|
||||
#if ENABLED(HOME_AFTER_G34)
|
||||
// After this operation the z position needs correction
|
||||
set_axis_never_homed(Z_AXIS);
|
||||
// Home Z after the alignment procedure
|
||||
process_subcommands_now_P(PSTR("G28Z"));
|
||||
#else
|
||||
// Use the probed height from the last iteration to determine the Z height.
|
||||
// z_measured_min is used, because all steppers are aligned to z_measured_min.
|
||||
// Ideally, this would be equal to the 'z_probe * 0.5f' which was added earlier.
|
||||
current_position.z -= z_measured_min - (float)Z_CLEARANCE_BETWEEN_PROBES;
|
||||
sync_plan_position();
|
||||
#endif
|
||||
|
||||
// Restore the active tool after homing
|
||||
TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index, DISABLED(PARKING_EXTRUDER))); // Fetch previous tool for parking extruder
|
||||
|
||||
#if BOTH(HAS_LEVELING, RESTORE_LEVELING_AFTER_G34)
|
||||
set_bed_leveling_enabled(leveling_was_active);
|
||||
#endif
|
||||
|
||||
}while(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // Z_MULTI_ENDSTOPS || Z_STEPPER_AUTO_ALIGN
|
||||
|
||||
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
|
||||
|
||||
/**
|
||||
* M422: Set a Z-Stepper automatic alignment XY point.
|
||||
* Use repeatedly to set multiple points.
|
||||
|
||||
@@ -31,13 +31,13 @@
|
||||
*
|
||||
* Report the current speed percentage factor if no parameter is specified
|
||||
*
|
||||
* With PRUSA_MMU2...
|
||||
* For MMU2 and MMU2S devices...
|
||||
* B : Flag to back up the current factor
|
||||
* R : Flag to restore the last-saved factor
|
||||
*/
|
||||
void GcodeSuite::M220() {
|
||||
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#if HAS_PRUSA_MMU2
|
||||
static int16_t backup_feedrate_percentage = 100;
|
||||
if (parser.seen('B')) backup_feedrate_percentage = feedrate_percentage;
|
||||
if (parser.seen('R')) feedrate_percentage = backup_feedrate_percentage;
|
||||
|
||||
@@ -103,6 +103,10 @@
|
||||
}
|
||||
idex_set_parked(false);
|
||||
set_duplication_enabled(false);
|
||||
|
||||
#ifdef EVENT_GCODE_IDEX_AFTER_MODECHANGE
|
||||
gcode.process_subcommands_now_P(PSTR(EVENT_GCODE_IDEX_AFTER_MODECHANGE));
|
||||
#endif
|
||||
}
|
||||
else if (!parser.seen('W')) // if no S or W parameter, the DXC mode gets reset to the user's default
|
||||
dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE;
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
#include "../../module/motion.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#include "../../feature/mmu2/mmu2.h"
|
||||
#if HAS_PRUSA_MMU2
|
||||
#include "../../feature/mmu/mmu2.h"
|
||||
#endif
|
||||
|
||||
#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)
|
||||
@@ -40,7 +40,7 @@
|
||||
* F[units/min] Set the movement feedrate
|
||||
* S1 Don't move the tool in XY after change
|
||||
*
|
||||
* For PRUSA_MMU2:
|
||||
* For PRUSA_MMU2(S) and SMUFF_EMU_MMU2(S)
|
||||
* T[n] Gcode to extrude at least 38.10 mm at feedrate 19.02 mm/s must follow immediately to load to extruder wheels.
|
||||
* T? Gcode to extrude shouldn't have to follow. Load to extruder wheels is done automatically.
|
||||
* Tx Same as T?, but nozzle doesn't have to be preheated. Tc requires a preheated nozzle to finish filament load.
|
||||
@@ -54,7 +54,7 @@ void GcodeSuite::T(const int8_t tool_index) {
|
||||
// Count this command as movement / activity
|
||||
reset_stepper_timeout();
|
||||
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#if HAS_PRUSA_MMU2
|
||||
if (parser.string_arg) {
|
||||
mmu2.tool_change(parser.string_arg); // Special commands T?/Tx/Tc
|
||||
return;
|
||||
|
||||
@@ -308,8 +308,8 @@ void GcodeSuite::M917() {
|
||||
L64xxManager.set_param(axis_index[j], L6470_KVAL_HOLD, kval_hold);
|
||||
}
|
||||
DEBUG_ECHOLNPGM(".");
|
||||
gcode.reset_stepper_timeout(); // reset_stepper_timeout to keep steppers powered
|
||||
watchdog_refresh();; // beat the dog
|
||||
gcode.reset_stepper_timeout(); // keep steppers powered
|
||||
watchdog_refresh();
|
||||
safe_delay(5000);
|
||||
status_composite_temp = 0;
|
||||
for (j = 0; j < driver_count; j++) {
|
||||
|
||||
@@ -88,7 +88,7 @@ void GcodeSuite::M600() {
|
||||
// In this case, for duplicating modes set DXC_ext to the extruder that ran out.
|
||||
#if HAS_FILAMENT_SENSOR && NUM_RUNOUT_SENSORS > 1
|
||||
if (idex_is_duplicating())
|
||||
DXC_ext = (READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_STATE) ? 1 : 0;
|
||||
DXC_ext = (READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT2_STATE) ? 1 : 0;
|
||||
#else
|
||||
DXC_ext = active_extruder;
|
||||
#endif
|
||||
|
||||
@@ -38,8 +38,8 @@
|
||||
#include "../../../lcd/marlinui.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#include "../../../feature/mmu2/mmu2.h"
|
||||
#if HAS_PRUSA_MMU2
|
||||
#include "../../../feature/mmu/mmu2.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(MIXING_EXTRUDER)
|
||||
@@ -86,7 +86,7 @@ void GcodeSuite::M701() {
|
||||
// Show initial "wait for load" message
|
||||
TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_LOAD, PAUSE_MODE_LOAD_FILAMENT, target_extruder));
|
||||
|
||||
#if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2)
|
||||
#if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU)
|
||||
// Change toolhead if specified
|
||||
uint8_t active_extruder_before_filament_change = active_extruder;
|
||||
if (active_extruder != target_extruder)
|
||||
@@ -98,7 +98,7 @@ void GcodeSuite::M701() {
|
||||
do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
|
||||
|
||||
// Load filament
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#if HAS_PRUSA_MMU2
|
||||
mmu2.load_filament_to_nozzle(target_extruder);
|
||||
#else
|
||||
constexpr float purge_length = ADVANCED_PAUSE_PURGE_LENGTH,
|
||||
@@ -121,7 +121,7 @@ void GcodeSuite::M701() {
|
||||
if (park_point.z > 0)
|
||||
do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
|
||||
|
||||
#if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2)
|
||||
#if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU)
|
||||
// Restore toolhead if it was changed
|
||||
if (active_extruder_before_filament_change != active_extruder)
|
||||
tool_change(active_extruder_before_filament_change, false);
|
||||
@@ -186,7 +186,7 @@ void GcodeSuite::M702() {
|
||||
// Show initial "wait for unload" message
|
||||
TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, PAUSE_MODE_UNLOAD_FILAMENT, target_extruder));
|
||||
|
||||
#if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2)
|
||||
#if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU)
|
||||
// Change toolhead if specified
|
||||
uint8_t active_extruder_before_filament_change = active_extruder;
|
||||
if (active_extruder != target_extruder)
|
||||
@@ -198,7 +198,7 @@ void GcodeSuite::M702() {
|
||||
do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
|
||||
|
||||
// Unload filament
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#if HAS_PRUSA_MMU2
|
||||
mmu2.unload();
|
||||
#else
|
||||
#if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_UNLOAD_ALL_EXTRUDERS)
|
||||
@@ -227,7 +227,7 @@ void GcodeSuite::M702() {
|
||||
if (park_point.z > 0)
|
||||
do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
|
||||
|
||||
#if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2)
|
||||
#if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU)
|
||||
// Restore toolhead if it was changed
|
||||
if (active_extruder_before_filament_change != active_extruder)
|
||||
tool_change(active_extruder_before_filament_change, false);
|
||||
|
||||
@@ -22,10 +22,10 @@
|
||||
|
||||
#include "../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#if HAS_PRUSA_MMU2
|
||||
|
||||
#include "../../gcode.h"
|
||||
#include "../../../feature/mmu2/mmu2.h"
|
||||
#include "../../../feature/mmu/mmu2.h"
|
||||
|
||||
/**
|
||||
* M403: Set filament type for MMU2
|
||||
@@ -46,4 +46,4 @@ void GcodeSuite::M403() {
|
||||
SERIAL_ECHO_MSG("M403 - bad arguments.");
|
||||
}
|
||||
|
||||
#endif // PRUSA_MMU2
|
||||
#endif // HAS_PRUSA_MMU2
|
||||
|
||||
@@ -250,7 +250,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
|
||||
* Will still block Gcodes if M511 is disabled, in which case the printer should be unlocked via LCD Menu
|
||||
*/
|
||||
#if ENABLED(PASSWORD_FEATURE)
|
||||
if (password.is_locked && !(parser.command_letter == 'M' && parser.codenum == 511)) {
|
||||
if (password.is_locked && !parser.is_command('M', 511)) {
|
||||
SERIAL_ECHO_MSG(STR_PRINTER_LOCKED);
|
||||
return;
|
||||
}
|
||||
@@ -327,7 +327,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
|
||||
case 33: G33(); break; // G33: Delta Auto-Calibration
|
||||
#endif
|
||||
|
||||
#if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION)
|
||||
#if ANY(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION)
|
||||
case 34: G34(); break; // G34: Z Stepper automatic alignment using probe
|
||||
#endif
|
||||
|
||||
@@ -702,7 +702,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
|
||||
case 402: M402(); break; // M402: Stow probe
|
||||
#endif
|
||||
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#if HAS_PRUSA_MMU2
|
||||
case 403: M403(); break;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -181,7 +181,7 @@
|
||||
* M217 - Set filament swap parameters: "M217 S<length> P<feedrate> R<feedrate>". (Requires SINGLENOZZLE)
|
||||
* M218 - Set/get a tool offset: "M218 T<index> X<offset> Y<offset>". (Requires 2 or more extruders)
|
||||
* M220 - Set Feedrate Percentage: "M220 S<percent>" (i.e., "FR" on the LCD)
|
||||
* Use "M220 B" to back up the Feedrate Percentage and "M220 R" to restore it. (Requires PRUSA_MMU2)
|
||||
* Use "M220 B" to back up the Feedrate Percentage and "M220 R" to restore it. (Requires an MMU_MODEL version 2 or 2S)
|
||||
* M221 - Set Flow Percentage: "M221 S<percent>"
|
||||
* M226 - Wait until a pin is in a given state: "M226 P<pin> S<state>" (Requires DIRECT_PIN_CONTROL)
|
||||
* M240 - Trigger a camera to take a photograph. (Requires PHOTO_GCODE)
|
||||
@@ -468,7 +468,7 @@ private:
|
||||
|
||||
TERN_(DELTA_AUTO_CALIBRATION, static void G33());
|
||||
|
||||
#if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION)
|
||||
#if ANY(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION)
|
||||
static void G34();
|
||||
#endif
|
||||
|
||||
@@ -735,7 +735,7 @@ private:
|
||||
static void M402();
|
||||
#endif
|
||||
|
||||
TERN_(PRUSA_MMU2, static void M403());
|
||||
TERN_(HAS_PRUSA_MMU2, static void M403());
|
||||
|
||||
#if ENABLED(FILAMENT_WIDTH_SENSOR)
|
||||
static void M404();
|
||||
@@ -769,12 +769,8 @@ private:
|
||||
|
||||
#if ENABLED(PASSWORD_FEATURE)
|
||||
static void M510();
|
||||
#if ENABLED(PASSWORD_UNLOCK_GCODE)
|
||||
static void M511();
|
||||
#endif
|
||||
#if ENABLED(PASSWORD_CHANGE_GCODE)
|
||||
static void M512();
|
||||
#endif
|
||||
TERN_(PASSWORD_UNLOCK_GCODE, static void M511());
|
||||
TERN_(PASSWORD_CHANGE_GCODE, static void M512());
|
||||
#endif
|
||||
|
||||
TERN_(SDSUPPORT, static void M524());
|
||||
|
||||
@@ -28,16 +28,24 @@
|
||||
#include "../../module/motion.h"
|
||||
#include "../../module/planner.h"
|
||||
|
||||
static void config_prefix(PGM_P const name, PGM_P const pref=nullptr) {
|
||||
#if EXTRUDERS
|
||||
#include "../../module/temperature.h"
|
||||
#endif
|
||||
|
||||
static void config_prefix(PGM_P const name, PGM_P const pref=nullptr, const int8_t ind=-1) {
|
||||
SERIAL_ECHOPGM("Config:");
|
||||
if (pref) serialprintPGM(pref);
|
||||
if (ind >= 0) { SERIAL_ECHO(int(ind)); SERIAL_CHAR(':'); }
|
||||
serialprintPGM(name);
|
||||
SERIAL_CHAR(':');
|
||||
}
|
||||
static void config_line(PGM_P const name, const float val, PGM_P const pref=nullptr) {
|
||||
config_prefix(name, pref);
|
||||
static void config_line(PGM_P const name, const float val, PGM_P const pref=nullptr, const int8_t ind=-1) {
|
||||
config_prefix(name, pref, ind);
|
||||
SERIAL_ECHOLN(val);
|
||||
}
|
||||
static void config_line_e(const int8_t e, PGM_P const name, const float val) {
|
||||
config_line(name, val, PSTR("Extr."), e + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* M360: Report Firmware configuration
|
||||
@@ -52,19 +60,19 @@ void GcodeSuite::M360() {
|
||||
//
|
||||
// Basics and Enabled items
|
||||
//
|
||||
config_line(PSTR("Baudrate"), BAUDRATE);
|
||||
config_line(PSTR("InputBuffer"), MAX_CMD_SIZE);
|
||||
config_line(PSTR("PrintlineCache"), BUFSIZE);
|
||||
config_line(PSTR("MixingExtruder"), ENABLED(MIXING_EXTRUDER));
|
||||
config_line(PSTR("SDCard"), ENABLED(SDSUPPORT));
|
||||
config_line(PSTR("Fan"), ENABLED(HAS_FAN));
|
||||
config_line(PSTR("LCD"), ENABLED(HAS_DISPLAY));
|
||||
config_line(PSTR("Baudrate"), BAUDRATE);
|
||||
config_line(PSTR("InputBuffer"), MAX_CMD_SIZE);
|
||||
config_line(PSTR("PrintlineCache"), BUFSIZE);
|
||||
config_line(PSTR("MixingExtruder"), ENABLED(MIXING_EXTRUDER));
|
||||
config_line(PSTR("SDCard"), ENABLED(SDSUPPORT));
|
||||
config_line(PSTR("Fan"), ENABLED(HAS_FAN));
|
||||
config_line(PSTR("LCD"), ENABLED(HAS_DISPLAY));
|
||||
config_line(PSTR("SoftwarePowerSwitch"), 1);
|
||||
config_line(PSTR("SupportLocalFilamentchange"), ENABLED(ADVANCED_PAUSE_FEATURE));
|
||||
config_line(PSTR("CaseLights"), ENABLED(CASE_LIGHT_ENABLE));
|
||||
config_line(PSTR("ZProbe"), ENABLED(HAS_BED_PROBE));
|
||||
config_line(PSTR("Autolevel"), ENABLED(HAS_LEVELING));
|
||||
config_line(PSTR("EEPROM"), ENABLED(EEPROM_SETTINGS));
|
||||
config_line(PSTR("CaseLights"), ENABLED(CASE_LIGHT_ENABLE));
|
||||
config_line(PSTR("ZProbe"), ENABLED(HAS_BED_PROBE));
|
||||
config_line(PSTR("Autolevel"), ENABLED(HAS_LEVELING));
|
||||
config_line(PSTR("EEPROM"), ENABLED(EEPROM_SETTINGS));
|
||||
|
||||
//
|
||||
// Homing Directions
|
||||
@@ -96,15 +104,15 @@ void GcodeSuite::M360() {
|
||||
PGMSTR(UNRET_STR, "RetractionUndo");
|
||||
PGMSTR(SPEED_STR, "Speed");
|
||||
// M10 Retract with swap (long) moves
|
||||
config_line(PSTR("Length"), fwretract.settings.retract_length, RET_STR);
|
||||
config_line(SPEED_STR, fwretract.settings.retract_feedrate_mm_s, RET_STR);
|
||||
config_line(PSTR("ZLift"), fwretract.settings.retract_zraise, RET_STR);
|
||||
config_line(PSTR("Length"), fwretract.settings.retract_length, RET_STR);
|
||||
config_line(SPEED_STR, fwretract.settings.retract_feedrate_mm_s, RET_STR);
|
||||
config_line(PSTR("ZLift"), fwretract.settings.retract_zraise, RET_STR);
|
||||
config_line(PSTR("LongLength"), fwretract.settings.swap_retract_length, RET_STR);
|
||||
// M11 Recover (undo) with swap (long) moves
|
||||
config_line(SPEED_STR, fwretract.settings.retract_recover_feedrate_mm_s, UNRET_STR);
|
||||
config_line(PSTR("ExtraLength"), fwretract.settings.retract_recover_extra, UNRET_STR);
|
||||
config_line(SPEED_STR, fwretract.settings.retract_recover_feedrate_mm_s, UNRET_STR);
|
||||
config_line(PSTR("ExtraLength"), fwretract.settings.retract_recover_extra, UNRET_STR);
|
||||
config_line(PSTR("ExtraLongLength"), fwretract.settings.swap_retract_recover_extra, UNRET_STR);
|
||||
config_line(PSTR("LongSpeed"), fwretract.settings.swap_retract_recover_feedrate_mm_s, UNRET_STR);
|
||||
config_line(PSTR("LongSpeed"), fwretract.settings.swap_retract_recover_feedrate_mm_s, UNRET_STR);
|
||||
#endif
|
||||
|
||||
//
|
||||
@@ -165,24 +173,13 @@ void GcodeSuite::M360() {
|
||||
//
|
||||
config_line(PSTR("NumExtruder"), EXTRUDERS);
|
||||
#if EXTRUDERS
|
||||
#define DIAM_VALUE(N) TERN(NO_VOLUMETRICS, DEFAULT_NOMINAL_FILAMENT_DIA, planner.filament_size[N])
|
||||
#if HAS_LINEAR_E_JERK
|
||||
#define E_JERK_VAL(N) planner.max_e_jerk[E_INDEX_N(N)]
|
||||
#elif HAS_CLASSIC_JERK
|
||||
#define E_JERK_VAL(N) planner.max_jerk.e
|
||||
#else
|
||||
#define E_JERK_VAL(N) DEFAULT_EJERK
|
||||
#endif
|
||||
#define _EXTR_ITEM(N) do{ \
|
||||
PGMSTR(EXTR_STR, "Extr." STRINGIFY(INCREMENT(N)) ":"); \
|
||||
config_line(JERK_STR, E_JERK_VAL(N), EXTR_STR); \
|
||||
config_line(PSTR("MaxSpeed"), planner.settings.max_feedrate_mm_s[E_AXIS_N(N)], EXTR_STR); \
|
||||
config_line(PSTR("Acceleration"), planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(N)], EXTR_STR); \
|
||||
config_line(PSTR("Diameter"), DIAM_VALUE(N), EXTR_STR); \
|
||||
config_line(PSTR("MaxTemp"), (HEATER_##N##_MAXTEMP) - (HOTEND_OVERSHOOT), EXTR_STR); \
|
||||
}while(0)
|
||||
|
||||
REPEAT(EXTRUDERS, _EXTR_ITEM);
|
||||
LOOP_L_N(e, EXTRUDERS) {
|
||||
config_line_e(e, JERK_STR, TERN(HAS_LINEAR_E_JERK, planner.max_e_jerk[E_INDEX_N(e)], TERN(HAS_CLASSIC_JERK, planner.max_jerk.e, DEFAULT_EJERK)));
|
||||
config_line_e(e, PSTR("MaxSpeed"), planner.settings.max_feedrate_mm_s[E_AXIS_N(e)]);
|
||||
config_line_e(e, PSTR("Acceleration"), planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(e)]);
|
||||
config_line_e(e, PSTR("Diameter"), TERN(NO_VOLUMETRICS, DEFAULT_NOMINAL_FILAMENT_DIA, planner.filament_size[e]));
|
||||
config_line_e(e, PSTR("MaxTemp"), thermalManager.heater_maxtemp[e]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -25,14 +25,23 @@
|
||||
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
|
||||
|
||||
#include "../gcode.h"
|
||||
#include "../../lcd/menu/menu.h"
|
||||
|
||||
#if ENABLED(TFT_LVGL_UI)
|
||||
#include "../../lcd/extui/lib/mks_ui/draw_touch_calibration.h"
|
||||
#else
|
||||
#include "../../lcd/menu/menu.h"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* M995: Touch screen calibration for TFT display
|
||||
*/
|
||||
void GcodeSuite::M995() {
|
||||
|
||||
ui.goto_screen(touch_screen_calibration);
|
||||
#if ENABLED(TFT_LVGL_UI)
|
||||
lv_draw_touch_calibration_screen();
|
||||
#else
|
||||
ui.goto_screen(touch_screen_calibration);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ char *GCodeParser::command_ptr,
|
||||
*GCodeParser::string_arg,
|
||||
*GCodeParser::value_ptr;
|
||||
char GCodeParser::command_letter;
|
||||
int GCodeParser::codenum;
|
||||
uint16_t GCodeParser::codenum;
|
||||
|
||||
#if ENABLED(USE_GCODE_SUBCODES)
|
||||
uint8_t GCodeParser::subcode;
|
||||
@@ -155,7 +155,7 @@ void GCodeParser::parse(char *p) {
|
||||
// Skip spaces to get the numeric part
|
||||
while (*p == ' ') p++;
|
||||
|
||||
#if ENABLED(PRUSA_MMU2)
|
||||
#if HAS_PRUSA_MMU2
|
||||
if (letter == 'T') {
|
||||
// check for special MMU2 T?/Tx/Tc commands
|
||||
if (*p == '?' || *p == 'x' || *p == 'c') {
|
||||
@@ -270,7 +270,7 @@ void GCodeParser::parse(char *p) {
|
||||
|
||||
// Special handling for M32 [P] !/path/to/file.g#
|
||||
// The path must be the last parameter
|
||||
if (param == '!' && letter == 'M' && codenum == 32) {
|
||||
if (param == '!' && is_command('M', 32)) {
|
||||
string_arg = p; // Name starts after '!'
|
||||
char * const lb = strchr(p, '#'); // Already seen '#' as SD char (to pause buffering)
|
||||
if (lb) *lb = '\0'; // Safe to mark the end of the filename
|
||||
|
||||
@@ -84,7 +84,7 @@ public:
|
||||
static char *command_ptr, // The command, so it can be echoed
|
||||
*string_arg, // string of command line
|
||||
command_letter; // G, M, or T
|
||||
static int codenum; // 123
|
||||
static uint16_t codenum; // 123
|
||||
#if ENABLED(USE_GCODE_SUBCODES)
|
||||
static uint8_t subcode; // .1
|
||||
#endif
|
||||
@@ -244,6 +244,9 @@ public:
|
||||
static bool chain();
|
||||
#endif
|
||||
|
||||
// Test whether the parsed command matches the input
|
||||
static inline bool is_command(const char ltr, const uint16_t num) { return command_letter == ltr && codenum == num; }
|
||||
|
||||
// The code value pointer was set
|
||||
FORCE_INLINE static bool has_value() { return !!value_ptr; }
|
||||
|
||||
|
||||
@@ -416,11 +416,14 @@ inline void process_stream_char(const char c, uint8_t &sis, char (&buff)[MAX_CMD
|
||||
* keep sensor readings going and watchdog alive.
|
||||
*/
|
||||
inline bool process_line_done(uint8_t &sis, char (&buff)[MAX_CMD_SIZE], int &ind) {
|
||||
sis = PS_NORMAL;
|
||||
buff[ind] = 0;
|
||||
if (ind) { ind = 0; return false; }
|
||||
thermalManager.manage_heater();
|
||||
return true;
|
||||
sis = PS_NORMAL; // "Normal" Serial Input State
|
||||
buff[ind] = '\0'; // Of course, I'm a Terminator.
|
||||
const bool is_empty = (ind == 0); // An empty line?
|
||||
if (is_empty)
|
||||
thermalManager.manage_heater(); // Keep sensors satisfied
|
||||
else
|
||||
ind = 0; // Start a new line
|
||||
return is_empty; // Inform the caller
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
* M31: Get the time since the start of SD Print (or last M109)
|
||||
*/
|
||||
void GcodeSuite::M31() {
|
||||
char buffer[21];
|
||||
char buffer[22];
|
||||
duration_t(print_job_timer.duration()).toString(buffer);
|
||||
|
||||
ui.set_status(buffer);
|
||||
|
||||
@@ -77,7 +77,7 @@ void GcodeSuite::M303() {
|
||||
KEEPALIVE_STATE(NOT_BUSY);
|
||||
#endif
|
||||
|
||||
ui.set_status(GET_TEXT(MSG_PID_AUTOTUNE));
|
||||
ui.set_status_P(GET_TEXT(MSG_PID_AUTOTUNE));
|
||||
thermalManager.PID_autotune(temp, e, c, u);
|
||||
ui.reset_status();
|
||||
}
|
||||
|
||||
@@ -495,6 +495,36 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Multi-Material-Unit supported models
|
||||
*/
|
||||
#define PRUSA_MMU1 1
|
||||
#define PRUSA_MMU2 2
|
||||
#define PRUSA_MMU2S 3
|
||||
#define SMUFF_EMU_MMU2 12
|
||||
#define SMUFF_EMU_MMU2S 13
|
||||
|
||||
#ifdef MMU_MODEL
|
||||
#define HAS_MMU 1
|
||||
#if MMU_MODEL == PRUSA_MMU1
|
||||
#define HAS_PRUSA_MMU1 1
|
||||
#elif MMU_MODEL % 10 == PRUSA_MMU2
|
||||
#define HAS_PRUSA_MMU2 1
|
||||
#elif MMU_MODEL % 10 == PRUSA_MMU2S
|
||||
#define HAS_PRUSA_MMU2 1
|
||||
#define HAS_PRUSA_MMU2S 1
|
||||
#endif
|
||||
#if MMU_MODEL >= SMUFF_EMU_MMU2
|
||||
#define HAS_SMUFF 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef PRUSA_MMU1
|
||||
#undef PRUSA_MMU2
|
||||
#undef PRUSA_MMU2S
|
||||
#undef SMUFF_EMU_MMU2
|
||||
#undef SMUFF_EMU_MMU2S
|
||||
|
||||
/**
|
||||
* Extruders have some combination of stepper motors and hotends
|
||||
* so we separate these concepts into the defines:
|
||||
@@ -512,8 +542,6 @@
|
||||
#undef SWITCHING_EXTRUDER
|
||||
#undef SWITCHING_NOZZLE
|
||||
#undef MIXING_EXTRUDER
|
||||
#undef MK2_MULTIPLEXER
|
||||
#undef PRUSA_MMU2
|
||||
#undef HOTEND_IDLE_TIMEOUT
|
||||
#elif EXTRUDERS > 1
|
||||
#define HAS_MULTI_EXTRUDER 1
|
||||
@@ -539,17 +567,17 @@
|
||||
#elif ENABLED(SWITCHING_TOOLHEAD)
|
||||
#define E_STEPPERS EXTRUDERS
|
||||
#define E_MANUAL EXTRUDERS
|
||||
#elif ENABLED(PRUSA_MMU2)
|
||||
#elif HAS_PRUSA_MMU2
|
||||
#define E_STEPPERS 1
|
||||
#endif
|
||||
|
||||
// No inactive extruders with MK2_MULTIPLEXER or SWITCHING_NOZZLE
|
||||
#if EITHER(MK2_MULTIPLEXER, SWITCHING_NOZZLE)
|
||||
// No inactive extruders with SWITCHING_NOZZLE or Průša MMU1
|
||||
#if ENABLED(SWITCHING_NOZZLE) || HAS_PRUSA_MMU1
|
||||
#undef DISABLE_INACTIVE_EXTRUDER
|
||||
#endif
|
||||
|
||||
// Průša MK2 Multiplexer and MMU 2.0 force SINGLENOZZLE
|
||||
#if EITHER(MK2_MULTIPLEXER, PRUSA_MMU2)
|
||||
// Průša MMU1, MMU 2.0, MMUS 2.0 and SMUFF force SINGLENOZZLE
|
||||
#if HAS_MMU
|
||||
#define SINGLENOZZLE
|
||||
#endif
|
||||
|
||||
@@ -675,6 +703,73 @@
|
||||
#define HAS_BED_PROBE 1
|
||||
#endif
|
||||
|
||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
||||
#if NUM_RUNOUT_SENSORS >= 1
|
||||
#ifndef FIL_RUNOUT1_STATE
|
||||
#define FIL_RUNOUT1_STATE FIL_RUNOUT_STATE
|
||||
#endif
|
||||
#ifndef FIL_RUNOUT1_PULL
|
||||
#define FIL_RUNOUT1_PULL FIL_RUNOUT_PULL
|
||||
#endif
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 2
|
||||
#ifndef FIL_RUNOUT2_STATE
|
||||
#define FIL_RUNOUT2_STATE FIL_RUNOUT_STATE
|
||||
#endif
|
||||
#ifndef FIL_RUNOUT2_PULL
|
||||
#define FIL_RUNOUT2_PULL FIL_RUNOUT_PULL
|
||||
#endif
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 3
|
||||
#ifndef FIL_RUNOUT3_STATE
|
||||
#define FIL_RUNOUT3_STATE FIL_RUNOUT_STATE
|
||||
#endif
|
||||
#ifndef FIL_RUNOUT3_PULL
|
||||
#define FIL_RUNOUT3_PULL FIL_RUNOUT_PULL
|
||||
#endif
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 4
|
||||
#ifndef FIL_RUNOUT4_STATE
|
||||
#define FIL_RUNOUT4_STATE FIL_RUNOUT_STATE
|
||||
#endif
|
||||
#ifndef FIL_RUNOUT4_PULL
|
||||
#define FIL_RUNOUT4_PULL FIL_RUNOUT_PULL
|
||||
#endif
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 5
|
||||
#ifndef FIL_RUNOUT5_STATE
|
||||
#define FIL_RUNOUT5_STATE FIL_RUNOUT_STATE
|
||||
#endif
|
||||
#ifndef FIL_RUNOUT5_PULL
|
||||
#define FIL_RUNOUT5_PULL FIL_RUNOUT_PULL
|
||||
#endif
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 6
|
||||
#ifndef FIL_RUNOUT6_STATE
|
||||
#define FIL_RUNOUT6_STATE FIL_RUNOUT_STATE
|
||||
#endif
|
||||
#ifndef FIL_RUNOUT6_PULL
|
||||
#define FIL_RUNOUT6_PULL FIL_RUNOUT_PULL
|
||||
#endif
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 7
|
||||
#ifndef FIL_RUNOUT7_STATE
|
||||
#define FIL_RUNOUT7_STATE FIL_RUNOUT_STATE
|
||||
#endif
|
||||
#ifndef FIL_RUNOUT7_PULL
|
||||
#define FIL_RUNOUT7_PULL FIL_RUNOUT_PULL
|
||||
#endif
|
||||
#endif
|
||||
#if NUM_RUNOUT_SENSORS >= 8
|
||||
#ifndef FIL_RUNOUT8_STATE
|
||||
#define FIL_RUNOUT8_STATE FIL_RUNOUT_STATE
|
||||
#endif
|
||||
#ifndef FIL_RUNOUT8_PULL
|
||||
#define FIL_RUNOUT8_PULL FIL_RUNOUT_PULL
|
||||
#endif
|
||||
#endif
|
||||
#endif // FILAMENT_RUNOUT_SENSOR
|
||||
|
||||
#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL)
|
||||
#undef PROBE_MANUALLY
|
||||
#endif
|
||||
@@ -711,6 +806,10 @@
|
||||
#undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN
|
||||
#endif
|
||||
|
||||
#if Z_HOME_DIR > 0
|
||||
#define HOME_Z_FIRST // If homing away from BED do Z first
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Set granular options based on the specific type of leveling
|
||||
*/
|
||||
@@ -1002,8 +1101,24 @@
|
||||
// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046'
|
||||
#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT
|
||||
#undef TOUCH_SCREEN
|
||||
#undef TOUCH_SCREEN_CALIBRATION
|
||||
#if !HAS_TFT_LVGL_UI
|
||||
#define HAS_TOUCH_XPT2046 1
|
||||
#define HAS_TOUCH_BUTTONS 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// XPT2046_** Compatibility
|
||||
#if !(defined(TOUCH_CALIBRATION_X) || defined(TOUCH_CALIBRATION_Y) || defined(TOUCH_OFFSET_X) || defined(TOUCH_OFFSET_Y) || defined(TOUCH_ORIENTATION))
|
||||
#if defined(XPT2046_X_CALIBRATION) && defined(XPT2046_Y_CALIBRATION) && defined(XPT2046_X_OFFSET) && defined(XPT2046_Y_OFFSET)
|
||||
#define TOUCH_CALIBRATION_X XPT2046_X_CALIBRATION
|
||||
#define TOUCH_CALIBRATION_Y XPT2046_Y_CALIBRATION
|
||||
#define TOUCH_OFFSET_X XPT2046_X_OFFSET
|
||||
#define TOUCH_OFFSET_Y XPT2046_Y_OFFSET
|
||||
#define TOUCH_ORIENTATION TOUCH_LANDSCAPE
|
||||
#else
|
||||
#define TOUCH_CALIBRATION_X 0
|
||||
#define TOUCH_CALIBRATION_Y 0
|
||||
#define TOUCH_OFFSET_X 0
|
||||
#define TOUCH_OFFSET_Y 0
|
||||
#define TOUCH_ORIENTATION TOUCH_ORIENTATION_NONE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -364,7 +364,7 @@
|
||||
|
||||
// Touch Screen or "Touch Buttons" need XPT2046 pins
|
||||
// but they use different components
|
||||
#if EITHER(HAS_TFT_XPT2046, HAS_TOUCH_XPT2046)
|
||||
#if EITHER(HAS_TFT_XPT2046, HAS_TOUCH_BUTTONS)
|
||||
#define NEED_TOUCH_PINS 1
|
||||
#endif
|
||||
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
#define _Y_HALF_BED ((Y_BED_SIZE) / 2)
|
||||
#define X_CENTER TERN(BED_CENTER_AT_0_0, 0, _X_HALF_BED)
|
||||
#define Y_CENTER TERN(BED_CENTER_AT_0_0, 0, _Y_HALF_BED)
|
||||
#define XY_CENTER { X_CENTER, Y_CENTER }
|
||||
|
||||
// Get the linear boundaries of the bed
|
||||
#define X_MIN_BED (X_CENTER - _X_HALF_BED)
|
||||
@@ -359,7 +360,7 @@
|
||||
*/
|
||||
#if ENABLED(SDSUPPORT)
|
||||
|
||||
#if SD_CONNECTION_IS(ONBOARD) && DISABLED(NO_SD_HOST_DRIVE) && !defined(ARDUINO_GRAND_CENTRAL_M4)
|
||||
#if HAS_SD_HOST_DRIVE && SD_CONNECTION_IS(ONBOARD)
|
||||
//
|
||||
// The external SD card is not used. Hardware SPI is used to access the card.
|
||||
// When sharing the SD card with a PC we want the menu options to
|
||||
@@ -380,7 +381,6 @@
|
||||
#define SD_DETECT_STATE LOW
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#if ANY(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, HAS_FSMC_GRAPHICAL_TFT, HAS_SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT)
|
||||
@@ -445,9 +445,9 @@
|
||||
#define HEATER_0_MAX6675_TMAX 1024
|
||||
#endif
|
||||
#if TEMP_SENSOR_0 == -5
|
||||
#define MAX6675_IS_MAX31865 1
|
||||
#define MAX6675_0_IS_MAX31865 1
|
||||
#elif TEMP_SENSOR_0 == -3
|
||||
#define MAX6675_IS_MAX31855 1
|
||||
#define MAX6675_0_IS_MAX31855 1
|
||||
#endif
|
||||
#elif TEMP_SENSOR_0 == -4
|
||||
#define HEATER_0_USES_AD8495 1
|
||||
@@ -458,6 +458,8 @@
|
||||
#define HEATER_0_USES_THERMISTOR 1
|
||||
#if TEMP_SENSOR_0 == 1000
|
||||
#define HEATER_0_USER_THERMISTOR 1
|
||||
#elif TEMP_SENSOR_0 == 998 || TEMP_SENSOR_0 == 999
|
||||
#define HEATER_0_DUMMY_THERMISTOR 1
|
||||
#endif
|
||||
#else
|
||||
#undef HEATER_0_MINTEMP
|
||||
@@ -473,6 +475,11 @@
|
||||
#define HEATER_1_MAX6675_TMIN 0
|
||||
#define HEATER_1_MAX6675_TMAX 1024
|
||||
#endif
|
||||
#if TEMP_SENSOR_1 == -5
|
||||
#define MAX6675_1_IS_MAX31865 1
|
||||
#elif TEMP_SENSOR_1 == -3
|
||||
#define MAX6675_1_IS_MAX31855 1
|
||||
#endif
|
||||
#if TEMP_SENSOR_1 != TEMP_SENSOR_0
|
||||
#if TEMP_SENSOR_1 == -5
|
||||
#error "If MAX31865 Thermocouple (-5) is used for TEMP_SENSOR_1 then TEMP_SENSOR_0 must match."
|
||||
@@ -491,6 +498,8 @@
|
||||
#define HEATER_1_USES_THERMISTOR 1
|
||||
#if TEMP_SENSOR_1 == 1000
|
||||
#define HEATER_1_USER_THERMISTOR 1
|
||||
#elif TEMP_SENSOR_1 == 998 || TEMP_SENSOR_1 == 999
|
||||
#define HEATER_1_DUMMY_THERMISTOR 1
|
||||
#endif
|
||||
#else
|
||||
#undef HEATER_1_MINTEMP
|
||||
@@ -510,6 +519,8 @@
|
||||
#define HEATER_2_USES_THERMISTOR 1
|
||||
#if TEMP_SENSOR_2 == 1000
|
||||
#define HEATER_2_USER_THERMISTOR 1
|
||||
#elif TEMP_SENSOR_2 == 998 || TEMP_SENSOR_2 == 999
|
||||
#define HEATER_2_DUMMY_THERMISTOR 1
|
||||
#endif
|
||||
#else
|
||||
#undef HEATER_2_MINTEMP
|
||||
@@ -529,6 +540,8 @@
|
||||
#define HEATER_3_USES_THERMISTOR 1
|
||||
#if TEMP_SENSOR_3 == 1000
|
||||
#define HEATER_3_USER_THERMISTOR 1
|
||||
#elif TEMP_SENSOR_3 == 998 || TEMP_SENSOR_3 == 999
|
||||
#define HEATER_3_DUMMY_THERMISTOR 1
|
||||
#endif
|
||||
#else
|
||||
#undef HEATER_3_MINTEMP
|
||||
@@ -548,6 +561,8 @@
|
||||
#define HEATER_4_USES_THERMISTOR 1
|
||||
#if TEMP_SENSOR_4 == 1000
|
||||
#define HEATER_4_USER_THERMISTOR 1
|
||||
#elif TEMP_SENSOR_4 == 998 || TEMP_SENSOR_4 == 999
|
||||
#define HEATER_4_DUMMY_THERMISTOR 1
|
||||
#endif
|
||||
#else
|
||||
#undef HEATER_4_MINTEMP
|
||||
@@ -567,6 +582,8 @@
|
||||
#define HEATER_5_USES_THERMISTOR 1
|
||||
#if TEMP_SENSOR_5 == 1000
|
||||
#define HEATER_5_USER_THERMISTOR 1
|
||||
#elif TEMP_SENSOR_5 == 998 || TEMP_SENSOR_5 == 999
|
||||
#define HEATER_5_DUMMY_THERMISTOR 1
|
||||
#endif
|
||||
#else
|
||||
#undef HEATER_5_MINTEMP
|
||||
@@ -586,6 +603,8 @@
|
||||
#define HEATER_6_USES_THERMISTOR 1
|
||||
#if TEMP_SENSOR_6 == 1000
|
||||
#define HEATER_6_USER_THERMISTOR 1
|
||||
#elif TEMP_SENSOR_6 == 998 || TEMP_SENSOR_6 == 999
|
||||
#define HEATER_6_DUMMY_THERMISTOR 1
|
||||
#endif
|
||||
#else
|
||||
#undef HEATER_6_MINTEMP
|
||||
@@ -605,6 +624,8 @@
|
||||
#define HEATER_7_USES_THERMISTOR 1
|
||||
#if TEMP_SENSOR_7 == 1000
|
||||
#define HEATER_7_USER_THERMISTOR 1
|
||||
#elif TEMP_SENSOR_7 == 998 || TEMP_SENSOR_7 == 999
|
||||
#define HEATER_7_DUMMY_THERMISTOR 1
|
||||
#endif
|
||||
#else
|
||||
#undef HEATER_7_MINTEMP
|
||||
@@ -624,6 +645,8 @@
|
||||
#define HEATER_BED_USES_THERMISTOR 1
|
||||
#if TEMP_SENSOR_BED == 1000
|
||||
#define HEATER_BED_USER_THERMISTOR 1
|
||||
#elif TEMP_SENSOR_BED == 998 || TEMP_SENSOR_BED == 999
|
||||
#define HEATER_BED_DUMMY_THERMISTOR 1
|
||||
#endif
|
||||
#else
|
||||
#undef BED_MINTEMP
|
||||
@@ -643,6 +666,8 @@
|
||||
#define HEATER_CHAMBER_USES_THERMISTOR 1
|
||||
#if TEMP_SENSOR_CHAMBER == 1000
|
||||
#define HEATER_CHAMBER_USER_THERMISTOR 1
|
||||
#elif TEMP_SENSOR_CHAMBER == 998 || TEMP_SENSOR_CHAMBER == 999
|
||||
#define HEATER_CHAMBER_DUMMY_THERMISTOR 1
|
||||
#endif
|
||||
#else
|
||||
#undef CHAMBER_MINTEMP
|
||||
@@ -662,6 +687,8 @@
|
||||
#define HEATER_PROBE_USES_THERMISTOR 1
|
||||
#if TEMP_SENSOR_PROBE == 1000
|
||||
#define HEATER_PROBE_USER_THERMISTOR 1
|
||||
#elif TEMP_SENSOR_PROBE == 998 || TEMP_SENSOR_PROBE == 999
|
||||
#define HEATER_PROBE_DUMMY_THERMISTOR 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1749,7 +1776,7 @@
|
||||
//
|
||||
// ADC Temp Sensors (Thermistor or Thermocouple with amplifier ADC interface)
|
||||
//
|
||||
#define HAS_ADC_TEST(P) (PIN_EXISTS(TEMP_##P) && TEMP_SENSOR_##P != 0 && DISABLED(HEATER_##P##_USES_MAX6675))
|
||||
#define HAS_ADC_TEST(P) (PIN_EXISTS(TEMP_##P) && TEMP_SENSOR_##P != 0 && NONE(HEATER_##P##_USES_MAX6675, HEATER_##P##_DUMMY_THERMISTOR))
|
||||
#if HAS_ADC_TEST(0)
|
||||
#define HAS_TEMP_ADC_0 1
|
||||
#endif
|
||||
@@ -1784,7 +1811,7 @@
|
||||
#define HAS_TEMP_ADC_CHAMBER 1
|
||||
#endif
|
||||
|
||||
#if HAS_HOTEND && EITHER(HAS_TEMP_ADC_0, HEATER_0_USES_MAX6675)
|
||||
#if HAS_HOTEND && ANY(HAS_TEMP_ADC_0, HEATER_0_USES_MAX6675, HEATER_0_DUMMY_THERMISTOR)
|
||||
#define HAS_TEMP_HOTEND 1
|
||||
#endif
|
||||
#define HAS_TEMP_BED HAS_TEMP_ADC_BED
|
||||
@@ -2577,6 +2604,10 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(MANUAL_PROBE_START_Z) && defined(Z_CLEARANCE_BETWEEN_PROBES)
|
||||
#define MANUAL_PROBE_START_Z Z_CLEARANCE_BETWEEN_PROBES
|
||||
#endif
|
||||
|
||||
#ifndef __SAM3X8E__ //todo: hal: broken hal encapsulation
|
||||
#undef UI_VOLTAGE_LEVEL
|
||||
#undef RADDS_DISPLAY
|
||||
|
||||
+367
-337
File diff suppressed because it is too large
Load Diff
@@ -42,7 +42,7 @@
|
||||
* version was tagged.
|
||||
*/
|
||||
#ifndef STRING_DISTRIBUTION_DATE
|
||||
#define STRING_DISTRIBUTION_DATE "2020-11-10"
|
||||
#define STRING_DISTRIBUTION_DATE "2020-11-21"
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
@@ -707,6 +707,35 @@ void MarlinUI::draw_status_message(const bool blink) {
|
||||
* |01234567890123456789|
|
||||
*/
|
||||
|
||||
inline uint8_t draw_elapsed_or_remaining_time(uint8_t timepos, const bool blink) {
|
||||
char buffer[14];
|
||||
|
||||
#if ENABLED(SHOW_REMAINING_TIME)
|
||||
const bool show_remain = TERN1(ROTATE_PROGRESS_DISPLAY, blink) && (printingIsActive() || marlin_state == MF_SD_COMPLETE);
|
||||
if (show_remain) {
|
||||
#if ENABLED(USE_M73_REMAINING_TIME)
|
||||
duration_t remaining = get_remaining_time();
|
||||
#else
|
||||
uint8_t progress = ui.get_progress_percent();
|
||||
uint32_t elapsed = print_job_timer.duration();
|
||||
duration_t remaining = (progress > 0) ? ((elapsed * 25600 / progress) >> 8) - elapsed : 0;
|
||||
#endif
|
||||
timepos -= remaining.toDigital(buffer);
|
||||
lcd_put_wchar(timepos, 2, 'R');
|
||||
}
|
||||
#else
|
||||
constexpr bool show_remain = false;
|
||||
#endif
|
||||
|
||||
if (!show_remain) {
|
||||
duration_t elapsed = print_job_timer.duration();
|
||||
timepos -= elapsed.toDigital(buffer);
|
||||
lcd_put_wchar(timepos, 2, LCD_STR_CLOCK[0]);
|
||||
}
|
||||
lcd_put_u8str(buffer);
|
||||
return timepos;
|
||||
}
|
||||
|
||||
void MarlinUI::draw_status_screen() {
|
||||
|
||||
const bool blink = get_blink();
|
||||
@@ -845,33 +874,7 @@ void MarlinUI::draw_status_screen() {
|
||||
lcd_put_u8str(i16tostr3rj(feedrate_percentage));
|
||||
lcd_put_wchar('%');
|
||||
|
||||
char buffer[14];
|
||||
uint8_t timepos = 0;
|
||||
#if ENABLED(SHOW_REMAINING_TIME)
|
||||
const bool show_remain = TERN1(ROTATE_PROGRESS_DISPLAY, blink) && (printingIsActive() || marlin_state == MF_SD_COMPLETE);
|
||||
if (show_remain) {
|
||||
#if ENABLED(USE_M73_REMAINING_TIME)
|
||||
duration_t remaining = get_remaining_time();
|
||||
#else
|
||||
uint8_t progress = get_progress_percent();
|
||||
uint32_t elapsed = print_job_timer.duration();
|
||||
duration_t remaining = (progress > 0) ? ((elapsed * 25600 / progress) >> 8) - elapsed : 0;
|
||||
#endif
|
||||
const uint8_t len = remaining.toDigital(buffer);
|
||||
timepos = LCD_WIDTH - 1 - len;
|
||||
lcd_put_wchar(timepos, 2, 'R');
|
||||
}
|
||||
#else
|
||||
constexpr bool show_remain = false;
|
||||
#endif
|
||||
|
||||
if (!show_remain) {
|
||||
duration_t elapsed = print_job_timer.duration();
|
||||
const uint8_t len = elapsed.toDigital(buffer);
|
||||
timepos = LCD_WIDTH - 1 - len;
|
||||
lcd_put_wchar(timepos, 2, LCD_STR_CLOCK[0]);
|
||||
}
|
||||
lcd_put_u8str(buffer);
|
||||
const uint8_t timepos = draw_elapsed_or_remaining_time(LCD_WIDTH - 1, blink);
|
||||
|
||||
#if LCD_WIDTH >= 20
|
||||
lcd_moveto(timepos - 7, 2);
|
||||
@@ -955,7 +958,7 @@ void MarlinUI::draw_status_screen() {
|
||||
#elif HAS_MULTI_HOTEND && HAS_HEATED_BED
|
||||
_draw_bed_status(blink);
|
||||
#elif HAS_PRINT_PROGRESS
|
||||
#define DREW_PRINT_PROGRESS
|
||||
#define DREW_PRINT_PROGRESS 1
|
||||
_draw_print_progress();
|
||||
#endif
|
||||
|
||||
@@ -963,14 +966,15 @@ void MarlinUI::draw_status_screen() {
|
||||
// Elapsed Time or SD Percent
|
||||
//
|
||||
lcd_moveto(LCD_WIDTH - 9, 2);
|
||||
#if HAS_PRINT_PROGRESS && !defined(DREW_PRINT_PROGRESS)
|
||||
|
||||
#if HAS_PRINT_PROGRESS && !DREW_PRINT_PROGRESS
|
||||
|
||||
_draw_print_progress();
|
||||
|
||||
#else
|
||||
duration_t elapsed = print_job_timer.duration();
|
||||
char buffer[14];
|
||||
(void)elapsed.toDigital(buffer);
|
||||
lcd_put_wchar(LCD_STR_CLOCK[0]);
|
||||
lcd_put_u8str(buffer);
|
||||
|
||||
(void)draw_elapsed_or_remaining_time(LCD_WIDTH - 4, blink);
|
||||
|
||||
#endif
|
||||
|
||||
#endif // LCD_INFO_SCREEN_STYLE 1
|
||||
|
||||
@@ -204,7 +204,7 @@ void TFTGLCD::print_line() {
|
||||
#endif
|
||||
}
|
||||
|
||||
void TFTGLCD::print_screen(){
|
||||
void TFTGLCD::print_screen() {
|
||||
if (!PanelDetected) return;
|
||||
framebuffer[FBSIZE - 2] = picBits & PIC_MASK;
|
||||
framebuffer[FBSIZE - 1] = ledBits;
|
||||
@@ -675,8 +675,8 @@ void MarlinUI::draw_status_screen() {
|
||||
//
|
||||
|
||||
lcd.setCursor(0, 0);
|
||||
_draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); lcd.write(' ');
|
||||
_draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); lcd.write(' ');
|
||||
_draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); lcd.write(' ');
|
||||
_draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); lcd.write(' ');
|
||||
_draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink);
|
||||
|
||||
#if HAS_LEVELING && !HAS_HEATED_BED
|
||||
@@ -700,7 +700,7 @@ void MarlinUI::draw_status_screen() {
|
||||
uint8_t len = elapsed.toDigital(buffer);
|
||||
|
||||
lcd.setCursor((LCD_WIDTH - 1) - len, 1);
|
||||
lcd.write(0x07); lcd.print(buffer); // LCD_CLOCK_CHAR
|
||||
lcd.write(LCD_STR_CLOCK[0]); lcd.print(buffer);
|
||||
|
||||
//
|
||||
// Line 3 - progressbar
|
||||
@@ -807,13 +807,13 @@ void MarlinUI::draw_status_screen() {
|
||||
void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) {
|
||||
if (!PanelDetected) return;
|
||||
lcd.setCursor((LCD_WIDTH - 14) / 2, row + 1);
|
||||
lcd.write(0x02); lcd_put_u8str_P(" E"); lcd.write('1' + extruder); lcd.write(' ');
|
||||
lcd.print(i16tostr3rj(thermalManager.degHotend(extruder))); lcd.write(0x01); lcd.write('/');
|
||||
lcd.print(i16tostr3rj(thermalManager.degTargetHotend(extruder))); lcd.write(0x01);
|
||||
lcd.write(LCD_STR_THERMOMETER[0]); lcd_put_u8str_P(PSTR(" E")); lcd.write('1' + extruder); lcd.write(' ');
|
||||
lcd.print(i16tostr3rj(thermalManager.degHotend(extruder))); lcd.write(LCD_STR_DEGREE[0]); lcd.write('/');
|
||||
lcd.print(i16tostr3rj(thermalManager.degTargetHotend(extruder))); lcd.write(LCD_STR_DEGREE[0]);
|
||||
lcd.print_line();
|
||||
}
|
||||
|
||||
#endif // ADVANCED_PAUSE_FEATURE
|
||||
#endif
|
||||
|
||||
// Draw a static item with no left-right margin required. Centered by default.
|
||||
void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) {
|
||||
|
||||
@@ -461,8 +461,8 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
|
||||
|
||||
void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) {
|
||||
if (mark_as_selected(row, sel)) {
|
||||
const uint8_t maxlen = LCD_WIDTH - isDir;
|
||||
if (isDir) lcd_put_wchar(LCD_STR_FOLDER[0]);
|
||||
constexpr uint8_t maxlen = LCD_WIDTH - 1;
|
||||
const pixel_len_t pixw = maxlen * (MENU_FONT_WIDTH);
|
||||
pixel_len_t n = pixw - lcd_put_u8str_max(ui.scrolled_filename(theCard, maxlen, row, sel), pixw);
|
||||
while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' ');
|
||||
|
||||
@@ -29,6 +29,9 @@
|
||||
#undef STATUS_BED_ANIM
|
||||
#define STATUS_HEATERS_XSPACE 24
|
||||
|
||||
//
|
||||
// Status Screen Combined Heater bitmaps
|
||||
//
|
||||
#if HAS_HEATED_BED && HOTENDS <= 4
|
||||
|
||||
#if HOTENDS == 0
|
||||
@@ -75,13 +78,23 @@
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000,
|
||||
#else
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000,
|
||||
#endif
|
||||
B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000,
|
||||
@@ -94,13 +107,23 @@
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00001000,B00100000,B10000000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00001000,B00100000,B10000000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00001000,B00100000,B10000000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00001000,B00100000,B10000000,
|
||||
#else
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00001000,B00100000,B10000000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00001000,B00100000,B10000000,
|
||||
#endif
|
||||
B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000,
|
||||
@@ -113,13 +136,23 @@
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00001000,B00100000,B10000000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00001000,B00100000,B10000000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00001000,B00100000,B10000000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00001000,B00100000,B10000000,
|
||||
#else
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00001000,B00100000,B10000000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00010000,B01000001,B00000000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00001000,B00100000,B10000000,
|
||||
#endif
|
||||
B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000,
|
||||
B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000,
|
||||
@@ -161,13 +194,23 @@
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,B00000000,B00011111,B11100000,
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,
|
||||
B00111011,B01110000,B00000000,B00111100,B11110000,
|
||||
B00111011,B01110000,B00000000,B00111010,B11110000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,
|
||||
B00111011,B01110000,B00000000,B00111110,B11110000,
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,
|
||||
#else
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,
|
||||
#endif
|
||||
B00111111,B11110000,B00000000,B00111111,B11110000,
|
||||
B00001111,B11000000,B00000000,B00001111,B11000000,
|
||||
B00000111,B10000000,B00000000,B00000111,B10000000,
|
||||
@@ -180,13 +223,23 @@
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111100,B11110000,
|
||||
B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,
|
||||
B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00111111,B01110000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011110,B11100000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011101,B11100000,
|
||||
B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00111011,B11110000,
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111000,B01110000,
|
||||
#else
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,
|
||||
#endif
|
||||
B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,
|
||||
B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,
|
||||
B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,
|
||||
@@ -199,13 +252,23 @@
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,
|
||||
B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,
|
||||
B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,
|
||||
B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,
|
||||
#else
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,
|
||||
#endif
|
||||
B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,
|
||||
B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,
|
||||
B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,
|
||||
@@ -218,13 +281,23 @@
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111000,B01110000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B11110000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00111000,B11110000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00011111,B01100000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00011111,B01100000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00111100,B11110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,
|
||||
B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,
|
||||
B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,
|
||||
B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,
|
||||
B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,
|
||||
B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,
|
||||
#else
|
||||
B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111000,B01110000,
|
||||
B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B11110000,
|
||||
B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00111000,B11110000,
|
||||
B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00011111,B01100000,
|
||||
B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00011111,B01100000,
|
||||
B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,
|
||||
B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00111100,B11110000,
|
||||
#endif
|
||||
B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,
|
||||
B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,
|
||||
B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,
|
||||
|
||||
+255
-105
@@ -77,13 +77,23 @@
|
||||
const unsigned char status_hotend1_a_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00111111,B11110000,
|
||||
B00111110,B11110000,
|
||||
B00111100,B11110000,
|
||||
B00011010,B11100000,
|
||||
B00011110,B11100000,
|
||||
B00111110,B11110000,
|
||||
B00111110,B11110000,
|
||||
B00111110,B11110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00011011,B01100000,
|
||||
B00011011,B01100000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#else
|
||||
B00111110,B11110000,
|
||||
B00111100,B11110000,
|
||||
B00011010,B11100000,
|
||||
B00011110,B11100000,
|
||||
B00111110,B11110000,
|
||||
B00111110,B11110000,
|
||||
B00111110,B11110000,
|
||||
#endif
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
B00000011,B00000000
|
||||
@@ -92,13 +102,23 @@
|
||||
const unsigned char status_hotend1_b_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00100000,B00010000,
|
||||
B00100001,B00010000,
|
||||
B00100011,B00010000,
|
||||
B00010101,B00100000,
|
||||
B00010001,B00100000,
|
||||
B00100001,B00010000,
|
||||
B00100001,B00010000,
|
||||
B00110001,B00110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00100011,B00010000,
|
||||
B00100100,B10010000,
|
||||
B00010100,B10100000,
|
||||
B00010100,B10100000,
|
||||
B00100100,B10010000,
|
||||
B00100100,B10010000,
|
||||
B00110011,B00110000,
|
||||
#else
|
||||
B00100001,B00010000,
|
||||
B00100011,B00010000,
|
||||
B00010101,B00100000,
|
||||
B00010001,B00100000,
|
||||
B00100001,B00010000,
|
||||
B00100001,B00010000,
|
||||
B00110001,B00110000,
|
||||
#endif
|
||||
B00001000,B01000000,
|
||||
B00000100,B10000000,
|
||||
B00000011,B00000000
|
||||
@@ -107,13 +127,23 @@
|
||||
const unsigned char status_hotend2_a_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00111111,B11110000,
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00011111,B01100000,
|
||||
B00011110,B11100000,
|
||||
B00111101,B11110000,
|
||||
B00111011,B11110000,
|
||||
B00111000,B01110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111110,B11110000,
|
||||
B00111100,B11110000,
|
||||
B00011010,B11100000,
|
||||
B00011110,B11100000,
|
||||
B00111110,B11110000,
|
||||
B00111110,B11110000,
|
||||
B00111110,B11110000,
|
||||
#else
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00011111,B01100000,
|
||||
B00011110,B11100000,
|
||||
B00111101,B11110000,
|
||||
B00111011,B11110000,
|
||||
B00111000,B01110000,
|
||||
#endif
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
B00000011,B00000000
|
||||
@@ -122,13 +152,23 @@
|
||||
const unsigned char status_hotend2_b_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00100000,B00010000,
|
||||
B00100011,B00010000,
|
||||
B00100100,B10010000,
|
||||
B00010000,B10100000,
|
||||
B00010001,B00100000,
|
||||
B00100010,B00010000,
|
||||
B00100100,B00010000,
|
||||
B00110111,B10110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00100001,B00010000,
|
||||
B00100011,B00010000,
|
||||
B00010101,B00100000,
|
||||
B00010001,B00100000,
|
||||
B00100001,B00010000,
|
||||
B00100001,B00010000,
|
||||
B00110001,B00110000,
|
||||
#else
|
||||
B00100011,B00010000,
|
||||
B00100100,B10010000,
|
||||
B00010000,B10100000,
|
||||
B00010001,B00100000,
|
||||
B00100010,B00010000,
|
||||
B00100100,B00010000,
|
||||
B00110111,B10110000,
|
||||
#endif
|
||||
B00001000,B01000000,
|
||||
B00000100,B10000000,
|
||||
B00000011,B00000000
|
||||
@@ -138,13 +178,23 @@
|
||||
|
||||
const unsigned char status_hotend1_a_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00111110,B11110000,
|
||||
B00111100,B11110000,
|
||||
B00111010,B11110000,
|
||||
B00011110,B11100000,
|
||||
B00011110,B11100000,
|
||||
B00111110,B11110000,
|
||||
B00111110,B11110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00011011,B01100000,
|
||||
B00011011,B01100000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#else
|
||||
B00111110,B11110000,
|
||||
B00111100,B11110000,
|
||||
B00111010,B11110000,
|
||||
B00011110,B11100000,
|
||||
B00011110,B11100000,
|
||||
B00111110,B11110000,
|
||||
B00111110,B11110000,
|
||||
#endif
|
||||
B00111111,B11110000,
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
@@ -153,13 +203,23 @@
|
||||
|
||||
const unsigned char status_hotend2_a_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00111111,B01110000,
|
||||
B00011110,B11100000,
|
||||
B00011101,B11100000,
|
||||
B00111011,B11110000,
|
||||
B00111000,B01110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111110,B11110000,
|
||||
B00111100,B11110000,
|
||||
B00111010,B11110000,
|
||||
B00011110,B11100000,
|
||||
B00011110,B11100000,
|
||||
B00111110,B11110000,
|
||||
B00111110,B11110000,
|
||||
#else
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00111111,B01110000,
|
||||
B00011110,B11100000,
|
||||
B00011101,B11100000,
|
||||
B00111011,B11110000,
|
||||
B00111000,B01110000,
|
||||
#endif
|
||||
B00111111,B11110000,
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
@@ -175,13 +235,23 @@
|
||||
const unsigned char status_hotend3_a_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00111111,B11110000,
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00011111,B01100000,
|
||||
B00011100,B11100000,
|
||||
B00111111,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00011111,B01100000,
|
||||
B00011110,B11100000,
|
||||
B00111101,B11110000,
|
||||
B00111011,B11110000,
|
||||
B00111000,B01110000,
|
||||
#else
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00011111,B01100000,
|
||||
B00011100,B11100000,
|
||||
B00111111,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#endif
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
B00000011,B00000000
|
||||
@@ -190,13 +260,23 @@
|
||||
const unsigned char status_hotend3_b_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00100000,B00010000,
|
||||
B00100011,B00010000,
|
||||
B00100100,B10010000,
|
||||
B00010000,B10100000,
|
||||
B00010011,B00100000,
|
||||
B00100000,B10010000,
|
||||
B00100100,B10010000,
|
||||
B00110011,B00110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00100011,B00010000,
|
||||
B00100100,B10010000,
|
||||
B00010000,B10100000,
|
||||
B00010001,B00100000,
|
||||
B00100010,B00010000,
|
||||
B00100100,B00010000,
|
||||
B00110111,B10110000,
|
||||
#else
|
||||
B00100011,B00010000,
|
||||
B00100100,B10010000,
|
||||
B00010000,B10100000,
|
||||
B00010011,B00100000,
|
||||
B00100000,B10010000,
|
||||
B00100100,B10010000,
|
||||
B00110011,B00110000,
|
||||
#endif
|
||||
B00001000,B01000000,
|
||||
B00000100,B10000000,
|
||||
B00000011,B00000000
|
||||
@@ -206,13 +286,23 @@
|
||||
|
||||
const unsigned char status_hotend3_a_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00111111,B01110000,
|
||||
B00011100,B11100000,
|
||||
B00011111,B01100000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00111111,B01110000,
|
||||
B00011110,B11100000,
|
||||
B00011101,B11100000,
|
||||
B00111011,B11110000,
|
||||
B00111000,B01110000,
|
||||
#else
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00111111,B01110000,
|
||||
B00011100,B11100000,
|
||||
B00011111,B01100000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#endif
|
||||
B00111111,B11110000,
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
@@ -230,13 +320,23 @@
|
||||
const unsigned char status_hotend4_a_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00111111,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00011011,B01100000,
|
||||
B00011011,B01100000,
|
||||
B00111000,B00110000,
|
||||
B00111111,B01110000,
|
||||
B00111111,B01110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00011111,B01100000,
|
||||
B00011100,B11100000,
|
||||
B00111111,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#else
|
||||
B00111011,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00011011,B01100000,
|
||||
B00011011,B01100000,
|
||||
B00111000,B00110000,
|
||||
B00111111,B01110000,
|
||||
B00111111,B01110000,
|
||||
#endif
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
B00000011,B00000000
|
||||
@@ -245,13 +345,23 @@
|
||||
const unsigned char status_hotend4_b_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00100000,B00010000,
|
||||
B00100100,B10010000,
|
||||
B00100100,B10010000,
|
||||
B00010100,B10100000,
|
||||
B00010100,B10100000,
|
||||
B00100111,B11010000,
|
||||
B00100000,B10010000,
|
||||
B00110000,B10110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00100011,B00010000,
|
||||
B00100100,B10010000,
|
||||
B00010000,B10100000,
|
||||
B00010011,B00100000,
|
||||
B00100000,B10010000,
|
||||
B00100100,B10010000,
|
||||
B00110011,B00110000,
|
||||
#else
|
||||
B00100100,B10010000,
|
||||
B00100100,B10010000,
|
||||
B00010100,B10100000,
|
||||
B00010100,B10100000,
|
||||
B00100111,B11010000,
|
||||
B00100000,B10010000,
|
||||
B00110000,B10110000,
|
||||
#endif
|
||||
B00001000,B01000000,
|
||||
B00000100,B10000000,
|
||||
B00000011,B00000000
|
||||
@@ -261,13 +371,23 @@
|
||||
|
||||
const unsigned char status_hotend4_a_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00111011,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00011011,B01100000,
|
||||
B00011000,B00100000,
|
||||
B00111111,B01110000,
|
||||
B00111111,B01110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111100,B11110000,
|
||||
B00111011,B01110000,
|
||||
B00111111,B01110000,
|
||||
B00011100,B11100000,
|
||||
B00011111,B01100000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#else
|
||||
B00111011,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00011011,B01100000,
|
||||
B00011000,B00100000,
|
||||
B00111111,B01110000,
|
||||
B00111111,B01110000,
|
||||
#endif
|
||||
B00111111,B11110000,
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
@@ -285,13 +405,23 @@
|
||||
const unsigned char status_hotend5_a_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00111111,B11110000,
|
||||
B00111000,B01110000,
|
||||
B00111011,B11110000,
|
||||
B00011000,B11100000,
|
||||
B00011111,B01100000,
|
||||
B00111111,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111011,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00011011,B01100000,
|
||||
B00011011,B01100000,
|
||||
B00111000,B00110000,
|
||||
B00111111,B01110000,
|
||||
B00111111,B01110000,
|
||||
#else
|
||||
B00111000,B01110000,
|
||||
B00111011,B11110000,
|
||||
B00011000,B11100000,
|
||||
B00011111,B01100000,
|
||||
B00111111,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#endif
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
B00000011,B00000000
|
||||
@@ -300,13 +430,23 @@
|
||||
const unsigned char status_hotend5_b_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00100000,B00010000,
|
||||
B00100111,B10010000,
|
||||
B00100100,B00010000,
|
||||
B00010111,B00100000,
|
||||
B00010000,B10100000,
|
||||
B00100000,B10010000,
|
||||
B00100100,B10010000,
|
||||
B00110011,B00110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00100100,B10010000,
|
||||
B00100100,B10010000,
|
||||
B00010100,B10100000,
|
||||
B00010100,B10100000,
|
||||
B00100111,B11010000,
|
||||
B00100000,B10010000,
|
||||
B00110000,B10110000,
|
||||
#else
|
||||
B00100111,B10010000,
|
||||
B00100100,B00010000,
|
||||
B00010111,B00100000,
|
||||
B00010000,B10100000,
|
||||
B00100000,B10010000,
|
||||
B00100100,B10010000,
|
||||
B00110011,B00110000,
|
||||
#endif
|
||||
B00001000,B01000000,
|
||||
B00000100,B10000000,
|
||||
B00000011,B00000000
|
||||
@@ -316,13 +456,23 @@
|
||||
|
||||
const unsigned char status_hotend5_a_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,
|
||||
B00111000,B01110000,
|
||||
B00111011,B11110000,
|
||||
B00111000,B11110000,
|
||||
B00011111,B01100000,
|
||||
B00011111,B01100000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#if LCD_FIRST_TOOL == 0
|
||||
B00111011,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00111011,B01110000,
|
||||
B00011011,B01100000,
|
||||
B00011000,B00100000,
|
||||
B00111111,B01110000,
|
||||
B00111111,B01110000,
|
||||
#else
|
||||
B00111000,B01110000,
|
||||
B00111011,B11110000,
|
||||
B00111000,B11110000,
|
||||
B00011111,B01100000,
|
||||
B00011111,B01100000,
|
||||
B00111011,B01110000,
|
||||
B00111100,B11110000,
|
||||
#endif
|
||||
B00111111,B11110000,
|
||||
B00001111,B11000000,
|
||||
B00000111,B10000000,
|
||||
|
||||
@@ -774,9 +774,15 @@ void MarlinUI::draw_status_screen() {
|
||||
mixer.update_mix_from_vtool();
|
||||
mix_label = PSTR("Mx");
|
||||
}
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wformat-overflow"
|
||||
|
||||
sprintf_P(mixer_messages, PSTR(S_FMT " %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1]));
|
||||
lcd_put_u8str(X_LABEL_POS, XYZ_BASELINE, mixer_messages);
|
||||
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
#else
|
||||
|
||||
if (show_e_total) {
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if HAS_MARLINUI_U8GLIB
|
||||
#if HAS_MARLINUI_U8GLIB && DISABLED(TFT_CLASSIC_UI)
|
||||
|
||||
#include "HAL_LCD_com_defines.h"
|
||||
|
||||
|
||||
@@ -75,6 +75,11 @@ TFT_IO tftio;
|
||||
|
||||
#include "../touch/touch_buttons.h"
|
||||
|
||||
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
|
||||
#include "../tft_io/touch_calibration.h"
|
||||
#include "../marlinui.h"
|
||||
#endif
|
||||
|
||||
#define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1)
|
||||
#define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1)
|
||||
|
||||
@@ -129,7 +134,7 @@ static void setWindow(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin,
|
||||
tftio.set_window(Xmin, Ymin, Xmax, Ymax);
|
||||
}
|
||||
|
||||
#if HAS_TOUCH_XPT2046
|
||||
#if HAS_TOUCH_BUTTONS
|
||||
|
||||
static const uint8_t buttonD[] = {
|
||||
B01111111,B11111111,B11111111,B11111110,
|
||||
@@ -302,7 +307,7 @@ static void setWindow(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin,
|
||||
}
|
||||
}
|
||||
|
||||
#endif // HAS_TOUCH_XPT2046
|
||||
#endif // HAS_TOUCH_BUTTONS
|
||||
|
||||
// Used to fill RGB565 (16bits) background
|
||||
inline void memset2(const void *ptr, uint16_t fill, size_t cnt) {
|
||||
@@ -313,6 +318,27 @@ inline void memset2(const void *ptr, uint16_t fill, size_t cnt) {
|
||||
static bool preinit = true;
|
||||
static uint8_t page;
|
||||
|
||||
#if HAS_TOUCH_BUTTONS
|
||||
static bool redrawTouchButtons = true;
|
||||
static void drawTouchButtons(u8g_t *u8g, u8g_dev_t *dev) {
|
||||
if (!redrawTouchButtons) return;
|
||||
redrawTouchButtons = false;
|
||||
|
||||
// Bottom buttons
|
||||
setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI);
|
||||
drawImage(buttonD, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTCANCEL_COLOR);
|
||||
|
||||
setWindow(u8g, dev, BUTTONA_X_LO, BUTTON_Y_LO, BUTTONA_X_HI, BUTTON_Y_HI);
|
||||
drawImage(buttonA, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTARROWS_COLOR);
|
||||
|
||||
setWindow(u8g, dev, BUTTONB_X_LO, BUTTON_Y_LO, BUTTONB_X_HI, BUTTON_Y_HI);
|
||||
drawImage(buttonB, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTARROWS_COLOR);
|
||||
|
||||
setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI);
|
||||
drawImage(buttonC, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTOKMENU_COLOR);
|
||||
}
|
||||
#endif // HAS_TOUCH_BUTTONS
|
||||
|
||||
uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
|
||||
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||
|
||||
@@ -328,6 +354,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
|
||||
dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, nullptr);
|
||||
tftio.Init();
|
||||
tftio.InitTFT();
|
||||
TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset());
|
||||
|
||||
if (preinit) {
|
||||
preinit = false;
|
||||
@@ -343,28 +370,13 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
|
||||
for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++)
|
||||
u8g_WriteSequence(u8g, dev, (TFT_WIDTH) / 2, (uint8_t *)buffer);
|
||||
#endif
|
||||
|
||||
// Bottom buttons
|
||||
#if HAS_TOUCH_XPT2046
|
||||
setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI);
|
||||
drawImage(buttonD, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTCANCEL_COLOR);
|
||||
|
||||
setWindow(u8g, dev, BUTTONA_X_LO, BUTTON_Y_LO, BUTTONA_X_HI, BUTTON_Y_HI);
|
||||
drawImage(buttonA, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTARROWS_COLOR);
|
||||
|
||||
setWindow(u8g, dev, BUTTONB_X_LO, BUTTON_Y_LO, BUTTONB_X_HI, BUTTON_Y_HI);
|
||||
drawImage(buttonB, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTARROWS_COLOR);
|
||||
|
||||
setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI);
|
||||
drawImage(buttonC, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTOKMENU_COLOR);
|
||||
#endif // HAS_TOUCH_XPT2046
|
||||
|
||||
return 0;
|
||||
|
||||
case U8G_DEV_MSG_STOP: preinit = true; break;
|
||||
|
||||
case U8G_DEV_MSG_PAGE_FIRST:
|
||||
page = 0;
|
||||
TERN_(HAS_TOUCH_BUTTONS, drawTouchButtons(u8g, dev));
|
||||
setWindow(u8g, dev, TFT_PIXEL_OFFSET_X, TFT_PIXEL_OFFSET_Y, X_HI, Y_HI);
|
||||
break;
|
||||
|
||||
@@ -446,7 +458,7 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p
|
||||
case U8G_COM_MSG_WRITE_SEQ:
|
||||
tftio.DataTransferBegin(DATASIZE_16BIT);
|
||||
for (uint8_t i = 0; i < arg_val; i += 2)
|
||||
tftio.WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i));
|
||||
tftio.WriteData(*(uint16_t *)(((uintptr_t)arg_ptr) + i));
|
||||
tftio.DataTransferEnd();
|
||||
break;
|
||||
|
||||
@@ -456,4 +468,65 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p
|
||||
|
||||
U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_320x240_upscale_from_128x64_fn, U8G_COM_HAL_TFT_FN);
|
||||
|
||||
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
|
||||
|
||||
static void drawCross(uint16_t x, uint16_t y, uint16_t color) {
|
||||
tftio.set_window(x - 15, y, x + 15, y);
|
||||
tftio.WriteMultiple(color, 31);
|
||||
tftio.set_window(x, y - 15, x, y + 15);
|
||||
tftio.WriteMultiple(color, 31);
|
||||
}
|
||||
|
||||
void MarlinUI::touch_calibration_screen() {
|
||||
uint16_t x, y;
|
||||
calibrationState calibration_stage = touch_calibration.get_calibration_state();
|
||||
|
||||
if (calibration_stage == CALIBRATION_NONE) {
|
||||
// start and clear screen
|
||||
defer_status_screen(true);
|
||||
calibration_stage = touch_calibration.calibration_start();
|
||||
tftio.set_window(0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1);
|
||||
tftio.WriteMultiple(TFT_MARLINBG_COLOR, uint32_t(TFT_WIDTH) * (TFT_HEIGHT));
|
||||
}
|
||||
else {
|
||||
// clear last cross
|
||||
x = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].x;
|
||||
y = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].y;
|
||||
drawCross(x, y, TFT_MARLINBG_COLOR);
|
||||
}
|
||||
|
||||
const char *str = nullptr;
|
||||
if (calibration_stage < CALIBRATION_SUCCESS) {
|
||||
// handle current state
|
||||
switch (calibration_stage) {
|
||||
case CALIBRATION_TOP_LEFT: str = GET_TEXT(MSG_TOP_LEFT); break;
|
||||
case CALIBRATION_BOTTOM_LEFT: str = GET_TEXT(MSG_BOTTOM_LEFT); break;
|
||||
case CALIBRATION_TOP_RIGHT: str = GET_TEXT(MSG_TOP_RIGHT); break;
|
||||
case CALIBRATION_BOTTOM_RIGHT: str = GET_TEXT(MSG_BOTTOM_RIGHT); break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
x = touch_calibration.calibration_points[calibration_stage].x;
|
||||
y = touch_calibration.calibration_points[calibration_stage].y;
|
||||
drawCross(x, y, TFT_MARLINUI_COLOR);
|
||||
}
|
||||
else {
|
||||
// end calibration
|
||||
str = calibration_stage == CALIBRATION_SUCCESS ? GET_TEXT(MSG_CALIBRATION_COMPLETED) : GET_TEXT(MSG_CALIBRATION_FAILED);
|
||||
defer_status_screen(false);
|
||||
touch_calibration.calibration_end();
|
||||
TERN_(HAS_TOUCH_BUTTONS, redrawTouchButtons = true);
|
||||
}
|
||||
|
||||
// draw current message
|
||||
tftio.set_window(TFT_PIXEL_OFFSET_X, TFT_PIXEL_OFFSET_Y, X_HI, Y_HI);
|
||||
do {
|
||||
set_font(FONT_MENU);
|
||||
lcd_put_u8str(0, LCD_PIXEL_HEIGHT / 2, str);
|
||||
} while (u8g.nextPage());
|
||||
drawing_screen = false;
|
||||
}
|
||||
|
||||
#endif // TOUCH_SCREEN_CALIBRATION
|
||||
|
||||
#endif // HAS_MARLINUI_U8GLIB && (FSMC_CS_PIN || HAS_SPI_GRAPHICAL_TFT)
|
||||
|
||||
@@ -76,8 +76,8 @@ namespace Anycubic {
|
||||
#endif
|
||||
|
||||
// Filament runout is handled by Marlin settings in Configuration.h
|
||||
// set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present.
|
||||
// enable FIL_RUNOUT_PULLUP
|
||||
// opt_set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present.
|
||||
// opt_enable FIL_RUNOUT_PULL
|
||||
|
||||
TFTSer.begin(115200);
|
||||
|
||||
@@ -364,7 +364,7 @@ namespace Anycubic {
|
||||
faultDuration++;
|
||||
if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) {
|
||||
SendtoTFTLN(AC_msg_nozzle_temp_abnormal);
|
||||
SERIAL_ECHOLNPAIR_P("Bed temp abnormal! : ", temp);
|
||||
SERIAL_ECHOLNPAIR("Bed temp abnormal! : ", temp);
|
||||
break;
|
||||
}
|
||||
delay_ms(500);
|
||||
|
||||
@@ -87,7 +87,7 @@ void AnycubicTFTClass::OnSetup() {
|
||||
SET_INPUT_PULLUP(SD_DETECT_PIN);
|
||||
#endif
|
||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
||||
SET_INPUT_PULLUP(FIL_RUNOUT_PIN);
|
||||
SET_INPUT_PULLUP(FIL_RUNOUT1_PIN);
|
||||
#endif
|
||||
|
||||
mediaPrintingState = AMPRINTSTATE_NOT_PRINTING;
|
||||
@@ -935,7 +935,7 @@ void AnycubicTFTClass::DoFilamentRunoutCheck() {
|
||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
||||
// NOTE: ExtUI::getFilamentRunoutState() only returns the runout state if the job is printing
|
||||
// we want to actually check the status of the pin here, regardless of printstate
|
||||
if (READ(FIL_RUNOUT_PIN)) {
|
||||
if (READ(FIL_RUNOUT1_PIN)) {
|
||||
if (mediaPrintingState == AMPRINTSTATE_PRINTING || mediaPrintingState == AMPRINTSTATE_PAUSED || mediaPrintingState == AMPRINTSTATE_PAUSE_REQUESTED) {
|
||||
// play tone to indicate filament is out
|
||||
ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567"));
|
||||
@@ -983,7 +983,7 @@ void AnycubicTFTClass::PausePrint() {
|
||||
void AnycubicTFTClass::ResumePrint() {
|
||||
#if ENABLED(SDSUPPORT)
|
||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
||||
if (READ(FIL_RUNOUT_PIN)) {
|
||||
if (READ(FIL_RUNOUT1_PIN)) {
|
||||
#if ENABLED(ANYCUBIC_LCD_DEBUG)
|
||||
SERIAL_ECHOLNPGM("TFT Serial Debug: Resume Print with filament sensor still tripped... ");
|
||||
#endif
|
||||
|
||||
@@ -217,7 +217,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) {
|
||||
// It is using a hex display for that: It expects BSD coded data in the format xxyyzz
|
||||
void DGUSScreenHandler::DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var) {
|
||||
printStatistics state = print_job_timer.getStats();
|
||||
char buf[21];
|
||||
char buf[22];
|
||||
duration_t elapsed = state.printTime;
|
||||
elapsed.toString(buf);
|
||||
dgusdisplay.WriteVariable(VP_PrintAccTime, buf, var.size, true);
|
||||
@@ -225,7 +225,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) {
|
||||
|
||||
void DGUSScreenHandler::DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var) {
|
||||
printStatistics state = print_job_timer.getStats();
|
||||
char buf[21];
|
||||
char buf[10];
|
||||
sprintf_P(buf, PSTR("%u"), state.totalPrints);
|
||||
dgusdisplay.WriteVariable(VP_PrintsTotal, buf, var.size, true);
|
||||
}
|
||||
|
||||
@@ -29,15 +29,12 @@
|
||||
*
|
||||
* The DLCache can be used like so:
|
||||
*
|
||||
* void some_function() {
|
||||
* DLCache dlcache(UNIQUE_ID);
|
||||
* DLCache dlcache(UNIQUE_ID);
|
||||
*
|
||||
* if (dlcache.hasData()) {
|
||||
* dlcache.append();
|
||||
* } else {
|
||||
* // Add stuff to the DL
|
||||
* dlcache.store();
|
||||
* }
|
||||
* if (dlcache.hasData())
|
||||
* dlcache.append();
|
||||
* else
|
||||
* dlcache.store(); // Add stuff to the DL
|
||||
*/
|
||||
class DLCache {
|
||||
private:
|
||||
|
||||
@@ -32,11 +32,7 @@ bool tiny_timer_t::elapsed(tiny_time_t duration) {
|
||||
#endif
|
||||
);
|
||||
uint8_t elapsed = now - _start;
|
||||
if (elapsed >= duration._duration) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return elapsed >= duration._duration;
|
||||
}
|
||||
|
||||
void tiny_timer_t::start() {
|
||||
|
||||
@@ -78,9 +78,9 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::
|
||||
}
|
||||
}
|
||||
}
|
||||
if (val_cnt) {
|
||||
if (val_cnt)
|
||||
val_mean /= val_cnt;
|
||||
} else {
|
||||
else {
|
||||
val_mean = 0;
|
||||
val_min = 0;
|
||||
val_max = 0;
|
||||
@@ -327,11 +327,10 @@ void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::pr
|
||||
screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_NONE;
|
||||
break;
|
||||
case ExtUI::MESH_FINISH:
|
||||
if (screen_data.BedMeshScreen.count == GRID_MAX_POINTS && isMeshComplete(ExtUI::getMeshArray())) {
|
||||
if (screen_data.BedMeshScreen.count == GRID_MAX_POINTS && isMeshComplete(ExtUI::getMeshArray()))
|
||||
screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_COMPLETE;
|
||||
} else {
|
||||
else
|
||||
screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_INCOMPLETE;
|
||||
}
|
||||
screen_data.BedMeshScreen.count = GRID_MAX_POINTS;
|
||||
break;
|
||||
case ExtUI::PROBE_START:
|
||||
|
||||
@@ -72,7 +72,8 @@ void BootScreen::onIdle() {
|
||||
GOTO_SCREEN(TouchCalibrationScreen);
|
||||
current_screen.forget();
|
||||
PUSH_SCREEN(StatusScreen);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
if (!UIFlashStorage::is_valid()) {
|
||||
StatusScreen::loadBitmaps();
|
||||
SpinnerDialogBox::show(GET_TEXT_F(MSG_PLEASE_WAIT));
|
||||
|
||||
@@ -92,12 +92,12 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) {
|
||||
PIN_DISABLED(5, 3, PSTR(STR_Z_MIN), Z_MIN)
|
||||
#endif
|
||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT)
|
||||
PIN_ENABLED (1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT, FIL_RUNOUT_STATE)
|
||||
PIN_ENABLED (1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT, FIL_RUNOUT1_STATE)
|
||||
#else
|
||||
PIN_DISABLED(1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT)
|
||||
#endif
|
||||
#if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT2)
|
||||
PIN_ENABLED (3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2, FIL_RUNOUT_STATE)
|
||||
PIN_ENABLED (3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2, FIL_RUNOUT2_STATE)
|
||||
#else
|
||||
PIN_DISABLED(3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2)
|
||||
#endif
|
||||
|
||||
@@ -152,11 +152,11 @@ void FilesScreen::drawFooter() {
|
||||
#undef MARGIN_T
|
||||
#undef MARGIN_B
|
||||
#ifdef TOUCH_UI_PORTRAIT
|
||||
#define MARGIN_T 15
|
||||
#define MARGIN_B 5
|
||||
#define MARGIN_T 15
|
||||
#define MARGIN_B 5
|
||||
#else
|
||||
#define MARGIN_T 5
|
||||
#define MARGIN_B 5
|
||||
#define MARGIN_T 5
|
||||
#define MARGIN_B 5
|
||||
#endif
|
||||
const bool has_selection = screen_data.FilesScreen.selected_tag != 0xFF;
|
||||
const uint8_t back_tag = screen_data.FilesScreen.flags.is_root ? 240 : 245;
|
||||
@@ -170,11 +170,11 @@ void FilesScreen::drawFooter() {
|
||||
.tag(back_tag).button( BTN_POS(4,y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BACK))
|
||||
.enabled(has_selection)
|
||||
.colors(has_selection ? action_btn : normal_btn);
|
||||
if (screen_data.FilesScreen.flags.is_dir) {
|
||||
|
||||
if (screen_data.FilesScreen.flags.is_dir)
|
||||
cmd.tag(244).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_OPEN));
|
||||
} else {
|
||||
else
|
||||
cmd.tag(243).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_PRINT));
|
||||
}
|
||||
}
|
||||
|
||||
void FilesScreen::onRedraw(draw_mode_t what) {
|
||||
|
||||
@@ -122,28 +122,25 @@ char &LockScreen::message_style() {
|
||||
}
|
||||
|
||||
void LockScreen::onPasscodeEntered() {
|
||||
if (passcode == 0) {
|
||||
// We are defining a passcode
|
||||
if (passcode == 0) { // We are defining a passcode
|
||||
message_style() = 0;
|
||||
onRefresh();
|
||||
sound.play(twinkle, PLAY_SYNCHRONOUS);
|
||||
passcode = compute_checksum();
|
||||
GOTO_PREVIOUS();
|
||||
} else {
|
||||
// We are verifying a passcode
|
||||
if (passcode == compute_checksum()) {
|
||||
message_style() = 'g';
|
||||
onRefresh();
|
||||
sound.play(twinkle, PLAY_SYNCHRONOUS);
|
||||
GOTO_PREVIOUS();
|
||||
}
|
||||
else {
|
||||
message_style() = 'w';
|
||||
onRefresh();
|
||||
sound.play(sad_trombone, PLAY_SYNCHRONOUS);
|
||||
current_screen.forget(); // Discard the screen the user was trying to go to.
|
||||
GOTO_PREVIOUS();
|
||||
}
|
||||
}
|
||||
else if (passcode == compute_checksum()) { // We are verifying a passcode
|
||||
message_style() = 'g';
|
||||
onRefresh();
|
||||
sound.play(twinkle, PLAY_SYNCHRONOUS);
|
||||
GOTO_PREVIOUS();
|
||||
}
|
||||
else {
|
||||
message_style() = 'w';
|
||||
onRefresh();
|
||||
sound.play(sad_trombone, PLAY_SYNCHRONOUS);
|
||||
current_screen.forget(); // Discard the screen the user was trying to go to.
|
||||
GOTO_PREVIOUS();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -56,10 +56,9 @@ void SaveSettingsDialogBox::promptToSaveSettings() {
|
||||
// so SaveSettingsDialogBox doesn't return here.
|
||||
GOTO_SCREEN(SaveSettingsDialogBox);
|
||||
current_screen.forget();
|
||||
} else {
|
||||
// No save needed.
|
||||
GOTO_PREVIOUS();
|
||||
}
|
||||
else
|
||||
GOTO_PREVIOUS(); // No save needed.
|
||||
}
|
||||
|
||||
#endif // TOUCH_UI_FTDI_EVE
|
||||
|
||||
@@ -54,7 +54,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
lv_clear_advance_settings();
|
||||
lv_draw_filament_settings();
|
||||
break;
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case ID_WIFI_PARA:
|
||||
lv_clear_advance_settings();
|
||||
lv_draw_wifi_settings();
|
||||
@@ -75,7 +75,7 @@ void lv_draw_advance_settings(void) {
|
||||
int index = 0;
|
||||
lv_screen_menu_item(scr, machine_menu.PausePosition, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PAUSE_POS, index++);
|
||||
lv_screen_menu_item(scr, machine_menu.FilamentConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FILAMENT_SETTINGS, index++);
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
lv_screen_menu_item(scr, machine_menu.WifiSettings, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_WIFI_PARA, index++);
|
||||
#endif
|
||||
#if HAS_ROTARY_ENCODER
|
||||
|
||||
@@ -239,7 +239,7 @@ void lv_draw_dialog(uint8_t type) {
|
||||
lv_obj_t *labelCancel = lv_label_create_empty(btnCancel);
|
||||
lv_label_set_text(labelCancel, print_file_dialog_menu.cancle);
|
||||
}
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
else if (DIALOG_IS(TYPE_UPLOAD_FILE)) {
|
||||
if (upload_result == 2) {
|
||||
btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb);
|
||||
@@ -377,7 +377,7 @@ void lv_draw_dialog(uint8_t type) {
|
||||
lv_label_set_text(labelDialog, DIALOG_UPDATE_NO_DEVICE_EN);
|
||||
lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
|
||||
}
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
else if (DIALOG_IS(TYPE_UPLOAD_FILE)) {
|
||||
if (upload_result == 1) {
|
||||
lv_label_set_text(labelDialog, DIALOG_UPLOAD_ING_EN);
|
||||
@@ -418,7 +418,7 @@ void lv_draw_dialog(uint8_t type) {
|
||||
lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
|
||||
}
|
||||
}
|
||||
#endif // USE_WIFI_FUNCTION
|
||||
#endif // MKS_WIFI_MODULE
|
||||
else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT)) {
|
||||
lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat);
|
||||
lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
|
||||
|
||||
@@ -122,7 +122,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) {
|
||||
//if (res != LV_RES_OK) return;
|
||||
const char * ret_ta_txt = lv_ta_get_text(ext->ta);
|
||||
switch (keyboard_value) {
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case wifiName:
|
||||
memcpy(uiCfg.wifi_name,ret_ta_txt,sizeof(uiCfg.wifi_name));
|
||||
lv_clear_keyboard();
|
||||
@@ -158,7 +158,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) {
|
||||
wifi_tips_type = TIPS_TYPE_JOINING;
|
||||
lv_draw_wifi_tips();
|
||||
break;
|
||||
#endif // USE_WIFI_FUNCTION
|
||||
#endif // MKS_WIFI_MODULE
|
||||
case gcodeCommand:
|
||||
uint8_t buf[100];
|
||||
strncpy((char *)buf,ret_ta_txt,sizeof(buf));
|
||||
|
||||
@@ -181,7 +181,7 @@ static void disp_language(uint8_t language, uint8_t state) {
|
||||
|
||||
strcat_P(public_buf_l, PSTR(".bin"));
|
||||
|
||||
lv_obj_set_event_cb_mks(obj, event_handler, id, nullptr, 0);
|
||||
lv_obj_set_event_cb_mks(obj, event_handler, id, "", 0);
|
||||
lv_imgbtn_set_src_both(obj, public_buf_l);
|
||||
|
||||
if (state == UNSELECTED) lv_obj_refresh_ext_draw_pad(obj);
|
||||
|
||||
@@ -180,10 +180,7 @@ void lv_draw_operation(void) {
|
||||
label_PowerOff = lv_label_create_empty(buttonPowerOff);
|
||||
|
||||
if (uiCfg.print_state != WORKING) {
|
||||
/*
|
||||
label_Filament = lv_label_create_empty(buttonFilament);
|
||||
} else {
|
||||
*/
|
||||
//label_Filament = lv_label_create_empty(buttonFilament);
|
||||
labelExtrusion = lv_label_create_empty(buttonExtrusion);
|
||||
label_Move = lv_label_create_empty(buttonMove);
|
||||
}
|
||||
@@ -210,11 +207,8 @@ void lv_draw_operation(void) {
|
||||
lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
|
||||
if (uiCfg.print_state != WORKING) {
|
||||
/*
|
||||
lv_label_set_text(label_Filament, operation_menu.filament);
|
||||
lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET);
|
||||
} else {
|
||||
*/
|
||||
//lv_label_set_text(label_Filament, operation_menu.filament);
|
||||
//lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET);
|
||||
lv_label_set_text(labelExtrusion, operation_menu.extr);
|
||||
lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
|
||||
|
||||
@@ -279,7 +279,7 @@ void disp_gcode_icon(uint8_t file_num) {
|
||||
cutFileName((char *)list_file.long_name[i], 16, 8, (char *)public_buf_m);
|
||||
|
||||
if (list_file.IsFolder[i]) {
|
||||
lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), nullptr, 0);
|
||||
lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "", 0);
|
||||
lv_imgbtn_set_src_both(buttonGcode[i], "F:/bmp_dir.bin");
|
||||
if (i < 3)
|
||||
lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight);
|
||||
@@ -298,7 +298,7 @@ void disp_gcode_icon(uint8_t file_num) {
|
||||
strcat(test_public_buf_l, list_file.file_name[i]);
|
||||
char *temp = strstr(test_public_buf_l, ".GCO");
|
||||
if (temp) strcpy(temp, ".bin");
|
||||
lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), nullptr, 0);
|
||||
lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "", 0);
|
||||
lv_imgbtn_set_src_both(buttonGcode[i], test_public_buf_l);
|
||||
if (i < 3) {
|
||||
lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET);
|
||||
@@ -308,7 +308,7 @@ void disp_gcode_icon(uint8_t file_num) {
|
||||
lv_btn_use_label_style(buttonText[i]);
|
||||
lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW);
|
||||
lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF);
|
||||
//lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),nullptr, 0);
|
||||
//lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),"", 0);
|
||||
lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET + 100);
|
||||
lv_obj_set_size(buttonText[i], 100, 40);
|
||||
}
|
||||
@@ -320,7 +320,7 @@ void disp_gcode_icon(uint8_t file_num) {
|
||||
lv_btn_use_label_style(buttonText[i]);
|
||||
lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW);
|
||||
lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF);
|
||||
//lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),nullptr, 0);
|
||||
//lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),"", 0);
|
||||
lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET + 100);
|
||||
lv_obj_set_size(buttonText[i], 100, 40);
|
||||
}
|
||||
@@ -328,7 +328,7 @@ void disp_gcode_icon(uint8_t file_num) {
|
||||
lv_obj_align(labelPageUp[i], buttonText[i], LV_ALIGN_IN_BOTTOM_MID, 0, 0);
|
||||
}
|
||||
else {
|
||||
lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), nullptr, 0);
|
||||
lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "", 0);
|
||||
lv_imgbtn_set_src_both(buttonGcode[i], "F:/bmp_file.bin");
|
||||
if (i < 3)
|
||||
lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight);
|
||||
|
||||
@@ -219,7 +219,7 @@ void lv_draw_ready_print(void) {
|
||||
|
||||
void lv_clear_ready_print() {
|
||||
#if HAS_ROTARY_ENCODER
|
||||
if (gCfgItems.encoder_enable == true) lv_group_remove_all_objs(g);
|
||||
if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g);
|
||||
#endif
|
||||
lv_obj_del(scr);
|
||||
}
|
||||
|
||||
@@ -37,6 +37,10 @@
|
||||
#include "../../../../gcode/queue.h"
|
||||
#include "../../../../inc/MarlinConfig.h"
|
||||
|
||||
#if HAS_SUICIDE
|
||||
#include "../../../../MarlinCore.h"
|
||||
#endif
|
||||
|
||||
static lv_obj_t *scr;
|
||||
extern lv_group_t* g;
|
||||
|
||||
@@ -54,7 +58,7 @@ enum {
|
||||
|
||||
static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
if (event != LV_EVENT_RELEASED) return;
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
char buf[6] = { 0 };
|
||||
#endif
|
||||
switch (obj->mks_obj_id) {
|
||||
@@ -87,7 +91,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
lv_draw_ready_print();
|
||||
break;
|
||||
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case ID_S_WIFI:
|
||||
if (gCfgItems.wifi_mode_sel == STA_MODEL) {
|
||||
if (wifi_link_state == WIFI_CONNECTED) {
|
||||
@@ -135,7 +139,7 @@ void lv_draw_set(void) {
|
||||
#if HAS_LANG_SELECT_SCREEN
|
||||
lv_big_button_create(scr, "F:/bmp_language.bin", set_menu.language, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_LANGUAGE);
|
||||
#endif
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
lv_big_button_create(scr, "F:/bmp_wifi.bin", set_menu.wifi, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_WIFI);
|
||||
#endif
|
||||
lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_RETURN);
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "../../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if BOTH(HAS_TFT_LVGL_UI, TOUCH_SCREEN_CALIBRATION)
|
||||
|
||||
#include "draw_ui.h"
|
||||
#include "draw_touch_calibration.h"
|
||||
#include <lv_conf.h>
|
||||
|
||||
#include "../../../../inc/MarlinConfig.h"
|
||||
#include "../../../tft_io/touch_calibration.h"
|
||||
#include "SPI_TFT.h"
|
||||
|
||||
static lv_obj_t *scr;
|
||||
static lv_obj_t *status_label;
|
||||
|
||||
static void event_handler(lv_obj_t *obj, lv_event_t event);
|
||||
|
||||
enum {
|
||||
ID_TC_RETURN = 1
|
||||
};
|
||||
|
||||
static void drawCross(uint16_t x, uint16_t y, uint16_t color) {
|
||||
SPI_TFT.tftio.set_window(x - 15, y, x + 15, y);
|
||||
SPI_TFT.tftio.WriteMultiple(color, 31);
|
||||
SPI_TFT.tftio.set_window(x, y - 15, x, y + 15);
|
||||
SPI_TFT.tftio.WriteMultiple(color, 31);
|
||||
}
|
||||
|
||||
void lv_update_touch_calibration_screen() {
|
||||
uint16_t x, y;
|
||||
|
||||
calibrationState calibration_stage = touch_calibration.get_calibration_state();
|
||||
if (calibration_stage == CALIBRATION_NONE) {
|
||||
// start and clear screen
|
||||
calibration_stage = touch_calibration.calibration_start();
|
||||
}
|
||||
else {
|
||||
// clear last cross
|
||||
x = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].x;
|
||||
y = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].y;
|
||||
drawCross(x, y, LV_COLOR_BACKGROUND.full);
|
||||
}
|
||||
|
||||
const char *str = nullptr;
|
||||
if (calibration_stage < CALIBRATION_SUCCESS) {
|
||||
// handle current state
|
||||
switch (calibration_stage) {
|
||||
case CALIBRATION_TOP_LEFT: str = GET_TEXT(MSG_TOP_LEFT); break;
|
||||
case CALIBRATION_BOTTOM_LEFT: str = GET_TEXT(MSG_BOTTOM_LEFT); break;
|
||||
case CALIBRATION_TOP_RIGHT: str = GET_TEXT(MSG_TOP_RIGHT); break;
|
||||
case CALIBRATION_BOTTOM_RIGHT: str = GET_TEXT(MSG_BOTTOM_RIGHT); break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
x = touch_calibration.calibration_points[calibration_stage].x;
|
||||
y = touch_calibration.calibration_points[calibration_stage].y;
|
||||
drawCross(x, y, LV_COLOR_WHITE.full);
|
||||
}
|
||||
else {
|
||||
// end calibration
|
||||
str = calibration_stage == CALIBRATION_SUCCESS ? GET_TEXT(MSG_CALIBRATION_COMPLETED) : GET_TEXT(MSG_CALIBRATION_FAILED);
|
||||
touch_calibration.calibration_end();
|
||||
lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_TC_RETURN);
|
||||
}
|
||||
|
||||
// draw current message
|
||||
lv_label_set_text(status_label, str);
|
||||
lv_obj_align(status_label, nullptr, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
|
||||
static void event_handler(lv_obj_t *obj, lv_event_t event) {
|
||||
if (event != LV_EVENT_RELEASED) return;
|
||||
switch (obj->mks_obj_id) {
|
||||
case ID_TC_RETURN:
|
||||
TERN_(MKS_TEST, curent_disp_ui = 1);
|
||||
lv_clear_touch_calibration_screen();
|
||||
lv_draw_ready_print();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void lv_draw_touch_calibration_screen() {
|
||||
disp_state_stack._disp_index = 0;
|
||||
ZERO(disp_state_stack._disp_state);
|
||||
scr = lv_screen_create(TOUCH_CALIBRATION_UI, "");
|
||||
|
||||
status_label = lv_label_create(scr, "");
|
||||
lv_obj_align(status_label, nullptr, LV_ALIGN_CENTER, 0, 0);
|
||||
|
||||
lv_refr_now(lv_refr_get_disp_refreshing());
|
||||
|
||||
lv_update_touch_calibration_screen();
|
||||
}
|
||||
|
||||
void lv_clear_touch_calibration_screen() {
|
||||
lv_obj_del(scr);
|
||||
}
|
||||
|
||||
#endif // HAS_TFT_LVGL_UI && TOUCH_SCREEN_CALIBRATION
|
||||
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* C-declarations for C++ */
|
||||
#endif
|
||||
|
||||
extern void lv_draw_touch_calibration_screen();
|
||||
extern void lv_clear_touch_calibration_screen();
|
||||
extern void lv_update_touch_calibration_screen();
|
||||
|
||||
//extern void disp_temp_ready_print();
|
||||
#ifdef __cplusplus
|
||||
} /* C-declarations for C++ */
|
||||
#endif
|
||||
@@ -48,6 +48,10 @@
|
||||
#include "../../../../feature/pause.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
|
||||
#include "draw_touch_calibration.h"
|
||||
#endif
|
||||
|
||||
CFG_ITMES gCfgItems;
|
||||
UI_CFG uiCfg;
|
||||
DISP_STATE_STACK disp_state_stack;
|
||||
@@ -134,7 +138,7 @@ void gCfgItems_init() {
|
||||
gCfgItems.levelingPos[4][0] = X_BED_SIZE / 2;
|
||||
gCfgItems.levelingPos[4][1] = Y_BED_SIZE / 2;
|
||||
gCfgItems.cloud_enable = true;
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
gCfgItems.wifi_mode_sel = STA_MODEL;
|
||||
gCfgItems.fileSysType = FILE_SYS_SD;
|
||||
gCfgItems.wifi_type = ESP_WIFI;
|
||||
@@ -199,7 +203,7 @@ void ui_cfg_init() {
|
||||
uiCfg.filament_unloading_time_flg = 0;
|
||||
uiCfg.filament_unloading_time_cnt = 0;
|
||||
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
memset(&wifiPara, 0, sizeof(wifiPara));
|
||||
memset(&ipPara, 0, sizeof(ipPara));
|
||||
strcpy(wifiPara.ap_name, WIFI_AP_NAME);
|
||||
@@ -538,7 +542,7 @@ char *getDispText(int index) {
|
||||
strcpy(public_buf_l, tool_menu.title);
|
||||
break;
|
||||
case WIFI_LIST_UI:
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
strcpy(public_buf_l, list_menu.title);
|
||||
break;
|
||||
#endif
|
||||
@@ -1036,7 +1040,7 @@ void GUI_RefreshPage() {
|
||||
*/
|
||||
break;
|
||||
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_UI:
|
||||
if (temps_update_flag) {
|
||||
disp_wifi_state();
|
||||
@@ -1057,7 +1061,7 @@ void GUI_RefreshPage() {
|
||||
break;
|
||||
case DIALOG_UI:
|
||||
filament_dialog_handle();
|
||||
TERN_(USE_WIFI_FUNCTION, wifi_scan_handle());
|
||||
TERN_(MKS_WIFI_MODULE, wifi_scan_handle());
|
||||
break;
|
||||
case MESHLEVELING_UI:
|
||||
/*disp_zpos();*/
|
||||
@@ -1065,7 +1069,7 @@ void GUI_RefreshPage() {
|
||||
case HARDWARE_TEST_UI:
|
||||
break;
|
||||
case WIFI_LIST_UI:
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
if (printing_rate_update_flag) {
|
||||
disp_wifi_list();
|
||||
printing_rate_update_flag = false;
|
||||
@@ -1076,7 +1080,7 @@ void GUI_RefreshPage() {
|
||||
/*update_password_disp();
|
||||
update_join_state_disp();*/
|
||||
break;
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_TIPS_UI:
|
||||
switch (wifi_tips_type) {
|
||||
case TIPS_TYPE_JOINING:
|
||||
@@ -1138,227 +1142,94 @@ void clear_cur_ui() {
|
||||
last_disp_state = disp_state_stack._disp_state[disp_state_stack._disp_index];
|
||||
|
||||
switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
|
||||
case PRINT_READY_UI:
|
||||
//Get_Temperature_Flg = 0;
|
||||
lv_clear_ready_print();
|
||||
break;
|
||||
case PRINT_FILE_UI:
|
||||
lv_clear_print_file();
|
||||
break;
|
||||
case PRINTING_UI:
|
||||
lv_clear_printing();
|
||||
break;
|
||||
case MOVE_MOTOR_UI:
|
||||
lv_clear_move_motor();
|
||||
break;
|
||||
case OPERATE_UI:
|
||||
lv_clear_operation();
|
||||
break;
|
||||
case PAUSE_UI:
|
||||
//Clear_pause();
|
||||
break;
|
||||
case EXTRUSION_UI:
|
||||
lv_clear_extrusion();
|
||||
break;
|
||||
case PRE_HEAT_UI:
|
||||
lv_clear_preHeat();
|
||||
break;
|
||||
case CHANGE_SPEED_UI:
|
||||
lv_clear_change_speed();
|
||||
break;
|
||||
case FAN_UI:
|
||||
lv_clear_fan();
|
||||
break;
|
||||
case SET_UI:
|
||||
lv_clear_set();
|
||||
break;
|
||||
case ZERO_UI:
|
||||
lv_clear_home();
|
||||
break;
|
||||
case SPRAYER_UI:
|
||||
//Clear_Sprayer();
|
||||
break;
|
||||
case MACHINE_UI:
|
||||
//Clear_Machine();
|
||||
break;
|
||||
case LANGUAGE_UI:
|
||||
lv_clear_language();
|
||||
break;
|
||||
case ABOUT_UI:
|
||||
lv_clear_about();
|
||||
break;
|
||||
case LOG_UI:
|
||||
//Clear_Connect();
|
||||
break;
|
||||
case DISK_UI:
|
||||
//Clear_Disk();
|
||||
break;
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
case WIFI_UI:
|
||||
lv_clear_wifi();
|
||||
break;
|
||||
case PRINT_READY_UI: //Get_Temperature_Flg = 0;
|
||||
lv_clear_ready_print(); break;
|
||||
case PRINT_FILE_UI: lv_clear_print_file(); break;
|
||||
case PRINTING_UI: lv_clear_printing(); break;
|
||||
case MOVE_MOTOR_UI: lv_clear_move_motor(); break;
|
||||
case OPERATE_UI: lv_clear_operation(); break;
|
||||
case PAUSE_UI: /* Clear_pause(); */ break;
|
||||
case EXTRUSION_UI: lv_clear_extrusion(); break;
|
||||
case PRE_HEAT_UI: lv_clear_preHeat(); break;
|
||||
case CHANGE_SPEED_UI: lv_clear_change_speed(); break;
|
||||
case FAN_UI: lv_clear_fan(); break;
|
||||
case SET_UI: lv_clear_set(); break;
|
||||
case ZERO_UI: lv_clear_home(); break;
|
||||
case SPRAYER_UI: /* Clear_Sprayer(); */ break;
|
||||
case MACHINE_UI: /* Clear_Machine(); */ break;
|
||||
case LANGUAGE_UI: lv_clear_language(); break;
|
||||
case ABOUT_UI: lv_clear_about(); break;
|
||||
case LOG_UI: /* Clear_Connect(); */ break;
|
||||
case DISK_UI: /* Clear_Disk(); */ break;
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_UI: lv_clear_wifi(); break;
|
||||
#endif
|
||||
case MORE_UI:
|
||||
//Clear_more();
|
||||
break;
|
||||
case FILETRANSFER_UI:
|
||||
//Clear_fileTransfer();
|
||||
break;
|
||||
case DIALOG_UI:
|
||||
lv_clear_dialog();
|
||||
break;
|
||||
case FILETRANSFERSTATE_UI:
|
||||
//Clear_WifiFileTransferdialog();
|
||||
break;
|
||||
case PRINT_MORE_UI:
|
||||
//Clear_Printmore();
|
||||
break;
|
||||
case FILAMENTCHANGE_UI:
|
||||
lv_clear_filament_change();
|
||||
break;
|
||||
case LEVELING_UI:
|
||||
lv_clear_manualLevel();
|
||||
break;
|
||||
case BIND_UI:
|
||||
//Clear_Bind();
|
||||
break;
|
||||
case MORE_UI: /* Clear_more(); */ break;
|
||||
case FILETRANSFER_UI: /* Clear_fileTransfer(); */ break;
|
||||
case DIALOG_UI: lv_clear_dialog(); break;
|
||||
case FILETRANSFERSTATE_UI: /* Clear_WifiFileTransferdialog(); */ break;
|
||||
case PRINT_MORE_UI: /* Clear_Printmore(); */ break;
|
||||
case FILAMENTCHANGE_UI: lv_clear_filament_change(); break;
|
||||
case LEVELING_UI: lv_clear_manualLevel(); break;
|
||||
case BIND_UI: /* Clear_Bind(); */ break;
|
||||
#if HAS_BED_PROBE
|
||||
case NOZZLE_PROBE_OFFSET_UI:
|
||||
lv_clear_auto_level_offset_settings();
|
||||
break;
|
||||
case NOZZLE_PROBE_OFFSET_UI: lv_clear_auto_level_offset_settings(); break;
|
||||
#endif
|
||||
case TOOL_UI:
|
||||
lv_clear_tool();
|
||||
break;
|
||||
case MESHLEVELING_UI:
|
||||
//Clear_MeshLeveling();
|
||||
break;
|
||||
case HARDWARE_TEST_UI:
|
||||
//Clear_Hardwaretest();
|
||||
break;
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
case WIFI_LIST_UI:
|
||||
lv_clear_wifi_list();
|
||||
break;
|
||||
case TOOL_UI: lv_clear_tool(); break;
|
||||
case MESHLEVELING_UI: /* Clear_MeshLeveling(); */ break;
|
||||
case HARDWARE_TEST_UI: /* Clear_Hardwaretest(); */ break;
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_LIST_UI: lv_clear_wifi_list(); break;
|
||||
#endif
|
||||
case KEY_BOARD_UI:
|
||||
lv_clear_keyboard();
|
||||
break;
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
case WIFI_TIPS_UI:
|
||||
lv_clear_wifi_tips();
|
||||
break;
|
||||
case KEY_BOARD_UI: lv_clear_keyboard(); break;
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_TIPS_UI: lv_clear_wifi_tips(); break;
|
||||
#endif
|
||||
case MACHINE_PARA_UI:
|
||||
lv_clear_machine_para();
|
||||
break;
|
||||
case MACHINE_SETTINGS_UI:
|
||||
lv_clear_machine_settings();
|
||||
break;
|
||||
case TEMPERATURE_SETTINGS_UI:
|
||||
//Clear_TemperatureSettings();
|
||||
break;
|
||||
case MOTOR_SETTINGS_UI:
|
||||
lv_clear_motor_settings();
|
||||
break;
|
||||
case MACHINETYPE_UI:
|
||||
//Clear_MachineType();
|
||||
break;
|
||||
case STROKE_UI:
|
||||
//Clear_Stroke();
|
||||
break;
|
||||
case HOME_DIR_UI:
|
||||
//Clear_HomeDir();
|
||||
break;
|
||||
case ENDSTOP_TYPE_UI:
|
||||
//Clear_EndstopType();
|
||||
break;
|
||||
case FILAMENT_SETTINGS_UI:
|
||||
lv_clear_filament_settings();
|
||||
break;
|
||||
case LEVELING_SETTIGNS_UI:
|
||||
//Clear_LevelingSettings();
|
||||
break;
|
||||
case LEVELING_PARA_UI:
|
||||
lv_clear_level_settings();
|
||||
break;
|
||||
case DELTA_LEVELING_PARA_UI:
|
||||
//Clear_DeltaLevelPara();
|
||||
break;
|
||||
case MANUAL_LEVELING_POSIGION_UI:
|
||||
lv_clear_manual_level_pos_settings();
|
||||
break;
|
||||
case MAXFEEDRATE_UI:
|
||||
lv_clear_max_feedrate_settings();
|
||||
break;
|
||||
case STEPS_UI:
|
||||
lv_clear_step_settings();
|
||||
break;
|
||||
case ACCELERATION_UI:
|
||||
lv_clear_acceleration_settings();
|
||||
break;
|
||||
case JERK_UI:
|
||||
#if HAS_CLASSIC_JERK
|
||||
lv_clear_jerk_settings();
|
||||
#endif
|
||||
break;
|
||||
case MOTORDIR_UI:
|
||||
//Clear_MotorDir();
|
||||
break;
|
||||
case HOMESPEED_UI:
|
||||
//Clear_HomeSpeed();
|
||||
break;
|
||||
case NOZZLE_CONFIG_UI:
|
||||
//Clear_NozzleConfig();
|
||||
break;
|
||||
case HOTBED_CONFIG_UI:
|
||||
//Clear_HotbedConfig();
|
||||
break;
|
||||
case ADVANCED_UI:
|
||||
lv_clear_advance_settings();
|
||||
break;
|
||||
case DOUBLE_Z_UI:
|
||||
//Clear_DoubleZ();
|
||||
break;
|
||||
case ENABLE_INVERT_UI:
|
||||
//Clear_EnableInvert();
|
||||
break;
|
||||
case NUMBER_KEY_UI:
|
||||
lv_clear_number_key();
|
||||
break;
|
||||
case BABY_STEP_UI:
|
||||
lv_clear_baby_stepping();
|
||||
break;
|
||||
case PAUSE_POS_UI:
|
||||
lv_clear_pause_position();
|
||||
break;
|
||||
case MACHINE_PARA_UI: lv_clear_machine_para(); break;
|
||||
case MACHINE_SETTINGS_UI: lv_clear_machine_settings(); break;
|
||||
case TEMPERATURE_SETTINGS_UI: /* Clear_TemperatureSettings(); */ break;
|
||||
case MOTOR_SETTINGS_UI: lv_clear_motor_settings(); break;
|
||||
case MACHINETYPE_UI: /* Clear_MachineType(); */ break;
|
||||
case STROKE_UI: /* Clear_Stroke(); */ break;
|
||||
case HOME_DIR_UI: /* Clear_HomeDir(); */ break;
|
||||
case ENDSTOP_TYPE_UI: /* Clear_EndstopType(); */ break;
|
||||
case FILAMENT_SETTINGS_UI: lv_clear_filament_settings(); break;
|
||||
case LEVELING_SETTIGNS_UI: /* Clear_LevelingSettings(); */ break;
|
||||
case LEVELING_PARA_UI: lv_clear_level_settings(); break;
|
||||
case DELTA_LEVELING_PARA_UI: /* Clear_DeltaLevelPara(); */ break;
|
||||
case MANUAL_LEVELING_POSIGION_UI: lv_clear_manual_level_pos_settings(); break;
|
||||
case MAXFEEDRATE_UI: lv_clear_max_feedrate_settings(); break;
|
||||
case STEPS_UI: lv_clear_step_settings(); break;
|
||||
case ACCELERATION_UI: lv_clear_acceleration_settings(); break;
|
||||
case JERK_UI: TERN_(HAS_CLASSIC_JERK, lv_clear_jerk_settings()); break;
|
||||
case MOTORDIR_UI: /* Clear_MotorDir(); */ break;
|
||||
case HOMESPEED_UI: /* Clear_HomeSpeed(); */ break;
|
||||
case NOZZLE_CONFIG_UI: /* Clear_NozzleConfig(); */ break;
|
||||
case HOTBED_CONFIG_UI: /* Clear_HotbedConfig(); */ break;
|
||||
case ADVANCED_UI: lv_clear_advance_settings(); break;
|
||||
case DOUBLE_Z_UI: /* Clear_DoubleZ(); */ break;
|
||||
case ENABLE_INVERT_UI: /* Clear_EnableInvert(); */ break;
|
||||
case NUMBER_KEY_UI: lv_clear_number_key(); break;
|
||||
case BABY_STEP_UI: lv_clear_baby_stepping(); break;
|
||||
case PAUSE_POS_UI: lv_clear_pause_position(); break;
|
||||
#if HAS_TRINAMIC_CONFIG
|
||||
case TMC_CURRENT_UI:
|
||||
lv_clear_tmc_current_settings();
|
||||
break;
|
||||
case TMC_CURRENT_UI: lv_clear_tmc_current_settings(); break;
|
||||
#endif
|
||||
case EEPROM_SETTINGS_UI:
|
||||
lv_clear_eeprom_settings();
|
||||
break;
|
||||
#if HAS_STEALTHCHOP
|
||||
case TMC_MODE_UI:
|
||||
lv_clear_tmc_step_mode_settings();
|
||||
break;
|
||||
#endif
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
case WIFI_SETTINGS_UI:
|
||||
lv_clear_wifi_settings();
|
||||
break;
|
||||
case EEPROM_SETTINGS_UI: lv_clear_eeprom_settings(); break;
|
||||
#if HAS_STEALTHCHOP
|
||||
case TMC_MODE_UI: lv_clear_tmc_step_mode_settings(); break;
|
||||
#endif
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_SETTINGS_UI: lv_clear_wifi_settings(); break;
|
||||
#endif
|
||||
#if USE_SENSORLESS
|
||||
case HOMING_SENSITIVITY_UI:
|
||||
lv_clear_homing_sensitivity_settings();
|
||||
break;
|
||||
case HOMING_SENSITIVITY_UI: lv_clear_homing_sensitivity_settings(); break;
|
||||
#endif
|
||||
#if HAS_ROTARY_ENCODER
|
||||
case ENCODER_SETTINGS_UI:
|
||||
lv_clear_encoder_settings();
|
||||
break;
|
||||
case ENCODER_SETTINGS_UI: lv_clear_encoder_settings(); break;
|
||||
#endif
|
||||
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
|
||||
case TOUCH_CALIBRATION_UI: lv_clear_touch_calibration_screen(); break;
|
||||
#endif
|
||||
default: break;
|
||||
}
|
||||
@@ -1370,227 +1241,98 @@ void draw_return_ui() {
|
||||
disp_state_stack._disp_index--;
|
||||
|
||||
switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
|
||||
case PRINT_READY_UI:
|
||||
lv_draw_ready_print();
|
||||
break;
|
||||
case PRINT_FILE_UI:
|
||||
lv_draw_print_file();
|
||||
break;
|
||||
case PRINTING_UI:
|
||||
if (gCfgItems.from_flash_pic) flash_preview_begin = true;
|
||||
else default_preview_flg = true;
|
||||
lv_draw_printing();
|
||||
break;
|
||||
case MOVE_MOTOR_UI:
|
||||
lv_draw_move_motor();
|
||||
break;
|
||||
case OPERATE_UI:
|
||||
lv_draw_operation();
|
||||
break;
|
||||
case PRINT_READY_UI: lv_draw_ready_print(); break;
|
||||
case PRINT_FILE_UI: lv_draw_print_file(); break;
|
||||
|
||||
#if 1
|
||||
case PAUSE_UI:
|
||||
//draw_pause();
|
||||
break;
|
||||
#endif
|
||||
case PRINTING_UI: if (gCfgItems.from_flash_pic)
|
||||
flash_preview_begin = true;
|
||||
else
|
||||
default_preview_flg = true;
|
||||
lv_draw_printing();
|
||||
break;
|
||||
|
||||
case EXTRUSION_UI:
|
||||
lv_draw_extrusion();
|
||||
break;
|
||||
case PRE_HEAT_UI:
|
||||
lv_draw_preHeat();
|
||||
break;
|
||||
case CHANGE_SPEED_UI:
|
||||
lv_draw_change_speed();
|
||||
break;
|
||||
case FAN_UI:
|
||||
lv_draw_fan();
|
||||
break;
|
||||
case SET_UI:
|
||||
lv_draw_set();
|
||||
break;
|
||||
case ZERO_UI:
|
||||
lv_draw_home();
|
||||
break;
|
||||
case SPRAYER_UI:
|
||||
//draw_Sprayer();
|
||||
break;
|
||||
case MACHINE_UI:
|
||||
//draw_Machine();
|
||||
break;
|
||||
case LANGUAGE_UI:
|
||||
lv_draw_language();
|
||||
break;
|
||||
case ABOUT_UI:
|
||||
lv_draw_about();
|
||||
break;
|
||||
case MOVE_MOTOR_UI: lv_draw_move_motor(); break;
|
||||
case OPERATE_UI: lv_draw_operation(); break;
|
||||
case PAUSE_UI: /* draw_pause(); */ break;
|
||||
case EXTRUSION_UI: lv_draw_extrusion(); break;
|
||||
case PRE_HEAT_UI: lv_draw_preHeat(); break;
|
||||
case CHANGE_SPEED_UI: lv_draw_change_speed(); break;
|
||||
case FAN_UI: lv_draw_fan(); break;
|
||||
case SET_UI: lv_draw_set(); break;
|
||||
case ZERO_UI: lv_draw_home(); break;
|
||||
case SPRAYER_UI: /* draw_Sprayer(); */ break;
|
||||
case MACHINE_UI: /* draw_Machine(); */ break;
|
||||
case LANGUAGE_UI: lv_draw_language(); break;
|
||||
case ABOUT_UI: lv_draw_about(); break;
|
||||
|
||||
case CALIBRATE_UI:
|
||||
//draw_calibrate();
|
||||
break;
|
||||
case DISK_UI:
|
||||
//draw_Disk();
|
||||
break;
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
case WIFI_UI:
|
||||
lv_draw_wifi();
|
||||
break;
|
||||
case CALIBRATE_UI: /* draw_calibrate(); */ break;
|
||||
case DISK_UI: /* draw_Disk(); */ break;
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_UI: lv_draw_wifi(); break;
|
||||
#endif
|
||||
case MORE_UI:
|
||||
//draw_More();
|
||||
break;
|
||||
case PRINT_MORE_UI:
|
||||
//draw_printmore();
|
||||
break;
|
||||
case FILAMENTCHANGE_UI:
|
||||
lv_draw_filament_change();
|
||||
break;
|
||||
case LEVELING_UI:
|
||||
lv_draw_manualLevel();
|
||||
break;
|
||||
case BIND_UI:
|
||||
//draw_bind();
|
||||
break;
|
||||
case MORE_UI: /* draw_More(); */ break;
|
||||
case PRINT_MORE_UI: /* draw_printmore(); */ break;
|
||||
case FILAMENTCHANGE_UI: lv_draw_filament_change(); break;
|
||||
case LEVELING_UI: lv_draw_manualLevel(); break;
|
||||
case BIND_UI: /* draw_bind(); */ break;
|
||||
#if HAS_BED_PROBE
|
||||
case NOZZLE_PROBE_OFFSET_UI:
|
||||
lv_draw_auto_level_offset_settings();
|
||||
break;
|
||||
case NOZZLE_PROBE_OFFSET_UI: lv_draw_auto_level_offset_settings(); break;
|
||||
#endif
|
||||
case TOOL_UI:
|
||||
lv_draw_tool();
|
||||
break;
|
||||
case MESHLEVELING_UI:
|
||||
//draw_meshleveling();
|
||||
break;
|
||||
case HARDWARE_TEST_UI:
|
||||
//draw_Hardwaretest();
|
||||
break;
|
||||
case WIFI_LIST_UI:
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
lv_draw_wifi_list();
|
||||
#endif
|
||||
break;
|
||||
case KEY_BOARD_UI:
|
||||
lv_draw_keyboard();
|
||||
break;
|
||||
case WIFI_TIPS_UI:
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
lv_draw_wifi_tips();
|
||||
#endif
|
||||
break;
|
||||
case MACHINE_PARA_UI:
|
||||
lv_draw_machine_para();
|
||||
break;
|
||||
case MACHINE_SETTINGS_UI:
|
||||
lv_draw_machine_settings();
|
||||
break;
|
||||
case TEMPERATURE_SETTINGS_UI:
|
||||
//draw_TemperatureSettings();
|
||||
break;
|
||||
case MOTOR_SETTINGS_UI:
|
||||
lv_draw_motor_settings();
|
||||
break;
|
||||
case MACHINETYPE_UI:
|
||||
//draw_MachineType();
|
||||
break;
|
||||
case STROKE_UI:
|
||||
//draw_Stroke();
|
||||
break;
|
||||
case HOME_DIR_UI:
|
||||
//draw_HomeDir();
|
||||
break;
|
||||
case ENDSTOP_TYPE_UI:
|
||||
//draw_EndstopType();
|
||||
break;
|
||||
case FILAMENT_SETTINGS_UI:
|
||||
lv_draw_filament_settings();
|
||||
break;
|
||||
case LEVELING_SETTIGNS_UI:
|
||||
//draw_LevelingSettings();
|
||||
break;
|
||||
case LEVELING_PARA_UI:
|
||||
lv_draw_level_settings();
|
||||
break;
|
||||
case DELTA_LEVELING_PARA_UI:
|
||||
//draw_DeltaLevelPara();
|
||||
break;
|
||||
case MANUAL_LEVELING_POSIGION_UI:
|
||||
lv_draw_manual_level_pos_settings();
|
||||
break;
|
||||
case MAXFEEDRATE_UI:
|
||||
lv_draw_max_feedrate_settings();
|
||||
break;
|
||||
case STEPS_UI:
|
||||
lv_draw_step_settings();
|
||||
break;
|
||||
case ACCELERATION_UI:
|
||||
lv_draw_acceleration_settings();
|
||||
break;
|
||||
case JERK_UI:
|
||||
#if HAS_CLASSIC_JERK
|
||||
lv_draw_jerk_settings();
|
||||
#endif
|
||||
break;
|
||||
case MOTORDIR_UI:
|
||||
//draw_MotorDir();
|
||||
break;
|
||||
case HOMESPEED_UI:
|
||||
//draw_HomeSpeed();
|
||||
break;
|
||||
case NOZZLE_CONFIG_UI:
|
||||
//draw_NozzleConfig();
|
||||
break;
|
||||
case HOTBED_CONFIG_UI:
|
||||
//draw_HotbedConfig();
|
||||
break;
|
||||
case ADVANCED_UI:
|
||||
lv_draw_advance_settings();
|
||||
break;
|
||||
case DOUBLE_Z_UI:
|
||||
//draw_DoubleZ();
|
||||
break;
|
||||
case ENABLE_INVERT_UI:
|
||||
//draw_EnableInvert();
|
||||
break;
|
||||
case NUMBER_KEY_UI:
|
||||
lv_draw_number_key();
|
||||
break;
|
||||
case DIALOG_UI:
|
||||
//draw_dialog(uiCfg.dialogType);
|
||||
break;
|
||||
case BABY_STEP_UI:
|
||||
lv_draw_baby_stepping();
|
||||
break;
|
||||
case PAUSE_POS_UI:
|
||||
lv_draw_pause_position();
|
||||
break;
|
||||
#if HAS_TRINAMIC_CONFIG
|
||||
case TMC_CURRENT_UI:
|
||||
lv_draw_tmc_current_settings();
|
||||
break;
|
||||
#endif
|
||||
case EEPROM_SETTINGS_UI:
|
||||
lv_draw_eeprom_settings();
|
||||
break;
|
||||
case TOOL_UI: lv_draw_tool(); break;
|
||||
case MESHLEVELING_UI: /* draw_meshleveling(); */ break;
|
||||
case HARDWARE_TEST_UI: /* draw_Hardwaretest(); */ break;
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_LIST_UI: lv_draw_wifi_list(); break;
|
||||
#endif
|
||||
case KEY_BOARD_UI: lv_draw_keyboard(); break;
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_TIPS_UI: lv_draw_wifi_tips(); break;
|
||||
#endif
|
||||
case MACHINE_PARA_UI: lv_draw_machine_para(); break;
|
||||
case MACHINE_SETTINGS_UI: lv_draw_machine_settings(); break;
|
||||
case TEMPERATURE_SETTINGS_UI: /* draw_TemperatureSettings(); */ break;
|
||||
case MOTOR_SETTINGS_UI: lv_draw_motor_settings(); break;
|
||||
case MACHINETYPE_UI: /* draw_MachineType(); */ break;
|
||||
case STROKE_UI: /* draw_Stroke(); */ break;
|
||||
case HOME_DIR_UI: /* draw_HomeDir(); */ break;
|
||||
case ENDSTOP_TYPE_UI: /* draw_EndstopType(); */ break;
|
||||
case FILAMENT_SETTINGS_UI: lv_draw_filament_settings(); break;
|
||||
case LEVELING_SETTIGNS_UI: /* draw_LevelingSettings(); */ break;
|
||||
case LEVELING_PARA_UI: lv_draw_level_settings(); break;
|
||||
case DELTA_LEVELING_PARA_UI: /* draw_DeltaLevelPara(); */ break;
|
||||
case MANUAL_LEVELING_POSIGION_UI: lv_draw_manual_level_pos_settings(); break;
|
||||
case MAXFEEDRATE_UI: lv_draw_max_feedrate_settings(); break;
|
||||
case STEPS_UI: lv_draw_step_settings(); break;
|
||||
case ACCELERATION_UI: lv_draw_acceleration_settings(); break;
|
||||
#if HAS_CLASSIC_JERK
|
||||
case JERK_UI: lv_draw_jerk_settings(); break;
|
||||
#endif
|
||||
case MOTORDIR_UI: /* draw_MotorDir(); */ break;
|
||||
case HOMESPEED_UI: /* draw_HomeSpeed(); */ break;
|
||||
case NOZZLE_CONFIG_UI: /* draw_NozzleConfig(); */ break;
|
||||
case HOTBED_CONFIG_UI: /* draw_HotbedConfig(); */ break;
|
||||
case ADVANCED_UI: lv_draw_advance_settings(); break;
|
||||
case DOUBLE_Z_UI: /* draw_DoubleZ(); */ break;
|
||||
case ENABLE_INVERT_UI: /* draw_EnableInvert(); */ break;
|
||||
case NUMBER_KEY_UI: lv_draw_number_key(); break;
|
||||
case DIALOG_UI: /* draw_dialog(uiCfg.dialogType); */ break;
|
||||
case BABY_STEP_UI: lv_draw_baby_stepping(); break;
|
||||
case PAUSE_POS_UI: lv_draw_pause_position(); break;
|
||||
#if HAS_TRINAMIC_CONFIG
|
||||
case TMC_CURRENT_UI: lv_draw_tmc_current_settings(); break;
|
||||
#endif
|
||||
case EEPROM_SETTINGS_UI: lv_draw_eeprom_settings(); break;
|
||||
#if HAS_STEALTHCHOP
|
||||
case TMC_MODE_UI:
|
||||
lv_draw_tmc_step_mode_settings();
|
||||
break;
|
||||
case TMC_MODE_UI: lv_draw_tmc_step_mode_settings(); break;
|
||||
#endif
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
case WIFI_SETTINGS_UI:
|
||||
lv_draw_wifi_settings();
|
||||
break;
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
case WIFI_SETTINGS_UI: lv_draw_wifi_settings(); break;
|
||||
#endif
|
||||
#if USE_SENSORLESS
|
||||
case HOMING_SENSITIVITY_UI:
|
||||
lv_draw_homing_sensitivity_settings();
|
||||
break;
|
||||
case HOMING_SENSITIVITY_UI: lv_draw_homing_sensitivity_settings(); break;
|
||||
#endif
|
||||
#if HAS_ROTARY_ENCODER
|
||||
case ENCODER_SETTINGS_UI:
|
||||
lv_draw_encoder_settings();
|
||||
break;
|
||||
case ENCODER_SETTINGS_UI: lv_draw_encoder_settings(); break;
|
||||
#endif
|
||||
default: break;
|
||||
}
|
||||
@@ -1680,7 +1422,7 @@ lv_obj_t* lv_label_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, const char
|
||||
lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id/*=0*/, lv_style_t *style/*=&style_para_value*/) {
|
||||
lv_obj_t *btn = lv_btn_create(par, nullptr);
|
||||
if (id)
|
||||
lv_obj_set_event_cb_mks(btn, cb, id, nullptr, 0);
|
||||
lv_obj_set_event_cb_mks(btn, cb, id, "", 0);
|
||||
else
|
||||
lv_obj_set_event_cb(btn, cb);
|
||||
lv_btn_set_style_both(btn, style);
|
||||
@@ -1748,7 +1490,7 @@ lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_event_cb_t cb, con
|
||||
lv_obj_t *btn = lv_imgbtn_create(par, nullptr);
|
||||
if (img) lv_imgbtn_set_src_both(btn, img);
|
||||
if (id)
|
||||
lv_obj_set_event_cb_mks(btn, cb, id, nullptr, 0);
|
||||
lv_obj_set_event_cb_mks(btn, cb, id, "", 0);
|
||||
else
|
||||
lv_obj_set_event_cb(btn, cb);
|
||||
lv_imgbtn_use_label_style(btn);
|
||||
@@ -1774,10 +1516,8 @@ lv_obj_t* lv_big_button_create(lv_obj_t *par, const char *img, const char *text,
|
||||
else
|
||||
lv_obj_align(label, btn, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
|
||||
}
|
||||
#if HAS_ROTARY_ENCODER
|
||||
if (gCfgItems.encoder_enable == true)
|
||||
lv_group_add_obj(g, btn);
|
||||
#endif
|
||||
if (TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable))
|
||||
lv_group_add_obj(g, btn);
|
||||
return btn;
|
||||
}
|
||||
|
||||
@@ -1785,7 +1525,7 @@ lv_obj_t* lv_screen_menu_item(lv_obj_t *par, const char *text, lv_coord_t x, lv_
|
||||
lv_obj_t *btn = lv_btn_create(par, nullptr); /*Add a button the current screen*/
|
||||
lv_obj_set_pos(btn, x, y); /*Set its position*/
|
||||
lv_obj_set_size(btn, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/
|
||||
if (id > -1) lv_obj_set_event_cb_mks(btn, cb, id, nullptr, 0);
|
||||
if (id > -1) lv_obj_set_event_cb_mks(btn, cb, id, "", 0);
|
||||
lv_btn_use_label_style(btn);
|
||||
lv_btn_set_layout(btn, LV_LAYOUT_OFF);
|
||||
lv_obj_t *label = lv_label_create_empty(btn); /*Add a label to the button*/
|
||||
@@ -1793,11 +1533,8 @@ lv_obj_t* lv_screen_menu_item(lv_obj_t *par, const char *text, lv_coord_t x, lv_
|
||||
lv_label_set_text(label, text);
|
||||
lv_obj_align(label, btn, LV_ALIGN_IN_LEFT_MID, 0, 0);
|
||||
}
|
||||
#if HAS_ROTARY_ENCODER
|
||||
if (gCfgItems.encoder_enable == true) {
|
||||
lv_group_add_obj(g, btn);
|
||||
}
|
||||
#endif
|
||||
if (TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable))
|
||||
lv_group_add_obj(g, btn);
|
||||
|
||||
if (drawArrow) (void)lv_imgbtn_create(par, "F:/bmp_arrow.bin", x + PARA_UI_SIZE_X, y + PARA_UI_ARROW_V, cb, id);
|
||||
|
||||
@@ -1879,15 +1616,11 @@ void LV_TASK_HANDLER() {
|
||||
lv_task_handler();
|
||||
if (mks_test_flag == 0x1E) mks_hardware_test();
|
||||
|
||||
#if HAS_GCODE_PREVIEW
|
||||
disp_pre_gcode(2, 36);
|
||||
#endif
|
||||
TERN_(HAS_GCODE_PREVIEW, disp_pre_gcode(2, 36));
|
||||
|
||||
GUI_RefreshPage();
|
||||
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
get_wifi_commands();
|
||||
#endif
|
||||
TERN_(MKS_WIFI_MODULE, get_wifi_commands());
|
||||
|
||||
//sd_detection();
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
#include "draw_keyboard.h"
|
||||
#include "draw_encoder_settings.h"
|
||||
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
#include "wifiSerial.h"
|
||||
#include "wifi_module.h"
|
||||
#include "wifi_upload.h"
|
||||
@@ -313,7 +313,8 @@ typedef enum {
|
||||
EEPROM_SETTINGS_UI,
|
||||
WIFI_SETTINGS_UI,
|
||||
HOMING_SENSITIVITY_UI,
|
||||
ENCODER_SETTINGS_UI
|
||||
ENCODER_SETTINGS_UI,
|
||||
TOUCH_CALIBRATION_UI
|
||||
} DISP_STATE;
|
||||
|
||||
typedef struct {
|
||||
@@ -377,14 +378,12 @@ typedef enum {
|
||||
level_pos_x4,
|
||||
level_pos_y4,
|
||||
level_pos_x5,
|
||||
level_pos_y5
|
||||
level_pos_y5,
|
||||
#if HAS_BED_PROBE
|
||||
,
|
||||
x_offset,
|
||||
y_offset,
|
||||
z_offset
|
||||
z_offset,
|
||||
#endif
|
||||
,
|
||||
load_length,
|
||||
load_speed,
|
||||
unload_length,
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#include <lv_conf.h>
|
||||
#include "tft_lvgl_configuration.h"
|
||||
|
||||
#if ENABLED(USE_WIFI_FUNCTION)
|
||||
#if ENABLED(MKS_WIFI_MODULE)
|
||||
|
||||
#include "draw_ui.h"
|
||||
|
||||
@@ -73,7 +73,7 @@ void lv_draw_wifi(void) {
|
||||
|
||||
buttonReconnect = lv_imgbtn_create(scr, nullptr);
|
||||
|
||||
lv_obj_set_event_cb_mks(buttonReconnect, event_handler, ID_W_RECONNECT, nullptr, 0);
|
||||
lv_obj_set_event_cb_mks(buttonReconnect, event_handler, ID_W_RECONNECT, "", 0);
|
||||
lv_imgbtn_set_src_both(buttonReconnect, "F:/bmp_wifi.bin");
|
||||
lv_imgbtn_use_label_style(buttonReconnect);
|
||||
|
||||
@@ -159,5 +159,5 @@ void lv_clear_wifi() {
|
||||
lv_obj_del(scr);
|
||||
}
|
||||
|
||||
#endif // USE_WIFI_FUNCTION
|
||||
#endif // MKS_WIFI_MODULE
|
||||
#endif // HAS_TFT_LVGL_UI
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user