diff --git a/.github/workflows/ci-build-tests.yml b/.github/workflows/ci-build-tests.yml index 320cda5b18..f80417c0fe 100644 --- a/.github/workflows/ci-build-tests.yml +++ b/.github/workflows/ci-build-tests.yml @@ -151,6 +151,12 @@ jobs: # HC32 - HC32F460C_aquila_101 + # GD32F3 + - GD32F303RE_creality_mfl + + # GD32F1 + - GD32F103RC_aquila_mfl + # LPC176x - Lengthy tests - LPC1768 - LPC1769 @@ -164,15 +170,20 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + key: ${{ runner.os }}-pip-build-v1 restore-keys: | - ${{ runner.os }}-pip- + ${{ runner.os }}-pip-build- - name: Cache PlatformIO uses: actions/cache@v4 with: - path: ~/.platformio - key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} + path: | + ~/.platformio + .pio/build + .pio/libdeps + key: ${{ runner.os }}-pio-build-v1 + restore-keys: | + ${{ runner.os }}-pio-build- - name: Select Python 3.9 uses: actions/setup-python@v5 diff --git a/.github/workflows/ci-unit-tests.yml b/.github/workflows/ci-unit-tests.yml index 9a311aabc6..30af812dff 100644 --- a/.github/workflows/ci-unit-tests.yml +++ b/.github/workflows/ci-unit-tests.yml @@ -46,15 +46,20 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + key: ${{ runner.os }}-pip-unit-v1 restore-keys: | - ${{ runner.os }}-pip- + ${{ runner.os }}-pip-unit- - name: Cache PlatformIO uses: actions/cache@v4 with: - path: ~/.platformio - key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} + path: | + ~/.platformio + .pio/build + .pio/libdeps + key: ${{ runner.os }}-pio-tests-v1 + restore-keys: | + ${{ runner.os }}-pio-tests- - name: Select Python 3.9 uses: actions/setup-python@v5 diff --git a/.github/workflows/ci-validate-boards.yml b/.github/workflows/ci-validate-boards.yml index baa7b8b6e1..36f3a3522a 100644 --- a/.github/workflows/ci-validate-boards.yml +++ b/.github/workflows/ci-validate-boards.yml @@ -33,9 +33,9 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + key: ${{ runner.os }}-pip-boards-v1 restore-keys: | - ${{ runner.os }}-pip- + ${{ runner.os }}-pip-boards- - name: Select Python 3.9 uses: actions/setup-python@v5 diff --git a/.github/workflows/ci-validate-pins.yml b/.github/workflows/ci-validate-pins.yml index 695f8eff18..ae777427e7 100644 --- a/.github/workflows/ci-validate-pins.yml +++ b/.github/workflows/ci-validate-pins.yml @@ -36,9 +36,9 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + key: ${{ runner.os }}-pip-pins-v1 restore-keys: | - ${{ runner.os }}-pip- + ${{ runner.os }}-pip-pins- - name: Select Python 3.9 uses: actions/setup-python@v5 diff --git a/Makefile b/Makefile index 83b27e566a..23826497b6 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ help: @echo "make tests-all-local-docker : Run all tests locally, using docker" @echo "make unit-test-single-local : Run unit tests for a single config locally" @echo "make unit-test-single-local-docker : Run unit tests for a single config locally, using docker" - @echo "make unit-test-all-local : Run all code tests locally" + @echo "make unit-test-all-local : Run all code tests locally" @echo "make unit-test-all-local-docker : Run all code tests locally, using docker" @echo "make setup-local-docker : Setup local docker using buildx" @echo "" diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 6e16dc5caf..91a3b342b6 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -696,8 +696,9 @@ #define PID_K1 0.95 // Smoothing factor within any PID loop #if ENABLED(PIDTEMP) - //#define MIN_POWER 0 - //#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to toggle activation. + //#define MIN_POWER 0 // Min power to improve PID stability (0..PID_MAX). + // Get the power from the temperature report ('M105' => @:nnn) and try P*2-20 to P*2-10. + //#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to enable/disable. //#define PID_PARAMS_PER_HOTEND // Use separate PID parameters for each extruder (useful for mismatched extruders) // Set/get with G-code: M301 E[extruder number, 0-2] @@ -796,8 +797,9 @@ //#define PIDTEMPBED #if ENABLED(PIDTEMPBED) - //#define MIN_BED_POWER 0 - //#define PID_BED_DEBUG // Print Bed PID debug data to the serial port. + //#define MIN_BED_POWER 0 // Min power to improve PID stability (0..MAX_BED_POWER). + // Get the power from the temperature report ('M105' => B@:nnn) and try P*2-20 to P*2-10. + //#define PID_BED_DEBUG // Print Bed PID debug data to the serial port. Use 'M303 D' to enable/disable. // 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) // from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) @@ -878,12 +880,12 @@ #define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current #if ENABLED(PIDTEMPCHAMBER) - #define MIN_CHAMBER_POWER 0 - //#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port. + //#define MIN_CHAMBER_POWER 0 // Min power to improve PID stability. (0..MAX_CHAMBER_POWER) + // Get the power from the temperature report ('M105' => C@:nnn) and try P*2-20 to P*2-10. + //#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port. Use 'M303 D' to enable/disable. // Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element // and placed inside the small Creality printer enclosure tent. - // #define DEFAULT_chamberKp 37.04 #define DEFAULT_chamberKi 1.40 #define DEFAULT_chamberKd 655.17 @@ -897,7 +899,7 @@ #if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER) //#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay - #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + #define PID_FUNCTIONAL_RANGE 20 // If the temperature difference between the target temperature and the actual temperature // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. //#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of flash) @@ -1025,9 +1027,6 @@ // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). #define PRINTABLE_RADIUS 140.0 // (mm) - // Maximum reachable area - #define DELTA_MAX_RADIUS 140.0 // (mm) - // Center-to-center distance of the holes in the diagonal push rods. #define DELTA_DIAGONAL_ROD 250.0 // (mm) @@ -1540,6 +1539,20 @@ #define PROBE_DEPLOY_FEEDRATE (133*60) // (mm/min) Probe deploy speed #define PROBE_STOW_FEEDRATE (133*60) // (mm/min) Probe stow speed + /** + * Magnetically Mounted Probe with a Servo mechanism + * Probe Deploy and Stow both follow the same basic sequence: + * - Rotate the SERVO to its Deployed angle + * - Perform XYZ moves to deploy or stow the PROBE + * - Rotate the SERVO to its Stowed angle + */ + //#define MAG_MOUNTED_PROBE_SERVO_NR 0 // Servo Number for this probe + #ifdef MAG_MOUNTED_PROBE_SERVO_NR + #define MAG_MOUNTED_PROBE_SERVO_ANGLES { 90, 0 } // Servo Angles for Deployed, Stowed + #define MAG_MOUNTED_PRE_DEPLOY { PROBE_DEPLOY_FEEDRATE, { 15, 160, 30 } } // Safe position for servo activation + #define MAG_MOUNTED_PRE_STOW { PROBE_DEPLOY_FEEDRATE, { 15, 160, 30 } } // Safe position for servo deactivation + #endif + #define MAG_MOUNTED_DEPLOY_1 { PROBE_DEPLOY_FEEDRATE, { 245, 114, 30 } } // Move to side Dock & Attach probe #define MAG_MOUNTED_DEPLOY_2 { PROBE_DEPLOY_FEEDRATE, { 210, 114, 30 } } // Move probe off dock #define MAG_MOUNTED_DEPLOY_3 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed @@ -2263,7 +2276,7 @@ //=========================================================================== #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed - #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_X 3 #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS @@ -3269,7 +3282,7 @@ #endif // -// Touch-screen LCD for Malyan M200/M300 printers +// LCD for Malyan M200/M300 printers // //#define MALYAN_LCD diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7cc54b2a96..73073762f1 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1342,20 +1342,20 @@ //#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..." //#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved" - #define CALIBRATION_FEEDRATE_SLOW 60 // mm/min - #define CALIBRATION_FEEDRATE_FAST 1200 // mm/min - #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/min + #define CALIBRATION_FEEDRATE_SLOW 60 // (mm/min) + #define CALIBRATION_FEEDRATE_FAST 1200 // (mm/min) + #define CALIBRATION_FEEDRATE_TRAVEL 3000 // (mm/min) // The following parameters refer to the conical section of the nozzle tip. - #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm - #define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm + #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // (mm) + #define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // (mm) // Uncomment to enable reporting (required for "G425 V", but consumes flash). //#define CALIBRATION_REPORTING // The true location and dimension the cube/bolt/washer on the bed. - #define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm - #define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm + #define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // (mm) + #define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // (mm) // Comment out any sides which are unreachable by the probe. For best // auto-calibration results, all sides must be reachable. @@ -2268,6 +2268,8 @@ #define ADC_BUTTON_DEBOUNCE_DELAY 16 // (count) Increase if buttons bounce or repeat too fast #endif +//#define FAST_BUTTON_POLLING // Poll buttons at ~1kHz on 8-bit AVR. Set to 'false' for slow polling on 32-bit. + // @section safety /** @@ -2995,6 +2997,8 @@ #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + //#define EDITABLE_HOMING_CURRENT // Add a G-code and menu to modify the Homing Current + /** * Interpolate microsteps to 256 * Override for each driver with _INTERPOLATE settings below @@ -3680,6 +3684,8 @@ #define SPEED_POWER_MIN 5000 // (RPM) #define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM #define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments) + + //#define DEFAULT_ACCELERATION_SPINDLE 1000 // (°/s/s) Default spindle acceleration (speed change with time) #endif #else diff --git a/Marlin/Makefile b/Marlin/Makefile index 63b1029e1b..ce26bd3572 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -127,9 +127,9 @@ NEOPIXEL ?= 0 # on GCC versions: # https://www.avrfreaks.net/comment/1789106#comment-1789106 -CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | cut -f3 -d\ ) -CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d\ ) -CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ ) +CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | cut -f3 -d' ' ) +CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d' ' ) +CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d' ' ) CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) ))) ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1) $(warning This GCC version $(CC_VER) is likely broken. Enabling relocation workaround.) @@ -868,8 +868,8 @@ else ifeq ($(HARDWARE_VARIANT), archim) endif # Add all the source directories as include directories too -CINCS = ${addprefix -I ,${VPATH}} -CXXINCS = ${addprefix -I ,${VPATH}} +CINCS = ${addprefix -I, ${VPATH}} +CXXINCS = ${addprefix -I, ${VPATH}} # Silence warnings for library code (won't work for .h files, unfortunately) LIBWARN = -w -Wno-packed-bitfield-compat diff --git a/Marlin/Version.h b/Marlin/Version.h index a8be38fe31..2260bfc119 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2025-03-17" +//#define STRING_DISTRIBUTION_DATE "2025-04-18" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h index fa479cfe8f..6565acd523 100644 --- a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h +++ b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h @@ -48,92 +48,92 @@ const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = { // PORTLIST // ------------------------ - PE , // PE 0 ** 0 ** USART0_RX - PE , // PE 1 ** 1 ** USART0_TX - PE , // PE 4 ** 2 ** PWM2 - PE , // PE 5 ** 3 ** PWM3 - PG , // PG 5 ** 4 ** PWM4 - PE , // PE 3 ** 5 ** PWM5 - PH , // PH 3 ** 6 ** PWM6 - PH , // PH 4 ** 7 ** PWM7 - PH , // PH 5 ** 8 ** PWM8 - PH , // PH 6 ** 9 ** PWM9 - PB , // PB 4 ** 10 ** PWM10 - PB , // PB 5 ** 11 ** PWM11 - PB , // PB 6 ** 12 ** PWM12 - PB , // PB 7 ** 13 ** PWM13 - PJ , // PJ 1 ** 14 ** USART3_TX - PJ , // PJ 0 ** 15 ** USART3_RX - PH , // PH 1 ** 16 ** USART2_TX - PH , // PH 0 ** 17 ** USART2_RX - PD , // PD 3 ** 18 ** USART1_TX - PD , // PD 2 ** 19 ** USART1_RX - PD , // PD 1 ** 20 ** I2C_SDA - PD , // PD 0 ** 21 ** I2C_SCL - PA , // PA 0 ** 22 ** D22 - PA , // PA 1 ** 23 ** D23 - PA , // PA 2 ** 24 ** D24 - PA , // PA 3 ** 25 ** D25 - PA , // PA 4 ** 26 ** D26 - PA , // PA 5 ** 27 ** D27 - PA , // PA 6 ** 28 ** D28 - PA , // PA 7 ** 29 ** D29 - PC , // PC 7 ** 30 ** D30 - PC , // PC 6 ** 31 ** D31 - PC , // PC 5 ** 32 ** D32 - PC , // PC 4 ** 33 ** D33 - PC , // PC 3 ** 34 ** D34 - PC , // PC 2 ** 35 ** D35 - PC , // PC 1 ** 36 ** D36 - PC , // PC 0 ** 37 ** D37 - PD , // PD 7 ** 38 ** D38 - PG , // PG 2 ** 39 ** D39 - PG , // PG 1 ** 40 ** D40 - PG , // PG 0 ** 41 ** D41 - PL , // PL 7 ** 42 ** D42 - PL , // PL 6 ** 43 ** D43 - PL , // PL 5 ** 44 ** D44 - PL , // PL 4 ** 45 ** D45 - PL , // PL 3 ** 46 ** D46 - PL , // PL 2 ** 47 ** D47 - PL , // PL 1 ** 48 ** D48 - PL , // PL 0 ** 49 ** D49 - PB , // PB 3 ** 50 ** SPI_MISO - PB , // PB 2 ** 51 ** SPI_MOSI - PB , // PB 1 ** 52 ** SPI_SCK - PB , // PB 0 ** 53 ** SPI_SS - PF , // PF 0 ** 54 ** A0 - PF , // PF 1 ** 55 ** A1 - PF , // PF 2 ** 56 ** A2 - PF , // PF 3 ** 57 ** A3 - PF , // PF 4 ** 58 ** A4 - PF , // PF 5 ** 59 ** A5 - PF , // PF 6 ** 60 ** A6 - PF , // PF 7 ** 61 ** A7 - PK , // PK 0 ** 62 ** A8 - PK , // PK 1 ** 63 ** A9 - PK , // PK 2 ** 64 ** A10 - PK , // PK 3 ** 65 ** A11 - PK , // PK 4 ** 66 ** A12 - PK , // PK 5 ** 67 ** A13 - PK , // PK 6 ** 68 ** A14 - PK , // PK 7 ** 69 ** A15 - PG , // PG 4 ** 70 ** - PG , // PG 3 ** 71 ** - PJ , // PJ 2 ** 72 ** - PJ , // PJ 3 ** 73 ** - PJ , // PJ 7 ** 74 ** - PJ , // PJ 4 ** 75 ** - PJ , // PJ 5 ** 76 ** - PJ , // PJ 6 ** 77 ** - PE , // PE 2 ** 78 ** - PE , // PE 6 ** 79 ** - PE , // PE 7 ** 80 ** - PD , // PD 4 ** 81 ** - PD , // PD 5 ** 82 ** - PD , // PD 6 ** 83 ** - PH , // PH 2 ** 84 ** - PH , // PH 7 ** 85 ** + PE, // PE 0 ** 0 ** USART0_RX + PE, // PE 1 ** 1 ** USART0_TX + PE, // PE 4 ** 2 ** PWM2 + PE, // PE 5 ** 3 ** PWM3 + PG, // PG 5 ** 4 ** PWM4 + PE, // PE 3 ** 5 ** PWM5 + PH, // PH 3 ** 6 ** PWM6 + PH, // PH 4 ** 7 ** PWM7 + PH, // PH 5 ** 8 ** PWM8 + PH, // PH 6 ** 9 ** PWM9 + PB, // PB 4 ** 10 ** PWM10 + PB, // PB 5 ** 11 ** PWM11 + PB, // PB 6 ** 12 ** PWM12 + PB, // PB 7 ** 13 ** PWM13 + PJ, // PJ 1 ** 14 ** USART3_TX + PJ, // PJ 0 ** 15 ** USART3_RX + PH, // PH 1 ** 16 ** USART2_TX + PH, // PH 0 ** 17 ** USART2_RX + PD, // PD 3 ** 18 ** USART1_TX + PD, // PD 2 ** 19 ** USART1_RX + PD, // PD 1 ** 20 ** I2C_SDA + PD, // PD 0 ** 21 ** I2C_SCL + PA, // PA 0 ** 22 ** D22 + PA, // PA 1 ** 23 ** D23 + PA, // PA 2 ** 24 ** D24 + PA, // PA 3 ** 25 ** D25 + PA, // PA 4 ** 26 ** D26 + PA, // PA 5 ** 27 ** D27 + PA, // PA 6 ** 28 ** D28 + PA, // PA 7 ** 29 ** D29 + PC, // PC 7 ** 30 ** D30 + PC, // PC 6 ** 31 ** D31 + PC, // PC 5 ** 32 ** D32 + PC, // PC 4 ** 33 ** D33 + PC, // PC 3 ** 34 ** D34 + PC, // PC 2 ** 35 ** D35 + PC, // PC 1 ** 36 ** D36 + PC, // PC 0 ** 37 ** D37 + PD, // PD 7 ** 38 ** D38 + PG, // PG 2 ** 39 ** D39 + PG, // PG 1 ** 40 ** D40 + PG, // PG 0 ** 41 ** D41 + PL, // PL 7 ** 42 ** D42 + PL, // PL 6 ** 43 ** D43 + PL, // PL 5 ** 44 ** D44 + PL, // PL 4 ** 45 ** D45 + PL, // PL 3 ** 46 ** D46 + PL, // PL 2 ** 47 ** D47 + PL, // PL 1 ** 48 ** D48 + PL, // PL 0 ** 49 ** D49 + PB, // PB 3 ** 50 ** SPI_MISO + PB, // PB 2 ** 51 ** SPI_MOSI + PB, // PB 1 ** 52 ** SPI_SCK + PB, // PB 0 ** 53 ** SPI_SS + PF, // PF 0 ** 54 ** A0 + PF, // PF 1 ** 55 ** A1 + PF, // PF 2 ** 56 ** A2 + PF, // PF 3 ** 57 ** A3 + PF, // PF 4 ** 58 ** A4 + PF, // PF 5 ** 59 ** A5 + PF, // PF 6 ** 60 ** A6 + PF, // PF 7 ** 61 ** A7 + PK, // PK 0 ** 62 ** A8 + PK, // PK 1 ** 63 ** A9 + PK, // PK 2 ** 64 ** A10 + PK, // PK 3 ** 65 ** A11 + PK, // PK 4 ** 66 ** A12 + PK, // PK 5 ** 67 ** A13 + PK, // PK 6 ** 68 ** A14 + PK, // PK 7 ** 69 ** A15 + PG, // PG 4 ** 70 ** + PG, // PG 3 ** 71 ** + PJ, // PJ 2 ** 72 ** + PJ, // PJ 3 ** 73 ** + PJ, // PJ 7 ** 74 ** + PJ, // PJ 4 ** 75 ** + PJ, // PJ 5 ** 76 ** + PJ, // PJ 6 ** 77 ** + PE, // PE 2 ** 78 ** + PE, // PE 6 ** 79 ** + PE, // PE 7 ** 80 ** + PD, // PD 4 ** 81 ** + PD, // PD 5 ** 82 ** + PD, // PD 6 ** 83 ** + PH, // PH 2 ** 84 ** + PH, // PH 7 ** 85 ** }; #define digitalPinToPort_plus_70(P) ( pgm_read_byte( digital_pin_to_port_PGM_plus_70 + (P) ) ) @@ -141,92 +141,92 @@ const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = { const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = { // PIN IN PORT // ------------------------ - _BV( 0 ) , // PE 0 ** 0 ** USART0_RX - _BV( 1 ) , // PE 1 ** 1 ** USART0_TX - _BV( 4 ) , // PE 4 ** 2 ** PWM2 - _BV( 5 ) , // PE 5 ** 3 ** PWM3 - _BV( 5 ) , // PG 5 ** 4 ** PWM4 - _BV( 3 ) , // PE 3 ** 5 ** PWM5 - _BV( 3 ) , // PH 3 ** 6 ** PWM6 - _BV( 4 ) , // PH 4 ** 7 ** PWM7 - _BV( 5 ) , // PH 5 ** 8 ** PWM8 - _BV( 6 ) , // PH 6 ** 9 ** PWM9 - _BV( 4 ) , // PB 4 ** 10 ** PWM10 - _BV( 5 ) , // PB 5 ** 11 ** PWM11 - _BV( 6 ) , // PB 6 ** 12 ** PWM12 - _BV( 7 ) , // PB 7 ** 13 ** PWM13 - _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX - _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX - _BV( 1 ) , // PH 1 ** 16 ** USART2_TX - _BV( 0 ) , // PH 0 ** 17 ** USART2_RX - _BV( 3 ) , // PD 3 ** 18 ** USART1_TX - _BV( 2 ) , // PD 2 ** 19 ** USART1_RX - _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA - _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL - _BV( 0 ) , // PA 0 ** 22 ** D22 - _BV( 1 ) , // PA 1 ** 23 ** D23 - _BV( 2 ) , // PA 2 ** 24 ** D24 - _BV( 3 ) , // PA 3 ** 25 ** D25 - _BV( 4 ) , // PA 4 ** 26 ** D26 - _BV( 5 ) , // PA 5 ** 27 ** D27 - _BV( 6 ) , // PA 6 ** 28 ** D28 - _BV( 7 ) , // PA 7 ** 29 ** D29 - _BV( 7 ) , // PC 7 ** 30 ** D30 - _BV( 6 ) , // PC 6 ** 31 ** D31 - _BV( 5 ) , // PC 5 ** 32 ** D32 - _BV( 4 ) , // PC 4 ** 33 ** D33 - _BV( 3 ) , // PC 3 ** 34 ** D34 - _BV( 2 ) , // PC 2 ** 35 ** D35 - _BV( 1 ) , // PC 1 ** 36 ** D36 - _BV( 0 ) , // PC 0 ** 37 ** D37 - _BV( 7 ) , // PD 7 ** 38 ** D38 - _BV( 2 ) , // PG 2 ** 39 ** D39 - _BV( 1 ) , // PG 1 ** 40 ** D40 - _BV( 0 ) , // PG 0 ** 41 ** D41 - _BV( 7 ) , // PL 7 ** 42 ** D42 - _BV( 6 ) , // PL 6 ** 43 ** D43 - _BV( 5 ) , // PL 5 ** 44 ** D44 - _BV( 4 ) , // PL 4 ** 45 ** D45 - _BV( 3 ) , // PL 3 ** 46 ** D46 - _BV( 2 ) , // PL 2 ** 47 ** D47 - _BV( 1 ) , // PL 1 ** 48 ** D48 - _BV( 0 ) , // PL 0 ** 49 ** D49 - _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO - _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI - _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK - _BV( 0 ) , // PB 0 ** 53 ** SPI_SS - _BV( 0 ) , // PF 0 ** 54 ** A0 - _BV( 1 ) , // PF 1 ** 55 ** A1 - _BV( 2 ) , // PF 2 ** 56 ** A2 - _BV( 3 ) , // PF 3 ** 57 ** A3 - _BV( 4 ) , // PF 4 ** 58 ** A4 - _BV( 5 ) , // PF 5 ** 59 ** A5 - _BV( 6 ) , // PF 6 ** 60 ** A6 - _BV( 7 ) , // PF 7 ** 61 ** A7 - _BV( 0 ) , // PK 0 ** 62 ** A8 - _BV( 1 ) , // PK 1 ** 63 ** A9 - _BV( 2 ) , // PK 2 ** 64 ** A10 - _BV( 3 ) , // PK 3 ** 65 ** A11 - _BV( 4 ) , // PK 4 ** 66 ** A12 - _BV( 5 ) , // PK 5 ** 67 ** A13 - _BV( 6 ) , // PK 6 ** 68 ** A14 - _BV( 7 ) , // PK 7 ** 69 ** A15 - _BV( 4 ) , // PG 4 ** 70 ** - _BV( 3 ) , // PG 3 ** 71 ** - _BV( 2 ) , // PJ 2 ** 72 ** - _BV( 3 ) , // PJ 3 ** 73 ** - _BV( 7 ) , // PJ 7 ** 74 ** - _BV( 4 ) , // PJ 4 ** 75 ** - _BV( 5 ) , // PJ 5 ** 76 ** - _BV( 6 ) , // PJ 6 ** 77 ** - _BV( 2 ) , // PE 2 ** 78 ** - _BV( 6 ) , // PE 6 ** 79 ** - _BV( 7 ) , // PE 7 ** 80 ** - _BV( 4 ) , // PD 4 ** 81 ** - _BV( 5 ) , // PD 5 ** 82 ** - _BV( 6 ) , // PD 6 ** 83 ** - _BV( 2 ) , // PH 2 ** 84 ** - _BV( 7 ) , // PH 7 ** 85 ** + _BV( 0 ), // PE 0 ** 0 ** USART0_RX + _BV( 1 ), // PE 1 ** 1 ** USART0_TX + _BV( 4 ), // PE 4 ** 2 ** PWM2 + _BV( 5 ), // PE 5 ** 3 ** PWM3 + _BV( 5 ), // PG 5 ** 4 ** PWM4 + _BV( 3 ), // PE 3 ** 5 ** PWM5 + _BV( 3 ), // PH 3 ** 6 ** PWM6 + _BV( 4 ), // PH 4 ** 7 ** PWM7 + _BV( 5 ), // PH 5 ** 8 ** PWM8 + _BV( 6 ), // PH 6 ** 9 ** PWM9 + _BV( 4 ), // PB 4 ** 10 ** PWM10 + _BV( 5 ), // PB 5 ** 11 ** PWM11 + _BV( 6 ), // PB 6 ** 12 ** PWM12 + _BV( 7 ), // PB 7 ** 13 ** PWM13 + _BV( 1 ), // PJ 1 ** 14 ** USART3_TX + _BV( 0 ), // PJ 0 ** 15 ** USART3_RX + _BV( 1 ), // PH 1 ** 16 ** USART2_TX + _BV( 0 ), // PH 0 ** 17 ** USART2_RX + _BV( 3 ), // PD 3 ** 18 ** USART1_TX + _BV( 2 ), // PD 2 ** 19 ** USART1_RX + _BV( 1 ), // PD 1 ** 20 ** I2C_SDA + _BV( 0 ), // PD 0 ** 21 ** I2C_SCL + _BV( 0 ), // PA 0 ** 22 ** D22 + _BV( 1 ), // PA 1 ** 23 ** D23 + _BV( 2 ), // PA 2 ** 24 ** D24 + _BV( 3 ), // PA 3 ** 25 ** D25 + _BV( 4 ), // PA 4 ** 26 ** D26 + _BV( 5 ), // PA 5 ** 27 ** D27 + _BV( 6 ), // PA 6 ** 28 ** D28 + _BV( 7 ), // PA 7 ** 29 ** D29 + _BV( 7 ), // PC 7 ** 30 ** D30 + _BV( 6 ), // PC 6 ** 31 ** D31 + _BV( 5 ), // PC 5 ** 32 ** D32 + _BV( 4 ), // PC 4 ** 33 ** D33 + _BV( 3 ), // PC 3 ** 34 ** D34 + _BV( 2 ), // PC 2 ** 35 ** D35 + _BV( 1 ), // PC 1 ** 36 ** D36 + _BV( 0 ), // PC 0 ** 37 ** D37 + _BV( 7 ), // PD 7 ** 38 ** D38 + _BV( 2 ), // PG 2 ** 39 ** D39 + _BV( 1 ), // PG 1 ** 40 ** D40 + _BV( 0 ), // PG 0 ** 41 ** D41 + _BV( 7 ), // PL 7 ** 42 ** D42 + _BV( 6 ), // PL 6 ** 43 ** D43 + _BV( 5 ), // PL 5 ** 44 ** D44 + _BV( 4 ), // PL 4 ** 45 ** D45 + _BV( 3 ), // PL 3 ** 46 ** D46 + _BV( 2 ), // PL 2 ** 47 ** D47 + _BV( 1 ), // PL 1 ** 48 ** D48 + _BV( 0 ), // PL 0 ** 49 ** D49 + _BV( 3 ), // PB 3 ** 50 ** SPI_MISO + _BV( 2 ), // PB 2 ** 51 ** SPI_MOSI + _BV( 1 ), // PB 1 ** 52 ** SPI_SCK + _BV( 0 ), // PB 0 ** 53 ** SPI_SS + _BV( 0 ), // PF 0 ** 54 ** A0 + _BV( 1 ), // PF 1 ** 55 ** A1 + _BV( 2 ), // PF 2 ** 56 ** A2 + _BV( 3 ), // PF 3 ** 57 ** A3 + _BV( 4 ), // PF 4 ** 58 ** A4 + _BV( 5 ), // PF 5 ** 59 ** A5 + _BV( 6 ), // PF 6 ** 60 ** A6 + _BV( 7 ), // PF 7 ** 61 ** A7 + _BV( 0 ), // PK 0 ** 62 ** A8 + _BV( 1 ), // PK 1 ** 63 ** A9 + _BV( 2 ), // PK 2 ** 64 ** A10 + _BV( 3 ), // PK 3 ** 65 ** A11 + _BV( 4 ), // PK 4 ** 66 ** A12 + _BV( 5 ), // PK 5 ** 67 ** A13 + _BV( 6 ), // PK 6 ** 68 ** A14 + _BV( 7 ), // PK 7 ** 69 ** A15 + _BV( 4 ), // PG 4 ** 70 ** + _BV( 3 ), // PG 3 ** 71 ** + _BV( 2 ), // PJ 2 ** 72 ** + _BV( 3 ), // PJ 3 ** 73 ** + _BV( 7 ), // PJ 7 ** 74 ** + _BV( 4 ), // PJ 4 ** 75 ** + _BV( 5 ), // PJ 5 ** 76 ** + _BV( 6 ), // PJ 6 ** 77 ** + _BV( 2 ), // PE 2 ** 78 ** + _BV( 6 ), // PE 6 ** 79 ** + _BV( 7 ), // PE 7 ** 80 ** + _BV( 4 ), // PD 4 ** 81 ** + _BV( 5 ), // PD 5 ** 82 ** + _BV( 6 ), // PD 6 ** 83 ** + _BV( 2 ), // PH 2 ** 84 ** + _BV( 7 ), // PH 7 ** 85 ** }; #define digitalPinToBitMask_plus_70(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM_plus_70 + (P) ) ) @@ -234,86 +234,86 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = { const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = { // TIMERS // ------------------------ - NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX - NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX - TIMER3B , // PE 4 ** 2 ** PWM2 - TIMER3C , // PE 5 ** 3 ** PWM3 - TIMER0B , // PG 5 ** 4 ** PWM4 - TIMER3A , // PE 3 ** 5 ** PWM5 - TIMER4A , // PH 3 ** 6 ** PWM6 - TIMER4B , // PH 4 ** 7 ** PWM7 - TIMER4C , // PH 5 ** 8 ** PWM8 - TIMER2B , // PH 6 ** 9 ** PWM9 - TIMER2A , // PB 4 ** 10 ** PWM10 - TIMER1A , // PB 5 ** 11 ** PWM11 - TIMER1B , // PB 6 ** 12 ** PWM12 - TIMER0A , // PB 7 ** 13 ** PWM13 - NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX - NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX - NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX - NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX - NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX - NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX - NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA - NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL - NOT_ON_TIMER , // PA 0 ** 22 ** D22 - NOT_ON_TIMER , // PA 1 ** 23 ** D23 - NOT_ON_TIMER , // PA 2 ** 24 ** D24 - NOT_ON_TIMER , // PA 3 ** 25 ** D25 - NOT_ON_TIMER , // PA 4 ** 26 ** D26 - NOT_ON_TIMER , // PA 5 ** 27 ** D27 - NOT_ON_TIMER , // PA 6 ** 28 ** D28 - NOT_ON_TIMER , // PA 7 ** 29 ** D29 - NOT_ON_TIMER , // PC 7 ** 30 ** D30 - NOT_ON_TIMER , // PC 6 ** 31 ** D31 - NOT_ON_TIMER , // PC 5 ** 32 ** D32 - NOT_ON_TIMER , // PC 4 ** 33 ** D33 - NOT_ON_TIMER , // PC 3 ** 34 ** D34 - NOT_ON_TIMER , // PC 2 ** 35 ** D35 - NOT_ON_TIMER , // PC 1 ** 36 ** D36 - NOT_ON_TIMER , // PC 0 ** 37 ** D37 - NOT_ON_TIMER , // PD 7 ** 38 ** D38 - NOT_ON_TIMER , // PG 2 ** 39 ** D39 - NOT_ON_TIMER , // PG 1 ** 40 ** D40 - NOT_ON_TIMER , // PG 0 ** 41 ** D41 - NOT_ON_TIMER , // PL 7 ** 42 ** D42 - NOT_ON_TIMER , // PL 6 ** 43 ** D43 - TIMER5C , // PL 5 ** 44 ** D44 - TIMER5B , // PL 4 ** 45 ** D45 - TIMER5A , // PL 3 ** 46 ** D46 - NOT_ON_TIMER , // PL 2 ** 47 ** D47 - NOT_ON_TIMER , // PL 1 ** 48 ** D48 - NOT_ON_TIMER , // PL 0 ** 49 ** D49 - NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO - NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI - NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK - NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS - NOT_ON_TIMER , // PF 0 ** 54 ** A0 - NOT_ON_TIMER , // PF 1 ** 55 ** A1 - NOT_ON_TIMER , // PF 2 ** 56 ** A2 - NOT_ON_TIMER , // PF 3 ** 57 ** A3 - NOT_ON_TIMER , // PF 4 ** 58 ** A4 - NOT_ON_TIMER , // PF 5 ** 59 ** A5 - NOT_ON_TIMER , // PF 6 ** 60 ** A6 - NOT_ON_TIMER , // PF 7 ** 61 ** A7 - NOT_ON_TIMER , // PK 0 ** 62 ** A8 - NOT_ON_TIMER , // PK 1 ** 63 ** A9 - NOT_ON_TIMER , // PK 2 ** 64 ** A10 - NOT_ON_TIMER , // PK 3 ** 65 ** A11 - NOT_ON_TIMER , // PK 4 ** 66 ** A12 - NOT_ON_TIMER , // PK 5 ** 67 ** A13 - NOT_ON_TIMER , // PK 6 ** 68 ** A14 - NOT_ON_TIMER , // PK 7 ** 69 ** A15 - NOT_ON_TIMER , // PG 4 ** 70 ** - NOT_ON_TIMER , // PG 3 ** 71 ** - NOT_ON_TIMER , // PJ 2 ** 72 ** - NOT_ON_TIMER , // PJ 3 ** 73 ** - NOT_ON_TIMER , // PJ 7 ** 74 ** - NOT_ON_TIMER , // PJ 4 ** 75 ** - NOT_ON_TIMER , // PJ 5 ** 76 ** - NOT_ON_TIMER , // PJ 6 ** 77 ** - NOT_ON_TIMER , // PE 2 ** 78 ** - NOT_ON_TIMER , // PE 6 ** 79 ** + NOT_ON_TIMER, // PE 0 ** 0 ** USART0_RX + NOT_ON_TIMER, // PE 1 ** 1 ** USART0_TX + TIMER3B, // PE 4 ** 2 ** PWM2 + TIMER3C, // PE 5 ** 3 ** PWM3 + TIMER0B, // PG 5 ** 4 ** PWM4 + TIMER3A, // PE 3 ** 5 ** PWM5 + TIMER4A, // PH 3 ** 6 ** PWM6 + TIMER4B, // PH 4 ** 7 ** PWM7 + TIMER4C, // PH 5 ** 8 ** PWM8 + TIMER2B, // PH 6 ** 9 ** PWM9 + TIMER2A, // PB 4 ** 10 ** PWM10 + TIMER1A, // PB 5 ** 11 ** PWM11 + TIMER1B, // PB 6 ** 12 ** PWM12 + TIMER0A, // PB 7 ** 13 ** PWM13 + NOT_ON_TIMER, // PJ 1 ** 14 ** USART3_TX + NOT_ON_TIMER, // PJ 0 ** 15 ** USART3_RX + NOT_ON_TIMER, // PH 1 ** 16 ** USART2_TX + NOT_ON_TIMER, // PH 0 ** 17 ** USART2_RX + NOT_ON_TIMER, // PD 3 ** 18 ** USART1_TX + NOT_ON_TIMER, // PD 2 ** 19 ** USART1_RX + NOT_ON_TIMER, // PD 1 ** 20 ** I2C_SDA + NOT_ON_TIMER, // PD 0 ** 21 ** I2C_SCL + NOT_ON_TIMER, // PA 0 ** 22 ** D22 + NOT_ON_TIMER, // PA 1 ** 23 ** D23 + NOT_ON_TIMER, // PA 2 ** 24 ** D24 + NOT_ON_TIMER, // PA 3 ** 25 ** D25 + NOT_ON_TIMER, // PA 4 ** 26 ** D26 + NOT_ON_TIMER, // PA 5 ** 27 ** D27 + NOT_ON_TIMER, // PA 6 ** 28 ** D28 + NOT_ON_TIMER, // PA 7 ** 29 ** D29 + NOT_ON_TIMER, // PC 7 ** 30 ** D30 + NOT_ON_TIMER, // PC 6 ** 31 ** D31 + NOT_ON_TIMER, // PC 5 ** 32 ** D32 + NOT_ON_TIMER, // PC 4 ** 33 ** D33 + NOT_ON_TIMER, // PC 3 ** 34 ** D34 + NOT_ON_TIMER, // PC 2 ** 35 ** D35 + NOT_ON_TIMER, // PC 1 ** 36 ** D36 + NOT_ON_TIMER, // PC 0 ** 37 ** D37 + NOT_ON_TIMER, // PD 7 ** 38 ** D38 + NOT_ON_TIMER, // PG 2 ** 39 ** D39 + NOT_ON_TIMER, // PG 1 ** 40 ** D40 + NOT_ON_TIMER, // PG 0 ** 41 ** D41 + NOT_ON_TIMER, // PL 7 ** 42 ** D42 + NOT_ON_TIMER, // PL 6 ** 43 ** D43 + TIMER5C, // PL 5 ** 44 ** D44 + TIMER5B, // PL 4 ** 45 ** D45 + TIMER5A, // PL 3 ** 46 ** D46 + NOT_ON_TIMER, // PL 2 ** 47 ** D47 + NOT_ON_TIMER, // PL 1 ** 48 ** D48 + NOT_ON_TIMER, // PL 0 ** 49 ** D49 + NOT_ON_TIMER, // PB 3 ** 50 ** SPI_MISO + NOT_ON_TIMER, // PB 2 ** 51 ** SPI_MOSI + NOT_ON_TIMER, // PB 1 ** 52 ** SPI_SCK + NOT_ON_TIMER, // PB 0 ** 53 ** SPI_SS + NOT_ON_TIMER, // PF 0 ** 54 ** A0 + NOT_ON_TIMER, // PF 1 ** 55 ** A1 + NOT_ON_TIMER, // PF 2 ** 56 ** A2 + NOT_ON_TIMER, // PF 3 ** 57 ** A3 + NOT_ON_TIMER, // PF 4 ** 58 ** A4 + NOT_ON_TIMER, // PF 5 ** 59 ** A5 + NOT_ON_TIMER, // PF 6 ** 60 ** A6 + NOT_ON_TIMER, // PF 7 ** 61 ** A7 + NOT_ON_TIMER, // PK 0 ** 62 ** A8 + NOT_ON_TIMER, // PK 1 ** 63 ** A9 + NOT_ON_TIMER, // PK 2 ** 64 ** A10 + NOT_ON_TIMER, // PK 3 ** 65 ** A11 + NOT_ON_TIMER, // PK 4 ** 66 ** A12 + NOT_ON_TIMER, // PK 5 ** 67 ** A13 + NOT_ON_TIMER, // PK 6 ** 68 ** A14 + NOT_ON_TIMER, // PK 7 ** 69 ** A15 + NOT_ON_TIMER, // PG 4 ** 70 ** + NOT_ON_TIMER, // PG 3 ** 71 ** + NOT_ON_TIMER, // PJ 2 ** 72 ** + NOT_ON_TIMER, // PJ 3 ** 73 ** + NOT_ON_TIMER, // PJ 7 ** 74 ** + NOT_ON_TIMER, // PJ 4 ** 75 ** + NOT_ON_TIMER, // PJ 5 ** 76 ** + NOT_ON_TIMER, // PJ 6 ** 77 ** + NOT_ON_TIMER, // PE 2 ** 78 ** + NOT_ON_TIMER, // PE 6 ** 79 ** }; #define digitalPinToTimer_plus_70(P) ( pgm_read_byte( digital_pin_to_timer_PGM_plus_70 + (P) ) ) diff --git a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp b/Marlin/src/HAL/AVR/u8g/u8g_com_HAL_AVR_sw_spi.cpp similarity index 98% rename from Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp rename to Marlin/src/HAL/AVR/u8g/u8g_com_HAL_AVR_sw_spi.cpp index 9617c9544d..f4fa1eb428 100644 --- a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp +++ b/Marlin/src/HAL/AVR/u8g/u8g_com_HAL_AVR_sw_spi.cpp @@ -55,12 +55,12 @@ #if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM) -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if HAS_MARLINUI_U8GLIB -#include "../shared/Marduino.h" -#include "../shared/Delay.h" +#include "../../shared/Marduino.h" +#include "../../shared/Delay.h" #include diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp index 5bbc4223bb..e44549357e 100644 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -208,8 +208,8 @@ A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */ - : [bin]"+r"(bin), - [work]"+r"(work) + : [bin]"+r"( bin ), + [work]"+r"( work ) : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), [sck_mask]"r"( SCK_MASK ), [sck_port]"r"( SCK_PORT_PLUS30 ) @@ -350,7 +350,7 @@ static void spiRxBlock0(uint8_t *ptr, uint32_t todo) { uint32_t bin = 0; uint32_t work = 0; - uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */ + uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS(((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */ uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */ uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN); @@ -412,10 +412,10 @@ A("strb.w %[bin], [%[ptr]], #1") /* Store read value into buffer, increment buffer pointer */ A("bne.n loop%=") /* Repeat until done */ - : [ptr]"+r"(ptr), - [todo]"+r"(todo), - [bin]"+r"(bin), - [work]"+r"(work) + : [ptr]"+r"( ptr ), + [todo]"+r"( todo ), + [bin]"+r"( bin ), + [work]"+r"( work ) : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), [sck_mask]"r"( SCK_MASK ), [sck_port]"r"( SCK_PORT_PLUS30 ) diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp index 5cf86f147c..403e3356e1 100644 --- a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp +++ b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp @@ -56,16 +56,12 @@ #else #define G2_PWM_Y 0 #endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) +#if HAS_MOTOR_CURRENT_PWM_Z #define G2_PWM_Z 1 #else #define G2_PWM_Z 0 #endif -#if HAS_MOTOR_CURRENT_PWM_E - #define G2_PWM_E 1 -#else - #define G2_PWM_E 0 -#endif +#define G2_PWM_E HAS_MOTOR_CURRENT_PWM_E #define G2_MASK_X(V) (G2_PWM_X * (V)) #define G2_MASK_Y(V) (G2_PWM_Y * (V)) #define G2_MASK_Z(V) (G2_PWM_Z * (V)) @@ -80,17 +76,22 @@ PWM_map ISR_table[NUM_PWMS] = PWM_MAP_INIT; void Stepper::digipot_init() { - #if PIN_EXISTS(MOTOR_CURRENT_PWM_X) - OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, 0); // init pins + #if G2_PWM_X + OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, LOW); // init pins #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) - OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, 0); + #if G2_PWM_Y + OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, LOW); #endif #if G2_PWM_Z - OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, 0); + OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, LOW); #endif #if G2_PWM_E - OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, 0); + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, LOW); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E0) + OUT_WRITE(MOTOR_CURRENT_PWM_E0_PIN, LOW); + #endif #endif #define WPKEY (0x50574D << 8) // “PWM” in ASCII diff --git a/Marlin/src/HAL/ESP32/i2s.cpp b/Marlin/src/HAL/ESP32/i2s.cpp index 4b17db3daf..6aeeb0e3dc 100644 --- a/Marlin/src/HAL/ESP32/i2s.cpp +++ b/Marlin/src/HAL/ESP32/i2s.cpp @@ -145,7 +145,7 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) { void stepperTask(void *parameter) { uint32_t nextMainISR = 0; #if ENABLED(LIN_ADVANCE) - uint32_t nextAdvanceISR = Stepper::LA_ADV_NEVER; + uint32_t nextAdvanceISR = stepper.LA_ADV_NEVER; #endif for (;;) { @@ -167,13 +167,13 @@ void stepperTask(void *parameter) { if (!using_ftMotion) { if (!nextMainISR) { - Stepper::pulse_phase_isr(); - nextMainISR = Stepper::block_phase_isr(); + stepper.pulse_phase_isr(); + nextMainISR = stepper.block_phase_isr(); } #if ENABLED(LIN_ADVANCE) else if (!nextAdvanceISR) { - Stepper::advance_isr(); - nextAdvanceISR = Stepper::la_interval; + stepper.advance_isr(); + nextAdvanceISR = stepper.la_interval; } #endif else @@ -182,10 +182,10 @@ void stepperTask(void *parameter) { nextMainISR--; #if ENABLED(LIN_ADVANCE) - if (nextAdvanceISR == Stepper::LA_ADV_NEVER) - nextAdvanceISR = Stepper::la_interval; + if (nextAdvanceISR == stepper.LA_ADV_NEVER) + nextAdvanceISR = stepper.la_interval; - if (nextAdvanceISR && nextAdvanceISR != Stepper::LA_ADV_NEVER) + if (nextAdvanceISR && nextAdvanceISR != stepper.LA_ADV_NEVER) nextAdvanceISR--; #endif } diff --git a/Marlin/src/HAL/GD32_MFL/HAL.cpp b/Marlin/src/HAL/GD32_MFL/HAL.cpp new file mode 100644 index 0000000000..460ed52297 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/HAL.cpp @@ -0,0 +1,120 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +uint16_t MarlinHAL::adc_result; + +#if ENABLED(POSTMORTEM_DEBUGGING) + extern void install_min_serial(); +#endif + +#if ENABLED(MARLIN_DEV_MODE) + // Dump the clock frequencies of the system, AHB, APB1, APB2, and F_CPU. + static inline void HAL_clock_frequencies_dump() { + auto& rcuInstance = rcu::RCU::get_instance(); + uint32_t freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_SYS); + SERIAL_ECHOPGM("\nSYSTEM_CLOCK=", freq); + freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_AHB); + SERIAL_ECHOPGM("\nABH_CLOCK=", freq); + freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_APB1); + SERIAL_ECHOPGM("\nAPB1_CLOCK=", freq); + freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_APB2); + SERIAL_ECHOPGM("\nAPB2_CLOCK=", freq, + "\nF_CPU=", F_CPU); + // Done + SERIAL_ECHOPGM("\n--\n"); + } +#endif // MARLIN_DEV_MODE + +// Initializes the Marlin HAL +void MarlinHAL::init() { + constexpr unsigned int cpuFreq = F_CPU; + UNUSED(cpuFreq); + +#if PIN_EXISTS(LED) + OUT_WRITE(LED_PIN, LOW); +#endif + + SetTimerInterruptPriorities(); + + // Print clock frequencies to host serial + TERN_(MARLIN_DEV_MODE, HAL_clock_frequencies_dump()); + + // Register min serial + TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); +} + +// Returns the reset source based on the flags set in the RCU module +uint8_t MarlinHAL::get_reset_source() { + return + (RCU_I.get_flag(rcu::Status_Flags::FLAG_FWDGTRST)) ? RST_WATCHDOG : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_SWRST)) ? RST_SOFTWARE : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_EPRST)) ? RST_EXTERNAL : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_PORRST)) ? RST_POWER_ON : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_LPRST)) ? RST_BROWN_OUT : + 0; +} + +// Returns the amount of free memory available in bytes +int MarlinHAL::freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +// Watchdog Timer +#if ENABLED(USE_WATCHDOG) + #define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout + + #include + + FWatchdogTimer& watchdogTimer = FWatchdogTimer::get_instance(); + + // Initializes the watchdog timer + void MarlinHAL::watchdog_init() { + IF_DISABLED(DISABLE_WATCHDOG_INIT, watchdogTimer.begin(WDT_TIMEOUT_US)); + } + + // Refreshes the watchdog timer to prevent system reset + void MarlinHAL::watchdog_refresh() { + watchdogTimer.reload(); + #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) + TOGGLE(LED_PIN); // Heartbeat indicator + #endif + } +#endif + +extern "C" { + extern unsigned int _ebss; // End of bss section +} + +// Resets the system to initiate a firmware flash. +WEAK void flashFirmware(const int16_t) { + hal.reboot(); +} + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/HAL.h b/Marlin/src/HAL/GD32_MFL/HAL.h new file mode 100644 index 0000000000..fd3a10d72b --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/HAL.h @@ -0,0 +1,160 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +#define CPU_32_BIT + +#include "../../core/macros.h" +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "temp_soc.h" +#include "fastio.h" +#include "Servo.h" + +#include "../../inc/MarlinConfigPre.h" + +#include +#include +#include + +// Default graphical display delays +#define CPU_ST7920_DELAY_1 300 +#define CPU_ST7920_DELAY_2 40 +#define CPU_ST7920_DELAY_3 340 + +// Serial Ports +#include "MarlinSerial.h" + +// Interrupts +#define CRITICAL_SECTION_START() const bool irqon = !__get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END() if (irqon) __enable_irq() + +#define cli() __disable_irq() +#define sei() __enable_irq() + +// Alias of __bss_end__ +#define __bss_end __bss_end__ + +// Types +typedef double isr_float_t; // FPU ops are used for single-precision, so use double for ISRs. +typedef uint8_t pin_t; // Parity with mfl platform + +// Servo +class libServo; +typedef libServo hal_servo_t; +#define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() +#define RESUME_SERVO_OUTPUT() libServo::resume_all_servos() + +// Debugging +#define JTAG_DISABLE() AFIO_I.set_remap(gpio::Pin_Remap_Select::SWJ_DP_ONLY_REMAP) +#define JTAGSWD_DISABLE() AFIO_I.set_remap(gpio::Pin_Remap_Select::SWJ_ALL_DISABLED_REMAP) +#define JTAGSWD_RESET() AFIO_I.set_remap(gpio::Pin_Remap_Select::FULL_SWJ_REMAP) + +// ADC +#ifdef ADC_RESOLUTION + #define HAL_ADC_RESOLUTION ADC_RESOLUTION +#else + #define HAL_ADC_RESOLUTION 12 +#endif + +#define HAL_ADC_VREF_MV 3300 + +// Disable Marlin's software oversampling. +// The MFL framework uses 16x hardware oversampling by default +#ifdef GD32F303RE + #define HAL_ADC_FILTERED +#endif + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#ifndef PLATFORM_M997_SUPPORT + #define PLATFORM_M997_SUPPORT +#endif + +void flashFirmware(const int16_t); + +#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment + +extern "C" char* _sbrk(int incr); +extern "C" char* dtostrf(double val, signed char width, unsigned char prec, char* sout); + +// MarlinHAL Class +class MarlinHAL { +public: + // Before setup() + MarlinHAL() {} + + // Watchdog + static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {}); + static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); + + static void init(); // called early in setup() + static void init_board() {} // called less early in setup() + static void reboot() { NVIC_SystemReset(); } // restart the firmware from 0x0 + + // Interrupts + static bool isr_state() { return !__get_PRIMASK(); } + static void isr_on() { sei(); } + static void isr_off() { cli(); } + static void delay_ms(const int ms) { delay(ms); } + + // Tasks called from idle() + static void idletask() {} + + // Reset + static uint8_t get_reset_source(); + static void clear_reset_source() { RCU_I.clear_all_reset_flags(); } + + // Free SRAM + static int freeMemory(); + + // ADC methods + static uint16_t adc_result; + + // Called by Temperature::init once at startup + static void adc_init() { analogReadResolution(HAL_ADC_RESOLUTION); } + + // Called by Temperature::init for each sensor at startup + static void adc_enable(const pin_t pin) { pinMode(pin, INPUT); } + + // Called from Temperature::isr to start ADC sampling on the given pin + static void adc_start(const pin_t pin) { adc_result = static_cast(analogRead(pin)); } + + // Check if ADC is ready for reading + static bool adc_ready() { return true; } + + // Current value of the ADC register + static uint16_t adc_value() { return adc_result; } + + // Set the PWM duty cycle for the pin to the given value. + // Optionally invert the duty cycle [default = false] + // Optionally change the maximum size of the provided value to enable finer PWM duty control [default = 255] + static void set_pwm_duty(const pin_t pin, const uint16_t value, const uint16_t scale = 255U, const bool invert = false); + + // Set the frequency of the timer for the given pin. + // All Timer PWM pins run at the same frequency. + static void set_pwm_frequency(const pin_t pin, const uint16_t f_desired); +}; diff --git a/Marlin/src/HAL/GD32_MFL/MarlinSPI.h b/Marlin/src/HAL/GD32_MFL/MarlinSPI.h new file mode 100644 index 0000000000..d0731f9e84 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MarlinSPI.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +#include + +using MarlinSPI = SPIClass; diff --git a/Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp b/Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp new file mode 100644 index 0000000000..c9b76a4ca4 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp @@ -0,0 +1,101 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "MarlinSerial.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +using namespace arduino; + +MarlinSerial& MarlinSerial::get_instance(usart::USART_Base Base, pin_size_t rxPin, pin_size_t txPin) { + UsartSerial& serial = UsartSerial::get_instance(Base, rxPin, txPin); + return *reinterpret_cast(&serial); +} + +#if USING_HW_SERIAL0 + MSerialT MSerial0(true, MarlinSerial::get_instance(usart::USART_Base::USART0_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL1 + MSerialT MSerial1(true, MarlinSerial::get_instance(usart::USART_Base::USART1_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL2 + MSerialT MSerial2(true, MarlinSerial::get_instance(usart::USART_Base::USART2_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL3 + MSerialT MSerial3(true, MarlinSerial::get_instance(usart::USART_Base::UART3_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL4 + MSerialT MSerial4(true, MarlinSerial::get_instance(usart::USART_Base::UART4_BASE, NO_PIN, NO_PIN)); +#endif + +#if ENABLED(EMERGENCY_PARSER) + // This callback needs to access the specific MarlinSerial instance + // We'll use a static pointer to track the current instance + static MarlinSerial* current_serial_instance = nullptr; + + static void emergency_callback() { + if (current_serial_instance) { + uint8_t last_data = current_serial_instance->get_last_data(); + emergency_parser.update(current_serial_instance->emergency_state, last_data); + } + } + + void MarlinSerial::register_emergency_callback(void (*callback)()) { + usart_.register_interrupt_callback(usart::Interrupt_Type::INTR_RBNEIE, callback); + } +#endif + +void MarlinSerial::begin(unsigned long baudrate, uint16_t config) { + UsartSerial::begin(baudrate, config); + #if DISABLED(SERIAL_DMA) + #if ENABLED(EMERGENCY_PARSER) + current_serial_instance = this; + register_emergency_callback(emergency_callback); + #endif + #endif +} + +void MarlinSerial::updateRxDmaBuffer() { + #if ENABLED(EMERGENCY_PARSER) + // Get the number of bytes available in the receive buffer + size_t available_bytes = usart_.available_for_read(true); + uint8_t data; + + // Process only the available data + for (size_t i = 0; i < available_bytes; ++i) { + if (usart_.read_rx_buffer(data)) { + emergency_parser.update(emergency_state, data); + } + } + #endif + // Call the base class implementation to handle any additional updates + UsartSerial::updateRxDmaBuffer(); +} + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/MarlinSerial.h b/Marlin/src/HAL/GD32_MFL/MarlinSerial.h new file mode 100644 index 0000000000..f47c6da032 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MarlinSerial.h @@ -0,0 +1,75 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +#include + +#include "../../core/serial_hook.h" + +#define SERIAL_INDEX_MIN 0 +#define SERIAL_INDEX_MAX 4 + +#include "../shared/serial_ports.h" + +#if defined(LCD_SERIAL_PORT) && ANY(HAS_DGUS_LCD, EXTENSIBLE_UI) + #define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() +#endif + +using namespace arduino; + +struct MarlinSerial : public UsartSerial { + static MarlinSerial& get_instance(usart::USART_Base Base, pin_size_t rxPin = NO_PIN, pin_size_t txPin = NO_PIN); + + void begin(unsigned long baudrate, uint16_t config); + inline void begin(unsigned long baudrate) { begin(baudrate, SERIAL_8N1); } + void updateRxDmaBuffer(); + + #if DISABLED(SERIAL_DMA) + FORCE_INLINE static uint8_t buffer_overruns() { return 0; } + #endif + + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + + // Accessor method to get the last received byte + uint8_t get_last_data() { return usart_.get_last_data(); } + + // Register the emergency callback + void register_emergency_callback(void (*callback)()); + #endif + +protected: + using UsartSerial::UsartSerial; +}; + +typedef Serial1Class MSerialT; +extern MSerialT MSerial0; +extern MSerialT MSerial1; +extern MSerialT MSerial2; +extern MSerialT MSerial3; +extern MSerialT MSerial4; diff --git a/Marlin/src/HAL/GD32_MFL/MinSerial.cpp b/Marlin/src/HAL/GD32_MFL/MinSerial.cpp new file mode 100644 index 0000000000..2cc79c8853 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MinSerial.cpp @@ -0,0 +1,163 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) +#include "../shared/MinSerial.h" + +// Base addresses for USART peripherals +static constexpr uintptr_t USART_base[] = { + 0x40013800, // USART0 + 0x40004400, // USART1 + 0x40004800, // USART2 + 0x40004C00, // UART3 + 0x40005000 // UART4 +}; + +// Register offsets +static constexpr uint32_t STAT0_OFFSET = 0x00U; +static constexpr uint32_t DATA_OFFSET = 0x04U; +static constexpr uint32_t BAUD_OFFSET = 0x08U; +static constexpr uint32_t CTL0_OFFSET = 0x0CU; +static constexpr uint32_t CTL1_OFFSET = 0x14U; + +// Bit positions +static constexpr uint32_t TBE_BIT = 7; +static constexpr uint32_t TEN_BIT = 3; +static constexpr uint32_t UEN_BIT = 13; + +// NVIC interrupt numbers for USART +static constexpr int nvicUART[] = { 37, 38, 39, 52, 53 }; + +// RCU PCLK values for USART +static constexpr rcu::RCU_PCLK clockRegs[] = { + rcu::RCU_PCLK::PCLK_USART0, + rcu::RCU_PCLK::PCLK_USART1, + rcu::RCU_PCLK::PCLK_USART2, + rcu::RCU_PCLK::PCLK_UART3, + rcu::RCU_PCLK::PCLK_UART4 +}; + +// Memory barrier instructions +#define isb() __asm__ __volatile__ ("isb" : : : "memory") +#define dsb() __asm__ __volatile__ ("dsb" : : : "memory") +#define sw_barrier() __asm__ volatile("" : : : "memory") + +// Direct register access macros +#define USART_REG(offset) (*(volatile uint32_t*)(USART_base[SERIAL_PORT] + (offset))) +#define USART_STAT0 USART_REG(STAT0_OFFSET) +#define USART_DATA USART_REG(DATA_OFFSET) +#define USART_BAUD USART_REG(BAUD_OFFSET) +#define USART_CTL0 USART_REG(CTL0_OFFSET) +#define USART_CTL1 USART_REG(CTL1_OFFSET) + +// Bit manipulation macros +#define READ_BIT(reg, bit) (((reg) >> (bit)) & 1U) +#define SET_BIT(reg, bit) ((reg) |= (1U << (bit))) +#define CLEAR_BIT(reg, bit) ((reg) &= ~(1U << (bit))) + +// Initializes the MinSerial interface. +// This function sets up the USART interface for serial communication. +// If the selected serial port is not a hardware port, it disables the severe error reporting feature. +static void MinSerialBegin() { + #if !WITHIN(SERIAL_PORT, 0, 4) + #warning "Using POSTMORTEM_DEBUGGING requires a physical U(S)ART hardware in case of severe error." + #warning "Disabling the severe error reporting feature currently because the used serial port is not a HW port." + #else + int nvicIndex = nvicUART[SERIAL_PORT]; + + // NVIC base address for interrupt disable + struct NVICMin { + volatile uint32_t ISER[32]; + volatile uint32_t ICER[32]; + }; + NVICMin *nvicBase = (NVICMin*)0xE000E100; + + SBI32(nvicBase->ICER[nvicIndex >> 5], nvicIndex & 0x1F); + + // We require memory barriers to properly disable interrupts + // (https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the) + dsb(); + isb(); + + // Get the RCU PCLK for this USART + rcu::RCU_PCLK pclk = clockRegs[SERIAL_PORT]; + + // Disable then enable usart peripheral clocks + rcu::RCU_DEVICE.set_pclk_enable(pclk, false); + rcu::RCU_DEVICE.set_pclk_enable(pclk, true); + + // Save current baudrate + uint32_t baudrate = USART_BAUD; + + // Reset USART control registers + USART_CTL0 = 0; + USART_CTL1 = 0; // 1 stop bit + + // Restore baudrate + USART_BAUD = baudrate; + + // Enable transmitter and USART (8 bits, no parity, 1 stop bit) + SET_BIT(USART_CTL0, TEN_BIT); + SET_BIT(USART_CTL0, UEN_BIT); + #endif +} + +// Writes a single character to the serial port. +static void MinSerialWrite(char c) { + #if WITHIN(SERIAL_PORT, 0, 4) + // Wait until transmit buffer is empty + while (!READ_BIT(USART_STAT0, TBE_BIT)) { + hal.watchdog_refresh(); + sw_barrier(); + } + // Write character to data register + USART_DATA = c; + #endif +} + +// Installs the minimum serial interface. +// Sets the HAL_min_serial_init and HAL_min_serial_out function pointers to MinSerialBegin and MinSerialWrite respectively. +void install_min_serial() { + HAL_min_serial_init = &MinSerialBegin; + HAL_min_serial_out = &MinSerialWrite; +} + +extern "C" { + // A low-level assembly-based jump handler. + // Unconditionally branches to the CommonHandler_ASM function. + __attribute__((naked, aligned(4))) void JumpHandler_ASM() { + __asm__ __volatile__ ("b CommonHandler_ASM\n"); + } + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) HardFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) BusFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) UsageFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) MemManage_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) NMI_Handler(); +} + +#endif // POSTMORTEM_DEBUGGING +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/README.md b/Marlin/src/HAL/GD32_MFL/README.md new file mode 100644 index 0000000000..af23a37f2f --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/README.md @@ -0,0 +1,8 @@ +# Generic GD32 HAL based on the MFL Arduino Core + +This HAL is eventually intended to act as the generic HAL for all GD32 chips using the MFL library. + +Currently it supports: + * GD32F303RET6 + +Targeting the official [MFL Arduino Core](https://github.com/bnmguy/ArduinoCore_MFL). diff --git a/Marlin/src/HAL/GD32_MFL/SDCard.cpp b/Marlin/src/HAL/GD32_MFL/SDCard.cpp new file mode 100644 index 0000000000..15d33d2596 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/SDCard.cpp @@ -0,0 +1,1022 @@ +// +// MFL gd32f30x SDCARD using DMA through SDIO in C++ +// +// Copyright (C) 2025 B. Mourit +// +// This software is free software: you can redistribute it and/or modify it under the terms of the +// GNU Lesser General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// This software 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along with this software. +// If not, see . +// + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +#include "SDCard.h" +#include +#include + +namespace sdio { + +CardDMA& CardDMA::get_instance() { + static CardDMA instance; + return instance; +} + +CardDMA::CardDMA() : + sdcard_csd_{0U, 0U, 0U, 0U}, + sdcard_cid_{0U, 0U, 0U, 0U}, + sdcard_scr_{0U, 0U}, + desired_clock_(Default_Desired_Clock), + stop_condition_(0U), + total_bytes_(0U), + count_(0U), + sdio_(SDIO::get_instance()), + config_(sdio_.get_config()), + dmaBase_(dma::DMA_Base::DMA1_BASE), + dmaChannel_(dma::DMA_Channel::CHANNEL3), + dma_(dma::DMA::get_instance(dmaBase_, dmaChannel_).value()), + sdcard_rca_(0U), + transfer_error_(SDIO_Error_Type::OK), + interface_version_(Interface_Version::UNKNOWN), + card_type_(Card_Type::UNKNOWN), + transfer_end_(false), + is_rx_(false), + multiblock_(false), + current_state_(Operational_State::READY) +{ +} + +// Initialize card and put in standby state +SDIO_Error_Type CardDMA::init() { + // Reset SDIO peripheral + sdio_.reset(); + sync_domains(); + + // Initialize SDIO peripheral + // If no SDIO_Config structure is provided the default is used. + // The default provides the parameters for initialization + // using a very low clock speed (typically <= 400KHz). + sdio_.init(); + sync_domains(); + + SDIO_Error_Type result = begin_startup_procedure(); + if (result != SDIO_Error_Type::OK) { + return result; + } + + return card_init(); +} + +// Startup command procedure according to SDIO specification +SDIO_Error_Type CardDMA::begin_startup_procedure() { + sdio_.set_power_mode(Power_Control::POWER_ON); + sdio_.set_clock_enable(true); + sync_domains(); + + // CMD0 (GO_IDLE_STATE) + if (send_command_and_check(Command_Index::CMD0, 0, Command_Response::RSP_NONE, Wait_Type::WT_NONE, [this]() { + return this->get_command_sent_result(); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD0_FAILED; + } + + // CMD8 + if (send_command_and_check(Command_Index::CMD8, Check_Pattern, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this]() { + return this->get_r7_result(); + }) != SDIO_Error_Type::OK) { + // V1.0 card + // CMD0 (GO_IDLE_STATE) + interface_version_ = Interface_Version::INTERFACE_V1_1; + if (send_command_and_check(Command_Index::CMD0, 0, Command_Response::RSP_NONE, Wait_Type::WT_NONE, [this]() { + return this->get_command_sent_result(); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD0_FAILED; + } + } else { + // V2.0 card + // CMD55 + interface_version_ = Interface_Version::INTERFACE_V2_0; + if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + } + + if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + return validate_voltage(); +} + +// Voltage validation +SDIO_Error_Type CardDMA::validate_voltage() { + uint32_t response = 0U; + uint32_t count = 0U; + bool valid_voltage = false; + + while ((count < Max_Voltage_Checks) && (valid_voltage == false)) { + if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + if (send_command_and_check(Command_Index::ACMD41, Voltage_Window | SDCARD_HCS | Switch_1_8V_Capacity, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::INVALID, index = false, crc = true]() { + return check_sdio_status(cmd, index, crc); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD41_FAILED; + } + response = sdio_.get_response(Response_Type::RESPONSE0); + valid_voltage = (((response >> 31U) == 1U) ? true : false); + count++; + } + + if (count >= Max_Voltage_Checks) { + return SDIO_Error_Type::INVALID_VOLTAGE; + } + + card_type_ = (response & SDCARD_HCS) ? Card_Type::SDCARD_HIGH_CAPACITY : Card_Type::SDCARD_STANDARD_CAPACITY; + + #if ENABLED(MARLIN_DEV_MODE) + if (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY) { + SERIAL_ECHOPGM("\n SDHC!"); + } else { + SERIAL_ECHOPGM("\n SDSC!"); + } + #endif + + return SDIO_Error_Type::OK; +} + +// Shutdown +void CardDMA::begin_shutdown_procedure() { + sdio_.set_power_mode(Power_Control::POWER_OFF); +} + +// Initialize card +SDIO_Error_Type CardDMA::card_init() { + if (sdio_.get_power_mode() == static_cast(Power_Control::POWER_OFF)) { + return SDIO_Error_Type::INVALID_OPERATION; + } + + // Skip CID/RCA for IO cards + if (card_type_ != Card_Type::SD_IO_CARD) { + if (send_command_and_check(Command_Index::CMD2, 0U, Command_Response::RSP_LONG, Wait_Type::WT_NONE, + [this, cmd = Command_Index::INVALID, index = false, crc = true]() { + return check_sdio_status(cmd, index, crc); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD2_FAILED; + } + // Store CID + store_cid(); + + // Get RCA + uint16_t r6_rca; + if (send_command_and_check(Command_Index::CMD3, 0U, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, + [this, cmd = Command_Index::CMD3, rca = &r6_rca]() { + return get_r6_result(cmd, rca); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD3_FAILED; + } + // Store RCA + sdcard_rca_ = r6_rca; + if (send_command_and_check(Command_Index::CMD9, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_LONG, Wait_Type::WT_NONE, + [this, cmd = Command_Index::INVALID, index = false, crc = true]() { + return check_sdio_status(cmd, index, crc); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD9_FAILED; + } + // Store CSD + store_csd(); + } + + Card_Info card_info; + SDIO_Error_Type result = get_card_specific_data(&card_info); + if (result != SDIO_Error_Type::OK) { + return result; + } + + if (select_deselect() != SDIO_Error_Type::OK) { + return SDIO_Error_Type::SELECT_DESELECT_FAILED; + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::store_cid() { + // Store the CID register values + sdcard_cid_[0] = sdio_.get_response(Response_Type::RESPONSE0); + sdcard_cid_[1] = sdio_.get_response(Response_Type::RESPONSE1); + sdcard_cid_[2] = sdio_.get_response(Response_Type::RESPONSE2); + sdcard_cid_[3] = sdio_.get_response(Response_Type::RESPONSE3); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::store_csd() { + // Store the CSD register values + sdcard_csd_[0] = sdio_.get_response(Response_Type::RESPONSE0); + sdcard_csd_[1] = sdio_.get_response(Response_Type::RESPONSE1); + sdcard_csd_[2] = sdio_.get_response(Response_Type::RESPONSE2); + sdcard_csd_[3] = sdio_.get_response(Response_Type::RESPONSE3); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::set_hardware_bus_width(Bus_Width width) { + if (card_type_ == Card_Type::SD_MMC || width == Bus_Width::WIDTH_8BIT) { + return SDIO_Error_Type::UNSUPPORTED_FUNCTION; + } + + // Retrieve SCR + SDIO_Error_Type result = get_scr(sdcard_rca_, sdcard_scr_); + if (result != SDIO_Error_Type::OK) { + return result; + } + + // Check and set bus width + // This function is only used to set a higher width than the default 1bit + // so no 1bit configuration logic is required. + if (width == Bus_Width::WIDTH_4BIT) { + // Send CMD55 (APP_CMD) + if (send_command_and_check(Command_Index::CMD55, static_cast(sdcard_rca_ << RCA_Shift), Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + // Send ACMD6 (SET_BUS_WIDTH) + if (send_command_and_check(Command_Index::ACMD6, 2U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD6]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD6_FAILED; + } + + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOPGM("\n wide bus set!"); + #endif + sdio_.set_bus_width(Bus_Width::WIDTH_4BIT); + + return SDIO_Error_Type::OK; + } + + return SDIO_Error_Type::UNSUPPORTED_FUNCTION; +} + +SDIO_Error_Type CardDMA::read(uint8_t* buf, uint32_t address, uint32_t count) { + if (current_state_ == Operational_State::READY) { + transfer_error_ = SDIO_Error_Type::OK; + current_state_ = Operational_State::BUSY; + is_rx_ = true; + multiblock_ = (count > 1); + + sdio_.clear_data_state_machine(Transfer_Direction::CARD_TO_SDIO); + + // Enable the interrupts + sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::RXOREIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::STBITEIE, true); + + total_bytes_ = BLOCK_SIZE * count; + + // Set DMA transfer parameters + set_dma_parameters(buf, (total_bytes_ / 4U), false); + sdio_.set_dma_enable(true); + + if (card_type_ != Card_Type::SDCARD_HIGH_CAPACITY) { + address *= 512U; + } + + // CMD16 set card block size + if (send_command_and_check(Command_Index::CMD16, BLOCK_SIZE, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + current_state_ = Operational_State::READY; + return SDIO_Error_Type::CMD16_FAILED; + } + + Block_Size block_size = get_data_block_size_index(BLOCK_SIZE); + + sdio_.set_data_state_machine_and_send(Data_Timeout, total_bytes_, block_size, + Transfer_Mode::BLOCK, Transfer_Direction::CARD_TO_SDIO, true); + + // CMD17/CMD18 (READ_SINGLE_BLOCK/READ_MULTIPLE_BLOCKS) send read command + Command_Index read_cmd = (count > 1U) ? Command_Index::CMD18 : Command_Index::CMD17; + if (send_command_and_check(read_cmd, address, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = read_cmd]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + current_state_ = Operational_State::READY; + return (count > 1U) ? SDIO_Error_Type::CMD18_FAILED : SDIO_Error_Type::CMD17_FAILED; + } + return SDIO_Error_Type::OK; + } else { + return SDIO_Error_Type::BUSY; + } +} + +SDIO_Error_Type CardDMA::write(uint8_t* buf, uint32_t address, uint32_t count) { + // Enable the interrupts + sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::STBITEIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::TXUREIE, true); + + if (card_type_ != Card_Type::SDCARD_HIGH_CAPACITY) { + address *= 512U; + } + + // CMD16 + if (send_command_and_check(Command_Index::CMD16, BLOCK_SIZE, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + return SDIO_Error_Type::CMD16_FAILED; + } + + // CMD25/CMD24 (WRITE_MULTIPLE_BLOCK/WRITE_BLOCK) send write command + Command_Index write_cmd = (count > 1U) ? Command_Index::CMD25 : Command_Index::CMD24; + if (send_command_and_check(write_cmd, address, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = write_cmd]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + return (count > 1U) ? SDIO_Error_Type::CMD25_FAILED : SDIO_Error_Type::CMD24_FAILED; + } + + total_bytes_ = BLOCK_SIZE * count; + // Start DMA transfer + set_dma_parameters(buf, (total_bytes_ / 4U), true); + sdio_.set_dma_enable(true); + + sdio_.clear_data_state_machine(Transfer_Direction::SDIO_TO_CARD); + Block_Size block_size = get_data_block_size_index(total_bytes_); + + sdio_.set_data_state_machine_and_send(Data_Timeout, total_bytes_, block_size, + Transfer_Mode::BLOCK, Transfer_Direction::SDIO_TO_CARD, true); + + while ((dma_.get_flag(dma::Status_Flags::FLAG_FTFIF)) || (dma_.get_flag(dma::Status_Flags::FLAG_ERRIF))) { + // Wait for the IRQ handler to clear + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::erase(uint32_t address_start, uint32_t address_end) { + SDIO_Error_Type result = SDIO_Error_Type::OK; + + // Card command classes CSD + uint8_t temp_byte = static_cast((sdcard_csd_[1] & (0xFFU << 24U)) >> 24U); + uint16_t classes = static_cast(temp_byte << 4U); + temp_byte = static_cast((sdcard_csd_[1] & (0xFFU << 16U)) >> 16U); + classes |= static_cast((temp_byte & 0xF0U) >> 4U); + + if ((classes & (1U << static_cast(Card_Command_Class::ERASE))) == Clear) { + return SDIO_Error_Type::UNSUPPORTED_FUNCTION; + } + + uint32_t delay_time = 120000U / sdio_.get_clock_divider(); + + if (sdio_.get_response(Response_Type::RESPONSE0) & Card_Locked) { + return SDIO_Error_Type::LOCK_UNLOCK_FAILED; + } + + // Size is fixed at 512 bytes for SDHC + if (card_type_ != Card_Type::SDCARD_HIGH_CAPACITY) { + address_start *= 512U; + address_end *= 512U; + } + + if ((card_type_ == Card_Type::SDCARD_STANDARD_CAPACITY) || (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY)) { + // CMD32 (ERASE_WR_BLK_START) + if (send_command_and_check(Command_Index::CMD32, address_start, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD32]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD32_FAILED; + } + // CMD33 (ERASE_WR_BLK_END) + if (send_command_and_check(Command_Index::CMD33, address_end, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD33]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD33_FAILED; + } + } + + // CMD38 (ERASE) + if (send_command_and_check(Command_Index::CMD38, 0U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD38]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD38_FAILED; + } + + // Loop until the counter reaches the calculated time + for (uint32_t count = 0U; count < delay_time; count++) {} + + Card_State card_state; + result = get_card_state(&card_state); + while ((result == SDIO_Error_Type::OK) && ((card_state == Card_State::PROGRAMMING) || (card_state == Card_State::RECEIVE_DATA))) { + result = get_card_state(&card_state); + } + + return result; +} + +void CardDMA::handle_interrupts() { + transfer_error_ = SDIO_Error_Type::OK; + + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTEND)) { + sdio_.clear_interrupt_flag(Clear_Flags::FLAG_DTENDC); + // Disable all interrupts + disable_all_interrupts(); + sdio_.set_data_state_machine_enable(false); + + if ((multiblock_) && (!is_rx_)) { + transfer_error_ = stop_transfer(); + if (transfer_error_ != SDIO_Error_Type::OK) {} + } + + if (!is_rx_) { + sdio_.set_dma_enable(false); + current_state_ = Operational_State::READY; + } + } else if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTCRCERR) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTTMOUT) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_STBITE) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_TXURE) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_RXORE)) { + + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTCRCERR)) { + transfer_error_ = SDIO_Error_Type::DATA_CRC_ERROR; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTTMOUT)) { + transfer_error_ = SDIO_Error_Type::DATA_TIMEOUT; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_STBITE)) { + transfer_error_ = SDIO_Error_Type::START_BIT_ERROR; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_TXURE)) { + transfer_error_ = SDIO_Error_Type::TX_FIFO_UNDERRUN; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_RXORE)) { + transfer_error_ = SDIO_Error_Type::RX_FIFO_OVERRUN; + } + sdio_.clear_multiple_interrupt_flags(clear_data_flags); + sdio_.clear_interrupt_flag(Clear_Flags::FLAG_STBITEC); + disable_all_interrupts(); + + dma_.set_transfer_abandon(); + } +} + +SDIO_Error_Type CardDMA::select_deselect() { + // CMD7 (SELECT/DESELECT_CARD) + if (send_command_and_check(Command_Index::CMD7, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD7]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD7_FAILED; + } + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_card_interface_status(uint32_t* status) { + if (status == nullptr) return SDIO_Error_Type::INVALID_PARAMETER; + + // CMD13 (SEND_STATUS) + if (send_command_and_check(Command_Index::CMD13, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD13_FAILED; + } + + *status = sdio_.get_response(Response_Type::RESPONSE0); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_sdcard_status(uint32_t* status) { + uint32_t count = 0U; + + // CMD16 (SET_BLOCKLEN) + if (send_command_and_check(Command_Index::CMD16, 64U, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD16_FAILED; + } + + // CMD55 (APP_CMD) + if (send_command_and_check(Command_Index::CMD55, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + sdio_.set_data_state_machine_and_send(Data_Timeout, 64U, Block_Size::BYTES_64, Transfer_Mode::BLOCK, Transfer_Direction::CARD_TO_SDIO, true); + + // ACMD13 (SD_STATUS) + if (send_command_and_check(Command_Index::ACMD13, 0U, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD13_FAILED; + } + + while (!sdio_.check_scr_flags()) { + if (sdio_.get_flag(Status_Flags::FLAG_RFH)) { + for (count = 0U; count < FIFO_Half_Words; count++) { + *(status + count) = sdio_.read_fifo_word(); + } + status += FIFO_Half_Words; + } + + //SDIO_Error_Type result = SDIO_Error_Type::OK; + if (sdio_.get_flag(Status_Flags::FLAG_DTCRCERR)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTCRCERRC); + return SDIO_Error_Type::DATA_CRC_ERROR; + } else if (sdio_.get_flag(Status_Flags::FLAG_DTTMOUT)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTTMOUTC); + return SDIO_Error_Type::DATA_TIMEOUT; + } else if (sdio_.get_flag(Status_Flags::FLAG_RXORE)) { + sdio_.clear_flag(Clear_Flags::FLAG_RXOREC); + return SDIO_Error_Type::RX_FIFO_OVERRUN; + } else if (sdio_.get_flag(Status_Flags::FLAG_STBITE)) { + sdio_.clear_flag(Clear_Flags::FLAG_STBITEC); + return SDIO_Error_Type::START_BIT_ERROR; + } + while (sdio_.get_flag(Status_Flags::FLAG_RXDTVAL)) { + *status = sdio_.read_fifo_word(); + ++status; + } + + sdio_.clear_multiple_interrupt_flags(clear_data_flags); + status -= 16U; + for (count = 0U; count < 16U; count++) { + status[count] = ((status[count] & 0xFFU) << 24U) | + ((status[count] & (0xFFU << 8U)) << 8U) | + ((status[count] & (0xFFU << 16U)) >> 8U) | + ((status[count] & (0xFFU << 24U)) >> 24U); + } + } + + return SDIO_Error_Type::OK; +} + +void CardDMA::check_dma_complete() { + while ((dma_.get_flag(dma::Status_Flags::FLAG_FTFIF)) || (dma_.get_flag(dma::Status_Flags::FLAG_ERRIF))) { + // Wait for the IRQ handler to clear + } +} + +SDIO_Error_Type CardDMA::stop_transfer() { + // CMD12 (STOP_TRANSMISSION) + if (send_command_and_check(Command_Index::CMD12, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD12]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD12_FAILED; + } + return SDIO_Error_Type::OK; +} + +Transfer_State CardDMA::get_transfer_state() { + Transfer_State transfer_state = Transfer_State::IDLE; + if (sdio_.get_flag(Status_Flags::FLAG_TXRUN) | sdio_.get_flag(Status_Flags::FLAG_RXRUN)) { + transfer_state = Transfer_State::BUSY; + } + + return transfer_state; +} + +uint32_t CardDMA::get_card_capacity() const { + auto extract_bits = [](uint32_t value, uint8_t start_bit, uint8_t length) -> uint32_t { + return (value >> start_bit) & ((1U << length) - 1U); + }; + + uint32_t capacity = 0U; + uint32_t device_size = 0U; + + if (card_type_ == Card_Type::SDCARD_STANDARD_CAPACITY) { + // Extract fields from CSD data using bit manipulation + uint8_t device_size_high = static_cast(extract_bits(sdcard_csd_[1], 8U, 2U)); // Bits [73:72] + uint8_t device_size_mid = static_cast(extract_bits(sdcard_csd_[1], 0U, 8U)); // Bits [71:64] + uint8_t device_size_low = static_cast(extract_bits(sdcard_csd_[2], 24U, 2U)); // Bits [63:62] + + device_size = static_cast((device_size_high) << 10U) | + static_cast((device_size_mid) << 2U) | + static_cast((device_size_low)); + + uint8_t device_size_multiplier_high = static_cast(extract_bits(sdcard_csd_[2], 16U, 2U)); // Bits [49:48] + uint8_t device_size_multiplier_low = static_cast(extract_bits(sdcard_csd_[2], 8U, 1U)); // Bit [47] + uint8_t device_size_multiplier = static_cast((device_size_multiplier_high << 1U) | device_size_multiplier_low); + uint8_t read_block_length = static_cast(extract_bits(sdcard_csd_[1], 16U, 4U)); // Bits [83:80] + + // Capacity = (device_size + 1) * MULT * BLOCK_LEN + uint32_t mult = static_cast(1U << (device_size_multiplier + 2U)); // MULT = 2 ^ (C_SIZE_MULT + 2) + uint32_t block_length = static_cast(1U << read_block_length); // BLOCK_LEN = 2 ^ READ_BL_LEN + + capacity = (device_size + 1U) * mult * block_length; + capacity /= KILOBYTE; // Convert capacity to kilobytes + + } else if (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY) { + // High-capacity card calculation + uint8_t device_size_high = static_cast(extract_bits(sdcard_csd_[1], 0U, 6U)); // Bits [69:64] + uint8_t device_size_mid = static_cast(extract_bits(sdcard_csd_[2], 24U, 8U)); // Bits [55:48] + uint8_t device_size_low = static_cast(extract_bits(sdcard_csd_[2], 16U, 8U)); // Bits [47:40] + + device_size = static_cast((device_size_high) << 16U) | + static_cast((device_size_mid) << 8U) | + static_cast(device_size_low); + + // Capacity in kilobytes + capacity = (device_size + 1U) * BLOCK_SIZE; + } + + return capacity; +} + +SDIO_Error_Type CardDMA::get_card_specific_data(Card_Info* info) { + if (info == nullptr) return SDIO_Error_Type::INVALID_PARAMETER; + + // Store basic card information + info->type = card_type_; + info->relative_address = sdcard_rca_; + + // Helper function to convert 32-bit registers to byte array + auto convert_registers_to_bytes = [](const uint32_t* registers, uint8_t* bytes, size_t reg_count) { + for (size_t i = 0U; i < reg_count; ++i) { + for (size_t j = 0U; j < 4U; ++j) { + bytes[i * 4U + j] = (registers[i] >> (24U - j * 8U)) & 0xFFU; + } + } + }; + + // Process CID data + uint8_t cid_bytes[16]; + convert_registers_to_bytes(sdcard_cid_, cid_bytes, 4); + + info->cid = { + .manufacture_id = cid_bytes[0], + .oem_id = static_cast( + (cid_bytes[1] << 8U) | + cid_bytes[2] + ), + .name0 = static_cast( + (cid_bytes[3] << 24U) | + (cid_bytes[4] << 16U) | + (cid_bytes[5] << 8U) | + cid_bytes[6] + ), + .name1 = cid_bytes[7], + .revision = cid_bytes[8], + .serial_number = static_cast( + (cid_bytes[9] << 24U) | + (cid_bytes[10] << 16U) | + (cid_bytes[11] << 8U) | + cid_bytes[12] + ), + .manufacture_date = static_cast( + ((cid_bytes[13] & 0x0FU) << 8U) | + cid_bytes[14] + ), + .checksum = static_cast(((cid_bytes[15] & 0xFEU) >> 1U)) + }; + + // Process CSD data + uint8_t csd_bytes[16]; + convert_registers_to_bytes(sdcard_csd_, csd_bytes, 4U); + + // Fill common CSD fields + info->csd = { + .transfer_speed = csd_bytes[3], + .card_command_class = static_cast((csd_bytes[4] << 4U) | ((csd_bytes[5] & 0xF0U) >> 4U)), + }; + + // Process card-type specific CSD fields and calculate capacity + if (card_type_ == Card_Type::SDCARD_STANDARD_CAPACITY) { + process_sdsc_specific_csd(info, csd_bytes); + } else if (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY) { + process_sdhc_specific_csd(info, csd_bytes); + } + + // Fill remaining common CSD fields + process_common_csd_tail(info, csd_bytes); + + return SDIO_Error_Type::OK; +} + +constexpr Block_Size CardDMA::get_data_block_size_index(uint16_t size) { + switch (size) { + case 1: return Block_Size::BYTES_1; + case 2: return Block_Size::BYTES_2; + case 4: return Block_Size::BYTES_4; + case 8: return Block_Size::BYTES_8; + case 16: return Block_Size::BYTES_16; + case 32: return Block_Size::BYTES_32; + case 64: return Block_Size::BYTES_64; + case 128: return Block_Size::BYTES_128; + case 256: return Block_Size::BYTES_256; + case 512: return Block_Size::BYTES_512; + case 1024: return Block_Size::BYTES_1024; + case 2048: return Block_Size::BYTES_2048; + case 4096: return Block_Size::BYTES_4096; + case 8192: return Block_Size::BYTES_8192; + case 16384: return Block_Size::BYTES_16384; + default: return Block_Size::BYTES_1; + } +} + +SDIO_Error_Type CardDMA::get_card_state(Card_State* card_state) { + // CMD13 (SEND_STATUS) + if (send_command_and_check(Command_Index::CMD13, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD13_FAILED; + } + + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + *card_state = static_cast((response >> 9U) & CardStateMask); + if ((response & All_R1_Error_Bits) == 0U) { + return SDIO_Error_Type::OK; + } + + if (response & All_R1_Error_Bits) { + for (const auto& entry : errorTableR1) { + if (response & entry.mask) { + return entry.errorType; + } + } + return SDIO_Error_Type::ERROR; + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_command_sent_result() { + volatile uint32_t timeout = 0x00FFFFFFU; + + while ((sdio_.get_flag(Status_Flags::FLAG_CMDSEND) == false) && (timeout != 0U)) { + timeout = timeout - 1U; + } + if (timeout == 0U) return SDIO_Error_Type::RESPONSE_TIMEOUT; + sdio_.clear_multiple_interrupt_flags(clear_command_flags); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::check_sdio_status(Command_Index index, bool check_index, bool ignore_crc) { + // Wait until one of the relevant flags is set + bool flag_set = sdio_.wait_cmd_flags(); + + if (!flag_set) { + return SDIO_Error_Type::RESPONSE_TIMEOUT; + } + + // Check the cmd received bit first, since noise can sometimes + // cause the timeout bit to get erroneously set + // If cmd was received we can safely ignore other checks + if (sdio_.get_flag(Status_Flags::FLAG_CMDRECV)) { + // If cmd was received, check the index + // Responses that dont do an index check will send an invalid cmd index + if (check_index && (index != Command_Index::INVALID)) { + uint8_t idx = sdio_.get_command_index(); + if (idx != static_cast(index)) { + return SDIO_Error_Type::ILLEGAL_COMMAND; + } + } + // Clear all flags before returning + sdio_.clear_multiple_interrupt_flags(clear_command_flags); + return SDIO_Error_Type::OK; + } + + // Timeout check + if (sdio_.get_flag(Status_Flags::FLAG_CMDTMOUT)) { + sdio_.clear_flag(Clear_Flags::FLAG_CMDTMOUTC); + return SDIO_Error_Type::RESPONSE_TIMEOUT; + } + + // CRC check + if (!ignore_crc) { + if (sdio_.get_flag(Status_Flags::FLAG_CCRCERR)) { + sdio_.clear_flag(Clear_Flags::FLAG_CCRCERRC); + return SDIO_Error_Type::COMMAND_CRC_ERROR; + } + } + + // Responses that dont do an index check will send an invalid cmd index + if (check_index && (index != Command_Index::INVALID)) { + uint8_t idx = sdio_.get_command_index(); + if (idx != static_cast(index)) { + return SDIO_Error_Type::ILLEGAL_COMMAND; + } + } + + // Clear all flags before returning + sdio_.clear_multiple_interrupt_flags(clear_command_flags); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_r1_result(Command_Index index) { + SDIO_Error_Type result = check_sdio_status(index, true, false); + if (result != SDIO_Error_Type::OK) { + return result; + } + + // Get the R1 response and check for errors + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + + if (response & All_R1_Error_Bits) { + for (const auto& entry : errorTableR1) { + if (response & entry.mask) { + return entry.errorType; + } + } + return SDIO_Error_Type::ERROR; + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_r6_result(Command_Index index, uint16_t* rca) { + SDIO_Error_Type result = check_sdio_status(index, true, false); + if (result != SDIO_Error_Type::OK) return result; + + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + + if (response & R6_Error_Bits) { + for (const auto& entry : errorTableR6) { + if (response & entry.mask) { + return entry.errorType; + } + } + return SDIO_Error_Type::ERROR; + } + *rca = static_cast(response >> 16U); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_r7_result() { + return check_sdio_status(Command_Index::INVALID, false, false); +} + +SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) { + uint32_t temp_scr[2] = {0U, 0U}; + uint32_t index_scr = 0U; + uint32_t* src_data = scr; + + // CMD16 (SET_BLOCKLEN) + if (send_command_and_check(Command_Index::CMD16, 8U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD16_FAILED; + } + + // CMD55 (APP_CMD) + if (send_command_and_check(Command_Index::CMD55, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + // Set data parameters + sdio_.set_data_state_machine_and_send(Data_Timeout, 8U, Block_Size::BYTES_8, + Transfer_Mode::BLOCK, Transfer_Direction::CARD_TO_SDIO, true); + + // ACMD51 (SEND_SCR) + if (send_command_and_check(Command_Index::ACMD51, 0U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD51]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD51_FAILED; + } + + // Store SCR + while (!sdio_.check_scr_flags()) { + if (sdio_.get_flag(Status_Flags::FLAG_RXDTVAL)) { + *(temp_scr + index_scr) = sdio_.read_fifo_word(); + ++index_scr; + } + } + + if (sdio_.get_flag(Status_Flags::FLAG_DTTMOUT)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTTMOUTC); + return SDIO_Error_Type::DATA_TIMEOUT; + } else if (sdio_.get_flag(Status_Flags::FLAG_DTCRCERR)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTCRCERRC); + return SDIO_Error_Type::DATA_CRC_ERROR; + } else if (sdio_.get_flag(Status_Flags::FLAG_RXORE)) { + sdio_.clear_flag(Clear_Flags::FLAG_RXOREC); + return SDIO_Error_Type::RX_FIFO_OVERRUN; + } + + sdio_.clear_multiple_interrupt_flags(clear_data_flags); + + constexpr uint32_t Zero_Seven = (0xFFU << 0U); + constexpr uint32_t Eight_Fifteen = (0xFFU << 8U); + constexpr uint32_t Sixteen_Twentythree = (0xFFU << 16U); + constexpr uint32_t TwentyFour_Thirtyone = (0xFFU << 24U); + + // adjust SCR value + *src_data = ((temp_scr[1] & Zero_Seven) << 24U) | ((temp_scr[1] & Eight_Fifteen) << 8U) | + ((temp_scr[1] & Sixteen_Twentythree) >> 8U) | ((temp_scr[1] & TwentyFour_Thirtyone) >> 24U); + + src_data = src_data + 1U; + *src_data = ((temp_scr[0] & Zero_Seven) << 24U) | ((temp_scr[0] & Eight_Fifteen) << 8U) | + ((temp_scr[0] & Sixteen_Twentythree) >> 8U) | ((temp_scr[0] & TwentyFour_Thirtyone) >> 24U); + + return SDIO_Error_Type::OK; +} + +// DMA for rx/tx is always DMA1 channel 3 +void CardDMA::set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write) { + constexpr uint32_t flag_bits = (1U << static_cast(dma::INTF_Bits::GIF3)); + + dma_.clear_flags(flag_bits); + + // Disable and reset DMA + dma_.set_channel_enable(false); + dma_.clear_channel(); + + dma_.init({ + count, + static_cast(reinterpret_cast(buf)), + static_cast(reinterpret_cast(sdio_.reg_address(SDIO_Regs::FIFO))), + dma::Bit_Width::WIDTH_32BIT, + dma::Bit_Width::WIDTH_32BIT, + dma::Increase_Mode::INCREASE_DISABLE, + dma::Increase_Mode::INCREASE_ENABLE, + dma::Channel_Priority::MEDIUM_PRIORITY, + is_write ? dma::Transfer_Direction::M2P : dma::Transfer_Direction::P2M + }); + + dma_.set_memory_to_memory_enable(false); + dma_.set_circulation_mode_enable(false); + + // Enable DMA interrupts for transfer complete and error + dma_.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, true); + dma_.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, true); + + // Start the DMA channel + dma_.set_channel_enable(true); +} + +SDIO_Error_Type CardDMA::wait_for_card_ready() { + volatile uint32_t timeout = 0x00FFFFFFU; + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + + while (((response & static_cast(R1_Status::READY_FOR_DATA)) == 0U) && (timeout != 0U)) { + // Continue to send CMD13 to poll the state of card until buffer empty or timeout + timeout = timeout - 1U; + // CMD13 (SEND_STATUS) + if (send_command_and_check(Command_Index::CMD13, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD13_FAILED; + } + response = sdio_.get_response(Response_Type::RESPONSE0); + } + + return (timeout == 0U) ? SDIO_Error_Type::ERROR : SDIO_Error_Type::OK; +} + +} // namespace sdio + +sdio::CardDMA& CardDMA_I = sdio::CardDMA::get_instance(); + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/SDCard.h b/Marlin/src/HAL/GD32_MFL/SDCard.h new file mode 100644 index 0000000000..467482a605 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/SDCard.h @@ -0,0 +1,214 @@ +// +// MFL gd32f30x SDCARD using DMA through SDIO in C++ +// +// Copyright (C) 2025 B. Mourit +// +// This software is free software: you can redistribute it and/or modify it under the terms of the +// GNU Lesser General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// This software 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along with this software. +// If not, see . +// +#pragma once + +#include "../../inc/MarlinConfig.h" + +#include "SDIO.hpp" + +namespace sdio { + +class DMA; + +class CardDMA { +public: + static CardDMA& get_instance(); + + SDIO_Error_Type init(); + SDIO_Error_Type card_init(); + SDIO_Error_Type begin_startup_procedure(); + void begin_shutdown_procedure(); + // Configuration + SDIO_Error_Type set_hardware_bus_width(Bus_Width width); + // Main read/write functions for single and multiblock transfers + SDIO_Error_Type read(uint8_t* buf, uint32_t address, uint32_t count); + SDIO_Error_Type write(uint8_t* buf, uint32_t address, uint32_t count); + // DMA transfers + // Other card functions + SDIO_Error_Type erase(uint32_t address_start, uint32_t address_end); + // Interrupt handler + void handle_interrupts(); + // Card select + SDIO_Error_Type select_deselect(); + + SDIO_Error_Type get_card_interface_status(uint32_t* status); + SDIO_Error_Type get_sdcard_status(uint32_t* status); + + void check_dma_complete(); + SDIO_Error_Type stop_transfer(); + + Transfer_State get_transfer_state(); + uint32_t get_card_capacity() const; + + SDIO_Error_Type send_bus_width_command(uint32_t width_value); + + SDIO_Error_Type get_card_specific_data(Card_Info* info); + constexpr Block_Size get_data_block_size_index(uint16_t size); + + SDIO_Error_Type get_card_state(Card_State* card_state); + SDIO_Error_Type check_sdio_status(Command_Index index = Command_Index::INVALID, bool check_index = false, bool ignore_crc = false); + + // DMA configuration + void set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write); + + // SDIO configuration + void sdio_configure(const SDIO_Config config) { sdio_.init(config); } + + // Varaible stored parameters + SDIO_Error_Type get_scr(uint16_t rca, uint32_t* scr); + SDIO_Error_Type store_cid(); + SDIO_Error_Type store_csd(); + + // Accessor methods + SDIO_Config& get_config() { return config_; } + dma::DMA& get_dma_instance() { return dma_; } + void set_data_end_interrupt() { sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, true); } + void set_sdio_dma_enable(bool enable) { sdio_.set_dma_enable(enable); } + bool get_is_sdio_rx() { return is_rx_; } + void clear_sdio_data_flags() { sdio_.clear_multiple_interrupt_flags(clear_data_flags); } + void clear_sdio_cmd_flags() { sdio_.clear_multiple_interrupt_flags(clear_command_flags); } + void clear_sdio_common_flags() { sdio_.clear_multiple_interrupt_flags(clear_common_flags); } + Operational_State get_state() { return current_state_; } + void set_state(Operational_State state) { current_state_ = state; } + void set_transfer_end(bool value) { transfer_end_ = value; } + void set_transfer_error(SDIO_Error_Type error) { transfer_error_ = error; } + + inline SDIO_Error_Type set_desired_clock(uint32_t desired_clock, bool wide_bus, bool low_power) { + sdio_.init({ + desired_clock, + Clock_Edge::RISING_EDGE, + wide_bus ? Bus_Width::WIDTH_4BIT : Bus_Width::WIDTH_1BIT, + false, + low_power, + false + }); + sync_domains(); + desired_clock_ = desired_clock; + + return SDIO_Error_Type::OK; + } + +private: + CardDMA(); + + // Prevent copying or assigning + CardDMA(const CardDMA&) = delete; + CardDMA& operator=(const CardDMA&) = delete; + + // Helper function + SDIO_Error_Type wait_for_card_ready(); + + // Member variables + alignas(4) uint32_t sdcard_csd_[4]; + alignas(4) uint32_t sdcard_cid_[4]; + alignas(4) uint32_t sdcard_scr_[2]; + uint32_t desired_clock_; + uint32_t stop_condition_; + uint32_t total_bytes_; + uint32_t count_; + SDIO& sdio_; + SDIO_Config& config_; + const dma::DMA_Base dmaBase_; + const dma::DMA_Channel dmaChannel_; + dma::DMA& dma_; + uint16_t sdcard_rca_; + SDIO_Error_Type transfer_error_; + Interface_Version interface_version_; + Card_Type card_type_; + volatile bool transfer_end_; + volatile bool is_rx_; + volatile bool multiblock_; + volatile Operational_State current_state_; + + // Private helper methods + SDIO_Error_Type validate_voltage(); + SDIO_Error_Type get_r1_result(Command_Index index); + //SDIO_Error_Type get_r2_r3_result(); + SDIO_Error_Type get_r6_result(Command_Index index, uint16_t* rca); + SDIO_Error_Type get_r7_result(); + //SDIO_Error_Type get_r1_error_type(uint32_t response); + SDIO_Error_Type get_command_sent_result(); + + inline void sync_domains() { + delayMicroseconds(8); + } + + inline bool validate_transfer_params(uint32_t* buf, uint16_t size) { + if (buf == nullptr) return false; + // Size must be > 0, <= 2048 and power of 2 + if ((size == 0U) || (size > 2048U) || (size & (size - 1U))) { + return false; + } + return true; + } + + void process_sdsc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) { + info->csd.device_size = (static_cast(csd_bytes[6] & 0x03U) << 10U) | + (static_cast(csd_bytes[7]) << 2U) | + (static_cast((csd_bytes[8] & 0xC0U) >> 6U)); + info->csd.device_size_multiplier = static_cast((csd_bytes[9] & 0x03U) << 1U | + (csd_bytes[10] & 0x80U) >> 7U); + + info->block_size = static_cast(1 << info->csd.read_block_length); + info->capacity = static_cast((info->csd.device_size + 1U) * + (1U << (info->csd.device_size_multiplier + 2U)) * + info->block_size); + } + + void process_sdhc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) { + info->csd.device_size = static_cast((csd_bytes[7] & 0x3FU) << 16U) | + static_cast((csd_bytes[8]) << 8U) | + static_cast(csd_bytes[9]); + + info->block_size = BLOCK_SIZE; + info->capacity = static_cast((info->csd.device_size + 1U) * + BLOCK_SIZE * KILOBYTE); + } + + void process_common_csd_tail(Card_Info* info, const uint8_t* csd_bytes) { + info->csd.sector_size = static_cast(((csd_bytes[9] & 0x3FU) << 1U) | + (csd_bytes[10] & 0x80U) >> 7U); + info->csd.speed_factor = static_cast((csd_bytes[11] & 0x1CU) >> 2U); + info->csd.write_block_length = static_cast(((csd_bytes[11] & 0x03U) << 2U) | + ((csd_bytes[12] & 0xC0U) >> 6U)); + info->csd.checksum = static_cast((csd_bytes[15] & 0xFEU) >> 1U); + } + + inline void disable_all_interrupts() { + sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::STBITEIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::TFHIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::RFHIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::TXUREIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::RXOREIE, false); + } + + template + inline SDIO_Error_Type send_command_and_check(Command_Index command, uint32_t argument, + Command_Response response, Wait_Type type, CheckFunc check_result) { + sdio_.set_command_state_machine(command, argument, response, type); + sync_domains(); + sdio_.set_command_state_machine_enable(true); + return check_result(); + } +}; + +} // namespace sdio + +extern sdio::CardDMA& CardDMA_I; diff --git a/Marlin/src/HAL/GD32_MFL/Servo.cpp b/Marlin/src/HAL/GD32_MFL/Servo.cpp new file mode 100644 index 0000000000..6cbcbc049b --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/Servo.cpp @@ -0,0 +1,125 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "Servo.h" + +static uint_fast8_t servoCount = 0; +static libServo* servos[NUM_SERVOS] = {0}; +constexpr millis_t servoDelay[] = SERVO_DELAY; +static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + +// Initialize to the default timer priority. This will be overridden by a call from timers.cpp. +// This allows all timer interrupt priorities to be managed from a single location in the HAL. +static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 12, 0); + +// This must be called after the MFL Servo class has initialized the timer. +// To be safe this is currently called after every call to attach(). +static void fixServoTimerInterruptPriority() { + auto& servoTimerIdx = GeneralTimer::get_instance(static_cast(TIMER_SERVO)); + NVIC_SetPriority(servoTimerIdx.getTimerUpIRQ(), servo_interrupt_priority); +} + +// Default constructor for libServo class. +// Initializes the servo delay, pause state, and pause value. +// Registers the servo instance in the servos array. +libServo::libServo() : + delay(servoDelay[servoCount]), + was_attached_before_pause(false), + value_before_pause(0) +{ + servos[servoCount++] = this; +} + +// Attaches a servo to a specified pin. +int8_t libServo::attach(const int pin) { + if (servoCount >= MAX_SERVOS) return -1; + if (pin > 0) servoPin = pin; + auto result = mflServo.attach(servoPin); + fixServoTimerInterruptPriority(); + return result; +} + +// Attaches a servo to a specified pin with minimum and maximum pulse widths. +int8_t libServo::attach(const int pin, const int min, const int max) { + if (servoCount >= MAX_SERVOS) return -1; + if (pin > 0) servoPin = pin; + auto result = mflServo.attach(servoPin, min, max); + fixServoTimerInterruptPriority(); + return result; +} + +// Moves the servo to a specified position. +void libServo::move(const int value) { + if (attach(0) >= 0) { + mflServo.write(value); + safe_delay(delay); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} + +// Pause the servo by detaching it and storing its current state. +void libServo::pause() { + was_attached_before_pause = mflServo.attached(); + if (was_attached_before_pause) { + value_before_pause = mflServo.read(); + mflServo.detach(); + } +} + +// Resume a previously paused servo. +// If the servo was attached before the pause, this function re-attaches +// the servo and moves it to the position it was in before the pause. +void libServo::resume() { + if (was_attached_before_pause) { + attach(); + move(value_before_pause); + } +} + +// Pause all servos by stopping their timers. +void libServo::pause_all_servos() { + for (auto& servo : servos) + if (servo) servo->pause(); +} + +// Resume all paused servos by starting their timers. +void libServo::resume_all_servos() { + for (auto& servo : servos) + if (servo) servo->resume(); +} + +// Set the interrupt priority for the servo. +// @param preemptPriority The preempt priority level. +// @param subPriority The sub priority level. +void libServo::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) { + servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority); +} + +#endif // HAS_SERVOS +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/Servo.h b/Marlin/src/HAL/GD32_MFL/Servo.h new file mode 100644 index 0000000000..80cff46ff8 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/Servo.h @@ -0,0 +1,56 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +#include + +#include "../../core/millis_t.h" + +// Inherit and expand on the official library +class libServo { +public: + libServo(); + + int8_t attach(const int pin = 0); // pin == 0 uses value from previous call + int8_t attach(const int pin, const int min, const int max); + void detach() { mflServo.detach(); } + + int read() { return mflServo.read(); } + void move(const int value); + + void pause(); + void resume(); + + static void pause_all_servos(); + static void resume_all_servos(); + + static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); + +private: + Servo mflServo; + + int servoPin = 0; + millis_t delay = 0; + + bool was_attached_before_pause; + int value_before_pause; +}; diff --git a/Marlin/src/HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp b/Marlin/src/HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp new file mode 100644 index 0000000000..b36cbfe44d --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp @@ -0,0 +1,129 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm / Ryan Power + * + * 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 . + * + */ + +#ifdef ARDUINO_ARCH_MFL + +#include "../../../inc/MarlinConfig.h" + +#if ALL(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) + +#include +#include "../../shared/HAL_SPI.h" + +#define nop asm volatile ("\tnop\n") + +static inline uint8_t swSpiTransfer_mode_0(uint8_t b) { + for (uint8_t i = 0; i < 8; ++i) { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + WRITE(DOGLCD_SCK, HIGH); + WRITE(DOGLCD_MOSI, state); + b <<= 1; + WRITE(DOGLCD_SCK, LOW); + } + return b; +} + +static inline uint8_t swSpiTransfer_mode_3(uint8_t b) { + for (uint8_t i = 0; i < 8; ++i) { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + WRITE(DOGLCD_SCK, LOW); + WRITE(DOGLCD_MOSI, state); + b <<= 1; + WRITE(DOGLCD_SCK, HIGH); + } + return b; +} + +static void u8g_sw_spi_shift_out(uint8_t val) { + #if U8G_SPI_USE_MODE_3 + swSpiTransfer_mode_3(val); + #else + swSpiTransfer_mode_0(val); + #endif +} + +static void swSpiInit() { + #if PIN_EXISTS(LCD_RESET) + SET_OUTPUT(LCD_RESET_PIN); + #endif + SET_OUTPUT(DOGLCD_A0); + OUT_WRITE(DOGLCD_SCK, LOW); + OUT_WRITE(DOGLCD_MOSI, LOW); + OUT_WRITE(DOGLCD_CS, HIGH); +} + +uint8_t u8g_com_HAL_MFL_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + swSpiInit(); + break; + case U8G_COM_MSG_STOP: + break; + case U8G_COM_MSG_RESET: + #if PIN_EXISTS(LCD_RESET) + WRITE(LCD_RESET_PIN, arg_val); + #endif + break; + case U8G_COM_MSG_CHIP_SELECT: + #if U8G_SPI_USE_MODE_3 // This LCD SPI is running mode 3 while SD card is running mode 0 + if (arg_val) { // SCK idle state needs to be set to the proper idle state before + // the next chip select goes active + WRITE(DOGLCD_SCK, HIGH); // Set SCK to mode 3 idle state before CS goes active + WRITE(DOGLCD_CS, LOW); + nop; // Hold SCK high for a few ns + nop; + } + else { + WRITE(DOGLCD_CS, HIGH); + WRITE(DOGLCD_SCK, LOW); // Set SCK to mode 0 idle state after CS goes inactive + } + #else + WRITE(DOGLCD_CS, !arg_val); + #endif + break; + case U8G_COM_MSG_WRITE_BYTE: + u8g_sw_spi_shift_out(arg_val); + break; + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t* ptr = (uint8_t*)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_shift_out(*ptr++); + arg_val--; + } + } break; + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t* ptr = (uint8_t*)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_shift_out(u8g_pgm_read(ptr)); + ptr++; + arg_val--; + } + } break; + case U8G_COM_MSG_ADDRESS: // Define cmd (arg_val = 0) or data mode (arg_val = 1) + WRITE(DOGLCD_A0, arg_val); + break; + } + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB && FORCE_SOFT_SPI +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp b/Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp new file mode 100644 index 0000000000..2d3329c7f6 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp @@ -0,0 +1,93 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(IIC_BL24CXX_EEPROM) + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #error "MARLIN_EEPROM_SIZE is required for IIC_BL24CXX_EEPROM." +#endif + +size_t PersistentStore::capacity() { + return MARLIN_EEPROM_SIZE - eeprom_exclude_size; +} + +bool PersistentStore::access_start() { + eeprom_init(); + return true; +} + +bool PersistentStore::access_finish() { + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; + while (size--) { + uint8_t v = *value; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); + // EPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (++written & 0x7F) delay(4); else safe_delay(4); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); + return true; + } + } + + crc16(crc, &v, 1); + pos++; + value++; + } + + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + + return false; +} + +#endif // IIC_BL24CXX_EEPROM +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp b/Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp new file mode 100644 index 0000000000..96eebea122 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ + +/** + * Platform-independent Arduino functions for I2C EEPROM. + * Enable USE_SHARED_EEPROM if not supplied by the framework. + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(IIC_BL24CXX_EEPROM) + +#include "../../libs/BL24CXX.h" +#include "../shared/eeprom_if.h" + +void eeprom_init() { + BL24CXX::init(); +} + +void eeprom_write_byte(uint8_t *pos, uint8_t value) { + const unsigned eeprom_address = (unsigned)pos; + return BL24CXX::writeOneByte(eeprom_address, value); +} + +uint8_t eeprom_read_byte(uint8_t *pos) { + const unsigned eeprom_address = (unsigned)pos; + return BL24CXX::readOneByte(eeprom_address); +} + +#endif // IIC_BL24CXX_EEPROM +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp b/Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp new file mode 100644 index 0000000000..58a6f85e7f --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp @@ -0,0 +1,96 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) +#endif + +size_t PersistentStore::capacity() { + return MARLIN_EEPROM_SIZE - eeprom_exclude_size; +} + +bool PersistentStore::access_start() { + eeprom_init(); + return true; +} + +bool PersistentStore::access_finish() { + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; + while (size--) { + uint8_t v = *value; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + // Avoid triggering watchdog during long EEPROM writes + if (++written & 0x7F) + delay(2); + else + safe_delay(2); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + } + + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); + if (writing) + *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/endstop_interrupts.h b/Marlin/src/HAL/GD32_MFL/endstop_interrupts.h new file mode 100644 index 0000000000..175dec3959 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/endstop_interrupts.h @@ -0,0 +1,61 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) + TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(USE_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN)); + TERN_(USE_CALIBRATION, _ATTACH(CALIBRATION_PIN)); + TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); + TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); + TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); + TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); + TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); + TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); + TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); + TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); + TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); + TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); + TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); + TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); +} diff --git a/Marlin/src/HAL/GD32_MFL/fast_pwm.cpp b/Marlin/src/HAL/GD32_MFL/fast_pwm.cpp new file mode 100644 index 0000000000..9fba673efc --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/fast_pwm.cpp @@ -0,0 +1,97 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#include +#include +#include "timers.h" + +static uint16_t timer_frequency[TIMER_COUNT]; + +void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t value, const uint16_t scale, const bool invert) { + // Calculate duty cycle based on inversion flag + const uint16_t duty = invert ? scale - value : value; + + // Check if the pin supports PWM + if (PWM_PIN(pin)) { + // Get the timer peripheral base associated with the pin + const auto timer_base = getPinOpsPeripheralBase(TIMER_PinOps, static_cast(pin)); + + // Initialize the timer instance + auto& TimerInstance = GeneralTimer::get_instance(timer_base); + + // Get channel and previous channel mode + const auto channel = getPackedPinChannel(getPackedPinOps(TIMER_PinOps, static_cast(pin))); + const InputOutputMode previous = TimerInstance.getChannelMode(channel); + + if (timer_frequency[static_cast(timer_base)] == 0) { + set_pwm_frequency(pin, PWM_FREQUENCY); + } + + // Set the PWM duty cycle + TimerInstance.setCaptureCompare(channel, duty, CCFormat::B8); + + // Configure pin as PWM output + pinOpsPinout(TIMER_PinOps, static_cast(pin)); + + // Set channel mode if not already set and start timer + if (previous != InputOutputMode::PWM0) { + TimerInstance.setChannelMode(channel, InputOutputMode::PWM0, static_cast(pin)); + TimerInstance.start(); + } + } else { + pinMode(pin, OUTPUT); + digitalWrite(pin, duty < scale / 2 ? LOW : HIGH); + } +} + +void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) { + // Check if the pin supports PWM + if (!PWM_PIN(pin)) return; + + // Get the timer peripheral base associated with the pin + const auto timer_base = getPinOpsPeripheralBase(TIMER_PinOps, static_cast(pin)); + + // Guard against modifying protected timers + #ifdef STEP_TIMER + if (timer_base == static_cast(STEP_TIMER)) return; + #endif + #ifdef TEMP_TIMER + if (timer_base == static_cast(TEMP_TIMER)) return; + #endif + #if defined(PULSE_TIMER) && MF_TIMER_PULSE != MF_TIMER_STEP + if (timer_base == static_cast(PULSE_TIMER)) return; + #endif + + // Initialize the timer instance + auto& TimerInstance = GeneralTimer::get_instance(timer_base); + + TimerInstance.setRolloverValue(f_desired, TimerFormat::HERTZ); + timer_frequency[timer_base_to_index(timer_base)] = f_desired; +} + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/fastio.h b/Marlin/src/HAL/GD32_MFL/fastio.h new file mode 100644 index 0000000000..8185be73a4 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/fastio.h @@ -0,0 +1,82 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +// Fast I/O interfaces for GD32F303RE + +#include +#include +#include + +static inline void fast_write_pin_wrapper(pin_size_t IO, bool V) { + if (V) gpio::fast_set_pin(getPortFromPin(IO), getPinInPort(IO)); + else gpio::fast_clear_pin(getPortFromPin(IO), getPinInPort(IO)); +} + +static inline bool fast_read_pin_wrapper(pin_size_t IO) { + return gpio::fast_read_pin(getPortFromPin(IO), getPinInPort(IO)); +} + +static inline void fast_toggle_pin_wrapper(pin_size_t IO) { + gpio::fast_toggle_pin(getPortFromPin(IO), getPinInPort(IO)); +} + +// ------------------------ +// Defines +// ------------------------ + +#ifndef PWM + #define PWM OUTPUT +#endif + +#define _WRITE(IO, V) fast_write_pin_wrapper(IO, V) +#define _READ(IO) fast_read_pin_wrapper(IO) +#define _TOGGLE(IO) fast_toggle_pin_wrapper(IO) + +#define _GET_MODE(IO) +#define _SET_MODE(IO, M) pinMode((IO), (M)) +#define _SET_OUTPUT(IO) pinMode((IO), OUTPUT) +#define _SET_OUTPUT_OD(IO) pinMode((IO), OUTPUT_OPEN_DRAIN) + +#define WRITE(IO, V) _WRITE((IO), (V)) +#define READ(IO) _READ(IO) +#define TOGGLE(IO) _TOGGLE(IO) + +#define OUT_WRITE(IO, V) do { _SET_OUTPUT(IO); WRITE((IO), (V)); } while (0) +#define OUT_WRITE_OD(IO, V) do { _SET_OUTPUT_OD(IO); WRITE((IO), (V)); } while (0) + +#define SET_INPUT(IO) _SET_MODE((IO), INPUT) +#define SET_INPUT_PULLUP(IO) _SET_MODE((IO), INPUT_PULLUP) +#define SET_INPUT_PULLDOWN(IO) _SET_MODE((IO), INPUT_PULLDOWN) +#define SET_OUTPUT(IO) OUT_WRITE((IO), LOW) +#define SET_OUTPUT_OD(IO) OUT_WRITE_OD((IO), LOW) +#define SET_PWM(IO) _SET_MODE((IO), PWM) + +#define IS_INPUT(IO) +#define IS_OUTPUT(IO) + +#define PWM_PIN(P) isPinInPinOps(TIMER_PinOps, P) +#define NO_COMPILE_TIME_PWM + +// Wrappers for digitalRead and digitalWrite +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO, V) digitalWrite((IO), (V)) diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_LCD.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_LCD.h new file mode 100644 index 0000000000..379ecfa7f0 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +#if ALL(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) + #define U8G_SW_SPI_MFL 1 +#endif diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_adv.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_adv.h new file mode 100644 index 0000000000..6df84f6f92 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_adv.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +#if ALL(HAS_MEDIA, USBD_USE_CDC_MSC) + #define HAS_SD_HOST_DRIVE 1 +#endif diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_post.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_post.h new file mode 100644 index 0000000000..a3db122682 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_post.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +// If no real or emulated EEPROM selected, fall back to SD emulation +#if USE_FALLBACK_EEPROM + #define SDCARD_EEPROM_EMULATION +#elif ANY(I2C_EEPROM, SPI_EEPROM) + #define USE_SHARED_EEPROM 1 +#endif diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_type.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_type.h new file mode 100644 index 0000000000..92cc457df5 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_type.h @@ -0,0 +1,22 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once diff --git a/Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h b/Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h new file mode 100644 index 0000000000..366765dcd5 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h @@ -0,0 +1,97 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +// Test MFL GD32 specific configuration values for errors at compile-time. +#if ENABLED(SDCARD_EEPROM_EMULATION) && !HAS_MEDIA + #undef SDCARD_EEPROM_EMULATION // avoid additional error noise + #if USE_FALLBACK_EEPROM + #warning "EEPROM type not specified. Fallback is SDCARD_EEPROM_EMULATION." + #endif + #error "SDCARD_EEPROM_EMULATION requires SDSUPPORT. Enable SDSUPPORT or choose another EEPROM emulation." +#endif + +#if ENABLED(FLASH_EEPROM_LEVELING) + #error "FLASH_EEPROM_LEVELING is not supported on GD32." +#endif + +#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on GD32." +#elif ENABLED(SERIAL_STATS_DROPPED_RX) + #error "SERIAL_STATS_DROPPED_RX is not supported on GD32." +#endif + +#if TEMP_SENSOR_SOC && defined(ATEMP) && TEMP_SOC_PIN != ATEMP + #error "TEMP_SENSOR_SOC requires 'TEMP_SOC_PIN ATEMP' on GD32" +#endif + +// Check for common serial pin conflicts +#define _CHECK_SERIAL_PIN(N) (( \ + BTN_EN1 == N || BTN_EN2 == N || DOGLCD_CS == N || HEATER_BED_PIN == N || FAN0_PIN == N || \ + SDIO_D2_PIN == N || SDIO_D3_PIN == N || SDIO_CK_PIN == N || SDIO_CMD_PIN == N || \ + Y_STEP_PIN == N || Y_ENABLE_PIN == N || E0_ENABLE_PIN == N || POWER_LOSS_PIN == N \ + )) + +#define CHECK_SERIAL_PIN(T, N) defined(UART##N##_##T##_PIN) && _CHECK_SERIAL_PIN(UART##N##_##T##_PIN) + +#if SERIAL_IN_USE(0) + #if CHECK_SERIAL_PIN(TX, 0) + #error "Serial Port 0 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 0) + #error "Serial Port 0 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(1) + #if CHECK_SERIAL_PIN(TX, 1) + #error "Serial Port 1 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 1) + #error "Serial Port 1 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(2) + #if CHECK_SERIAL_PIN(TX, 2) + #error "Serial Port 2 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 2) + #error "Serial Port 2 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(3) + #if CHECK_SERIAL_PIN(TX, 3) + #error "Serial Port 3 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 3) + #error "Serial Port 3 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(4) + #if CHECK_SERIAL_PIN(TX, 4) + #error "Serial Port 4 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 4) + #error "Serial Port 4 RX IO pins conflict with another pin on the board." + #endif +#endif +#undef CHECK_SERIAL_PIN +#undef _CHECK_SERIAL_PIN diff --git a/Marlin/src/HAL/GD32_MFL/pinsDebug.h b/Marlin/src/HAL/GD32_MFL/pinsDebug.h new file mode 100644 index 0000000000..d3b3794df2 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/pinsDebug.h @@ -0,0 +1,102 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +/** + * Pins Debugging for GD32 + * + * - NUMBER_PINS_TOTAL + * - MULTI_NAME_PAD + * - getPinByIndex(index) + * - printPinNameByIndex(index) + * - getPinIsDigitalByIndex(index) + * - digitalPinToAnalogIndex(pin) + * - getValidPinMode(pin) + * - isValidPin(pin) + * - isAnalogPin(pin) + * - digitalRead_mod(pin) + * - pwm_status(pin) + * - printPinPWM(pin) + * - printPinPort(pin) + * - printPinNumber(pin) + * - printPinAnalog(pin) + */ + +#include "../../inc/MarlinConfig.h" +#include +#include +#include + +#ifndef TOTAL_PIN_COUNT + #error "Expected TOTAL_PIN_COUNT not found." +#endif + +#define NUM_DIGITAL_PINS TOTAL_PIN_COUNT +#define NUMBER_PINS_TOTAL TOTAL_PIN_COUNT + +#define getPinByIndex(x) pin_t(pin_array[x].pin) +#define isValidPin(P) WITHIN(P, 0, (NUM_DIGITAL_PINS - 1)) +#define digitalRead_mod(P) extDigitalRead(P) +#define printPinNumber(P) do { sprintf_P(buffer, PSTR("%3hd "), pin_t(P)); SERIAL_ECHO(buffer); } while (0) +#define printPinAnalog(P) do { sprintf_P(buffer, PSTR(" (A%2d) "), pin_t(getAdcChannelFromPin(P))); SERIAL_ECHO(buffer); } while (0) +#define printPinNameByIndex(x) do { sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); } while (0) + +#define MULTI_NAME_PAD 21 // Space needed to be pretty if not first name assigned to a pin + +#ifndef M43_NEVER_TOUCH + #define M43_NEVER_TOUCH(x) WITHIN(x, 9, 10) // SERIAL pins: PA9(TX) PA10(RX) +#endif + +bool isAnalogPin(const pin_t pin) { + if (!isValidPin(pin)) return false; + + if (getAdcChannel(pin) != adc::ADC_Channel::INVALID) { + auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value(); + return instance.get_pin_mode(getPinInPort(pin)) == gpio::Pin_Mode::ANALOG && !M43_NEVER_TOUCH(pin); + } + + return false; +} + +bool getValidPinMode(const pin_t pin) { + if (!isValidPin(pin)) return false; + + auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value(); + gpio::Pin_Mode mode = instance.get_pin_mode(getPinInPort(pin)); + + return mode != gpio::Pin_Mode::ANALOG && mode != gpio::Pin_Mode::INPUT_FLOATING && + mode != gpio::Pin_Mode::INPUT_PULLUP && mode != gpio::Pin_Mode::INPUT_PULLDOWN; +} + +bool getPinIsDigitalByIndex(const int16_t index) { + const pin_t pin = getPinByIndex(index); + return (!isAnalogPin(pin)); +} + +int8_t digitalPinToAnalogIndex(const pin_t pin) { + if (!isValidPin(pin) || !isAnalogPin(pin)) return -1; + return pin; // Analog and digital pin indexes are shared +} + +bool pwm_status(const pin_t pin) { return false; } +void printPinPWM(const pin_t pin) { /* TODO */ } +void printPinPort(const pin_t pin) { /* TODO */ } diff --git a/Marlin/src/HAL/GD32_MFL/sdio.cpp b/Marlin/src/HAL/GD32_MFL/sdio.cpp new file mode 100644 index 0000000000..4b6d75d74f --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/sdio.cpp @@ -0,0 +1,233 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(ONBOARD_SDIO) + +#include +#include +#include "SDCard.h" +#include "sdio.h" + +using namespace sdio; + +#define TARGET_CLOCK 6000000U +#define BLOCK_SIZE 512U +#define CARD_TIMEOUT 500 // ms +#define READ_RETRIES 3U + +inline constexpr uint32_t TARGET_SDIO_CLOCK = TARGET_CLOCK; +inline constexpr uint32_t SDIO_BLOCK_SIZE = BLOCK_SIZE; +inline constexpr uint32_t SD_TIMEOUT = CARD_TIMEOUT; +inline constexpr uint8_t SDIO_READ_RETRIES = READ_RETRIES; + +Card_State cardState = Card_State::READY; + +bool SDIO_SetBusWidth(Bus_Width width) { + return (CardDMA_I.set_hardware_bus_width(width) == SDIO_Error_Type::OK); +} + +void mfl_sdio_init() { + pinOpsPinout(SD_CMD_PinOps, static_cast(SDIO_CMD_PIN)); + pinOpsPinout(SD_CK_PinOps, static_cast(SDIO_CK_PIN)); + pinOpsPinout(SD_DATA0_PinOps, static_cast(SDIO_D0_PIN)); + pinOpsPinout(SD_DATA1_PinOps, static_cast(SDIO_D1_PIN)); + pinOpsPinout(SD_DATA2_PinOps, static_cast(SDIO_D2_PIN)); + pinOpsPinout(SD_DATA3_PinOps, static_cast(SDIO_D3_PIN)); + + NVIC_EnableIRQ(DMA1_Channel3_4_IRQn); + NVIC_EnableIRQ(SDIO_IRQn); +} + +bool SDIO_Init() { + SDIO_Error_Type result = SDIO_Error_Type::OK; + uint8_t retryCount = SDIO_READ_RETRIES; + + mfl_sdio_init(); + + uint8_t retries = retryCount; + for (;;) { + hal.watchdog_refresh(); + result = CardDMA_I.init(); + if (result == SDIO_Error_Type::OK) break; + if (!--retries) return false; + } + + CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, false, false); + + retries = retryCount; + for (;;) { + hal.watchdog_refresh(); + if (SDIO_SetBusWidth(Bus_Width::WIDTH_4BIT)) break; + if (!--retries) break; + } + + CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, true, true); + + // Fallback + if (!retries) { + mfl_sdio_init(); + retries = retryCount; + for (;;) { + hal.watchdog_refresh(); + result = CardDMA_I.init(); + if (result == SDIO_Error_Type::OK) break; + if (!--retries) return false; + } + CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, false, true); + } + + return true; +} + +static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t* src, uint8_t* dst) { + hal.watchdog_refresh(); + SDIO_Error_Type result = SDIO_Error_Type::OK; + + // Write + if (src) { + result = CardDMA_I.write(reinterpret_cast(const_cast(src)), block, 1); + } + // Read + else { + result = CardDMA_I.read(dst, block, 1); + } + + if (result != SDIO_Error_Type::OK) { + return false; + } + + millis_t timeout = millis() + SD_TIMEOUT; + while (CardDMA_I.get_state() != sdio::Operational_State::READY) { + if (ELAPSED(millis(), timeout)) { + return false; + } + } + + CardDMA_I.check_dma_complete(); + + timeout = millis() + SD_TIMEOUT; + do { + result = CardDMA_I.get_card_state(&cardState); + if (ELAPSED(millis(), timeout)) { + return false; + } + } while (result == SDIO_Error_Type::OK && cardState != sdio::Card_State::TRANSFER); + + return true; +} + +bool SDIO_ReadBlock(uint32_t block, uint8_t* dst) { + // Check if the address is aligned to 4 bytes + if (reinterpret_cast(dst) & 0x03) { + return false; + } + + uint8_t retries = SDIO_READ_RETRIES; + while (retries--) { + if (SDIO_ReadWriteBlock_DMA(block, nullptr, dst)) { + return true; + } + } + + return false; +} + +bool SDIO_WriteBlock(uint32_t block, const uint8_t* src) { + // Check if the address is aligned to 4 bytes + if (reinterpret_cast(src) & 0x03) { + return false; + } + + uint8_t retries = SDIO_READ_RETRIES; + while (retries--) { + if (SDIO_ReadWriteBlock_DMA(block, src, nullptr)) { + return true; + delay(10); + } + } + + return false; +} + +bool SDIO_IsReady() { + return (CardDMA_I.get_state() == sdio::Operational_State::READY); +} + +uint32_t SDIO_GetCardSize() { + return CardDMA_I.get_card_capacity(); +} + +// DMA interrupt handler +void DMA1_IRQHandler() { + auto& dma_instance = CardDMA_I.get_dma_instance(); + bool is_receive = CardDMA_I.get_is_sdio_rx(); + + // Check for Transfer Complete Interrupt + if (dma_instance.get_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_FTFIF)) { + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, false); + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, false); + dma_instance.clear_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_FTFIF); + if (is_receive) { + CardDMA_I.set_sdio_dma_enable(false); + CardDMA_I.clear_sdio_data_flags(); + CardDMA_I.set_state(sdio::Operational_State::READY); + } else { + CardDMA_I.set_data_end_interrupt(); + } + // Signal that transfer is complete + CardDMA_I.set_transfer_end(true); + } + + else if (dma_instance.get_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_ERRIF)) { + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_HTFIE, false); + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, false); + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, false); + // Clear all flags + dma_instance.clear_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_GIF); + // Signal that an error occurred + CardDMA_I.set_transfer_error(SDIO_Error_Type::ERROR); + CardDMA_I.set_state(sdio::Operational_State::READY); + } +} + + +extern "C" { + + void SDIO_IRQHandler(void) { + CardDMA_I.handle_interrupts(); + } + + void DMA1_Channel3_4_IRQHandler(void) { + DMA1_IRQHandler(); + } + +} // extern "C" + + +#endif // ONBOARD_SDIO +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/sdio.h b/Marlin/src/HAL/GD32_MFL/sdio.h new file mode 100644 index 0000000000..b6b027ba77 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/sdio.h @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +#include +#include + +#define SDIO_D0_PIN PC8 +#define SDIO_D1_PIN PC9 +#define SDIO_D2_PIN PC10 +#define SDIO_D3_PIN PC11 +#define SDIO_CK_PIN PC12 +#define SDIO_CMD_PIN PD2 + +void sdio_mfl_init(); +bool SDIO_SetBusWidth(sdio::Bus_Width width); +void DMA1_IRQHandler(dma::DMA_Channel channel); diff --git a/Marlin/src/HAL/GD32_MFL/spi_pins.h b/Marlin/src/HAL/GD32_MFL/spi_pins.h new file mode 100644 index 0000000000..c8a5836838 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/spi_pins.h @@ -0,0 +1,32 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + */ +#pragma once + +// Define SPI Pins: SCK, MISO, MOSI +#ifndef SD_SCK_PIN + #define SD_SCK_PIN PIN_SPI_SCK +#endif +#ifndef SD_MISO_PIN + #define SD_MISO_PIN PIN_SPI_MISO +#endif +#ifndef SD_MOSI_PIN + #define SD_MOSI_PIN PIN_SPI_MOSI +#endif diff --git a/Marlin/src/HAL/GD32_MFL/temp_soc.h b/Marlin/src/HAL/GD32_MFL/temp_soc.h new file mode 100644 index 0000000000..eeb144c422 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/temp_soc.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +#define TS_TYPICAL_V 1.405 +#define TS_TYPICAL_TEMP 25 +#define TS_TYPICAL_SLOPE 4.5 + +// TODO: Implement voltage scaling (calibrated Vrefint) and ADC resolution scaling (when applicable) +#define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) / 1000)) / ((TS_TYPICAL_SLOPE) / 1000) + TS_TYPICAL_TEMP) diff --git a/Marlin/src/HAL/GD32_MFL/timers.cpp b/Marlin/src/HAL/GD32_MFL/timers.cpp new file mode 100644 index 0000000000..5b2c2de7ef --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/timers.cpp @@ -0,0 +1,233 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "timers.h" + +// ------------------------ +// Local defines +// ------------------------ + +#define SWSERIAL_TIMER_IRQ_PRIORITY_DEFAULT 1 // Requires tight bit timing to communicate reliably with TMC drivers +#define SERVO_TIMER_IRQ_PRIORITY_DEFAULT 1 // Requires tight PWM timing to control a BLTouch reliably +#define STEP_TIMER_IRQ_PRIORITY_DEFAULT 2 +#define TEMP_TIMER_IRQ_PRIORITY_DEFAULT 14 // Low priority avoids interference with other hardware and timers + +#ifndef TIMER_IRQ_PRIORITY + #define TIMER_IRQ_PRIORITY 12 +#endif + +#ifndef STEP_TIMER_IRQ_PRIORITY + #define STEP_TIMER_IRQ_PRIORITY STEP_TIMER_IRQ_PRIORITY_DEFAULT +#endif + +#ifndef TEMP_TIMER_IRQ_PRIORITY + #define TEMP_TIMER_IRQ_PRIORITY TEMP_TIMER_IRQ_PRIORITY_DEFAULT +#endif + +#if HAS_TMC_SW_SERIAL + #include + #ifndef SWSERIAL_TIMER_IRQ_PRIORITY + #define SWSERIAL_TIMER_IRQ_PRIORITY SWSERIAL_TIMER_IRQ_PRIORITY_DEFAULT + #endif +#endif + +#if HAS_SERVOS + #include "Servo.h" + #ifndef SERVO_TIMER_IRQ_PRIORITY + #define SERVO_TIMER_IRQ_PRIORITY SERVO_TIMER_IRQ_PRIORITY_DEFAULT + #endif +#endif + +#if ENABLED(SPEAKER) + // The MFL framework default timer priority is 12. The TEMP timer must have lower priority + // than this due to the long running temperature ISR, and STEP timer should higher priority. + #if !(TIMER_IRQ_PRIORITY > STEP_TIMER_IRQ_PRIORITY && TIMER_IRQ_PRIORITY < TEMP_TIMER_IRQ_PRIORITY) + #error "Default timer interrupt priority is unspecified or set to a value which may degrade performance." + #endif +#endif + +#ifndef HAL_TIMER_RATE + #define HAL_TIMER_RATE GetStepperTimerClkFreq() +#endif + +#ifndef STEP_TIMER + #define STEP_TIMER MF_TIMER_STEP +#endif +#ifndef TEMP_TIMER + #define TEMP_TIMER MF_TIMER_TEMP +#endif + +GeneralTimer& Step_Timer = GeneralTimer::get_instance(static_cast(STEP_TIMER)); +GeneralTimer& Temp_Timer = GeneralTimer::get_instance(static_cast(TEMP_TIMER)); + +bool is_step_timer_initialized = false; +bool is_temp_timer_initialized = false; + +// ------------------------ +// Public functions +// ------------------------ + +// Retrieves the clock frequency of the stepper timer +uint32_t GetStepperTimerClkFreq() { + return Step_Timer.getTimerClockFrequency(); +} + +/** + * @brief Starts a hardware timer + * + * If the timer is not already initialized, this function will initialize it with the given frequency. + * The timer is started immediately after initialization + * + * @param timer The timer base index to start + * @param frequency The frequency at which the timer should run + * @return None + */ +void HAL_timer_start(const uint8_t timer_number, const uint32_t frequency) { + if (HAL_timer_initialized(timer_number) || (timer_number != MF_TIMER_STEP && timer_number != MF_TIMER_TEMP)) + return; + + const bool is_step = (timer_number == MF_TIMER_STEP); + const uint8_t priority = is_step ? + static_cast(STEP_TIMER_IRQ_PRIORITY) : + static_cast(TEMP_TIMER_IRQ_PRIORITY); + + // Get the reference of the timer instance + GeneralTimer& timer = is_step ? Step_Timer : Temp_Timer; + + if (is_step) { + timer.setPrescaler(STEPPER_TIMER_PRESCALE); + timer.setRolloverValue(_MIN(static_cast(HAL_TIMER_TYPE_MAX), + (HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)), + TimerFormat::TICK); + is_step_timer_initialized = true; + } + else { + timer.setRolloverValue(frequency, TimerFormat::HERTZ); + is_temp_timer_initialized = true; + } + + timer.setAutoReloadEnable(false); + timer.setInterruptPriority(priority, 0U); + HAL_timer_enable_interrupt(timer_number); + timer.start(); +} + +/** + * @brief Enables the interrupt for the specified timer + * + * @param handle The timer handle for which to enable the interrupt + * @return None + */ +void HAL_timer_enable_interrupt(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + + if (timer_number == MF_TIMER_STEP && !timer.hasInterrupt()) + timer.attachInterrupt(Step_Handler); + else if (timer_number == MF_TIMER_TEMP && !timer.hasInterrupt()) + timer.attachInterrupt(Temp_Handler); +} + +/** + * @brief Disables the interrupt for the specified timer + * + * @param handle The timer handle for which to disable the interrupt + * @return None + */ +void HAL_timer_disable_interrupt(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + if (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) + timer.detachInterrupt(); +} + +/** + * @brief Checks if the interrupt is enabled for the specified timer + * + * @param handle The timer handle to check + * @return True if the interrupt is enabled, false otherwise + */ +bool HAL_timer_interrupt_enabled(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return false; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + return (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) + ? timer.hasInterrupt() + : false; +} + +// Sets the interrupt priorities for timers used by TMC SW serial and servos. +void SetTimerInterruptPriorities() { + TERN_(HAS_TMC_SW_SERIAL, SoftwareSerial::setInterruptPriority(SWSERIAL_TIMER_IRQ_PRIORITY, 0)); + TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIORITY, 0)); +} + +// ------------------------ +// Detect timer conflicts +// ------------------------ + +TERN_(SPEAKER, static constexpr timer::TIMER_Base timer_tone[] = {static_cast(TIMER_TONE)}); +TERN_(HAS_SERVOS, static constexpr timer::TIMER_Base timer_servo[] = {static_cast(TIMER_SERVO)}); + +enum TimerPurpose { + PURPOSE_TONE, + PURPOSE_SERVO, + PURPOSE_STEP, + PURPOSE_TEMP +}; + +// List of timers to check for conflicts +// Includes the timer purpose to ease debugging when evaluating at build-time +// This cannot yet account for timers used for PWM output, such as for fans +static constexpr struct { TimerPurpose p; int t; } timers_in_use[] = { + #if ENABLED(SPEAKER) + { PURPOSE_TONE, timer_base_to_index(timer_tone[0]) }, // Set in variant.h + #endif + #if HAS_SERVOS + { PURPOSE_SERVO, timer_base_to_index(timer_servo[0]) }, // Set in variant.h + #endif + { PURPOSE_STEP, MF_TIMER_STEP }, + { PURPOSE_TEMP, MF_TIMER_TEMP }, +}; + +// Verifies if there are any timer conflicts in the timers_in_use array +static constexpr bool verify_no_timer_conflicts() { + for (uint8_t i = 0; i < COUNT(timers_in_use); i++) + for (uint8_t j = i + 1; j < COUNT(timers_in_use); j++) + if (timers_in_use[i].t == timers_in_use[j].t) + return false; + + return true; +} + +// If this assertion fails at compile time, review the timers_in_use array. +// If default_envs is defined properly in platformio.ini, VSCode can evaluate the array +// when hovering over it, making it easy to identify the conflicting timers +static_assert(verify_no_timer_conflicts(), "One or more timer conflict detected. Examine \"timers_in_use\" to help identify conflict."); + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/timers.h b/Marlin/src/HAL/GD32_MFL/timers.h new file mode 100644 index 0000000000..0eb6bd563a --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/timers.h @@ -0,0 +1,145 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +#include "../../inc/MarlinConfig.h" + +#include + +// ------------------------ +// Defines +// ------------------------ + +// Timer configuration constants +#define STEPPER_TIMER_RATE 2000000 +#define TEMP_TIMER_FREQUENCY 1000 + +// Timer instance definitions +#define MF_TIMER_STEP 3 +#define MF_TIMER_TEMP 1 +#define MF_TIMER_PULSE MF_TIMER_STEP + +#define hal_timer_t uint32_t +#define HAL_TIMER_TYPE_MAX UINT16_MAX + +extern uint32_t GetStepperTimerClkFreq(); + +// Timer prescaler calculations +#define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / STEPPER_TIMER_RATE) // Prescaler = 30 +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Stepper timer ticks per µs +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +// Timer interrupt priorities +#define STEP_TIMER_IRQ_PRIORITY 2 +#define TEMP_TIMER_IRQ_PRIORITY 14 + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) + +extern void Step_Handler(); +extern void Temp_Handler(); + +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() void Step_Handler() +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() void Temp_Handler() +#endif + +extern GeneralTimer& Step_Timer; +extern GeneralTimer& Temp_Timer; + +extern bool is_step_timer_initialized; +extern bool is_temp_timer_initialized; + +// Build-time mapping between timer base and index. Used in timers.cpp and fast_pwm.cpp +static inline constexpr struct {timer::TIMER_Base base; uint8_t timer_number;} base_to_index[] = { + { timer::TIMER_Base::TIMER0_BASE, 0 }, + { timer::TIMER_Base::TIMER1_BASE, 1 }, + { timer::TIMER_Base::TIMER2_BASE, 2 }, + { timer::TIMER_Base::TIMER3_BASE, 3 }, + { timer::TIMER_Base::TIMER4_BASE, 4 }, + { timer::TIMER_Base::TIMER5_BASE, 5 }, + { timer::TIMER_Base::TIMER6_BASE, 6 }, + { timer::TIMER_Base::TIMER7_BASE, 7 } +}; + +// Converts a timer base to an integer timer index. +constexpr int timer_base_to_index(timer::TIMER_Base base) { + for (const auto& timer : base_to_index) { + if (timer.base == base) { + return static_cast(timer.timer_number); + } + } + return -1; +} + +// ------------------------ +// Public functions +// ------------------------ + +void HAL_timer_start(const uint8_t timer, const uint32_t frequency); +void HAL_timer_enable_interrupt(const uint8_t timer); +void HAL_timer_disable_interrupt(const uint8_t timer); +bool HAL_timer_interrupt_enabled(const uint8_t timer); + +// Configure timer priorities for peripherals such as Software Serial or Servos. +// Exposed here to allow all timer priority information to reside in timers.cpp +void SetTimerInterruptPriorities(); + +// FORCE_INLINE because these are used in performance-critical situations +FORCE_INLINE bool HAL_timer_initialized(const uint8_t timer_number) { + return (timer_number == MF_TIMER_STEP) ? is_step_timer_initialized : + (timer_number == MF_TIMER_TEMP) ? is_temp_timer_initialized : + false; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return 0U; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + + return (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) + ? timer.getCounter(TimerFormat::TICK) + : 0U; +} + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_number, const hal_timer_t value) { + if (!HAL_timer_initialized(timer_number)) return; + + const uint32_t new_value = static_cast(value + 1U); + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + + if (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) { + timer.setRolloverValue(new_value, TimerFormat::TICK); + if (value < static_cast(timer.getCounter(TimerFormat::TICK))) + timer.refresh(); + } +} + +#define HAL_timer_isr_prologue(T) NOOP +#define HAL_timer_isr_epilogue(T) NOOP diff --git a/Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h b/Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h new file mode 100644 index 0000000000..720d958779 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +// MFL LCD-specific defines +uint8_t u8g_com_HAL_MFL_sw_spi_fn(u8g_t* u8g, uint8_t msg, uint8_t arg_val, void* arg_ptr); // u8g_com_mfl_swspi.cpp +#define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_MFL_sw_spi_fn diff --git a/Marlin/src/HAL/HC32/eeprom_wired.cpp b/Marlin/src/HAL/HC32/eeprom_wired.cpp index d9be65b4c0..aea5fc87db 100644 --- a/Marlin/src/HAL/HC32/eeprom_wired.cpp +++ b/Marlin/src/HAL/HC32/eeprom_wired.cpp @@ -2,6 +2,9 @@ * Marlin 3D Printer Firmware * Copyright (c) 2023 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 diff --git a/Marlin/src/HAL/HC32/pinsDebug.h b/Marlin/src/HAL/HC32/pinsDebug.h index e80b5a081e..9f8e23ce44 100644 --- a/Marlin/src/HAL/HC32/pinsDebug.h +++ b/Marlin/src/HAL/HC32/pinsDebug.h @@ -2,6 +2,9 @@ * Marlin 3D Printer Firmware * Copyright (c) 2023 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 diff --git a/Marlin/src/HAL/HC32/spi_pins.h b/Marlin/src/HAL/HC32/spi_pins.h index 8a8e054b9b..5f1a94e920 100644 --- a/Marlin/src/HAL/HC32/spi_pins.h +++ b/Marlin/src/HAL/HC32/spi_pins.h @@ -2,6 +2,9 @@ * Marlin 3D Printer Firmware * Copyright (c) 2023 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 diff --git a/Marlin/src/HAL/LINUX/arduino.cpp b/Marlin/src/HAL/LINUX/arduino.cpp index 0a48697a9c..a387a9623e 100644 --- a/Marlin/src/HAL/LINUX/arduino.cpp +++ b/Marlin/src/HAL/LINUX/arduino.cpp @@ -33,8 +33,8 @@ void sei() { } // Enable // Time functions void _delay_ms(const int ms) { delay(ms); } -uint32_t millis() { - return (uint32_t)Clock::millis(); +unsigned long millis() { + return (unsigned long)Clock::millis(); } // This is required for some Arduino libraries we are using diff --git a/Marlin/src/HAL/LINUX/include/Arduino.h b/Marlin/src/HAL/LINUX/include/Arduino.h index f05aaed880..b11e75ccbc 100644 --- a/Marlin/src/HAL/LINUX/include/Arduino.h +++ b/Marlin/src/HAL/LINUX/include/Arduino.h @@ -76,9 +76,9 @@ extern "C" { extern "C" void delay(const int ms); void _delay_ms(const int ms); void delayMicroseconds(unsigned long); -uint32_t millis(); +unsigned long millis(); -//IO functions +// IO functions void pinMode(const pin_t, const uint8_t); void digitalWrite(pin_t, uint8_t); bool digitalRead(pin_t); diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp index e714c3c16d..09603de972 100644 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp @@ -28,7 +28,7 @@ #include "../include/i2c_util.h" #include "../../../core/millis_t.h" -extern int millis(); +uint32_t millis(); #ifdef __cplusplus extern "C" { diff --git a/Marlin/src/HAL/RP2040/pinsDebug.h b/Marlin/src/HAL/RP2040/pinsDebug.h index 964fb71086..f3842c4aff 100644 --- a/Marlin/src/HAL/RP2040/pinsDebug.h +++ b/Marlin/src/HAL/RP2040/pinsDebug.h @@ -107,7 +107,7 @@ uint8_t get_pin_mode(const pin_t Ard_num) { uint dir = gpio_get_dir( Ard_num); - if(dir) return MODE_PIN_OUTPUT; + if (dir) return MODE_PIN_OUTPUT; else return MODE_PIN_INPUT; } diff --git a/Marlin/src/HAL/RP2040/timers.h b/Marlin/src/HAL/RP2040/timers.h index 83fdc0a2fc..512c6ba465 100644 --- a/Marlin/src/HAL/RP2040/timers.h +++ b/Marlin/src/HAL/RP2040/timers.h @@ -131,19 +131,19 @@ FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, hal_time switch (timer_num) { case 0: - alarm_pool_add_alarm_in_us(HAL_timer_pool_0 ,compare , HAL_timer_alarm_pool_0_callback ,0 ,false ); + alarm_pool_add_alarm_in_us(HAL_timer_pool_0, compare, HAL_timer_alarm_pool_0_callback, 0, false); break; case 1: - alarm_pool_add_alarm_in_us(HAL_timer_pool_1 ,compare , HAL_timer_alarm_pool_1_callback ,0 ,false ); + alarm_pool_add_alarm_in_us(HAL_timer_pool_1, compare, HAL_timer_alarm_pool_1_callback, 0, false); break; case 2: - alarm_pool_add_alarm_in_us(HAL_timer_pool_2 ,compare , HAL_timer_alarm_pool_2_callback ,0 ,false ); + alarm_pool_add_alarm_in_us(HAL_timer_pool_2, compare, HAL_timer_alarm_pool_2_callback, 0, false); break; case 3: - alarm_pool_add_alarm_in_us(HAL_timer_pool_3 ,compare , HAL_timer_alarm_pool_3_callback ,0 ,false ); + alarm_pool_add_alarm_in_us(HAL_timer_pool_3, compare, HAL_timer_alarm_pool_3_callback, 0, false); break; } } diff --git a/Marlin/src/HAL/STM32F1/HAL_N32.h b/Marlin/src/HAL/STM32F1/HAL_N32.h index 7162e2b971..8b47ef4b96 100644 --- a/Marlin/src/HAL/STM32F1/HAL_N32.h +++ b/Marlin/src/HAL/STM32F1/HAL_N32.h @@ -239,8 +239,8 @@ typedef struct { #define ADC_WORKMODE_SLOW_INTERL ((uint32_t)0x00080000) #define ADC_WORKMODE_ALTER_TRIG ((uint32_t)0x00090000) -#define ADC_EXT_TRIGCONV_T1_CC3 ((uint32_t)0x00040000) //!< For ADC1, ADC2 , ADC3 and ADC4 -#define ADC_EXT_TRIGCONV_NONE ((uint32_t)0x000E0000) //!< For ADC1, ADC2 , ADC3 and ADC4 +#define ADC_EXT_TRIGCONV_T1_CC3 ((uint32_t)0x00040000) //!< For ADC1, ADC2, ADC3, and ADC4 +#define ADC_EXT_TRIGCONV_NONE ((uint32_t)0x000E0000) //!< For ADC1, ADC2, ADC3, and ADC4 #define ADC_DAT_ALIGN_R ((uint32_t)0x00000000) #define ADC_DAT_ALIGN_L ((uint32_t)0x00000800) @@ -603,9 +603,9 @@ typedef struct { #define DMA_CHCFG7_PINC ((uint16_t)0x0040) //!< Peripheral increment mode #define DMA_CHCFG7_MINC ((uint16_t)0x0080) //!< Memory increment mode -#define DMA_CHCFG7_PSIZE , ((uint16_t)0x0300) //!< PSIZE[1:0] bits (Peripheral size) -#define DMA_CHCFG7_PSIZE_0 ((uint16_t)0x0100) //!< Bit 0 -#define DMA_CHCFG7_PSIZE_1 ((uint16_t)0x0200) //!< Bit 1 +#define DMA_CHCFG7_PSIZE ((uint16_t)0x0300) //!< PSIZE[1:0] bits (Peripheral size) +#define DMA_CHCFG7_PSIZE_0 ((uint16_t)0x0100) //!< Bit 0 +#define DMA_CHCFG7_PSIZE_1 ((uint16_t)0x0200) //!< Bit 1 #define DMA_CHCFG7_MSIZE ((uint16_t)0x0C00) //!< MSIZE[1:0] bits (Memory size) #define DMA_CHCFG7_MSIZE_0 ((uint16_t)0x0400) //!< Bit 0 @@ -627,9 +627,9 @@ typedef struct { #define DMA_CHCFG8_PINC ((uint16_t)0x0040) //!< Peripheral increment mode #define DMA_CHCFG8_MINC ((uint16_t)0x0080) //!< Memory increment mode -#define DMA_CHCFG8_PSIZE , ((uint16_t)0x0300) //!< PSIZE[1:0] bits (Peripheral size) -#define DMA_CHCFG8_PSIZE_0 ((uint16_t)0x0100) //!< Bit 0 -#define DMA_CHCFG8_PSIZE_1 ((uint16_t)0x0200) //!< Bit 1 +#define DMA_CHCFG8_PSIZE ((uint16_t)0x0300) //!< PSIZE[1:0] bits (Peripheral size) +#define DMA_CHCFG8_PSIZE_0 ((uint16_t)0x0100) //!< Bit 0 +#define DMA_CHCFG8_PSIZE_1 ((uint16_t)0x0200) //!< Bit 1 #define DMA_CHCFG8_MSIZE ((uint16_t)0x0C00) //!< MSIZE[1:0] bits (Memory size) #define DMA_CHCFG8_MSIZE_0 ((uint16_t)0x0400) //!< Bit 0 diff --git a/Marlin/src/HAL/STM32F1/sdio.cpp b/Marlin/src/HAL/STM32F1/sdio.cpp index 23f984eff3..258422eba3 100644 --- a/Marlin/src/HAL/STM32F1/sdio.cpp +++ b/Marlin/src/HAL/STM32F1/sdio.cpp @@ -145,7 +145,7 @@ bool SDIO_ReadBlock(uint32_t blockAddress, uint8_t *data) { return false; } -uint32_t millis(); +unsigned long millis(); bool SDIO_WriteBlock(uint32_t blockAddress, const uint8_t *data) { if (SDIO_GetCardState() != SDIO_CARD_TRANSFER) return false; @@ -219,7 +219,7 @@ bool SDIO_CmdAppSetBusWidth(uint32_t rsa, uint32_t argument) { bool SDIO_CmdAppOperCommand(uint32_t sdType) { if (!SDIO_CmdAppCommand(0)) return false; - SDIO_SendCommand(ACMD41_SD_APP_OP_COND , SDMMC_VOLTAGE_WINDOW_SD | sdType); + SDIO_SendCommand(ACMD41_SD_APP_OP_COND, SDMMC_VOLTAGE_WINDOW_SD | sdType); return SDIO_GetCmdResp3(); } diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/u8g/u8g_com_stm32duino_swspi.cpp similarity index 100% rename from Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp rename to Marlin/src/HAL/STM32F1/u8g/u8g_com_stm32duino_swspi.cpp diff --git a/Marlin/src/HAL/TEENSY31_32/fastio.h b/Marlin/src/HAL/TEENSY31_32/fastio.h index 622799ec8c..b582c7bfec 100644 --- a/Marlin/src/HAL/TEENSY31_32/fastio.h +++ b/Marlin/src/HAL/TEENSY31_32/fastio.h @@ -53,17 +53,17 @@ #define _SET_INPUT(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1); \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 0; \ }while(0) #define _SET_OUTPUT(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE|PORT_PCR_DSE; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 1; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 1; \ }while(0) #define _SET_INPUT_PULLUP(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 0; \ }while(0) #define _IS_INPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) diff --git a/Marlin/src/HAL/TEENSY35_36/fastio.h b/Marlin/src/HAL/TEENSY35_36/fastio.h index 622799ec8c..b582c7bfec 100644 --- a/Marlin/src/HAL/TEENSY35_36/fastio.h +++ b/Marlin/src/HAL/TEENSY35_36/fastio.h @@ -53,17 +53,17 @@ #define _SET_INPUT(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1); \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 0; \ }while(0) #define _SET_OUTPUT(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE|PORT_PCR_DSE; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 1; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 1; \ }while(0) #define _SET_INPUT_PULLUP(P) do{ \ CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG, CORE_PIN ## P ## _BIT) = 0; \ }while(0) #define _IS_INPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) diff --git a/Marlin/src/HAL/platforms.h b/Marlin/src/HAL/platforms.h index 36fb792776..e7eea44308 100644 --- a/Marlin/src/HAL/platforms.h +++ b/Marlin/src/HAL/platforms.h @@ -37,6 +37,8 @@ #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/LPC1768/NAME) #elif defined(ARDUINO_ARCH_HC32) #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/HC32/NAME) +#elif defined(ARDUINO_ARCH_MFL) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/GD32_MFL/NAME) #elif defined(__STM32F1__) || defined(TARGET_STM32F1) #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/STM32F1/NAME) #elif defined(ARDUINO_ARCH_STM32) diff --git a/Marlin/src/HAL/shared/servo.h b/Marlin/src/HAL/shared/servo.h index fa75445ed7..0101fcb628 100644 --- a/Marlin/src/HAL/shared/servo.h +++ b/Marlin/src/HAL/shared/servo.h @@ -76,6 +76,8 @@ #include "../LPC1768/Servo.h" #elif defined(ARDUINO_ARCH_HC32) #include "../HC32/Servo.h" +#elif defined(ARDUINO_ARCH_MFL) + #include "../GD32_MFL/Servo.h" #elif defined(__STM32F1__) || defined(TARGET_STM32F1) #include "../STM32F1/Servo.h" #elif defined(ARDUINO_ARCH_STM32) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 689f71f8e5..f2b2589ee6 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -428,8 +428,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { if (gcode.stepper_max_timed_out(ms)) { SERIAL_ERROR_START(); - SERIAL_ECHOPGM(STR_KILL_PRE); - SERIAL_ECHOLNPGM(STR_KILL_INACTIVE_TIME, parser.command_ptr); + SERIAL_ECHOLN(F(STR_KILL_PRE), F(STR_KILL_INACTIVE_TIME), parser.command_ptr); kill(); } @@ -497,8 +496,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { // ---------------------------------------------------------------- if (killCount >= KILL_DELAY) { SERIAL_ERROR_START(); - SERIAL_ECHOPGM(STR_KILL_PRE); - SERIAL_ECHOLNPGM(STR_KILL_BUTTON); + SERIAL_ECHOLN(F(STR_KILL_PRE), F(STR_KILL_BUTTON)); kill(); } #endif @@ -678,14 +676,14 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { TERN_(HOTEND_IDLE_TIMEOUT, hotend_idle.check()); #if ANY(PSU_CONTROL, AUTO_POWER_CONTROL) && PIN_EXISTS(PS_ON_EDM) - if ( ELAPSED(ms, powerManager.last_state_change_ms + PS_EDM_RESPONSE) + if ( ELAPSED(ms, powerManager.last_state_change_ms, PS_EDM_RESPONSE) && (READ(PS_ON_PIN) != READ(PS_ON_EDM_PIN) || TERN0(PSU_OFF_REDUNDANT, extDigitalRead(PS_ON1_PIN) != extDigitalRead(PS_ON1_EDM_PIN))) ) kill(GET_TEXT_F(MSG_POWER_EDM_FAULT)); #endif #if ENABLED(EXTRUDER_RUNOUT_PREVENT) if (thermalManager.degHotend(active_extruder) > (EXTRUDER_RUNOUT_MINTEMP) - && ELAPSED(ms, gcode.previous_move_ms + SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS)) + && ELAPSED(ms, gcode.previous_move_ms, SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS)) && !planner.has_blocks_queued() ) { const int8_t e_stepper = TERN(HAS_SWITCHING_EXTRUDER, active_extruder >> 1, active_extruder); @@ -736,7 +734,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { WRITE(FET_SAFETY_PIN, FET_SAFETY_INVERTED); } #endif -} +} // manage_inactivity() #if ALL(EP_BABYSTEPPING, EMERGENCY_PARSER) #include "feature/babystep.h" @@ -890,7 +888,7 @@ void idle(const bool no_stepper_sleep/*=false*/) { TERN_(MARLIN_DEV_MODE, idle_depth--); return; -} +} // idle() /** * Kill all activity and lock the machine. @@ -983,7 +981,7 @@ void stop() { safe_delay(350); // allow enough time for messages to get out before stopping marlin_state = MarlinState::MF_STOPPED; } -} +} // stop() inline void tmc_standby_setup() { #if PIN_EXISTS(X_STDBY) @@ -1052,7 +1050,7 @@ inline void tmc_standby_setup() { #if PIN_EXISTS(E7_STDBY) SET_INPUT_PULLDOWN(E7_STDBY_PIN); #endif -} +} // tmc_standby_setup() /** * Marlin Firmware entry-point. Abandon Hope All Ye Who Enter Here. @@ -1702,7 +1700,7 @@ void setup() { SETUP_LOG("setup() completed."); TERN_(MARLIN_TEST_BUILD, runStartupTests()); -} +} // setup() /** * The main Marlin program loop diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index c6713d0c98..e7851d001a 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -383,7 +383,7 @@ #define BOARD_CHITU3D_V6 5036 // Chitu3D TronXY X5SA V6 Board (STM32F103ZE) #define BOARD_CHITU3D_V9 5037 // Chitu3D TronXY X5SA V9 Board (STM32F103ZE) #define BOARD_CREALITY_V4 5038 // Creality v4.x (STM32F103RC / STM32F103RE) -#define BOARD_CREALITY_V422 5039 // Creality v4.2.2 (STM32F103RC / STM32F103RE) +#define BOARD_CREALITY_V422 5039 // Creality v4.2.2 (STM32F103RC / STM32F103RE) ... GD32 Variant Below! #define BOARD_CREALITY_V423 5040 // Creality v4.2.3 (STM32F103RC / STM32F103RE) #define BOARD_CREALITY_V425 5041 // Creality v4.2.5 (STM32F103RC / STM32F103RE) #define BOARD_CREALITY_V427 5042 // Creality v4.2.7 (STM32F103RC / STM32F103RE) @@ -549,15 +549,27 @@ // HC32 ARM Cortex-M4 // -#define BOARD_AQUILA_V101 7200 // Voxelab Aquila V1.0.0/V1.0.1/V1.0.2/V1.0.3 as found in the Voxelab Aquila X2 and C2 +#define BOARD_AQUILA_V101 7200 // Voxelab Aquila V1.0.0/1/2/3 (e.g., Aquila X2, C2). ... GD32 Variant Below! #define BOARD_CREALITY_ENDER2P_V24S4 7201 // Creality Ender 2 Pro v2.4.S4_170 (HC32f460kcta) +// +// GD32 ARM Cortex-M3 +// + +#define BOARD_AQUILA_V101_GD32_MFL 7300 // Voxelab Aquila V1.0.1 MFL (GD32F103RC) ... STM32/HC32 Variant Above! + +// +// GD32 ARM Cortex-M4 +// + +#define BOARD_CREALITY_V422_GD32_MFL 7400 // Creality V4.2.2 MFL (GD32F303RE) ... STM32 Variant Above! + // // Raspberry Pi // -#define BOARD_RP2040 6200 // Generic RP2040 Test board -#define BOARD_BTT_SKR_PICO 6201 // BigTreeTech SKR Pico 1.x +#define BOARD_RP2040 6200 // Generic RP2040 Test board +#define BOARD_BTT_SKR_PICO 6201 // BigTreeTech SKR Pico 1.x // // Custom board diff --git a/Marlin/src/core/bug_on.h b/Marlin/src/core/bug_on.h index 7f1243ed40..8ff565ff73 100644 --- a/Marlin/src/core/bug_on.h +++ b/Marlin/src/core/bug_on.h @@ -27,12 +27,12 @@ // Useful macro for stopping the CPU on an unexpected condition // This is used like SERIAL_ECHOPGM, that is: a key-value call of the local variables you want // to dump to the serial port before stopping the CPU. - // \/ Don't replace by SERIAL_ECHOPGM since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building - #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLNPGM(": "); SERIAL_ECHOLNPGM(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) + // \/ Don't use SERIAL_ECHOPGM with ONLY_FILENAME. It can't be a PGM string, + #define BUG_ON(V...) do { SERIAL_ECHOLN(ONLY_FILENAME, __LINE__, F(": ")); SERIAL_ECHOLNPGM(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) #elif ENABLED(MARLIN_DEV_MODE) // Don't stop the CPU here, but at least dump the bug on the serial port - // \/ Don't replace by SERIAL_ECHOPGM since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building - #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLNPGM(": BUG!"); SERIAL_ECHOLNPGM(V); SERIAL_FLUSHTX(); } while(0) + // \/ Don't use SERIAL_ECHOPGM with ONLY_FILENAME. It can't be a PGM string, + #define BUG_ON(V...) do { SERIAL_ECHOLN(ONLY_FILENAME, __LINE__, F(": BUG!")); SERIAL_ECHOLNPGM(V); SERIAL_FLUSHTX(); } while(0) #else // Release mode, let's ignore the bug #define BUG_ON(V...) NOOP diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index dddc00dba8..3a50fcdc6b 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -312,8 +312,9 @@ #define STR_FILAMENT_RUNOUT_SENSOR "Filament runout sensor" #define STR_DRIVER_STEPPING_MODE "Driver stepping mode" #define STR_STEPPER_DRIVER_CURRENT "Stepper driver current" +#define STR_HOMING_CURRENT "Homing Current (mA)" #define STR_HYBRID_THRESHOLD "Hybrid Threshold" -#define STR_STALLGUARD_THRESHOLD "StallGuard threshold" +#define STR_STALLGUARD_THRESHOLD "StallGuard Threshold" #define STR_HOME_OFFSET "Home offset" #define STR_SOFT_ENDSTOPS "Soft endstops" #define STR_MATERIAL_HEATUP "Material heatup parameters" diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 21d9929bc5..c75d684566 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -206,19 +206,23 @@ #define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION ? 'A' : 'B' #define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION ? 'A' : '0' #define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION ? 'A' : '1' -#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION ? 'A' : '' #define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1' #define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' #define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. #define IF_DISABLED(O,A) TERN(O,,A) +// "Ternary" that emits or omits the given content +#define EMIT(V...) V +#define OMIT(...) +#define TERN_(O,A) _TERN(_ENA_1(O),OMIT,EMIT)(A) // OPTION ? 'A' : '' + // Macros to conditionally emit array items and function arguments #define _OPTITEM(A...) A, -#define OPTITEM(O,A...) TERN_(O,DEFER4(_OPTITEM)(A)) +#define OPTITEM(O,A...) TERN_(O,DEFER(_OPTITEM)(A)) #define _OPTARG(A...) , A -#define OPTARG(O,A...) TERN_(O,DEFER4(_OPTARG)(A)) +#define OPTARG(O,A...) TERN_(O,DEFER(_OPTARG)(A)) #define _OPTCODE(A) A; -#define OPTCODE(O,A) TERN_(O,DEFER4(_OPTCODE)(A)) +#define OPTCODE(O,A) TERN_(O,DEFER(_OPTCODE)(A)) // Macros to avoid operations that aren't always optimized away (e.g., 'f + 0.0' and 'f * 1.0'). // Compiler flags -fno-signed-zeros -ffinite-math-only also cover 'f * 1.0', 'f - f', etc. @@ -654,11 +658,8 @@ #define IF_ELSE(TF) _IF_ELSE(_BOOL(TF)) #define _IF_ELSE(TF) _CAT(_IF_, TF) -#define _IF_1(V...) V _IF_1_ELSE -#define _IF_0(...) _IF_0_ELSE - -#define _IF_1_ELSE(...) -#define _IF_0_ELSE(V...) V +#define _IF_1(V...) V OMIT +#define _IF_0(...) EMIT #define HAS_ARGS(V...) _BOOL(FIRST(_END_OF_ARGUMENTS_ V)()) #define _END_OF_ARGUMENTS_() 0 diff --git a/Marlin/src/core/millis_t.h b/Marlin/src/core/millis_t.h index e7032a2e55..1d3cc853b3 100644 --- a/Marlin/src/core/millis_t.h +++ b/Marlin/src/core/millis_t.h @@ -30,5 +30,7 @@ typedef uint32_t millis_t; #define MS_TO_SEC(N) millis_t((N)/1000UL) #define MS_TO_SEC_PRECISE(N) (float(N)/1000.0f) -#define PENDING(NOW,SOON) ((int32_t)(NOW-(SOON))<0) -#define ELAPSED(NOW,SOON) (!PENDING(NOW,SOON)) +constexpr bool _PENDING(const millis_t now, const millis_t when) { return int32_t(when - now) > 0; } +constexpr bool _PENDING(const millis_t now, const millis_t start, const millis_t interval) { return (now - start) < interval; } +#define PENDING(V...) _PENDING(V) +#define ELAPSED(V...) !_PENDING(V) diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index a2f49417b7..a8700f3d23 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -220,7 +220,7 @@ struct SerialBase { // On non 2-complement CPU, there would be no possible representation for 2147483648. write('-'); } - printNumber_unsigned((uint_fixed_print_t)n , base); + printNumber_unsigned((uint_fixed_print_t)n, base); } // Print a decimal number diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index 68adadc95d..0de49771ee 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -566,11 +566,11 @@ struct XYval { FI XYval& operator= (const XYZEval &rs) { set(XY_LIST(rs.x, rs.y)); return *this; } // Override other operators to get intuitive behaviors - #define XY_OP(OP) { x TERN_(HAS_X_AXIS, OP rs.x), y TERN_(HAS_Y_AXIS, OP rs.y) } - FI constexpr XYval operator+ (const XYval &rs) const { return { x + rs.x, y + rs.y }; } - FI constexpr XYval operator- (const XYval &rs) const { return { x - rs.x, y - rs.y }; } - FI constexpr XYval operator* (const XYval &rs) const { return { x * rs.x, y * rs.y }; } - FI constexpr XYval operator/ (const XYval &rs) const { return { x / rs.x, y / rs.y }; } + #define XY_OP(OP) { T(x TERN_(HAS_X_AXIS, OP rs.x)), T(y TERN_(HAS_Y_AXIS, OP rs.y)) } + FI constexpr XYval operator+ (const XYval &rs) const { return { T(x + rs.x), T(y + rs.y) }; } + FI constexpr XYval operator- (const XYval &rs) const { return { T(x - rs.x), T(y - rs.y) }; } + FI constexpr XYval operator* (const XYval &rs) const { return { T(x * rs.x), T(y * rs.y) }; } + FI constexpr XYval operator/ (const XYval &rs) const { return { T(x / rs.x), T(y / rs.y) }; } FI constexpr XYval operator+ (const XYZval &rs) const { return { XY_OP(+) }; } FI constexpr XYval operator- (const XYZval &rs) const { return { XY_OP(-) }; } FI constexpr XYval operator* (const XYZval &rs) const { return { XY_OP(*) }; } @@ -721,21 +721,21 @@ struct XYZval { FI XYZval& operator= (const XYZEval &rs) { set(NUM_AXIS_ELEM_LC(rs)); return *this; } // Override other operators to get intuitive behaviors - FI constexpr XYZval operator+ (const XYval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator- (const XYval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator* (const XYval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator/ (const XYval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator+ (const XYZval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w ); } - FI constexpr XYZval operator- (const XYZval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w ); } - FI constexpr XYZval operator* (const XYZval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w ); } - FI constexpr XYZval operator/ (const XYZval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w ); } - FI constexpr XYZval operator+ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w ); } - FI constexpr XYZval operator- (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w ); } - FI constexpr XYZval operator* (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w ); } - FI constexpr XYZval operator/ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w ); } - FI constexpr XYZval operator* (const float &p) const { return NUM_AXIS_ARRAY((T)(x * p), (T)(y * p), (T)(z * p), (T)(i * p), (T)(j * p), (T)(k * p), (T)(u * p), (T)(v * p), (T)(w * p)); } + FI constexpr XYZval operator+ (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x + rs.x), T(y + rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator- (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x - rs.x), T(y - rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator* (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x * rs.x), T(y * rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator/ (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x / rs.x), T(y / rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator+ (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w) ); } + FI constexpr XYZval operator- (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w) ); } + FI constexpr XYZval operator* (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w) ); } + FI constexpr XYZval operator/ (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w) ); } + FI constexpr XYZval operator+ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w) ); } + FI constexpr XYZval operator- (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w) ); } + FI constexpr XYZval operator* (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w) ); } + FI constexpr XYZval operator/ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w) ); } + FI constexpr XYZval operator* (const float &p) const { return NUM_AXIS_ARRAY(T(x * p), T(y * p), T(z * p), T(i * p), T(j * p), T(k * p), T(u * p), T(v * p), T(w * p)); } FI constexpr XYZval operator* (const int &p) const { return NUM_AXIS_ARRAY(x * p, y * p, z * p, i * p, j * p, k * p, u * p, v * p, w * p); } - FI constexpr XYZval operator/ (const float &p) const { return NUM_AXIS_ARRAY((T)(x / p), (T)(y / p), (T)(z / p), (T)(i / p), (T)(j / p), (T)(k / p), (T)(u / p), (T)(v / p), (T)(w / p)); } + FI constexpr XYZval operator/ (const float &p) const { return NUM_AXIS_ARRAY(T(x / p), T(y / p), T(z / p), T(i / p), T(j / p), T(k / p), T(u / p), T(v / p), T(w / p)); } FI constexpr XYZval operator/ (const int &p) const { return NUM_AXIS_ARRAY(x / p, y / p, z / p, i / p, j / p, k / p, u / p, v / p, w / p); } FI constexpr XYZval operator>>(const int &p) const { return NUM_AXIS_ARRAY(_RS(x), _RS(y), _RS(z), _RS(i), _RS(j), _RS(k), _RS(u), _RS(v), _RS(w)); } FI constexpr XYZval operator<<(const int &p) const { return NUM_AXIS_ARRAY(_LS(x), _LS(y), _LS(z), _LS(i), _LS(j), _LS(k), _LS(u), _LS(v), _LS(w)); } @@ -870,21 +870,21 @@ struct XYZEval { FI XYZEval& operator= (const XYZval &rs) { set(NUM_AXIS_ELEM_LC(rs)); return *this; } // Override other operators to get intuitive behaviors - FI constexpr XYZEval operator+ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x + rs.x, y + rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator- (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x - rs.x, y - rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator* (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x * rs.x, y * rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator/ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x / rs.x, y / rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator+ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w); } - FI constexpr XYZEval operator- (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w); } - FI constexpr XYZEval operator* (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w); } - FI constexpr XYZEval operator/ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w); } - FI constexpr XYZEval operator+ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e + rs.e, x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w); } - FI constexpr XYZEval operator- (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e - rs.e, x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w); } - FI constexpr XYZEval operator* (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e * rs.e, x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w); } - FI constexpr XYZEval operator/ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e / rs.e, x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w); } - FI constexpr XYZEval operator* (const float &p) const { return LOGICAL_AXIS_ARRAY((T)(e * p), (T)(x * p), (T)(y * p), (T)(z * p), (T)(i * p), (T)(j * p), (T)(k * p), (T)(u * p), (T)(v * p), (T)(w * p)); } + FI constexpr XYZEval operator+ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x + rs.x), T(y + rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator- (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x - rs.x), T(y - rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator* (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x * rs.x), T(y * rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator/ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x / rs.x), T(y / rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator+ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w)); } + FI constexpr XYZEval operator- (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w)); } + FI constexpr XYZEval operator* (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w)); } + FI constexpr XYZEval operator/ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w)); } + FI constexpr XYZEval operator+ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e + rs.e), T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w)); } + FI constexpr XYZEval operator- (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e - rs.e), T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w)); } + FI constexpr XYZEval operator* (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e * rs.e), T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w)); } + FI constexpr XYZEval operator/ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e / rs.e), T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w)); } + FI constexpr XYZEval operator* (const float &p) const { return LOGICAL_AXIS_ARRAY(T(e * p), T(x * p), T(y * p), T(z * p), T(i * p), T(j * p), T(k * p), T(u * p), T(v * p), T(w * p)); } FI constexpr XYZEval operator* (const int &p) const { return LOGICAL_AXIS_ARRAY(e * p, x * p, y * p, z * p, i * p, j * p, k * p, u * p, v * p, w * p); } - FI constexpr XYZEval operator/ (const float &p) const { return LOGICAL_AXIS_ARRAY((T)(e / p), (T)(x / p), (T)(y / p), (T)(z / p), (T)(i / p), (T)(j / p), (T)(k / p), (T)(u / p), (T)(v / p), (T)(w / p)); } + FI constexpr XYZEval operator/ (const float &p) const { return LOGICAL_AXIS_ARRAY(T(e / p), T(x / p), T(y / p), T(z / p), T(i / p), T(j / p), T(k / p), T(u / p), T(v / p), T(w / p)); } FI constexpr XYZEval operator/ (const int &p) const { return LOGICAL_AXIS_ARRAY(e / p, x / p, y / p, z / p, i / p, j / p, k / p, u / p, v / p, w / p); } FI constexpr XYZEval operator>>(const int &p) const { return LOGICAL_AXIS_ARRAY(_RS(e), _RS(x), _RS(y), _RS(z), _RS(i), _RS(j), _RS(k), _RS(u), _RS(v), _RS(w)); } FI constexpr XYZEval operator<<(const int &p) const { return LOGICAL_AXIS_ARRAY(_LS(e), _LS(x), _LS(y), _LS(z), _LS(i), _LS(j), _LS(k), _LS(u), _LS(v), _LS(w)); } @@ -892,8 +892,8 @@ struct XYZEval { // Absolute difference between two objects FI constexpr XYZEval diff(const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(_ABS(e - rs.e)), T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); } - FI constexpr XYZEval diff(const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(0 , T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); } - FI constexpr XYZEval diff(const XYval &rs) const { return LOGICAL_AXIS_ARRAY(0 , T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), z, i, j, k, u, v, w ); } + FI constexpr XYZEval diff(const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(0, T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); } + FI constexpr XYZEval diff(const XYval &rs) const { return LOGICAL_AXIS_ARRAY(0, T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), z, i, j, k, u, v, w ); } // Modifier operators FI XYZEval& operator+=(const XYval &rs) { XY_CODE(x += rs.x, y += rs.y); return *this; } @@ -1231,3 +1231,14 @@ public: #undef _LSE #undef _RSE #undef FI + +// Axis names for G-code parsing, reports, etc. +constexpr xyze_char_t axis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', AXIS4_NAME, AXIS5_NAME, AXIS6_NAME, AXIS7_NAME, AXIS8_NAME, AXIS9_NAME); +#if NUM_AXES <= XYZ && !HAS_EXTRUDERS + #define AXIS_CHAR(A) ((char)('X' + A)) + #define IAXIS_CHAR AXIS_CHAR +#else + constexpr xyze_char_t iaxis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', 'I', 'J', 'K', 'U', 'V', 'W'); + #define AXIS_CHAR(A) axis_codes[A] + #define IAXIS_CHAR(A) iaxis_codes[A] +#endif diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index 6a8452bfaa..cc49cf2cfb 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -154,10 +154,8 @@ void safe_delay(millis_t ms) { const float rz = bedlevel.get_z_correction(current_position); SERIAL_ECHO(ftostr43sign(rz, '+')); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - if (planner.z_fade_height) { - SERIAL_ECHOPGM(" (", ftostr43sign(rz * planner.fade_scaling_factor_for_z(current_position.z), '+')); - SERIAL_CHAR(')'); - } + if (planner.z_fade_height) + SERIAL_ECHO(F(" ("), ftostr43sign(rz * planner.fade_scaling_factor_for_z(current_position.z), '+'), C(')')); #endif #endif } @@ -176,10 +174,7 @@ void safe_delay(millis_t ms) { SERIAL_ECHOPGM("MBL Adjustment Z", ftostr43sign(z_offset + z_correction, '+')); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) if (planner.z_fade_height) { - SERIAL_ECHOPGM(" (", ftostr43sign( - z_offset + z_correction * planner.fade_scaling_factor_for_z(current_position.z), '+' - )); - SERIAL_CHAR(')'); + SERIAL_ECHO(F(" ("), ftostr43sign(z_offset + z_correction * planner.fade_scaling_factor_for_z(current_position.z), '+'), C(')')); } #endif } diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index c3324443ba..77e8bac016 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -82,17 +82,6 @@ public: // in the range 0-100 while avoiding rounding artifacts constexpr uint8_t ui8_to_percent(const uint8_t i) { return (int(i) * 100 + 127) / 255; } -// Axis names for G-code parsing, reports, etc. -const xyze_char_t axis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', AXIS4_NAME, AXIS5_NAME, AXIS6_NAME, AXIS7_NAME, AXIS8_NAME, AXIS9_NAME); -#if NUM_AXES <= XYZ && !HAS_EXTRUDERS - #define AXIS_CHAR(A) ((char)('X' + A)) - #define IAXIS_CHAR AXIS_CHAR -#else - const xyze_char_t iaxis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', 'I', 'J', 'K', 'U', 'V', 'W'); - #define AXIS_CHAR(A) axis_codes[A] - #define IAXIS_CHAR(A) iaxis_codes[A] -#endif - #if ENABLED(MARLIN_DEV_MODE) enum MarlinError : uint8_t { ERR_NONE, diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index b08cb812f8..84ecc3a6c7 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -70,7 +70,7 @@ private: static void move_z_with_encoder(const_float_t multiplier); static float measure_point_with_encoder(); static float measure_business_card_thickness(); - static void manually_probe_remaining_mesh(const xy_pos_t&, const_float_t , const_float_t , const bool) __O0; + static void manually_probe_remaining_mesh(const xy_pos_t&, const_float_t, const_float_t, const bool) __O0; static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) __O0; #endif diff --git a/Marlin/src/feature/bltouch.h b/Marlin/src/feature/bltouch.h index 0f9f2e68ba..1371ec9f46 100644 --- a/Marlin/src/feature/bltouch.h +++ b/Marlin/src/feature/bltouch.h @@ -26,6 +26,7 @@ // BLTouch commands are sent as servo angles typedef unsigned char BLTCommand; +#define DEPLOY_ALARM true #define STOW_ALARM true #define BLTOUCH_DEPLOY 10 #define BLTOUCH_STOW 90 @@ -104,7 +105,7 @@ public: static bool triggered(); private: - static bool _deploy_query_alarm() { return command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } + static bool _deploy_query_alarm() { return command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY) == DEPLOY_ALARM; } static bool _stow_query_alarm() { return command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY) == STOW_ALARM; } static void clear(); diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index 818661b1f0..c17c9988e4 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -72,7 +72,7 @@ void CancelObject::report() { SERIAL_ECHO_START(); SERIAL_ECHOPGM("Canceled:"); for (int i = 0; i < state.object_count; i++) - if (TEST(state.canceled, i)) { SERIAL_CHAR(' '); SERIAL_ECHO(i); } + if (TEST(state.canceled, i)) SERIAL_ECHO(C(' '), i); SERIAL_EOL(); } diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp index 323d988a2d..585568b250 100644 --- a/Marlin/src/feature/controllerfan.cpp +++ b/Marlin/src/feature/controllerfan.cpp @@ -87,7 +87,7 @@ void ControllerFan::update() { * - If System is on idle and idle fan speed settings is activated. */ set_fan_speed( - settings.auto_mode && lastComponentOn && PENDING(ms, lastComponentOn + SEC_TO_MS(settings.duration)) + settings.auto_mode && lastComponentOn && PENDING(ms, lastComponentOn, SEC_TO_MS(settings.duration)) ? settings.active_speed : settings.idle_speed ); diff --git a/Marlin/src/feature/digipot/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp index e35b42a28b..156755856c 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4451.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -87,13 +87,7 @@ void DigipotI2C::init() { Wire.begin(); #endif // Set up initial currents as defined in Configuration_adv.h - static const float digipot_motor_current[] PROGMEM = - #if ENABLED(DIGIPOT_USE_RAW_VALUES) - DIGIPOT_MOTOR_CURRENT - #else - DIGIPOT_I2C_MOTOR_CURRENTS - #endif - ; + static const float digipot_motor_current[] PROGMEM = TERN(DIGIPOT_USE_RAW_VALUES, DIGIPOT_MOTOR_CURRENT, DIGIPOT_I2C_MOTOR_CURRENTS); for (uint8_t i = 0; i < COUNT(digipot_motor_current); ++i) set_current(i, pgm_read_float(&digipot_motor_current[i])); } diff --git a/Marlin/src/feature/easythreed_ui.cpp b/Marlin/src/feature/easythreed_ui.cpp index 9617c62eb9..8974c5befd 100644 --- a/Marlin/src/feature/easythreed_ui.cpp +++ b/Marlin/src/feature/easythreed_ui.cpp @@ -78,9 +78,9 @@ void EasythreedUI::blinkLED() { prev_blink_interval_ms = blink_interval_ms; blink_start_ms = ms; } - if (PENDING(ms, blink_start_ms + blink_interval_ms)) + if (PENDING(ms, blink_start_ms, blink_interval_ms)) WRITE(EASYTHREED_LED_PIN, LOW); - else if (PENDING(ms, blink_start_ms + 2 * blink_interval_ms)) + else if (PENDING(ms, blink_start_ms, 2 * blink_interval_ms)) WRITE(EASYTHREED_LED_PIN, HIGH); else blink_start_ms = ms; @@ -107,7 +107,7 @@ void EasythreedUI::loadButton() { break; case FS_PRESS: - if (ELAPSED(millis(), filament_time + BTN_DEBOUNCE_MS)) { // After a short debounce delay... + if (ELAPSED(millis(), filament_time, BTN_DEBOUNCE_MS)) { // After a short debounce delay... if (!READ(BTN_RETRACT) || !READ(BTN_FEED)) { // ...if switch still toggled... thermalManager.setTargetHotend(EXTRUDE_MINTEMP + 10, 0); // Start heating up blink_interval_ms = LED_BLINK_7; // Set the LED to blink fast @@ -175,14 +175,14 @@ void EasythreedUI::printButton() { break; case KS_PRESS: - if (ELAPSED(ms, key_time + BTN_DEBOUNCE_MS)) // Wait for debounce interval to expire + if (ELAPSED(ms, key_time, BTN_DEBOUNCE_MS)) // Wait for debounce interval to expire key_status = READ(BTN_PRINT) ? KS_IDLE : KS_PROCEED; // Proceed if still pressed break; case KS_PROCEED: if (!READ(BTN_PRINT)) break; // Wait for the button to be released key_status = KS_IDLE; // Ready for the next press - if (PENDING(ms, key_time + 1200 - BTN_DEBOUNCE_MS)) { // Register a press < 1.2 seconds + if (PENDING(ms, key_time, 1200 - BTN_DEBOUNCE_MS)) { // Register a press < 1.2 seconds switch (print_key_flag) { case PF_START: { // The "Print" button starts an SD card print if (printingIsActive()) break; // Already printing? (find another line that checks for 'is planner doing anything else right now?') diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index 55bde4ca62..1930176aa6 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -168,8 +168,7 @@ void I2CPositionEncoder::update() { float sumP = 0; for (uint8_t i = 0; i < I2CPE_ERR_PRST_ARRAY_SIZE; ++i) sumP += errPrst[i]; const int32_t errorP = int32_t(sumP * RECIPROCAL(I2CPE_ERR_PRST_ARRAY_SIZE)); - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" : CORRECT ERR ", errorP * planner.mm_per_step[encoderAxis], "mm"); + SERIAL_ECHOLN(C(AXIS_CHAR(encoderAxis)), F(" : CORRECT ERR "), errorP * planner.mm_per_step[encoderAxis], F("mm")); babystep.add_steps(encoderAxis, -LROUND(errorP)); errPrstIdx = 0; } @@ -188,8 +187,7 @@ void I2CPositionEncoder::update() { if (ABS(error) > I2CPE_ERR_CNT_THRESH * planner.settings.axis_steps_per_mm[encoderAxis]) { const millis_t ms = millis(); if (ELAPSED(ms, nextErrorCountTime)) { - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" : LARGE ERR ", error, "; diffSum=", diffSum); + SERIAL_ECHOLN(C(AXIS_CHAR(encoderAxis)), F(" : LARGE ERR "), error, F("; diffSum="), diffSum); errorCount++; nextErrorCountTime = ms + I2CPE_ERR_CNT_DEBOUNCE_MS; } @@ -208,8 +206,7 @@ void I2CPositionEncoder::set_homed() { homed = trusted = true; #ifdef I2CPE_DEBUG - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" axis encoder homed, offset of ", zeroOffset, " ticks."); + SERIAL_ECHO(C(AXIS_CHAR(encoderAxis)), F(" axis encoder homed, offset of "), zeroOffset, F(" ticks.\n")); #endif } } @@ -219,8 +216,7 @@ void I2CPositionEncoder::set_unhomed() { homed = trusted = false; #ifdef I2CPE_DEBUG - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" axis encoder unhomed."); + SERIAL_ECHO(C(AXIS_CHAR(encoderAxis)), F(" axis encoder unhomed.\n")); #endif } @@ -247,10 +243,8 @@ float I2CPositionEncoder::get_axis_error_mm(const bool report) { diff = actual - target, error = ABS(diff) > 10000 ? 0 : diff; // Huge error is a bad reading - if (report) { - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" axis target=", target, "mm; actual=", actual, "mm; err=", error, "mm"); - } + if (report) + SERIAL_ECHO(C(AXIS_CHAR(encoderAxis)), F(" axis target="), target, F("mm; actual="), actual, F("mm; err="), error, F("mm\n")); return error; } @@ -282,10 +276,8 @@ int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) { errorPrev = error; - if (report) { - SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - SERIAL_ECHOLNPGM(" axis target=", target, "; actual=", encoderCountInStepperTicksScaled, "; err=", error); - } + if (report) + SERIAL_ECHOLN(C(AXIS_CHAR(encoderAxis)), F(" axis target="), target, F("; actual="), encoderCountInStepperTicksScaled, F("; err="), error); if (suppressOutput) { if (report) SERIAL_ECHOLNPGM("!Discontinuity. Suppressing error."); @@ -647,23 +639,22 @@ void I2CPositionEncodersMgr::init() { void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, const bool noOffset) { CHECK_IDX(); - if (units) + if (units) { SERIAL_ECHOLN(noOffset ? encoders[idx].mm_from_count(encoders[idx].get_raw_count()) : encoders[idx].get_position_mm()); - else { - if (noOffset) { - const int32_t raw_count = encoders[idx].get_raw_count(); - SERIAL_CHAR(AXIS_CHAR(encoders[idx).get_axis()], ' '); - - for (uint8_t j = 31; j > 0; j--) - SERIAL_ECHO((bool)(0x00000001 & (raw_count >> j))); - - SERIAL_ECHO((bool)(0x00000001 & raw_count)); - SERIAL_CHAR(' '); - SERIAL_ECHOLN(raw_count); - } - else - SERIAL_ECHOLN(encoders[idx].get_position()); + return; } + + if (noOffset) { + const int32_t raw_count = encoders[idx].get_raw_count(); + SERIAL_CHAR(AXIS_CHAR(encoders[idx].get_axis()), ' '); + + for (uint8_t j = 31; j >= 0; j--) + SERIAL_ECHO(TEST32(raw_count, j)); + + SERIAL_ECHOLN(C(' '), raw_count); + } + else + SERIAL_ECHOLN(encoders[idx].get_position()); } void I2CPositionEncodersMgr::change_module_address(const uint8_t oldaddr, const uint8_t newaddr) { @@ -707,7 +698,7 @@ void I2CPositionEncodersMgr::change_module_address(const uint8_t oldaddr, const // and enable it (it will likely have failed initialization on power-up, before the address change). const int8_t idx = idx_from_addr(newaddr); if (idx >= 0 && !encoders[idx].get_active()) { - SERIAL_CHAR(AXIS_CHAR(encoders[idx).get_axis()]); + SERIAL_CHAR(AXIS_CHAR(encoders[idx].get_axis())); SERIAL_ECHOLNPGM(" axis encoder was not detected on printer startup. Trying again."); encoders[idx].set_active(encoders[idx].passes_test(true)); } diff --git a/Marlin/src/feature/ethernet.cpp b/Marlin/src/feature/ethernet.cpp index 9b022b4e17..cdf176f832 100644 --- a/Marlin/src/feature/ethernet.cpp +++ b/Marlin/src/feature/ethernet.cpp @@ -172,4 +172,46 @@ void MarlinEthernet::check() { } } +void say_ethernet() { SERIAL_ECHOPGM(" Ethernet "); } + +void MarlinEthernet::ETH0_report(const bool forReplay/*=true*/) { + say_ethernet(); + SERIAL_ECHO_TERNARY(ethernet.hardware_enabled, "port ", "en", "dis", "abled.\n"); + if (ethernet.hardware_enabled) { + say_ethernet(); + SERIAL_ECHO_TERNARY(ethernet.have_telnet_client, "client ", "en", "dis", "abled.\n"); + } + else + SERIAL_ECHOLNPGM("Send 'M552 S1' to enable."); +} + +void MarlinEthernet::MAC_report(const bool forReplay/*=true*/) { + if (!forReplay) SERIAL_ECHO_START(); + SERIAL_ECHOPGM("MAC: "); + if (ethernet.hardware_enabled) { + uint8_t mac[6]; + Ethernet.MACAddress(mac); + for (uint8_t i = 0; i < 6; ++i) { + if (mac[i] < 0x10) SERIAL_CHAR('0'); + SERIAL_PRINT(mac[i], PrintBase::Hex); + if (i < 5) SERIAL_CHAR(':'); + } + } + else + SERIAL_ECHOPGM("Disabled"); + SERIAL_EOL(); +} + +// Display current values when the link is active, +// otherwise show the stored values +void MarlinEthernet::ip_report(const uint16_t cmd, FSTR_P const post, const IPAddress &ipo, const bool forReplay/*=true*/) { + if (!forReplay) SERIAL_ECHO_START(); + SERIAL_ECHO(F(" M"), cmd, C(' ')); + for (uint8_t i = 0; i < 4; ++i) { + SERIAL_ECHO(ipo[i]); + if (i < 3) SERIAL_CHAR('.'); + } + SERIAL_ECHOLN(F(" ; "), post); +} + #endif // HAS_ETHERNET diff --git a/Marlin/src/feature/ethernet.h b/Marlin/src/feature/ethernet.h index 70a58efce7..7aa364fc3c 100644 --- a/Marlin/src/feature/ethernet.h +++ b/Marlin/src/feature/ethernet.h @@ -25,6 +25,8 @@ #include #endif +#include "../HAL/shared/Marduino.h" + // Teensy 4.1 uses internal MAC Address class MarlinEthernet { @@ -34,6 +36,10 @@ class MarlinEthernet { static EthernetClient telnetClient; static void init(); static void check(); + + static void ETH0_report(const bool forReplay=true); + static void MAC_report(const bool forReplay=true); + static void ip_report(const uint16_t cmd, FSTR_P const post, const IPAddress &ipo, const bool forReplay=true); }; extern MarlinEthernet ethernet; diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp index 51ec219e20..5a61922c1d 100644 --- a/Marlin/src/feature/max7219.cpp +++ b/Marlin/src/feature/max7219.cpp @@ -480,32 +480,30 @@ void Max7219::register_setup() { #if MAX7219_INIT_TEST uint8_t test_mode = 0; - millis_t next_patt_ms; bool patt_on; #if MAX7219_INIT_TEST == 2 #define MAX7219_LEDS (MAX7219_X_LEDS * MAX7219_Y_LEDS) - constexpr millis_t pattern_delay = 4; - - int8_t spiralx, spiraly, spiral_dir; + xy_int8_t spiral; + int8_t spiral_dir; uvalue_t(MAX7219_LEDS) spiral_count; - void Max7219::test_pattern() { - constexpr int8_t way[][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } }; - led_set(spiralx, spiraly, patt_on); - const int8_t x = spiralx + way[spiral_dir][0], y = spiraly + way[spiral_dir][1]; - if (!WITHIN(x, 0, MAX7219_X_LEDS - 1) || !WITHIN(y, 0, MAX7219_Y_LEDS - 1) || BIT_7219(x, y) == patt_on) + void Max7219::run_test_pattern() { + constexpr xy_int8_t way[] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } }; + led_set(spiral.x, spiral.y, patt_on); + const xy_int8_t xy = spiral + way[spiral_dir]; + if (!WITHIN(xy.x, 0, MAX7219_X_LEDS - 1) || !WITHIN(xy.y, 0, MAX7219_Y_LEDS - 1) || BIT_7219(xy.x, xy.y) == patt_on) spiral_dir = (spiral_dir + 1) & 0x3; - spiralx += way[spiral_dir][0]; - spiraly += way[spiral_dir][1]; + spiral += way[spiral_dir]; if (!spiral_count--) { if (!patt_on) test_mode = 0; else { spiral_count = MAX7219_LEDS; - spiralx = spiraly = spiral_dir = 0; + spiral.reset(); + spiral_dir = 0; patt_on = false; } } @@ -516,7 +514,11 @@ void Max7219::register_setup() { constexpr millis_t pattern_delay = 20; int8_t sweep_count, sweepx, sweep_dir; - void Max7219::test_pattern() { + void Max7219::run_test_pattern() { + static millis_t next_pattern_ms = 0; + const millis_t ms = millis(); + if (PENDING(ms, next_pattern_ms)) return; + next_pattern_ms = ms + pattern_delay; set_column(sweepx, patt_on ? 0xFFFFFFFF : 0x00000000); sweepx += sweep_dir; if (!WITHIN(sweepx, 0, MAX7219_X_LEDS - 1)) { @@ -527,26 +529,20 @@ void Max7219::register_setup() { else sweepx -= MAX7219_X_LEDS * sweep_dir; FLIP(patt_on); - next_patt_ms += 100; + next_pattern_ms += 100; if (++test_mode > 4) test_mode = 0; } } #endif - void Max7219::run_test_pattern() { - const millis_t ms = millis(); - if (PENDING(ms, next_patt_ms)) return; - next_patt_ms = ms + pattern_delay; - test_pattern(); - } - void Max7219::start_test_pattern() { clear(); test_mode = 1; patt_on = true; #if MAX7219_INIT_TEST == 2 - spiralx = spiraly = spiral_dir = 0; + spiral.reset(); + spiral_dir = 0; spiral_count = MAX7219_LEDS; #else sweep_dir = 1; @@ -761,7 +757,7 @@ void Max7219::idle_tasks() { #ifdef MAX7219_DEBUG_MULTISTEPPING static uint8_t last_multistepping = 0; - const uint8_t multistepping = Stepper::steps_per_isr; + const uint8_t multistepping = stepper.steps_per_isr; if (multistepping != last_multistepping) { static uint8_t log2_old = 0; uint8_t log2_new = 0; diff --git a/Marlin/src/feature/max7219.h b/Marlin/src/feature/max7219.h index a6b110fdf4..f476f7cde4 100644 --- a/Marlin/src/feature/max7219.h +++ b/Marlin/src/feature/max7219.h @@ -110,7 +110,7 @@ if (mode == ACCUMULATE_TOTAL) return; // update time_fraction every hundred milliseconds - if (instance_count == 0 && ELAPSED(now, last_calc_time + 100000)) { + if (instance_count == 0 && now - last_calc_time > 100000) { time_fraction = total_time * 128 / (now - last_calc_time); last_calc_time = now; total_time = 0; diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index d5f115e74c..96724d0d70 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -164,7 +164,7 @@ void MMU2::mmu_loop() { MMU2_SEND("S1"); // Read Version state = -2; } - else if (ELAPSED(millis(), prev_request + 30000)) { // 30sec after reset disable MMU + else if (ELAPSED(millis(), prev_request, 30000)) { // 30sec after reset disable MMU SERIAL_ECHOLNPGM("MMU not responding - DISABLED"); state = 0; } @@ -276,7 +276,7 @@ void MMU2::mmu_loop() { last_cmd = cmd; cmd = MMU_CMD_NONE; } - else if (ELAPSED(millis(), prev_P0_request + 300)) { + else if (ELAPSED(millis(), prev_P0_request, 300)) { MMU2_SEND("P0"); // Read FINDA state = 2; // wait for response } @@ -296,7 +296,7 @@ void MMU2::mmu_loop() { if (cmd == MMU_CMD_NONE) ready = true; state = 1; } - else if (ELAPSED(millis(), prev_request + MMU_P0_TIMEOUT)) // Resend request after timeout (3s) + else if (ELAPSED(millis(), prev_request, MMU_P0_TIMEOUT)) // Resend request after timeout (3s) state = 1; TERN_(HAS_PRUSA_MMU2S, check_filament()); @@ -335,7 +335,7 @@ void MMU2::mmu_loop() { last_cmd = MMU_CMD_NONE; } } - else if (ELAPSED(millis(), prev_request + MMU_CMD_TIMEOUT)) { + else if (ELAPSED(millis(), prev_request, MMU_CMD_TIMEOUT)) { // resend request after timeout if (last_cmd) { DEBUG_ECHOLNPGM("MMU retry"); diff --git a/Marlin/src/feature/mmu3/mmu3_error_converter.cpp b/Marlin/src/feature/mmu3/mmu3_error_converter.cpp index d5d124427e..d7fc651fbd 100644 --- a/Marlin/src/feature/mmu3/mmu3_error_converter.cpp +++ b/Marlin/src/feature/mmu3/mmu3_error_converter.cpp @@ -196,16 +196,16 @@ namespace MMU3 { return FindErrorIndex(ERR_OTHER_UNKNOWN_ERROR); } - uint16_t PrusaErrorCode(const uint8_t i) { return (uint16_t)pgm_read_word(&errorCodes[i]); } + uint16_t PrusaErrorCode(const uint8_t i) { return pgm_read_word(errorCodes + i); } - FSTR_P const PrusaErrorTitle(const uint8_t i) { return (FSTR_P const)pgm_read_ptr(&errorTitles[i]); } - FSTR_P const PrusaErrorDesc(const uint8_t i) { return (FSTR_P const)pgm_read_ptr(&errorDescs[i]); } + FSTR_P const PrusaErrorTitle(const uint8_t i) { return (FSTR_P const)pgm_read_ptr(errorTitles + i); } + FSTR_P const PrusaErrorDesc(const uint8_t i) { return (FSTR_P const)pgm_read_ptr(errorDescs + i); } uint8_t PrusaErrorButtons(const uint8_t i) { return pgm_read_byte(errorButtons + i); } FSTR_P const PrusaErrorButtonTitle(const uint8_t bi) { // -1 represents the hidden NoOperation button which is not drawn in any way - return (FSTR_P const)pgm_read_ptr(&btnOperation[bi - 1]); + return (FSTR_P const)pgm_read_ptr(btnOperation + bi - 1); } Buttons ButtonPressed(const ErrorCode ec) { diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index c6dc562836..a28d95d967 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -261,7 +261,7 @@ void Power::power_off() { nextPowerCheck = now + 2500UL; if (is_power_needed()) power_on(); - else if (!lastPowerOn || (POWER_TIMEOUT > 0 && ELAPSED(now, lastPowerOn + SEC_TO_MS(POWER_TIMEOUT)))) + else if (!lastPowerOn || (POWER_TIMEOUT > 0 && ELAPSED(now, lastPowerOn, SEC_TO_MS(POWER_TIMEOUT)))) power_off(); } } diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index b83c1c1797..5f0ea7dd7b 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -43,6 +43,10 @@ bool SpindleLaser::enable_state; // Virtual uint8_t SpindleLaser::power, // Actual power output 0-255 ocr or "0 = off" > 0 = "on" SpindleLaser::last_power_applied; // = 0 // Basic power state tracking +#if HAS_SPINDLE_ACCELERATION + uint32_t SpindleLaser::acceleration_spindle_deg_per_s2; // (°/s/s) Spindle acceleration. Initialized by settings.load +#endif + #if ENABLED(LASER_FEATURE) cutter_test_pulse_t SpindleLaser::testPulse = 50; // (ms) Test fire pulse default duration uint8_t SpindleLaser::last_block_power; // = 0 // Track power changes for dynamic inline power @@ -100,7 +104,22 @@ void SpindleLaser::init() { #if ENABLED(HAL_CAN_SET_PWM_FREQ) && SPINDLE_LASER_FREQUENCY hal.set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), frequency); #endif - hal.set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); + #if HAS_SPINDLE_ACCELERATION + const int16_t diff = ocr - last_power_applied; + const uint8_t abs_diff = ABS(diff); + uint8_t current_ocr = last_power_applied; + // Duration between ocr increments. SPEED_POWER_MAX is in RPM. + const millis_t duration = (float(SPEED_POWER_MAX) * (60000.f / 2550.f) / float(acceleration_spindle_deg_per_s2)) * abs_diff; + millis_t next_ocr_change = millis() + duration; + while (current_ocr != ocr) { + while (PENDING(millis(), next_ocr_change)) idle(); + current_ocr += diff > 0 ? 1 : -1; + hal.set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), current_ocr ^ SPINDLE_LASER_PWM_OFF); + next_ocr_change += duration; + } + #else + hal.set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); + #endif } void SpindleLaser::set_ocr(const uint8_t ocr) { @@ -111,10 +130,10 @@ void SpindleLaser::init() { } void SpindleLaser::ocr_off() { + _set_ocr(0); #if PIN_EXISTS(SPINDLE_LASER_ENA) WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Cutter OFF #endif - _set_ocr(0); } #endif // SPINDLE_LASER_USE_PWM @@ -127,9 +146,8 @@ void SpindleLaser::init() { */ void SpindleLaser::apply_power(const uint8_t opwr) { if (enabled() || opwr == 0) { // 0 check allows us to disable where no ENA pin exists - // Test and set the last power used to improve performance + // Test the last power used to improve performance if (opwr == last_power_applied) return; - last_power_applied = opwr; // Handle PWM driven or just simple on/off #if ENABLED(SPINDLE_LASER_USE_PWM) if (CUTTER_UNIT_IS(RPM) && unitPower == 0) @@ -146,6 +164,7 @@ void SpindleLaser::apply_power(const uint8_t opwr) { WRITE(SPINDLE_LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE); isReadyForUI = true; #endif + last_power_applied = opwr; } else { #if PIN_EXISTS(SPINDLE_LASER_ENA) diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index a443d7df5e..a283f0786d 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -109,11 +109,14 @@ public: static uint8_t power, last_power_applied; // Basic power state tracking - static cutter_frequency_t frequency; // Set PWM frequency; range: 2K-50K + static cutter_frequency_t frequency; // (Hz) Laser/Spindle PWM frequency (2000..50000) - static cutter_power_t menuPower, // Power as set via LCD menu in PWM, Percentage or RPM - unitPower; // Power as displayed status in PWM, Percentage or RPM + static cutter_power_t menuPower, // Power as set via LCD menu in PWM, Percentage, or RPM + unitPower; // Power as displayed status in PWM, Percentage, or RPM + #if HAS_SPINDLE_ACCELERATION + static uint32_t acceleration_spindle_deg_per_s2; // (°/s/s) Spindle acceleration + #endif static void init(); #if ENABLED(HAL_CAN_SET_PWM_FREQ) && SPINDLE_LASER_FREQUENCY diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 6afbf4a0ce..753cb003ff 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -43,6 +43,10 @@ #endif #endif +#if ENABLED(EDITABLE_HOMING_CURRENT) + homing_current_t homing_current_mA; +#endif + /** * Check for over temperature or short to ground error flags. * Report and log warning of overtemperature condition. @@ -344,127 +348,70 @@ if (need_update_error_counters || need_debug_reporting) { - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) - { - bool result = false; - #if AXIS_IS_TMC(X) - if (monitor_tmc_driver(stepperX, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(X2) - if (monitor_tmc_driver(stepperX2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(X) - step_current_down(stepperX); - #endif - #if AXIS_IS_TMC(X2) - step_current_down(stepperX2); - #endif + #if X_IS_TRINAMIC || X2_IS_TRINAMIC + if ( TERN0(X_IS_TRINAMIC, monitor_tmc_driver(stepperX, need_update_error_counters, need_debug_reporting)) + || TERN0(X2_IS_TRINAMIC, monitor_tmc_driver(stepperX2, need_update_error_counters, need_debug_reporting)) + ) { + TERN_(X_IS_TRINAMIC, step_current_down(stepperX)); + TERN_(X2_IS_TRINAMIC, step_current_down(stepperX2)); } - } #endif - #if AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) - { - bool result = false; - #if AXIS_IS_TMC(Y) - if (monitor_tmc_driver(stepperY, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Y2) - if (monitor_tmc_driver(stepperY2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(Y) - step_current_down(stepperY); - #endif - #if AXIS_IS_TMC(Y2) - step_current_down(stepperY2); - #endif + #if Y_IS_TRINAMIC || Y2_IS_TRINAMIC + if ( TERN0(Y_IS_TRINAMIC, monitor_tmc_driver(stepperY, need_update_error_counters, need_debug_reporting)) + || TERN0(Y2_IS_TRINAMIC, monitor_tmc_driver(stepperY2, need_update_error_counters, need_debug_reporting)) + ) { + TERN_(Y_IS_TRINAMIC, step_current_down(stepperY)); + TERN_(Y2_IS_TRINAMIC, step_current_down(stepperY2)); } - } #endif - #if AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) - { - bool result = false; - #if AXIS_IS_TMC(Z) - if (monitor_tmc_driver(stepperZ, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z2) - if (monitor_tmc_driver(stepperZ2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z3) - if (monitor_tmc_driver(stepperZ3, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z4) - if (monitor_tmc_driver(stepperZ4, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(Z) - step_current_down(stepperZ); - #endif - #if AXIS_IS_TMC(Z2) - step_current_down(stepperZ2); - #endif - #if AXIS_IS_TMC(Z3) - step_current_down(stepperZ3); - #endif - #if AXIS_IS_TMC(Z4) - step_current_down(stepperZ4); - #endif + #if ANY(Z_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) + if ( TERN0(Z_IS_TRINAMIC, monitor_tmc_driver(stepperZ, need_update_error_counters, need_debug_reporting)) + || TERN0(Z2_IS_TRINAMIC, monitor_tmc_driver(stepperZ2, need_update_error_counters, need_debug_reporting)) + || TERN0(Z3_IS_TRINAMIC, monitor_tmc_driver(stepperZ3, need_update_error_counters, need_debug_reporting)) + || TERN0(Z4_IS_TRINAMIC, monitor_tmc_driver(stepperZ4, need_update_error_counters, need_debug_reporting)) + ) { + TERN_(Z_IS_TRINAMIC, step_current_down(stepperZ)); + TERN_(Z2_IS_TRINAMIC, step_current_down(stepperZ2)); + TERN_(Z3_IS_TRINAMIC, step_current_down(stepperZ3)); + TERN_(Z4_IS_TRINAMIC, step_current_down(stepperZ4)); } - } #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC if (monitor_tmc_driver(stepperI, need_update_error_counters, need_debug_reporting)) step_current_down(stepperI); #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC if (monitor_tmc_driver(stepperJ, need_update_error_counters, need_debug_reporting)) step_current_down(stepperJ); #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC if (monitor_tmc_driver(stepperK, need_update_error_counters, need_debug_reporting)) step_current_down(stepperK); #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC if (monitor_tmc_driver(stepperU, need_update_error_counters, need_debug_reporting)) step_current_down(stepperU); #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC if (monitor_tmc_driver(stepperV, need_update_error_counters, need_debug_reporting)) step_current_down(stepperV); #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC if (monitor_tmc_driver(stepperW, need_update_error_counters, need_debug_reporting)) step_current_down(stepperW); #endif - #if AXIS_IS_TMC(E0) - (void)monitor_tmc_driver(stepperE0, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E1) - (void)monitor_tmc_driver(stepperE1, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E2) - (void)monitor_tmc_driver(stepperE2, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E3) - (void)monitor_tmc_driver(stepperE3, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E4) - (void)monitor_tmc_driver(stepperE4, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E5) - (void)monitor_tmc_driver(stepperE5, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E6) - (void)monitor_tmc_driver(stepperE6, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E7) - (void)monitor_tmc_driver(stepperE7, need_update_error_counters, need_debug_reporting); - #endif + TERN_(E0_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE0, need_update_error_counters, need_debug_reporting)); + TERN_(E1_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE1, need_update_error_counters, need_debug_reporting)); + TERN_(E2_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE2, need_update_error_counters, need_debug_reporting)); + TERN_(E3_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE3, need_update_error_counters, need_debug_reporting)); + TERN_(E4_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE4, need_update_error_counters, need_debug_reporting)); + TERN_(E5_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE5, need_update_error_counters, need_debug_reporting)); + TERN_(E6_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE6, need_update_error_counters, need_debug_reporting)); + TERN_(E7_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE7, need_update_error_counters, need_debug_reporting)); if (TERN0(TMC_DEBUG, need_debug_reporting)) SERIAL_EOL(); } @@ -781,82 +728,38 @@ static void tmc_debug_loop(const TMC_debug_enum n OPTARGS_LOGICAL(const bool)) { if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - tmc_status(stepperX, n); - #endif - #if AXIS_IS_TMC(X2) - tmc_status(stepperX2, n); - #endif + TERN_(X_IS_TRINAMIC, tmc_status(stepperX, n)); + TERN_(X2_IS_TRINAMIC, tmc_status(stepperX2, n)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - tmc_status(stepperY, n); - #endif - #if AXIS_IS_TMC(Y2) - tmc_status(stepperY2, n); - #endif + TERN_(Y_IS_TRINAMIC, tmc_status(stepperY, n)); + TERN_(Y2_IS_TRINAMIC, tmc_status(stepperY2, n)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - tmc_status(stepperZ, n); - #endif - #if AXIS_IS_TMC(Z2) - tmc_status(stepperZ2, n); - #endif - #if AXIS_IS_TMC(Z3) - tmc_status(stepperZ3, n); - #endif - #if AXIS_IS_TMC(Z4) - tmc_status(stepperZ4, n); - #endif + TERN_(Z_IS_TRINAMIC, tmc_status(stepperZ, n)); + TERN_(Z2_IS_TRINAMIC, tmc_status(stepperZ2, n)); + TERN_(Z3_IS_TRINAMIC, tmc_status(stepperZ3, n)); + TERN_(Z4_IS_TRINAMIC, tmc_status(stepperZ4, n)); } - #if AXIS_IS_TMC(I) - if (i) tmc_status(stepperI, n); - #endif - #if AXIS_IS_TMC(J) - if (j) tmc_status(stepperJ, n); - #endif - #if AXIS_IS_TMC(K) - if (k) tmc_status(stepperK, n); - #endif - #if AXIS_IS_TMC(U) - if (u) tmc_status(stepperU, n); - #endif - #if AXIS_IS_TMC(V) - if (v) tmc_status(stepperV, n); - #endif - #if AXIS_IS_TMC(W) - if (w) tmc_status(stepperW, n); - #endif + TERN_(I_IS_TRINAMIC, if (i) tmc_status(stepperI, n)); + TERN_(J_IS_TRINAMIC, if (j) tmc_status(stepperJ, n)); + TERN_(K_IS_TRINAMIC, if (k) tmc_status(stepperK, n)); + TERN_(U_IS_TRINAMIC, if (u) tmc_status(stepperU, n)); + TERN_(V_IS_TRINAMIC, if (v) tmc_status(stepperV, n)); + TERN_(W_IS_TRINAMIC, if (w) tmc_status(stepperW, n)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - tmc_status(stepperE0, n); - #endif - #if AXIS_IS_TMC(E1) - tmc_status(stepperE1, n); - #endif - #if AXIS_IS_TMC(E2) - tmc_status(stepperE2, n); - #endif - #if AXIS_IS_TMC(E3) - tmc_status(stepperE3, n); - #endif - #if AXIS_IS_TMC(E4) - tmc_status(stepperE4, n); - #endif - #if AXIS_IS_TMC(E5) - tmc_status(stepperE5, n); - #endif - #if AXIS_IS_TMC(E6) - tmc_status(stepperE6, n); - #endif - #if AXIS_IS_TMC(E7) - tmc_status(stepperE7, n); - #endif + TERN_(E0_IS_TRINAMIC, tmc_status(stepperE0, n)); + TERN_(E1_IS_TRINAMIC, tmc_status(stepperE1, n)); + TERN_(E2_IS_TRINAMIC, tmc_status(stepperE2, n)); + TERN_(E3_IS_TRINAMIC, tmc_status(stepperE3, n)); + TERN_(E4_IS_TRINAMIC, tmc_status(stepperE4, n)); + TERN_(E5_IS_TRINAMIC, tmc_status(stepperE5, n)); + TERN_(E6_IS_TRINAMIC, tmc_status(stepperE6, n)); + TERN_(E7_IS_TRINAMIC, tmc_status(stepperE7, n)); } SERIAL_EOL(); @@ -864,82 +767,38 @@ static void drv_status_loop(const TMC_drv_status_enum n OPTARGS_LOGICAL(const bool)) { if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - tmc_parse_drv_status(stepperX, n); - #endif - #if AXIS_IS_TMC(X2) - tmc_parse_drv_status(stepperX2, n); - #endif + TERN_(X_IS_TRINAMIC, tmc_parse_drv_status(stepperX, n)); + TERN_(X2_IS_TRINAMIC, tmc_parse_drv_status(stepperX2, n)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - tmc_parse_drv_status(stepperY, n); - #endif - #if AXIS_IS_TMC(Y2) - tmc_parse_drv_status(stepperY2, n); - #endif + TERN_(Y_IS_TRINAMIC, tmc_parse_drv_status(stepperY, n)); + TERN_(Y2_IS_TRINAMIC, tmc_parse_drv_status(stepperY2, n)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - tmc_parse_drv_status(stepperZ, n); - #endif - #if AXIS_IS_TMC(Z2) - tmc_parse_drv_status(stepperZ2, n); - #endif - #if AXIS_IS_TMC(Z3) - tmc_parse_drv_status(stepperZ3, n); - #endif - #if AXIS_IS_TMC(Z4) - tmc_parse_drv_status(stepperZ4, n); - #endif + TERN_(Z_IS_TRINAMIC, tmc_parse_drv_status(stepperZ, n)); + TERN_(Z2_IS_TRINAMIC, tmc_parse_drv_status(stepperZ2, n)); + TERN_(Z3_IS_TRINAMIC, tmc_parse_drv_status(stepperZ3, n)); + TERN_(Z4_IS_TRINAMIC, tmc_parse_drv_status(stepperZ4, n)); } - #if AXIS_IS_TMC(I) - if (i) tmc_parse_drv_status(stepperI, n); - #endif - #if AXIS_IS_TMC(J) - if (j) tmc_parse_drv_status(stepperJ, n); - #endif - #if AXIS_IS_TMC(K) - if (k) tmc_parse_drv_status(stepperK, n); - #endif - #if AXIS_IS_TMC(U) - if (u) tmc_parse_drv_status(stepperU, n); - #endif - #if AXIS_IS_TMC(V) - if (v) tmc_parse_drv_status(stepperV, n); - #endif - #if AXIS_IS_TMC(W) - if (w) tmc_parse_drv_status(stepperW, n); - #endif + TERN_(I_IS_TRINAMIC, if (i) tmc_parse_drv_status(stepperI, n)); + TERN_(J_IS_TRINAMIC, if (j) tmc_parse_drv_status(stepperJ, n)); + TERN_(K_IS_TRINAMIC, if (k) tmc_parse_drv_status(stepperK, n)); + TERN_(U_IS_TRINAMIC, if (u) tmc_parse_drv_status(stepperU, n)); + TERN_(V_IS_TRINAMIC, if (v) tmc_parse_drv_status(stepperV, n)); + TERN_(W_IS_TRINAMIC, if (w) tmc_parse_drv_status(stepperW, n)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - tmc_parse_drv_status(stepperE0, n); - #endif - #if AXIS_IS_TMC(E1) - tmc_parse_drv_status(stepperE1, n); - #endif - #if AXIS_IS_TMC(E2) - tmc_parse_drv_status(stepperE2, n); - #endif - #if AXIS_IS_TMC(E3) - tmc_parse_drv_status(stepperE3, n); - #endif - #if AXIS_IS_TMC(E4) - tmc_parse_drv_status(stepperE4, n); - #endif - #if AXIS_IS_TMC(E5) - tmc_parse_drv_status(stepperE5, n); - #endif - #if AXIS_IS_TMC(E6) - tmc_parse_drv_status(stepperE6, n); - #endif - #if AXIS_IS_TMC(E7) - tmc_parse_drv_status(stepperE7, n); - #endif + TERN_(E0_IS_TRINAMIC, tmc_parse_drv_status(stepperE0, n)); + TERN_(E1_IS_TRINAMIC, tmc_parse_drv_status(stepperE1, n)); + TERN_(E2_IS_TRINAMIC, tmc_parse_drv_status(stepperE2, n)); + TERN_(E3_IS_TRINAMIC, tmc_parse_drv_status(stepperE3, n)); + TERN_(E4_IS_TRINAMIC, tmc_parse_drv_status(stepperE4, n)); + TERN_(E5_IS_TRINAMIC, tmc_parse_drv_status(stepperE5, n)); + TERN_(E6_IS_TRINAMIC, tmc_parse_drv_status(stepperE6, n)); + TERN_(E7_IS_TRINAMIC, tmc_parse_drv_status(stepperE7, n)); } SERIAL_EOL(); @@ -1078,82 +937,38 @@ static void tmc_get_registers(TMC_get_registers_enum n OPTARGS_LOGICAL(const bool)) { if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - tmc_get_registers(stepperX, n); - #endif - #if AXIS_IS_TMC(X2) - tmc_get_registers(stepperX2, n); - #endif + TERN_(X_IS_TRINAMIC, tmc_get_registers(stepperX, n)); + TERN_(X2_IS_TRINAMIC, tmc_get_registers(stepperX2, n)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - tmc_get_registers(stepperY, n); - #endif - #if AXIS_IS_TMC(Y2) - tmc_get_registers(stepperY2, n); - #endif + TERN_(Y_IS_TRINAMIC, tmc_get_registers(stepperY, n)); + TERN_(Y2_IS_TRINAMIC, tmc_get_registers(stepperY2, n)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - tmc_get_registers(stepperZ, n); - #endif - #if AXIS_IS_TMC(Z2) - tmc_get_registers(stepperZ2, n); - #endif - #if AXIS_IS_TMC(Z3) - tmc_get_registers(stepperZ3, n); - #endif - #if AXIS_IS_TMC(Z4) - tmc_get_registers(stepperZ4, n); - #endif + TERN_(Z_IS_TRINAMIC, tmc_get_registers(stepperZ, n)); + TERN_(Z2_IS_TRINAMIC, tmc_get_registers(stepperZ2, n)); + TERN_(Z3_IS_TRINAMIC, tmc_get_registers(stepperZ3, n)); + TERN_(Z4_IS_TRINAMIC, tmc_get_registers(stepperZ4, n)); } - #if AXIS_IS_TMC(I) - if (i) tmc_get_registers(stepperI, n); - #endif - #if AXIS_IS_TMC(J) - if (j) tmc_get_registers(stepperJ, n); - #endif - #if AXIS_IS_TMC(K) - if (k) tmc_get_registers(stepperK, n); - #endif - #if AXIS_IS_TMC(U) - if (u) tmc_get_registers(stepperU, n); - #endif - #if AXIS_IS_TMC(V) - if (v) tmc_get_registers(stepperV, n); - #endif - #if AXIS_IS_TMC(W) - if (w) tmc_get_registers(stepperW, n); - #endif + TERN_(I_IS_TRINAMIC, if (i) tmc_get_registers(stepperI, n)); + TERN_(J_IS_TRINAMIC, if (j) tmc_get_registers(stepperJ, n)); + TERN_(K_IS_TRINAMIC, if (k) tmc_get_registers(stepperK, n)); + TERN_(U_IS_TRINAMIC, if (u) tmc_get_registers(stepperU, n)); + TERN_(V_IS_TRINAMIC, if (v) tmc_get_registers(stepperV, n)); + TERN_(W_IS_TRINAMIC, if (w) tmc_get_registers(stepperW, n)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - tmc_get_registers(stepperE0, n); - #endif - #if AXIS_IS_TMC(E1) - tmc_get_registers(stepperE1, n); - #endif - #if AXIS_IS_TMC(E2) - tmc_get_registers(stepperE2, n); - #endif - #if AXIS_IS_TMC(E3) - tmc_get_registers(stepperE3, n); - #endif - #if AXIS_IS_TMC(E4) - tmc_get_registers(stepperE4, n); - #endif - #if AXIS_IS_TMC(E5) - tmc_get_registers(stepperE5, n); - #endif - #if AXIS_IS_TMC(E6) - tmc_get_registers(stepperE6, n); - #endif - #if AXIS_IS_TMC(E7) - tmc_get_registers(stepperE7, n); - #endif + TERN_(E0_IS_TRINAMIC, tmc_get_registers(stepperE0, n)); + TERN_(E1_IS_TRINAMIC, tmc_get_registers(stepperE1, n)); + TERN_(E2_IS_TRINAMIC, tmc_get_registers(stepperE2, n)); + TERN_(E3_IS_TRINAMIC, tmc_get_registers(stepperE3, n)); + TERN_(E4_IS_TRINAMIC, tmc_get_registers(stepperE4, n)); + TERN_(E5_IS_TRINAMIC, tmc_get_registers(stepperE5, n)); + TERN_(E6_IS_TRINAMIC, tmc_get_registers(stepperE6, n)); + TERN_(E7_IS_TRINAMIC, tmc_get_registers(stepperE7, n)); } SERIAL_EOL(); @@ -1243,82 +1058,38 @@ void test_tmc_connection(LOGICAL_AXIS_ARGS_LC(const bool)) { uint8_t axis_connection = 0; if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - axis_connection += test_connection(stepperX); - #endif - #if AXIS_IS_TMC(X2) - axis_connection += test_connection(stepperX2); - #endif + TERN_(X_IS_TRINAMIC, axis_connection += test_connection(stepperX)); + TERN_(X2_IS_TRINAMIC, axis_connection += test_connection(stepperX2)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - axis_connection += test_connection(stepperY); - #endif - #if AXIS_IS_TMC(Y2) - axis_connection += test_connection(stepperY2); - #endif + TERN_(Y_IS_TRINAMIC, axis_connection += test_connection(stepperY)); + TERN_(Y2_IS_TRINAMIC, axis_connection += test_connection(stepperY2)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - axis_connection += test_connection(stepperZ); - #endif - #if AXIS_IS_TMC(Z2) - axis_connection += test_connection(stepperZ2); - #endif - #if AXIS_IS_TMC(Z3) - axis_connection += test_connection(stepperZ3); - #endif - #if AXIS_IS_TMC(Z4) - axis_connection += test_connection(stepperZ4); - #endif + TERN_(Z_IS_TRINAMIC, axis_connection += test_connection(stepperZ)); + TERN_(Z2_IS_TRINAMIC, axis_connection += test_connection(stepperZ2)); + TERN_(Z3_IS_TRINAMIC, axis_connection += test_connection(stepperZ3)); + TERN_(Z4_IS_TRINAMIC, axis_connection += test_connection(stepperZ4)); } - #if AXIS_IS_TMC(I) - if (i) axis_connection += test_connection(stepperI); - #endif - #if AXIS_IS_TMC(J) - if (j) axis_connection += test_connection(stepperJ); - #endif - #if AXIS_IS_TMC(K) - if (k) axis_connection += test_connection(stepperK); - #endif - #if AXIS_IS_TMC(U) - if (u) axis_connection += test_connection(stepperU); - #endif - #if AXIS_IS_TMC(V) - if (v) axis_connection += test_connection(stepperV); - #endif - #if AXIS_IS_TMC(W) - if (w) axis_connection += test_connection(stepperW); - #endif + TERN_(I_IS_TRINAMIC, if (i) axis_connection += test_connection(stepperI)); + TERN_(J_IS_TRINAMIC, if (j) axis_connection += test_connection(stepperJ)); + TERN_(K_IS_TRINAMIC, if (k) axis_connection += test_connection(stepperK)); + TERN_(U_IS_TRINAMIC, if (u) axis_connection += test_connection(stepperU)); + TERN_(V_IS_TRINAMIC, if (v) axis_connection += test_connection(stepperV)); + TERN_(W_IS_TRINAMIC, if (w) axis_connection += test_connection(stepperW)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - axis_connection += test_connection(stepperE0); - #endif - #if AXIS_IS_TMC(E1) - axis_connection += test_connection(stepperE1); - #endif - #if AXIS_IS_TMC(E2) - axis_connection += test_connection(stepperE2); - #endif - #if AXIS_IS_TMC(E3) - axis_connection += test_connection(stepperE3); - #endif - #if AXIS_IS_TMC(E4) - axis_connection += test_connection(stepperE4); - #endif - #if AXIS_IS_TMC(E5) - axis_connection += test_connection(stepperE5); - #endif - #if AXIS_IS_TMC(E6) - axis_connection += test_connection(stepperE6); - #endif - #if AXIS_IS_TMC(E7) - axis_connection += test_connection(stepperE7); - #endif + TERN_(E0_IS_TRINAMIC, axis_connection += test_connection(stepperE0)); + TERN_(E1_IS_TRINAMIC, axis_connection += test_connection(stepperE1)); + TERN_(E2_IS_TRINAMIC, axis_connection += test_connection(stepperE2)); + TERN_(E3_IS_TRINAMIC, axis_connection += test_connection(stepperE3)); + TERN_(E4_IS_TRINAMIC, axis_connection += test_connection(stepperE4)); + TERN_(E5_IS_TRINAMIC, axis_connection += test_connection(stepperE5)); + TERN_(E6_IS_TRINAMIC, axis_connection += test_connection(stepperE6)); + TERN_(E7_IS_TRINAMIC, axis_connection += test_connection(stepperE7)); } if (axis_connection) LCD_MESSAGE(MSG_ERROR_TMC); diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index 27aae23f89..4cac2969a7 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -375,6 +375,32 @@ void test_tmc_connection(LOGICAL_AXIS_DECL_LC(const bool, true)); #endif // USE_SENSORLESS +#if HAS_HOMING_CURRENT + + // Axes that have a distinct homing current + struct homing_current_t { + OPTCODE(X_HAS_HOME_CURRENT, uint16_t X) + OPTCODE(Y_HAS_HOME_CURRENT, uint16_t Y) + OPTCODE(Z_HAS_HOME_CURRENT, uint16_t Z) + OPTCODE(X2_HAS_HOME_CURRENT, uint16_t X2) + OPTCODE(Y2_HAS_HOME_CURRENT, uint16_t Y2) + OPTCODE(Z2_HAS_HOME_CURRENT, uint16_t Z2) + OPTCODE(Z3_HAS_HOME_CURRENT, uint16_t Z3) + OPTCODE(Z4_HAS_HOME_CURRENT, uint16_t Z4) + OPTCODE(I_HAS_HOME_CURRENT, uint16_t I) + OPTCODE(J_HAS_HOME_CURRENT, uint16_t J) + OPTCODE(K_HAS_HOME_CURRENT, uint16_t K) + OPTCODE(U_HAS_HOME_CURRENT, uint16_t U) + OPTCODE(V_HAS_HOME_CURRENT, uint16_t V) + OPTCODE(W_HAS_HOME_CURRENT, uint16_t W) + }; + + #if ENABLED(EDITABLE_HOMING_CURRENT) + extern homing_current_t homing_current_mA; + #endif + +#endif // HAS_HOMING_CURRENT + #endif // HAS_TRINAMIC_CONFIG #if HAS_TMC_SPI diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 85d27e14e8..6c8af9ddb0 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -88,10 +88,8 @@ fr_mm_s = HYPOT(minfr, minfr); // Set homing current to X and Y axis if defined - #if HAS_CURRENT_HOME(X) - set_homing_current(X_AXIS); - #endif - #if HAS_CURRENT_HOME(Y) && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) + TERN_(X_HAS_HOME_CURRENT, set_homing_current(X_AXIS)); + #if Y_HAS_HOME_CURRENT && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) set_homing_current(Y_AXIS); #endif @@ -113,10 +111,8 @@ current_position.set(0.0, 0.0); - #if HAS_CURRENT_HOME(X) - restore_homing_current(X_AXIS); - #endif - #if HAS_CURRENT_HOME(Y) && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) + TERN_(X_HAS_HOME_CURRENT, restore_homing_current(X_AXIS)); + #if Y_HAS_HOME_CURRENT && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) restore_homing_current(Y_AXIS); #endif diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp index 9a0cb0054b..0654eb0ec9 100644 --- a/Marlin/src/gcode/calibrate/G34.cpp +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -95,37 +95,36 @@ void GcodeSuite::G34() { #if HAS_MOTOR_CURRENT_SPI const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS]; + const uint32_t previous_current_Z = stepper.motor_current_setting[Z_AXIS]; stepper.set_digipot_current(Z_AXIS, target_current); #elif HAS_MOTOR_CURRENT_PWM const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - const uint32_t previous_current = stepper.motor_current_setting[1]; // Z + const uint32_t previous_current_Z = stepper.motor_current_setting[1]; // Z stepper.set_digipot_current(1, target_current); #elif HAS_MOTOR_CURRENT_DAC const float target_current = parser.floatval('S', GANTRY_CALIBRATION_CURRENT); - const float previous_current = dac_amps(Z_AXIS, target_current); + const float previous_current_Z = dac_amps(Z_AXIS, target_current); stepper_dac.set_current_value(Z_AXIS, target_current); #elif HAS_MOTOR_CURRENT_I2C const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - previous_current = dac_amps(Z_AXIS); + const float previous_current_Z = dac_amps(Z_AXIS); digipot_i2c.set_current(Z_AXIS, target_current) #elif HAS_TRINAMIC_CONFIG const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - static uint16_t previous_current_arr[NUM_Z_STEPPERS]; - #if AXIS_IS_TMC(Z) - previous_current_arr[0] = stepperZ.getMilliamps(); + #if Z_IS_TRINAMIC + static uint16_t previous_current_Z = stepperZ.getMilliamps(); stepperZ.rms_current(target_current); #endif - #if AXIS_IS_TMC(Z2) - previous_current_arr[1] = stepperZ2.getMilliamps(); + #if Z2_IS_TRINAMIC + static uint16_t previous_current_Z2 = stepperZ2.getMilliamps(); stepperZ2.rms_current(target_current); #endif - #if AXIS_IS_TMC(Z3) - previous_current_arr[2] = stepperZ3.getMilliamps(); + #if Z3_IS_TRINAMIC + static uint16_t previous_current_Z3 = stepperZ3.getMilliamps(); stepperZ3.rms_current(target_current); #endif - #if AXIS_IS_TMC(Z4) - previous_current_arr[3] = stepperZ4.getMilliamps(); + #if Z4_IS_TRINAMIC + static uint16_t previous_current_Z4 = stepperZ4.getMilliamps(); stepperZ4.rms_current(target_current); #endif #endif @@ -140,26 +139,18 @@ void GcodeSuite::G34() { #endif #if HAS_MOTOR_CURRENT_SPI - stepper.set_digipot_current(Z_AXIS, previous_current); + stepper.set_digipot_current(Z_AXIS, previous_current_Z); #elif HAS_MOTOR_CURRENT_PWM - stepper.set_digipot_current(1, previous_current); + stepper.set_digipot_current(1, previous_current_Z); #elif HAS_MOTOR_CURRENT_DAC - stepper_dac.set_current_value(Z_AXIS, previous_current); + stepper_dac.set_current_value(Z_AXIS, previous_current_Z); #elif HAS_MOTOR_CURRENT_I2C - digipot_i2c.set_current(Z_AXIS, previous_current) + digipot_i2c.set_current(Z_AXIS, previous_current_Z) #elif HAS_TRINAMIC_CONFIG - #if AXIS_IS_TMC(Z) - stepperZ.rms_current(previous_current_arr[0]); - #endif - #if AXIS_IS_TMC(Z2) - stepperZ2.rms_current(previous_current_arr[1]); - #endif - #if AXIS_IS_TMC(Z3) - stepperZ3.rms_current(previous_current_arr[2]); - #endif - #if AXIS_IS_TMC(Z4) - stepperZ4.rms_current(previous_current_arr[3]); - #endif + TERN_(Z_IS_TRINAMIC, stepperZ.rms_current(previous_current_Z)); + TERN_(Z2_IS_TRINAMIC, stepperZ2.rms_current(previous_current_Z2)); + TERN_(Z3_IS_TRINAMIC, stepperZ3.rms_current(previous_current_Z3)); + TERN_(Z4_IS_TRINAMIC, stepperZ4.rms_current(previous_current_Z4)); #endif // Back off end plate, back to normal motion range diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 910395e561..981a1d9877 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -261,7 +261,19 @@ void GcodeSuite::M48() { #if HAS_STATUS_MESSAGE // Display M48 results in the status bar - ui.set_status_and_level(MString<30>(GET_TEXT_F(MSG_M48_DEVIATION), F(": "), w_float_t(sigma, 2, 6))); + if (MAX_MESSAGE_SIZE <= 20) { + // 12345678901234567890 + // Deviation: 0.123456 + ui.set_status_and_level(TS(GET_TEXT_F(MSG_M48_DEVIATION), F(": "), w_float_t(sigma, 2, 6))); + } else if (MAX_MESSAGE_SIZE <= 30) { + // 123456789012345678901234567890 + // Dev:0.12345, Max delta:0.12345 + ui.set_status_and_level(TS(GET_TEXT_F(MSG_M48_DEV), ':', w_float_t(sigma, 2, 5), F(", "), GET_TEXT(MSG_M48_MAX_DELTA), ':', w_float_t(_MAX(mean - min, max - mean), 2, 5))); + } else { + // 1234567890123456789012345678901234567890 + // Deviation: 1.23456, Max delta: 1.23456 + ui.set_status_and_level(TS(GET_TEXT_F(MSG_M48_DEVIATION), F(": "), w_float_t(sigma, 2, 6), F(", "), GET_TEXT(MSG_M48_MAX_DELTA), F(": "), w_float_t(_MAX(mean - min, max - mean), 2, 6))); + } #endif } diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp index a0466fbeab..a55813aeae 100644 --- a/Marlin/src/gcode/config/M200-M205.cpp +++ b/Marlin/src/gcode/config/M200-M205.cpp @@ -78,10 +78,10 @@ TERN_(MARLIN_SMALL_BUILD, return); if (!forReplay) { - report_heading(forReplay, F(STR_FILAMENT_SETTINGS), false); + report_heading(false, F(STR_FILAMENT_SETTINGS), false); if (!parser.volumetric_enabled) SERIAL_ECHOPGM(" (Disabled):"); SERIAL_EOL(); - report_echo_start(forReplay); + report_echo_start(false); } #if EXTRUDERS == 1 @@ -231,7 +231,7 @@ void GcodeSuite::M203_report(const bool forReplay/*=true*/) { #if ENABLED(DISTINCT_E_FACTORS) for (uint8_t i = 0; i < E_STEPPERS; ++i) { - if (!forReplay) SERIAL_ECHO_START(); + report_echo_start(forReplay); SERIAL_ECHOLNPGM_P( PSTR(" M203 T"), i , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS_N(i)]) diff --git a/Marlin/src/gcode/config/M550.cpp b/Marlin/src/gcode/config/M550.cpp index 6ff0c506de..88712786da 100644 --- a/Marlin/src/gcode/config/M550.cpp +++ b/Marlin/src/gcode/config/M550.cpp @@ -42,7 +42,7 @@ void GcodeSuite::M550() { machine_name = parser.value_string(); else if (TERN(GCODE_QUOTED_STRINGS, false, parser.seen('P'))) machine_name = parser.string_arg[0] == 'P' ? &parser.string_arg[1] : parser.string_arg; - else if (parser.string_arg && parser.string_arg[0]) + else if (parser.has_string()) machine_name = parser.string_arg; else did_set = false; diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index 167cdae4a9..56d7594b08 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -115,7 +115,7 @@ 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; - #ifdef DEBUG_DXC_MODE + #if ENABLED(DEBUG_DXC_MODE) if (parser.seen('W')) { DEBUG_ECHO_START(); diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index 9f6fb2bb00..ce6428950e 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -69,7 +69,7 @@ void GcodeSuite::T(const int8_t tool_index) { reset_stepper_timeout(); #if HAS_PRUSA_MMU3 - if (parser.string_arg) { + if (parser.has_string()) { mmu3.tool_change(parser.string_arg[0], uint8_t(tool_index)); // Special commands T?/Tx/Tc return; } diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index ab1c316705..425d27a72d 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -46,15 +46,32 @@ * Set percentage of max current for all axes (Requires HAS_DIGIPOT_DAC) */ void GcodeSuite::M907() { + #if HAS_MOTOR_CURRENT_SPI if (!parser.seen("BS" STR_AXES_LOGICAL)) return M907_report(); - if (parser.seenval('S')) for (uint8_t i = 0; i < MOTOR_CURRENT_COUNT; ++i) stepper.set_digipot_current(i, parser.value_int()); - LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper.set_digipot_current(i, parser.value_int()); // X Y Z (I J K U V W) E (map to drivers according to DIGIPOT_CHANNELS. Default with NUM_AXES 3: map X Y Z E to X Y Z E0) - // Additional extruders use B,C. - // TODO: Change these parameters because 'E' is used and D should be reserved for debugging. B? + // S - Set current in mA for all axes + if (parser.seenval('S')) + for (uint8_t i = 0; i < MOTOR_CURRENT_COUNT; ++i) + stepper.set_digipot_current(i, parser.value_int()); + + // X Y Z I J K U V W E + // Map to drivers according to pots addresses. + // Default with NUM_AXES 3: map X Y Z E to X Y Z E0. + LOOP_LOGICAL_AXES(i) + if (parser.seenval(IAXIS_CHAR(i))) + stepper.set_digipot_current(i, parser.value_int()); + + /** + * Additional extruders use B,C in this legacy protocol + * TODO: Update to allow for an index with X, Y, Z, E axis to isolate a single stepper + * and use configured axis names instead of IJKUVW. i.e., Match the behavior of + * other G-codes that set stepper-specific parameters. If necessary deprecate G-codes. + * Bonus Points: Standardize a method that all G-codes can use to refer to one or + * more steppers/drivers and apply to various G-codes. + */ #if E_STEPPERS >= 2 if (parser.seenval('B')) stepper.set_digipot_current(E_AXIS + 1, parser.value_int()); #if E_STEPPERS >= 3 @@ -68,58 +85,88 @@ void GcodeSuite::M907() { #define HAS_X_Y_XY_I_J_K_U_V_W 1 #endif - #if HAS_X_Y_XY_I_J_K_U_V_W || HAS_MOTOR_CURRENT_PWM_E || PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if ANY(HAS_X_Y_XY_I_J_K_U_V_W, HAS_MOTOR_CURRENT_PWM_E, HAS_MOTOR_CURRENT_PWM_Z) if (!parser.seen("S" #if HAS_X_Y_XY_I_J_K_U_V_W - "XY" SECONDARY_AXIS_GANG("I", "J", "K", "U", "V", "W") - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - "Z" - #endif - #if HAS_MOTOR_CURRENT_PWM_E - "E" + NUM_AXIS_GANG("X", "Y",, "I", "J", "K", "U", "V", "W") #endif + TERN_(HAS_MOTOR_CURRENT_PWM_Z, "Z") + TERN_(HAS_MOTOR_CURRENT_PWM_E, "E") )) return M907_report(); - if (parser.seenval('S')) for (uint8_t a = 0; a < MOTOR_CURRENT_COUNT; ++a) stepper.set_digipot_current(a, parser.value_int()); + // S - Set all stepper current to the same value + if (parser.seenval('S')) { + const int16_t v = parser.value_int(); + for (uint8_t a = 0; a < MOTOR_CURRENT_COUNT; ++a) + stepper.set_digipot_current(a, v); + } - #if HAS_X_Y_XY_I_J_K_U_V_W - if (NUM_AXIS_GANG( - parser.seenval('X'), || parser.seenval('Y'), || false, - || parser.seenval('I'), || parser.seenval('J'), || parser.seenval('K'), - || parser.seenval('U'), || parser.seenval('V'), || parser.seenval('W') - )) stepper.set_digipot_current(0, parser.value_int()); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - if (parser.seenval('Z')) stepper.set_digipot_current(1, parser.value_int()); - #endif - #if HAS_MOTOR_CURRENT_PWM_E - if (parser.seenval('E')) stepper.set_digipot_current(2, parser.value_int()); - #endif + // X Y I J K U V W - All aliases to set the current for "most axes." + // Only the value of the last given parameter is used. + if (ENABLED(HAS_X_Y_XY_I_J_K_U_V_W) && (NUM_AXIS_GANG( + parser.seenval('X'), || parser.seenval('Y'), || false, + || parser.seenval('I'), || parser.seenval('J'), || parser.seenval('K'), + || parser.seenval('U'), || parser.seenval('V'), || parser.seenval('W') + ))) + stepper.set_digipot_current(0, parser.value_int()); + + // Z - Set the current just for the Z axis + if (TERN0(HAS_MOTOR_CURRENT_PWM_Z, parser.seenval('Z'))) + stepper.set_digipot_current(1, parser.value_int()); + + // Z - Set the current just for the Extruder + if (TERN0(HAS_MOTOR_CURRENT_PWM_E, parser.seenval('E'))) + stepper.set_digipot_current(2, parser.value_int()); #endif #endif // HAS_MOTOR_CURRENT_PWM #if HAS_MOTOR_CURRENT_I2C - // this one uses actual amps in floating point - if (parser.seenval('S')) for (uint8_t q = 0; q < DIGIPOT_I2C_NUM_CHANNELS; ++q) digipot_i2c.set_current(q, parser.value_float()); - LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) digipot_i2c.set_current(i, parser.value_float()); // X Y Z (I J K U V W) E (map to drivers according to pots adresses. Default with NUM_AXES 3 X Y Z E: map to X Y Z E0) + // This current driver takes actual Amps in floating point + // rather than milli-amps or some scalar unit. + + // S - Set the same current in Amps on all channels + if (parser.seenval('S')) { + const float v = parser.value_float(); + for (uint8_t q = 0; q < DIGIPOT_I2C_NUM_CHANNELS; ++q) + digipot_i2c.set_current(q, v); + } + + // X Y Z I J K U V W E + // Map to drivers according to pots addresses. + // Default with NUM_AXES 3: map X Y Z E to X Y Z E0. + LOOP_LOGICAL_AXES(i) + if (parser.seenval(IAXIS_CHAR(i))) + digipot_i2c.set_current(i, parser.value_float()); + // Additional extruders use B,C,D. - // TODO: Change these parameters because 'E' is used and because 'D' should be reserved for debugging. B? + // TODO: Make parameters work like other axis-specific / stepper-specific. See above. #if E_STEPPERS >= 2 for (uint8_t i = E_AXIS + 1; i < _MAX(DIGIPOT_I2C_NUM_CHANNELS, (NUM_AXES + 3)); i++) - if (parser.seenval('B' + i - (E_AXIS + 1))) digipot_i2c.set_current(i, parser.value_float()); + if (parser.seenval('B' + i - (E_AXIS + 1))) + digipot_i2c.set_current(i, parser.value_float()); #endif - #endif + + #endif // HAS_MOTOR_CURRENT_I2C #if HAS_MOTOR_CURRENT_DAC + + // S - Set the same current percentage on all axes if (parser.seenval('S')) { const float dac_percent = parser.value_float(); - LOOP_LOGICAL_AXES(i) stepper_dac.set_current_percent(i, dac_percent); + LOOP_LOGICAL_AXES(i) + stepper_dac.set_current_percent(i, dac_percent); } - LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper_dac.set_current_percent(i, parser.value_float()); // X Y Z (I J K U V W) E (map to drivers according to DAC_STEPPER_ORDER. Default with NUM_AXES 3: X Y Z E map to X Y Z E0) + + // X Y Z I J K U V W E + // Map to drivers according to pots addresses. + // Default with NUM_AXES 3: map X Y Z E to X Y Z E0. + LOOP_LOGICAL_AXES(i) + if (parser.seenval(IAXIS_CHAR(i))) + stepper_dac.set_current_percent(i, parser.value_float()); + #endif } @@ -131,8 +178,10 @@ void GcodeSuite::M907() { report_heading_etc(forReplay, F(STR_STEPPER_MOTOR_CURRENTS)); #if HAS_MOTOR_CURRENT_PWM SERIAL_ECHOLNPGM_P( // PWM-based has 3 values: - PSTR(" M907 X"), stepper.motor_current_setting[0] // X, Y, (I, J, K, U, V, W) - , SP_Z_STR, stepper.motor_current_setting[1] // Z + PSTR(" M907 X"), stepper.motor_current_setting[0] // X, Y, (I, J, K, U, V, W) + #if HAS_MOTOR_CURRENT_PWM_Z + , SP_Z_STR, stepper.motor_current_setting[1] // Z + #endif #if HAS_MOTOR_CURRENT_PWM_E , SP_E_STR, stepper.motor_current_setting[2] // E #endif diff --git a/Marlin/src/gcode/feature/network/M552-M554.cpp b/Marlin/src/gcode/feature/network/M552-M554.cpp index 9a09a973c8..fc965fc3bd 100644 --- a/Marlin/src/gcode/feature/network/M552-M554.cpp +++ b/Marlin/src/gcode/feature/network/M552-M554.cpp @@ -28,44 +28,6 @@ #include "../../../core/serial.h" #include "../../gcode.h" -void say_ethernet() { SERIAL_ECHOPGM(" Ethernet "); } - -void ETH0_report() { - say_ethernet(); - SERIAL_ECHO_TERNARY(ethernet.hardware_enabled, "port ", "en", "dis", "abled.\n"); - if (ethernet.hardware_enabled) { - say_ethernet(); - SERIAL_ECHO_TERNARY(ethernet.have_telnet_client, "client ", "en", "dis", "abled.\n"); - } - else - SERIAL_ECHOLNPGM("Send 'M552 S1' to enable."); -} - -void MAC_report() { - uint8_t mac[6]; - if (ethernet.hardware_enabled) { - Ethernet.MACAddress(mac); - SERIAL_ECHOPGM(" MAC: "); - for (uint8_t i = 0; i < 6; ++i) { - if (mac[i] < 16) SERIAL_CHAR('0'); - SERIAL_PRINT(mac[i], PrintBase::Hex); - if (i < 5) SERIAL_CHAR(':'); - } - } - SERIAL_EOL(); -} - -// Display current values when the link is active, -// otherwise show the stored values -void ip_report(const uint16_t cmd, FSTR_P const post, const IPAddress &ipo) { - SERIAL_CHAR('M'); SERIAL_ECHO(cmd); SERIAL_CHAR(' '); - for (uint8_t i = 0; i < 4; ++i) { - SERIAL_ECHO(ipo[i]); - if (i < 3) SERIAL_CHAR('.'); - } - SERIAL_ECHOLN(F(" ; "), post); -} - /** * M552: Set IP address, enable/disable network interface * @@ -92,13 +54,13 @@ void GcodeSuite::M552() { } } const bool nopar = !seenS && !seenP; - if (nopar || seenS) ETH0_report(); + if (nopar || seenS) ethernet.ETH0_report(); if (nopar || seenP) M552_report(); } -void GcodeSuite::M552_report() { +void GcodeSuite::M552_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); - ip_report(552, F("ip address"), Ethernet.linkStatus() == LinkON ? Ethernet.localIP() : ethernet.ip); + ethernet.ip_report(552, F("ip address"), Ethernet.linkStatus() == LinkON ? Ethernet.localIP() : ethernet.ip, forReplay); } /** @@ -111,9 +73,9 @@ void GcodeSuite::M553() { M553_report(); } -void GcodeSuite::M553_report() { +void GcodeSuite::M553_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); - ip_report(553, F("subnet mask"), Ethernet.linkStatus() == LinkON ? Ethernet.subnetMask() : ethernet.subnet); + ethernet.ip_report(553, F("subnet mask"), Ethernet.linkStatus() == LinkON ? Ethernet.subnetMask() : ethernet.subnet, forReplay); } /** @@ -126,9 +88,9 @@ void GcodeSuite::M554() { M554_report(); } -void GcodeSuite::M554_report() { +void GcodeSuite::M554_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); - ip_report(554, F("gateway"), Ethernet.linkStatus() == LinkON ? Ethernet.gatewayIP() : ethernet.gateway); + ethernet.ip_report(554, F("gateway"), Ethernet.linkStatus() == LinkON ? Ethernet.gatewayIP() : ethernet.gateway, forReplay); } #endif // HAS_ETHERNET diff --git a/Marlin/src/gcode/feature/nonlinear/M592.cpp b/Marlin/src/gcode/feature/nonlinear/M592.cpp index 2fc02133ec..77a6258ddc 100644 --- a/Marlin/src/gcode/feature/nonlinear/M592.cpp +++ b/Marlin/src/gcode/feature/nonlinear/M592.cpp @@ -29,7 +29,7 @@ void GcodeSuite::M592_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); - report_heading(forReplay, F(STR_NONLINEAR_EXTRUSION)); + report_heading_etc(forReplay, F(STR_NONLINEAR_EXTRUSION)); SERIAL_ECHOLNPGM(" M592 A", stepper.ne.A, " B", stepper.ne.B, " C", stepper.ne.C); } diff --git a/Marlin/src/gcode/feature/pause/M603.cpp b/Marlin/src/gcode/feature/pause/M603.cpp index fcc042f58e..fd8a779ae0 100644 --- a/Marlin/src/gcode/feature/pause/M603.cpp +++ b/Marlin/src/gcode/feature/pause/M603.cpp @@ -64,7 +64,6 @@ void GcodeSuite::M603_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); report_heading(forReplay, F(STR_FILAMENT_LOAD_UNLOAD)); - #if EXTRUDERS == 1 report_echo_start(forReplay); SERIAL_ECHOPGM(" M603 L", LINEAR_UNIT(fc_settings[0].load_length), " U", LINEAR_UNIT(fc_settings[0].unload_length), " ;"); diff --git a/Marlin/src/gcode/feature/trinamic/M569.cpp b/Marlin/src/gcode/feature/trinamic/M569.cpp index 06a4992ceb..99bbf6ed35 100644 --- a/Marlin/src/gcode/feature/trinamic/M569.cpp +++ b/Marlin/src/gcode/feature/trinamic/M569.cpp @@ -160,7 +160,7 @@ void GcodeSuite::M569_report(const bool forReplay/*=true*/) { report_heading(forReplay, F(STR_DRIVER_STEPPING_MODE)); auto say_M569 = [](const bool forReplay, FSTR_P const etc=nullptr, const bool eol=false) { - if (!forReplay) SERIAL_ECHO_START(); + report_echo_start(forReplay); SERIAL_ECHOPGM(" M569 S1"); if (etc) SERIAL_ECHO(C(' '), etc); if (eol) SERIAL_EOL(); diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp index c0dc456a8a..74bbf9cae0 100644 --- a/Marlin/src/gcode/feature/trinamic/M906.cpp +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -37,6 +37,8 @@ static void tmc_print_current(TMC &st) { /** * M906: Set motor current in milliamps. * + * With no parameters report driver currents. + * * Parameters: * X[current] - Set mA current for X driver(s) * Y[current] - Set mA current for Y driver(s) @@ -52,181 +54,109 @@ static void tmc_print_current(TMC &st) { * I[index] - Axis sub-index (Omit or 0 for X, Y, Z; 1 for X2, Y2, Z2; 2 for Z3; 3 for Z4.) * T[index] - Extruder index (Zero-based. Omit for E0 only.) * - * With no parameters report driver currents. + * With EDITABLE_HOMING_CURRENT: + * H - Set / Report Homing Current. Alias for M920. */ void GcodeSuite::M906() { + #if ENABLED(EDITABLE_HOMING_CURRENT) + if (parser.seen_test('H')) return M920(); + #endif + #define TMC_SAY_CURRENT(Q) tmc_print_current(stepper##Q) #define TMC_SET_CURRENT(Q) stepper##Q.rms_current(value) bool report = true; - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(X2_IS_TRINAMIC, Y2_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) const int8_t index = parser.byteval('I', -1); - #elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + #elif ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC) constexpr int8_t index = -1; #endif LOOP_LOGICAL_AXES(i) if (uint16_t value = parser.intval(AXIS_CHAR(i))) { report = false; switch (i) { - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) + #if X_IS_TRINAMIC || X2_IS_TRINAMIC case X_AXIS: - #if AXIS_IS_TMC(X) - if (index < 0 || index == 0) TMC_SET_CURRENT(X); - #endif - #if AXIS_IS_TMC(X2) - if (index < 0 || index == 1) TMC_SET_CURRENT(X2); - #endif + TERN_(X_IS_TRINAMIC, if (index < 0 || index == 0) TMC_SET_CURRENT(X)); + TERN_(X2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CURRENT(X2)); break; #endif - #if AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) + #if Y_IS_TRINAMIC || Y2_IS_TRINAMIC case Y_AXIS: - #if AXIS_IS_TMC(Y) - if (index < 0 || index == 0) TMC_SET_CURRENT(Y); - #endif - #if AXIS_IS_TMC(Y2) - if (index < 0 || index == 1) TMC_SET_CURRENT(Y2); - #endif + TERN_(Y_IS_TRINAMIC, if (index < 0 || index == 0) TMC_SET_CURRENT(Y)); + TERN_(Y2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CURRENT(Y2)); break; #endif - #if AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(Z_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) case Z_AXIS: - #if AXIS_IS_TMC(Z) - if (index < 0 || index == 0) TMC_SET_CURRENT(Z); - #endif - #if AXIS_IS_TMC(Z2) - if (index < 0 || index == 1) TMC_SET_CURRENT(Z2); - #endif - #if AXIS_IS_TMC(Z3) - if (index < 0 || index == 2) TMC_SET_CURRENT(Z3); - #endif - #if AXIS_IS_TMC(Z4) - if (index < 0 || index == 3) TMC_SET_CURRENT(Z4); - #endif + TERN_(Z_IS_TRINAMIC, if (index < 0 || index == 0) TMC_SET_CURRENT(Z)); + TERN_(Z2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CURRENT(Z2)); + TERN_(Z3_IS_TRINAMIC, if (index < 0 || index == 2) TMC_SET_CURRENT(Z3)); + TERN_(Z4_IS_TRINAMIC, if (index < 0 || index == 3) TMC_SET_CURRENT(Z4)); break; #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC case I_AXIS: TMC_SET_CURRENT(I); break; #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC case J_AXIS: TMC_SET_CURRENT(J); break; #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC case K_AXIS: TMC_SET_CURRENT(K); break; #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC case U_AXIS: TMC_SET_CURRENT(U); break; #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC case V_AXIS: TMC_SET_CURRENT(V); break; #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC case W_AXIS: TMC_SET_CURRENT(W); break; #endif - #if AXIS_IS_TMC(E0) || AXIS_IS_TMC(E1) || AXIS_IS_TMC(E2) || AXIS_IS_TMC(E3) || AXIS_IS_TMC(E4) || AXIS_IS_TMC(E5) || AXIS_IS_TMC(E6) || AXIS_IS_TMC(E7) + #if ANY(E0_IS_TRINAMIC, E1_IS_TRINAMIC, E2_IS_TRINAMIC, E3_IS_TRINAMIC, E4_IS_TRINAMIC, E5_IS_TRINAMIC, E6_IS_TRINAMIC, E7_IS_TRINAMIC) case E_AXIS: { const int8_t eindex = get_target_e_stepper_from_command(-2); - #if AXIS_IS_TMC(E0) - if (eindex < 0 || eindex == 0) TMC_SET_CURRENT(E0); - #endif - #if AXIS_IS_TMC(E1) - if (eindex < 0 || eindex == 1) TMC_SET_CURRENT(E1); - #endif - #if AXIS_IS_TMC(E2) - if (eindex < 0 || eindex == 2) TMC_SET_CURRENT(E2); - #endif - #if AXIS_IS_TMC(E3) - if (eindex < 0 || eindex == 3) TMC_SET_CURRENT(E3); - #endif - #if AXIS_IS_TMC(E4) - if (eindex < 0 || eindex == 4) TMC_SET_CURRENT(E4); - #endif - #if AXIS_IS_TMC(E5) - if (eindex < 0 || eindex == 5) TMC_SET_CURRENT(E5); - #endif - #if AXIS_IS_TMC(E6) - if (eindex < 0 || eindex == 6) TMC_SET_CURRENT(E6); - #endif - #if AXIS_IS_TMC(E7) - if (eindex < 0 || eindex == 7) TMC_SET_CURRENT(E7); - #endif + TERN_(E0_IS_TRINAMIC, if (eindex < 0 || eindex == 0) TMC_SET_CURRENT(E0)); + TERN_(E1_IS_TRINAMIC, if (eindex < 0 || eindex == 1) TMC_SET_CURRENT(E1)); + TERN_(E2_IS_TRINAMIC, if (eindex < 0 || eindex == 2) TMC_SET_CURRENT(E2)); + TERN_(E3_IS_TRINAMIC, if (eindex < 0 || eindex == 3) TMC_SET_CURRENT(E3)); + TERN_(E4_IS_TRINAMIC, if (eindex < 0 || eindex == 4) TMC_SET_CURRENT(E4)); + TERN_(E5_IS_TRINAMIC, if (eindex < 0 || eindex == 5) TMC_SET_CURRENT(E5)); + TERN_(E6_IS_TRINAMIC, if (eindex < 0 || eindex == 6) TMC_SET_CURRENT(E6)); + TERN_(E7_IS_TRINAMIC, if (eindex < 0 || eindex == 7) TMC_SET_CURRENT(E7)); } break; #endif } } if (report) { - #if AXIS_IS_TMC(X) - TMC_SAY_CURRENT(X); - #endif - #if AXIS_IS_TMC(X2) - TMC_SAY_CURRENT(X2); - #endif - #if AXIS_IS_TMC(Y) - TMC_SAY_CURRENT(Y); - #endif - #if AXIS_IS_TMC(Y2) - TMC_SAY_CURRENT(Y2); - #endif - #if AXIS_IS_TMC(Z) - TMC_SAY_CURRENT(Z); - #endif - #if AXIS_IS_TMC(Z2) - TMC_SAY_CURRENT(Z2); - #endif - #if AXIS_IS_TMC(Z3) - TMC_SAY_CURRENT(Z3); - #endif - #if AXIS_IS_TMC(Z4) - TMC_SAY_CURRENT(Z4); - #endif - #if AXIS_IS_TMC(I) - TMC_SAY_CURRENT(I); - #endif - #if AXIS_IS_TMC(J) - TMC_SAY_CURRENT(J); - #endif - #if AXIS_IS_TMC(K) - TMC_SAY_CURRENT(K); - #endif - #if AXIS_IS_TMC(U) - TMC_SAY_CURRENT(U); - #endif - #if AXIS_IS_TMC(V) - TMC_SAY_CURRENT(V); - #endif - #if AXIS_IS_TMC(W) - TMC_SAY_CURRENT(W); - #endif - - #if AXIS_IS_TMC(E0) - TMC_SAY_CURRENT(E0); - #endif - #if AXIS_IS_TMC(E1) - TMC_SAY_CURRENT(E1); - #endif - #if AXIS_IS_TMC(E2) - TMC_SAY_CURRENT(E2); - #endif - #if AXIS_IS_TMC(E3) - TMC_SAY_CURRENT(E3); - #endif - #if AXIS_IS_TMC(E4) - TMC_SAY_CURRENT(E4); - #endif - #if AXIS_IS_TMC(E5) - TMC_SAY_CURRENT(E5); - #endif - #if AXIS_IS_TMC(E6) - TMC_SAY_CURRENT(E6); - #endif - #if AXIS_IS_TMC(E7) - TMC_SAY_CURRENT(E7); - #endif + TERN_(X_IS_TRINAMIC, TMC_SAY_CURRENT(X)); + TERN_(X2_IS_TRINAMIC, TMC_SAY_CURRENT(X2)); + TERN_(Y_IS_TRINAMIC, TMC_SAY_CURRENT(Y)); + TERN_(Y2_IS_TRINAMIC, TMC_SAY_CURRENT(Y2)); + TERN_(Z_IS_TRINAMIC, TMC_SAY_CURRENT(Z)); + TERN_(Z2_IS_TRINAMIC, TMC_SAY_CURRENT(Z2)); + TERN_(Z3_IS_TRINAMIC, TMC_SAY_CURRENT(Z3)); + TERN_(Z4_IS_TRINAMIC, TMC_SAY_CURRENT(Z4)); + TERN_(I_IS_TRINAMIC, TMC_SAY_CURRENT(I)); + TERN_(J_IS_TRINAMIC, TMC_SAY_CURRENT(J)); + TERN_(K_IS_TRINAMIC, TMC_SAY_CURRENT(K)); + TERN_(U_IS_TRINAMIC, TMC_SAY_CURRENT(U)); + TERN_(V_IS_TRINAMIC, TMC_SAY_CURRENT(V)); + TERN_(W_IS_TRINAMIC, TMC_SAY_CURRENT(W)); + TERN_(E0_IS_TRINAMIC, TMC_SAY_CURRENT(E0)); + TERN_(E1_IS_TRINAMIC, TMC_SAY_CURRENT(E1)); + TERN_(E2_IS_TRINAMIC, TMC_SAY_CURRENT(E2)); + TERN_(E3_IS_TRINAMIC, TMC_SAY_CURRENT(E3)); + TERN_(E4_IS_TRINAMIC, TMC_SAY_CURRENT(E4)); + TERN_(E5_IS_TRINAMIC, TMC_SAY_CURRENT(E5)); + TERN_(E6_IS_TRINAMIC, TMC_SAY_CURRENT(E6)); + TERN_(E7_IS_TRINAMIC, TMC_SAY_CURRENT(E7)); } } @@ -240,93 +170,67 @@ void GcodeSuite::M906_report(const bool forReplay/*=true*/) { SERIAL_ECHOPGM(" M906"); }; - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) \ - || AXIS_IS_TMC(I) || AXIS_IS_TMC(J) || AXIS_IS_TMC(K) \ - || AXIS_IS_TMC(U) || AXIS_IS_TMC(V) || AXIS_IS_TMC(W) + #if ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC, I_IS_TRINAMIC, J_IS_TRINAMIC, K_IS_TRINAMIC, U_IS_TRINAMIC, V_IS_TRINAMIC, W_IS_TRINAMIC) say_M906(forReplay); - #if AXIS_IS_TMC(X) - SERIAL_ECHOPGM_P(SP_X_STR, stepperX.getMilliamps()); - #endif - #if AXIS_IS_TMC(Y) - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.getMilliamps()); - #endif - #if AXIS_IS_TMC(Z) - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.getMilliamps()); - #endif - #if AXIS_IS_TMC(I) - SERIAL_ECHOPGM_P(SP_I_STR, stepperI.getMilliamps()); - #endif - #if AXIS_IS_TMC(J) - SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.getMilliamps()); - #endif - #if AXIS_IS_TMC(K) - SERIAL_ECHOPGM_P(SP_K_STR, stepperK.getMilliamps()); - #endif - #if AXIS_IS_TMC(U) - SERIAL_ECHOPGM_P(SP_U_STR, stepperU.getMilliamps()); - #endif - #if AXIS_IS_TMC(V) - SERIAL_ECHOPGM_P(SP_V_STR, stepperV.getMilliamps()); - #endif - #if AXIS_IS_TMC(W) - SERIAL_ECHOPGM_P(SP_W_STR, stepperW.getMilliamps()); - #endif + TERN_(X_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_X_STR, stepperX.getMilliamps())); + TERN_(Y_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.getMilliamps())); + TERN_(Z_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.getMilliamps())); + TERN_(I_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_I_STR, stepperI.getMilliamps())); + TERN_(J_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.getMilliamps())); + TERN_(K_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_K_STR, stepperK.getMilliamps())); + TERN_(U_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_U_STR, stepperU.getMilliamps())); + TERN_(V_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_V_STR, stepperV.getMilliamps())); + TERN_(W_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_W_STR, stepperW.getMilliamps())); SERIAL_EOL(); #endif - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) + #if X2_IS_TRINAMIC || Y2_IS_TRINAMIC || Z2_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOPGM(" I1"); - #if AXIS_IS_TMC(X2) - SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.getMilliamps()); - #endif - #if AXIS_IS_TMC(Y2) - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.getMilliamps()); - #endif - #if AXIS_IS_TMC(Z2) - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.getMilliamps()); - #endif + TERN_(X2_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.getMilliamps())); + TERN_(Y2_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.getMilliamps())); + TERN_(Z2_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.getMilliamps())); SERIAL_EOL(); #endif - #if AXIS_IS_TMC(Z3) + #if Z3_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" I2 Z", stepperZ3.getMilliamps()); #endif - #if AXIS_IS_TMC(Z4) + #if Z4_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" I3 Z", stepperZ4.getMilliamps()); #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T0 E", stepperE0.getMilliamps()); #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T1 E", stepperE1.getMilliamps()); #endif - #if AXIS_IS_TMC(E2) + #if E2_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T2 E", stepperE2.getMilliamps()); #endif - #if AXIS_IS_TMC(E3) + #if E3_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T3 E", stepperE3.getMilliamps()); #endif - #if AXIS_IS_TMC(E4) + #if E4_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T4 E", stepperE4.getMilliamps()); #endif - #if AXIS_IS_TMC(E5) + #if E5_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T5 E", stepperE5.getMilliamps()); #endif - #if AXIS_IS_TMC(E6) + #if E6_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T6 E", stepperE6.getMilliamps()); #endif - #if AXIS_IS_TMC(E7) + #if E7_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T7 E", stepperE7.getMilliamps()); #endif diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp index ba6d9538a4..f4b0ac3670 100644 --- a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp +++ b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp @@ -274,7 +274,23 @@ } /** - * M913: Set HYBRID_THRESHOLD speed. + * M913: Set HYBRID_THRESHOLD speed, aka PWM Threshold. + * + * Parameters: + * I - For multi-stepper axes, the one-based index of the stepper to modify in each set + * + * E - Set threshold for one or more Extruders + * T - The zero-based index of the Extruder to modify + * + * X - Set threshold for one or more X axis steppers + * Y - Set threshold for one or more Y axis steppers + * Z - Set threshold for one or more Z axis steppers + * A - Set threshold for one or more A axis steppers + * B - Set threshold for one or more B axis steppers + * C - Set threshold for one or more C axis steppers + * U - Set threshold for one or more U axis steppers + * V - Set threshold for one or more V axis steppers + * W - Set threshold for one or more W axis steppers */ void GcodeSuite::M913() { #define TMC_SAY_PWMTHRS(A,Q) tmc_print_pwmthrs(stepper##Q) @@ -283,9 +299,9 @@ #define TMC_SET_PWMTHRS_E(E) stepperE##E.set_pwm_thrs(value) bool report = true; - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(X2_IS_TRINAMIC, Y2_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) const uint8_t index = parser.byteval('I'); - #elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + #elif ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC) constexpr uint8_t index = 0; #endif LOOP_LOGICAL_AXES(i) if (int32_t value = parser.longval(AXIS_CHAR(i))) { @@ -387,70 +403,37 @@ SERIAL_ECHOPGM(" M913"); }; - #if X_HAS_STEALTHCHOP || Y_HAS_STEALTHCHOP || Z_HAS_STEALTHCHOP + #if ANY(X_HAS_STEALTHCHOP, Y_HAS_STEALTHCHOP, Z_HAS_STEALTHCHOP, I_HAS_STEALTHCHOP, J_HAS_STEALTHCHOP, K_HAS_STEALTHCHOP, U_HAS_STEALTHCHOP, V_HAS_STEALTHCHOP, W_HAS_STEALTHCHOP) say_M913(forReplay); - #if X_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_X_STR, stepperX.get_pwm_thrs()); - #endif - #if Y_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.get_pwm_thrs()); - #endif - #if Z_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.get_pwm_thrs()); - #endif + TERN_(X_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_X_STR, stepperX.get_pwm_thrs())); + TERN_(Y_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.get_pwm_thrs())); + TERN_(Z_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.get_pwm_thrs())); + TERN_(I_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_I_STR, stepperI.get_pwm_thrs())); + TERN_(J_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.get_pwm_thrs())); + TERN_(K_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_K_STR, stepperK.get_pwm_thrs())); + TERN_(U_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_U_STR, stepperU.get_pwm_thrs())); + TERN_(V_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_V_STR, stepperV.get_pwm_thrs())); + TERN_(W_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_W_STR, stepperW.get_pwm_thrs())); SERIAL_EOL(); #endif #if X2_HAS_STEALTHCHOP || Y2_HAS_STEALTHCHOP || Z2_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOPGM(" I2"); - #if X2_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.get_pwm_thrs()); - #endif - #if Y2_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.get_pwm_thrs()); - #endif - #if Z2_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.get_pwm_thrs()); - #endif + TERN_(X2_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.get_pwm_thrs())); + TERN_(Y2_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.get_pwm_thrs())); + TERN_(Z2_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.get_pwm_thrs())); SERIAL_EOL(); #endif - #if Z3_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOLNPGM(" I3 Z", stepperZ3.get_pwm_thrs()); #endif - #if Z4_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOLNPGM(" I4 Z", stepperZ4.get_pwm_thrs()); #endif - #if I_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_I_STR, stepperI.get_pwm_thrs()); - #endif - #if J_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_J_STR, stepperJ.get_pwm_thrs()); - #endif - #if K_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_K_STR, stepperK.get_pwm_thrs()); - #endif - #if U_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_U_STR, stepperU.get_pwm_thrs()); - #endif - #if V_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_V_STR, stepperV.get_pwm_thrs()); - #endif - #if W_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_W_STR, stepperW.get_pwm_thrs()); - #endif - #if E0_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOLNPGM(" T0 E", stepperE0.get_pwm_thrs()); @@ -498,7 +481,19 @@ } /** - * M914: Set StallGuard sensitivity. + * M914: Set StallGuard sensitivity in terms of "homing threshold" (not for stall detection during printing). + * + * Parameters: + * I - For multi-stepper axes, the one-based index of the stepper to modify in each set + * X - Set threshold for one or more X axis steppers + * Y - Set threshold for one or more Y axis steppers + * Z - Set threshold for one or more Z axis steppers + * A - Set threshold for one or more A axis steppers + * B - Set threshold for one or more B axis steppers + * C - Set threshold for one or more C axis steppers + * U - Set threshold for one or more U axis steppers + * V - Set threshold for one or more V axis steppers + * W - Set threshold for one or more W axis steppers */ void GcodeSuite::M914() { bool report = true; @@ -536,33 +531,33 @@ #if K_SENSORLESS case K_AXIS: stepperK.homing_threshold(value); break; #endif - #if U_SENSORLESS && AXIS_HAS_STALLGUARD(U) + #if U_SENSORLESS case U_AXIS: stepperU.homing_threshold(value); break; #endif - #if V_SENSORLESS && AXIS_HAS_STALLGUARD(V) + #if V_SENSORLESS case V_AXIS: stepperV.homing_threshold(value); break; #endif - #if W_SENSORLESS && AXIS_HAS_STALLGUARD(W) + #if W_SENSORLESS case W_AXIS: stepperW.homing_threshold(value); break; #endif } } if (report) { - TERN_(X_SENSORLESS, tmc_print_sgt(stepperX)); + TERN_( X_SENSORLESS, tmc_print_sgt(stepperX)); TERN_(X2_SENSORLESS, tmc_print_sgt(stepperX2)); - TERN_(Y_SENSORLESS, tmc_print_sgt(stepperY)); + TERN_( Y_SENSORLESS, tmc_print_sgt(stepperY)); TERN_(Y2_SENSORLESS, tmc_print_sgt(stepperY2)); - TERN_(Z_SENSORLESS, tmc_print_sgt(stepperZ)); + TERN_( Z_SENSORLESS, tmc_print_sgt(stepperZ)); TERN_(Z2_SENSORLESS, tmc_print_sgt(stepperZ2)); TERN_(Z3_SENSORLESS, tmc_print_sgt(stepperZ3)); TERN_(Z4_SENSORLESS, tmc_print_sgt(stepperZ4)); - TERN_(I_SENSORLESS, tmc_print_sgt(stepperI)); - TERN_(J_SENSORLESS, tmc_print_sgt(stepperJ)); - TERN_(K_SENSORLESS, tmc_print_sgt(stepperK)); - TERN_(U_SENSORLESS, tmc_print_sgt(stepperU)); - TERN_(V_SENSORLESS, tmc_print_sgt(stepperV)); - TERN_(W_SENSORLESS, tmc_print_sgt(stepperW)); + TERN_( I_SENSORLESS, tmc_print_sgt(stepperI)); + TERN_( J_SENSORLESS, tmc_print_sgt(stepperJ)); + TERN_( K_SENSORLESS, tmc_print_sgt(stepperK)); + TERN_( U_SENSORLESS, tmc_print_sgt(stepperU)); + TERN_( V_SENSORLESS, tmc_print_sgt(stepperV)); + TERN_( W_SENSORLESS, tmc_print_sgt(stepperW)); } } @@ -578,67 +573,34 @@ #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS say_M914(forReplay); - #if X_SENSORLESS - SERIAL_ECHOPGM_P(SP_X_STR, stepperX.homing_threshold()); - #endif - #if Y_SENSORLESS - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.homing_threshold()); - #endif - #if Z_SENSORLESS - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.homing_threshold()); - #endif + TERN_(X_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, stepperX.homing_threshold())); + TERN_(Y_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.homing_threshold())); + TERN_(Z_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.homing_threshold())); + TERN_(I_SENSORLESS, SERIAL_ECHOPGM_P(SP_I_STR, stepperI.homing_threshold())); + TERN_(J_SENSORLESS, SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.homing_threshold())); + TERN_(K_SENSORLESS, SERIAL_ECHOPGM_P(SP_K_STR, stepperK.homing_threshold())); + TERN_(U_SENSORLESS, SERIAL_ECHOPGM_P(SP_U_STR, stepperU.homing_threshold())); + TERN_(V_SENSORLESS, SERIAL_ECHOPGM_P(SP_V_STR, stepperV.homing_threshold())); + TERN_(W_SENSORLESS, SERIAL_ECHOPGM_P(SP_W_STR, stepperW.homing_threshold())); SERIAL_EOL(); #endif #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS say_M914(forReplay); SERIAL_ECHOPGM(" I2"); - #if X2_SENSORLESS - SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.homing_threshold()); - #endif - #if Y2_SENSORLESS - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.homing_threshold()); - #endif - #if Z2_SENSORLESS - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.homing_threshold()); - #endif + TERN_(X2_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.homing_threshold())); + TERN_(Y2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.homing_threshold())); + TERN_(Z2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.homing_threshold())); SERIAL_EOL(); #endif - #if Z3_SENSORLESS say_M914(forReplay); SERIAL_ECHOLNPGM(" I3 Z", stepperZ3.homing_threshold()); #endif - #if Z4_SENSORLESS say_M914(forReplay); SERIAL_ECHOLNPGM(" I4 Z", stepperZ4.homing_threshold()); #endif - - #if I_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_I_STR, stepperI.homing_threshold()); - #endif - #if J_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_J_STR, stepperJ.homing_threshold()); - #endif - #if K_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_K_STR, stepperK.homing_threshold()); - #endif - #if U_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_U_STR, stepperU.homing_threshold()); - #endif - #if V_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_V_STR, stepperV.homing_threshold()); - #endif - #if W_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_W_STR, stepperW.homing_threshold()); - #endif } #endif // USE_SENSORLESS diff --git a/Marlin/src/gcode/feature/trinamic/M919.cpp b/Marlin/src/gcode/feature/trinamic/M919.cpp index 98227c7125..cabb30d7ff 100644 --- a/Marlin/src/gcode/feature/trinamic/M919.cpp +++ b/Marlin/src/gcode/feature/trinamic/M919.cpp @@ -91,9 +91,9 @@ void GcodeSuite::M919() { if (err) return; - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(X2_IS_TRINAMIC, Y2_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) const int8_t index = parser.byteval('I'); - #elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + #elif ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC) constexpr int8_t index = -1; #endif @@ -107,7 +107,7 @@ void GcodeSuite::M919() { #define TMC_SET_CHOPPER_TIME(Q) stepper##Q.set_chopper_times(make_chopper_timing(CHOPPER_TIMING_##Q, toff, hend, hstrt)) - #if AXIS_IS_TMC(E0) || AXIS_IS_TMC(E1) || AXIS_IS_TMC(E2) || AXIS_IS_TMC(E3) || AXIS_IS_TMC(E4) || AXIS_IS_TMC(E5) || AXIS_IS_TMC(E6) || AXIS_IS_TMC(E7) + #if ANY(E0_IS_TRINAMIC, E1_IS_TRINAMIC, E2_IS_TRINAMIC, E3_IS_TRINAMIC, E4_IS_TRINAMIC, E5_IS_TRINAMIC, E6_IS_TRINAMIC, E7_IS_TRINAMIC) #define HAS_E_CHOPPER 1 int8_t eindex = -1; #endif @@ -121,163 +121,66 @@ void GcodeSuite::M919() { SERIAL_ECHOLNPGM(GCODE_ERR_MSG("Axis ", C(AXIS_CHAR(i)), " has no TMC drivers.")); break; - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) + #if X_IS_TRINAMIC || X2_IS_TRINAMIC case X_AXIS: - #if AXIS_IS_TMC(X) - if (index <= 0) TMC_SET_CHOPPER_TIME(X); - #endif - #if AXIS_IS_TMC(X2) - if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(X2); - #endif + TERN_(X_IS_TRINAMIC, if (index <= 0) TMC_SET_CHOPPER_TIME(X)); + TERN_(X2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(X2)); break; #endif - #if AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) + #if Y_IS_TRINAMIC || Y2_IS_TRINAMIC case Y_AXIS: - #if AXIS_IS_TMC(Y) - if (index <= 0) TMC_SET_CHOPPER_TIME(Y); - #endif - #if AXIS_IS_TMC(Y2) - if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Y2); - #endif + TERN_(Y_IS_TRINAMIC, if (index <= 0) TMC_SET_CHOPPER_TIME(Y)); + TERN_(Y2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Y2)); break; #endif - #if AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(Z_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) case Z_AXIS: - #if AXIS_IS_TMC(Z) - if (index <= 0) TMC_SET_CHOPPER_TIME(Z); - #endif - #if AXIS_IS_TMC(Z2) - if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Z2); - #endif - #if AXIS_IS_TMC(Z3) - if (index < 0 || index == 2) TMC_SET_CHOPPER_TIME(Z3); - #endif - #if AXIS_IS_TMC(Z4) - if (index < 0 || index == 3) TMC_SET_CHOPPER_TIME(Z4); - #endif + TERN_(Z_IS_TRINAMIC, if (index <= 0) TMC_SET_CHOPPER_TIME(Z)); + TERN_(Z2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Z2)); + TERN_(Z3_IS_TRINAMIC, if (index < 0 || index == 2) TMC_SET_CHOPPER_TIME(Z3)); + TERN_(Z4_IS_TRINAMIC, if (index < 0 || index == 3) TMC_SET_CHOPPER_TIME(Z4)); break; #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC case I_AXIS: TMC_SET_CHOPPER_TIME(I); break; #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC case J_AXIS: TMC_SET_CHOPPER_TIME(J); break; #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC case K_AXIS: TMC_SET_CHOPPER_TIME(K); break; #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC case U_AXIS: TMC_SET_CHOPPER_TIME(U); break; #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC case V_AXIS: TMC_SET_CHOPPER_TIME(V); break; #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC case W_AXIS: TMC_SET_CHOPPER_TIME(W); break; #endif #if HAS_E_CHOPPER case E_AXIS: { - #if AXIS_IS_TMC(E0) - if (eindex <= 0) TMC_SET_CHOPPER_TIME(E0); - #endif - #if AXIS_IS_TMC(E1) - if (eindex < 0 || eindex == 1) TMC_SET_CHOPPER_TIME(E1); - #endif - #if AXIS_IS_TMC(E2) - if (eindex < 0 || eindex == 2) TMC_SET_CHOPPER_TIME(E2); - #endif - #if AXIS_IS_TMC(E3) - if (eindex < 0 || eindex == 3) TMC_SET_CHOPPER_TIME(E3); - #endif - #if AXIS_IS_TMC(E4) - if (eindex < 0 || eindex == 4) TMC_SET_CHOPPER_TIME(E4); - #endif - #if AXIS_IS_TMC(E5) - if (eindex < 0 || eindex == 5) TMC_SET_CHOPPER_TIME(E5); - #endif - #if AXIS_IS_TMC(E6) - if (eindex < 0 || eindex == 6) TMC_SET_CHOPPER_TIME(E6); - #endif - #if AXIS_IS_TMC(E7) - if (eindex < 0 || eindex == 7) TMC_SET_CHOPPER_TIME(E7); - #endif + TERN_(E0_IS_TRINAMIC, if (eindex <= 0) TMC_SET_CHOPPER_TIME(E0)); + TERN_(E1_IS_TRINAMIC, if (eindex < 0 || eindex == 1) TMC_SET_CHOPPER_TIME(E1)); + TERN_(E2_IS_TRINAMIC, if (eindex < 0 || eindex == 2) TMC_SET_CHOPPER_TIME(E2)); + TERN_(E3_IS_TRINAMIC, if (eindex < 0 || eindex == 3) TMC_SET_CHOPPER_TIME(E3)); + TERN_(E4_IS_TRINAMIC, if (eindex < 0 || eindex == 4) TMC_SET_CHOPPER_TIME(E4)); + TERN_(E5_IS_TRINAMIC, if (eindex < 0 || eindex == 5) TMC_SET_CHOPPER_TIME(E5)); + TERN_(E6_IS_TRINAMIC, if (eindex < 0 || eindex == 6) TMC_SET_CHOPPER_TIME(E6)); + TERN_(E7_IS_TRINAMIC, if (eindex < 0 || eindex == 7) TMC_SET_CHOPPER_TIME(E7)); } break; #endif } } if (report) { - #define TMC_SAY_CHOPPER_TIME(Q) tmc_print_chopper_time(stepper##Q) - #if AXIS_IS_TMC(X) - TMC_SAY_CHOPPER_TIME(X); - #endif - #if AXIS_IS_TMC(X2) - TMC_SAY_CHOPPER_TIME(X2); - #endif - #if AXIS_IS_TMC(Y) - TMC_SAY_CHOPPER_TIME(Y); - #endif - #if AXIS_IS_TMC(Y2) - TMC_SAY_CHOPPER_TIME(Y2); - #endif - #if AXIS_IS_TMC(Z) - TMC_SAY_CHOPPER_TIME(Z); - #endif - #if AXIS_IS_TMC(Z2) - TMC_SAY_CHOPPER_TIME(Z2); - #endif - #if AXIS_IS_TMC(Z3) - TMC_SAY_CHOPPER_TIME(Z3); - #endif - #if AXIS_IS_TMC(Z4) - TMC_SAY_CHOPPER_TIME(Z4); - #endif - #if AXIS_IS_TMC(I) - TMC_SAY_CHOPPER_TIME(I); - #endif - #if AXIS_IS_TMC(J) - TMC_SAY_CHOPPER_TIME(J); - #endif - #if AXIS_IS_TMC(K) - TMC_SAY_CHOPPER_TIME(K); - #endif - #if AXIS_IS_TMC(U) - TMC_SAY_CHOPPER_TIME(U); - #endif - #if AXIS_IS_TMC(V) - TMC_SAY_CHOPPER_TIME(V); - #endif - #if AXIS_IS_TMC(W) - TMC_SAY_CHOPPER_TIME(W); - #endif - #if AXIS_IS_TMC(E0) - TMC_SAY_CHOPPER_TIME(E0); - #endif - #if AXIS_IS_TMC(E1) - TMC_SAY_CHOPPER_TIME(E1); - #endif - #if AXIS_IS_TMC(E2) - TMC_SAY_CHOPPER_TIME(E2); - #endif - #if AXIS_IS_TMC(E3) - TMC_SAY_CHOPPER_TIME(E3); - #endif - #if AXIS_IS_TMC(E4) - TMC_SAY_CHOPPER_TIME(E4); - #endif - #if AXIS_IS_TMC(E5) - TMC_SAY_CHOPPER_TIME(E5); - #endif - #if AXIS_IS_TMC(E6) - TMC_SAY_CHOPPER_TIME(E6); - #endif - #if AXIS_IS_TMC(E7) - TMC_SAY_CHOPPER_TIME(E7); - #endif + #define TMC_SAY_CHOPPER_TIME(Q) OPTCODE(Q##_IS_TRINAMIC, tmc_print_chopper_time(stepper##Q)) + MAP(TMC_SAY_CHOPPER_TIME, ALL_AXIS_NAMES) } } diff --git a/Marlin/src/gcode/feature/trinamic/M920.cpp b/Marlin/src/gcode/feature/trinamic/M920.cpp new file mode 100644 index 0000000000..2852f8bf44 --- /dev/null +++ b/Marlin/src/gcode/feature/trinamic/M920.cpp @@ -0,0 +1,144 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(EDITABLE_HOMING_CURRENT) + +#include "../../gcode.h" +#include "../../../feature/tmc_util.h" + +#if AXIS_COLLISION('I') + #define I_PARAM 'S' + #define I_PARAM_STR "S" + #warning "Use 'M920 S' instead of 'M920 I' for the stepper number." +#else + #define I_PARAM 'I' + #define I_PARAM_STR "I" +#endif + +/** + * M920: Set Homing Current for one or more axes + * + * Parameters: + * X[current] - Homing Current to use for X axis stepper(s) + * Y[current] - Homing Current to use for Y axis stepper(s) + * Z[current] - Homing Current to use for Z axis stepper(s) + * A[current] - Homing Current to use for A axis stepper(s) + * B[current] - Homing Current to use for B axis stepper(s) + * C[current] - Homing Current to use for C axis stepper(s) + * U[current] - Homing Current to use for U axis stepper(s) + * V[current] - Homing Current to use for V axis stepper(s) + * W[current] - Homing Current to use for W axis stepper(s) + * + * I - For multi-stepper axes, the zero-based index of the stepper to modify in each axis. + * If omitted all steppers of each axis will be set to the given axis current. + */ +void GcodeSuite::M920() { + bool report = true; + const uint8_t index = parser.byteval(I_PARAM); + LOOP_NUM_AXES(i) if (parser.seen(AXIS_CHAR(i))) { + const int16_t value = parser.value_int(); + report = false; + switch (i) { + #if X_HAS_HOME_CURRENT + case X_AXIS: + if (index < 1) homing_current_mA.X = value; + TERN_(X2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.X2 = value); + break; + #endif + #if Y_HAS_HOME_CURRENT + case Y_AXIS: + if (index < 1) homing_current_mA.Y = value; + TERN_(Y2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.Y2 = value); + break; + #endif + #if Z_HAS_HOME_CURRENT + case Z_AXIS: + if (index < 1) homing_current_mA.Z = value; + TERN_(Z2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.Z2 = value); + TERN_(Z3_HAS_HOME_CURRENT, if (!index || index == 2) homing_current_mA.Z3 = value); + TERN_(Z4_HAS_HOME_CURRENT, if (!index || index == 3) homing_current_mA.Z4 = value); + break; + #endif + OPTCODE(I_HAS_HOME_CURRENT, case I_AXIS: homing_current_mA.I = value; break) + OPTCODE(J_HAS_HOME_CURRENT, case J_AXIS: homing_current_mA.J = value; break) + OPTCODE(K_HAS_HOME_CURRENT, case K_AXIS: homing_current_mA.K = value; break) + OPTCODE(U_HAS_HOME_CURRENT, case U_AXIS: homing_current_mA.U = value; break) + OPTCODE(V_HAS_HOME_CURRENT, case V_AXIS: homing_current_mA.V = value; break) + OPTCODE(W_HAS_HOME_CURRENT, case W_AXIS: homing_current_mA.W = value; break) + } + } + + if (report) M920_report(); +} + +void GcodeSuite::M920_report(const bool forReplay/*=true*/) { + TERN_(MARLIN_SMALL_BUILD, return); + + report_heading(forReplay, F(STR_HOMING_CURRENT)); + + auto say_M920 = [](const bool forReplay, int16_t index=-1) { + report_echo_start(forReplay); + SERIAL_ECHOPGM(" M920"); + if (index >= 0) SERIAL_ECHOPGM(" " I_PARAM_STR, index); + }; + + #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS + #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS || Z3_SENSORLESS || Z4_SENSORLESS + say_M920(forReplay, 0); + #else + say_M920(forReplay); + #endif + TERN_(X_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, homing_current_mA.X)); + TERN_(Y_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, homing_current_mA.Y)); + TERN_(Z_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, homing_current_mA.Z)); + #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS || Z3_SENSORLESS || Z4_SENSORLESS + say_M920(forReplay); + #endif + TERN_(I_SENSORLESS, SERIAL_ECHOPGM_P(SP_I_STR, homing_current_mA.I)); + TERN_(J_SENSORLESS, SERIAL_ECHOPGM_P(SP_J_STR, homing_current_mA.J)); + TERN_(K_SENSORLESS, SERIAL_ECHOPGM_P(SP_K_STR, homing_current_mA.K)); + TERN_(U_SENSORLESS, SERIAL_ECHOPGM_P(SP_U_STR, homing_current_mA.U)); + TERN_(V_SENSORLESS, SERIAL_ECHOPGM_P(SP_V_STR, homing_current_mA.V)); + TERN_(W_SENSORLESS, SERIAL_ECHOPGM_P(SP_W_STR, homing_current_mA.W)); + SERIAL_EOL(); + #endif + + #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS + say_M920(forReplay, 1); + TERN_(X2_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, homing_current_mA.X2)); + TERN_(Y2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, homing_current_mA.Y2)); + TERN_(Z2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, homing_current_mA.Z2)); + SERIAL_EOL(); + #endif + #if Z3_SENSORLESS + say_M920(forReplay, 2); + SERIAL_ECHOLNPGM(" Z", homing_current_mA.Z3); + #endif + #if Z4_SENSORLESS + say_M920(forReplay, 3); + SERIAL_ECHOLNPGM(" Z", homing_current_mA.Z4); + #endif +} + +#endif // EDITABLE_HOMING_CURRENT diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index df9802f9a1..7134cc20ae 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -139,6 +139,7 @@ int8_t GcodeSuite::get_target_extruder_from_command() { * Get the target E stepper from the 'T' parameter. * If there is no 'T' parameter then dval will be substituted. * Returns -1 if the resulting E stepper index is out of range. + * Use a default of -2 for silent failure. */ int8_t GcodeSuite::get_target_e_stepper_from_command(const int8_t dval/*=-1*/) { const int8_t e = parser.intval('T', dval); @@ -242,11 +243,11 @@ void GcodeSuite::get_destination_from_command() { } /** - * Dwell waits immediately. It does not synchronize. Use M400 instead of G4 + * Dwell waits immediately. It does not synchronize. */ -void GcodeSuite::dwell(millis_t time) { - time += millis(); - while (PENDING(millis(), time)) idle(); +void GcodeSuite::dwell(const millis_t time) { + const millis_t start_ms = millis(); + while (PENDING(millis(), start_ms, time)) idle(); } /** @@ -1049,12 +1050,15 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 912: M912(); break; // M912: Clear TMC2130 prewarn triggered flags #endif #if ENABLED(HYBRID_THRESHOLD) - case 913: M913(); break; // M913: Set HYBRID_THRESHOLD speed. + case 913: M913(); break; // M913: Set HYBRID_THRESHOLD speed #endif #if USE_SENSORLESS - case 914: M914(); break; // M914: Set StallGuard sensitivity. + case 914: M914(); break; // M914: Set StallGuard sensitivity #endif case 919: M919(); break; // M919: Set stepper Chopper Times + #if ENABLED(EDITABLE_HOMING_CURRENT) + case 920: M920(); break; // M920: Set Homing Current + #endif #endif #if HAS_MICROSTEPS diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 84718f0a37..457185a1a8 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -159,7 +159,7 @@ * M120 - Enable endstops detection. * M121 - Disable endstops detection. * - * M122 - Debug stepper (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M122 - Debug stepper (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660)) * M123 - Report fan tachometers. (Requires En_FAN_TACHO_PIN) Optionally set auto-report interval. (Requires AUTO_REPORT_FANS) * M125 - Save current position and move to filament change position. (Requires PARK_HEAD_ON_PAUSE) * @@ -265,7 +265,7 @@ * M552 - Get or set IP address. Enable/disable network interface. (Requires enabled Ethernet port) * M553 - Get or set IP netmask. (Requires enabled Ethernet port) * M554 - Get or set IP gateway. (Requires enabled Ethernet port) - * M569 - Enable stealthChop on an axis. (Requires at least one _DRIVER_TYPE to be TMC2130/2160/2208/2209/5130/5160) + * M569 - Enable stealthChop on an axis. (Requires *_DRIVER_TYPE TMC(2130|2160|2208|2209|5130|5160)) * M575 - Change the serial baud rate. (Requires BAUD_RATE_GCODE) * M592 - Get or set Nonlinear Extrusion parameters. (Requires NONLINEAR_EXTRUSION) * M593 - Get or set input shaping parameters. (Requires INPUT_SHAPING_[XY]) @@ -308,17 +308,19 @@ * * M871 - Print/reset/clear first layer temperature offset values. (Requires PTC_PROBE, PTC_BED, or PTC_HOTEND) * M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT) - * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) - * M906 - Set or get motor current in milliamps using axis codes XYZE, etc. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M900 - Set or Report Linear Advance K-factor. (Requires LIN_ADVANCE) + * M906 - Set or Report motor current in milliamps using axis codes XYZE, etc. Report values if no axis codes given. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660)) * M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots) * M908 - Control digital trimpot directly. (Requires HAS_MOTOR_CURRENT_DAC or DIGIPOTSS_PIN) * M909 - Print digipot/DAC current value. (Requires HAS_MOTOR_CURRENT_DAC) * M910 - Commit digipot/DAC value to external EEPROM via I2C. (Requires HAS_MOTOR_CURRENT_DAC) - * M911 - Report stepper driver overtemperature pre-warn condition. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) - * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M911 - Report stepper driver overtemperature pre-warn condition. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660)) + * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660)) * M913 - Set HYBRID_THRESHOLD speed. (Requires HYBRID_THRESHOLD) * M914 - Set StallGuard sensitivity. (Requires SENSORLESS_HOMING or SENSORLESS_PROBING) - * M919 - Get or Set motor Chopper Times (time_off, hysteresis_end, hysteresis_start) using axis codes XYZE, etc. If no parameters are given, report. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M919 - Set or Report motor Chopper Times (time_off, hysteresis_end, hysteresis_start) using axis codes XYZE, etc. + * If no parameters are given, report. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660)) + * M920 - Set Homing Current. (Requires distinct *_CURRENT_HOME settings) * M936 - OTA update firmware. (Requires OTA_FIRMWARE_UPDATE) * M951 - Set Magnetic Parking Extruder parameters. (Requires MAGNETIC_PARKING_EXTRUDER) * M3426 - Read MCP3426 ADC over I2C. (Requires HAS_MCP3426_ADC) @@ -431,14 +433,14 @@ public: static millis_t previous_move_ms, max_inactive_time; FORCE_INLINE static bool stepper_max_timed_out(const millis_t ms=millis()) { - return max_inactive_time && ELAPSED(ms, previous_move_ms + max_inactive_time); + return max_inactive_time && ELAPSED(ms, previous_move_ms, max_inactive_time); } FORCE_INLINE static void reset_stepper_timeout(const millis_t ms=millis()) { previous_move_ms = ms; } #if HAS_DISABLE_IDLE_AXES static millis_t stepper_inactive_time; FORCE_INLINE static bool stepper_inactive_timeout(const millis_t ms=millis()) { - return ELAPSED(ms, previous_move_ms + stepper_inactive_time); + return ELAPSED(ms, previous_move_ms, stepper_inactive_time); } #else static bool stepper_inactive_timeout(const millis_t) { return false; } @@ -503,7 +505,7 @@ public: #define KEEPALIVE_STATE(N) NOOP #endif - static void dwell(millis_t time); + static void dwell(const millis_t time); private: @@ -1133,11 +1135,11 @@ private: #if HAS_ETHERNET static void M552(); - static void M552_report(); + static void M552_report(const bool forReplay=true); static void M553(); - static void M553_report(); + static void M553_report(const bool forReplay=true); static void M554(); - static void M554_report(); + static void M554_report(const bool forReplay=true); #endif #if HAS_STEALTHCHOP @@ -1256,6 +1258,10 @@ private: static void M914_report(const bool forReplay=true); #endif static void M919(); + #if ENABLED(EDITABLE_HOMING_CURRENT) + static void M920(); + static void M920_report(const bool forReplay=true); + #endif #endif #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM || HAS_MOTOR_CURRENT_I2C || HAS_MOTOR_CURRENT_DAC diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index 535ed48039..63071f6113 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -44,7 +44,7 @@ static void config_line(PGM_P const name, const float val, PGM_P const pref=null SERIAL_ECHOLN(val); } static void config_line(FSTR_P const name, const float val, FSTR_P const pref=nullptr, const int8_t ind=-1) { - config_line(FTOP(name), val, FTOP(pref) , ind); + config_line(FTOP(name), val, FTOP(pref), ind); } static void config_line_e(const int8_t e, PGM_P const name, const float val) { config_line(name, val, PSTR("Extr."), e + 1); diff --git a/Marlin/src/gcode/lcd/M117.cpp b/Marlin/src/gcode/lcd/M117.cpp index 57a26851fd..e8b9cc46f6 100644 --- a/Marlin/src/gcode/lcd/M117.cpp +++ b/Marlin/src/gcode/lcd/M117.cpp @@ -32,7 +32,7 @@ */ void GcodeSuite::M117() { - if (parser.string_arg && parser.string_arg[0]) + if (parser.has_string()) ui.set_status_no_expire(parser.string_arg); else ui.reset_status(); diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index 3cc6130dfd..a0aa340d0d 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -37,6 +37,7 @@ * S * H * B + * C * F */ void GcodeSuite::M145() { @@ -53,6 +54,10 @@ void GcodeSuite::M145() { if (parser.seenval('B')) mat.bed_temp = constrain(parser.value_int(), BED_MINTEMP, BED_MAX_TARGET); #endif + #if HAS_HEATED_CHAMBER + if (parser.seenval('C')) + mat.chamber_temp = constrain(parser.value_int(), CHAMBER_MINTEMP, CHAMBER_MAX_TARGET); + #endif #if HAS_FAN if (parser.seenval('F')) mat.fan_speed = constrain(parser.value_int(), 0, 255); diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 401548b309..e56a723087 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -97,6 +97,8 @@ public: FORCE_INLINE static void cancel_motion_mode() { motion_mode_codenum = -1; } #endif + FORCE_INLINE static bool has_string() { return string_arg && string_arg[0]; } + #if ENABLED(DEBUG_GCODE_PARSER) static void debug(); #endif diff --git a/Marlin/src/gcode/probe/M423.cpp b/Marlin/src/gcode/probe/M423.cpp index 7ab887eb64..17941d64f3 100644 --- a/Marlin/src/gcode/probe/M423.cpp +++ b/Marlin/src/gcode/probe/M423.cpp @@ -88,10 +88,11 @@ void GcodeSuite::M423() { void GcodeSuite::M423_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); - report_heading(forReplay, F("X-Twist Correction")); + report_heading_etc(forReplay, F("X-Twist Correction")); SERIAL_ECHOLNPGM(" M423 A", xatc.start, " I", xatc.spacing); for (uint8_t x = 0; x < XATC_MAX_POINTS; ++x) { const float z = xatc.z_offset[x]; + report_echo_start(forReplay); SERIAL_ECHOPGM(" M423 X", x, " Z"); serial_offset(isnan(z) ? 0 : z); SERIAL_EOL(); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index c5c05b7e97..ecccb36f5d 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -426,7 +426,7 @@ void GCodeQueue::get_serial_commands() { // send "wait" to indicate Marlin is still waiting. #if NO_TIMEOUTS > 0 const millis_t ms = millis(); - if (ring_buffer.empty() && !any_serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { + if (ring_buffer.empty() && !any_serial_data_available() && ELAPSED(ms, last_command_time, NO_TIMEOUTS)) { SERIAL_ECHOLNPGM(STR_WAIT); last_command_time = ms; } diff --git a/Marlin/src/gcode/stats/M75-M78.cpp b/Marlin/src/gcode/stats/M75-M78.cpp index 03e76d531d..8ab94577ef 100644 --- a/Marlin/src/gcode/stats/M75-M78.cpp +++ b/Marlin/src/gcode/stats/M75-M78.cpp @@ -43,7 +43,7 @@ void GcodeSuite::M75() { startOrResumeJob(); // ... ExtUI::onPrintTimerStarted() #if ENABLED(DWIN_LCD_PROUI) // TODO: Remove if M75 is never used - if (!IS_SD_PRINTING()) dwinPrintHeader(parser.string_arg && parser.string_arg[0] ? parser.string_arg : GET_TEXT(MSG_HOST_START_PRINT)); + if (!IS_SD_PRINTING()) dwinPrintHeader(parser.has_string() ? parser.string_arg : GET_TEXT(MSG_HOST_START_PRINT)); #endif } diff --git a/Marlin/src/gcode/temp/M141_M191.cpp b/Marlin/src/gcode/temp/M141_M191.cpp index 81a078318a..3364fbc22e 100644 --- a/Marlin/src/gcode/temp/M141_M191.cpp +++ b/Marlin/src/gcode/temp/M141_M191.cpp @@ -39,9 +39,16 @@ */ void GcodeSuite::M141() { if (DEBUGGING(DRYRUN)) return; + // Accept 'I' if temperature presets are defined + #if HAS_PREHEAT + if (parser.seenval('I')) { + const uint8_t index = parser.value_byte(); + thermalManager.setTargetChamber(ui.material_preset[_MIN(index, PREHEAT_COUNT - 1)].chamber_temp); + return; + } + #endif if (parser.seenval('S')) { thermalManager.setTargetChamber(parser.value_celsius()); - #if ENABLED(PRINTJOB_TIMER_AUTOSTART) /** * Stop the timer at the end of print. Hotend, bed target, and chamber diff --git a/Marlin/src/gcode/temp/M86_M87.cpp b/Marlin/src/gcode/temp/M86_M87.cpp index 502052e87b..442d325c56 100644 --- a/Marlin/src/gcode/temp/M86_M87.cpp +++ b/Marlin/src/gcode/temp/M86_M87.cpp @@ -37,7 +37,7 @@ void GcodeSuite::M86_report(const bool forReplay/*=true*/) { TERN_(MARLIN_SMALL_BUILD, return); hotend_idle_settings_t &c = hotend_idle.cfg; - report_heading(forReplay, F("Hotend Idle Timeout")); + report_heading_etc(forReplay, F("Hotend Idle Timeout")); SERIAL_ECHOLNPGM(" M86" #if HAS_HEATED_BED " B", c.bed_target, diff --git a/Marlin/src/inc/Conditionals-2-LCD.h b/Marlin/src/inc/Conditionals-2-LCD.h index 8c818864a0..633cd2beb6 100644 --- a/Marlin/src/inc/Conditionals-2-LCD.h +++ b/Marlin/src/inc/Conditionals-2-LCD.h @@ -78,7 +78,7 @@ #define MKS_MINI_12864 #endif -// MKS_MINI_12864_V3 , BTT_MINI_12864 and BEEZ_MINI_12864 are nearly identical to FYSETC_MINI_12864_2_1 +// MKS_MINI_12864_V3, BTT_MINI_12864 and BEEZ_MINI_12864 are nearly identical to FYSETC_MINI_12864_2_1 #if ANY(MKS_MINI_12864_V3, BTT_MINI_12864, BEEZ_MINI_12864) #define FYSETC_MINI_12864_2_1 #endif @@ -201,7 +201,7 @@ #define DOGLCD #define IS_U8GLIB_ST7920 1 #define IS_ULTIPANEL 1 - #define ENCODER_PULSES_PER_STEP 2 + #define STD_ENCODER_PULSES_PER_STEP 2 #elif ENABLED(MKS_12864OLED) diff --git a/Marlin/src/inc/Conditionals-3-etc.h b/Marlin/src/inc/Conditionals-3-etc.h index 7f005c3539..e4dcdda58f 100644 --- a/Marlin/src/inc/Conditionals-3-etc.h +++ b/Marlin/src/inc/Conditionals-3-etc.h @@ -135,7 +135,10 @@ #ifdef Z_PROBE_SERVO_NR #define HAS_Z_SERVO_PROBE 1 #endif -#if ANY(HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) +#ifdef MAG_MOUNTED_PROBE_SERVO_NR + #define HAS_MAG_MOUNTED_SERVO_PROBE 1 +#endif +#if ANY(HAS_Z_SERVO_PROBE, HAS_MAG_MOUNTED_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) #define HAS_SERVO_ANGLES 1 #endif #if !HAS_SERVO_ANGLES diff --git a/Marlin/src/inc/Conditionals-4-adv.h b/Marlin/src/inc/Conditionals-4-adv.h index 77c98d01bd..fbccb3640f 100644 --- a/Marlin/src/inc/Conditionals-4-adv.h +++ b/Marlin/src/inc/Conditionals-4-adv.h @@ -53,6 +53,10 @@ #undef NUM_SERVOS #define NUM_SERVOS INCREMENT(Z_PROBE_SERVO_NR) #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE && NUM_SERVOS <= MAG_MOUNTED_PROBE_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS INCREMENT(MAG_MOUNTED_PROBE_SERVO_NR) + #endif #if ENABLED(CHAMBER_VENT) && NUM_SERVOS <= CHAMBER_VENT_SERVO_NR #undef NUM_SERVOS #define NUM_SERVOS INCREMENT(CHAMBER_VENT_SERVO_NR) @@ -1086,6 +1090,9 @@ #define _CUTTER_POWER_RPM 3 #define _CUTTER_POWER(V) _CAT(_CUTTER_POWER_, V) #define CUTTER_UNIT_IS(V) (_CUTTER_POWER(CUTTER_POWER_UNIT) == _CUTTER_POWER(V)) + #if DEFAULT_ACCELERATION_SPINDLE + #define HAS_SPINDLE_ACCELERATION 1 + #endif #endif #if !defined(__AVR__) || !defined(USBCON) @@ -1292,7 +1299,7 @@ #define MAXIMUM_STEPPER_RATE 150000 #elif HAS_DRIVER(DRV8825) #define MAXIMUM_STEPPER_RATE 250000 - #elif HAS_DRIVER(A4988) + #elif HAS_DRIVER(A4988) || HAS_DRIVER(A5984) #define MAXIMUM_STEPPER_RATE 500000 #elif HAS_DRIVER(LV8729) #define MAXIMUM_STEPPER_RATE 1000000 @@ -1303,8 +1310,75 @@ #endif #endif +#if AXIS_IS_TMC(X) + #define X_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Y) + #define Y_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z) + #define Z_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(I) + #define I_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(J) + #define J_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(K) + #define K_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(U) + #define U_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(V) + #define V_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(W) + #define W_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(X2) + #define X2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Y2) + #define Y2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z2) + #define Z2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z3) + #define Z3_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z4) + #define Z4_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E0) + #define E0_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E1) + #define E1_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E2) + #define E2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E3) + #define E3_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E4) + #define E4_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E5) + #define E5_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E6) + #define E6_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E7) + #define E7_IS_TRINAMIC 1 +#endif + // Test for edge stepping on any axis -#define AXIS_HAS_DEDGE(A) (ENABLED(EDGE_STEPPING) && AXIS_IS_TMC(A)) +#define AXIS_HAS_DEDGE(A) ALL(EDGE_STEPPING, A##_IS_TRINAMIC) #if ENABLED(DIRECT_STEPPING) #ifndef STEPPER_PAGES diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index d07a5914cd..380e8e6071 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -1052,7 +1052,7 @@ // Steppers #if HAS_X_AXIS - #if PIN_EXISTS(X_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X)) + #if PIN_EXISTS(X_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, X_IS_TRINAMIC) #define HAS_X_ENABLE 1 #endif #if PIN_EXISTS(X_DIR) @@ -1065,17 +1065,19 @@ #define HAS_X_MS_PINS 1 #endif - #if PIN_EXISTS(X2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X2)) - #define HAS_X2_ENABLE 1 - #endif - #if PIN_EXISTS(X2_DIR) - #define HAS_X2_DIR 1 - #endif - #if PIN_EXISTS(X2_STEP) - #define HAS_X2_STEP 1 - #endif - #if PIN_EXISTS(X2_MS1) - #define HAS_X2_MS_PINS 1 + #if HAS_X2_STEPPER + #if PIN_EXISTS(X2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, X2_IS_TRINAMIC) + #define HAS_X2_ENABLE 1 + #endif + #if PIN_EXISTS(X2_DIR) + #define HAS_X2_DIR 1 + #endif + #if PIN_EXISTS(X2_STEP) + #define HAS_X2_STEP 1 + #endif + #if PIN_EXISTS(X2_MS1) + #define HAS_X2_MS_PINS 1 + #endif #endif #endif @@ -1084,7 +1086,7 @@ */ #if HAS_Y_AXIS - #if PIN_EXISTS(Y_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y)) + #if PIN_EXISTS(Y_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Y_IS_TRINAMIC) #define HAS_Y_ENABLE 1 #endif #if PIN_EXISTS(Y_DIR) @@ -1098,7 +1100,7 @@ #endif #if HAS_Y2_STEPPER - #if PIN_EXISTS(Y2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y2)) + #if PIN_EXISTS(Y2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Y2_IS_TRINAMIC) #define HAS_Y2_ENABLE 1 #endif #if PIN_EXISTS(Y2_DIR) @@ -1114,7 +1116,7 @@ #endif #if HAS_Z_AXIS - #if PIN_EXISTS(Z_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z)) + #if PIN_EXISTS(Z_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z_IS_TRINAMIC) #define HAS_Z_ENABLE 1 #endif #if PIN_EXISTS(Z_DIR) @@ -1129,7 +1131,7 @@ #endif #if NUM_Z_STEPPERS >= 2 - #if PIN_EXISTS(Z2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z2)) + #if PIN_EXISTS(Z2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z2_IS_TRINAMIC) #define HAS_Z2_ENABLE 1 #endif #if PIN_EXISTS(Z2_DIR) @@ -1144,7 +1146,7 @@ #endif #if NUM_Z_STEPPERS >= 3 - #if PIN_EXISTS(Z3_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z3)) + #if PIN_EXISTS(Z3_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z3_IS_TRINAMIC) #define HAS_Z3_ENABLE 1 #endif #if PIN_EXISTS(Z3_DIR) @@ -1159,7 +1161,7 @@ #endif #if NUM_Z_STEPPERS >= 4 - #if PIN_EXISTS(Z4_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z4)) + #if PIN_EXISTS(Z4_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z4_IS_TRINAMIC) #define HAS_Z4_ENABLE 1 #endif #if PIN_EXISTS(Z4_DIR) @@ -1174,7 +1176,7 @@ #endif #if HAS_I_AXIS - #if PIN_EXISTS(I_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(I)) + #if PIN_EXISTS(I_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, I_IS_TRINAMIC) #define HAS_I_ENABLE 1 #endif #if PIN_EXISTS(I_DIR) @@ -1189,7 +1191,7 @@ #endif #if HAS_J_AXIS - #if PIN_EXISTS(J_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(J)) + #if PIN_EXISTS(J_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, J_IS_TRINAMIC) #define HAS_J_ENABLE 1 #endif #if PIN_EXISTS(J_DIR) @@ -1204,7 +1206,7 @@ #endif #if HAS_K_AXIS - #if PIN_EXISTS(K_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(K)) + #if PIN_EXISTS(K_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, K_IS_TRINAMIC) #define HAS_K_ENABLE 1 #endif #if PIN_EXISTS(K_DIR) @@ -1219,7 +1221,7 @@ #endif #if HAS_U_AXIS - #if PIN_EXISTS(U_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(U)) + #if PIN_EXISTS(U_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, U_IS_TRINAMIC) #define HAS_U_ENABLE 1 #endif #if PIN_EXISTS(U_DIR) @@ -1234,7 +1236,7 @@ #endif #if HAS_V_AXIS - #if PIN_EXISTS(V_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(V)) + #if PIN_EXISTS(V_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, V_IS_TRINAMIC) #define HAS_V_ENABLE 1 #endif #if PIN_EXISTS(V_DIR) @@ -1249,7 +1251,7 @@ #endif #if HAS_W_AXIS - #if PIN_EXISTS(W_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(W)) + #if PIN_EXISTS(W_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, W_IS_TRINAMIC) #define HAS_W_ENABLE 1 #endif #if PIN_EXISTS(W_DIR) @@ -1266,7 +1268,7 @@ // Extruder steppers and solenoids #if HAS_EXTRUDERS - #if PIN_EXISTS(E0_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E0)) + #if PIN_EXISTS(E0_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E0_IS_TRINAMIC) #define HAS_E0_ENABLE 1 #endif #if PIN_EXISTS(E0_DIR) @@ -1280,7 +1282,7 @@ #endif #if E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS) - #if PIN_EXISTS(E1_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1)) + #if PIN_EXISTS(E1_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E1_IS_TRINAMIC) #define HAS_E1_ENABLE 1 #endif #if PIN_EXISTS(E1_DIR) @@ -1295,7 +1297,7 @@ #endif #if E_STEPPERS > 2 - #if PIN_EXISTS(E2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E2)) + #if PIN_EXISTS(E2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E2_IS_TRINAMIC) #define HAS_E2_ENABLE 1 #endif #if PIN_EXISTS(E2_DIR) @@ -1310,7 +1312,7 @@ #endif #if E_STEPPERS > 3 - #if PIN_EXISTS(E3_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E3)) + #if PIN_EXISTS(E3_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E3_IS_TRINAMIC) #define HAS_E3_ENABLE 1 #endif #if PIN_EXISTS(E3_DIR) @@ -1325,7 +1327,7 @@ #endif #if E_STEPPERS > 4 - #if PIN_EXISTS(E4_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E4)) + #if PIN_EXISTS(E4_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E4_IS_TRINAMIC) #define HAS_E4_ENABLE 1 #endif #if PIN_EXISTS(E4_DIR) @@ -1340,7 +1342,7 @@ #endif #if E_STEPPERS > 5 - #if PIN_EXISTS(E5_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E5)) + #if PIN_EXISTS(E5_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E5_IS_TRINAMIC) #define HAS_E5_ENABLE 1 #endif #if PIN_EXISTS(E5_DIR) @@ -1355,7 +1357,7 @@ #endif #if E_STEPPERS > 6 - #if PIN_EXISTS(E6_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E6)) + #if PIN_EXISTS(E6_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E6_IS_TRINAMIC) #define HAS_E6_ENABLE 1 #endif #if PIN_EXISTS(E6_DIR) @@ -1370,7 +1372,7 @@ #endif #if E_STEPPERS > 7 - #if PIN_EXISTS(E7_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E7)) + #if PIN_EXISTS(E7_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E7_IS_TRINAMIC) #define HAS_E7_ENABLE 1 #endif #if PIN_EXISTS(E7_DIR) @@ -1441,7 +1443,7 @@ #undef Z4_STALL_SENSITIVITY #endif - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC #if defined(X_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X) #define X_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(X) @@ -1461,7 +1463,7 @@ #define X_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC #if defined(X2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X2) #define X2_SENSORLESS 1 #endif @@ -1479,7 +1481,7 @@ #endif #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC #if defined(Y_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y) #define Y_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(Y) @@ -1499,7 +1501,7 @@ #define Y_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(Y2) + #if Y2_IS_TRINAMIC #if defined(Y2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y2) #define Y2_SENSORLESS 1 #endif @@ -1517,7 +1519,7 @@ #endif #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC #if defined(Z_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z) #define Z_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(Z) @@ -1537,7 +1539,7 @@ #define Z_SLAVE_ADDRESS 0 #endif #endif - #if NUM_Z_STEPPERS >= 2 && AXIS_IS_TMC(Z2) + #if NUM_Z_STEPPERS >= 2 && Z2_IS_TRINAMIC #if defined(Z2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z2) #define Z2_SENSORLESS 1 #endif @@ -1554,7 +1556,7 @@ #define Z2_SLAVE_ADDRESS 0 #endif #endif - #if NUM_Z_STEPPERS >= 3 && AXIS_IS_TMC(Z3) + #if NUM_Z_STEPPERS >= 3 && Z3_IS_TRINAMIC #if defined(Z3_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z3) #define Z3_SENSORLESS 1 #endif @@ -1571,7 +1573,7 @@ #define Z3_SLAVE_ADDRESS 0 #endif #endif - #if NUM_Z_STEPPERS >= 4 && AXIS_IS_TMC(Z4) + #if NUM_Z_STEPPERS >= 4 && Z4_IS_TRINAMIC #if defined(Z4_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z4) #define Z4_SENSORLESS 1 #endif @@ -1589,7 +1591,7 @@ #endif #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC #if defined(I_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(I) #define I_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(I) @@ -1610,7 +1612,7 @@ #endif #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC #if defined(J_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(J) #define J_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(J) @@ -1631,7 +1633,7 @@ #endif #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC #if defined(K_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(K) #define K_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(K) @@ -1652,7 +1654,7 @@ #endif #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC #if defined(U_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(U) #define U_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(U) @@ -1673,7 +1675,7 @@ #endif #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC #if defined(V_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(V) #define V_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(V) @@ -1694,7 +1696,7 @@ #endif #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC #if defined(W_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(W) #define W_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(W) @@ -1715,7 +1717,7 @@ #endif #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E0) #define E0_HAS_STEALTHCHOP 1 #endif @@ -1729,7 +1731,7 @@ #define E0_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E1) #define E1_HAS_STEALTHCHOP 1 #endif @@ -1743,7 +1745,7 @@ #define E1_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E2) + #if E2_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E2) #define E2_HAS_STEALTHCHOP 1 #endif @@ -1757,7 +1759,7 @@ #define E2_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E3) + #if E3_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E3) #define E3_HAS_STEALTHCHOP 1 #endif @@ -1771,7 +1773,7 @@ #define E3_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E4) + #if E4_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E4) #define E4_HAS_STEALTHCHOP 1 #endif @@ -1785,7 +1787,7 @@ #define E4_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E5) + #if E5_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E5) #define E5_HAS_STEALTHCHOP 1 #endif @@ -1799,7 +1801,7 @@ #define E5_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E6) + #if E6_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E6) #define E6_HAS_STEALTHCHOP 1 #endif @@ -1813,7 +1815,7 @@ #define E6_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E7) + #if E7_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E7) #define E7_HAS_STEALTHCHOP 1 #endif @@ -2991,7 +2993,10 @@ #if ANY_PIN(MOTOR_CURRENT_PWM_E, MOTOR_CURRENT_PWM_E0, MOTOR_CURRENT_PWM_E1) #define HAS_MOTOR_CURRENT_PWM_E 1 #endif -#if HAS_MOTOR_CURRENT_PWM_E || ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W) +#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #define HAS_MOTOR_CURRENT_PWM_Z 1 +#endif +#if HAS_MOTOR_CURRENT_PWM_Z || HAS_MOTOR_CURRENT_PWM_E || ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W) #define HAS_MOTOR_CURRENT_PWM 1 #endif @@ -3552,6 +3557,10 @@ #define HAS_ROTARY_ENCODER 1 #endif +#if defined(CPU_32_BIT) && !defined(FAST_BUTTON_POLLING) + #define FAST_BUTTON_POLLING +#endif + #if PIN_EXISTS(SAFE_POWER) && DISABLED(DISABLE_DRIVER_SAFE_POWER_PROTECT) #define HAS_DRIVER_SAFE_POWER_PROTECT 1 #endif diff --git a/Marlin/src/inc/Conditionals-6-type.h b/Marlin/src/inc/Conditionals-6-type.h index e14c6d7ce5..9f0c0c3564 100644 --- a/Marlin/src/inc/Conditionals-6-type.h +++ b/Marlin/src/inc/Conditionals-6-type.h @@ -38,10 +38,53 @@ #endif // If an axis's Homing Current differs from standard current... -#define HAS_CURRENT_HOME(N) (N##_CURRENT_HOME > 0 && N##_CURRENT_HOME != N##_CURRENT) +#define HAS_HOME_CURRENT(N) TERN0(EDITABLE_HOMING_CURRENT, N##_IS_TRINAMIC && N##_HOME_DIR != 0) || (N##_CURRENT_HOME > 0 && N##_CURRENT_HOME != N##_CURRENT) +#if HAS_HOME_CURRENT(X) + #define X_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Y) + #define Y_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z) + #define Z_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(I) + #define I_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(J) + #define J_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(K) + #define K_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(U) + #define U_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(V) + #define V_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(W) + #define W_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(X2) + #define X2_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Y2) + #define Y2_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z2) + #define Z2_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z3) + #define Z3_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z4) + #define Z4_HAS_HOME_CURRENT 1 +#endif +#undef HAS_HOME_CURRENT // Does any axis have homing current? -#define _OR_HAS_CURR_HOME(N) HAS_CURRENT_HOME(N) || +#define _OR_HAS_CURR_HOME(N) N##_HAS_HOME_CURRENT || #if MAIN_AXIS_MAP(_OR_HAS_CURR_HOME) MAP(_OR_HAS_CURR_HOME, X2, Y2, Z2, Z3, Z4) 0 #define HAS_HOMING_CURRENT 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index e07fa78173..cd3c1cd573 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -241,10 +241,10 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "SERIAL_XON_XOFF and SERIAL_STATS_* features not supported on USB-native AVR devices." #endif -// Serial DMA is only available for some STM32 MCUs and HC32 +// Serial DMA is only available for some STM32 MCUs, HC32 and GD32 #if ENABLED(SERIAL_DMA) - #ifdef ARDUINO_ARCH_HC32 - // checks for HC32 are located in HAL/HC32/inc/SanityCheck.h + #if ANY(ARDUINO_ARCH_HC32, ARDUINO_ARCH_MFL) + // See HAL/.../inc/SanityCheck.h #elif DISABLED(HAL_STM32) || NONE(STM32F0xx, STM32F1xx, STM32F2xx, STM32F4xx, STM32F7xx, STM32H7xx) #error "SERIAL_DMA is only available for some STM32 MCUs and requires HAL/STM32." #elif !defined(HAL_UART_MODULE_ENABLED) || defined(HAL_UART_MODULE_ONLY) @@ -982,7 +982,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i /** * Servo deactivation depends on servo endstops, switching nozzle, or switching extruder */ -#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) && NONE(HAS_Z_SERVO_PROBE, POLARGRAPH) && !defined(SWITCHING_NOZZLE_SERVO_NR) && !defined(SWITCHING_EXTRUDER_SERVO_NR) && !defined(SWITCHING_TOOLHEAD_SERVO_NR) +#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) && NONE(HAS_Z_SERVO_PROBE, POLARGRAPH) && !defined(SWITCHING_NOZZLE_SERVO_NR) && !defined(SWITCHING_EXTRUDER_SERVO_NR) && !defined(SWITCHING_TOOLHEAD_SERVO_NR) && !defined(MAG_MOUNTED_PROBE_SERVO_NR) #error "Z_PROBE_SERVO_NR, switching nozzle, switching toolhead, switching extruder, or POLARGRAPH is required for DEACTIVATE_SERVOS_AFTER_MOVE." #endif @@ -1649,8 +1649,8 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #elif ENABLED(MESH_BED_LEVELING) #if ENABLED(DELTA) #error "MESH_BED_LEVELING is not compatible with DELTA printers." - #elif (GRID_MAX_POINTS_X) > 9 || (GRID_MAX_POINTS_Y) > 9 - #error "GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y must be less than 10 for MBL." + #elif !WITHIN(GRID_MAX_POINTS_X, 2, 255) || !WITHIN(GRID_MAX_POINTS_Y, 2, 255) + #error "GRID_MAX_POINTS_[XY] must be between 2 and 255 for MESH_BED_LEVELING." #endif #endif @@ -1805,8 +1805,8 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #undef _BAD_HOME_CURRENT #if ENABLED(PROBING_USE_CURRENT_HOME) - #if (defined(Z_CURRENT_HOME) && !HAS_CURRENT_HOME(Z)) || (defined(Z2_CURRENT_HOME) && !HAS_CURRENT_HOME(Z2)) \ - || (defined(Z3_CURRENT_HOME) && !HAS_CURRENT_HOME(Z3)) || (defined(Z4_CURRENT_HOME) && !HAS_CURRENT_HOME(Z4)) + #if (defined(Z_CURRENT_HOME) && !Z_HAS_HOME_CURRENT) || (defined(Z2_CURRENT_HOME) && !Z2_HAS_HOME_CURRENT) \ + || (defined(Z3_CURRENT_HOME) && !Z3_HAS_HOME_CURRENT) || (defined(Z4_CURRENT_HOME) && !Z4_HAS_HOME_CURRENT) #error "PROBING_USE_CURRENT_HOME requires a Z_CURRENT_HOME value that differs from Z_CURRENT." #endif #endif @@ -1888,12 +1888,8 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #endif /** - * ULTIPANEL encoder + * Encoder pulses must be positive */ -#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !PIN_EXISTS(SHIFT_CLK) - #error "ULTIPANEL controllers require some kind of encoder." -#endif - #if ENCODER_PULSES_PER_STEP < 0 #error "ENCODER_PULSES_PER_STEP should not be negative, use REVERSE_MENU_DIRECTION instead." #endif @@ -2452,28 +2448,28 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #endif #endif -#if E_STEPPERS > 0 && !(PINS_EXIST(E0_STEP, E0_DIR) && HAS_E0_ENABLE) +#if E_STEPPERS > 0 && !ALL(HAS_E0_DIR, HAS_E0_STEP, HAS_E0_ENABLE) #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 1 && !(PINS_EXIST(E1_STEP, E1_DIR) && HAS_E1_ENABLE) +#if E_STEPPERS > 1 && !ALL(HAS_E1_DIR, HAS_E1_STEP, HAS_E1_ENABLE) #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 2 && !(PINS_EXIST(E2_STEP, E2_DIR) && HAS_E2_ENABLE) +#if E_STEPPERS > 2 && !ALL(HAS_E2_DIR, HAS_E2_STEP, HAS_E2_ENABLE) #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 3 && !(PINS_EXIST(E3_STEP, E3_DIR) && HAS_E3_ENABLE) +#if E_STEPPERS > 3 && !ALL(HAS_E3_DIR, HAS_E3_STEP, HAS_E3_ENABLE) #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 4 && !(PINS_EXIST(E4_STEP, E4_DIR) && HAS_E4_ENABLE) +#if E_STEPPERS > 4 && !ALL(HAS_E4_DIR, HAS_E4_STEP, HAS_E4_ENABLE) #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 5 && !(PINS_EXIST(E5_STEP, E5_DIR) && HAS_E5_ENABLE) +#if E_STEPPERS > 5 && !ALL(HAS_E5_DIR, HAS_E5_STEP, HAS_E5_ENABLE) #error "E5_STEP_PIN, E5_DIR_PIN, or E5_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 6 && !(PINS_EXIST(E6_STEP, E6_DIR) && HAS_E6_ENABLE) +#if E_STEPPERS > 6 && !ALL(HAS_E6_DIR, HAS_E6_STEP, HAS_E6_ENABLE) #error "E6_STEP_PIN, E6_DIR_PIN, or E6_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 7 && !(PINS_EXIST(E7_STEP, E7_DIR) && HAS_E7_ENABLE) +#if E_STEPPERS > 7 && !ALL(HAS_E7_DIR, HAS_E7_STEP, HAS_E7_ENABLE) #error "E7_STEP_PIN, E7_DIR_PIN, or E7_ENABLE_PIN not defined for this board." #endif @@ -3230,7 +3226,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #undef INVALID_TMC_ADDRESS #define _TMC_MICROSTEP_IS_VALID(MS) (MS == 0 || MS == 2 || MS == 4 || MS == 8 || MS == 16 || MS == 32 || MS == 64 || MS == 128 || MS == 256) -#define TMC_MICROSTEP_IS_VALID(M) (!AXIS_IS_TMC(M) || _TMC_MICROSTEP_IS_VALID(M##_MICROSTEPS)) +#define TMC_MICROSTEP_IS_VALID(M) (!M##_IS_TRINAMIC || _TMC_MICROSTEP_IS_VALID(M##_MICROSTEPS)) #define INVALID_TMC_MS(ST) static_assert(0, "Invalid " STRINGIFY(ST) "_MICROSTEPS. Valid values are 0, 2, 4, 8, 16, 32, 64, 128, and 256.") #if !TMC_MICROSTEP_IS_VALID(X) @@ -3724,6 +3720,84 @@ static_assert(COUNT(sanity_arr_3) >= LOGICAL_AXES, "DEFAULT_MAX_ACCELERATION re static_assert(COUNT(sanity_arr_3) <= DISTINCT_AXES, "DEFAULT_MAX_ACCELERATION has too many elements." _EXTRA_NOTE); static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive."); +#if MAXIMUM_STEPPER_RATE + static_assert(TERN1(HAS_X_AXIS, sanity_arr_1[X_AXIS] * sanity_arr_2[X_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[X] * DEFAULT_AXIS_STEPS_PER_UNIT[X] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_Y_AXIS, sanity_arr_1[Y_AXIS] * sanity_arr_2[Y_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[Y] * DEFAULT_AXIS_STEPS_PER_UNIT[Y] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_Z_AXIS, sanity_arr_1[Z_AXIS] * sanity_arr_2[Z_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[Z] * DEFAULT_AXIS_STEPS_PER_UNIT[Z] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_I_AXIS, sanity_arr_1[I_AXIS] * sanity_arr_2[I_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[I] * DEFAULT_AXIS_STEPS_PER_UNIT[I] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_J_AXIS, sanity_arr_1[J_AXIS] * sanity_arr_2[J_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[J] * DEFAULT_AXIS_STEPS_PER_UNIT[J] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_K_AXIS, sanity_arr_1[K_AXIS] * sanity_arr_2[K_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[K] * DEFAULT_AXIS_STEPS_PER_UNIT[K] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_U_AXIS, sanity_arr_1[U_AXIS] * sanity_arr_2[U_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[U] * DEFAULT_AXIS_STEPS_PER_UNIT[U] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_V_AXIS, sanity_arr_1[V_AXIS] * sanity_arr_2[V_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[V] * DEFAULT_AXIS_STEPS_PER_UNIT[V] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + static_assert(TERN1(HAS_W_AXIS, sanity_arr_1[W_AXIS] * sanity_arr_2[W_AXIS] <= MAXIMUM_STEPPER_RATE), + "Slow down! DEFAULT_MAX_FEEDRATE[W] * DEFAULT_AXIS_STEPS_PER_UNIT[W] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #if ALL(HAS_EXTRUDERS, SANITY_CHECK_E_STEPPER_RATES) + #if DISABLED(DISTINCT_E_FACTORS) + static_assert(sanity_arr_1[E_AXIS] * sanity_arr_2[E_AXIS] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E] * DEFAULT_AXIS_STEPS_PER_UNIT[E] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #else + #define _ELEM_E(A,N) _MIN(E_AXIS+N,COUNT(sanity_arr_##A)-1) + static_assert(sanity_arr_1[_ELEM_E(1,0)] * sanity_arr_2[_ELEM_E(2,0)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E0] * DEFAULT_AXIS_STEPS_PER_UNIT[E0] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #if HAS_MULTI_EXTRUDER + static_assert(sanity_arr_1[_ELEM_E(1,1)] * sanity_arr_2[_ELEM_E(2,1)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E1] * DEFAULT_AXIS_STEPS_PER_UNIT[E1] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 2 + static_assert(sanity_arr_1[_ELEM_E(1,2)] * sanity_arr_2[_ELEM_E(2,2)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E2] * DEFAULT_AXIS_STEPS_PER_UNIT[E2] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 3 + static_assert(sanity_arr_1[_ELEM_E(1,3)] * sanity_arr_2[_ELEM_E(2,3)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E3] * DEFAULT_AXIS_STEPS_PER_UNIT[E3] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 4 + static_assert(sanity_arr_1[_ELEM_E(1,4)] * sanity_arr_2[_ELEM_E(2,4)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E4] * DEFAULT_AXIS_STEPS_PER_UNIT[E4] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 5 + static_assert(sanity_arr_1[_ELEM_E(1,5)] * sanity_arr_2[_ELEM_E(2,5)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E5] * DEFAULT_AXIS_STEPS_PER_UNIT[E5] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 6 + static_assert(sanity_arr_1[_ELEM_E(1,6)] * sanity_arr_2[_ELEM_E(2,6)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E6] * DEFAULT_AXIS_STEPS_PER_UNIT[E6] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #if EXTRUDERS > 7 + static_assert(sanity_arr_1[_ELEM_E(1,7)] * sanity_arr_2[_ELEM_E(2,7)] <= MAXIMUM_STEPPER_RATE, + "Slow down! DEFAULT_MAX_FEEDRATE[E7] * DEFAULT_AXIS_STEPS_PER_UNIT[E7] > MAXIMUM_STEPPER_RATE (" STRINGIFY(MAXIMUM_STEPPER_RATE) ")." + ); + #endif + #undef _ELEM_E + #endif + #endif // HAS_EXTRUDERS +#endif // MAXIMUM_STEPPER_RATE + #if NUM_AXES constexpr float sanity_arr_4[] = HOMING_FEEDRATE_MM_M; static_assert(COUNT(sanity_arr_4) == NUM_AXES, "HOMING_FEEDRATE_MM_M requires " _NUM_AXES_STR "elements (and no others)."); @@ -3998,6 +4072,8 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." #error "SPINDLE_LASER_PWM_INVERT is required for (SPINDLE|LASER)_FEATURE." #elif !(defined(SPEED_POWER_MIN) && defined(SPEED_POWER_MAX) && defined(SPEED_POWER_STARTUP)) #error "SPINDLE_LASER_USE_PWM equation constant(s) missing." + #elif DEFAULT_ACCELERATION_SPINDLE > SPEED_POWER_MAX - SPEED_POWER_MIN + #error "DEFAULT_ACCELERATION_SPINDLE must be <= SPEED_POWER_MAX - SPEED_POWER_MIN." #elif _PIN_CONFLICT(X_MIN) #error "SPINDLE_LASER_PWM_PIN conflicts with X_MIN_PIN." #elif _PIN_CONFLICT(X_MAX) @@ -4041,11 +4117,11 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." #elif _PIN_CONFLICT(CONTROLLERFAN) #error "SPINDLE_LASER_PWM_PIN conflicts with CONTROLLERFAN_PIN." #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_XY) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_XY." + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_XY_PIN." #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_Z) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_Z." + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_Z_PIN." #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_E) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_E." + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_E_PIN." #endif #endif #undef _PIN_CONFLICT @@ -4384,7 +4460,7 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." * Direct Stepping requirements */ #if ENABLED(DIRECT_STEPPING) - #if ENABLED(CPU_32_BIT) + #ifdef CPU_32_BIT #error "Direct Stepping is not supported on 32-bit boards." #elif !IS_FULL_CARTESIAN #error "Direct Stepping is incompatible with enabled kinematics." diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index c9db7e51b9..e4d0c6679b 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2025-03-17" + #define STRING_DISTRIBUTION_DATE "2025-04-18" #endif /** diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index df2279a08b..119e2205ab 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -696,9 +696,16 @@ #warning "Don't forget to update your TFT settings in Configuration.h." #endif -#if ENABLED(EMIT_CREALITY_422_WARNING) && DISABLED(NO_CREALITY_422_DRIVER_WARNING) - // Driver labels: A=TMC2208, B=TMC2209, C=HR4988, E=A4988, H=TMC2225, H8=HR4988 - #warning "Creality 4.2.2 boards come with a variety of stepper drivers. Check the board label (typically on SD Card module) and set the correct *_DRIVER_TYPE! (A/H: TMC2208_STANDALONE B: TMC2209_STANDALONE C/E/H8: A4988). (Define NO_CREALITY_422_DRIVER_WARNING to suppress this warning.)" +#if ENABLED(EMIT_CREALITY_422_WARNING) + #if DISABLED(NO_CREALITY_422_MCU_WARNING) + #warning "Double-check your 4.2.2 board for STM32 / GD32. Use BOARD_CREALITY_V422 or BOARD_CREALITY_V422_GD32_MFL as appropriate for your MCU." + #warning "GD32 Serial Ports are numbered starting from 0. STM32 Serial Ports are numbered starting from 1." + #warning "(Define NO_CREALITY_422_MCU_WARNING to suppress these warnings.)" + #endif + #if DISABLED(NO_CREALITY_422_DRIVER_WARNING) + // Driver labels: A=TMC2208, B=TMC2209, C=HR4988, E=A4988, H=TMC2225, H8=HR4988 + #warning "Creality 4.2.2 boards come with a variety of stepper drivers. Check the board label (typically on SD Card module) and set the correct *_DRIVER_TYPE! (A/H: TMC2208_STANDALONE B: TMC2209_STANDALONE C/E/H8: A4988). (Define NO_CREALITY_422_DRIVER_WARNING to suppress this warning.)" + #endif #endif #if ENABLED(PRINTCOUNTER_SYNC) @@ -742,24 +749,24 @@ #endif #if USE_SENSORLESS && DISABLED(NO_HOMING_CURRENT_WARNING) - #if ENABLED(X_SENSORLESS) && defined(X_CURRENT_HOME) && !HAS_CURRENT_HOME(X) - #warning "It's recommended to set X_CURRENT_HOME lower than X_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(X2_SENSORLESS) && defined(X2_CURRENT_HOME) && !HAS_CURRENT_HOME(X2) - #warning "It's recommended to set X2_CURRENT_HOME lower than X2_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #if ENABLED(X_SENSORLESS) && defined(X_CURRENT_HOME) && !X_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set X_CURRENT_HOME less than X_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(X2_SENSORLESS) && defined(X2_CURRENT_HOME) && !X2_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set X2_CURRENT_HOME less than X2_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" #endif - #if ENABLED(Y_SENSORLESS) && defined(Y_CURRENT_HOME) && !HAS_CURRENT_HOME(Y) - #warning "It's recommended to set Y_CURRENT_HOME lower than Y_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Y2_SENSORLESS) && defined(Y2_CURRENT_HOME) && !HAS_CURRENT_HOME(Y2) - #warning "It's recommended to set Y2_CURRENT_HOME lower than Y2_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #if ENABLED(Y_SENSORLESS) && defined(Y_CURRENT_HOME) && !Y_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Y_CURRENT_HOME less than Y_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Y2_SENSORLESS) && defined(Y2_CURRENT_HOME) && !Y2_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Y2_CURRENT_HOME less than Y2_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" #endif - #if ENABLED(Z_SENSORLESS) && defined(Z_CURRENT_HOME) && !HAS_CURRENT_HOME(Z) - #warning "It's recommended to set Z_CURRENT_HOME lower than Z_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Z2_SENSORLESS) && defined(Z2_CURRENT_HOME) && !HAS_CURRENT_HOME(Z2) - #warning "It's recommended to set Z2_CURRENT_HOME lower than Z2_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Z3_SENSORLESS) && defined(Z3_CURRENT_HOME) && !HAS_CURRENT_HOME(Z3) - #warning "It's recommended to set Z3_CURRENT_HOME lower than Z3_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Z4_SENSORLESS) && defined(Z4_CURRENT_HOME) && !HAS_CURRENT_HOME(Z4) - #warning "It's recommended to set Z4_CURRENT_HOME lower than Z4_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #if ENABLED(Z_SENSORLESS) && defined(Z_CURRENT_HOME) && !Z_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z_CURRENT_HOME less than Z_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Z2_SENSORLESS) && defined(Z2_CURRENT_HOME) && !Z2_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z2_CURRENT_HOME less than Z2_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Z3_SENSORLESS) && defined(Z3_CURRENT_HOME) && !Z3_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z3_CURRENT_HOME less than Z3_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Z4_SENSORLESS) && defined(Z4_CURRENT_HOME) && !Z4_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z4_CURRENT_HOME less than Z4_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" #endif #endif @@ -898,6 +905,13 @@ #warning "The (-1) AD595 Thermocouple Amplifier requires 5V input supply! Use AD8495 for 3.3V ADC." #endif +/** + * MKS_TINYBEE Analog Reference + */ +#if ENABLED(EMIT_ADC_REFERENCE_VOLTAGE_WARNING) + #warning "Check your ADC_REFERENCE_VOLTAGE on MKS TinyBee! Measure the Analog Reference voltage on the board. See pins_MKS_TINYBEE.h for details." +#endif + /** * No PWM on the Piezo Beeper? */ diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 071a88e475..a0145d6165 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -755,7 +755,7 @@ void MarlinUI::draw_status_message(const bool blink) { // Draw the progress bar if the message has shown long enough // or if there is no message set. - if (ELAPSED(millis(), progress_bar_ms + PROGRESS_BAR_MSG_TIME) || !has_status()) { + if (ELAPSED(millis(), progress_bar_ms, PROGRESS_BAR_MSG_TIME) || !has_status()) { const uint8_t progress = get_progress_percent(); if (progress > 2) return draw_progress_bar(progress); } diff --git a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp index 30d687ddef..e9132c94b9 100644 --- a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp +++ b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2018 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 . + * + */ + /** * @file lcdprint_u8g.cpp * @brief LCD print api for u8glib diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index ac65eab7de..c0cc7c4438 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -38,19 +38,19 @@ #if HAS_MEDIA #ifdef __SAMD21__ - #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL + #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.) #else // Hardware SPI on DUE - #define U8G_CLASS U8GLIB_ST7920_128X64_4X + #define U8G_CLASS U8GLIB_ST7920_128X64_4X // 2 stripes, SW SPI (Original u8glib device) #endif #define U8G_PARAM LCD_PINS_RS #elif (LCD_PINS_D4 == SD_SCK_PIN) && (LCD_PINS_EN == SD_MOSI_PIN) // Hardware SPI shared with SD Card - #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL + #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.) #define U8G_PARAM LCD_PINS_RS #else // Software SPI - #define U8G_CLASS U8GLIB_ST7920_128X64_4X + #define U8G_CLASS U8GLIB_ST7920_128X64_4X // 2 stripes, SW SPI (Original u8glib device) #define U8G_PARAM LCD_PINS_D4, LCD_PINS_EN, LCD_PINS_RS #endif diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp index 4d4756c298..f44b4f8ac5 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp @@ -75,58 +75,58 @@ #define HEIGHT 64 #define PAGE_HEIGHT 8 +#define CMD_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xF) +#define CMD_PAGE_ADR(N) (0x20), (N) +#define CMD_COLUMN_RANGE(N,O) (0x21), (N), (O) +#define CMD_PAGE_RANGE(N,O) (0x22), (N), (O) +#define CMD_SCROLL(N) ((N) ? 0x2F : 0x2E) +#define CMD_START_LINE(N) (0x40 | (N)) +#define CMD_CONTRAST(N) (0x81), (N) +#define CMD_CHARGE_PUMP(N) (0x8D), ((N) ? 0x14 : 0x10) +#define CMD_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) +#define CMD_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) +#define CMD_INVERTED(N) ((N) ? 0xA7 : 0xA6) +#define CMD_MUX_RATIO(N) (0xA8), (N) +#define CMD_ON(N) ((N) ? 0xAF : 0xAE) +#define CMD_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) +#define CMD_DISP_OFFS(N) (0xD3), (N) +#define CMD_OSC_FREQ(R,F) (0xD5), ((F) << 4 | (R)) +#define CMD_CHARGE_PER(P,D) (0xD9), ((D) << 4 | (P)) +#define CMD_COM_CONFIG(N) (0xDA), ((N) ? 0x12 : 0x02) +#define CMD_VCOM_DESEL(N) (0xDB), (N) +#define CMD_NOOP() (0xE3) + uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq); -// SH1106 (132x64) is compatible with SSD1306 (128x64) by adding a small margin to the larger display - -#define SH1106_PAGE_ADR(N) (0x20), (N) -#define SH1106_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xFF) -#define SH1106_COLUMN_RANGE(N,O) (0x21), (N), (O) -#define SH1106_PAGE_RANGE(N,O) (0x22), (N), (O) -#define SH1106_SCROLL(N) ((N) ? 0x2F : 0x2E) -#define SH1106_START_LINE(N) (0x40 | (N)) -#define SH1106_CONTRAST(N) (0x81), (N) -#define SH1106_CHARGE_PUMP(N) (0x8D), ((N) ? 0x14 : 0x10) -#define SH1106_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) -#define SH1106_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) -#define SH1106_INVERTED(N) ((N) ? 0xA7 : 0xA6) -#define SH1106_MUX_RATIO(N) (0xA8), (N) -#define SH1106_ON(N) ((N) ? 0xAF : 0xAE) -#define SH1106_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) -#define SH1106_DISP_OFFS(N) (0xD3), (N) -#define SH1106_OSC_FREQ(R,F) (0xD5), ((F) << 4 | (R)) -#define SH1106_CHARGE_PER(P,D) (0xD9), ((D) << 4 | (P)) -#define SH1106_COM_CONFIG(N) (0xDA), ((N) ? 0x12 : 0x02) -#define SH1106_VCOM_DESEL(N) (0xDB), (N) -#define SH1106_NOOP() (0xE3) +// SH1106 is compatible with SSD1306, but is 132x64. Display 128x64 centered within the 132x64. static const uint8_t u8g_dev_sh1106_128x64_data_start_2_wire[] PROGMEM = { - SH1106_COL_ADR(2), // Column 2 to center 128 pixels in 132 pixels - U8G_ESC_END // End of sequence + CMD_COL_ADR(2), // Column 2 to center 128 pixels in 132 pixels + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_sh1106_128x64_init_seq_2_wire[] PROGMEM = { - U8G_ESC_ADR(0), // Initiate command mode - SH1106_ON(0), // Display off, sleep mode - SH1106_MUX_RATIO(0x3F), // Mux ratio - SH1106_DISP_OFFS(0), // Display offset - SH1106_START_LINE(0), // Start line - SH1106_ADC_REVERSE(1), // Segment remap A0/A1 - SH1106_OUT_MODE(1), // 0: scan dir normal, 1: reverse - SH1106_COM_CONFIG(1), // COM pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) - SH1106_CONTRAST(0xCF), // Set contrast control - SH1106_PAGE_ADR(0x02), // page addressing mode - SH1106_COLUMN_RANGE(2, 129), // Set column range 2 .. 129 - SH1106_PAGE_RANGE(0, 7), // Set page range 0 .. 7 - SH1106_CHARGE_PER(0x1, 0xF), // Pre-charge period - SH1106_VCOM_DESEL(0x40), // Vcomh deselect level - SH1106_ALL_PIX(0), // Output RAM to display - SH1106_INVERTED(0), // Normal display mode - SH1106_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) - SH1106_CHARGE_PUMP(1), // Charge pump setting - SH1106_SCROLL(0), // Deactivate scroll - SH1106_ON(1), // Display on - U8G_ESC_END // End of sequence + U8G_ESC_ADR(0), // Initiate command mode + CMD_ON(0), // Display off, sleep mode + CMD_MUX_RATIO(0x3F), // Mux ratio + CMD_DISP_OFFS(0), // Display offset + CMD_START_LINE(0), // Start line + CMD_ADC_REVERSE(1), // Segment remap A0/A1 + CMD_OUT_MODE(1), // 0: scan dir normal, 1: reverse + CMD_COM_CONFIG(1), // COM pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) + CMD_CONTRAST(0xCF), // Set contrast control + CMD_PAGE_ADR(0x02), // page addressing mode + CMD_COLUMN_RANGE(2, 129), // Set column range 2 .. 129 + CMD_PAGE_RANGE(0, 7), // Set page range 0 .. 7 + CMD_CHARGE_PER(0x1, 0xF), // Pre-charge period + CMD_VCOM_DESEL(0x40), // Vcomh deselect level + CMD_ALL_PIX(0), // Output RAM to display + CMD_INVERTED(0), // Normal display mode + CMD_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) + CMD_CHARGE_PUMP(1), // Charge pump setting + CMD_SCROLL(0), // Deactivate scroll + CMD_ON(1), // Display ON + U8G_ESC_END // End of sequence }; uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { @@ -142,7 +142,7 @@ uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_data_start_2_wire); u8g_WriteByte(u8g, dev, 0xB0 | (pb->p.page*2)); // Select current page u8g_SetAddress(u8g, dev, 1); // Data mode - u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *) pb->buf); + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_data_start_2_wire); @@ -157,39 +157,39 @@ uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); } -uint8_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf[WIDTH*2] U8G_NOCOMMON ; -u8g_pb_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf}; +uint8_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf[WIDTH * 2] U8G_NOCOMMON; +u8g_pb_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb = { { 16, HEIGHT, 0, 0, 0 }, WIDTH, u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf }; u8g_dev_t u8g_dev_sh1106_128x64_2x_i2c_2_wire = { u8g_dev_sh1106_128x64_2x_2_wire_fn, &u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb, U8G_COM_SSD_I2C_HAL }; ///////////////////////////////////////////////////////////////////////////////////////////// static const uint8_t u8g_dev_ssd1306_128x64_data_start_2_wire[] PROGMEM = { - SH1106_COL_ADR(0), // Column 0 - U8G_ESC_END // End of sequence + CMD_COL_ADR(0), // Column 0 + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_ssd1306_128x64_init_seq_2_wire[] PROGMEM = { - U8G_ESC_CS(0), // Disable chip - SH1106_ON(0), // Display off, sleep mode - SH1106_MUX_RATIO(0x3F), // Mux ratio - SH1106_DISP_OFFS(0), // Display offset - SH1106_START_LINE(0), // Start line - SH1106_ADC_REVERSE(1), // Segment remap A0/A1 - SH1106_OUT_MODE(1), // 0: scan dir normal, 1: reverse - SH1106_COM_CONFIG(1), // COM pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) - SH1106_CONTRAST(0xCF), // Set contrast control - SH1106_PAGE_ADR(0x02), // page addressing mode - SH1106_COLUMN_RANGE(0, 127), // Set column range 0 .. 127 - SH1106_PAGE_RANGE(0, 7), // Set page range from 0 .. 7 - SH1106_CHARGE_PER(0x1, 0xF), // Pre-charge period - SH1106_VCOM_DESEL(0x40), // Vcomh deselect level - SH1106_ALL_PIX(0), // Send RAM to display - SH1106_INVERTED(0), // Normal display mode - SH1106_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) - SH1106_CHARGE_PUMP(1), // Charge pump setting - SH1106_SCROLL(0), // Deactivate scroll - SH1106_ON(1), // Display on - U8G_ESC_END // End of sequence + U8G_ESC_CS(0), // Disable chip + CMD_ON(0), // Display OFF, sleep mode + CMD_MUX_RATIO(0x3F), // Mux ratio + CMD_DISP_OFFS(0), // Display offset + CMD_START_LINE(0), // Start line + CMD_ADC_REVERSE(1), // Segment remap A0/A1 + CMD_OUT_MODE(1), // 0: scan dir normal, 1: reverse + CMD_COM_CONFIG(1), // COM pin HW config, sequential COM pin config (bit 4), disable left/right remap (bit 5) + CMD_CONTRAST(0xCF), // Set contrast control + CMD_PAGE_ADR(2), // Page addressing mode + CMD_COLUMN_RANGE(0, 127), // Set column range 0 .. 127 + CMD_PAGE_RANGE(0, 7), // Set page range from 0 .. 7 + CMD_CHARGE_PER(0x1, 0xF), // Pre-charge period + CMD_VCOM_DESEL(0x40), // Vcomh deselect level + CMD_ALL_PIX(0), // Send RAM to display + CMD_INVERTED(0), // Normal display mode + CMD_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) + CMD_CHARGE_PUMP(1), // Charge pump setting + CMD_SCROLL(0), // Deactivate scroll + CMD_ON(1), // Display ON + U8G_ESC_END // End of sequence }; uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { @@ -205,7 +205,7 @@ uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_data_start_2_wire); u8g_WriteByte(u8g, dev, 0xB0 | (pb->p.page*2)); // Select current page u8g_SetAddress(u8g, dev, 1); // Data mode - u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *) pb->buf); + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_data_start_2_wire); @@ -220,8 +220,8 @@ uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); } -uint8_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf[WIDTH*2] U8G_NOCOMMON ; -u8g_pb_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf}; +uint8_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf[WIDTH * 2] U8G_NOCOMMON; +u8g_pb_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf }; u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire = { u8g_dev_ssd1306_128x64_2x_2_wire_fn, &u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb, U8G_COM_SSD_I2C_HAL }; ///////////////////////////////////////////////////////////////////////////////////////////// @@ -236,7 +236,7 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s for (;;) { uint8_t value = u8g_pgm_read(esc_seq); if (is_escape == 0) { - if (value != 255) { + if (value != 0xFF) { if (u8g_WriteByte(u8g, dev, value) == 0) return 0; if (u8g_WriteByte(u8g, dev, I2C_CMD_MODE) == 0) return 0; } @@ -245,17 +245,17 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s } } else { - if (value == 255) { + if (value == 0xFF) { if (u8g_WriteByte(u8g, dev, value) == 0) return 0; if (u8g_WriteByte(u8g, dev, I2C_CMD_MODE) == 0) return 0; } - else if (value == 254) { + else if (value == 0xFE) { break; } else if (value >= 0xF0) { - // not yet used, do nothing + // Not yet used, do nothing } - else if (value >= 0xE0 ) { + else if (value >= 0xE0) { u8g_SetAddress(u8g, dev, value & 0x0F); } else if (value >= 0xD0) { @@ -270,11 +270,10 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s u8g_SetResetHigh(u8g, dev); u8g_Delay(value); } - else if (value >= 0xBE) { - // not yet implemented + else if (value >= 0xBE) { // Not yet implemented //u8g_SetVCC(u8g, dev, value & 0x01); } - else if (value <= 127) { + else if (value <= 0x7F) { u8g_Delay(value); } is_escape = 0; diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp index afb3c28a8c..fae4b78aec 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp @@ -64,7 +64,7 @@ #define PAGE_HEIGHT 8 #define SH1106_PAGE_ADR(N) (0x20), (N) -#define SH1106_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xFF) +#define SH1106_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xF) #define SH1106_COLUMN_RANGE(N,O) (0x21), (N), (O) #define SH1106_PAGE_RANGE(N,O) (0x22), (N), (O) #define SH1106_SCROLL(N) ((N) ? 0x2F : 0x2E) diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp index 010231d056..db9437d034 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp @@ -32,7 +32,7 @@ #define PAGE_HEIGHT 8 #define SSD1309_PAGE_ADR(N) (0x20), (N) -#define SSD1309_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xFF) +#define SSD1309_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xF) #define SSD1309_COLUMN_RANGE(N,O) (0x21), (N), (O) #define SSD1309_PAGE_RANGE(N,O) (0x22), (N), (O) #define SSD1309_SCROLL(N) ((N) ? 0x2F : 0x2E) diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp index 61a1e214bd..5f69680d01 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp @@ -85,72 +85,72 @@ /* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ static const uint8_t u8g_dev_st7565_64128n_HAL_init_seq[] PROGMEM = { - U8G_ESC_CS(0), // disable chip - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - U8G_ESC_RST(15), // do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/ + U8G_ESC_CS(0), // Disable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + U8G_ESC_RST(15), // Do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/ ST7565_BIAS_MODE(0), // 0xA2: LCD bias 1/9 (according to Displaytech 64128N datasheet) ST7565_ADC_REVERSE(0), // Normal ADC Select (according to Displaytech 64128N datasheet) - ST7565_OUT_MODE(1), // common output mode: set scan direction + ST7565_OUT_MODE(1), // Common output mode: set scan direction ST7565_START_LINE(0), // Display start line for Displaytech 64128N - ST7565_POWER_CONTROL(0x4), // power control: turn on voltage converter - U8G_ESC_DLY(50), // delay 50 ms + ST7565_POWER_CONTROL(0x4), // Power control: turn on voltage converter + U8G_ESC_DLY(50), // Delay 50 ms - ST7565_POWER_CONTROL(0x6), // power control: turn on voltage regulator - U8G_ESC_DLY(50), // delay 50 ms + ST7565_POWER_CONTROL(0x6), // Power control: turn on voltage regulator + U8G_ESC_DLY(50), // Delay 50 ms - ST7565_POWER_CONTROL(0x7), // power control: turn on voltage follower - U8G_ESC_DLY(50), // delay 50 ms + ST7565_POWER_CONTROL(0x7), // Power control: turn on voltage follower + U8G_ESC_DLY(50), // Delay 50 ms #ifdef ST7565_VOLTAGE_DIVIDER_VALUE // Set V5 voltage resistor ratio. Affects brightness of Displaytech 64128N ST7565_V5_RATIO(ST7565_VOLTAGE_DIVIDER_VALUE), #endif - ST7565_INVERTED(0), // display normal, bit val 0: LCD pixel off. + ST7565_INVERTED(0), // Display normal, bit val 0: LCD pixel off. ST7565_CONTRAST(0x1E), // Contrast value for Displaytech 64128N - ST7565_ON(1), // display on + ST7565_ON(1), // Display on - U8G_ESC_DLY(100), // delay 100 ms - ST7565_ALL_PIX(1), // display all points, ST7565 - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_DLY(100), // delay 100 ms - ST7565_ALL_PIX(0), // normal display - U8G_ESC_CS(0), // disable chip - U8G_ESC_END // end of sequence + U8G_ESC_DLY(100), // Delay 100 ms + ST7565_ALL_PIX(1), // Display all points, ST7565 + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_DLY(100), // Delay 100 ms + ST7565_ALL_PIX(0), // Normal display + U8G_ESC_CS(0), // Disable chip + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_st7565_64128n_HAL_data_start[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - ST7565_COLUMN_ADR(ST7565_XOFFSET), // high 4 bits to 0, low 4 bits to 0. Changed for DisplayTech 64128N - U8G_ESC_END // end of sequence + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + ST7565_COLUMN_ADR(ST7565_XOFFSET), // High 4 bits to 0, low 4 bits to 0. Changed for DisplayTech 64128N + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_st7565_64128n_HAL_sleep_on[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - ST7565_SLEEP_MODE(), // static indicator off - //0x00, // indicator register set (not sure if this is required) - ST7565_ON(0), // display off - ST7565_ALL_PIX(1), // all points on - U8G_ESC_CS(0), // disable chip, bugfix 12 nov 2014 - U8G_ESC_END // end of sequence + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + ST7565_SLEEP_MODE(), // Static indicator off + //0x00, // Indicator register set (not sure if this is required) + ST7565_ON(0), // Display off + ST7565_ALL_PIX(1), // All points on + U8G_ESC_CS(0), // Disable chip, bugfix 12 nov 2014 + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_st7565_64128n_HAL_sleep_off[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - ST7565_ALL_PIX(0), // all points off - ST7565_ON(1), // display on - U8G_ESC_DLY(50), // delay 50 ms - U8G_ESC_CS(0), // disable chip, bugfix 12 nov 2014 - U8G_ESC_END // end of sequence + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + ST7565_ALL_PIX(0), // All points off + ST7565_ON(1), // Display on + U8G_ESC_DLY(50), // Delay 50 ms + U8G_ESC_CS(0), // Disable chip, bugfix 12 nov 2014 + U8G_ESC_END // End of sequence }; uint8_t u8g_dev_st7565_64128n_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t msg, void *arg) { @@ -164,15 +164,15 @@ uint8_t u8g_dev_st7565_64128n_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t m case U8G_DEV_MSG_PAGE_NEXT: { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); - u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(pb->p.page)); /* select current page (ST7565R) */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(pb->p.page)); // select current page (ST7565R) + u8g_SetAddress(u8g, dev, 1); // data mode if (!u8g_pb_WriteBuffer(pb, u8g, dev)) return 0; u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // instruction mode u8g_WriteByte(u8g, dev, 0x81); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); @@ -199,21 +199,21 @@ uint8_t u8g_dev_st7565_64128n_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_ u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); - u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page)); /* select current page (ST7565R) */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page)); // select current page (ST7565R) + u8g_SetAddress(u8g, dev, 1); // data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); - u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page + 1)); /* select current page (ST7565R) */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page + 1)); // select current page (ST7565R) + u8g_SetAddress(u8g, dev, 1); // data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // instruction mode u8g_WriteByte(u8g, dev, 0x81); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp index fb9d4b7ad6..76d15ce8a2 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp @@ -63,22 +63,22 @@ /* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ static const uint8_t u8g_dev_st7920_128x64_HAL_init_seq[] PROGMEM = { - U8G_ESC_CS(0), // disable chip - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_RST(15), // do reset low pulse with (15*16)+2 milliseconds (=maximum delay) + U8G_ESC_CS(0), // Disable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_RST(15), // Do reset low pulse with (15*16)+2 milliseconds (=maximum delay) U8G_ESC_DLY(100), // 8 Dez 2012: additional delay 100 ms because of reset - U8G_ESC_CS(1), // enable chip - U8G_ESC_DLY(50), // delay 50 ms + U8G_ESC_CS(1), // Enable chip + U8G_ESC_DLY(50), // Delay 50 ms 0x038, // 8 Bit interface (DL=1), basic instruction set (RE=0) - 0x00C, // display on, cursor & blink off; 0x08: all off + 0x00C, // Display on, cursor & blink off; 0x08: all off 0x006, // Entry mode: Cursor move to right, DDRAM address counter (AC) plus 1, no shift - 0x002, // disable scroll, enable CGRAM address - 0x001, // clear RAM, needs 1.6 ms - U8G_ESC_DLY(100), // delay 100 ms + 0x002, // Disable scroll, enable CGRAM address + 0x001, // Clear RAM, needs 1.6 ms + U8G_ESC_DLY(100), // Delay 100 ms - U8G_ESC_CS(0), // disable chip - U8G_ESC_END // end of sequence + U8G_ESC_CS(0), // Disable chip + U8G_ESC_END // End of sequence }; void clear_graphics_DRAM(u8g_t *u8g, u8g_dev_t *dev) { @@ -115,24 +115,24 @@ uint8_t u8g_dev_st7920_128x64_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo uint8_t *ptr; u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode u8g_SetChipSelect(u8g, dev, 1); y = pb->p.page_y0; ptr = (uint8_t *)pb->buf; for (i = 0; i < 8; i ++) { - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ - u8g_WriteByte(u8g, dev, 0x03E ); /* enable extended mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode + u8g_WriteByte(u8g, dev, 0x03E ); // Enable extended mode if (y < 32) { - u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/ + u8g_WriteByte(u8g, dev, 0x080 | y ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 ); // Set x pos to 0 } else { - u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/ + u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 | 8); // Set x pos to 64 } - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, (LCD_PIXEL_WIDTH) / 8, ptr); ptr += (LCD_PIXEL_WIDTH) / 8; y++; @@ -160,24 +160,24 @@ uint8_t u8g_dev_st7920_128x64_HAL_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, uint8_t *ptr; u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode u8g_SetChipSelect(u8g, dev, 1); y = pb->p.page_y0; ptr = (uint8_t *)pb->buf; for (i = 0; i < 32; i ++) { - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ - u8g_WriteByte(u8g, dev, 0x03E ); /* enable extended mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode + u8g_WriteByte(u8g, dev, 0x03E ); // Enable extended mode if (y < 32) { - u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/ + u8g_WriteByte(u8g, dev, 0x080 | y ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 ); // Set x pos to 0 } else { - u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/ + u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 | 8); // Set x pos to 64 } - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, (LCD_PIXEL_WIDTH) / 8, ptr); ptr += (LCD_PIXEL_WIDTH) / 8; y++; @@ -199,8 +199,8 @@ u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_f U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_hw_spi, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_HW_SPI); u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_HW_SPI }; -#if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) || defined(U8G_HAL_LINKS) - // Also use this device for HAL version of rrd class. This results in the same device being used +#if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32, ARDUINO_ARCH_MFL) || defined(U8G_HAL_LINKS) + // Also use this device for HAL version of RRD class. This results in the same device being used // for the ST7920 for HAL systems no matter what is selected in marlinui_DOGM.h. u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; #endif diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp index f9c68c15fc..1d1291ff9a 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp @@ -83,59 +83,59 @@ #define UC1701_BOOST_RATIO(N) (0xF8), (N) static const uint8_t u8g_dev_uc1701_mini12864_HAL_init_seq[] PROGMEM = { - U8G_ESC_CS(0), // disable chip - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_RST(1), // do reset low pulse with (1*16)+2 milliseconds - U8G_ESC_CS(1), // enable chip + U8G_ESC_CS(0), // Disable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_RST(1), // Do reset low pulse with (1*16)+2 milliseconds + U8G_ESC_CS(1), // Enable chip - UC1701_RESET(), // soft reset - UC1701_START_LINE(0), // set display start line to 0 + UC1701_RESET(), // Soft reset + UC1701_START_LINE(0), // Set display start line to 0 UC1701_ADC_REVERSE(0), // ADC set to reverse - UC1701_OUT_MODE(1), // common output mode - UC1701_INVERTED(0), // display normal, bit val 0: LCD pixel off + UC1701_OUT_MODE(1), // Common output mode + UC1701_INVERTED(0), // Display normal, bit val 0: LCD pixel off UC1701_BIAS_MODE(0), // LCD bias 1/9 - UC1701_POWER_CONTROL(0x7), // all power control circuits on - UC1701_BOOST_RATIO(0x0), // set booster ratio to 4x - UC1701_V5_RATIO(3), // set V0 voltage resistor ratio to large - UC1701_CONTRAST(0x27), // set contrast - UC1701_INDICATOR(0), // indicator disable - UC1701_ON(1), // display on + UC1701_POWER_CONTROL(0x7), // All power control circuits on + UC1701_BOOST_RATIO(0x0), // Set booster ratio to 4x + UC1701_V5_RATIO(3), // Set V0 voltage resistor ratio to large + UC1701_CONTRAST(0x27), // Set contrast + UC1701_INDICATOR(0), // Indicator disable + UC1701_ON(1), // Display on - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_CS(1), // enable chip + U8G_ESC_CS(0), // Disable chip + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_CS(1), // Enable chip - UC1701_ALL_PIX(1), // display all points, ST7565 - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_CS(1), // enable chip - UC1701_ALL_PIX(0), // normal display - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(150), // delay 150 ms before sending any data - U8G_ESC_END // end of sequence + UC1701_ALL_PIX(1), // Display all points, ST7565 + U8G_ESC_CS(0), // Disable chip + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_CS(1), // Enable chip + UC1701_ALL_PIX(0), // Normal display + U8G_ESC_CS(0), // Disable chip + U8G_ESC_DLY(150), // Delay 150 ms before sending any data + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_uc1701_mini12864_HAL_data_start[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip #if ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY, FYSETC_MINI_12864) - UC1701_START_LINE(0), // set display start line to 0 + UC1701_START_LINE(0), // Set display start line to 0 UC1701_ADC_REVERSE(0), // ADC set to reverse - UC1701_OUT_MODE(1), // common output mode - UC1701_INVERTED(0), // display normal, bit val 0: LCD pixel off + UC1701_OUT_MODE(1), // Common output mode + UC1701_INVERTED(0), // Display normal, bit val 0: LCD pixel off UC1701_BIAS_MODE(0), // LCD bias 1/9 - UC1701_POWER_CONTROL(0x7),// all power control circuits on - UC1701_BOOST_RATIO(0x0), // set booster ratio to 4x - UC1701_V5_RATIO(3), // set V0 voltage resistor ratio to large - UC1701_INDICATOR(0), // indicator disable - UC1701_ON(1), // display on - UC1701_COLUMN_HI(0), // set upper 4 bits of the col adr to 0 - U8G_ESC_END, // end of sequence - U8G_ESC_DLY(5) // delay 5 ms + UC1701_POWER_CONTROL(0x7),// All power control circuits on + UC1701_BOOST_RATIO(0x0), // Set booster ratio to 4x + UC1701_V5_RATIO(3), // Set V0 voltage resistor ratio to large + UC1701_INDICATOR(0), // Indicator disable + UC1701_ON(1), // Display on + UC1701_COLUMN_HI(0), // Set upper 4 bits of the col adr to 0 + U8G_ESC_END, // End of sequence + U8G_ESC_DLY(5) // Delay 5 ms #else - UC1701_COLUMN_ADR(0), // address 0 - U8G_ESC_END // end of sequence + UC1701_COLUMN_ADR(0), // Address 0 + U8G_ESC_END // End of sequence #endif }; @@ -151,15 +151,15 @@ uint8_t u8g_dev_uc1701_mini12864_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, case U8G_DEV_MSG_PAGE_NEXT: { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); // Select current page + u8g_SetAddress(u8g, dev, 1); // Data mode if (!u8g_pb_WriteBuffer(pb, u8g, dev)) return 0; u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteByte(u8g, dev, 0x081); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); @@ -180,20 +180,20 @@ uint8_t u8g_dev_uc1701_mini12864_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m case U8G_DEV_MSG_PAGE_NEXT: { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page)); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page)); // Select current page + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page + 1)); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page + 1)); // Select current page + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteByte(u8g, dev, 0x081); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); diff --git a/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp index cd7445e019..f7b50741ac 100644 --- a/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -20,12 +20,12 @@ * */ -// NOTE - the HAL version of the rrd device uses a generic ST7920 device. -// See u8g_dev_st7920_128x64_HAL.cpp for the HAL version. +// NOTE - The HAL version of the RRD device uses a generic ST7920 device. +// See u8g_dev_st7920_128x64_HAL.cpp #include "../../../inc/MarlinConfigPre.h" -#if ANY(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) +#if ANY(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32, ARDUINO_ARCH_MFL) #include "../../../inc/MarlinConfig.h" @@ -193,4 +193,4 @@ u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_rrd_st7920_128x64_fn, &u8 #endif #endif // IS_U8GLIB_ST7920 -#endif // __AVR__ || ARDUINO_ARCH_STM32 || ARDUINO_ARCH_ESP32 +#endif // __AVR__ || ARDUINO_ARCH_STM32 || ARDUINO_ARCH_ESP32 || ARDUINO_ARCH_MFL diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp index 5d9ef627c9..1ee71f7c59 100644 --- a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp +++ b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2018 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 . + * + */ + /** * @file u8g_fontutf8.cpp * @brief font api for u8g lib diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.h b/Marlin/src/lcd/dogm/u8g_fontutf8.h index 281894509d..00df000d9c 100644 --- a/Marlin/src/lcd/dogm/u8g_fontutf8.h +++ b/Marlin/src/lcd/dogm/u8g_fontutf8.h @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2018 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 . + * + */ + /** * @file fontutf8.h * @brief font api for u8g lib diff --git a/Marlin/src/lcd/e3v2/common/dwin_set.h b/Marlin/src/lcd/e3v2/common/dwin_set.h index 644efb40ba..f59bb74cd3 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_set.h +++ b/Marlin/src/lcd/e3v2/common/dwin_set.h @@ -132,17 +132,7 @@ #define ICON_Printer_0 93 #define ICON_Box 200 #define ICON_Checkbox 201 -#define ICON_Fade 202 -#define ICON_Mesh 203 -#define ICON_Tilt 204 -#define ICON_Brightness 205 #define ICON_Probe 206 -#define ICON_AxisD 249 -#define ICON_AxisBR 250 -#define ICON_AxisTR 251 -#define ICON_AxisBL 252 -#define ICON_AxisTL 253 -#define ICON_AxisC 254 #define ICON_Folder ICON_More #define ICON_AdvSet ICON_Language @@ -162,3 +152,31 @@ #define ICON_FWRetZRaise ICON_MoveZ #define ICON_FWRecSpeed ICON_Setspeed #define ICON_FWRecExtra ICON_StepE + +#if DISABLED(DWIN_CREALITY_LCD_STD_ICONS) + // Index of custom icons should be >= CUSTOM_ICON_START + #define CUSTOM_ICON_START 200 + #define ICON_Checkbox_F ICON_Box + #define ICON_Checkbox_T ICON_Checkbox + #define ICON_Fade 202 + #define ICON_Mesh 203 + #define ICON_Tilt 204 + #define ICON_Brightness 205 + #define ICON_AxisD 249 + #define ICON_AxisBR 250 + #define ICON_AxisTR 251 + #define ICON_AxisBL 252 + #define ICON_AxisTL 253 + #define ICON_AxisC 254 +#else + #define ICON_Fade ICON_Version + #define ICON_Mesh ICON_Version + #define ICON_Tilt ICON_Version + #define ICON_Brightness ICON_Version + #define ICON_AxisD ICON_Axis + #define ICON_AxisBR ICON_Axis + #define ICON_AxisTR ICON_Axis + #define ICON_AxisBL ICON_Axis + #define ICON_AxisTL ICON_Axis + #define ICON_AxisC ICON_Axis +#endif diff --git a/Marlin/src/lcd/e3v2/common/limits.h b/Marlin/src/lcd/e3v2/common/limits.h index 560c8735a7..c773240b28 100644 --- a/Marlin/src/lcd/e3v2/common/limits.h +++ b/Marlin/src/lcd/e3v2/common/limits.h @@ -65,6 +65,12 @@ constexpr xyze_float_t max_acceleration_edit_values = #endif ; +#if HAS_SPINDLE_ACCELERATION + constexpr float min_acceleration_edit_values_spindle = 1, + default_acceleration_spindle = DEFAULT_ACCELERATION_SPINDLE, + max_acceleration_edit_values_spindle = default_acceleration_spindle * DEFAULT_MAX_MULTIPLIER; +#endif + // // Max Jerk limits // diff --git a/Marlin/src/lcd/e3v2/creality/dwin.cpp b/Marlin/src/lcd/e3v2/creality/dwin.cpp index fcbeecde83..56830086fd 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -1595,6 +1595,27 @@ void hmiMaxAccelerationXYZE() { drawEditInteger4(select_acc.now, hmiValues.maxAcceleration, true); } + +#if HAS_SPINDLE_ACCELERATION + + void hmiSpindleAcceleration() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + if (applyEncoder(encoder_diffState, hmiValues.spindleAcceleration)) { + checkkey = ID_SpindleAcceleration; + encoderRate.enabled = false; + cutter.spindle_acceleration_deg_per_s2 = hmiValues.spindleAcceleration; + drawEditInteger4(select_acc.now, hmiValues.spindleAcceleration); + return; + } + // SpindleAcceleration limit + LIMIT(hmiValues.spindleAcceleration, min_acceleration_edit_values_spindle, max_acceleration_edit_values_spindle); + // SpindleAcceleration value + drawEditInteger4(select_acc.now, hmiValues.spindleAcceleration, true); + } + +#endif // HAS_SPINDLE_ACCELERATION + #if ENABLED(CLASSIC_JERK) void hmiMaxJerkXYZE() { @@ -4283,6 +4304,9 @@ void dwinHandleScreen() { case ID_PrintSpeed: hmiPrintSpeed(); break; case ID_MaxSpeedValue: hmiMaxFeedspeedXYZE(); break; case ID_MaxAccelerationValue: hmiMaxAccelerationXYZE(); break; + #if HAS_SPINDLE_ACCELERATION + case ID_SpindleAccelerationValue: hmiSpindleAcceleration(); break; + #endif #if ENABLED(CLASSIC_JERK) case ID_MaxJerkValue: hmiMaxJerkXYZE(); break; #endif diff --git a/Marlin/src/lcd/e3v2/creality/dwin.h b/Marlin/src/lcd/e3v2/creality/dwin.h index fce52d8cf4..50723d015c 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.h +++ b/Marlin/src/lcd/e3v2/creality/dwin.h @@ -53,6 +53,9 @@ enum processID : uint8_t { #endif ID_MaxSpeed, ID_MaxSpeedValue, ID_MaxAcceleration, ID_MaxAccelerationValue, + #if HAS_SPINDLE_ACCELERATION + ID_SpindleAccelerationValue, + #endif ID_MaxJerk, ID_MaxJerkValue, ID_Step, ID_StepValue, ID_HomeOff, ID_HomeOffX, ID_HomeOffY, ID_HomeOffZ, @@ -105,6 +108,9 @@ typedef struct { int16_t printSpeed = 100; float maxFeedSpeed = 0; float maxAcceleration = 0; + #if HAS_SPINDLE_ACCELERATION + float spindleAcceleration = 0; + #endif float maxJerkScaled = 0; float maxStepScaled = 0; float offset_value = 0; @@ -203,6 +209,9 @@ void hmiPrintSpeed(); void hmiMaxFeedspeedXYZE(); void hmiMaxAccelerationXYZE(); +#if HAS_SPINDLE_ACCELERATION + void hmiSpindleAcceleration(); +#endif void hmiMaxJerkXYZE(); #if ENABLED(EDITABLE_STEPS_PER_UNIT) void hmiStepXYZE(); diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 09100e5029..d582b96ed7 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -427,7 +427,7 @@ private: v1 = -rmax; v2 = rmin; } - jyersDWIN.updateStatus(TS(GET_TEXT_F(MSG_COLORS_RED), ' ', p_float_t(v1, 3) , F("..0.."), p_float_t(v2, 3), ' ', GET_TEXT_F(MSG_COLORS_GREEN))); + jyersDWIN.updateStatus(TS(GET_TEXT_F(MSG_COLORS_RED), ' ', p_float_t(v1, 3), F("..0.."), p_float_t(v2, 3), ' ', GET_TEXT_F(MSG_COLORS_GREEN))); drawing_mesh = false; } @@ -523,18 +523,18 @@ void JyersDWIN::drawMenuItem(const uint8_t row, const uint8_t icon/*=0*/, FSTR_P } void JyersDWIN::drawCheckbox(const uint8_t row, const bool value) { - #if ENABLED(DWIN_CREALITY_LCD_CUSTOM_ICONS) // Draw appropriate checkbox icon + #if DISABLED(DWIN_CREALITY_LCD_STD_ICONS) // Draw appropriate checkbox icon dwinIconShow(ICON, (value ? ICON_Checkbox_T : ICON_Checkbox_F), 226, MBASE(row) - 3); #else // Draw a basic checkbox using rectangles and lines dwinDrawRectangle(1, COLOR_BG_BLACK, 226, MBASE(row) - 3, 226 + 20, MBASE(row) - 3 + 20); - dwinDrawRectangle(0, COLOR_WHITE, 226, MBASE(row) - 3, 226 + 20, MBASE(row) - 3 + 20); + dwinDrawRectangle(0, COLOR_WHITE, 226, MBASE(row) - 3, 226 + 20, MBASE(row) - 3 + 20); if (value) { - dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 11, 226 + 8, MBASE(row) - 3 + 17); - dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 17, 226 + 19, MBASE(row) - 3 + 1); - dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 12, 226 + 8, MBASE(row) - 3 + 18); - dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 18, 226 + 19, MBASE(row) - 3 + 2); - dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 13, 226 + 8, MBASE(row) - 3 + 19); - dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 19, 226 + 19, MBASE(row) - 3 + 3); + dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 11, 226 + 8, MBASE(row) - 3 + 17); + dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 17, 226 + 19, MBASE(row) - 3 + 1); + dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 12, 226 + 8, MBASE(row) - 3 + 18); + dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 18, 226 + 19, MBASE(row) - 3 + 2); + dwinDrawLine(COLOR_CHECKBOX, 227, MBASE(row) - 3 + 13, 226 + 8, MBASE(row) - 3 + 19); + dwinDrawLine(COLOR_CHECKBOX, 227 + 8, MBASE(row) - 3 + 19, 226 + 19, MBASE(row) - 3 + 3); } #endif } @@ -3033,7 +3033,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_StepY, F("M48 Probe Test")); else { gcode.process_subcommands_now( - TS(F("G28O\nM48X") , p_float_t((X_BED_SIZE + X_MIN_POS) / 2.0f, 3), 'Y', p_float_t((Y_BED_SIZE + Y_MIN_POS) / 2.0f, 3), 'P', testcount) + TS(F("G28O\nM48X"), p_float_t((X_BED_SIZE + X_MIN_POS) / 2.0f, 3), 'Y', p_float_t((Y_BED_SIZE + Y_MIN_POS) / 2.0f, 3), 'P', testcount) ); } break; @@ -3068,7 +3068,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenu(ID_Advanced, ADVANCED_TMC); break; - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC case TMC_STEPPER_CURRENT_X: static float stepper_current_x; @@ -3084,7 +3084,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra break; #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC case TMC_STEPPER_CURRENT_Y: static float stepper_current_y; if (draw) { @@ -3098,7 +3098,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra break; #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC case TMC_STEPPER_CURRENT_Z: static float stepper_current_z; if (draw) { @@ -3112,7 +3112,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra break; #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC case TMC_STEPPER_CURRENT_E: static float stepper_current_e; if (draw) { diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.h b/Marlin/src/lcd/e3v2/jyersui/dwin.h index 48e413efbb..40c7490e30 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.h +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.h @@ -26,7 +26,6 @@ */ #include "dwin_lcd.h" -#include "../common/dwin_set.h" #include "../common/dwin_font.h" #include "../common/dwin_color.h" #include "../common/encoder.h" @@ -35,7 +34,8 @@ #include "../../../inc/MarlinConfigPre.h" -//#define DWIN_CREALITY_LCD_CUSTOM_ICONS +#define DWIN_CREALITY_LCD_STD_ICONS +#include "../common/dwin_set.h" enum processID : uint8_t { Proc_Main, Proc_Print, Proc_Menu, Proc_Value, Proc_Option, @@ -120,34 +120,6 @@ enum menuID : uint8_t { ID_PreheatHotend }; -// Custom icons -#if ENABLED(DWIN_CREALITY_LCD_CUSTOM_ICONS) - // index of every custom icon should be >= CUSTOM_ICON_START - #define CUSTOM_ICON_START ICON_Checkbox_F - #define ICON_Checkbox_F 200 - #define ICON_Checkbox_T 201 - #define ICON_Fade 202 - #define ICON_Mesh 203 - #define ICON_Tilt 204 - #define ICON_Brightness 205 - #define ICON_AxisD 249 - #define ICON_AxisBR 250 - #define ICON_AxisTR 251 - #define ICON_AxisBL 252 - #define ICON_AxisTL 253 - #define ICON_AxisC 254 -#else - #define ICON_Fade ICON_Version - #define ICON_Mesh ICON_Version - #define ICON_Tilt ICON_Version - #define ICON_Brightness ICON_Version - #define ICON_AxisD ICON_Axis - #define ICON_AxisBR ICON_Axis - #define ICON_AxisTR ICON_Axis - #define ICON_AxisBL ICON_Axis - #define ICON_AxisTL ICON_Axis - #define ICON_AxisC ICON_Axis -#endif enum colorID : uint8_t { Default, White, Green, Cyan, Blue, Magenta, Red, Orange, Yellow, Brown, Black diff --git a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp index e4b6fb72a0..b85caaf6cc 100644 --- a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp +++ b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp @@ -63,6 +63,7 @@ BedLevelTools bedLevelTools; #if ENABLED(USE_GRID_MESHVIEWER) + bool BedLevelTools::grid_meshview = false; bool BedLevelTools::viewer_print_value = false; #endif bool BedLevelTools::goto_mesh_value = false; diff --git a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h index a0da0ceeb3..5716316ee4 100644 --- a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h +++ b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h @@ -46,8 +46,8 @@ class BedLevelTools { public: - #if ENABLED(USE_GRID_MESHVIEWER) - static bool viewer_asymmetric_range; + #if USE_GRID_MESHVIEWER + static bool grid_meshview; static bool viewer_print_value; #endif static bool goto_mesh_value; @@ -69,7 +69,7 @@ public: static float getMaxValue(); static float getMinValue(); static bool meshValidate(); - #if ENABLED(USE_GRID_MESHVIEWER) + #if USE_GRID_MESHVIEWER static void drawBedMesh(int16_t selected=-1, uint8_t gridline_width=1, uint16_t padding_x=8, uint16_t padding_y_top=(40 + 53 - 7)); static void setMeshViewerStatus(); #endif diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index cbf806a7c9..7428a4b254 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -2000,7 +2000,7 @@ void dwinRedrawScreen() { #endif // ADVANCED_PAUSE_FEATURE #if HAS_MESH - void dwinMeshViewer() { + void _dwinMeshViewer() { if (!leveling_is_valid()) dwinPopupContinue(ICON_Leveling_1, GET_TEXT_F(MSG_MESH_VIEWER), GET_TEXT_F(MSG_NO_VALID_MESH)); else { @@ -2008,6 +2008,13 @@ void dwinRedrawScreen() { meshViewer.draw(); } } + void dwinMeshViewer() { + TERN_(USE_GRID_MESHVIEWER, bedLevelTools.grid_meshview = false); + _dwinMeshViewer(); + } + #if ENABLED(USE_GRID_MESHVIEWER) + void dwinMeshViewerGrid() { bedLevelTools.grid_meshview = true; _dwinMeshViewer(); } + #endif #endif #if HAS_LOCKSCREEN @@ -3101,8 +3108,18 @@ frame_rect_t selrect(frame_rect_t) { } void drawPrepareMenu() { + constexpr uint8_t items = (3 + + COUNT_ENABLED(LCD_BED_TRAMMING) + + 2 + + TERN(MESH_BED_LEVELING, 1, ENABLED(HAS_BED_PROBE)) + + TERN(HAS_ZOFFSET_ITEM, ENABLED(HAS_BED_PROBE), ENABLED(BABYSTEPPING)) + + PREHEAT_COUNT + + 1 + + 2 * ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) + + 1 + ); checkkey = ID_Menu; - if (SET_MENU_R(prepareMenu, selrect({133, 1, 28, 13}), MSG_PREPARE, 12 + PREHEAT_COUNT)) { + if (SET_MENU_R(prepareMenu, selrect({133, 1, 28, 13}), MSG_PREPARE, items)) { BACK_ITEM(gotoMainMenu); MENU_ITEM(ICON_FilMan, MSG_FILAMENT_MAN, onDrawSubMenu, drawFilamentManMenu); MENU_ITEM(ICON_Axis, MSG_MOVE_AXIS, onDrawMoveSubMenu, drawMoveMenu); @@ -3145,8 +3162,14 @@ void drawPrepareMenu() { #if ENABLED(LCD_BED_TRAMMING) void drawTrammingMenu() { + constexpr uint8_t items = (1 + + 2 * ALL(HAS_BED_PROBE, HAS_MESH) + + (DISABLED(HAS_BED_PROBE) && ENABLED(HAS_ZOFFSET_ITEM)) + + 4 + + ENABLED(BED_TRAMMING_INCLUDE_CENTER) + ); checkkey = ID_Menu; - if (SET_MENU(trammingMenu, MSG_BED_TRAMMING, 8)) { + if (SET_MENU(trammingMenu, MSG_BED_TRAMMING, items)) { BACK_ITEM(drawPrepareMenu); #if HAS_BED_PROBE && HAS_MESH MENU_ITEM(ICON_Tram, MSG_TRAMMING_WIZARD, onDrawMenuItem, trammingwizard); @@ -3168,8 +3191,13 @@ void drawPrepareMenu() { #endif // LCD_BED_TRAMMING void drawControlMenu() { + constexpr uint8_t items = (3 + + COUNT_ENABLED(CASE_LIGHT_MENU, LED_CONTROL_MENU) + + TERN0(EEPROM_SETTINGS, 3) + + 2 + ); checkkey = ID_Menu; - if (SET_MENU_R(controlMenu, selrect({103, 1, 28, 14}), MSG_CONTROL, 11)) { + if (SET_MENU_R(controlMenu, selrect({103, 1, 28, 14}), MSG_CONTROL, items)) { BACK_ITEM(gotoMainMenu); MENU_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawTempSubMenu, drawTemperatureMenu); MENU_ITEM(ICON_Motion, MSG_MOTION, onDrawMotionSubMenu, drawMotionMenu); @@ -3198,8 +3226,20 @@ void drawControlMenu() { } void drawAdvancedSettingsMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(EEPROM_SETTINGS, HAS_MESH, HAS_BED_PROBE, HAS_HOME_OFFSET, HAS_TRINAMIC_CONFIG, HAS_ESDIAG, \ + HAS_LOCKSCREEN, EDITABLE_DISPLAY_TIMEOUT, SOUND_MENU_ITEM, POWER_LOSS_RECOVERY, HAS_GCODE_PREVIEW, \ + PROUI_MEDIASORT, BAUD_RATE_GCODE, HAS_CUSTOM_COLORS) + + 1 + + (ENABLED(PIDTEMP) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU)) + + ANY(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) + + (ENABLED(PIDTEMPBED) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU)) + + TERN0(PRINTCOUNTER, 2) + + 1 + + TERN0(HAS_LCD_BRIGHTNESS, 2) + ); checkkey = ID_Menu; - if (SET_MENU(advancedSettingsMenu, MSG_ADVANCED_SETTINGS, 24)) { + if (SET_MENU(advancedSettingsMenu, MSG_ADVANCED_SETTINGS, items)) { BACK_ITEM(gotoMainMenu); #if ENABLED(EEPROM_SETTINGS) MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); @@ -3268,8 +3308,9 @@ void drawAdvancedSettingsMenu() { } void drawMoveMenu() { + constexpr uint8_t items = 2 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(moveMenu, selrect({192, 1, 42, 14}), MSG_MOVE_AXIS, 6)) { + if (SET_MENU_R(moveMenu, selrect({192, 1, 42, 14}), MSG_MOVE_AXIS, items)) { BACK_ITEM(drawPrepareMenu); EDIT_ITEM(ICON_Axis, MSG_LIVE_MOVE, onDrawChkbMenu, setLiveMove, &enableLiveMove); #if HAS_X_AXIS @@ -3293,8 +3334,9 @@ void drawMoveMenu() { #if HAS_HOME_OFFSET void drawHomeOffsetMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS); checkkey = ID_Menu; - if (SET_MENU(homeOffsetMenu, MSG_SET_HOME_OFFSETS, 4)) { + if (SET_MENU(homeOffsetMenu, MSG_SET_HOME_OFFSETS, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_HomeOffsetX, MSG_HOME_OFFSET_X, onDrawPFloatMenu, setHomeOffsetX, &home_offset.x); @@ -3314,8 +3356,12 @@ void drawMoveMenu() { #if HAS_BED_PROBE void drawProbeSetMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, Z_MIN_PROBE_REPEATABILITY_TEST) + + TERN0(BLTOUCH, 3 + ENABLED(HAS_BLTOUCH_HS_MODE)) + ); checkkey = ID_Menu; - if (SET_MENU(probeSettingsMenu, MSG_ZPROBE_SETTINGS, 9)) { + if (SET_MENU(probeSettingsMenu, MSG_ZPROBE_SETTINGS, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_ProbeOffsetX, MSG_ZPROBE_XOFFSET, onDrawPFloatMenu, setProbeOffsetX, &probe.offset.x); @@ -3344,8 +3390,12 @@ void drawMoveMenu() { #endif // HAS_BED_PROBE void drawFilSetMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(HAS_FILAMENT_SENSOR, HAS_FILAMENT_RUNOUT_DISTANCE, PREVENT_COLD_EXTRUSION, FWRETRACT) + + TERN0(CONFIGURE_FILAMENT_CHANGE, 2) + ); checkkey = ID_Menu; - if (SET_MENU(filSetMenu, MSG_FILAMENT_SET, 9)) { + if (SET_MENU(filSetMenu, MSG_FILAMENT_SET, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if HAS_FILAMENT_SENSOR EDIT_ITEM(ICON_Runout, MSG_RUNOUT_SENSOR, onDrawChkbMenu, setRunoutEnable, &runout.enabled); @@ -3384,8 +3434,12 @@ void drawFilSetMenu() { #if ENABLED(LED_CONTROL_MENU) void drawLedControlMenu() { + constexpr uint8_t items = (1 + + !ALL(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) + + ENABLED(HAS_COLOR_LEDS) * TERN(LED_COLOR_PRESETS, 8, 3 + ENABLED(HAS_WHITE_LED)), + ); checkkey = ID_Menu; - if (SET_MENU(ledControlMenu, MSG_LED_CONTROL, 10)) { + if (SET_MENU(ledControlMenu, MSG_LED_CONTROL, items)) { BACK_ITEM((currentMenu == tuneMenu) ? drawTuneMenu : drawControlMenu); #if !ALL(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) EDIT_ITEM(ICON_LedControl, MSG_LIGHTS, onDrawChkbMenu, setLedStatus, &leds.lights_on); @@ -3416,8 +3470,21 @@ void drawFilSetMenu() { #endif // LED_CONTROL_MENU void drawTuneMenu() { + constexpr uint8_t items = (2 + + COUNT_ENABLED(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) + + ALL(HAS_ZOFFSET_ITEM, BABYSTEPPING) + + 1 + + COUNT_ENABLED(ADVANCED_PAUSE_FEATURE, HAS_FILAMENT_SENSOR, PROUI_ITEM_PLR, FWRETRACT, PROUI_ITEM_JD, PROUI_ITEM_ADVK, HAS_LOCKSCREEN) + + TERN0(HAS_LCD_BRIGHTNESS, 2) + + ENABLED(EDITABLE_DISPLAY_TIMEOUT) + + 2 * ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) + + TERN(CASE_LIGHT_MENU, + 1 + COUNT_ENABLED(CASELIGHT_USES_BRIGHTNESS, LED_CONTROL_MENU), + ENABLED(LED_CONTROL_MENU) && DISABLED(CASE_LIGHT_USE_NEOPIXEL) + ) + ); checkkey = ID_Menu; - if (SET_MENU_R(tuneMenu, selrect({73, 2, 28, 12}), MSG_TUNE, 20)) { + if (SET_MENU_R(tuneMenu, selrect({73, 2, 28, 12}), MSG_TUNE, items)) { BACK_ITEM(gotoPrintProcess); EDIT_ITEM(ICON_Speed, MSG_SPEED, onDrawSpeedItem, setSpeed, &feedrate_percentage); #if HAS_HOTEND @@ -3518,8 +3585,9 @@ void drawTuneMenu() { #endif void drawInputShaping_menu() { + constexpr uint8_t items = 1 + 2 * COUNT_ENABLED(INPUT_SHAPING_X, INPUT_SHAPING_Y, INPUT_SHAPING_Z); checkkey = ID_Menu; - if (SET_MENU(inputShapingMenu, MSG_INPUT_SHAPING, 1 PLUS_TERN0(INPUT_SHAPING_X, 2) PLUS_TERN0(INPUT_SHAPING_Y, 2) PLUS_TERN0(INPUT_SHAPING_Z, 2))) { + if (SET_MENU(inputShapingMenu, MSG_INPUT_SHAPING, items)) { BACK_ITEM(drawMotionMenu); #if ENABLED(INPUT_SHAPING_X) MENU_ITEM(ICON_ShapingX, MSG_SHAPING_A_FREQ, onDrawShapingXFreq, setShapingXFreq); @@ -3539,43 +3607,40 @@ void drawTuneMenu() { #endif #if HAS_TRINAMIC_CONFIG - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC void setXTMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperX.refresh_stepper_current(); }); } #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC void setYTMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperY.refresh_stepper_current(); }); } #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC void setZTMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperZ.refresh_stepper_current(); }); } #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC void setETMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperE0.refresh_stepper_current(); }); } #endif void drawTrinamicConfigMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC, E0_IS_TRINAMIC); checkkey = ID_Menu; - if (SET_MENU(trinamicConfigMenu, MSG_TMC_DRIVERS, 5)) { + if (SET_MENU(trinamicConfigMenu, MSG_TMC_DRIVERS, items)) { BACK_ITEM(drawAdvancedSettingsMenu); - #if AXIS_IS_TMC(X) - EDIT_ITEM(ICON_TMCXSet, MSG_TMC_ACURRENT, onDrawPIntMenu, setXTMCCurrent, &stepperX.val_mA); - #endif - #if AXIS_IS_TMC(Y) - EDIT_ITEM(ICON_TMCYSet, MSG_TMC_BCURRENT, onDrawPIntMenu, setYTMCCurrent, &stepperY.val_mA); - #endif - #if AXIS_IS_TMC(Z) - EDIT_ITEM(ICON_TMCZSet, MSG_TMC_CCURRENT, onDrawPIntMenu, setZTMCCurrent, &stepperZ.val_mA); - #endif - #if AXIS_IS_TMC(E0) - EDIT_ITEM(ICON_TMCESet, MSG_TMC_ECURRENT, onDrawPIntMenu, setETMCCurrent, &stepperE0.val_mA); - #endif + TERN_(X_IS_TRINAMIC, EDIT_ITEM(ICON_TMCXSet, MSG_TMC_ACURRENT, onDrawPIntMenu, setXTMCCurrent, &stepperX.val_mA)); + TERN_(Y_IS_TRINAMIC, EDIT_ITEM(ICON_TMCYSet, MSG_TMC_BCURRENT, onDrawPIntMenu, setYTMCCurrent, &stepperY.val_mA)); + TERN_(Z_IS_TRINAMIC, EDIT_ITEM(ICON_TMCZSet, MSG_TMC_CCURRENT, onDrawPIntMenu, setZTMCCurrent, &stepperZ.val_mA)); + TERN_(E0_IS_TRINAMIC, EDIT_ITEM(ICON_TMCESet, MSG_TMC_ECURRENT, onDrawPIntMenu, setETMCCurrent, &stepperE0.val_mA)); } updateMenu(trinamicConfigMenu); } #endif void drawMotionMenu() { + constexpr uint8_t items = (4 + + COUNT_ENABLED(EDITABLE_STEPS_PER_UNIT, EDITABLE_HOMING_FEEDRATE, LIN_ADVANCE, SHAPING_MENU, ADAPTIVE_STEP_SMOOTHING_TOGGLE) + + 2 + ); checkkey = ID_Menu; - if (SET_MENU_R(motionMenu, selrect({1, 16, 28, 13}), MSG_MOTION, 11)) { + if (SET_MENU_R(motionMenu, selrect({1, 16, 28, 13}), MSG_MOTION, items)) { BACK_ITEM(drawControlMenu); MENU_ITEM(ICON_MaxSpeed, MSG_SPEED, onDrawSpeed, drawMaxSpeedMenu); MENU_ITEM(ICON_MaxAccelerated, MSG_ACCELERATION, onDrawAcc, drawMaxAccelMenu); @@ -3620,8 +3685,13 @@ void drawMotionMenu() { #endif void drawFilamentManMenu() { + constexpr uint8_t items = (1 + + ENABLED(NOZZLE_PARK_FEATURE) + + TERN0(ADVANCED_PAUSE_FEATURE, 1 + ENABLED(HAS_PREHEAT)) + + TERN0(FILAMENT_LOAD_UNLOAD_GCODES, 2) + ); checkkey = ID_Menu; - if (SET_MENU(filamentMenu, MSG_FILAMENT_MAN, 6)) { + if (SET_MENU(filamentMenu, MSG_FILAMENT_MAN, items)) { BACK_ITEM(drawPrepareMenu); #if ENABLED(NOZZLE_PARK_FEATURE) MENU_ITEM(ICON_Park, MSG_FILAMENT_PARK_ENABLED, onDrawMenuItem, parkHead); @@ -3643,13 +3713,17 @@ void drawFilamentManMenu() { #if ENABLED(MESH_BED_LEVELING) void drawManualMeshMenu() { + constexpr uint8_t items = 6 + ENABLED(USE_GRID_MESHVIEWER); checkkey = ID_Menu; - if (SET_MENU(manualMeshMenu, MSG_UBL_MANUAL_MESH, 6)) { + if (SET_MENU(manualMeshMenu, MSG_UBL_MANUAL_MESH, items)) { BACK_ITEM(drawPrepareMenu); MENU_ITEM(ICON_ManualMesh, MSG_LEVEL_BED, onDrawMenuItem, manualMeshStart); mMeshMoveZItem = EDIT_ITEM(ICON_Zoffset, MSG_MOVE_Z, onDrawMMeshMoveZ, setMMeshMoveZ, ¤t_position.z); MENU_ITEM(ICON_Axis, MSG_UBL_CONTINUE_MESH, onDrawMenuItem, manualMeshContinue); MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW, onDrawSubMenu, dwinMeshViewer); + #if USE_GRID_MESHVIEWER + MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW_GRID, onDrawSubMenu, dwinMeshViewerGrid); + #endif MENU_ITEM(ICON_MeshSave, MSG_UBL_SAVE_MESH, onDrawMenuItem, manualMeshSave); } updateMenu(manualMeshMenu); @@ -3681,16 +3755,21 @@ void drawFilamentManMenu() { #define _preheatMenu(N) \ void drawPreheat## N ##Menu() { \ + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN, EEPROM_SETTINGS); \ hmiValue.select = (N) - 1; \ - drawPreheatMenu(SET_MENU(preheatMenu, MSG_PREHEAT_## N ##_SETTINGS, 5)); \ + drawPreheatMenu(SET_MENU(preheatMenu, MSG_PREHEAT_## N ##_SETTINGS, items)); \ } REPEAT_1(PREHEAT_COUNT, _preheatMenu) #endif // HAS_PREHEAT void drawTemperatureMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) + + PREHEAT_COUNT + ); checkkey = ID_Menu; - if (SET_MENU_R(temperatureMenu, selrect({236, 2, 28, 12}), MSG_TEMPERATURE, 4 + PREHEAT_COUNT)) { + if (SET_MENU_R(temperatureMenu, selrect({236, 2, 28, 12}), MSG_TEMPERATURE, items)) { BACK_ITEM(drawControlMenu); #if HAS_HOTEND hotendTargetItem = EDIT_ITEM(ICON_HotendTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawHotendTemp, setHotendTemp, &thermalManager.temp_hotend[0].target); @@ -3710,8 +3789,9 @@ void drawTemperatureMenu() { } void drawMaxSpeedMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(maxSpeedMenu, selrect({1, 16, 28, 13}), MSG_MAX_SPEED, 5)) { + if (SET_MENU_R(maxSpeedMenu, selrect({1, 16, 28, 13}), MSG_MAX_SPEED, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_MaxSpeedX, MSG_VMAX_A, onDrawMaxSpeedX, setMaxSpeedX, &planner.settings.max_feedrate_mm_s[X_AXIS]); @@ -3730,8 +3810,9 @@ void drawMaxSpeedMenu() { } void drawMaxAccelMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(maxAccelMenu, selrect({1, 16, 28, 13}), MSG_AMAX_EN, 5)) { + if (SET_MENU_R(maxAccelMenu, selrect({1, 16, 28, 13}), MSG_AMAX_EN, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_MaxAccX, MSG_AMAX_A, onDrawMaxAccelX, setMaxAccelX, &planner.settings.max_acceleration_mm_per_s2[X_AXIS]); @@ -3752,8 +3833,9 @@ void drawMaxAccelMenu() { #if ENABLED(CLASSIC_JERK) void drawMaxJerkMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(maxJerkMenu, selrect({1, 16, 28, 13}), MSG_JERK, 5)) { + if (SET_MENU_R(maxJerkMenu, selrect({1, 16, 28, 13}), MSG_JERK, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_MaxSpeedJerkX, MSG_VA_JERK, onDrawMaxJerkX, setMaxJerkX, &planner.max_jerk.x); @@ -3776,8 +3858,9 @@ void drawMaxAccelMenu() { #if ENABLED(EDITABLE_STEPS_PER_UNIT) void drawStepsMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(stepsMenu, selrect({1, 16, 28, 13}), MSG_STEPS_PER_MM, 5)) { + if (SET_MENU_R(stepsMenu, selrect({1, 16, 28, 13}), MSG_STEPS_PER_MM, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_StepX, MSG_A_STEPS, onDrawStepsX, setStepsX, &planner.settings.axis_steps_per_mm[X_AXIS]); @@ -3800,8 +3883,9 @@ void drawMaxAccelMenu() { #if ENABLED(EDITABLE_HOMING_FEEDRATE) void drawHomingFRMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS); checkkey = ID_Menu; - if (SET_MENU(homingFRMenu, MSG_HOMING_FEEDRATE, 4)) { + if (SET_MENU(homingFRMenu, MSG_HOMING_FEEDRATE, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS uint16_t xhome = static_cast(homing_feedrate_mm_m.x); @@ -3921,8 +4005,12 @@ void drawMaxAccelMenu() { #endif void drawHotendMPCMenu() { + constexpr uint8_t items = (1 + + ENABLED(MPC_AUTOTUNE_MENU) + + TERN0(MPC_EDIT_MENU, 4 + ENABLED(MPC_INCLUDE_FAN)) + ); checkkey = ID_Menu; - if (SET_MENU_F(hotendMPCMenu, "MPC Settings", 7)) { + if (SET_MENU_F(hotendMPCMenu, "MPC Settings", items)) { MPC_t &mpc = thermalManager.temp_hotend[0].mpc; BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(MPC_AUTOTUNE_MENU) @@ -3991,8 +4079,13 @@ void drawMaxAccelMenu() { #endif void drawHotendPIDMenu() { + constexpr uint8_t items = (1 + + TERN0(PID_AUTOTUNE_MENU, 3) + + TERN0(PID_EDIT_MENU, 3) + + ENABLED(EEPROM_SETTINGS) + ); checkkey = ID_Menu; - if (SET_MENU_F(hotendPIDMenu, STR_HOTEND_PID " Settings", 8)) { + if (SET_MENU_F(hotendPIDMenu, STR_HOTEND_PID " Settings", items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PID_AUTOTUNE_MENU) MENU_ITEM_F(ICON_PIDNozzle, STR_HOTEND_PID, onDrawMenuItem, hotendPID); @@ -4021,8 +4114,13 @@ void drawMaxAccelMenu() { #endif void drawBedPIDMenu() { + constexpr uint8_t items = (1 + + TERN0(PID_AUTOTUNE_MENU, 3) + + TERN0(PID_EDIT_MENU, 3) + + ENABLED(EEPROM_SETTINGS) + ); checkkey = ID_Menu; - if (SET_MENU_F(bedPIDMenu, STR_BED_PID " Settings", 8)) { + if (SET_MENU_F(bedPIDMenu, STR_BED_PID " Settings", items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PID_AUTOTUNE_MENU) MENU_ITEM_F(ICON_PIDBed, STR_BED_PID, onDrawMenuItem,bedPID); @@ -4051,8 +4149,13 @@ void drawMaxAccelMenu() { #endif void drawChamberPIDMenu() { + constexpr uint8_t items = (1 + + TERN0(PID_AUTOTUNE_MENU, 3) + + TERN0(PID_EDIT_MENU, 3) + + ENABLED(EEPROM_SETTINGS) + ); checkkey = ID_Menu; - if (SET_MENU_F(chamberPIDMenu, STR_CHAMBER_PID " Settings", 8)) { + if (SET_MENU_F(chamberPIDMenu, STR_CHAMBER_PID " Settings", items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PID_AUTOTUNE_MENU) MENU_ITEM_F(ICON_PIDChamber, STR_CHAMBER_PID, onDrawMenuItem,chamberPID); @@ -4096,8 +4199,9 @@ void drawMaxAccelMenu() { #if ENABLED(INDIVIDUAL_AXIS_HOMING_SUBMENU) void drawHomingMenu() { + constexpr uint8_t items = 2 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, Z_STEPPER_AUTO_ALIGN, MESH_BED_LEVELING); checkkey = ID_Menu; - if (SET_MENU(homingMenu, MSG_HOMING, 6)) { + if (SET_MENU(homingMenu, MSG_HOMING, items)) { BACK_ITEM(drawPrepareMenu); MENU_ITEM(ICON_Homing, MSG_AUTO_HOME, onDrawMenuItem, autoHome); #if HAS_X_AXIS @@ -4212,8 +4316,17 @@ void drawMaxAccelMenu() { #if HAS_MESH void drawMeshSetMenu() { + constexpr uint8_t items = (1 + + ENABLED(PREHEAT_BEFORE_LEVELING) + + 2 + + ENABLED(HAS_BED_PROBE) + + TERN0(AUTO_BED_LEVELING_UBL, 6) + + TERN0(PROUI_MESH_EDIT, 2) + + 1 + + ENABLED(USE_GRID_MESHVIEWER) + ); checkkey = ID_Menu; - if (SET_MENU(meshMenu, MSG_MESH_LEVELING, 14)) { + if (SET_MENU(meshMenu, MSG_MESH_LEVELING, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PREHEAT_BEFORE_LEVELING) EDIT_ITEM(ICON_Temperature, MSG_UBL_SET_TEMP_BED, onDrawPIntMenu, setBedLevT, &hmiData.bedLevT); @@ -4236,6 +4349,9 @@ void drawMaxAccelMenu() { MENU_ITEM(ICON_MeshEdit, MSG_EDIT_MESH, onDrawSubMenu, drawEditMeshMenu); #endif MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW, onDrawSubMenu, dwinMeshViewer); + #if USE_GRID_MESHVIEWER + MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW_GRID, onDrawSubMenu, dwinMeshViewerGrid); + #endif } updateMenu(meshMenu); } diff --git a/Marlin/src/lcd/e3v2/proui/dwin_defines.h b/Marlin/src/lcd/e3v2/proui/dwin_defines.h index b72bdf1d23..832702db8f 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_defines.h +++ b/Marlin/src/lcd/e3v2/proui/dwin_defines.h @@ -35,6 +35,10 @@ //#define DACAI_DISPLAY // Enable for DACAI display //#define TITLE_CENTERED // Center Menu Title Text +#if HAS_MESH + #define USE_GRID_MESHVIEWER 1 +#endif + #if HAS_MESH #define PROUI_MESH_EDIT // Add a menu to edit mesh points #if ENABLED(PROUI_MESH_EDIT) diff --git a/Marlin/src/lcd/e3v2/proui/menus.cpp b/Marlin/src/lcd/e3v2/proui/menus.cpp index 7edf32169d..0451944645 100644 --- a/Marlin/src/lcd/e3v2/proui/menus.cpp +++ b/Marlin/src/lcd/e3v2/proui/menus.cpp @@ -100,7 +100,7 @@ void toggleCheckboxLine(bool &checked) { } void drawMenuIntValue(uint16_t bcolor, const uint8_t line, uint8_t iNum, const int32_t value/*=0*/) { - DWINUI::drawSignedInt(hmiData.colorText, bcolor, iNum , VALX, MBASE(line) - 1, value); + DWINUI::drawSignedInt(hmiData.colorText, bcolor, iNum, VALX, MBASE(line) - 1, value); } void onDrawMenuItem(MenuItem* menuitem, int8_t line) { @@ -163,7 +163,7 @@ void DrawItemEdit(const bool selected) { switch (checkkey) { case ID_SetIntNoDraw: if (menuData.liveUpdate) menuData.liveUpdate(); break; case ID_SetInt: - case ID_SetPInt: DWINUI::drawSignedInt(hmiData.colorText, bcolor, iNum , VALX, MBASE(currentMenu->line()) - 1, menuData.value); break; + case ID_SetPInt: DWINUI::drawSignedInt(hmiData.colorText, bcolor, iNum, VALX, MBASE(currentMenu->line()) - 1, menuData.value); break; case ID_SetFloat: case ID_SetPFloat: DWINUI::drawSignedFloat(hmiData.colorText, bcolor, iNum, menuData.dp, VALX - 2 * DWINUI::fontWidth(), MBASE(currentMenu->line()), menuData.value / POW(10, menuData.dp)); break; default: break; diff --git a/Marlin/src/lcd/e3v2/proui/meshviewer.cpp b/Marlin/src/lcd/e3v2/proui/meshviewer.cpp index 38d0af4f82..e167af5665 100644 --- a/Marlin/src/lcd/e3v2/proui/meshviewer.cpp +++ b/Marlin/src/lcd/e3v2/proui/meshviewer.cpp @@ -39,7 +39,7 @@ #include "../../../feature/bedlevel/bedlevel.h" #include "meshviewer.h" -#if ENABLED(USE_GRID_MESHVIEWER) +#if USE_GRID_MESHVIEWER #include "bedlevel_tools.h" #endif @@ -112,14 +112,20 @@ void MeshViewer::drawMesh(const bed_mesh_t zval, const uint8_t csizex, const uin void MeshViewer::draw(const bool withsave/*=false*/, const bool redraw/*=true*/) { title.showCaption(GET_TEXT_F(MSG_MESH_VIEWER)); - #if ENABLED(USE_GRID_MESHVIEWER) - DWINUI::clearMainArea(); - bedLevelTools.viewer_print_value = true; - bedLevelTools.drawBedMesh(-1, 1, 8, 10 + TITLE_HEIGHT); - #else + + const bool see_mesh = TERN0(USE_GRID_MESHVIEWER, bedLevelTools.grid_meshview); + if (see_mesh) { + #if USE_GRID_MESHVIEWER + DWINUI::clearMainArea(); + bedLevelTools.viewer_print_value = true; + bedLevelTools.drawBedMesh(-1, 1, 8, 10 + TITLE_HEIGHT); + #endif + } + else { if (redraw) drawMesh(bedlevel.z_values, GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y); else DWINUI::drawBox(1, hmiData.colorBackground, { 89, 305, 99, 38 }); - #endif + } + if (withsave) { DWINUI::drawButton(BTN_Save, 26, 305); DWINUI::drawButton(BTN_Continue, 146, 305); @@ -128,12 +134,11 @@ void MeshViewer::draw(const bool withsave/*=false*/, const bool redraw/*=true*/) else DWINUI::drawButton(BTN_Continue, 86, 305); - #if ENABLED(USE_GRID_MESHVIEWER) - bedLevelTools.setMeshViewerStatus(); - #else - char str_1[6], str_2[6] = ""; - ui.status_printf(0, F("Mesh minZ: %s, maxZ: %s"), dtostrf(min, 1, 2, str_1), dtostrf(max, 1, 2, str_2)); - #endif + if (see_mesh) { + TERN_(USE_GRID_MESHVIEWER, bedLevelTools.setMeshViewerStatus()); + } + else // TODO: in marlinui.h set_status_and_level was defined to (..., const int8_t level=0); remove ", 0" when pulling other PR + ui.set_status_and_level(MString<30>(F("Mesh Z min: "), p_float_t(min, 2), F(", max: "), p_float_t(max, 2)), 0); } void drawMeshViewer() { meshViewer.draw(true, meshredraw); } diff --git a/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp index 9e38face6f..e6e8c88155 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp @@ -130,7 +130,7 @@ void ChironTFT::idleLoop() { void ChironTFT::printerKilled(FSTR_P const error, FSTR_P const component) { tftSendLn(AC_msg_kill_lcd); #if ACDEBUG(AC_MARLIN) - DEBUG_ECHOLNPGM("printerKilled()\nerror: ", error , "\ncomponent: ", component); + DEBUG_ECHOLNPGM("printerKilled()\nerror: ", error, "\ncomponent: ", component); #endif } @@ -875,7 +875,7 @@ void ChironTFT::panelProcess(uint8_t req) { const float currval = getMeshPoint(pos); setMeshPoint(pos, constrain(currval + Zshift, AC_LOWEST_MESHPOINT_VAL, 2)); #if ACDEBUG(AC_INFO) - DEBUG_ECHOLNPGM("Change mesh point X", x," Y",y ," from ", currval, " to ", getMeshPoint(pos) ); + DEBUG_ECHOLNPGM("Change mesh point X", x," Y", y," from ", currval, " to ", getMeshPoint(pos) ); #endif } const float currZOffset = getZOffset_mm(); diff --git a/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp b/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp index d23b10898e..696cfad684 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp +++ b/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp @@ -64,7 +64,7 @@ namespace Anycubic { DgusTFT::page25, DgusTFT::page26, DgusTFT::page27, DgusTFT::page28, DgusTFT::page29, DgusTFT::page30, DgusTFT::page31, DgusTFT::page32 #if HAS_LEVELING - , DgusTFT::page33 , DgusTFT::page34 + , DgusTFT::page33, DgusTFT::page34 #endif }; @@ -1108,7 +1108,7 @@ namespace Anycubic { */ } else if (0x82 == data_buf[0]) { - // send_cmd_to_pc(cmd ,start ); + // send_cmd_to_pc(cmd, start ); } } } diff --git a/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp index 074dad96c2..94ea71817e 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp @@ -46,7 +46,7 @@ DGUSDisplay dgus; -#ifdef DEBUG_DGUS_COMM +#if ENABLED(DEBUG_DGUS_COMM) #define DEBUGLCDCOMM_ECHOPGM DEBUG_ECHOPGM #else #define DEBUGLCDCOMM_ECHOPGM(...) NOOP @@ -76,7 +76,22 @@ void DGUSDisplay::initDisplay() { requestScreen(TERN(SHOW_BOOTSCREEN, DGUS_SCREEN_BOOT, DGUS_SCREEN_MAIN)); } -void DGUSDisplay::writeVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr) { +void DGUSDisplay::writeVariable_P(uint16_t adr, const void *values, uint8_t valueslen, bool isstr/*=false*/) { + const char* myvalues = static_cast(values); + bool strend = !myvalues; + writeHeader(adr, DGUS_CMD_WRITEVAR, valueslen); + while (valueslen--) { + char x; + if (!strend) x = pgm_read_byte(myvalues++); + if ((isstr && !x) || strend) { + strend = true; + x = ' '; + } + LCD_SERIAL.write(x); + } +} + +void DGUSDisplay::writeVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr/*=false*/) { const char* myvalues = static_cast(values); bool strend = !myvalues; writeHeader(adr, DGUS_CMD_WRITEVAR, valueslen); @@ -120,21 +135,6 @@ void DGUSDisplay::writeVariable(uint16_t adr, long value) { writeVariable(adr, static_cast(&tmp), sizeof(long)); } -void DGUSDisplay::writeVariablePGM(uint16_t adr, const void *values, uint8_t valueslen, bool isstr) { - const char* myvalues = static_cast(values); - bool strend = !myvalues; - writeHeader(adr, DGUS_CMD_WRITEVAR, valueslen); - while (valueslen--) { - char x; - if (!strend) x = pgm_read_byte(myvalues++); - if ((isstr && !x) || strend) { - strend = true; - x = ' '; - } - LCD_SERIAL.write(x); - } -} - void DGUSDisplay::processRx() { #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) diff --git a/Marlin/src/lcd/extui/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/dgus/DGUSDisplay.h index 816360d3f3..e54b916ec6 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/dgus/DGUSDisplay.h @@ -60,15 +60,32 @@ public: static void initDisplay(); // Variable access. + static void writeVariable_P(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); static void writeVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); - static void writeVariablePGM(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); static void writeVariable(uint16_t adr, int16_t value); static void writeVariable(uint16_t adr, uint16_t value); static void writeVariable(uint16_t adr, uint8_t value); static void writeVariable(uint16_t adr, int8_t value); static void writeVariable(uint16_t adr, long value); - // Utility functions for bridging ui_api and dbus + // Western PROGMEM string constant + static void writeStringVar_P(uint16_t adr, PGM_P const pstr, uint8_t vallen=32) { + writeVariable_P(adr, (const void *)pstr, vallen, true); + } + // Western F-string constant + static void writeVariable(uint16_t adr, FSTR_P const fstr, uint8_t vallen=32) { + writeStringVar_P(adr, FTOP(fstr), vallen); + } + // Western string constant + static void writeStringVar(uint16_t adr, const char * const cstr, uint8_t vallen=32) { + writeVariable(adr, (const void *)cstr, vallen, true); + } + // Chinese string constant + static void writeStringVar(uint16_t adr, const uint16_t * const zhstr, uint8_t vallen=16) { + writeVariable(adr, (const void *)zhstr, vallen, true); + } + + // Utility functions for bridging ui_api and dgus template static void setVariable(DGUS_VP_Variable &var) { writeVariable(var.VP, (WireType)Getter(selector)); diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp index 00876f10e1..79353a4e23 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp @@ -101,7 +101,7 @@ void DGUSScreenHandler::setStatusMessage(const char *msg) { } } -void DGUSScreenHandler::setstatusmessagePGM(PGM_P const msg) { +void DGUSScreenHandler::setStatusMessage_P(PGM_P const msg) { DGUS_VP_Variable ramcopy; if (populate_VPVar(VP_M117, &ramcopy)) { ramcopy.memadr = (void*) msg; @@ -164,10 +164,11 @@ void DGUSScreenHandler::sendStringToDisplay(DGUS_VP_Variable &var) { // overwrite the remainings with spaces.// var.size has the display buffer size! void DGUSScreenHandler::sendStringToDisplayPGM(DGUS_VP_Variable &var) { char *tmp = (char*) var.memadr; - dgus.writeVariablePGM(var.VP, tmp, var.size, true); + dgus.writeVariable_P(var.VP, tmp, var.size, true); } #if HAS_PID_HEATING + void DGUSScreenHandler::sendTemperaturePID(DGUS_VP_Variable &var) { float value = *(float *)var.memadr; value /= 10; @@ -200,7 +201,8 @@ void DGUSScreenHandler::sendStringToDisplayPGM(DGUS_VP_Variable &var) { tmp[1] = endian.lb[0]; dgus.writeVariable(var.VP, tmp, 2); } -#endif + +#endif // HAS_PID_HEATING #if ENABLED(PRINTCOUNTER) @@ -221,7 +223,7 @@ void DGUSScreenHandler::sendStringToDisplayPGM(DGUS_VP_Variable &var) { dgus.writeVariable(VP_PrintsTotal, buf, var.size, true); } -#endif +#endif // PRINTCOUNTER // Send fan status value to the display. #if HAS_FAN @@ -249,8 +251,7 @@ void DGUSScreenHandler::sendHeaterStatusToDisplay(DGUS_VP_Variable &var) { void DGUSScreenHandler::sendWaitingStatusToDisplay(DGUS_VP_Variable &var) { // In FYSETC UI design there are 10 statuses to loop - static uint16_t period = 0; - static uint16_t index = 0; + static uint16_t period = 0, index = 0; if (period++ > DGUS_UI_WAITING_STATUS_PERIOD) { dgus.writeVariable(var.VP, index); if (++index >= DGUS_UI_WAITING_STATUS) index = 0; @@ -270,9 +271,9 @@ void DGUSScreenHandler::sendHeaterStatusToDisplay(DGUS_VP_Variable &var) { return; } - // if we are printing, we jump to two screens after the requested one. - // This should host e.g a print pause / print abort / print resume dialog. - // This concept allows to recycle this hook for other file + // If we are printing we jump to two screens after the requested one. + // This should host, e.g., a print pause / print abort / print resume dialog. + // This concept allows to recycle this hook for other files. if (ExtUI::isPrintingFromMedia() && !card.flag.abort_sd_printing) { gotoScreen(DGUS_SCREEN_SDPRINTMANIPULATION); return; @@ -324,7 +325,11 @@ void DGUSScreenHandler::sendHeaterStatusToDisplay(DGUS_VP_Variable &var) { void DGUSScreenHandler::sdCardError() { DGUSScreenHandler::sdCardRemoved(); - sendInfoScreen(F("NOTICE"), nullptr, F("SD card error"), nullptr, true, true, true, true); + #if DGUS_LCD_UI_MKS + screen.sendInfoScreenMKS(F("NOTICE"), nullptr, F("SD card error"), nullptr, mks_language_index); + #else + sendInfoScreen(F("NOTICE"), nullptr, F("SD card error"), nullptr); + #endif setupConfirmAction(nullptr); gotoScreen(DGUS_SCREEN_POPUP); } @@ -432,9 +437,9 @@ void DGUSScreenHandler::handleManualExtrude(DGUS_VP_Variable &var, void *val_ptr switch (var.VP) { #if HAS_HOTEND case VP_MOVE_E0: target_extruder = ExtUI::extruder_t::E0; break; - #if HAS_MULTI_EXTRUDER - case VP_MOVE_E1: target_extruder = ExtUI::extruder_t::E1; break; - #endif + #endif + #if HAS_MULTI_EXTRUDER + case VP_MOVE_E1: target_extruder = ExtUI::extruder_t::E1; break; #endif default: return; } @@ -491,12 +496,12 @@ void DGUSScreenHandler::handleSettings(DGUS_VP_Variable &var, void *val_ptr) { ExtUI::extruder_t extruder; switch (var.VP) { default: return; - #if HAS_EXTRUDERS - case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; - #if HAS_MULTI_EXTRUDER - case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; - #endif - #endif + #if HAS_EXTRUDERS + case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HAS_MULTI_EXTRUDER + case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + #endif } ExtUI::setAxisSteps_per_mm(value, extruder); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel @@ -506,21 +511,17 @@ void DGUSScreenHandler::handleSettings(DGUS_VP_Variable &var, void *val_ptr) { #if HAS_PID_HEATING void DGUSScreenHandler::handlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr) { - char buf[32] = {0}; - switch (var.VP) { default: break; #if ENABLED(PIDTEMP) #if HAS_HOTEND case VP_PID_AUTOTUNE_E0: // Autotune Extruder 0 - sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E0); - queue.enqueue_one_now(buf); + queue.enqueue_one_now(F("M303 E0 C5 S210 U1")); break; #endif #if HAS_MULTI_HOTEND case VP_PID_AUTOTUNE_E1: - sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E1); - queue.enqueue_one_now(buf); + queue.enqueue_one_now(F("M303 E1 C5 S210 U1")); break; #endif #endif @@ -536,6 +537,7 @@ void DGUSScreenHandler::handleSettings(DGUS_VP_Variable &var, void *val_ptr) { gotoScreen(DGUS_SCREEN_WAITING); #endif } + #endif // HAS_PID_HEATING #if HAS_BED_PROBE @@ -607,7 +609,7 @@ void DGUSScreenHandler::handleHeaterControl(DGUS_VP_Variable &var, void *val_ptr uint16_t value = BE16_P(val_ptr); if (value) { queue.inject(F("M1000")); - dgus.writeVariable(VP_SD_Print_Filename, filelist.filename(), 32, true); + dgus.writeStringVar(VP_SD_Print_Filename, filelist.filename()); gotoScreen(PLR_SCREEN_RECOVER); } else { diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h index cb403dbdad..d8d66b764c 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h @@ -32,10 +32,10 @@ #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) typedef struct { - ExtUI::extruder_t extruder; // which extruder to operate - uint8_t action; // load or unload - bool heated; // heating done ? - float purge_length; // the length to extrude before unload, prevent filament jam + uint8_t extruder; // Which extruder index to operate + uint8_t action; // Load or unload + bool heated; // Heating done? + float purge_length; // The length to extrude before unload, prevent filament jam } filament_data_t; extern filament_data_t filament_data; diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h b/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h index 8ee0fa68c8..ceaeb7cd7f 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h @@ -37,21 +37,21 @@ public: // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifying whether the strings are in RAM or FLASH. - static void sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash) { - sendInfoScreen_P(FTOP(line1), FTOP(line2), line3, line4, l1inflash, l2inflash, l3inflash, liinflash); + static void sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash); + static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { + sendInfoScreen_P(FTOP(line1), FTOP(line2), line3, line4, l1inflash, l2inflash, l3inflash, l4inflash); } - static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, FSTR_P const line3, FSTR_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash) { - sendInfoScreen_P(FTOP(line1), FTOP(line2), FTOP(line3), FTOP(line4), l1inflash, l2inflash, l3inflash, liinflash); + static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, FSTR_P const line3, FSTR_P const line4) { + sendInfoScreen_P(FTOP(line1), FTOP(line2), FTOP(line3), FTOP(line4), true, true, true, true); } - static void handleUserConfirmationPopUp(uint16_t confirmVP, PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void handleUserConfirmationPopUp(uint16_t confirmVP, PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash); // "M117" Message -- msg is a RAM ptr. static void setStatusMessage(const char *msg); // The same for messages from Flash - static void setstatusmessagePGM(PGM_P const msg); - static void setStatusMessage(FSTR_P const fmsg) { setstatusmessagePGM(FTOP(fmsg)); } + static void setStatusMessage_P(PGM_P const msg); + static void setStatusMessage(FSTR_P const fmsg) { setStatusMessage_P(FTOP(fmsg)); } // Callback for VP "Display wants to change screen on idle printer" static void screenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); // Callback for VP "Screen has been changed" diff --git a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp index adc78caf07..3706ca449c 100644 --- a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp +++ b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp @@ -43,7 +43,12 @@ namespace ExtUI { void onIdle() { screen.loop(); } void onPrinterKilled(FSTR_P const error, FSTR_P const) { - screen.sendInfoScreen(GET_TEXT_F(MSG_HALTED), error, FPSTR(NUL_STR), GET_TEXT_F(MSG_PLEASE_RESET), true, true, true, true); + #if DGUS_LCD_UI_MKS + screen.sendInfoScreenMKS(GET_TEXT_F(MSG_HALTED), error, nullptr, GET_TEXT_F(MSG_PLEASE_RESET), mks_language_index); + #else + screen.sendInfoScreen(GET_TEXT_F(MSG_HALTED), error, FPSTR(NUL_STR), GET_TEXT_F(MSG_PLEASE_RESET)); + #endif + screen.gotoScreen(DGUS_SCREEN_KILL); while (!screen.loop()); // Wait while anything is left to be sent } @@ -64,7 +69,11 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { if (msg) { - screen.sendInfoScreen(F("Please confirm."), nullptr, msg, nullptr, true, true, false, true); + #if DGUS_LCD_UI_MKS + screen.sendInfoScreenMKS(F("Please confirm."), nullptr, msg, nullptr, mks_language_index); + #else + screen.sendInfoScreen(F("Please confirm."), nullptr, msg, nullptr, true, false, false, false); + #endif screen.setupConfirmAction(setUserConfirmed); screen.gotoScreen(DGUS_SCREEN_POPUP); } @@ -75,13 +84,11 @@ namespace ExtUI { } // For fancy LCDs include an icon ID, message, and translated button title - void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + void onUserConfirmRequired(const int, const char * const cstr, FSTR_P const) { onUserConfirmRequired(cstr); - UNUSED(icon); UNUSED(fBtn); } - void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + void onUserConfirmRequired(const int, FSTR_P const fstr, FSTR_P const) { onUserConfirmRequired(fstr); - UNUSED(icon); UNUSED(fBtn); } #if ENABLED(ADVANCED_PAUSE_FEATURE) diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp index 575e56103e..9ec98779c8 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp @@ -311,7 +311,7 @@ const struct VPMapping VPMap[] PROGMEM = { { DGUS_SCREEN_PID_E, VPList_PIDE0 }, { DGUS_SCREEN_PID_BED, VPList_PIDBED }, { DGUS_SCREEN_INFOS, VPList_Infos }, - { 0 , nullptr } // List is terminated with an nullptr as table entry. + { 0, nullptr } // List is terminated with an nullptr as table entry. }; const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; @@ -340,7 +340,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_MOVE_Z, nullptr, screen.handleManualMove, nullptr), VPHELPER(VP_HOME_ALL, nullptr, screen.handleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOCK, nullptr, screen.handleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, screen.handlePowerLossRecovery, nullptr), #endif @@ -361,7 +361,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_HOTEND VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, screen.sendFloatAsLongValueToDisplay<2>), VPHELPER(VP_MOVE_E0, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, screen.handleHeaterControl, nullptr), @@ -382,7 +382,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_MULTI_HOTEND VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), // ERROR: Flow is per-extruder, not per-hotend + VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), // ERROR: Flow is per-extruder, not per-hotend VPHELPER(VP_MOVE_E1, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, screen.handleHeaterControl, nullptr), VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, screen.sendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h index d8dc81b566..1ba2a25ea3 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h @@ -116,18 +116,18 @@ constexpr uint16_t VP_MOVE_E1 = 0x2112; //constexpr uint16_t VP_MOVE_E4 = 0x2118; //constexpr uint16_t VP_MOVE_E5 = 0x211A; constexpr uint16_t VP_HOME_ALL = 0x2120; -constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; +constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2130; // Power loss recovery constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; -// Fan Control Buttons , switch between "off" and "on" +// Fan Control Buttons, switch between "off" and "on" constexpr uint16_t VP_FAN0_CONTROL = 0x2200; constexpr uint16_t VP_FAN1_CONTROL = 0x2202; constexpr uint16_t VP_FAN2_CONTROL = 0x2204; constexpr uint16_t VP_FAN3_CONTROL = 0x2206; -// Heater Control Buttons , triged between "cool down" and "heat PLA" state +// Heater Control Buttons, triged between "cool down" and "heat PLA" state constexpr uint16_t VP_E0_CONTROL = 0x2210; constexpr uint16_t VP_E1_CONTROL = 0x2212; //constexpr uint16_t VP_E2_CONTROL = 0x2214; @@ -148,7 +148,7 @@ constexpr uint16_t VP_E1_BED_PREHEAT = 0x2222; constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2302; -// Settings store , reset +// Settings store, reset constexpr uint16_t VP_SETTINGS = 0x2400; // PID autotune @@ -258,7 +258,7 @@ constexpr uint16_t VP_BED_STATUS = 0x331C; constexpr uint16_t VP_MOVE_OPTION = 0x3400; // Step per mm -constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment, uint16_t, 0~1638.4 //constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; //constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; @@ -272,10 +272,10 @@ constexpr uint16_t VP_E1_STEP_PER_MM = 0x3612; //constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; // PIDs -constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_E0_PID_I = 0x3702; constexpr uint16_t VP_E0_PID_D = 0x3704; -constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_E1_PID_I = 0x3708; constexpr uint16_t VP_E1_PID_D = 0x370A; constexpr uint16_t VP_BED_PID_P = 0x3710; diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp index 8c26066b28..be0e60a8df 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp @@ -141,7 +141,7 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { updateNewScreen(target); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } @@ -288,7 +288,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif break; case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + #ifdef PREHEAT_2_TEMP_HOTEND + e_temp = PREHEAT_2_TEMP_HOTEND; + #endif break; case 2: // Load PET #ifdef PREHEAT_3_TEMP_HOTEND @@ -308,9 +310,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (filament_data.action == 0) { // Go back to utility screen #if HAS_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + thermalManager.setTargetHotend(e_temp, 0); #if HAS_MULTI_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + thermalManager.setTargetHotend(e_temp, 1); #endif #endif gotoScreen(DGUS_SCREEN_UTILITY); @@ -320,13 +322,13 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { default: return; #if HAS_HOTEND case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; + filament_data.extruder = 0; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif #if HAS_MULTI_HOTEND case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; + filament_data.extruder = 1; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif @@ -348,7 +350,7 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { //gotoScreen(DGUS_SCREEN_FILAMENT_LOADING); filament_data.heated = true; } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; } else { // unload filament if (!filament_data.heated) { @@ -357,14 +359,14 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } // Before unloading extrude to prevent jamming if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; filament_data.purge_length -= movevalue; } else { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) - movevalue; } } - ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0); } } #endif // DGUS_FILAMENT_LOADUNLOAD diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp index 338f6a319c..db0ebbc903 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp @@ -308,7 +308,7 @@ const struct VPMapping VPMap[] PROGMEM = { { DGUS_SCREEN_PID_E, VPList_PIDE0 }, { DGUS_SCREEN_PID_BED, VPList_PIDBED }, { DGUS_SCREEN_INFOS, VPList_Infos }, - { 0 , nullptr } // List is terminated with an nullptr as table entry. + { 0, nullptr } // List is terminated with an nullptr as table entry. }; const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; @@ -338,7 +338,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_MOVE_Z, nullptr, screen.handleManualMove, nullptr), VPHELPER(VP_HOME_ALL, nullptr, screen.handleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOCK, nullptr, screen.handleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, screen.handlePowerLossRecovery, nullptr), #endif @@ -358,7 +358,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_HOTEND VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, screen.sendFloatAsLongValueToDisplay<2>), VPHELPER(VP_MOVE_E0, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, screen.handleHeaterControl, nullptr), @@ -379,7 +379,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_MULTI_HOTEND VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, nullptr, screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, screen.handleHeaterControl, nullptr), VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, screen.sendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h index 3019b6651e..f7a716f4d5 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h @@ -116,18 +116,18 @@ constexpr uint16_t VP_MOVE_E1 = 0x2112; //constexpr uint16_t VP_MOVE_E4 = 0x2118; //constexpr uint16_t VP_MOVE_E5 = 0x211A; constexpr uint16_t VP_HOME_ALL = 0x2120; -constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; +constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2130; // Power loss recovery constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; -// Fan Control Buttons , switch between "off" and "on" +// Fan Control Buttons, switch between "off" and "on" constexpr uint16_t VP_FAN0_CONTROL = 0x2200; constexpr uint16_t VP_FAN1_CONTROL = 0x2202; //constexpr uint16_t VP_FAN2_CONTROL = 0x2204; //constexpr uint16_t VP_FAN3_CONTROL = 0x2206; -// Heater Control Buttons , triged between "cool down" and "heat PLA" state +// Heater Control Buttons, triged between "cool down" and "heat PLA" state constexpr uint16_t VP_E0_CONTROL = 0x2210; constexpr uint16_t VP_E1_CONTROL = 0x2212; //constexpr uint16_t VP_E2_CONTROL = 0x2214; @@ -147,7 +147,7 @@ constexpr uint16_t VP_E0_BED_PREHEAT = 0x2220; // Filament load and unload constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; -// Settings store , reset +// Settings store, reset constexpr uint16_t VP_SETTINGS = 0x2400; // PID autotune @@ -257,7 +257,7 @@ constexpr uint16_t VP_BED_STATUS = 0x331C; constexpr uint16_t VP_MOVE_OPTION = 0x3400; // Step per mm -constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment, uint16_t, 0~1638.4 //constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; //constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; @@ -271,7 +271,7 @@ constexpr uint16_t VP_E0_STEP_PER_MM = 0x3610; //constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; // PIDs -constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_E0_PID_I = 0x3702; constexpr uint16_t VP_E0_PID_D = 0x3704; constexpr uint16_t VP_BED_PID_P = 0x3710; diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp index f817453f1b..297c71f8a9 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp @@ -143,7 +143,7 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { updateNewScreen(target); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } @@ -290,7 +290,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif break; case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + #ifdef PREHEAT_2_TEMP_HOTEND + e_temp = PREHEAT_2_TEMP_HOTEND; + #endif break; case 2: // Load PET #ifdef PREHEAT_3_TEMP_HOTEND @@ -310,9 +312,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (filament_data.action == 0) { // Go back to utility screen #if HAS_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + thermalManager.setTargetHotend(e_temp, 0); #if HAS_MULTI_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + thermalManager.setTargetHotend(e_temp, 1); #endif #endif gotoScreen(DGUS_SCREEN_UTILITY); @@ -322,13 +324,13 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { default: return; #if HAS_HOTEND case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; + filament_data.extruder = 0; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif #if HAS_MULTI_HOTEND case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; + filament_data.extruder = 1; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif @@ -350,7 +352,7 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { //gotoScreen(DGUS_SCREEN_FILAMENT_LOADING); filament_data.heated = true; } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; } else { // unload filament if (!filament_data.heated) { @@ -359,11 +361,11 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } // Before unloading extrude to prevent jamming if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; filament_data.purge_length -= movevalue; } else { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) - movevalue; } } ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp index 4182c3f2ca..b108dab0a0 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp @@ -103,7 +103,7 @@ void MKS_resume_print_move() { float z_offset_add = 0; -xyz_int_t tmc_step; // = { 0, 0, 0 } +xyz_int_t tmc_stall_sens; // = { 0, 0, 0 } uint16_t lcd_default_light = 50; @@ -117,7 +117,10 @@ const uint16_t VPList_Boot[] PROGMEM = { }; #define MKSLIST_E_ITEM(N) VP_T_E##N##_Is, VP_T_E##N##_Set, +#define INFO_BAR REPEAT(EXTRUDERS, MKSLIST_E_ITEM) VP_T_Bed_Is, VP_T_Bed_Set, VP_Fan0_Percentage, +// Not defined in firmware 1.30 or 1.31 +/* const uint16_t VPList_Main[] PROGMEM = { // VP_M117, for completeness, but it cannot be auto-uploaded. #if HAS_HOTEND @@ -140,53 +143,31 @@ const uint16_t VPList_Main[] PROGMEM = { #endif 0x0000 }; +*/ const uint16_t MKSList_Home[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, - // Language - // VP_HOME_Dis, + INFO_BAR 0x0000 }; const uint16_t MKSList_Setting[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, - // Language - VP_Setting_Dis, + INFO_BAR + 0x0000 }; const uint16_t MKSList_Tool[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, - // Language - VP_Tool_Dis, - // LCD BLK + INFO_BAR + + // LCD BackLight VP_LCD_BLK, + 0x0000 }; -const uint16_t MKSList_EXTRUE[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, +const uint16_t MKSList_EXTRUDE[] PROGMEM = { + INFO_BAR VP_Filament_distance, VP_Filament_speed, @@ -195,34 +176,19 @@ const uint16_t MKSList_EXTRUE[] PROGMEM = { }; const uint16_t MKSList_LEVEL[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR 0x0000 }; const uint16_t MKSList_MOVE[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR 0x0000 }; const uint16_t MKSList_Print[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR // Print Percent VP_PrintProgress_Percentage, @@ -254,26 +220,15 @@ const uint16_t MKSList_SD_File[] PROGMEM = { }; const uint16_t MKSList_TempOnly[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, - // LCD BLK - VP_LCD_BLK, + INFO_BAR + 0x0000 }; -const uint16_t MKSList_Pluse[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, +const uint16_t MKSList_Steps_mm[] PROGMEM = { + INFO_BAR - // Pluse + // Steps/mm VP_X_STEP_PER_MM, VP_Y_STEP_PER_MM, VP_Z_STEP_PER_MM, @@ -284,14 +239,9 @@ const uint16_t MKSList_Pluse[] PROGMEM = { }; const uint16_t MKSList_MaxSpeed[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR - // Pluse + // Max Speed VP_X_MAX_SPEED, VP_Y_MAX_SPEED, VP_Z_MAX_SPEED, @@ -302,31 +252,20 @@ const uint16_t MKSList_MaxSpeed[] PROGMEM = { }; const uint16_t MKSList_MaxAcc[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR - // ACC - VP_ACC_SPEED, - VP_X_ACC_MAX_SPEED, - VP_Y_ACC_MAX_SPEED, - VP_Z_ACC_MAX_SPEED, - VP_E0_ACC_MAX_SPEED, - VP_E1_ACC_MAX_SPEED, + // Acceleration + VP_X_MAX_ACC, + VP_Y_MAX_ACC, + VP_Z_MAX_ACC, + VP_E0_MAX_ACC, + VP_E1_MAX_ACC, 0x0000 }; const uint16_t MKSList_PID[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR // PID VP_E0_PID_P, @@ -337,12 +276,7 @@ const uint16_t MKSList_PID[] PROGMEM = { }; const uint16_t MKSList_Level_Point[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - // FAN - VP_Fan0_Percentage, + INFO_BAR // Level Point VP_Level_Point_One_X, @@ -372,10 +306,7 @@ const uint16_t MKSList_Level_PrintConfig[] PROGMEM = { }; const uint16_t MKSList_PrintPauseConfig[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, + INFO_BAR VP_X_PARK_POS, VP_Y_PARK_POS, @@ -384,11 +315,8 @@ const uint16_t MKSList_PrintPauseConfig[] PROGMEM = { 0x0000 }; -const uint16_t MKSList_MotoConfig[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, +const uint16_t MKSList_MotionConfig[] PROGMEM = { + INFO_BAR VP_TRAVEL_SPEED, VP_FEEDRATE_MIN_SPEED, @@ -398,24 +326,18 @@ const uint16_t MKSList_MotoConfig[] PROGMEM = { }; const uint16_t MKSList_EX_Config[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - VP_MIN_EX_T,VP_Min_EX_T_E, + INFO_BAR + VP_MIN_EX_T, VP_Min_EX_T_E, + 0x0000 }; const uint16_t MKSTMC_Config[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) - // HB Temp - VP_T_Bed_Is, VP_T_Bed_Set, - VP_MIN_EX_T, + INFO_BAR - VP_TMC_X_STEP, - VP_TMC_Y_STEP, - VP_TMC_Z_STEP, + VP_TMC_X_SENS, + VP_TMC_Y_SENS, + VP_TMC_Z_SENS, VP_TMC_X1_Current, VP_TMC_Y1_Current, VP_TMC_X_Current, @@ -431,20 +353,23 @@ const uint16_t MKSTMC_Config[] PROGMEM = { const uint16_t MKSAuto_Level[] PROGMEM = { VP_MESH_LEVEL_POINT_DIS, VP_ZPos, + 0x0000 }; const uint16_t MKSOffset_Config[] PROGMEM = { - // E Temp - REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + INFO_BAR + VP_OFFSET_X, VP_OFFSET_Y, VP_OFFSET_Z, + 0x0000 }; const uint16_t MKSBabyStep[] PROGMEM = { VP_ZOffset_DE_DIS, + 0x0000 }; @@ -463,23 +388,23 @@ const struct VPMapping VPMap[] PROGMEM = { { MKSLCD_SCREEN_HOME, MKSList_Home }, // Home, Page 1 { MKSLCD_SCREEN_SETTING, MKSList_Setting }, // Setting, Page 2 { MKSLCD_SCREEM_TOOL, MKSList_Tool }, // Page 3 - { MKSLCD_SCREEN_EXTRUDE_P1, MKSList_EXTRUE }, // Page 4 - { MKSLCD_SCREEN_EXTRUDE_P2, MKSList_EXTRUE }, // Page 11 - { MKSLCD_PAUSE_SETTING_EX, MKSList_EXTRUE }, // Page 57 - { MKSLCD_PAUSE_SETTING_EX2, MKSList_EXTRUE }, // Page 61 + { MKSLCD_SCREEN_EXTRUDE_P1, MKSList_EXTRUDE }, // Page 4 + { MKSLCD_SCREEN_EXTRUDE_P2, MKSList_EXTRUDE }, // Page 11 + { MKSLCD_PAUSE_SETTING_EX, MKSList_EXTRUDE }, // Page 57 + { MKSLCD_PAUSE_SETTING_EX2, MKSList_EXTRUDE }, // Page 61 { MKSLCD_SCREEN_LEVEL, MKSList_LEVEL }, // Page 5 { MKSLCD_SCREEN_MOVE, MKSList_MOVE }, // Page 6 { MKSLCD_SCREEN_PRINT, MKSList_Print }, // Page 7 { MKSLCD_SCREEN_PAUSE, MKSList_Print }, // Page 26 { MKSLCD_SCREEN_CHOOSE_FILE, MKSList_SD_File }, // Page 15 - { MKSLCD_SCREEN_MOTOR_PLUSE, MKSList_Pluse }, // Page 51 - { MKSLCD_SCREEN_MOTOR_SPEED, MKSList_MaxSpeed }, // Page 55 - { MKSLCD_SCREEN_MOTOR_ACC_MAX, MKSList_MaxAcc }, // Page 53 + { MKSLCD_SCREEN_STEPS_MM, MKSList_Steps_mm }, // Page 51 + { MKSLCD_SCREEN_AXIS_SPEED, MKSList_MaxSpeed }, // Page 55 + { MKSLCD_SCREEN_AXIS_ACC_MAX, MKSList_MaxAcc }, // Page 53 { MKSLCD_SCREEN_LEVEL_DATA, MKSList_Level_Point }, // Page 48 { MKSLCD_PrintPause_SET, MKSList_PrintPauseConfig }, // Page 49 - { MKSLCD_FILAMENT_DATA, MKSList_SD_File }, // Page 50 + //{ MKSLCD_FILAMENT_DATA, MKSList_SD_File }, // Page 50 { MKSLCD_SCREEN_Config, MKSList_TempOnly }, // Page 46 - { MKSLCD_SCREEN_Config_MOTOR, MKSList_MotoConfig }, // Page 47 + { MKSLCD_SCREEN_Config_MOTOR, MKSList_MotionConfig }, // Page 47 { MKSLCD_PID, MKSList_PID }, // Page 56 { MKSLCD_ABOUT, MKSList_About }, // Page 36 { MKSLCD_SCREEN_PRINT_CONFIG, MKSList_Level_PrintConfig }, // Page 60 @@ -495,7 +420,7 @@ const struct VPMapping VPMap[] PROGMEM = { }; const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; -const char H43Version[] PROGMEM = "MKS H43_V1.30"; +const char H43Version[] PROGMEM = "MKS H43_V1.31"; const char Updata_Time[] PROGMEM = STRING_DISTRIBUTION_DATE; const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { @@ -522,7 +447,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_MOVE_DISTANCE, &manualMoveStep, screen.getManualMovestep, nullptr), - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOCK, nullptr, screen.handleManualMove, nullptr), VPHELPER(VP_LEVEL_POINT, nullptr, screen.manualAssistLeveling, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) @@ -545,7 +470,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_HOTEND VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, screen.sendFloatAsLongValueToDisplay<2>), VPHELPER(VP_MOVE_E0, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, screen.handleHeaterControl, nullptr), @@ -570,7 +495,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if HAS_MULTI_HOTEND VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, screen.handleManualExtrude, nullptr), VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, screen.handleHeaterControl, nullptr), VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, screen.sendHeaterStatusToDisplay), @@ -664,27 +589,27 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_Z_MAX_SPEED, &planner.settings.max_feedrate_mm_s[Z_AXIS], screen.handleMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), #if HAS_HOTEND - VPHELPER(VP_E0_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(0)], screen.handleExtruderMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E0_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(0)], screen.handleMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), #if HAS_MULTI_HOTEND - VPHELPER(VP_E1_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], screen.handleExtruderMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E1_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], screen.handleMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), #endif #endif - VPHELPER(VP_X_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[X_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), - VPHELPER(VP_Y_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Y_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), - VPHELPER(VP_Z_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Z_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_X_MAX_ACC, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[X_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_Y_MAX_ACC, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Y_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_Z_MAX_ACC, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Z_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), #if HAS_HOTEND - VPHELPER(VP_E0_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(0)], screen.handleExtruderAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_E0_MAX_ACC, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(0)], screen.handleMaxAccChange, screen.sendWordValueToDisplay), #if HAS_MULTI_HOTEND - VPHELPER(VP_E1_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], screen.handleExtruderAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_E1_MAX_ACC, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], screen.handleMaxAccChange, screen.sendWordValueToDisplay), #endif #endif VPHELPER(VP_TRAVEL_SPEED, (uint16_t *)&planner.settings.travel_acceleration, screen.handleTravelAccChange, screen.sendFloatAsIntValueToDisplay<0>), VPHELPER(VP_FEEDRATE_MIN_SPEED, (uint16_t *)&planner.settings.min_feedrate_mm_s, screen.handleFeedRateMinChange, screen.sendFloatAsIntValueToDisplay<0>), VPHELPER(VP_T_F_SPEED, (uint16_t *)&planner.settings.min_travel_feedrate_mm_s, screen.handleMin_T_F, screen.sendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_ACC_SPEED, (uint16_t *)&planner.settings.acceleration, screen.handleAccChange, screen.sendWordValueToDisplay), + //VPHELPER(VP_DEFAULT_ACC, (uint16_t *)&planner.settings.acceleration, screen.handleAccChange, screen.sendWordValueToDisplay), VPHELPER(VP_X_PARK_POS, &mks_park_pos.x, screen.getParkPos, screen.sendWordValueToDisplay), VPHELPER(VP_Y_PARK_POS, &mks_park_pos.y, screen.getParkPos, screen.sendWordValueToDisplay), @@ -696,39 +621,39 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if ENABLED(SENSORLESS_HOMING) // TMC SENSORLESS Setting #if X_HAS_STEALTHCHOP - VPHELPER(VP_TMC_X_STEP, &tmc_step.x, screen.tmcChangeConfig, screen.sendTMCStepValue), + VPHELPER(VP_TMC_X_SENS, &tmc_stall_sens.x, screen.tmcChangeConfig, screen.sendTMCSensValue), #endif #if Y_HAS_STEALTHCHOP - VPHELPER(VP_TMC_Y_STEP, &tmc_step.y, screen.tmcChangeConfig, screen.sendTMCStepValue), + VPHELPER(VP_TMC_Y_SENS, &tmc_stall_sens.y, screen.tmcChangeConfig, screen.sendTMCSensValue), #endif #if Z_HAS_STEALTHCHOP - VPHELPER(VP_TMC_Z_STEP, &tmc_step.z, screen.tmcChangeConfig, screen.sendTMCStepValue), + VPHELPER(VP_TMC_Z_SENS, &tmc_stall_sens.z, screen.tmcChangeConfig, screen.sendTMCSensValue), #endif #endif #if HAS_TRINAMIC_CONFIG // TMC Current Setting - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC VPHELPER(VP_TMC_X_Current, &stepperX.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC VPHELPER(VP_TMC_Y_Current, &stepperY.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC VPHELPER(VP_TMC_Z_Current, &stepperZ.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC VPHELPER(VP_TMC_E0_Current, &stepperE0.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC VPHELPER(VP_TMC_E1_Current, &stepperE1.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC VPHELPER(VP_TMC_X1_Current, &stepperX2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Y2) + #if Y2_IS_TRINAMIC VPHELPER(VP_TMC_Y1_Current, &stepperY2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Z2) + #if Z2_IS_TRINAMIC VPHELPER(VP_TMC_Z1_Current, &stepperZ2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif #endif @@ -741,9 +666,9 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_SD_Print_LiveAdjustZ_Confirm, nullptr, screen.zOffsetConfirm, nullptr), - VPHELPER(VP_ZOffset_Distance,nullptr ,screen.getZoffsetDistance, nullptr), + VPHELPER(VP_ZOffset_Distance, nullptr, screen.getZoffsetDistance, nullptr), VPHELPER(VP_MESH_LEVEL_ADJUST, nullptr, screen.meshLevelDistanceConfig, nullptr), - VPHELPER(VP_MESH_LEVEL_POINT,nullptr, screen.meshLevel, nullptr), + VPHELPER(VP_MESH_LEVEL_POINT, nullptr, screen.meshLevel, nullptr), #if ENABLED(PREVENT_COLD_EXTRUSION) VPHELPER(VP_Min_EX_T_E, &thermalManager.extrude_min_temp, screen.getMinExtrudeTemp, screen.sendWordValueToDisplay), @@ -753,9 +678,9 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if ENABLED(EDITABLE_STEPS_PER_UNIT) #if HAS_HOTEND - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<0>), #if HAS_MULTI_HOTEND - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<0>), #endif #endif #endif @@ -784,9 +709,9 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_ZOffset_DE_DIS, &z_offset_add, nullptr, screen.sendFloatAsLongValueToDisplay<2>), #endif #if HAS_BED_PROBE - VPHELPER(VP_OFFSET_X, &probe.offset.x, screen.getOffsetValue,screen.sendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_OFFSET_Y, &probe.offset.y, screen.getOffsetValue,screen.sendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_OFFSET_Z, &probe.offset.z, screen.getOffsetValue,screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_X, &probe.offset.x, screen.getOffsetValue, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_Y, &probe.offset.y, screen.getOffsetValue, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_Z, &probe.offset.z, screen.getOffsetValue, screen.sendFloatAsLongValueToDisplay<2>), #endif #else VPHELPER(VP_SD_FileSelected, nullptr, screen.printReturn, nullptr), diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h index 95bee17229..ba5508e441 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h @@ -49,29 +49,13 @@ void MKS_resume_print_move(); extern float z_offset_add; -extern xyz_int_t tmc_step; +extern xyz_int_t tmc_stall_sens; extern uint16_t lcd_default_light; -#if X_HAS_STEALTHCHOP - extern uint16_t tmc_x_current; -#endif -#if Y_HAS_STEALTHCHOP - extern uint16_t tmc_y_current; -#endif -#if Z_HAS_STEALTHCHOP - extern uint16_t tmc_z_current; -#endif -#if E0_HAS_STEALTHCHOP - extern uint16_t tmc_e0_current; -#endif -#if E1_HAS_STEALTHCHOP - extern uint16_t tmc_e1_current; -#endif - typedef enum { EX_HEATING, - EX_HEAT_STARUS, + EX_HEAT_STATUS, EX_CHANGING, EX_CHANGE_STATUS, EX_NONE, @@ -80,7 +64,7 @@ typedef enum { typedef struct { //uint8_t ex_change_flag:1; //uint8_t ex_heat_flag:1; - uint8_t ex_load_unload_flag:1; //0:unload 1:load + uint8_t ex_load_unload_flag:1; // 0:unload 1:load EX_STATUS_DEF ex_status; uint32_t ex_tick_start; uint32_t ex_tick_end; @@ -121,118 +105,118 @@ extern NOZZLE_PARK_DEF nozzle_park_mks; enum DGUS_ScreenID : uint8_t { #if ENABLED(USE_MKS_GREEN_UI) - DGUS_SCREEN_BOOT = 33, - DGUS_SCREEN_MAIN = 60, - DGUS_SCREEN_STATUS = 60, - DGUS_SCREEN_STATUS2 = 60, - DGUS_SCREEN_PREHEAT = 18, - DGUS_SCREEN_POWER_LOSS = 100, - DGUS_SCREEN_MANUALMOVE = 192, - DGUS_SCREEN_UTILITY = 120, - DGUS_SCREEN_FILAMENT_UNLOADING = 158, - DGUS_SCREEN_SDFILELIST = 15, - DGUS_SCREEN_SDPRINTMANIPULATION = 15, - DGUS_SCREEN_SDPRINTTUNE = 17, + DGUS_SCREEN_BOOT = 33, + DGUS_SCREEN_MAIN = 60, + DGUS_SCREEN_STATUS = 60, + DGUS_SCREEN_STATUS2 = 60, + DGUS_SCREEN_PREHEAT = 18, + DGUS_SCREEN_POWER_LOSS = 100, + DGUS_SCREEN_MANUALMOVE = 192, + DGUS_SCREEN_UTILITY = 120, + DGUS_SCREEN_FILAMENT_UNLOADING = 158, + DGUS_SCREEN_SDFILELIST = 15, + DGUS_SCREEN_SDPRINTMANIPULATION = 15, + DGUS_SCREEN_SDPRINTTUNE = 17, - MKSLCD_SCREEN_BOOT = 33, - MKSLCD_SCREEN_HOME = 60, // MKS main page - MKSLCD_SCREEN_SETTING = 62, // MKS Setting page / no wifi whit - MKSLCD_SCREEM_TOOL = 64, // MKS Tool page - MKSLCD_SCREEN_EXTRUDE_P1 = 75, - MKSLCD_SCREEN_EXTRUDE_P2 = 77, - MKSLCD_SCREEN_LEVEL = 73, - MKSLCD_AUTO_LEVEL = 81, - MKSLCD_SCREEN_MOVE = 66, - MKSLCD_SCREEN_PRINT = 68, - MKSLCD_SCREEN_PAUSE = 70, - MKSLCD_SCREEN_CHOOSE_FILE = 87, - MKSLCD_SCREEN_NO_CHOOSE_FILE = 88, - MKSLCD_SCREEN_Config = 101, - MKSLCD_SCREEN_Config_MOTOR = 103, - MKSLCD_SCREEN_MOTOR_PLUSE = 104, - MKSLCD_SCREEN_MOTOR_SPEED = 102, - MKSLCD_SCREEN_MOTOR_ACC_MAX = 105, - MKSLCD_SCREEN_PRINT_CONFIG = 72, - MKSLCD_SCREEN_LEVEL_DATA = 106, - MKSLCD_PrintPause_SET = 107, - MKSLCD_FILAMENT_DATA = 50, - MKSLCD_ABOUT = 83, - MKSLCD_PID = 108, - MKSLCD_PAUSE_SETTING_MOVE = 98, - MKSLCD_PAUSE_SETTING_EX = 96, - MKSLCD_PAUSE_SETTING_EX2 = 97, - MKSLCD_SCREEN_PRINT_CONFIRM = 94, - MKSLCD_SCREEN_EX_CONFIG = 112, - MKSLCD_SCREEN_EEP_Config = 89, - MKSLCD_SCREEN_PrintDone = 92, - MKSLCD_SCREEN_TMC_Config = 111, - MKSLCD_Screen_Offset_Config = 109, - MKSLCD_Screen_PMove = 98, - MKSLCD_Screen_Baby = 79, + MKSLCD_SCREEN_BOOT = 33, + MKSLCD_SCREEN_HOME = 60, // MKS main page + MKSLCD_SCREEN_SETTING = 62, // MKS Setting page / no wifi whit + MKSLCD_SCREEM_TOOL = 64, // MKS Tool page + MKSLCD_SCREEN_EXTRUDE_P1 = 75, + MKSLCD_SCREEN_EXTRUDE_P2 = 77, + MKSLCD_SCREEN_LEVEL = 73, + MKSLCD_AUTO_LEVEL = 81, + MKSLCD_SCREEN_MOVE = 66, + MKSLCD_SCREEN_PRINT = 68, + MKSLCD_SCREEN_PAUSE = 70, + MKSLCD_SCREEN_CHOOSE_FILE = 87, + //MKSLCD_SCREEN_NO_CHOOSE_FILE = 88, // Missing in 1.31 firmware + MKSLCD_SCREEN_Config = 101, + MKSLCD_SCREEN_Config_MOTOR = 103, + MKSLCD_SCREEN_STEPS_MM = 104, + MKSLCD_SCREEN_AXIS_SPEED = 102, + MKSLCD_SCREEN_AXIS_ACC_MAX = 105, + MKSLCD_SCREEN_PRINT_CONFIG = 72, + MKSLCD_SCREEN_LEVEL_DATA = 106, + MKSLCD_PrintPause_SET = 107, + //MKSLCD_FILAMENT_DATA = 50, // Missing in 1.31 firmware + MKSLCD_ABOUT = 83, + MKSLCD_PID = 108, + MKSLCD_PAUSE_SETTING_MOVE = 98, + MKSLCD_PAUSE_SETTING_EX = 96, + MKSLCD_PAUSE_SETTING_EX2 = 97, + MKSLCD_SCREEN_PRINT_CONFIRM = 94, + MKSLCD_SCREEN_EX_CONFIG = 112, + MKSLCD_SCREEN_EEP_Config = 89, + MKSLCD_SCREEN_PrintDone = 92, + MKSLCD_SCREEN_TMC_Config = 111, + MKSLCD_Screen_Offset_Config = 109, + MKSLCD_Screen_PMove = 98, + MKSLCD_Screen_Baby = 79, #else - DGUS_SCREEN_BOOT = 120, - DGUS_SCREEN_MAIN = 1, + DGUS_SCREEN_BOOT = 120, + DGUS_SCREEN_MAIN = 1, - DGUS_SCREEN_STATUS = 1, - DGUS_SCREEN_STATUS2 = 1, - DGUS_SCREEN_PREHEAT = 18, - DGUS_SCREEN_POWER_LOSS = 100, - DGUS_SCREEN_MANUALMOVE = 192, - DGUS_SCREEN_UTILITY = 120, - DGUS_SCREEN_FILAMENT_UNLOADING = 158, - DGUS_SCREEN_SDFILELIST = 15, - DGUS_SCREEN_SDPRINTMANIPULATION = 15, - DGUS_SCREEN_SDPRINTTUNE = 17, + DGUS_SCREEN_STATUS = 1, + DGUS_SCREEN_STATUS2 = 1, + DGUS_SCREEN_PREHEAT = 18, + DGUS_SCREEN_POWER_LOSS = 100, + DGUS_SCREEN_MANUALMOVE = 192, + DGUS_SCREEN_UTILITY = 120, + DGUS_SCREEN_FILAMENT_UNLOADING = 158, + DGUS_SCREEN_SDFILELIST = 15, + DGUS_SCREEN_SDPRINTMANIPULATION = 15, + DGUS_SCREEN_SDPRINTTUNE = 17, - MKSLCD_SCREEN_BOOT = 0, - MKSLCD_SCREEN_HOME = 1, // MKS main page - MKSLCD_SCREEN_SETTING = 2, // MKS Setting page / no wifi whit - MKSLCD_SCREEM_TOOL = 3, // MKS Tool page - MKSLCD_SCREEN_EXTRUDE_P1 = 4, - MKSLCD_SCREEN_EXTRUDE_P2 = 11, - MKSLCD_SCREEN_LEVEL = 5, - MKSLCD_AUTO_LEVEL = 73, - MKSLCD_SCREEN_LEVEL_PRESS = 9, - MKSLCD_SCREEN_MOVE = 6, - MKSLCD_SCREEN_PRINT = 7, - MKSLCD_SCREEN_PRINT_PRESS = 13, - MKSLCD_SCREEN_PAUSE = 26, - MKSLCD_SCREEN_PAUSE_PRESS = 26, - MKSLCD_SCREEN_CHOOSE_FILE = 15, - MKSLCD_SCREEN_NO_CHOOSE_FILE = 17, - MKSLCD_SCREEN_Config = 46, - MKSLCD_SCREEN_Config_MOTOR = 47, - MKSLCD_SCREEN_MOTOR_PLUSE = 51, - MKSLCD_SCREEN_MOTOR_SPEED = 55, - MKSLCD_SCREEN_MOTOR_ACC_MAX = 53, - MKSLCD_SCREEN_PRINT_CONFIG = 60, - MKSLCD_SCREEN_LEVEL_DATA = 48, - MKSLCD_PrintPause_SET = 49, - MKSLCD_FILAMENT_DATA = 50, - MKSLCD_ABOUT = 36, - MKSLCD_PID = 56, - MKSLCD_PAUSE_SETTING_MOVE = 58, - MKSLCD_PAUSE_SETTING_EX = 57, - MKSLCD_PAUSE_SETTING_EX2 = 61, - MKSLCD_SCREEN_NO_FILE = 42, - MKSLCD_SCREEN_PRINT_CONFIRM = 43, - MKSLCD_SCREEN_EX_CONFIG = 65, - MKSLCD_SCREEN_EEP_Config = 20, - MKSLCD_SCREEN_PrintDone = 25, - MKSLCD_SCREEN_TMC_Config = 70, - MKSLCD_Screen_Offset_Config = 30, - MKSLCD_Screen_PMove = 64, - MKSLCD_Screen_Baby = 71, + MKSLCD_SCREEN_BOOT = 0, + MKSLCD_SCREEN_HOME = 1, // MKS main page + MKSLCD_SCREEN_SETTING = 2, // MKS Setting page / no wifi whit + MKSLCD_SCREEM_TOOL = 3, // MKS Tool page + MKSLCD_SCREEN_EXTRUDE_P1 = 4, + MKSLCD_SCREEN_EXTRUDE_P2 = 11, + MKSLCD_SCREEN_LEVEL = 5, + MKSLCD_AUTO_LEVEL = 73, + MKSLCD_SCREEN_LEVEL_PRESS = 9, + MKSLCD_SCREEN_MOVE = 6, + MKSLCD_SCREEN_PRINT = 7, + MKSLCD_SCREEN_PRINT_PRESS = 13, + MKSLCD_SCREEN_PAUSE = 26, + MKSLCD_SCREEN_PAUSE_PRESS = 26, + MKSLCD_SCREEN_CHOOSE_FILE = 15, + //MKSLCD_SCREEN_NO_CHOOSE_FILE = 17, // Missing in 1.30 firmware + MKSLCD_SCREEN_Config = 46, + MKSLCD_SCREEN_Config_MOTOR = 47, + MKSLCD_SCREEN_STEPS_MM = 51, + MKSLCD_SCREEN_MOTOR_SPEED = 55, + MKSLCD_SCREEN_MOTOR_ACC_MAX = 53, + MKSLCD_SCREEN_PRINT_CONFIG = 60, + MKSLCD_SCREEN_LEVEL_DATA = 48, + MKSLCD_PrintPause_SET = 49, + //MKSLCD_FILAMENT_DATA = 50, // Missing in 1.31 firmware + MKSLCD_ABOUT = 36, + MKSLCD_PID = 56, + MKSLCD_PAUSE_SETTING_MOVE = 58, + MKSLCD_PAUSE_SETTING_EX = 57, + MKSLCD_PAUSE_SETTING_EX2 = 61, + MKSLCD_SCREEN_NO_FILE = 42, + MKSLCD_SCREEN_PRINT_CONFIRM = 43, + MKSLCD_SCREEN_EX_CONFIG = 65, + MKSLCD_SCREEN_EEP_Config = 20, + MKSLCD_SCREEN_PrintDone = 25, + MKSLCD_SCREEN_TMC_Config = 70, + MKSLCD_Screen_Offset_Config = 30, + MKSLCD_Screen_PMove = 64, + MKSLCD_Screen_Baby = 71, #endif - DGUS_SCREEN_CONFIRM = 240, - DGUS_SCREEN_KILL = 250, //!< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") - DGUS_SCREEN_WAITING = 251, - DGUS_SCREEN_POPUP = 252, //!< special target, popup screen will also return this code to say "return to previous screen" - DGUS_SCREEN_UNUSED = 255 + DGUS_SCREEN_CONFIRM = 240, + DGUS_SCREEN_KILL = 250, //!< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") + DGUS_SCREEN_WAITING = 252, // Missing in 1.30 and 1.31 firmware, workaround + DGUS_SCREEN_POPUP = 252, //!< special target, popup screen will also return this code to say "return to previous screen" + DGUS_SCREEN_UNUSED = 255 }; // Place for status messages. @@ -242,23 +226,8 @@ constexpr uint8_t VP_M117_LEN = 0x20; // Heater status constexpr uint16_t VP_E0_STATUS = 0x3410; constexpr uint16_t VP_E1_STATUS = 0x3412; -//constexpr uint16_t VP_E2_STATUS = 0x3414; -//constexpr uint16_t VP_E3_STATUS = 0x3416; -//constexpr uint16_t VP_E4_STATUS = 0x3418; -//constexpr uint16_t VP_E5_STATUS = 0x341A; constexpr uint16_t VP_MOVE_OPTION = 0x3500; -// // PIDs -// constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 -// constexpr uint16_t VP_E0_PID_I = 0x3702; -// constexpr uint16_t VP_E0_PID_D = 0x3704; -// constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , uint16_t , 0~1638.4 -// constexpr uint16_t VP_E1_PID_I = 0x3708; -// constexpr uint16_t VP_E1_PID_D = 0x370A; -// constexpr uint16_t VP_BED_PID_P = 0x3710; -// constexpr uint16_t VP_BED_PID_I = 0x3712; -// constexpr uint16_t VP_BED_PID_D = 0x3714; - // Waiting screen status constexpr uint16_t VP_WAITING_STATUS = 0x3800; @@ -290,7 +259,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint8_t VP_MSGSTR4_LEN = 0x20; constexpr uint16_t VP_MARLIN_VERSION = 0x1A00; - constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. + constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. constexpr uint16_t VP_SCREENCHANGE_ASK = 0x1500; constexpr uint16_t VP_SCREENCHANGE = 0x1501; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. @@ -304,22 +273,11 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x1680; /* -------------------------------0x2000-0x2FFF------------------------------- */ // Temperatures. + // Only E0 and E1 are present in H43 firmware constexpr uint16_t VP_T_E0_Is = 0x2000; // 4 Byte Integer constexpr uint16_t VP_T_E0_Set = 0x2004; // 2 Byte Integer constexpr uint16_t VP_T_E1_Is = 0x2008; // 4 Byte Integer constexpr uint16_t VP_T_E1_Set = 0x200B; // 2 Byte Integer - constexpr uint16_t VP_T_E2_Is = 0x2010; // 4 Byte Integer - constexpr uint16_t VP_T_E2_Set = 0x2014; // 2 Byte Integer - constexpr uint16_t VP_T_E3_Is = 0x2018; // 4 Byte Integer - constexpr uint16_t VP_T_E3_Set = 0x201B; // 2 Byte Integer - constexpr uint16_t VP_T_E4_Is = 0x2020; // 4 Byte Integer - constexpr uint16_t VP_T_E4_Set = 0x2024; // 2 Byte Integer - constexpr uint16_t VP_T_E5_Is = 0x2028; // 4 Byte Integer - constexpr uint16_t VP_T_E5_Set = 0x202B; // 2 Byte Integer - constexpr uint16_t VP_T_E6_Is = 0x2030; // 4 Byte Integer - constexpr uint16_t VP_T_E6_Set = 0x2034; // 2 Byte Integer - constexpr uint16_t VP_T_E7_Is = 0x2038; // 4 Byte Integer - constexpr uint16_t VP_T_E7_Set = 0x203B; // 2 Byte Integer constexpr uint16_t VP_T_Bed_Is = 0x2040; // 4 Byte Integer constexpr uint16_t VP_T_Bed_Set = 0x2044; // 2 Byte Integer @@ -328,12 +286,6 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_Flowrate_E0 = 0x2200; // 2 Byte Integer constexpr uint16_t VP_Flowrate_E1 = 0x2202; // 2 Byte Integer - constexpr uint16_t VP_Flowrate_E2 = 0x2204; - constexpr uint16_t VP_Flowrate_E3 = 0x2206; - constexpr uint16_t VP_Flowrate_E4 = 0x2208; - constexpr uint16_t VP_Flowrate_E5 = 0x220A; - constexpr uint16_t VP_Flowrate_E6 = 0x220C; - constexpr uint16_t VP_Flowrate_E7 = 0x220E; // Move constexpr uint16_t VP_MOVE_X = 0x2300; @@ -341,20 +293,15 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_MOVE_Z = 0x2304; constexpr uint16_t VP_MOVE_E0 = 0x2310; constexpr uint16_t VP_MOVE_E1 = 0x2312; - constexpr uint16_t VP_MOVE_E2 = 0x2314; - constexpr uint16_t VP_MOVE_E3 = 0x2316; - constexpr uint16_t VP_MOVE_E4 = 0x2318; - constexpr uint16_t VP_MOVE_E5 = 0x231A; - constexpr uint16_t VP_MOVE_E6 = 0x231C; - constexpr uint16_t VP_MOVE_E7 = 0x231E; + constexpr uint16_t VP_HOME_ALL = 0x2320; - constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2330; + constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2330; constexpr uint16_t VP_MOVE_DISTANCE = 0x2334; constexpr uint16_t VP_X_HOME = 0x2336; constexpr uint16_t VP_Y_HOME = 0x2338; constexpr uint16_t VP_Z_HOME = 0x233A; - // Fan Control Buttons , switch between "off" and "on" + // Fan Control Buttons, switch between "off" and "on" constexpr uint16_t VP_FAN0_CONTROL = 0x2350; constexpr uint16_t VP_FAN1_CONTROL = 0x2352; constexpr uint16_t VP_FAN2_CONTROL = 0x2354; @@ -365,9 +312,6 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_LANGUAGE_CHANGE = 0x2380; constexpr uint16_t VP_LANGUAGE_CHANGE1 = 0x2382; constexpr uint16_t VP_LANGUAGE_CHANGE2 = 0x2384; - constexpr uint16_t VP_LANGUAGE_CHANGE3 = 0x2386; - constexpr uint16_t VP_LANGUAGE_CHANGE4 = 0x2388; - constexpr uint16_t VP_LANGUAGE_CHANGE5 = 0x238A; // LEVEL constexpr uint16_t VP_LEVEL_POINT = 0x2400; @@ -383,7 +327,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2500; constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2504; constexpr uint16_t VP_LOAD_Filament = 0x2508; - // constexpr uint16_t VP_LOAD_UNLOAD_Cancle = 0x250A; + //constexpr uint16_t VP_LOAD_UNLOAD_Cancel = 0x250A; constexpr uint16_t VP_UNLOAD_Filament = 0x250B; constexpr uint16_t VP_Filament_distance = 0x2600; constexpr uint16_t VP_Filament_speed = 0x2604; @@ -406,17 +350,11 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_FAN3_STATUS = 0x2716; // Step per mm - constexpr uint16_t VP_X_STEP_PER_MM = 0x2900; // at the moment , uint16_t , 0~1638.4 + constexpr uint16_t VP_X_STEP_PER_MM = 0x2900; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_Y_STEP_PER_MM = 0x2904; constexpr uint16_t VP_Z_STEP_PER_MM = 0x2908; constexpr uint16_t VP_E0_STEP_PER_MM = 0x2910; constexpr uint16_t VP_E1_STEP_PER_MM = 0x2912; - constexpr uint16_t VP_E2_STEP_PER_MM = 0x2914; - constexpr uint16_t VP_E3_STEP_PER_MM = 0x2916; - constexpr uint16_t VP_E4_STEP_PER_MM = 0x2918; - constexpr uint16_t VP_E5_STEP_PER_MM = 0x291A; - constexpr uint16_t VP_E6_STEP_PER_MM = 0x291C; - constexpr uint16_t VP_E7_STEP_PER_MM = 0x291E; constexpr uint16_t VP_X_MAX_SPEED = 0x2A00; constexpr uint16_t VP_Y_MAX_SPEED = 0x2A04; @@ -424,16 +362,16 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_E0_MAX_SPEED = 0x2A0C; constexpr uint16_t VP_E1_MAX_SPEED = 0x2A10; - constexpr uint16_t VP_X_ACC_MAX_SPEED = 0x2A28; - constexpr uint16_t VP_Y_ACC_MAX_SPEED = 0x2A2C; - constexpr uint16_t VP_Z_ACC_MAX_SPEED = 0x2A30; - constexpr uint16_t VP_E0_ACC_MAX_SPEED = 0x2A34; - constexpr uint16_t VP_E1_ACC_MAX_SPEED = 0x2A38; + constexpr uint16_t VP_X_MAX_ACC = 0x2A28; + constexpr uint16_t VP_Y_MAX_ACC = 0x2A2C; + constexpr uint16_t VP_Z_MAX_ACC = 0x2A30; + constexpr uint16_t VP_E0_MAX_ACC = 0x2A34; + constexpr uint16_t VP_E1_MAX_ACC = 0x2A38; constexpr uint16_t VP_TRAVEL_SPEED = 0x2A3C; constexpr uint16_t VP_FEEDRATE_MIN_SPEED = 0x2A40; constexpr uint16_t VP_T_F_SPEED = 0x2A44; - constexpr uint16_t VP_ACC_SPEED = 0x2A48; + constexpr uint16_t VP_DEFAULT_ACC = 0x2A48; /* -------------------------------0x3000-0x3FFF------------------------------- */ // Buttons on the SD-Card File listing. @@ -467,10 +405,10 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_SD_Print_Filename = 0x32C0; // X Y Z Point - constexpr uint16_t VP_XPos = 0x3300; // 4 Byte Fixed point number; format xxx.yy - constexpr uint16_t VP_YPos = 0x3302; // 4 Byte Fixed point number; format xxx.yy - constexpr uint16_t VP_ZPos = 0x3304; // 4 Byte Fixed point number; format xxx.yy - constexpr uint16_t VP_EPos = 0x3306; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_XPos = 0x3300; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_YPos = 0x3302; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_ZPos = 0x3304; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_EPos = 0x3306; // 4 Byte Fixed point number; format xxx.yy // Print constexpr uint16_t VP_PrintProgress_Percentage = 0x3330; // 2 Byte Integer (0..100) @@ -481,22 +419,22 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_PrintsTotal = 0x3380; constexpr uint16_t VP_PrintsTotal_LEN = 16; - constexpr uint16_t VP_File_Pictutr0 = 0x3400; - constexpr uint16_t VP_File_Pictutr1 = 0x3402; - constexpr uint16_t VP_File_Pictutr2 = 0x3404; - constexpr uint16_t VP_File_Pictutr3 = 0x3406; - constexpr uint16_t VP_File_Pictutr4 = 0x3408; - constexpr uint16_t VP_File_Pictutr5 = 0x340A; - constexpr uint16_t VP_File_Pictutr6 = 0x340C; - constexpr uint16_t VP_File_Pictutr7 = 0x340E; - constexpr uint16_t VP_File_Pictutr8 = 0x3410; - constexpr uint16_t VP_File_Pictutr9 = 0x3412; + constexpr uint16_t VP_File_Picture0 = 0x3400; + constexpr uint16_t VP_File_Picture1 = 0x3402; + constexpr uint16_t VP_File_Picture2 = 0x3404; + constexpr uint16_t VP_File_Picture3 = 0x3406; + constexpr uint16_t VP_File_Picture4 = 0x3408; + constexpr uint16_t VP_File_Picture5 = 0x340A; + constexpr uint16_t VP_File_Picture6 = 0x340C; + constexpr uint16_t VP_File_Picture7 = 0x340E; + constexpr uint16_t VP_File_Picture8 = 0x3410; + constexpr uint16_t VP_File_Picture9 = 0x3412; constexpr uint16_t VP_BED_STATUS = 0x341C; - constexpr uint16_t VP_TMC_X_STEP = 0x3430; - constexpr uint16_t VP_TMC_Y_STEP = 0x3432; - constexpr uint16_t VP_TMC_Z_STEP = 0x3434; + constexpr uint16_t VP_TMC_X_SENS = 0x3430; + constexpr uint16_t VP_TMC_Y_SENS = 0x3432; + constexpr uint16_t VP_TMC_Z_SENS = 0x3434; constexpr uint16_t VP_TMC_X1_Current = 0x3436; constexpr uint16_t VP_TMC_Y1_Current = 0x3438; @@ -512,101 +450,90 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_PrintTime_S = 0x3504; // PIDs - constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 - constexpr uint16_t VP_E0_PID_I = 0x3702; - constexpr uint16_t VP_E0_PID_D = 0x3704; - constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , uint16_t , 0~1638.4 - constexpr uint16_t VP_E1_PID_I = 0x3708; - constexpr uint16_t VP_E1_PID_D = 0x370A; - constexpr uint16_t VP_BED_PID_P = 0x3710; - constexpr uint16_t VP_BED_PID_I = 0x3712; - constexpr uint16_t VP_BED_PID_D = 0x3714; + constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment, uint16_t, 0~1638.4 + constexpr uint16_t VP_E0_PID_I = 0x3702; + constexpr uint16_t VP_E0_PID_D = 0x3704; + constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment, uint16_t, 0~1638.4 + constexpr uint16_t VP_E1_PID_I = 0x3708; + constexpr uint16_t VP_E1_PID_D = 0x370A; + constexpr uint16_t VP_BED_PID_P = 0x3710; + constexpr uint16_t VP_BED_PID_I = 0x3712; + constexpr uint16_t VP_BED_PID_D = 0x3714; - constexpr uint16_t VP_EEPROM_CTRL = 0x3720; + constexpr uint16_t VP_EEPROM_CTRL = 0x3720; - constexpr uint16_t VP_OFFSET_X = 0x3724; - constexpr uint16_t VP_OFFSET_Y = 0x3728; - constexpr uint16_t VP_OFFSET_Z = 0x372B; + constexpr uint16_t VP_OFFSET_X = 0x3724; + constexpr uint16_t VP_OFFSET_Y = 0x3728; + constexpr uint16_t VP_OFFSET_Z = 0x372B; // PID autotune - constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x3800; - constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x3802; - constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x3804; - constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x3806; - constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x3808; - constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x380A; - constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x380C; + constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x3800; + constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x3802; + constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x380C; + // Calibrate Z - constexpr uint16_t VP_Z_CALIBRATE = 0x3810; + constexpr uint16_t VP_Z_CALIBRATE = 0x3810; - constexpr uint16_t VP_AutoTurnOffSw = 0x3812; - constexpr uint16_t VP_LCD_BLK = 0x3814; + constexpr uint16_t VP_AutoTurnOffSw = 0x3812; + constexpr uint16_t VP_LCD_BLK = 0x3814; - constexpr uint16_t VP_X_PARK_POS = 0x3900; - constexpr uint16_t VP_Y_PARK_POS = 0x3902; - constexpr uint16_t VP_Z_PARK_POS = 0x3904; + constexpr uint16_t VP_X_PARK_POS = 0x3900; + constexpr uint16_t VP_Y_PARK_POS = 0x3902; + constexpr uint16_t VP_Z_PARK_POS = 0x3904; /* -------------------------------0x4000-0x4FFF------------------------------- */ - // Heater Control Buttons , triged between "cool down" and "heat PLA" state - constexpr uint16_t VP_E0_CONTROL = 0x4010; - constexpr uint16_t VP_E1_CONTROL = 0x4012; - //constexpr uint16_t VP_E2_CONTROL = 0x2214; - //constexpr uint16_t VP_E3_CONTROL = 0x2216; - //constexpr uint16_t VP_E4_CONTROL = 0x2218; - //constexpr uint16_t VP_E5_CONTROL = 0x221A; - constexpr uint16_t VP_BED_CONTROL = 0x401C; + // Heater Control Buttons, triged between "cool down" and "heat PLA" state + constexpr uint16_t VP_E0_CONTROL = 0x4010; + constexpr uint16_t VP_E1_CONTROL = 0x4012; + constexpr uint16_t VP_BED_CONTROL = 0x401C; // Preheat - constexpr uint16_t VP_E0_BED_PREHEAT = 0x4020; - constexpr uint16_t VP_E1_BED_PREHEAT = 0x4022; - //constexpr uint16_t VP_E2_BED_PREHEAT = 0x4024; - //constexpr uint16_t VP_E3_BED_PREHEAT = 0x4026; - //constexpr uint16_t VP_E4_BED_PREHEAT = 0x4028; - //constexpr uint16_t VP_E5_BED_PREHEAT = 0x402A; + constexpr uint16_t VP_E0_BED_PREHEAT = 0x4020; + constexpr uint16_t VP_E1_BED_PREHEAT = 0x4022; // Filament load and unload - // constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x4030; - // constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x4032; + //constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x4030; + //constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x4032; - // Settings store , reset + // Settings store, reset // Level data - constexpr uint16_t VP_Level_Point_One_X = 0x4100; - constexpr uint16_t VP_Level_Point_One_Y = 0x4102; - constexpr uint16_t VP_Level_Point_Two_X = 0x4104; - constexpr uint16_t VP_Level_Point_Two_Y = 0x4106; - constexpr uint16_t VP_Level_Point_Three_X = 0x4108; - constexpr uint16_t VP_Level_Point_Three_Y = 0x410A; - constexpr uint16_t VP_Level_Point_Four_X = 0x410C; - constexpr uint16_t VP_Level_Point_Four_Y = 0x410E; - constexpr uint16_t VP_Level_Point_Five_X = 0x4110; - constexpr uint16_t VP_Level_Point_Five_Y = 0x4112; + constexpr uint16_t VP_Level_Point_One_X = 0x4100; + constexpr uint16_t VP_Level_Point_One_Y = 0x4102; + constexpr uint16_t VP_Level_Point_Two_X = 0x4104; + constexpr uint16_t VP_Level_Point_Two_Y = 0x4106; + constexpr uint16_t VP_Level_Point_Three_X = 0x4108; + constexpr uint16_t VP_Level_Point_Three_Y = 0x410A; + constexpr uint16_t VP_Level_Point_Four_X = 0x410C; + constexpr uint16_t VP_Level_Point_Four_Y = 0x410E; + constexpr uint16_t VP_Level_Point_Five_X = 0x4110; + constexpr uint16_t VP_Level_Point_Five_Y = 0x4112; /* H43 Version */ - constexpr uint16_t VP_MKS_H43_VERSION = 0x4A00; // MKS H43 V1.0.0 - constexpr uint16_t VP_MKS_H43_VERSION_LEN = 16; - constexpr uint16_t VP_MKS_H43_UpdataVERSION = 0x4A10; // MKS H43 V1.0.0 - constexpr uint16_t VP_MKS_H43_UpdataVERSION_LEN = 16; + constexpr uint16_t VP_MKS_H43_VERSION = 0x4A00; // MKS H43 V1.0.0 + constexpr uint16_t VP_MKS_H43_VERSION_LEN = 16; + constexpr uint16_t VP_MKS_H43_UpdataVERSION = 0x4A10; // MKS H43 V1.0.0 + constexpr uint16_t VP_MKS_H43_UpdataVERSION_LEN = 16; /* -------------------------------0x5000-0xFFFF------------------------------- */ constexpr uint16_t VP_HOME_Dis = 0x5000; constexpr uint16_t VP_Setting_Dis = 0x5010; constexpr uint16_t VP_Tool_Dis = 0x5020; - constexpr uint16_t VP_Printing_Dis = 0x5030; + constexpr uint16_t VP_Print_Dis = 0x5250; constexpr uint16_t VP_Language_Dis = 0x5080; constexpr uint16_t VP_LossPoint_Dis = 0x5090; constexpr uint16_t VP_PrintPauseConfig_Dis = 0x5120; - constexpr uint16_t VP_MotorPluse_Dis = 0x5140; - constexpr uint16_t VP_MotorMaxSpeed_Dis = 0x5150; - constexpr uint16_t VP_MotorMaxAcc_Dis = 0x5160; + constexpr uint16_t VP_AxisRes_Dis = 0x5140; + constexpr uint16_t VP_AxisMaxSpeed_Dis = 0x5150; + constexpr uint16_t VP_AxisMaxAcc_Dis = 0x5160; - constexpr uint16_t VP_X_Pluse_Dis = 0x5170; - constexpr uint16_t VP_Y_Pluse_Dis = 0x5180; - constexpr uint16_t VP_Z_Pluse_Dis = 0x5190; - constexpr uint16_t VP_E0_Pluse_Dis = 0x51A0; - constexpr uint16_t VP_E1_Pluse_Dis = 0x51B0; + constexpr uint16_t VP_X_Steps_mm_Dis = 0x5170; + constexpr uint16_t VP_Y_Steps_mm_Dis = 0x5180; + constexpr uint16_t VP_Z_Steps_mm_Dis = 0x5190; + constexpr uint16_t VP_E0_Steps_mm_Dis = 0x51A0; + constexpr uint16_t VP_E1_Steps_mm_Dis = 0x51B0; constexpr uint16_t VP_X_Max_Speed_Dis = 0x5280; constexpr uint16_t VP_Y_Max_Speed_Dis = 0x5290; @@ -614,11 +541,11 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_E0_Max_Speed_Dis = 0x52B0; constexpr uint16_t VP_E1_Max_Speed_Dis = 0x52C0; - constexpr uint16_t VP_X_Max_Acc_Speed_Dis = 0x51E0; - constexpr uint16_t VP_Y_Max_Acc_Speed_Dis = 0x51F0; - constexpr uint16_t VP_Z_Max_Acc_Speed_Dis = 0x5200; - constexpr uint16_t VP_E0_Max_Acc_Speed_Dis = 0x5210; - constexpr uint16_t VP_E1_Max_Acc_Speed_Dis = 0x5220; + constexpr uint16_t VP_X_Max_Acc_Dis = 0x51E0; + constexpr uint16_t VP_Y_Max_Acc_Dis = 0x51F0; + constexpr uint16_t VP_Z_Max_Acc_Dis = 0x5200; + constexpr uint16_t VP_E0_Max_Acc_Dis = 0x5210; + constexpr uint16_t VP_E1_Max_Acc_Dis = 0x5220; constexpr uint16_t VP_PrintTime_Dis = 0x5470; constexpr uint16_t VP_E0_Temp_Dis = 0x5310; @@ -642,7 +569,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_Extrusion_Dis = 0x5230; constexpr uint16_t VP_HeatBed_Dis = 0x5240; - constexpr uint16_t VP_Printting_Dis = 0x5430; + constexpr uint16_t VP_Printing_Dis = 0x5430; constexpr uint16_t VP_FactoryDefaults_Dis = 0x54C0; constexpr uint16_t VP_StoreSetting_Dis = 0x54B0; constexpr uint16_t VP_Info_EEPROM_2_Dis = 0x54D0; @@ -650,9 +577,9 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_AutoLevel_1_Dis = 0x55F0; - constexpr uint16_t VP_TMC_X_Step_Dis = 0x5530; - constexpr uint16_t VP_TMC_Y_Step_Dis = 0x5540; - constexpr uint16_t VP_TMC_Z_Step_Dis = 0x5550; + constexpr uint16_t VP_TMC_X_SENS_Dis = 0x5530; + constexpr uint16_t VP_TMC_Y_SENS_Dis = 0x5540; + constexpr uint16_t VP_TMC_Z_SENS_Dis = 0x5550; constexpr uint16_t VP_TMC_X1_Current_Dis = 0x5560; constexpr uint16_t VP_TMC_Y1_Current_Dis = 0x5570; constexpr uint16_t VP_TMC_X_Current_Dis = 0x5580; @@ -666,14 +593,17 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_EX_TEMP_INFO1_Dis = 0x5610; constexpr uint16_t VP_EX_TEMP_INFO2_Dis = 0x5620; constexpr uint16_t VP_EX_TEMP_INFO3_Dis = 0x5630; + constexpr uint16_t VP_X_Offset_Dis = 0x5660; + constexpr uint16_t VP_Y_Offset_Dis = 0x5670; + constexpr uint16_t VP_Z_Offset_Dis = 0x5680; constexpr uint16_t VP_LCD_BLK_Dis = 0x56A0; constexpr uint16_t VP_Info_PrintFinish_1_Dis = 0x5C00; constexpr uint16_t VP_Info_PrintFinish_2_Dis = 0x5C10; constexpr uint16_t VP_Length_Dis = 0x5B00; - constexpr uint16_t VP_PrintConfrim_Info_Dis = 0x5B90; - constexpr uint16_t VP_StopPrintConfrim_Info_Dis = 0x5B80; + constexpr uint16_t VP_PrintConfirm_Info_Dis = 0x5B90; + constexpr uint16_t VP_StopPrintConfirm_Info_Dis = 0x5B80; constexpr uint16_t VP_Point_One_Dis = 0x5BA0; constexpr uint16_t VP_Point_Two_Dis = 0x5BB0; @@ -681,8 +611,6 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_Point_Four_Dis = 0x5BD0; constexpr uint16_t VP_Point_Five_Dis = 0x5BE0; - constexpr uint16_t VP_Print_Dis = 0x5250; - constexpr uint16_t VP_About_Dis = 0x5A00; constexpr uint16_t VP_Config_Dis = 0x5A10; constexpr uint16_t VP_Filament_Dis = 0x5A20; @@ -693,6 +621,7 @@ constexpr uint16_t SP_T_Bed_Set = 0x5040; constexpr uint16_t VP_MotorConfig_Dis = 0x5100; constexpr uint16_t VP_LevelConfig_Dis = 0x5110; + constexpr uint16_t VP_Probe_Offset_Dis = 0x5650; constexpr uint16_t VP_Advance_Dis = 0x5130; constexpr uint16_t VP_TemperatureConfig_Dis = 0x5390; diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp index 1999518607..2a9ba87d68 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp @@ -58,41 +58,45 @@ bool DGUSAutoTurnOff = false; MKS_Language mks_language_index; // Initialized by settings.load -#if 0 -void DGUSScreenHandlerMKS::sendinfoscreen_ch(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4) { - dgus.writeVariable(VP_MSGSTR1, line1, 32, true); - dgus.writeVariable(VP_MSGSTR2, line2, 32, true); - dgus.writeVariable(VP_MSGSTR3, line3, 32, true); - dgus.writeVariable(VP_MSGSTR4, line4, 32, true); +void DGUSScreenHandlerMKS::sendInfoScreen(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4) { + dgus.writeStringVar(VP_MSGSTR1, line1); + dgus.writeStringVar(VP_MSGSTR2, line2); + dgus.writeStringVar(VP_MSGSTR3, line3); + dgus.writeStringVar(VP_MSGSTR4, line4); } -void DGUSScreenHandlerMKS::sendinfoscreen_en(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4) { - dgus.writeVariable(VP_MSGSTR1, line1, 32, true); - dgus.writeVariable(VP_MSGSTR2, line2, 32, true); - dgus.writeVariable(VP_MSGSTR3, line3, 32, true); - dgus.writeVariable(VP_MSGSTR4, line4, 32, true); +void DGUSScreenHandlerMKS::sendInfoScreen(const char *line1, const char *line2, const char *line3, const char *line4) { + dgus.writeStringVar(VP_MSGSTR1, line1); + dgus.writeStringVar(VP_MSGSTR2, line2); + dgus.writeStringVar(VP_MSGSTR3, line3); + dgus.writeStringVar(VP_MSGSTR4, line4); } -void DGUSScreenHandlerMKS::sendInfoScreen(const void *line1, const void *line2, const void *line3, const void *line4, uint16_t language) { +void DGUSScreenHandlerMKS::sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4) { + dgus.writeStringVar_P(VP_MSGSTR1, line1); + dgus.writeStringVar_P(VP_MSGSTR2, line2); + dgus.writeStringVar_P(VP_MSGSTR3, line3); + dgus.writeStringVar_P(VP_MSGSTR4, line4); +} + +void DGUSScreenHandlerMKS::sendInfoScreenMKS(const void *line1, const void *line2, const void *line3, const void *line4, const MKS_Language language) { if (language == MKS_English) - DGUSScreenHandlerMKS::sendinfoscreen_en((char *)line1, (char *)line2, (char *)line3, (char *)line4); + DGUSScreenHandlerMKS::sendInfoScreen((char *)line1, (char *)line2, (char *)line3, (char *)line4); else if (language == MKS_SimpleChinese) - DGUSScreenHandlerMKS::sendinfoscreen_ch((uint16_t *)line1, (uint16_t *)line2, (uint16_t *)line3, (uint16_t *)line4); + DGUSScreenHandlerMKS::sendInfoScreen((uint16_t *)line1, (uint16_t *)line2, (uint16_t *)line3, (uint16_t *)line4); } -#endif - void DGUSScreenHandlerMKS::sendFanToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { uint16_t tmp = *(uint8_t *) var.memadr; // +1 -> avoid rounding issues for the display. - // tmp = map(tmp, 0, 255, 0, 100); + //tmp = map(constrain(tmp, 0, 255), 0, 255, 0, 100); dgus.writeVariable(var.VP, tmp); } } void DGUSScreenHandlerMKS::sendBabyStepToDisplay(DGUS_VP_Variable &var) { float value = current_position.z; - value *= cpow(10, 2); + value *= 100; //cpow(10, 2); dgus.writeVariable(VP_SD_Print_Baby, (uint16_t)value); } @@ -113,32 +117,35 @@ void DGUSScreenHandlerMKS::setUint8(DGUS_VP_Variable &var, void *val_ptr) { void DGUSScreenHandlerMKS::sendGbkToDisplay(DGUS_VP_Variable &var) { uint16_t *tmp = (uint16_t*) var.memadr; - dgus.writeVariable(var.VP, tmp, var.size, true); + dgus.writeStringVar(var.VP, tmp, var.size); } void DGUSScreenHandlerMKS::sendStringToDisplay_Language(DGUS_VP_Variable &var) { - if (mks_language_index == MKS_English) { - char *tmp = (char*) var.memadr; - dgus.writeVariable(var.VP, tmp, var.size, true); - } - else if (mks_language_index == MKS_SimpleChinese) { - uint16_t *tmp = (uint16_t *)var.memadr; - dgus.writeVariable(var.VP, tmp, var.size, true); + switch (mks_language_index) { + default: + case MKS_English: { + char *tmp = (char*) var.memadr; + dgus.writeStringVar(var.VP, tmp, var.size); + } break; + case MKS_SimpleChinese: { + uint16_t *tmp = (uint16_t *)var.memadr; + dgus.writeStringVar(var.VP, tmp, var.size); + } break; } } -void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { +void DGUSScreenHandlerMKS::sendTMCSensValue(DGUS_VP_Variable &var) { #if ENABLED(SENSORLESS_HOMING) #if X_HAS_STEALTHCHOP - tmc_step.x = stepperX.homing_threshold(); + tmc_stall_sens.x = stepperX.homing_threshold(); dgus.writeVariable(var.VP, *(int16_t*)var.memadr); #endif #if Y_HAS_STEALTHCHOP - tmc_step.y = stepperY.homing_threshold(); + tmc_stall_sens.y = stepperY.homing_threshold(); dgus.writeVariable(var.VP, *(int16_t*)var.memadr); #endif #if Z_HAS_STEALTHCHOP - tmc_step.z = stepperZ.homing_threshold(); + tmc_stall_sens.z = stepperZ.homing_threshold(); dgus.writeVariable(var.VP, *(int16_t*)var.memadr); #endif #endif @@ -168,7 +175,7 @@ void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { #if ENABLED(DGUS_PRINT_FILENAME) // Send print filename - dgus.writeVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + dgus.writeStringVar(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN); #endif // Setup Confirmation screen @@ -212,7 +219,6 @@ void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { nozzle_park_mks.print_pause_start_flag = 1; nozzle_park_mks.blstatus = true; ExtUI::pausePrint(); - //ExtUI::mks_pausePrint(); } break; @@ -235,7 +241,7 @@ void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { } sendStringToDisplay(var); - dgus.writeVariable(VP_File_Pictutr0 + target_line * 2, dir_icon_val); + dgus.writeVariable(VP_File_Picture0 + target_line * 2, dir_icon_val); } void DGUSScreenHandler::sdCardInserted() { @@ -248,8 +254,8 @@ void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { void DGUSScreenHandler::sdCardRemoved() { if (current_screenID == DGUS_SCREEN_SDFILELIST - || (current_screenID == DGUS_SCREEN_CONFIRM && (confirmVP == VP_SD_AbortPrintConfirmed || confirmVP == VP_SD_FileSelectConfirm)) - || current_screenID == DGUS_SCREEN_SDPRINTMANIPULATION + || (current_screenID == DGUS_SCREEN_CONFIRM && (confirmVP == VP_SD_AbortPrintConfirmed || confirmVP == VP_SD_FileSelectConfirm)) + || current_screenID == DGUS_SCREEN_SDPRINTMANIPULATION ) filelist.refresh(); } @@ -261,12 +267,13 @@ void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { gotoScreen(MKSLCD_SCREEN_PrintDone); } -#else +#else // !HAS_MEDIA + void DGUSScreenHandlerMKS::printReturn(DGUS_VP_Variable& var, void *val_ptr) { - const uint16_t value = BE16_P(val_ptr); - if (value == 0x0F) gotoScreen(DGUS_SCREEN_MAIN); + if (BE16_P(val_ptr) == 0x0F) gotoScreen(DGUS_SCREEN_MAIN); } -#endif // HAS_MEDIA + +#endif void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { uint8_t *tmp = (uint8_t*)val_ptr; @@ -276,10 +283,9 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { // meaning "return to previous screen" DGUS_ScreenID target = (DGUS_ScreenID)tmp[1]; - // when the dgus had reboot, it will enter the DGUS_SCREEN_MAIN page, - // so user can change any page to use this function, an it will check - // if robin nano is printing. when it is, dgus will enter the printing - // page to continue print; + // When the DGUS reboots it enters the DGUS_SCREEN_MAIN page so the user + // can change any page to use this function and it will check whether a print + // job is active. If so DGUS will go to the printing page to continue the job. // //if (printJobOngoing() || printingIsPaused()) { // if (target == MKSLCD_PAUSE_SETTING_MOVE || target == MKSLCD_PAUSE_SETTING_EX @@ -288,7 +294,7 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { // } // else // gotoScreen(MKSLCD_SCREEN_PRINT); - // return; + // return; //} if (target == DGUS_SCREEN_POPUP) { @@ -302,7 +308,7 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { updateNewScreen(target); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } @@ -323,10 +329,7 @@ void DGUSScreenHandlerMKS::zOffsetConfirm(DGUS_VP_Variable &var, void *val_ptr) void DGUSScreenHandlerMKS::getTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t value = BE16_P(val_ptr); - switch (value) { - case 0 ... 1: DGUSAutoTurnOff = (bool)value; break; - default: break; - } + if (value < 2) DGUSAutoTurnOff = (bool)value; } void DGUSScreenHandlerMKS::getMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) { @@ -337,14 +340,13 @@ void DGUSScreenHandlerMKS::getMinExtrudeTemp(DGUS_VP_Variable &var, void *val_pt } void DGUSScreenHandlerMKS::getZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t value = BE16_P(val_ptr); float val_distance = 0; - switch (value) { - case 0: val_distance = 0.01; break; - case 1: val_distance = 0.1; break; - case 2: val_distance = 0.5; break; - case 3: val_distance = 1; break; - default: val_distance = 0.01; break; + switch (BE16_P(val_ptr)) { + default: + case 0: val_distance = 0.01f; break; + case 1: val_distance = 0.10f; break; + case 2: val_distance = 0.50f; break; + case 3: val_distance = 1.00f; break; } ZOffset_distance = val_distance; } @@ -354,11 +356,10 @@ void DGUSScreenHandlerMKS::getManualMovestep(DGUS_VP_Variable &var, void *val_pt } void DGUSScreenHandlerMKS::eepromControl(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t eep_flag = BE16_P(val_ptr); - switch (eep_flag) { + switch (BE16_P(val_ptr)) { case 0: settings.save(); - settings.load(); // load eeprom data to check the data is right + //settings.load(); // Load EEPROM to validate the data gotoScreen(MKSLCD_SCREEN_EEP_Config); break; @@ -366,56 +367,39 @@ void DGUSScreenHandlerMKS::eepromControl(DGUS_VP_Variable &var, void *val_ptr) { settings.reset(); gotoScreen(MKSLCD_SCREEN_EEP_Config); break; - - default: break; } } void DGUSScreenHandlerMKS::zOffsetSelect(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t z = BE16_P(val_ptr); - switch (z) { - case 0: Z_distance = 0.01; break; - case 1: Z_distance = 0.1; break; - case 2: Z_distance = 0.5; break; - default: Z_distance = 1; break; + switch (BE16_P(val_ptr)) { + case 0: Z_distance = 0.01f; break; + case 1: Z_distance = 0.10f; break; + case 2: Z_distance = 0.50f; break; + case 3: + default: Z_distance = 1.00f; break; } } void DGUSScreenHandlerMKS::getOffsetValue(DGUS_VP_Variable &var, void *val_ptr) { - #if HAS_BED_PROBE - const int32_t value = BE32_P(val_ptr); - const float Offset = value / 100.0f; - + const float offset = BE32_P(val_ptr) / 100.0f; switch (var.VP) { default: break; - case VP_OFFSET_X: probe.offset.x = Offset; break; - case VP_OFFSET_Y: probe.offset.y = Offset; break; - case VP_OFFSET_Z: probe.offset.z = Offset; break; + case VP_OFFSET_X: probe.offset.x = offset; break; + case VP_OFFSET_Y: probe.offset.y = offset; break; + case VP_OFFSET_Z: probe.offset.z = offset; break; } settings.save(); #endif } void DGUSScreenHandlerMKS::languageChange(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t lag_flag = BE16_P(val_ptr); - switch (lag_flag) { - case MKS_SimpleChinese: - languageDisplay(MKS_SimpleChinese); - mks_language_index = MKS_SimpleChinese; - dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_Choose); - dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_NoChoose); - settings.save(); - break; - case MKS_English: - languageDisplay(MKS_English); - mks_language_index = MKS_English; - dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_NoChoose); - dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_Choose); - settings.save(); - break; - default: break; - } + const MKS_Language lang = (MKS_Language)BE16_P(val_ptr); + if (lang != MKS_SimpleChinese && lang != MKS_English) return; + mks_language_index = lang; + updateDisplayLanguage(); + languagePInit(); + settings.save(); } #if ENABLED(MESH_BED_LEVELING) @@ -426,8 +410,8 @@ void DGUSScreenHandlerMKS::levelControl(DGUS_VP_Variable &var, void *val_ptr) { #if ENABLED(MESH_BED_LEVELING) auto cs = getCurrentScreen(); #endif - const uint16_t lev_but = BE16_P(val_ptr); - switch (lev_but) { + + switch (BE16_P(val_ptr)) { case 0: #if ENABLED(AUTO_BED_LEVELING_BILINEAR) @@ -442,22 +426,27 @@ void DGUSScreenHandlerMKS::levelControl(DGUS_VP_Variable &var, void *val_ptr) { mesh_point_count = GRID_MAX_POINTS; - if (mks_language_index == MKS_English) { - const char level_buf_en[] = "Start Level"; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en, 32, true); - } - else if (mks_language_index == MKS_SimpleChinese) { - const uint16_t level_buf_ch[] = {0xAABF, 0xBCCA, 0xF7B5, 0xBDC6, 0x2000}; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch, 32, true); + switch (mks_language_index) { + default: + case MKS_English: { + const char level_buf_en[] = "Start Leveling"; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_en); + } break; + case MKS_SimpleChinese: { + const uint16_t level_buf_ch[] = { 0xAABF, 0xBCCA, 0xF7B5, 0xBDC6, 0x2000 }; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_ch); + } break; } cs = getCurrentScreen(); if (cs != MKSLCD_AUTO_LEVEL) gotoScreen(MKSLCD_AUTO_LEVEL); + #else gotoScreen(MKSLCD_SCREEN_LEVEL); #endif + break; case 1: @@ -470,48 +459,40 @@ void DGUSScreenHandlerMKS::levelControl(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandlerMKS::meshLevelDistanceConfig(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t mesh_dist = BE16_P(val_ptr); - switch (mesh_dist) { - case 0: mesh_adj_distance = 0.01; break; - case 1: mesh_adj_distance = 0.1; break; - case 2: mesh_adj_distance = 1; break; - default: mesh_adj_distance = 0.1; break; + switch (BE16_P(val_ptr)) { + case 0: mesh_adj_distance = 0.01f; break; + case 1: mesh_adj_distance = 0.10f; break; + case 2: mesh_adj_distance = 1.00f; break; + default: mesh_adj_distance = 0.10f; break; } } void DGUSScreenHandlerMKS::meshLevel(DGUS_VP_Variable &var, void *val_ptr) { #if ENABLED(MESH_BED_LEVELING) - const uint16_t mesh_val = BE16_P(val_ptr); - // static uint8_t a_first_level = 1; char cmd_buf[30]; float offset = mesh_adj_distance; int16_t integer, Deci, Deci2; if (!queue.ring_buffer.empty()) return; - switch (mesh_val) { + switch (BE16_P(val_ptr)) { case 0: offset = mesh_adj_distance; integer = offset; // get int - Deci = (offset * 10); - Deci = Deci % 10; - Deci2 = offset * 100; - Deci2 = Deci2 % 10; + Deci = (offset * 10) % 10; + Deci2 = (offset * 100) % 10; soft_endstop._enabled = false; queue.enqueue_now(F("G91")); snprintf_P(cmd_buf, 30, PSTR("G1 Z%d.%d%d"), integer, Deci, Deci2); queue.enqueue_one_now(cmd_buf); queue.enqueue_now(F("G90")); - //soft_endstop._enabled = true; break; case 1: offset = mesh_adj_distance; integer = offset; // get int - Deci = (offset * 10); - Deci = Deci % 10; - Deci2 = offset * 100; - Deci2 = Deci2 % 10; + Deci = (offset * 10) % 10; + Deci2 = (offset * 100) % 10; soft_endstop._enabled = false; queue.enqueue_now(F("G91")); snprintf_P(cmd_buf, 30, PSTR("G1 Z-%d.%d%d"), integer, Deci, Deci2); @@ -521,42 +502,49 @@ void DGUSScreenHandlerMKS::meshLevel(DGUS_VP_Variable &var, void *val_ptr) { case 2: if (mesh_point_count == GRID_MAX_POINTS) { // The first point - - queue.enqueue_now(F("G28")); - queue.enqueue_now(F("G29S1")); + queue.enqueue_now(F("G28\nG29S1")); mesh_point_count--; - if (mks_language_index == MKS_English) { - const char level_buf_en1[] = "Next Point"; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en1, 32, true); - } - else if (mks_language_index == MKS_SimpleChinese) { - const uint16_t level_buf_ch1[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch1, 32, true); + switch (mks_language_index) { + default: + case MKS_English: { + const char level_buf_en1[] = "Next Point"; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_en1); + } break; + case MKS_SimpleChinese: { + const uint16_t level_buf_ch1[] = { 0xC2CF, 0xBBD2, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_ch1); + } break; } } - else if (mesh_point_count > 1) { // 倒数第二个点 + else if (mesh_point_count > 1) { queue.enqueue_now(F("G29S2")); mesh_point_count--; - if (mks_language_index == MKS_English) { - const char level_buf_en2[] = "Next Point"; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); - } - else if (mks_language_index == MKS_SimpleChinese) { - const uint16_t level_buf_ch2[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); + switch (mks_language_index) { + default: + case MKS_English: { + const char level_buf_en2[] = "Next Point"; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_en2); + } break; + case MKS_SimpleChinese: { + const uint16_t level_buf_ch2[] = { 0xC2CF, 0xBBD2, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_ch2); + } break; } } else if (mesh_point_count == 1) { queue.enqueue_now(F("G29S2")); mesh_point_count--; - if (mks_language_index == MKS_English) { - const char level_buf_en2[] = "Leveling Done"; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); - } - else if (mks_language_index == MKS_SimpleChinese) { - const uint16_t level_buf_ch2[] = {0xF7B5, 0xBDC6, 0xEACD, 0xC9B3, 0x2000}; - dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); + switch (mks_language_index) { + default: + case MKS_English: { + const char level_buf_en2[] = "Leveling Done"; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_en2); + } break; + case MKS_SimpleChinese: { + const uint16_t level_buf_ch2[] = { 0xF7B5, 0xBDC6, 0xEACD, 0xC9B3, 0x2000 }; + dgus.writeStringVar(VP_AutoLevel_1_Dis, level_buf_ch2); + } break; } settings.save(); } @@ -568,8 +556,7 @@ void DGUSScreenHandlerMKS::meshLevel(DGUS_VP_Variable &var, void *val_ptr) { } break; - default: - break; + default: break; } #endif // MESH_BED_LEVELING } @@ -579,8 +566,7 @@ void DGUSScreenHandlerMKS::sdFileBack(DGUS_VP_Variable&, void*) { } void DGUSScreenHandlerMKS::lcdBLKAdjust(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t lcd_val = BE16_P(val_ptr); - lcd_default_light = constrain(lcd_val, 10, 100); + lcd_default_light = constrain(BE16_P(val_ptr), 10, 100); const uint16_t lcd_data[2] = { lcd_default_light, lcd_default_light }; dgus.writeVariable(0x0082, &lcd_data, 5, true); @@ -631,105 +617,90 @@ void DGUSScreenHandlerMKS::manualAssistLeveling(DGUS_VP_Variable &var, void *val break; } - if (WITHIN(point_val, 0x0002, 0x0005)) { - //queue.enqueue_now(F("G28Z")); + if (WITHIN(point_val, 0x0002, 0x0005)) queue.enqueue_now(F("G1Z-10")); - } } -#define mks_min(a, b) ((a) < (b)) ? (a) : (b) -#define mks_max(a, b) ((a) > (b)) ? (a) : (b) -void DGUSScreenHandlerMKS::tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { - #if ANY(HAS_TRINAMIC_CONFIG, HAS_STEALTHCHOP) +#if ANY(HAS_TRINAMIC_CONFIG, HAS_STEALTHCHOP) + + void DGUSScreenHandlerMKS::tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t tmc_val = BE16_P(val_ptr); - #endif + switch (var.VP) { + case VP_TMC_X_SENS: + #if USE_SENSORLESS && X_HAS_STEALTHCHOP + stepperX.homing_threshold(_MIN(tmc_val, 255)); + settings.save(); + tmc_stall_sens.x = stepperX.homing_threshold(); + #endif + break; + case VP_TMC_Y_SENS: + #if USE_SENSORLESS && Y_HAS_STEALTHCHOP + stepperY.homing_threshold(_MIN(tmc_val, 255)); + settings.save(); + tmc_stall_sens.y = stepperY.homing_threshold(); + #endif + break; + case VP_TMC_Z_SENS: + #if USE_SENSORLESS && Z_HAS_STEALTHCHOP + stepperZ.homing_threshold(_MIN(tmc_val, 255)); + settings.save(); + tmc_stall_sens.z = stepperZ.homing_threshold(); + #endif + break; + case VP_TMC_X_Current: + #if X_IS_TRINAMIC + stepperX.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_X1_Current: + #if X2_IS_TRINAMIC + stepperX2.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_Y_Current: + #if Y_IS_TRINAMIC + stepperY.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_Y1_Current: + #if Y2_IS_TRINAMIC + stepperY2.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_Z_Current: + #if Z_IS_TRINAMIC + stepperZ.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_Z1_Current: + #if Z2_IS_TRINAMIC + stepperZ2.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_E0_Current: + #if E0_IS_TRINAMIC + stepperE0.rms_current(tmc_val); + settings.save(); + #endif + break; + case VP_TMC_E1_Current: + #if E1_IS_TRINAMIC + stepperE1.rms_current(tmc_val); + settings.save(); + #endif + break; - switch (var.VP) { - case VP_TMC_X_STEP: - #if USE_SENSORLESS - #if X_HAS_STEALTHCHOP - stepperX.homing_threshold(mks_min(tmc_val, 255)); - settings.save(); - //tmc_step.x = stepperX.homing_threshold(); - #endif - #endif - break; - case VP_TMC_Y_STEP: - #if USE_SENSORLESS - #if Y_HAS_STEALTHCHOP - stepperY.homing_threshold(mks_min(tmc_val, 255)); - settings.save(); - //tmc_step.y = stepperY.homing_threshold(); - #endif - #endif - break; - case VP_TMC_Z_STEP: - #if USE_SENSORLESS - #if Z_HAS_STEALTHCHOP - stepperZ.homing_threshold(mks_min(tmc_val, 255)); - settings.save(); - //tmc_step.z = stepperZ.homing_threshold(); - #endif - #endif - break; - case VP_TMC_X_Current: - #if AXIS_IS_TMC(X) - stepperX.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_X1_Current: - #if AXIS_IS_TMC(X2) - stepperX2.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_Y_Current: - #if AXIS_IS_TMC(Y) - stepperY.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_Y1_Current: - #if AXIS_IS_TMC(X2) - stepperY2.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_Z_Current: - #if AXIS_IS_TMC(Z) - stepperZ.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_Z1_Current: - #if AXIS_IS_TMC(Z2) - stepperZ2.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_E0_Current: - #if AXIS_IS_TMC(E0) - stepperE0.rms_current(tmc_val); - settings.save(); - #endif - break; - case VP_TMC_E1_Current: - #if AXIS_IS_TMC(E1) - stepperE1.rms_current(tmc_val); - settings.save(); - #endif - break; - - default: - break; + default: break; + } } - #if USE_SENSORLESS - TERN_(X_HAS_STEALTHCHOP, tmc_step.x = stepperX.homing_threshold()); - TERN_(Y_HAS_STEALTHCHOP, tmc_step.y = stepperY.homing_threshold()); - TERN_(Z_HAS_STEALTHCHOP, tmc_step.z = stepperZ.homing_threshold()); - #endif -} + +#endif // HAS_TRINAMIC_CONFIG || HAS_STEALTHCHOP void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { int16_t movevalue = BE16_P(val_ptr); @@ -742,345 +713,224 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (!print_job_timer.isPaused() && !queue.ring_buffer.empty()) return; - char axiscode; - uint16_t speed = manual_feedrate_mm_m.x; // Default feedrate for manual moves + char axiscode = '\0'; + uint16_t speed = 0; switch (var.VP) { // switch X Y Z or Home - default: return; #if HAS_X_AXIS case VP_MOVE_X: - axiscode = 'X'; - if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + if (!ExtUI::canMove(ExtUI::axis_t::X)) return; + axiscode = 'X'; speed = manual_feedrate_mm_m.x; break; #endif #if HAS_Y_AXIS case VP_MOVE_Y: - axiscode = 'Y'; - speed = manual_feedrate_mm_m.y; - if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; + if (!ExtUI::canMove(ExtUI::axis_t::Y)) return; + axiscode = 'Y'; speed = manual_feedrate_mm_m.y; break; #endif #if HAS_Z_AXIS case VP_MOVE_Z: - axiscode = 'Z'; - speed = manual_feedrate_mm_m.z; - if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; + if (!ExtUI::canMove(ExtUI::axis_t::Z)) return; + axiscode = 'Z'; speed = manual_feedrate_mm_m.z; break; #endif - case VP_MOTOR_LOCK_UNLOK: - movevalue = 5; - break; + case VP_MOTOR_LOCK_UNLOCK: movevalue = 5; break; - case VP_HOME_ALL: // only used for homing - axiscode = '\0'; - movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. - break; + // Ignore value sent from display, this VP is _ONLY_ for homing. + case VP_HOME_ALL: axiscode = '\0'; movevalue = 0; break; #if HAS_X_AXIS - case VP_X_HOME: - axiscode = 'X'; - movevalue = 0; - break; + case VP_X_HOME: axiscode = 'X'; movevalue = 0; break; #endif - #if HAS_Y_AXIS - case VP_Y_HOME: - axiscode = 'Y'; - movevalue = 0; - break; + case VP_Y_HOME: axiscode = 'Y'; movevalue = 0; break; #endif - #if HAS_Z_AXIS - case VP_Z_HOME: - axiscode = 'Z'; - movevalue = 0; - break; + case VP_Z_HOME: axiscode = 'Z'; movevalue = 0; break; #endif } - if (movevalue != 0 && movevalue != 5) { // get move distance - switch (movevalue) { - case 0x0001: movevalue = manualMoveStep; break; - case 0x0002: movevalue = -manualMoveStep; break; - default: movevalue = 0; break; - } - } + if WITHIN(movevalue, 1, 4) // get move distance + movevalue == 1 ? movevalue = manualMoveStep : movevalue = -manualMoveStep; if (!movevalue) { - // char buf[6] = "G28 X"; - // buf[4] = axiscode; - - char buf[6]; - sprintf(buf, "G28 %c", axiscode); - queue.enqueue_one_now(buf); + queue.enqueue_one_now(TS(F("G28"), axiscode)); forceCompleteUpdate(); return; } - else if (movevalue == 5) { - char buf[6]; - snprintf_P(buf,6,PSTR("M84 %c"), axiscode); - queue.enqueue_one_now(buf); + + if (movevalue == 5) { + queue.enqueue_one_now(TS(F("M84"), axiscode)); forceCompleteUpdate(); return; } - else { - // movement - const bool old_relative_mode = relative_mode; - if (!relative_mode) queue.enqueue_now(F("G91")); - char buf[32]; // G1 X9999.99 F12345 - //const uint16_t backup_speed = MMS_TO_MMM(feedrate_mm_s); - char sign[] = "\0"; - int16_t value = movevalue / 100; - if (movevalue < 0) { value = -value; sign[0] = '-'; } - const int16_t fraction = ABS(movevalue) % 100; - snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); - queue.enqueue_one_now(buf); - //if (backup_speed != speed) { - // snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); - // queue.enqueue_one_now(buf); - //} + // Movement + const bool old_relative_mode = relative_mode; + if (!relative_mode) queue.enqueue_now(F("G91")); - //while (!enqueue_and_echo_command(buf)) idle(); + // TODO: Use MString / TS() ... - if (!old_relative_mode) queue.enqueue_now(F("G90")); - } + char buf[32]; // G1 X9999.99 F12345 + char sign[] = "\0"; + int16_t value = movevalue / 100; + if (movevalue < 0) { value = -value; sign[0] = '-'; } + const int16_t fraction = ABS(movevalue) % 100; + snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); + queue.enqueue_one_now(buf); + + if (!old_relative_mode) queue.enqueue_now(F("G90")); forceCompleteUpdate(); - - cannotmove: - return; } void DGUSScreenHandlerMKS::getParkPos(DGUS_VP_Variable &var, void *val_ptr) { const int16_t pos = BE16_P(val_ptr); - switch (var.VP) { case VP_X_PARK_POS: mks_park_pos.x = pos; break; case VP_Y_PARK_POS: mks_park_pos.y = pos; break; case VP_Z_PARK_POS: mks_park_pos.z = pos; break; - default: break; } - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleChangeLevelPoint(DGUS_VP_Variable &var, void *val_ptr) { - const int16_t raw = BE16_P(val_ptr); - - *(int16_t*)var.memadr = raw; - + *(int16_t*)var.memadr = BE16_P(val_ptr); settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } #if ENABLED(EDITABLE_STEPS_PER_UNIT) void DGUSScreenHandlerMKS::handleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t raw = BE16_P(val_ptr); - const float value = (float)raw; - - ExtUI::axis_t axis; + const float value = (float)BE16_P(val_ptr); switch (var.VP) { - default: return; - case VP_X_STEP_PER_MM: axis = ExtUI::axis_t::X; break; - case VP_Y_STEP_PER_MM: axis = ExtUI::axis_t::Y; break; - case VP_Z_STEP_PER_MM: axis = ExtUI::axis_t::Z; break; - } - ExtUI::setAxisSteps_per_mm(value, axis); - settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - } - - void DGUSScreenHandlerMKS::handleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t raw = BE16_P(val_ptr); - const float value = (float)raw; - - ExtUI::extruder_t extruder; - switch (var.VP) { - default: return; + case VP_X_STEP_PER_MM: ExtUI::setAxisSteps_per_mm(value, ExtUI::axis_t::X); break; + case VP_Y_STEP_PER_MM: ExtUI::setAxisSteps_per_mm(value, ExtUI::axis_t::Y); break; + case VP_Z_STEP_PER_MM: ExtUI::setAxisSteps_per_mm(value, ExtUI::axis_t::Z); break; #if HAS_HOTEND - case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; + case VP_E0_STEP_PER_MM: ExtUI::setAxisSteps_per_mm(value, ExtUI::extruder_t::E0); break; #endif #if HAS_MULTI_HOTEND - case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + case VP_E1_STEP_PER_MM: ExtUI::setAxisSteps_per_mm(value, ExtUI::extruder_t::E1); break; #endif } - ExtUI::setAxisSteps_per_mm(value, extruder); settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } #endif // EDITABLE_STEPS_PER_UNIT void DGUSScreenHandlerMKS::handleMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t raw = BE16_P(val_ptr); - const float value = (float)raw; - - ExtUI::axis_t axis; + const float value = (float)BE16_P(val_ptr); switch (var.VP) { - case VP_X_MAX_SPEED: axis = ExtUI::axis_t::X; break; - case VP_Y_MAX_SPEED: axis = ExtUI::axis_t::Y; break; - case VP_Z_MAX_SPEED: axis = ExtUI::axis_t::Z; break; - default: return; + case VP_X_MAX_SPEED: ExtUI::setAxisMaxFeedrate_mm_s(value, ExtUI::axis_t::X); break; + case VP_Y_MAX_SPEED: ExtUI::setAxisMaxFeedrate_mm_s(value, ExtUI::axis_t::Y); break; + case VP_Z_MAX_SPEED: ExtUI::setAxisMaxFeedrate_mm_s(value, ExtUI::axis_t::Z); break; + #if HAS_HOTEND + case VP_E0_MAX_SPEED: ExtUI::setAxisMaxFeedrate_mm_s(value, ExtUI::extruder_t::E0); break; + #endif + #if HAS_MULTI_HOTEND + case VP_E1_MAX_SPEED: ExtUI::setAxisMaxFeedrate_mm_s(value, ExtUI::extruder_t::E1); break; + #endif } - ExtUI::setAxisMaxFeedrate_mm_s(value, axis); settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel -} - -void DGUSScreenHandlerMKS::handleExtruderMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t raw = BE16_P(val_ptr); - const float value = (float)raw; - - ExtUI::extruder_t extruder; - switch (var.VP) { - default: return; - #if HAS_HOTEND - case VP_E0_MAX_SPEED: extruder = ExtUI::extruder_t::E0; break; - #endif - #if HAS_MULTI_HOTEND - #endif - case VP_E1_MAX_SPEED: extruder = ExtUI::extruder_t::E1; break; - } - ExtUI::setAxisMaxFeedrate_mm_s(value, extruder); - settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleMaxAccChange(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t raw = BE16_P(val_ptr); - const float value = (float)raw; - - ExtUI::axis_t axis; - switch (var.VP) { - default: return; - case VP_X_ACC_MAX_SPEED: axis = ExtUI::axis_t::X; break; - case VP_Y_ACC_MAX_SPEED: axis = ExtUI::axis_t::Y; break; - case VP_Z_ACC_MAX_SPEED: axis = ExtUI::axis_t::Z; break; - } - ExtUI::setAxisMaxAcceleration_mm_s2(value, axis); - settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel -} - -void DGUSScreenHandlerMKS::handleExtruderAccChange(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t raw = BE16_P(val_ptr); - float value = (float)raw; - ExtUI::extruder_t extruder; + const float value = (float)BE16_P(val_ptr); switch (var.VP) { default: return; + case VP_X_MAX_ACC: ExtUI::setAxisMaxAcceleration_mm_s2(value, ExtUI::axis_t::X); break; + case VP_Y_MAX_ACC: ExtUI::setAxisMaxAcceleration_mm_s2(value, ExtUI::axis_t::Y); break; + case VP_Z_MAX_ACC: ExtUI::setAxisMaxAcceleration_mm_s2(value, ExtUI::axis_t::Z); break; #if HAS_HOTEND - case VP_E0_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E0; settings.load(); break; + case VP_E0_MAX_ACC: ExtUI::setAxisMaxAcceleration_mm_s2(value, ExtUI::extruder_t::E0); break; #endif #if HAS_MULTI_HOTEND - case VP_E1_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E1; settings.load(); break; + case VP_E1_MAX_ACC: ExtUI::setAxisMaxAcceleration_mm_s2(value, ExtUI::extruder_t::E1); break; #endif } - ExtUI::setAxisMaxAcceleration_mm_s2(value, extruder); settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleTravelAccChange(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t travel = BE16_P(val_ptr); - planner.settings.travel_acceleration = (float)travel; - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + planner.settings.travel_acceleration = (float)BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleFeedRateMinChange(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t t = BE16_P(val_ptr); - planner.settings.min_feedrate_mm_s = (float)t; - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + planner.settings.min_feedrate_mm_s = (float)BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleMin_T_F(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t t_f = BE16_P(val_ptr); - planner.settings.min_travel_feedrate_mm_s = (float)t_f; - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + planner.settings.min_travel_feedrate_mm_s = (float)BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::handleAccChange(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t acc = BE16_P(val_ptr); - planner.settings.acceleration = (float)acc; - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + planner.settings.acceleration = (float)BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } #if ENABLED(PREVENT_COLD_EXTRUSION) void DGUSScreenHandlerMKS::handleGetExMinTemp(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t ex_min_temp = BE16_P(val_ptr); - thermalManager.extrude_min_temp = ex_min_temp; - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + thermalManager.extrude_min_temp = BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } #endif #if HAS_PID_HEATING + void DGUSScreenHandler::handleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t rawvalue = BE16_P(val_ptr); - const float value = float(rawvalue); + const float value = (float)BE16_P(val_ptr); float newvalue = 0; switch (var.VP) { default: return; - #if HAS_HOTEND - case VP_E0_PID_P: newvalue = value; break; - case VP_E0_PID_I: newvalue = scalePID_i(value); break; - case VP_E0_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HAS_MULTI_HOTEND - case VP_E1_PID_P: newvalue = value; break; - case VP_E1_PID_I: newvalue = scalePID_i(value); break; - case VP_E1_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HAS_HEATED_BED - case VP_BED_PID_P: newvalue = value; break; - case VP_BED_PID_I: newvalue = scalePID_i(value); break; - case VP_BED_PID_D: newvalue = scalePID_d(value); break; - #endif + #if HAS_HOTEND + case VP_E0_PID_P: newvalue = value; break; + case VP_E0_PID_I: newvalue = scalePID_i(value); break; + case VP_E0_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_MULTI_HOTEND + case VP_E1_PID_P: newvalue = value; break; + case VP_E1_PID_I: newvalue = scalePID_i(value); break; + case VP_E1_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: newvalue = value; break; + case VP_BED_PID_I: newvalue = scalePID_i(value); break; + case VP_BED_PID_D: newvalue = scalePID_d(value); break; + #endif } *(float *)var.memadr = newvalue; settings.save(); - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } + #endif // HAS_PID_HEATING #if ENABLED(BABYSTEPPING) + void DGUSScreenHandler::handleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { - const float step = ZOffset_distance; - - const uint16_t flag = BE16_P(val_ptr); - switch (flag) { + switch (BE16_P(val_ptr)) { case 0: - if (step == 0.01) - queue.inject(F("M290 Z-0.01")); - else if (step == 0.1) - queue.inject(F("M290 Z-0.1")); - else if (step == 0.5) - queue.inject(F("M290 Z-0.5")); - else if (step == 1) - queue.inject(F("M290 Z-1")); - else - queue.inject(F("M290 Z-0.01")); - + queue.inject(TS(F("M290 Z"), -ZOffset_distance)); z_offset_add -= ZOffset_distance; break; case 1: - if (step == 0.01) - queue.inject(F("M290 Z0.01")); - else if (step == 0.1) - queue.inject(F("M290 Z0.1")); - else if (step == 0.5) - queue.inject(F("M290 Z0.5")); - else if (step == 1) - queue.inject(F("M290 Z1")); - else - queue.inject(F("M290 Z-0.01")); - + queue.inject(TS(F("M290 Z"), ZOffset_distance)); z_offset_add += ZOffset_distance; break; @@ -1088,22 +938,17 @@ void DGUSScreenHandlerMKS::handleAccChange(DGUS_VP_Variable &var, void *val_ptr) } forceCompleteUpdate(); } + #endif // BABYSTEPPING void DGUSScreenHandlerMKS::getManualFilament(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t len = BE16_P(val_ptr); - const float value = (float)len; - - distanceFilament = value; - - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + distanceFilament = (float)BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::getManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr) { - const uint16_t len = BE16_P(val_ptr); - filamentSpeed_mm_s = len; - - skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + filamentSpeed_mm_s = BE16_P(val_ptr); + skipVP = var.VP; // Don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandlerMKS::filamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir) { @@ -1145,20 +990,21 @@ void DGUSScreenHandlerMKS::filamentLoadUnload(DGUS_VP_Variable &var, void *val_p #if ALL(HAS_HOTEND, PREVENT_COLD_EXTRUSION) if (hotend_too_cold) { - if (thermalManager.targetTooColdToExtrude(hotend_too_cold - 1)) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, hotend_too_cold - 1); - sendInfoScreen(F("NOTICE"), nullptr, F("Please wait."), F("Nozzle heating!"), true, true, true, true); + if (thermalManager.targetTooColdToExtrude(hotend_too_cold - 1)) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, hotend_too_cold - 1); + sendInfoScreenMKS(F("NOTICE"), nullptr, F("Please wait."), F("Nozzle heating!"), MKS_English); setupConfirmAction(nullptr); gotoScreen(DGUS_SCREEN_POPUP); } #endif if (swap_tool) { - char buf[30]; - snprintf_P(buf, 30 + char buf[30]; // TODO: Use MString / TS() + snprintf_P(buf, 30, #if ANY(HAS_MULTI_HOTEND, SINGLENOZZLE) - , PSTR("M1002T%cE%dF%d"), char('0' + swap_tool - 1) + PSTR("M1002T%cE%dF%d"), char('0' + swap_tool - 1) #else - , PSTR("M1002E%dF%d") + PSTR("M1002E%dF%d") #endif , (int)distanceFilament * filamentDir, filamentSpeed_mm_s * 60 ); @@ -1173,7 +1019,7 @@ void DGUSScreenHandlerMKS::filamentLoadUnload(DGUS_VP_Variable &var, void *val_p void GcodeSuite::M1002() { #if ANY(HAS_MULTI_HOTEND, SINGLENOZZLE) { - char buf[3]; + char buf[3]; // TODO: Use MString / TS() sprintf_P(buf, PSTR("T%c"), char('0' + parser.intval('T'))); process_subcommands_now(buf); } @@ -1181,11 +1027,13 @@ void GcodeSuite::M1002() { const uint8_t old_axis_relative = axis_relative; set_e_relative(); // M83 + { - char buf[20]; + char buf[20]; // TODO: Use MString / TS() snprintf_P(buf, 20, PSTR("G1E%dF%d"), parser.intval('E'), parser.intval('F')); process_subcommands_now(buf); } + axis_relative = old_axis_relative; } @@ -1200,7 +1048,6 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) void DGUSScreenHandler::handleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { - uint8_t e_temp = 0; filament_data.heated = false; uint16_t preheat_option = BE16_P(val_ptr); if (preheat_option >= 10) { // Unload filament type @@ -1213,6 +1060,7 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) else // Cancel filament operation filament_data.action = 0; + uint8_t e_temp = 0; switch (preheat_option) { case 0: // Load PLA #ifdef PREHEAT_1_TEMP_HOTEND @@ -1220,7 +1068,9 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) #endif break; case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + #ifdef PREHEAT_2_TEMP_HOTEND + e_temp = PREHEAT_2_TEMP_HOTEND; + #endif break; case 2: // Load PET #ifdef PREHEAT_3_TEMP_HOTEND @@ -1234,35 +1084,31 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) break; case 9: // Cool down default: - e_temp = 0; - break; + e_temp = 0; break; } if (filament_data.action == 0) { // Go back to utility screen - #if HAS_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); - #endif - #if HAS_MULTI_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); - #endif + TERN_(HAS_EXTRUDERS, thermalManager.setTargetHotend(e_temp, 0)); + TERN_(HAS_MULTI_EXTRUDER, thermalManager.setTargetHotend(e_temp, 1)); gotoScreen(DGUS_SCREEN_UTILITY); + return; } - else { // Go to the preheat screen to show the heating progress - switch (var.VP) { - default: return; - #if HAS_HOTEND - case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - #if HAS_MULTI_HOTEND - case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - } + + // Go to the preheat screen to show the heating progress + switch (var.VP) { + default: return; + #if HAS_EXTRUDERS + case VP_E0_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = 0; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + #if HAS_MULTI_EXTRUDER + case VP_E1_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = 1; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif } } @@ -1278,7 +1124,7 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) if (!filament_data.heated) { filament_data.heated = true; } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; } else { // unload filament if (!filament_data.heated) { @@ -1287,14 +1133,14 @@ void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) } // Before unloading extrude to prevent jamming if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; filament_data.purge_length -= movevalue; } else { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) - movevalue; } } - ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0); } } @@ -1315,18 +1161,19 @@ bool DGUSScreenHandlerMKS::loop() { if (language_times != 0) { languagePInit(); - languageDisplay(mks_language_index); + updateDisplayLanguage(); language_times--; } #if ENABLED(SHOW_BOOTSCREEN) + static bool booted = false; if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) { booted = true; #if USE_SENSORLESS - TERN_(X_HAS_STEALTHCHOP, tmc_step.x = stepperX.homing_threshold()); - TERN_(Y_HAS_STEALTHCHOP, tmc_step.y = stepperY.homing_threshold()); - TERN_(Z_HAS_STEALTHCHOP, tmc_step.z = stepperZ.homing_threshold()); + TERN_(X_HAS_STEALTHCHOP, tmc_stall_sens.x = stepperX.homing_threshold()); + TERN_(Y_HAS_STEALTHCHOP, tmc_stall_sens.y = stepperY.homing_threshold()); + TERN_(Z_HAS_STEALTHCHOP, tmc_stall_sens.z = stepperZ.homing_threshold()); #endif #if ENABLED(PREVENT_COLD_EXTRUSION) @@ -1347,24 +1194,15 @@ bool DGUSScreenHandlerMKS::loop() { #if ENABLED(DGUS_MKS_RUNOUT_SENSOR) if (booted && printingIsActive()) runoutIdle(); #endif + #endif // SHOW_BOOTSCREEN return isScreenComplete(); } void DGUSScreenHandlerMKS::languagePInit() { - switch (mks_language_index) { - case MKS_SimpleChinese: - dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_Choose); - dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_NoChoose); - break; - case MKS_English: - dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_NoChoose); - dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_Choose); - break; - default: - break; - } + dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)(mks_language_index == MKS_English ? MKS_Language_NoChoose : MKS_Language_Choose)); + dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)(mks_language_index == MKS_English ? MKS_Language_Choose : MKS_Language_NoChoose)); } void DGUSScreenHandlerMKS::extrudeLoadInit() { @@ -1397,542 +1235,550 @@ void DGUSScreenHandlerMKS::runoutIdle() { queue.inject(F("M25")); gotoScreen(MKSLCD_SCREEN_PAUSE); - sendInfoScreen(F("NOTICE"), nullptr, F("Please change filament!"), nullptr, true, true, true, true); + sendInfoScreenMKS(F("NOTICE"), nullptr, F("Please change filament!"), nullptr, MKS_English); //setupConfirmAction(nullptr); gotoScreen(DGUS_SCREEN_POPUP); break; case UNRUNOUT_STATUS: - if (FILAMENT_IS_OUT()) - runout_mks.runout_status = RUNOUT_STATUS; + if (FILAMENT_IS_OUT()) runout_mks.runout_status = RUNOUT_STATUS; break; case RUNOUT_BEGIN_STATUS: - if (!FILAMENT_IS_OUT()) - runout_mks.runout_status = RUNOUT_WAITING_STATUS; + if (!FILAMENT_IS_OUT()) runout_mks.runout_status = RUNOUT_WAITING_STATUS; break; case RUNOUT_WAITING_STATUS: - if (FILAMENT_IS_OUT()) - runout_mks.runout_status = RUNOUT_BEGIN_STATUS; + if (FILAMENT_IS_OUT()) runout_mks.runout_status = RUNOUT_BEGIN_STATUS; break; default: break; } - #endif + #endif // DGUS_MKS_RUNOUT_SENSOR } -void DGUSScreenHandlerMKS::languageDisplay(uint8_t var) { - if (var == MKS_English) { - const char home_buf_en[] = "Home"; - dgus.writeVariable(VP_HOME_Dis, home_buf_en, 32, true); +void DGUSScreenHandlerMKS::updateDisplayLanguage() { + switch (mks_language_index) { + case MKS_English : { + const char home_buf_en[] = "Home"; + dgus.writeStringVar(VP_HOME_Dis, home_buf_en); - const char setting_buf_en[] = "Setting"; - dgus.writeVariable(VP_Setting_Dis, setting_buf_en, 32, true); + const char setting_buf_en[] = "Settings"; + dgus.writeStringVar(VP_Setting_Dis, setting_buf_en); - const char Tool_buf_en[] = "Tool"; - dgus.writeVariable(VP_Tool_Dis, Tool_buf_en, 32, true); + const char Tool_buf_en[] = "Tools"; + dgus.writeStringVar(VP_Tool_Dis, Tool_buf_en); - const char Print_buf_en[] = "Print"; - dgus.writeVariable(VP_Print_Dis, Print_buf_en, 32, true); + const char Print_buf_en[] = "Print"; + dgus.writeStringVar(VP_Print_Dis, Print_buf_en); - const char Language_buf_en[] = "Language"; - dgus.writeVariable(VP_Language_Dis, Language_buf_en, 32, true); + const char Language_buf_en[] = "Language"; + dgus.writeStringVar(VP_Language_Dis, Language_buf_en); - const char About_buf_en[] = "About"; - dgus.writeVariable(VP_About_Dis, About_buf_en, 32, true); + const char About_buf_en[] = "About"; + dgus.writeStringVar(VP_About_Dis, About_buf_en); - const char Config_buf_en[] = "Config"; - dgus.writeVariable(VP_Config_Dis, Config_buf_en, 32, true); + const char Config_buf_en[] = "Config"; + dgus.writeStringVar(VP_Config_Dis, Config_buf_en); - const char MotorConfig_buf_en[] = "MotorConfig"; - dgus.writeVariable(VP_MotorConfig_Dis, MotorConfig_buf_en, 32, true); + const char MotorConfig_buf_en[] = "Motion Config"; + dgus.writeStringVar(VP_MotorConfig_Dis, MotorConfig_buf_en); - const char LevelConfig_buf_en[] = "LevelConfig"; - dgus.writeVariable(VP_LevelConfig_Dis, LevelConfig_buf_en, 32, true); + const char LevelConfig_buf_en[] = "Level Config"; + dgus.writeStringVar(VP_LevelConfig_Dis, LevelConfig_buf_en); - const char TemperatureConfig_buf_en[] = "Temperature"; - dgus.writeVariable(VP_TemperatureConfig_Dis, TemperatureConfig_buf_en, 32, true); + const char TemperatureConfig_buf_en[] = "Temperature"; + dgus.writeStringVar(VP_TemperatureConfig_Dis, TemperatureConfig_buf_en); - const char Advance_buf_en[] = "Advance"; - dgus.writeVariable(VP_Advance_Dis, Advance_buf_en, 32, true); + const char Probe_Offset_buf_en[] = "Probe Offset"; + dgus.writeStringVar(VP_Probe_Offset_Dis, Probe_Offset_buf_en); - const char Filament_buf_en[] = "Extrude"; - dgus.writeVariable(VP_Filament_Dis, Filament_buf_en, 32, true); + const char Advance_buf_en[] = "Advanced"; + dgus.writeStringVar(VP_Advance_Dis, Advance_buf_en); - const char Move_buf_en[] = "Move"; - dgus.writeVariable(VP_Move_Dis, Move_buf_en, 32, true); + const char Filament_buf_en[] = "Extrude"; + dgus.writeStringVar(VP_Filament_Dis, Filament_buf_en); - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - const char Level_buf_en[] = "AutoLevel"; - dgus.writeVariable(VP_Level_Dis, Level_buf_en, 32, true); - #elif ENABLED(MESH_BED_LEVELING) - const char Level_buf_en[] = "MeshLevel"; - dgus.writeVariable(VP_Level_Dis, Level_buf_en, 32, true); - #else - const char Level_buf_en[] = "Level"; - dgus.writeVariable(VP_Level_Dis, Level_buf_en, 32, true); - #endif + const char Move_buf_en[] = "Move"; + dgus.writeStringVar(VP_Move_Dis, Move_buf_en); - const char MotorPluse_buf_en[] = "MotorPluse"; - dgus.writeVariable(VP_MotorPluse_Dis, MotorPluse_buf_en, 32, true); + const char Level_buf_en[] = + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + "Auto" + #elif ENABLED(MESH_BED_LEVELING) + "Mesh" + #endif + "Level" + ; + dgus.writeStringVar(VP_Level_Dis, Level_buf_en); - const char MotorMaxSpeed_buf_en[] = "MotorMaxSpeed"; - dgus.writeVariable(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_en, 32, true); + const char AxisRes_buf_en[] = "Axis Resolution"; + dgus.writeStringVar(VP_AxisRes_Dis, AxisRes_buf_en); - const char MotorMaxAcc_buf_en[] = "MotorAcc"; - dgus.writeVariable(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_en, 32, true); + const char AxisMaxSpeed_buf_en[] = "Axis Max Speed"; + dgus.writeStringVar(VP_AxisMaxSpeed_Dis, AxisMaxSpeed_buf_en); - const char TravelAcc_buf_en[] = "TravelAcc"; - dgus.writeVariable(VP_TravelAcc_Dis, TravelAcc_buf_en, 32, true); + const char AxisMaxAcc_buf_en[] = "Axis Max Acc."; + dgus.writeStringVar(VP_AxisMaxAcc_Dis, AxisMaxAcc_buf_en); - const char FeedRateMin_buf_en[] = "FeedRateMin"; - dgus.writeVariable(VP_FeedRateMin_Dis, FeedRateMin_buf_en, 32, true); + const char TravelAcc_buf_en[] = "Travel Acc."; + dgus.writeStringVar(VP_TravelAcc_Dis, TravelAcc_buf_en); - const char TravelFeeRateMin_buf_en[] = "TravelFeedRateMin"; - dgus.writeVariable(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_en, 32, true); + const char FeedRateMin_buf_en[] = "Min FeedRate"; + dgus.writeStringVar(VP_FeedRateMin_Dis, FeedRateMin_buf_en); - const char Acc_buf_en[] = "Acc"; - dgus.writeVariable(VP_ACC_Dis, Acc_buf_en, 32, true); + const char TravelFeeRateMin_buf_en[] = "Travel Min FeedRate"; + dgus.writeStringVar(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_en); - const char Point_One_buf_en[] = "Point_First"; - dgus.writeVariable(VP_Point_One_Dis, Point_One_buf_en, 32, true); + const char Acc_buf_en[] = "Acceleration"; + dgus.writeStringVar(VP_ACC_Dis, Acc_buf_en); - const char Point_Two_buf_en[] = "Point_Second"; - dgus.writeVariable(VP_Point_Two_Dis, Point_Two_buf_en, 32, true); + const char Point_One_buf_en[] = "Point 1"; + dgus.writeStringVar(VP_Point_One_Dis, Point_One_buf_en); - const char Point_Three_buf_en[] = "Point_Third"; - dgus.writeVariable(VP_Point_Three_Dis, Point_Three_buf_en, 32, true); + const char Point_Two_buf_en[] = "Point 2"; + dgus.writeStringVar(VP_Point_Two_Dis, Point_Two_buf_en); - const char Point_Four_buf_en[] = "Point_Fourth"; - dgus.writeVariable(VP_Point_Four_Dis, Point_Four_buf_en, 32, true); + const char Point_Three_buf_en[] = "Point 3"; + dgus.writeStringVar(VP_Point_Three_Dis, Point_Three_buf_en); - const char Point_Five_buf_en[] = "Point_Fifth"; - dgus.writeVariable(VP_Point_Five_Dis, Point_Five_buf_en, 32, true); + const char Point_Four_buf_en[] = "Point 4"; + dgus.writeStringVar(VP_Point_Four_Dis, Point_Four_buf_en); - const char Extrusion_buf_en[] = "Extrusion"; - dgus.writeVariable(VP_Extrusion_Dis, Extrusion_buf_en, 32, true); + const char Point_Five_buf_en[] = "Point 5"; + dgus.writeStringVar(VP_Point_Five_Dis, Point_Five_buf_en); - const char HeatBed_buf_en[] = "HeatBed"; - dgus.writeVariable(VP_HeatBed_Dis, HeatBed_buf_en, 32, true); + const char Extrusion_buf_en[] = "Extrusion"; + dgus.writeStringVar(VP_Extrusion_Dis, Extrusion_buf_en); - const char FactoryDefaults_buf_en[] = "FactoryDefaults"; - dgus.writeVariable(VP_FactoryDefaults_Dis, FactoryDefaults_buf_en, 32, true); + const char HeatBed_buf_en[] = "HeatBed"; + dgus.writeStringVar(VP_HeatBed_Dis, HeatBed_buf_en); - const char StoreSetting_buf_en[] = "StoreSetting"; - dgus.writeVariable(VP_StoreSetting_Dis, StoreSetting_buf_en, 32, true); + const char FactoryDefaults_buf_en[] = "Factory Defaults"; + dgus.writeStringVar(VP_FactoryDefaults_Dis, FactoryDefaults_buf_en); - const char PrintPauseConfig_buf_en[] = "PrintPauseConfig"; - dgus.writeVariable(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_en, 32, true); + const char StoreSetting_buf_en[] = "Store Settings"; + dgus.writeStringVar(VP_StoreSetting_Dis, StoreSetting_buf_en); - const char X_Pluse_buf_en[] = "X_Pluse"; - dgus.writeVariable(VP_X_Pluse_Dis, X_Pluse_buf_en, 32, true); + const char PrintPauseConfig_buf_en[] = "PrintPause Config"; + dgus.writeStringVar(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_en); - const char Y_Pluse_buf_en[] = "Y_Pluse"; - dgus.writeVariable(VP_Y_Pluse_Dis, Y_Pluse_buf_en, 32, true); + const char X_Steps_mm_buf_en[] = "X steps/mm"; + dgus.writeStringVar(VP_X_Steps_mm_Dis, X_Steps_mm_buf_en); - const char Z_Pluse_buf_en[] = "Z_Pluse"; - dgus.writeVariable(VP_Z_Pluse_Dis, Z_Pluse_buf_en, 32, true); + const char Y_Steps_mm_buf_en[] = "Y steps/mm"; + dgus.writeStringVar(VP_Y_Steps_mm_Dis, Y_Steps_mm_buf_en); - const char E0_Pluse_buf_en[] = "E0_Pluse"; - dgus.writeVariable(VP_E0_Pluse_Dis, E0_Pluse_buf_en, 32, true); + const char Z_Steps_mm_buf_en[] = "Z steps/mm"; + dgus.writeStringVar(VP_Z_Steps_mm_Dis, Z_Steps_mm_buf_en); - const char E1_Pluse_buf_en[] = "E1_Pluse"; - dgus.writeVariable(VP_E1_Pluse_Dis, E1_Pluse_buf_en, 32, true); + const char E0_Steps_mm_buf_en[] = "E0 steps/mm"; + dgus.writeStringVar(VP_E0_Steps_mm_Dis, E0_Steps_mm_buf_en); - const char X_Max_Speed_buf_en[] = "X_Max_Speed"; - dgus.writeVariable(VP_X_Max_Speed_Dis, X_Max_Speed_buf_en, 32, true); + const char E1_Steps_mm_buf_en[] = "E1 steps/mm"; + dgus.writeStringVar(VP_E1_Steps_mm_Dis, E1_Steps_mm_buf_en); - const char Y_Max_Speed_buf_en[] = "Y_Max_Speed"; - dgus.writeVariable(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_en, 32, true); + const char X_Max_Speed_buf_en[] = "X Max Speed"; + dgus.writeStringVar(VP_X_Max_Speed_Dis, X_Max_Speed_buf_en); - const char Z_Max_Speed_buf_en[] = "Z_Max_Speed"; - dgus.writeVariable(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_en, 32, true); + const char Y_Max_Speed_buf_en[] = "Y Max Speed"; + dgus.writeStringVar(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_en); - const char E0_Max_Speed_buf_en[] = "E0_Max_Speed"; - dgus.writeVariable(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_en, 32, true); + const char Z_Max_Speed_buf_en[] = "Z Max Speed"; + dgus.writeStringVar(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_en); - const char E1_Max_Speed_buf_en[] = "E1_Max_Speed"; - dgus.writeVariable(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_en, 32, true); + const char E0_Max_Speed_buf_en[] = "E0 Max Speed"; + dgus.writeStringVar(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_en); - const char X_Max_Acc_Speed_buf_en[] = "X_Max_Acc_Speed"; - dgus.writeVariable(VP_X_Max_Acc_Speed_Dis, X_Max_Acc_Speed_buf_en, 32, true); + const char E1_Max_Speed_buf_en[] = "E1 Max Speed"; + dgus.writeStringVar(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_en); - const char Y_Max_Acc_Speed_buf_en[] = "Y_Max_Acc_Speed"; - dgus.writeVariable(VP_Y_Max_Acc_Speed_Dis, Y_Max_Acc_Speed_buf_en, 32, true); + const char X_Max_Acc_Speed_buf_en[] = "X Max Acc"; + dgus.writeStringVar(VP_X_Max_Acc_Dis, X_Max_Acc_Speed_buf_en); - const char Z_Max_Acc_Speed_buf_en[] = "Z_Max_Acc_Speed"; - dgus.writeVariable(VP_Z_Max_Acc_Speed_Dis, Z_Max_Acc_Speed_buf_en, 32, true); + const char Y_Max_Acc_Speed_buf_en[] = "Y Max Acc"; + dgus.writeStringVar(VP_Y_Max_Acc_Dis, Y_Max_Acc_Speed_buf_en); - const char E0_Max_Acc_Speed_buf_en[] = "E0_Max_Acc_Speed"; - dgus.writeVariable(VP_E0_Max_Acc_Speed_Dis, E0_Max_Acc_Speed_buf_en, 32, true); + const char Z_Max_Acc_Speed_buf_en[] = "Z Max Acc"; + dgus.writeStringVar(VP_Z_Max_Acc_Dis, Z_Max_Acc_Speed_buf_en); - const char E1_Max_Acc_Speed_buf_en[] = "E1_Max_Acc_Speed"; - dgus.writeVariable(VP_E1_Max_Acc_Speed_Dis, E1_Max_Acc_Speed_buf_en, 32, true); + const char E0_Max_Acc_Speed_buf_en[] = "E0 Max Acc"; + dgus.writeStringVar(VP_E0_Max_Acc_Dis, E0_Max_Acc_Speed_buf_en); - const char X_PARK_POS_buf_en[] = "X_PARK_POS"; - dgus.writeVariable(VP_X_PARK_POS_Dis, X_PARK_POS_buf_en, 32, true); + const char E1_Max_Acc_Speed_buf_en[] = "E1 Max Acc"; + dgus.writeStringVar(VP_E1_Max_Acc_Dis, E1_Max_Acc_Speed_buf_en); - const char Y_PARK_POS_buf_en[] = "Y_PARK_POS"; - dgus.writeVariable(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_en, 32, true); + const char X_PARK_POS_buf_en[] = "X Park Pos"; + dgus.writeStringVar(VP_X_PARK_POS_Dis, X_PARK_POS_buf_en); - const char Z_PARK_POS_buf_en[] = "Z_PARK_POS"; - dgus.writeVariable(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_en, 32, true); + const char Y_PARK_POS_buf_en[] = "Y Park Pos"; + dgus.writeStringVar(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_en); - const char Length_buf_en[] = "Length"; - dgus.writeVariable(VP_Length_Dis, Length_buf_en, 32, true); + const char Z_PARK_POS_buf_en[] = "Z Park Pos"; + dgus.writeStringVar(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_en); - const char Speed_buf_en[] = "Speed"; - dgus.writeVariable(VP_Speed_Dis, Speed_buf_en, 32, true); + const char Length_buf_en[] = "Length"; + dgus.writeStringVar(VP_Length_Dis, Length_buf_en); - const char InOut_buf_en[] = "InOut"; - dgus.writeVariable(VP_InOut_Dis, InOut_buf_en, 32, true); + const char Speed_buf_en[] = "Speed"; + dgus.writeStringVar(VP_Speed_Dis, Speed_buf_en); - const char PrintTimet_buf_en[] = "PrintTime"; - dgus.writeVariable(VP_PrintTime_Dis, PrintTimet_buf_en, 32, true); + const char InOut_buf_en[] = "In/Out"; + dgus.writeStringVar(VP_InOut_Dis, InOut_buf_en); - const char E0_Temp_buf_en[] = "E0_Temp"; - dgus.writeVariable(VP_E0_Temp_Dis, E0_Temp_buf_en, 32, true); + const char PrintTimet_buf_en[] = "Print Time"; + dgus.writeStringVar(VP_PrintTime_Dis, PrintTimet_buf_en); - const char E1_Temp_buf_en[] = "E1_Temp"; - dgus.writeVariable(VP_E1_Temp_Dis, E1_Temp_buf_en, 32, true); + const char E0_Temp_buf_en[] = "E0 Temp"; + dgus.writeStringVar(VP_E0_Temp_Dis, E0_Temp_buf_en); - const char HB_Temp_buf_en[] = "HB_Temp"; - dgus.writeVariable(VP_HB_Temp_Dis, HB_Temp_buf_en, 32, true); + const char E1_Temp_buf_en[] = "E1 Temp"; + dgus.writeStringVar(VP_E1_Temp_Dis, E1_Temp_buf_en); - const char Feedrate_buf_en[] = "Feedrate"; - dgus.writeVariable(VP_Feedrate_Dis, Feedrate_buf_en, 32, true); + const char HB_Temp_buf_en[] = "HB Temp"; + dgus.writeStringVar(VP_HB_Temp_Dis, HB_Temp_buf_en); - const char PrintAcc_buf_en[] = "PrintSpeed"; - dgus.writeVariable(VP_PrintAcc_Dis, PrintAcc_buf_en, 32, true); + const char Feedrate_buf_en[] = "Feedrate"; + dgus.writeStringVar(VP_Feedrate_Dis, Feedrate_buf_en); - const char FAN_Speed_buf_en[] = "FAN_Speed"; - dgus.writeVariable(VP_Fan_Speed_Dis, FAN_Speed_buf_en, 32, true); + const char PrintAcc_buf_en[] = "Print Speed"; + dgus.writeStringVar(VP_PrintAcc_Dis, PrintAcc_buf_en); - const char Printing_buf_en[] = "Printing"; - dgus.writeVariable(VP_Printing_Dis, Printing_buf_en, 32, true); + const char FAN_Speed_buf_en[] = "FAN Speed"; + dgus.writeStringVar(VP_Fan_Speed_Dis, FAN_Speed_buf_en); - const char Info_EEPROM_1_buf_en[] = "Store setting?"; - dgus.writeVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_en, 32, true); + const char Printing_buf_en[] = "Printing"; + dgus.writeStringVar(VP_Printing_Dis, Printing_buf_en); - const char Info_EEPROM_2_buf_en[] = "Revert setting?"; - dgus.writeVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_en, 32, true); + const char Info_EEPROM_1_buf_en[] = "Store Settings?"; + dgus.writeStringVar(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_en); - const char Info_PrintFinish_1_buf_en[] = "Print Done"; - dgus.writeVariable(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_en, 32, true); + const char Info_EEPROM_2_buf_en[] = "Revert Settings?"; + dgus.writeStringVar(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_en); - const char TMC_X_Step_buf_en[] = "X_SenSitivity"; - dgus.writeVariable(VP_TMC_X_Step_Dis, TMC_X_Step_buf_en, 32, true); + const char Info_PrintFinish_1_buf_en[] = "Print Done"; + dgus.writeStringVar(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_en); - const char TMC_Y_Step_buf_en[] = "Y_SenSitivity"; - dgus.writeVariable(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_en, 32, true); + const char TMC_X_Step_buf_en[] = "X Sensitivity"; + dgus.writeStringVar(VP_TMC_X_SENS_Dis, TMC_X_Step_buf_en); - const char TMC_Z_Step_buf_en[] = "Z_SenSitivity"; - dgus.writeVariable(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_en, 32, true); + const char TMC_Y_Step_buf_en[] = "Y Sensitivity"; + dgus.writeStringVar(VP_TMC_Y_SENS_Dis, TMC_Y_Step_buf_en); - const char TMC_X_Current_buf_en[] = "X_Current"; - dgus.writeVariable(VP_TMC_X_Current_Dis, TMC_X_Current_buf_en, 32, true); + const char TMC_Z_Step_buf_en[] = "Z Sensitivity"; + dgus.writeStringVar(VP_TMC_Z_SENS_Dis, TMC_Z_Step_buf_en); - const char TMC_Y_Current_buf_en[] = "Y_Current"; - dgus.writeVariable(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_en, 32, true); + const char TMC_X_Current_buf_en[] = "X Current"; + dgus.writeStringVar(VP_TMC_X_Current_Dis, TMC_X_Current_buf_en); - const char TMC_Z_Current_buf_en[] = "Z_Current"; - dgus.writeVariable(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_en, 32, true); + const char TMC_Y_Current_buf_en[] = "Y Current"; + dgus.writeStringVar(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_en); - const char TMC_E0_Current_buf_en[] = "E0_Current"; - dgus.writeVariable(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_en, 32, true); + const char TMC_Z_Current_buf_en[] = "Z Current"; + dgus.writeStringVar(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_en); - const char TMC_X1_Current_buf_en[] = "X1_Current"; - dgus.writeVariable(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_en, 32, true); + const char TMC_E0_Current_buf_en[] = "E0 Current"; + dgus.writeStringVar(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_en); - const char TMC_Y1_Current_buf_en[] = "Y1_Current"; - dgus.writeVariable(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_en, 32, true); + const char TMC_X1_Current_buf_en[] = "X2 Current"; + dgus.writeStringVar(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_en); - const char TMC_Z1_Current_buf_en[] = "Z1_Current"; - dgus.writeVariable(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_en, 32, true); + const char TMC_Y1_Current_buf_en[] = "Y2 Current"; + dgus.writeStringVar(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_en); - const char TMC_E1_Current_buf_en[] = "E1_Current"; - dgus.writeVariable(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_en, 32, true); + const char TMC_Z1_Current_buf_en[] = "Z2 Current"; + dgus.writeStringVar(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_en); - const char Min_Ex_Temp_buf_en[] = "Min_Ex_Temp"; - dgus.writeVariable(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_en, 32, true); + const char TMC_E1_Current_buf_en[] = "E1 Current"; + dgus.writeStringVar(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_en); - const char AutoLEVEL_INFO1_buf_en[] = "Please Press Button!"; - dgus.writeVariable(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_en, 32, true); + const char Min_Ex_Temp_buf_en[] = "Min Extrude Temp"; + dgus.writeStringVar(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_en); - const char EX_TEMP_INFO2_buf_en[] = "Please wait a monent"; - dgus.writeVariable(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_en, 32, true); + const char X_Offset_buf_en[] = "X Offset"; + dgus.writeStringVar(VP_X_Offset_Dis, X_Offset_buf_en); - const char EX_TEMP_INFO3_buf_en[] = "Cancle"; - dgus.writeVariable(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_en, 32, true); + const char Y_Offset_buf_en[] = "Y Offset"; + dgus.writeStringVar(VP_Y_Offset_Dis, Y_Offset_buf_en); - const char PrintConfrim_Info_buf_en[] = "Start Print?"; - dgus.writeVariable(VP_PrintConfrim_Info_Dis, PrintConfrim_Info_buf_en, 32, true); + const char Z_Offset_buf_en[] = "Z Offset"; + dgus.writeStringVar(VP_Z_Offset_Dis, Z_Offset_buf_en); - const char StopPrintConfrim_Info_buf_en[] = "Stop Print?"; - dgus.writeVariable(VP_StopPrintConfrim_Info_Dis, StopPrintConfrim_Info_buf_en, 32, true); + const char AutoLEVEL_INFO1_buf_en[] = "Please Press Button!"; + dgus.writeStringVar(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_en); - const char Printting_buf_en[] = "Printing"; - dgus.writeVariable(VP_Printting_Dis, Printting_buf_en, 32, true); + const char EX_TEMP_INFO2_buf_en[] = "Please wait a moment"; + dgus.writeStringVar(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_en); - const char LCD_BLK_buf_en[] = "Backlight"; - dgus.writeVariable(VP_LCD_BLK_Dis, LCD_BLK_buf_en, 32, true); - } - else if (var == MKS_SimpleChinese) { - uint16_t home_buf_ch[] = { 0xF7D6, 0xB3D2 }; - dgus.writeVariable(VP_HOME_Dis, home_buf_ch, 4, true); + const char EX_TEMP_INFO3_buf_en[] = "Cancel"; + dgus.writeStringVar(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_en); - const uint16_t Setting_Dis[] = { 0xE8C9, 0xC3D6, 0x2000, 0x2000, 0x2000 }; - dgus.writeVariable(VP_Setting_Dis, Setting_Dis, 7, true); + const char PrintConfirm_Info_buf_en[] = "Start Print?"; + dgus.writeStringVar(VP_PrintConfirm_Info_Dis, PrintConfirm_Info_buf_en); - const uint16_t Tool_Dis[] = { 0xA4B9, 0xDFBE }; - dgus.writeVariable(VP_Tool_Dis, Tool_Dis, 4, true); + const char StopPrintConfirm_Info_buf_en[] = "Stop Print?"; + dgus.writeStringVar(VP_StopPrintConfirm_Info_Dis, StopPrintConfirm_Info_buf_en); - const uint16_t Print_buf_ch[] = { 0xF2B4, 0xA1D3, 0x2000 }; - dgus.writeVariable(VP_Print_Dis, Print_buf_ch, 6, true); + const char LCD_BLK_buf_en[] = "Backlight"; + dgus.writeStringVar(VP_LCD_BLK_Dis, LCD_BLK_buf_en); - const uint16_t Language_buf_ch[] = { 0xEFD3, 0xD4D1, 0x2000, 0x2000 }; - dgus.writeVariable(VP_Language_Dis, Language_buf_ch, 8, true); + } break; // MKS_English - const uint16_t About_buf_ch[] = { 0xD8B9, 0xDAD3, 0x2000 }; - dgus.writeVariable(VP_About_Dis, About_buf_ch, 6, true); + case MKS_SimpleChinese: { + const uint16_t home_buf_ch[] = { 0xF7D6, 0xB3D2 }; + dgus.writeStringVar(VP_HOME_Dis, home_buf_ch, 4); - const uint16_t Config_buf_ch[] = { 0xE4C5, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_Config_Dis, Config_buf_ch, 6, true); + const uint16_t Setting_Dis[] = { 0xE8C9, 0xC3D6, 0x2000, 0x2000, 0x2000 }; + dgus.writeStringVar(VP_Setting_Dis, Setting_Dis, 7); - const uint16_t MotorConfig_buf_ch[] = { 0xE7B5, 0xFABB, 0xE4C5, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_MotorConfig_Dis, MotorConfig_buf_ch, 12, true); + const uint16_t Tool_Dis[] = { 0xA4B9, 0xDFBE }; + dgus.writeStringVar(VP_Tool_Dis, Tool_Dis, 4); - const uint16_t LevelConfig_buf_ch[] = { 0xD6CA, 0xAFB6, 0xF7B5, 0xBDC6, 0xE8C9, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_LevelConfig_Dis, LevelConfig_buf_ch, 32, true); + const uint16_t Print_buf_ch[] = { 0xF2B4, 0xA1D3, 0x2000 }; + dgus.writeStringVar(VP_Print_Dis, Print_buf_ch, 6); - const uint16_t TemperatureConfig_buf_ch[] = { 0xC2CE, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TemperatureConfig_Dis, TemperatureConfig_buf_ch, 11, true); + const uint16_t Language_buf_ch[] = { 0xEFD3, 0xD4D1, 0x2000, 0x2000 }; + dgus.writeStringVar(VP_Language_Dis, Language_buf_ch, 8); - const uint16_t Advance_buf_ch[] = { 0xDFB8, 0xB6BC, 0xE8C9, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_Advance_Dis, Advance_buf_ch, 16, true); + const uint16_t About_buf_ch[] = { 0xD8B9, 0xDAD3, 0x2000 }; + dgus.writeStringVar(VP_About_Dis, About_buf_ch, 6); - const uint16_t Filament_buf_ch[] = { 0xB7BC, 0xF6B3, 0x2000 }; - dgus.writeVariable(VP_Filament_Dis, Filament_buf_ch, 8, true); + const uint16_t Config_buf_ch[] = { 0xE4C5, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_Config_Dis, Config_buf_ch, 6); - const uint16_t Move_buf_ch[] = { 0xC6D2, 0xAFB6, 0x2000 }; - dgus.writeVariable(VP_Move_Dis, Move_buf_ch, 4, true); + const uint16_t MotorConfig_buf_ch[] = { 0xE7B5, 0xFABB, 0xE4C5, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_MotorConfig_Dis, MotorConfig_buf_ch, 12); - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - const uint16_t Level_buf_ch[] = { 0xD4D7, 0xAFB6, 0xF7B5, 0xBDC6, 0x2000 }; - dgus.writeVariable(VP_Level_Dis, Level_buf_ch, 32, true); - #elif ENABLED(MESH_BED_LEVELING) - const uint16_t Level_buf_ch[] = { 0xF8CD, 0xF1B8, 0xF7B5, 0xBDC6, 0x2000 }; - dgus.writeVariable(VP_Level_Dis, Level_buf_ch, 32, true); - #else - const uint16_t Level_buf_ch[] = { 0xD6CA, 0xAFB6, 0xF7B5, 0xBDC6, 0x2000 }; - dgus.writeVariable(VP_Level_Dis, Level_buf_ch, 32, true); - #endif + const uint16_t LevelConfig_buf_ch[] = { 0xD6CA, 0xAFB6, 0xF7B5, 0xBDC6, 0xE8C9, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_LevelConfig_Dis, LevelConfig_buf_ch, 32); - const uint16_t MotorPluse_buf_ch[] = { 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_MotorPluse_Dis, MotorPluse_buf_ch, 16, true); + const uint16_t TemperatureConfig_buf_ch[] = { 0xC2CE, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TemperatureConfig_Dis, TemperatureConfig_buf_ch, 11); - const uint16_t MotorMaxSpeed_buf_ch[] = { 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_ch, 16, true); + const uint16_t Advance_buf_ch[] = { 0xDFB8, 0xB6BC, 0xE8C9, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_Advance_Dis, Advance_buf_ch, 32); - const uint16_t MotorMaxAcc_buf_ch[] = { 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_ch, 16, true); + const uint16_t Filament_buf_ch[] = { 0xB7BC, 0xF6B3, 0x2000 }; + dgus.writeStringVar(VP_Filament_Dis, Filament_buf_ch, 8); - const uint16_t TravelAcc_buf_ch[] = { 0xD5BF, 0xD0D0, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TravelAcc_Dis, TravelAcc_buf_ch, 16, true); + const uint16_t Move_buf_ch[] = { 0xC6D2, 0xAFB6, 0x2000 }; + dgus.writeStringVar(VP_Move_Dis, Move_buf_ch, 4); - const uint16_t FeedRateMin_buf_ch[] = { 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_FeedRateMin_Dis, FeedRateMin_buf_ch, 12, true); + const uint16_t Level_buf_ch[] = { + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + 0xD4D7, 0xAFB6 + #elif ENABLED(MESH_BED_LEVELING) + 0xF8CD, 0xF1B8 + #else + 0xD6CA, 0xAFB6 + #endif + , 0xF7B5, 0xBDC6, 0x2000 + }; + dgus.writeStringVar(VP_Level_Dis, Level_buf_ch, 32); - const uint16_t TravelFeeRateMin_buf_ch[] = { 0xD5BF, 0xD0D0, 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_ch, 24, true); + const uint16_t AxisRes_buf_ch[] = { 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_AxisRes_Dis, AxisRes_buf_ch); - const uint16_t Acc_buf_ch[] = { 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_ACC_Dis, Acc_buf_ch, 16, true); + const uint16_t AxisMaxSpeed_buf_ch[] = { 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_AxisMaxSpeed_Dis, AxisMaxSpeed_buf_ch); - const uint16_t Point_One_buf_ch[] = { 0xDAB5, 0xBBD2, 0xE3B5, 0x2000 }; - dgus.writeVariable(VP_Point_One_Dis, Point_One_buf_ch, 12, true); + const uint16_t AxisMaxAcc_buf_ch[] = { 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_AxisMaxAcc_Dis, AxisMaxAcc_buf_ch); - const uint16_t Point_Two_buf_ch[] = { 0xDAB5, 0xFEB6, 0xE3B5, 0x2000 }; - dgus.writeVariable(VP_Point_Two_Dis, Point_Two_buf_ch, 12, true); + const uint16_t TravelAcc_buf_ch[] = { 0xD5BF, 0xD0D0, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TravelAcc_Dis, TravelAcc_buf_ch); - const uint16_t Point_Three_buf_ch[] = { 0xDAB5, 0xFDC8, 0xE3B5, 0x2000 }; - dgus.writeVariable(VP_Point_Three_Dis, Point_Three_buf_ch, 12, true); + const uint16_t FeedRateMin_buf_ch[] = { 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_FeedRateMin_Dis, FeedRateMin_buf_ch, 12); - const uint16_t Point_Four_buf_ch[] = { 0xDAB5, 0xC4CB, 0xE3B5, 0x2000 }; - dgus.writeVariable(VP_Point_Four_Dis, Point_Four_buf_ch, 12, true); + const uint16_t TravelFeeRateMin_buf_ch[] = { 0xD5BF, 0xD0D0, 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_ch, 24); - const uint16_t Point_Five_buf_ch[] = { 0xDAB5, 0xE5CE, 0xE3B5, 0x2000 }; - dgus.writeVariable(VP_Point_Five_Dis, Point_Five_buf_ch, 12, true); + const uint16_t Acc_buf_ch[] = { 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_ACC_Dis, Acc_buf_ch); - const uint16_t Extrusion_buf_ch[] = { 0xB7BC, 0xF6B3, 0xB7CD, 0x2000 }; - dgus.writeVariable(VP_Extrusion_Dis, Extrusion_buf_ch, 12, true); + const uint16_t Point_One_buf_ch[] = { 0xDAB5, 0xBBD2, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_Point_One_Dis, Point_One_buf_ch, 12); - const uint16_t HeatBed_buf_ch[] = { 0xC8C8, 0xB2B4, 0x2000 }; - dgus.writeVariable(VP_HeatBed_Dis, HeatBed_buf_ch, 12, true); + const uint16_t Point_Two_buf_ch[] = { 0xDAB5, 0xFEB6, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_Point_Two_Dis, Point_Two_buf_ch, 12); - const uint16_t FactoryDefaults_buf_ch[] = { 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_FactoryDefaults_Dis, FactoryDefaults_buf_ch, 16, true); + const uint16_t Point_Three_buf_ch[] = { 0xDAB5, 0xFDC8, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_Point_Three_Dis, Point_Three_buf_ch, 12); - const uint16_t StoreSetting_buf_ch[] = { 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_StoreSetting_Dis, StoreSetting_buf_ch, 16, true); + const uint16_t Point_Four_buf_ch[] = { 0xDAB5, 0xC4CB, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_Point_Four_Dis, Point_Four_buf_ch, 12); - const uint16_t PrintPauseConfig_buf_ch[] = { 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_ch, 32, true); + const uint16_t Point_Five_buf_ch[] = { 0xDAB5, 0xE5CE, 0xE3B5, 0x2000 }; + dgus.writeStringVar(VP_Point_Five_Dis, Point_Five_buf_ch, 12); - const uint16_t X_Pluse_buf_ch[] = { 0x2058, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_X_Pluse_Dis, X_Pluse_buf_ch, 16, true); + const uint16_t Extrusion_buf_ch[] = { 0xB7BC, 0xF6B3, 0xB7CD, 0x2000 }; + dgus.writeStringVar(VP_Extrusion_Dis, Extrusion_buf_ch, 12); - const uint16_t Y_Pluse_buf_ch[] = { 0x2059, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_Y_Pluse_Dis, Y_Pluse_buf_ch, 16, true); + const uint16_t HeatBed_buf_ch[] = { 0xC8C8, 0xB2B4, 0x2000 }; + dgus.writeStringVar(VP_HeatBed_Dis, HeatBed_buf_ch, 12); - const uint16_t Z_Pluse_buf_ch[] = { 0x205A, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_Z_Pluse_Dis, Z_Pluse_buf_ch, 16, true); + const uint16_t FactoryDefaults_buf_ch[] = { 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_FactoryDefaults_Dis, FactoryDefaults_buf_ch); - const uint16_t E0_Pluse_buf_ch[] = { 0x3045, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_E0_Pluse_Dis, E0_Pluse_buf_ch, 16, true); + const uint16_t StoreSetting_buf_ch[] = { 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_StoreSetting_Dis, StoreSetting_buf_ch); - const uint16_t E1_Pluse_buf_ch[] = { 0x3145, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; - dgus.writeVariable(VP_E1_Pluse_Dis, E1_Pluse_buf_ch, 16, true); + const uint16_t PrintPauseConfig_buf_ch[] = { 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_ch, 32); - const uint16_t X_Max_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_X_Max_Speed_Dis, X_Max_Speed_buf_ch, 16, true); + const uint16_t X_Steps_mm_buf_ch[] = { 0x2058, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_X_Steps_mm_Dis, X_Steps_mm_buf_ch); - const uint16_t Y_Max_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_ch, 16, true); + const uint16_t Y_Steps_mm_buf_ch[] = { 0x2059, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_Y_Steps_mm_Dis, Y_Steps_mm_buf_ch); - const uint16_t Z_Max_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_ch, 16, true); + const uint16_t Z_Steps_mm_buf_ch[] = { 0x205A, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_Z_Steps_mm_Dis, Z_Steps_mm_buf_ch); - const uint16_t E0_Max_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_ch, 16, true); + const uint16_t E0_Steps_mm_buf_ch[] = { 0x3045, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_E0_Steps_mm_Dis, E0_Steps_mm_buf_ch); - const uint16_t E1_Max_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_ch, 16, true); + const uint16_t E1_Steps_mm_buf_ch[] = { 0x3145, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgus.writeStringVar(VP_E1_Steps_mm_Dis, E1_Steps_mm_buf_ch); - const uint16_t X_Max_Acc_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_X_Max_Acc_Speed_Dis, X_Max_Acc_Speed_buf_ch, 16, true); + const uint16_t X_Max_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_X_Max_Speed_Dis, X_Max_Speed_buf_ch); - const uint16_t Y_Max_Acc_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Y_Max_Acc_Speed_Dis, Y_Max_Acc_Speed_buf_ch, 16, true); + const uint16_t Y_Max_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_ch); - const uint16_t Z_Max_Acc_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Z_Max_Acc_Speed_Dis, Z_Max_Acc_Speed_buf_ch, 16, true); + const uint16_t Z_Max_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_ch); - const uint16_t E0_Max_Acc_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E0_Max_Acc_Speed_Dis, E0_Max_Acc_Speed_buf_ch, 16, true); + const uint16_t E0_Max_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_ch); - const uint16_t E1_Max_Acc_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E1_Max_Acc_Speed_Dis, E1_Max_Acc_Speed_buf_ch, 16, true); + const uint16_t E1_Max_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_ch); - const uint16_t X_PARK_POS_buf_ch[] = { 0x2058, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_X_PARK_POS_Dis, X_PARK_POS_buf_ch, 16, true); + const uint16_t X_Max_Acc_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_X_Max_Acc_Dis, X_Max_Acc_Speed_buf_ch); - const uint16_t Y_PARK_POS_buf_ch[] = { 0x2059, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_ch, 16, true); + const uint16_t Y_Max_Acc_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Y_Max_Acc_Dis, Y_Max_Acc_Speed_buf_ch); - const uint16_t Z_PARK_POS_buf_ch[] = { 0x205A, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_ch, 16, true); + const uint16_t Z_Max_Acc_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Z_Max_Acc_Dis, Z_Max_Acc_Speed_buf_ch); - const uint16_t Length_buf_ch[] = { 0xBDB2, 0xA4B3, 0x2000 }; - dgus.writeVariable(VP_Length_Dis, Length_buf_ch, 8, true); + const uint16_t E0_Max_Acc_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E0_Max_Acc_Dis, E0_Max_Acc_Speed_buf_ch); - const uint16_t Speed_buf_ch[] = { 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Speed_Dis, Speed_buf_ch, 8, true); + const uint16_t E1_Max_Acc_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E1_Max_Acc_Dis, E1_Max_Acc_Speed_buf_ch); - const uint16_t InOut_buf_ch[] = { 0xF8BD, 0xF6B3, 0x2000 }; - dgus.writeVariable(VP_InOut_Dis, InOut_buf_ch, 8, true); + const uint16_t X_PARK_POS_buf_ch[] = { 0x2058, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_X_PARK_POS_Dis, X_PARK_POS_buf_ch); - const uint16_t PrintTimet_buf_en[] = { 0xF2B4, 0xA1D3, 0xB1CA, 0xE4BC, 0x2000 }; - dgus.writeVariable(VP_PrintTime_Dis, PrintTimet_buf_en, 16, true); + const uint16_t Y_PARK_POS_buf_ch[] = { 0x2059, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_ch); - const uint16_t E0_Temp_buf_ch[] = { 0x3045, 0xC2CE, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E0_Temp_Dis, E0_Temp_buf_ch, 16, true); + const uint16_t Z_PARK_POS_buf_ch[] = { 0x205A, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_ch); - const uint16_t E1_Temp_buf_ch[] = { 0x3145, 0xC2CE, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_E1_Temp_Dis, E1_Temp_buf_ch, 16, true); + const uint16_t Length_buf_ch[] = { 0xBDB2, 0xA4B3, 0x2000 }; + dgus.writeStringVar(VP_Length_Dis, Length_buf_ch, 8); - const uint16_t HB_Temp_buf_ch[] = { 0xC8C8, 0xB2B4, 0xC2CE, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_HB_Temp_Dis, HB_Temp_buf_ch, 16, true); + const uint16_t Speed_buf_ch[] = { 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Speed_Dis, Speed_buf_ch, 8); - const uint16_t Feedrate_buf_ch[] = { 0xB7BC, 0xF6B3, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Feedrate_Dis, Feedrate_buf_ch, 16, true); + const uint16_t InOut_buf_ch[] = { 0xF8BD, 0xF6B3, 0x2000 }; + dgus.writeStringVar(VP_InOut_Dis, InOut_buf_ch, 8); - const uint16_t PrintAcc_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_PrintAcc_Dis, PrintAcc_buf_ch, 16, true); + const uint16_t PrintTimet_buf_ch[] = { 0xF2B4, 0xA1D3, 0xB1CA, 0xE4BC, 0x2000 }; + dgus.writeStringVar(VP_PrintTime_Dis, PrintTimet_buf_ch); - const uint16_t FAN_Speed_buf_ch[] = { 0xE7B7, 0xC8C9, 0xD9CB, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Fan_Speed_Dis, FAN_Speed_buf_ch, 16, true); + const uint16_t E0_Temp_buf_ch[] = { 0x3045, 0xC2CE, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E0_Temp_Dis, E0_Temp_buf_ch); - const uint16_t Printing_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; - dgus.writeVariable(VP_Printing_Dis, Printing_buf_ch, 16, true); + const uint16_t E1_Temp_buf_ch[] = { 0x3145, 0xC2CE, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_E1_Temp_Dis, E1_Temp_buf_ch); - const uint16_t Info_EEPROM_1_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; - dgus.writeVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_ch, 32, true); + const uint16_t HB_Temp_buf_ch[] = { 0xC8C8, 0xB2B4, 0xC2CE, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_HB_Temp_Dis, HB_Temp_buf_ch); - const uint16_t Info_EEPROM_2_buf_ch[] = { 0xC7CA, 0xF1B7, 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; - dgus.writeVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_ch, 32, true); + const uint16_t Feedrate_buf_ch[] = { 0xB7BC, 0xF6B3, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Feedrate_Dis, Feedrate_buf_ch); - const uint16_t TMC_X_Step_buf_ch[] = { 0x2058, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TMC_X_Step_Dis, TMC_X_Step_buf_ch, 16, true); + const uint16_t PrintAcc_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_PrintAcc_Dis, PrintAcc_buf_ch); - const uint16_t TMC_Y_Step_buf_ch[] = { 0x2059, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_ch, 16, true); + const uint16_t FAN_Speed_buf_ch[] = { 0xE7B7, 0xC8C9, 0xD9CB, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Fan_Speed_Dis, FAN_Speed_buf_ch); - const uint16_t TMC_Z_Step_buf_ch[] = { 0x205A, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_ch, 16, true); + const uint16_t Printing_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; + dgus.writeStringVar(VP_Printing_Dis, Printing_buf_ch); - const uint16_t Info_PrintFinish_1_buf_ch[] = { 0xF2B4, 0xA1D3, 0xEACD, 0xC9B3, 0x2000 }; - dgus.writeVariable(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_ch, 32, true); + const uint16_t Info_EEPROM_1_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; + dgus.writeStringVar(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_ch, 32); - const uint16_t TMC_X_Current_buf_ch[] = { 0x2058, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_X_Current_Dis, TMC_X_Current_buf_ch, 16, true); + const uint16_t Info_EEPROM_2_buf_ch[] = { 0xC7CA, 0xF1B7, 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; + dgus.writeStringVar(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_ch, 32); - const uint16_t TMC_Y_Current_buf_ch[] = { 0x2059, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_ch, 16, true); + const uint16_t TMC_X_Step_buf_ch[] = { 0x2058, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TMC_X_SENS_Dis, TMC_X_Step_buf_ch); - const uint16_t TMC_Z_Current_buf_ch[] = { 0x205A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_ch, 16, true); + const uint16_t TMC_Y_Step_buf_ch[] = { 0x2059, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TMC_Y_SENS_Dis, TMC_Y_Step_buf_ch); - const uint16_t TMC_E0_Current_buf_ch[] = { 0x3045, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_ch, 16, true); + const uint16_t TMC_Z_Step_buf_ch[] = { 0x205A, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_TMC_Z_SENS_Dis, TMC_Z_Step_buf_ch); - const uint16_t TMC_X1_Current_buf_ch[] = { 0x3158, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_ch, 16, true); + const uint16_t Info_PrintFinish_1_buf_ch[] = { 0xF2B4, 0xA1D3, 0xEACD, 0xC9B3, 0x2000 }; + dgus.writeStringVar(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_ch, 32); - const uint16_t TMC_Y1_Current_buf_ch[] = { 0x3159, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_ch, 16, true); + const uint16_t TMC_X_Current_buf_ch[] = { 0x2058, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_X_Current_Dis, TMC_X_Current_buf_ch); - const uint16_t TMC_Z1_Current_buf_ch[] = { 0x315A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_ch, 16, true); + const uint16_t TMC_Y_Current_buf_ch[] = { 0x2059, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_ch); - const uint16_t TMC_E1_Current_buf_ch[] = { 0x3145, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; - dgus.writeVariable(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_ch, 16, true); + const uint16_t TMC_Z_Current_buf_ch[] = { 0x205A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_ch); - const uint16_t Min_Ex_Temp_buf_ch[] = { 0xEED7, 0xA1D0, 0xB7BC, 0xF6B3, 0xC2CE, 0xC8B6, 0x2000 }; - dgus.writeVariable(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_ch, 32, true); + const uint16_t TMC_E0_Current_buf_ch[] = { 0x3045, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_ch); - const uint16_t AutoLEVEL_INFO1_buf_ch[] = { 0xEBC7, 0xB4B0, 0xC2CF, 0xB4B0, 0xA5C5, 0x2000 }; - dgus.writeVariable(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_ch, 32, true); + const uint16_t TMC_X1_Current_buf_ch[] = { 0x3158, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_ch); - const uint16_t EX_TEMP_INFO2_buf_ch[] = { 0xEBC7, 0xD4C9, 0xC8B5, 0x2000 }; - dgus.writeVariable(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_ch, 32, true); + const uint16_t TMC_Y1_Current_buf_ch[] = { 0x3159, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_ch); - const uint16_t EX_TEMP_INFO3_buf_ch[] = { 0xA1C8, 0xFBCF, 0xD3BC, 0xC8C8, 0x2000 }; - dgus.writeVariable(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_ch, 32, true); + const uint16_t TMC_Z1_Current_buf_ch[] = { 0x315A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_ch); - const uint16_t PrintConfrim_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xAABF, 0xBCCA, 0xF2B4, 0xA1D3, 0x2000 }; - dgus.writeVariable(VP_PrintConfrim_Info_Dis, PrintConfrim_Info_buf_ch, 32, true); + const uint16_t TMC_E1_Current_buf_ch[] = { 0x3145, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgus.writeStringVar(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_ch); - const uint16_t StopPrintConfrim_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3CD, 0xB9D6, 0xF2B4, 0xA1D3, 0x2000 }; - dgus.writeVariable(VP_StopPrintConfrim_Info_Dis, StopPrintConfrim_Info_buf_ch, 32, true); + const uint16_t Min_Ex_Temp_buf_ch[] = { 0xEED7, 0xA1D0, 0xB7BC, 0xF6B3, 0xC2CE, 0xC8B6, 0x2000 }; + dgus.writeStringVar(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_ch, 32); - const uint16_t Printting_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; - dgus.writeVariable(VP_Printting_Dis, Printting_buf_ch, 32, true); + const uint16_t AutoLEVEL_INFO1_buf_ch[] = { 0xEBC7, 0xB4B0, 0xC2CF, 0xB4B0, 0xA5C5, 0x2000 }; + dgus.writeStringVar(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_ch, 32); - const uint16_t LCD_BLK_buf_ch[] = { 0xB3B1, 0xE2B9, 0xE8C9, 0xC3D6, 0x2000 }; - dgus.writeVariable(VP_LCD_BLK_Dis, LCD_BLK_buf_ch, 32, true); - } + const uint16_t EX_TEMP_INFO2_buf_ch[] = { 0xEBC7, 0xD4C9, 0xC8B5, 0x2000 }; + dgus.writeStringVar(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_ch, 32); + + const uint16_t EX_TEMP_INFO3_buf_ch[] = { 0xA1C8, 0xFBCF, 0xD3BC, 0xC8C8, 0x2000 }; + dgus.writeStringVar(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_ch, 32); + + const uint16_t PrintConfirm_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xAABF, 0xBCCA, 0xF2B4, 0xA1D3, 0x2000 }; + dgus.writeStringVar(VP_PrintConfirm_Info_Dis, PrintConfirm_Info_buf_ch, 32); + + const uint16_t StopPrintConfirm_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3CD, 0xB9D6, 0xF2B4, 0xA1D3, 0x2000 }; + dgus.writeStringVar(VP_StopPrintConfirm_Info_Dis, StopPrintConfirm_Info_buf_ch, 32); + + const uint16_t LCD_BLK_buf_ch[] = { 0xB3B1, 0xE2B9, 0xE8C9, 0xC3D6, 0x2000 }; + dgus.writeStringVar(VP_LCD_BLK_Dis, LCD_BLK_buf_ch, 32); + + } break; // MKS_SimpleChinese + } // switch } #endif // DGUS_LCD_UI_MKS diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h index 2a026f751e..01faed6896 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h @@ -25,15 +25,22 @@ enum DGUS_ScreenID : uint8_t; +enum MKS_Choose : uint8_t { MKS_Language_Choose, MKS_Language_NoChoose }; +enum MKS_Language : uint8_t { MKS_SimpleChinese, MKS_English }; + class DGUSScreenHandlerMKS : public DGUSScreenHandler { public: DGUSScreenHandlerMKS() = default; - #if 0 - static void sendinfoscreen_ch(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4); - static void sendinfoscreen_en(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4); - static void sendInfoScreen(const void *line1, const void *line2, const void *line3, const void *line4, uint16_t language); - #endif + // Western / Chinese PROGMEM strings + static void sendInfoScreen_P(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4); + + // Western / Chinese strings + static void sendInfoScreen(const char *line1, const char *line2, const char *line3, const char *line4); + static void sendInfoScreen(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4); + + // Use the language parameter to choose Western / Chinese string method + static void sendInfoScreenMKS(const void *line1, const void *line2, const void *line3, const void *line4, const MKS_Language language); static void screenBackChange(DGUS_VP_Variable &var, void *val_ptr); @@ -53,7 +60,7 @@ public: #if ENABLED(PREVENT_COLD_EXTRUSION) static void handleGetExMinTemp(DGUS_VP_Variable &var, void *val_ptr); #endif - static void languageDisplay(uint8_t var); + static void updateDisplayLanguage(); static void tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr); static void getTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr); static void languagePInit(); @@ -69,10 +76,8 @@ public: #endif static void handleMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr); - static void handleExtruderMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr); static void handleAccChange(DGUS_VP_Variable &var, void *val_ptr); static void handleMaxAccChange(DGUS_VP_Variable &var, void *val_ptr); - static void handleExtruderAccChange(DGUS_VP_Variable &var, void *val_ptr); static void handleChangeLevelPoint(DGUS_VP_Variable &var, void *val_ptr); static void handleTravelAccChange(DGUS_VP_Variable &var, void *val_ptr); static void handleFeedRateMinChange(DGUS_VP_Variable &var, void *val_ptr); @@ -98,16 +103,13 @@ public: static void sendFanToDisplay(DGUS_VP_Variable &var); static void sendGbkToDisplay(DGUS_VP_Variable &var); static void sendStringToDisplay_Language(DGUS_VP_Variable &var); - static void sendTMCStepValue(DGUS_VP_Variable &var); + static void sendTMCSensValue(DGUS_VP_Variable &var); static void setUint8(DGUS_VP_Variable &var, void *val_ptr); static bool loop(); }; -enum MKS_Choose : uint8_t { MKS_Language_Choose, MKS_Language_NoChoose }; -enum MKS_Language : uint8_t { MKS_SimpleChinese, MKS_English }; - extern MKS_Language mks_language_index; extern bool DGUSAutoTurnOff; diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp index 4875020f55..2cb7bd6f83 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp @@ -119,7 +119,7 @@ const struct VPMapping VPMap[] PROGMEM = { { DGUS_SCREEN_FLOWRATES, VPList_SD_FlowRates }, { DGUS_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, { DGUS_SCREEN_SDFILELIST, VPList_SDFileList }, - { 0 , nullptr } // List is terminated with an nullptr as table entry. + { 0, nullptr } // List is terminated with an nullptr as table entry. }; const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; @@ -150,7 +150,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_HOME_ALL, nullptr, screen.handleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOCK, nullptr, screen.handleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, screen.handlePowerLossRecovery, nullptr), #endif diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h index 136b90e641..6b5b780283 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h @@ -111,18 +111,18 @@ constexpr uint16_t VP_MOVE_E1 = 0x2112; //constexpr uint16_t VP_MOVE_E4 = 0x2118; //constexpr uint16_t VP_MOVE_E5 = 0x211A; constexpr uint16_t VP_HOME_ALL = 0x2120; -constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; +constexpr uint16_t VP_MOTOR_LOCK_UNLOCK = 0x2130; // Power loss recovery constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; -// Fan Control Buttons , switch between "off" and "on" +// Fan Control Buttons, switch between "off" and "on" constexpr uint16_t VP_FAN0_CONTROL = 0x2200; constexpr uint16_t VP_FAN1_CONTROL = 0x2202; //constexpr uint16_t VP_FAN2_CONTROL = 0x2204; //constexpr uint16_t VP_FAN3_CONTROL = 0x2206; -// Heater Control Buttons , triged between "cool down" and "heat PLA" state +// Heater Control Buttons, triged between "cool down" and "heat PLA" state constexpr uint16_t VP_E0_CONTROL = 0x2210; constexpr uint16_t VP_E1_CONTROL = 0x2212; //constexpr uint16_t VP_E2_CONTROL = 0x2214; @@ -143,7 +143,7 @@ constexpr uint16_t VP_E1_BED_CONTROL = 0x2222; constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2302; -// Settings store , reset +// Settings store, reset constexpr uint16_t VP_SETTINGS = 0x2400; // PID autotune @@ -247,7 +247,7 @@ constexpr uint16_t VP_BED_STATUS = 0x331C; constexpr uint16_t VP_MOVE_OPTION = 0x3400; // Step per mm -constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment, uint16_t, 0~1638.4 //constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; //constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; @@ -261,7 +261,7 @@ constexpr uint16_t VP_E0_STEP_PER_MM = 0x3610; //constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; // PIDs -constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , uint16_t , 0~1638.4 +constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment, uint16_t, 0~1638.4 constexpr uint16_t VP_E0_PID_I = 0x3702; constexpr uint16_t VP_E0_PID_D = 0x3704; constexpr uint16_t VP_BED_PID_P = 0x3710; diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp index 943d8c50a5..0afc8a25ad 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp @@ -143,7 +143,7 @@ void DGUSScreenHandler::screenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { updateNewScreen(target); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } @@ -290,7 +290,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif break; case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + #ifdef PREHEAT_2_TEMP_HOTEND + e_temp = PREHEAT_2_TEMP_HOTEND; + #endif break; case 2: // Load PET #ifdef PREHEAT_3_TEMP_HOTEND @@ -310,9 +312,9 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (filament_data.action == 0) { // Go back to utility screen #if HAS_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + thermalManager.setTargetHotend(e_temp, 0); #if HAS_MULTI_HOTEND - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + thermalManager.setTargetHotend(e_temp, 1); #endif #endif gotoScreen(DGUS_SCREEN_UTILITY); @@ -322,13 +324,13 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { default: return; #if HAS_HOTEND case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; + filament_data.extruder = 0; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif #if HAS_MULTI_HOTEND case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; + filament_data.extruder = 1; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif @@ -350,7 +352,7 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { //gotoScreen(DGUS_SCREEN_FILAMENT_LOADING); filament_data.heated = true; } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; } else { // unload filament if (!filament_data.heated) { @@ -359,14 +361,14 @@ void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } // Before unloading extrude to prevent jamming if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) + movevalue; filament_data.purge_length -= movevalue; } else { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0) - movevalue; } } - ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder ? ExtUI::extruder_t::E1 : ExtUI::extruder_t::E0); } } #endif // DGUS_FILAMENT_LOADUNLOAD diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSSDCardHandler_Basic.cpp b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSSDCardHandler_Basic.cpp index 85c7b660a7..4cb0cdf89b 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSSDCardHandler_Basic.cpp +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSSDCardHandler_Basic.cpp @@ -52,7 +52,7 @@ void DGUS_SDCardHandler::Reset() { currentSeekPos++; } - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) DEBUG_ECHOPGM("Reset() :", fileCount); DEBUG_CHAR('/'); DEBUG_ECHOLN(currentSeekPos); @@ -71,7 +71,7 @@ void DGUS_SDCardHandler::onPageLoad(DGUS_SDCardHandler::page_t page) { uint16_t currentSeekPos = 0; uint16_t entriesCount = fileList.count(); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) DEBUG_ECHOLNPGM("onPageLoad(): seek page ", pageIndex); #endif while (currentFilePos < pageIndex * DGUS_E3S1PRO_BASIC_SDCARD_FILES_PER_PAGE @@ -83,7 +83,7 @@ void DGUS_SDCardHandler::onPageLoad(DGUS_SDCardHandler::page_t page) { currentFilePos++; } - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) DEBUG_ECHOPGM("onPageLoad() :", currentFilePos); DEBUG_CHAR('/'); DEBUG_ECHOLN(currentSeekPos - 1); diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp index c88412fe2c..938663f9b3 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp @@ -208,7 +208,7 @@ void DGUSScreenHandler::userConfirmation() { if (confirm_return_screen >= DGUS_ScreenID::FILE1 && confirm_return_screen <= DGUS_ScreenID::FILE4) dgus_sdcard_handler.onPageLoad(DGUS_SCREEN_TO_PAGE(confirm_return_screen)); - #ifdef DEBUG_DGUSLCD + #if ENABLED(DEBUG_DGUSLCD) DEBUG_ECHOLNPGM("trig confirmed, ret:", (uint16_t)confirm_return_screen); #endif diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/font2cpp.py b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/font2cpp.py index 98a2420497..8d066d876a 100755 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/font2cpp.py +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/font2cpp.py @@ -56,7 +56,7 @@ class WriteSource: data.append(0) # Combine each two adjacent values into one i = iter(data) - data = list(map(lambda a, b: a << 4 | b, i ,i)) + data = list(map(lambda a, b: a << 4 | b, i, i)) # Pack the data data = pack_rle(data) # Convert values into hex strings diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp index ce281c685b..44e5341f64 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp @@ -70,6 +70,10 @@ using namespace Theme; #define BACK_POS BTN_POS(1,6), BTN_SIZE(3,1) #endif +#ifndef Z_ALIGN_COMMANDS + #define Z_ALIGN_COMMANDS "G34" +#endif + void LevelingMenu::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { CommandProcessor cmd; @@ -116,7 +120,7 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); break; #if ANY(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION, X_LEVEL_SEQUENCE) - case 2: SpinnerDialogBox::enqueueAndWait(F(LEVELING_COMMANDS)); break; + case 2: SpinnerDialogBox::enqueueAndWait(F(Z_ALIGN_COMMANDS)); break; #endif #if HAS_BED_PROBE case 3: diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp index ddd273aa47..3511ce3719 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp @@ -33,86 +33,60 @@ void StepperCurrentScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(0); w.units(GET_TEXT_F(MSG_UNITS_MILLIAMP)); - w.heading( GET_TEXT_F(MSG_TMC_CURRENT)); - #if AXIS_IS_TMC(X) - w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) ); - #endif - #if AXIS_IS_TMC(X2) - w.color(x_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_X2), getAxisCurrent_mA(X2) ); - #endif - #if AXIS_IS_TMC(Y) - w.color(y_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) ); - #endif - #if AXIS_IS_TMC(Y2) - w.color(x_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_Y2), getAxisCurrent_mA(Y2) ); - #endif - #if AXIS_IS_TMC(Z) - w.color(z_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) ); - #endif - #if AXIS_IS_TMC(Z2) - w.color(z_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_Z2), getAxisCurrent_mA(Z2) ); - #endif - #if AXIS_IS_TMC(E0) - w.color(e_axis) .adjuster(14, GET_TEXT_F( - #if EXTRUDERS == 1 - MSG_AXIS_E - #else - MSG_AXIS_E1 - #endif - ), getAxisCurrent_mA(E0) ); - #endif - #if AXIS_IS_TMC(E1) - w.color(e_axis).adjuster(16, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1) ); - #endif - #if AXIS_IS_TMC(E2) - w.color(e_axis).adjuster(18, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2) ); - #endif - #if AXIS_IS_TMC(E3) - w.color(e_axis).adjuster(20, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3) ); - #endif + w.heading(GET_TEXT_F(MSG_TMC_CURRENT)); + TERN_(X_IS_TRINAMIC, w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) ) ); + TERN_(X2_IS_TRINAMIC, w.color(x_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_X2), getAxisCurrent_mA(X2)) ); + TERN_(Y_IS_TRINAMIC, w.color(y_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) ) ); + TERN_(Y2_IS_TRINAMIC, w.color(x_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_Y2), getAxisCurrent_mA(Y2)) ); + TERN_(Z_IS_TRINAMIC, w.color(z_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) ) ); + TERN_(Z2_IS_TRINAMIC, w.color(z_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_Z2), getAxisCurrent_mA(Z2)) ); + TERN_(E0_IS_TRINAMIC, w.color(e_axis) .adjuster(14, GET_TEXT_F(TERN(HAS_MULTI_EXTRUDER, MSG_AXIS_E1, MSG_AXIS_E)), getAxisCurrent_mA(E0)) ); + TERN_(E1_IS_TRINAMIC, w.color(e_axis) .adjuster(16, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1)) ); + TERN_(E2_IS_TRINAMIC, w.color(e_axis) .adjuster(18, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2)) ); + TERN_(E3_IS_TRINAMIC, w.color(e_axis) .adjuster(20, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3)) ); w.increments(); } bool StepperCurrentScreen::onTouchHeld(uint8_t tag) { const float increment = getIncrement(); switch (tag) { - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC case 2: UI_DECREMENT(AxisCurrent_mA, X ); break; case 3: UI_INCREMENT(AxisCurrent_mA, X ); break; #endif - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC case 4: UI_DECREMENT(AxisCurrent_mA, X2 ); break; case 5: UI_INCREMENT(AxisCurrent_mA, X2 ); break; #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC case 6: UI_DECREMENT(AxisCurrent_mA, Y ); break; case 7: UI_INCREMENT(AxisCurrent_mA, Y ); break; #endif - #if AXIS_IS_TMC(Y2) + #if Y2_IS_TRINAMIC case 8: UI_DECREMENT(AxisCurrent_mA, Y2 ); break; case 9: UI_INCREMENT(AxisCurrent_mA, Y2 ); break; #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC case 10: UI_DECREMENT(AxisCurrent_mA, Z ); break; case 11: UI_INCREMENT(AxisCurrent_mA, Z ); break; #endif - #if AXIS_IS_TMC(Z2) + #if Z2_IS_TRINAMIC case 12: UI_DECREMENT(AxisCurrent_mA, Z2 ); break; case 13: UI_INCREMENT(AxisCurrent_mA, Z2 ); break; #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC case 14: UI_DECREMENT(AxisCurrent_mA, E0); break; case 15: UI_INCREMENT(AxisCurrent_mA, E0); break; #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC case 16: UI_DECREMENT(AxisCurrent_mA, E1); break; case 17: UI_INCREMENT(AxisCurrent_mA, E1); break; #endif - #if AXIS_IS_TMC(E2) + #if E2_IS_TRINAMIC case 18: UI_DECREMENT(AxisCurrent_mA, E2); break; case 19: UI_INCREMENT(AxisCurrent_mA, E2); break; #endif - #if AXIS_IS_TMC(E3) + #if E3_IS_TRINAMIC case 20: UI_DECREMENT(AxisCurrent_mA, E3); break; case 21: UI_INCREMENT(AxisCurrent_mA, E3); break; #endif diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp index 660d7faed7..8fb672931d 100644 --- a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp @@ -100,7 +100,7 @@ void RTS::onStartup() { delay_ms(400); // Delay to allow screen to configure #if ENABLED(CONFIGURABLE_MACHINE_NAME) - const MString<32> ready(message_string, " Ready"); + const MString<32> ready(machine_name, " Ready"); onStatusChanged(ready); #else onStatusChanged(F(MACHINE_NAME " Ready")); diff --git a/Marlin/src/lcd/extui/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/mks_ui/draw_dialog.cpp index 4b2474a8e6..8713bf8909 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_dialog.cpp @@ -123,6 +123,7 @@ static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { #endif } else if (DIALOG_IS(TYPE_FINISH_PRINT)) { + uiCfg.print_state = IDLE; clear_cur_ui(); lv_draw_ready_print(); } diff --git a/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp index 400b294701..c44cabd10a 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp @@ -102,13 +102,13 @@ static void disp_key_value() { #endif #if HAS_X_AXIS - case XMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, public_buf_m); break; + case XMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Y_AXIS - case YMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, public_buf_m); break; + case YMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Z_AXIS - case ZMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, public_buf_m); break; + case ZMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_EXTRUDERS case E0MaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, public_buf_m); break; @@ -134,13 +134,13 @@ static void disp_key_value() { #if ENABLED(EDITABLE_STEPS_PER_UNIT) #if HAS_X_AXIS - case Xstep: dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, public_buf_m); break; + case Xstep: dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Y_AXIS - case Ystep: dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, public_buf_m); break; + case Ystep: dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Z_AXIS - case Zstep: dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, public_buf_m); break; + case Zstep: dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_EXTRUDERS case E0step: dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, public_buf_m); break; @@ -150,21 +150,11 @@ static void disp_key_value() { #endif #endif - #if AXIS_IS_TMC(X) - case Xcurrent: dtostrf(stepperX.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(Y) - case Ycurrent: dtostrf(stepperY.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(Z) - case Zcurrent: dtostrf(stepperZ.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(E0) - case E0current: dtostrf(stepperE0.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(E1) - case E1current: dtostrf(stepperE1.getMilliamps(), 1, 1, public_buf_m); break; - #endif + case Xcurrent: TERN_(X_IS_TRINAMIC, dtostrf(stepperX.getMilliamps(), 1, 1, public_buf_m)); break; + case Ycurrent: TERN_(Y_IS_TRINAMIC, dtostrf(stepperY.getMilliamps(), 1, 1, public_buf_m)); break; + case Zcurrent: TERN_(Z_IS_TRINAMIC, dtostrf(stepperZ.getMilliamps(), 1, 1, public_buf_m)); break; + case E0current: TERN_(E0_IS_TRINAMIC, dtostrf(stepperE0.getMilliamps(), 1, 1, public_buf_m)); break; + case E1current: TERN_(E1_IS_TRINAMIC, dtostrf(stepperE1.getMilliamps(), 1, 1, public_buf_m)); break; case pause_pos_x: dtostrf(gCfgItems.pausePosX, 1, 1, public_buf_m); break; case pause_pos_y: dtostrf(gCfgItems.pausePosY, 1, 1, public_buf_m); break; @@ -275,21 +265,11 @@ static void set_value_confirm() { case E1step: planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); planner.refresh_positioning(); break; #endif - #if AXIS_IS_TMC(X) - case Xcurrent: stepperX.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(Y) - case Ycurrent: stepperY.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(Z) - case Zcurrent: stepperZ.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(E0) - case E0current: stepperE0.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(E1) - case E1current: stepperE1.rms_current(atoi(key_value)); break; - #endif + case Xcurrent: TERN_(X_IS_TRINAMIC, stepperX.rms_current(atoi(key_value))); break; + case Ycurrent: TERN_(Y_IS_TRINAMIC, stepperY.rms_current(atoi(key_value))); break; + case Zcurrent: TERN_(Z_IS_TRINAMIC, stepperZ.rms_current(atoi(key_value))); break; + case E0current: TERN_(E0_IS_TRINAMIC, stepperE0.rms_current(atoi(key_value))); break; + case E1current: TERN_(E1_IS_TRINAMIC, stepperE1.rms_current(atoi(key_value))); break; case pause_pos_x: gCfgItems.pausePosX = atof(key_value); update_spi_flash(); break; case pause_pos_y: gCfgItems.pausePosY = atof(key_value); update_spi_flash(); break; diff --git a/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp index b243c88705..cbb2bc059f 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp @@ -49,34 +49,16 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; lv_clear_tmc_current_settings(); switch (obj->mks_obj_id) { - case ID_TMC_CURRENT_RETURN: - uiCfg.para_ui_page = false; - draw_return_ui(); - return; - #if AXIS_IS_TMC(X) - case ID_TMC_CURRENT_X: value = Xcurrent; break; - #endif - #if AXIS_IS_TMC(Y) - case ID_TMC_CURRENT_Y: value = Ycurrent; break; - #endif - #if AXIS_IS_TMC(Z) - case ID_TMC_CURRENT_Z: value = Zcurrent; break; - #endif - #if AXIS_IS_TMC(E0) - case ID_TMC_CURRENT_E0: value = E0current; break; - #endif - #if AXIS_IS_TMC(E1) - case ID_TMC_CURRENT_E1: value = E1current; break; - #endif + case ID_TMC_CURRENT_RETURN: uiCfg.para_ui_page = false; draw_return_ui(); return; - case ID_TMC_CURRENT_UP: - uiCfg.para_ui_page = false; - lv_draw_tmc_current_settings(); - return; - case ID_TMC_CURRENT_DOWN: - uiCfg.para_ui_page = true; - lv_draw_tmc_current_settings(); - return; + case ID_TMC_CURRENT_X: TERN_(X_IS_TRINAMIC, value = Xcurrent); break; + case ID_TMC_CURRENT_Y: TERN_(Y_IS_TRINAMIC, value = Ycurrent); break; + case ID_TMC_CURRENT_Z: TERN_(Z_IS_TRINAMIC, value = Zcurrent); break; + case ID_TMC_CURRENT_E0: TERN_(E0_IS_TRINAMIC, value = E0current); break; + case ID_TMC_CURRENT_E1: TERN_(E1_IS_TRINAMIC, value = E1current); break; + + case ID_TMC_CURRENT_UP: uiCfg.para_ui_page = false; lv_draw_tmc_current_settings(); return; + case ID_TMC_CURRENT_DOWN: uiCfg.para_ui_page = true; lv_draw_tmc_current_settings(); return; } lv_draw_number_key(); @@ -87,46 +69,26 @@ void lv_draw_tmc_current_settings() { float milliamps; if (!uiCfg.para_ui_page) { - #if AXIS_IS_TMC(X) - milliamps = stepperX.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(X_IS_TRINAMIC, stepperX.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.X_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_X, 0, public_buf_l); - #if AXIS_IS_TMC(Y) - milliamps = stepperY.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(Y_IS_TRINAMIC, stepperY.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Y_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_TMC_CURRENT_Y, 1, public_buf_l); - #if AXIS_IS_TMC(Z) - milliamps = stepperZ.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(Z_IS_TRINAMIC, stepperZ.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Z_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_TMC_CURRENT_Z, 2, public_buf_l); - #if AXIS_IS_TMC(E0) - milliamps = stepperE0.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(E0_IS_TRINAMIC, stepperE0.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E0_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_TMC_CURRENT_E0, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_CURRENT_DOWN, true); } else { - #if AXIS_IS_TMC(E1) - milliamps = stepperE1.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(E1_IS_TRINAMIC, stepperE1.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E1_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_E1, 0, public_buf_l); @@ -137,9 +99,8 @@ void lv_draw_tmc_current_settings() { } void lv_clear_tmc_current_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif + if (TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable)) + lv_group_remove_all_objs(g); lv_obj_del(scr); } diff --git a/Marlin/src/lcd/extui/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/mks_ui/tft_Language_en.h index 5195986e35..f012b17ea7 100644 --- a/Marlin/src/lcd/extui/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/mks_ui/tft_Language_en.h @@ -399,8 +399,8 @@ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN "Heat completed,please load filament \nto extruder,and click \nfor start loading." #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_EN "Please load filament to extruder,\nand click for start loading." #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_EN "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_EN "Is unloading,please wait!" +#define FILAMENT_DIALOG_LOADING_TIPS_EN "Is loading, please wait!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_EN "Is unloading, please wait!" #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN "Load filament completed,\nclick for return!" #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN "Unload filament completed,\nclick for return!" diff --git a/Marlin/src/lcd/extui/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/mks_ui/tft_Language_it.h index b74842afef..2be8f7d17b 100644 --- a/Marlin/src/lcd/extui/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/mks_ui/tft_Language_it.h @@ -149,8 +149,8 @@ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT "Heat completed,please load filament \nto extruder,and click \nfor start loading." #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_IT "Please load filament to extruder,\nand click for start loading." #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading,please wait!" +#define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading, please wait!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading, please wait!" #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,\nclick for return!" #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,\nclick for return!" diff --git a/Marlin/src/lcd/extui/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/mks_ui/tft_Language_ru.h index da36ed14c7..aced93f4b6 100644 --- a/Marlin/src/lcd/extui/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/mks_ui/tft_Language_ru.h @@ -148,8 +148,8 @@ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU "Heat completed,please load filament \nto extruder,and click \nfor start loading." #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_RU "Please load filament to extruder,\nand click for start loading." #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_RU "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_RU "Is unloading,please wait!" +#define FILAMENT_DIALOG_LOADING_TIPS_RU "Is loading, please wait!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_RU "Is unloading, please wait!" #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU "Load filament completed,\nclick for return!" #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU "Unload filament completed,\nclick for return!" diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index a53b5f5dba..b88df6ee9d 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -438,156 +438,68 @@ namespace ExtUI { #if HAS_TRINAMIC_CONFIG float getAxisCurrent_mA(const axis_t axis) { switch (axis) { - #if AXIS_IS_TMC(X) - case X: return stepperX.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y) - case Y: return stepperY.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z) - case Z: return stepperZ.getMilliamps(); - #endif - #if AXIS_IS_TMC(I) - case I: return stepperI.getMilliamps(); - #endif - #if AXIS_IS_TMC(J) - case J: return stepperJ.getMilliamps(); - #endif - #if AXIS_IS_TMC(K) - case K: return stepperK.getMilliamps(); - #endif - #if AXIS_IS_TMC(U) - case U: return stepperU.getMilliamps(); - #endif - #if AXIS_IS_TMC(V) - case V: return stepperV.getMilliamps(); - #endif - #if AXIS_IS_TMC(W) - case W: return stepperW.getMilliamps(); - #endif - #if AXIS_IS_TMC(X2) - case X2: return stepperX2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y2) - case Y2: return stepperY2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z2) - case Z2: return stepperZ2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z3) - case Z3: return stepperZ3.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z4) - case Z4: return stepperZ4.getMilliamps(); - #endif + OPTCODE(X_IS_TRINAMIC, case X: return stepperX.getMilliamps()) + OPTCODE(Y_IS_TRINAMIC, case Y: return stepperY.getMilliamps()) + OPTCODE(Z_IS_TRINAMIC, case Z: return stepperZ.getMilliamps()) + OPTCODE(I_IS_TRINAMIC, case I: return stepperI.getMilliamps()) + OPTCODE(J_IS_TRINAMIC, case J: return stepperJ.getMilliamps()) + OPTCODE(K_IS_TRINAMIC, case K: return stepperK.getMilliamps()) + OPTCODE(U_IS_TRINAMIC, case U: return stepperU.getMilliamps()) + OPTCODE(V_IS_TRINAMIC, case V: return stepperV.getMilliamps()) + OPTCODE(W_IS_TRINAMIC, case W: return stepperW.getMilliamps()) + OPTCODE(X2_IS_TRINAMIC, case X2: return stepperX2.getMilliamps()) + OPTCODE(Y2_IS_TRINAMIC, case Y2: return stepperY2.getMilliamps()) + OPTCODE(Z2_IS_TRINAMIC, case Z2: return stepperZ2.getMilliamps()) + OPTCODE(Z3_IS_TRINAMIC, case Z3: return stepperZ3.getMilliamps()) + OPTCODE(Z4_IS_TRINAMIC, case Z4: return stepperZ4.getMilliamps()) default: return NAN; }; } float getAxisCurrent_mA(const extruder_t extruder) { switch (extruder) { - #if AXIS_IS_TMC(E0) - case E0: return stepperE0.getMilliamps(); - #endif - #if AXIS_IS_TMC(E1) - case E1: return stepperE1.getMilliamps(); - #endif - #if AXIS_IS_TMC(E2) - case E2: return stepperE2.getMilliamps(); - #endif - #if AXIS_IS_TMC(E3) - case E3: return stepperE3.getMilliamps(); - #endif - #if AXIS_IS_TMC(E4) - case E4: return stepperE4.getMilliamps(); - #endif - #if AXIS_IS_TMC(E5) - case E5: return stepperE5.getMilliamps(); - #endif - #if AXIS_IS_TMC(E6) - case E6: return stepperE6.getMilliamps(); - #endif - #if AXIS_IS_TMC(E7) - case E7: return stepperE7.getMilliamps(); - #endif + OPTCODE(E0_IS_TRINAMIC, case E0: return stepperE0.getMilliamps()) + OPTCODE(E1_IS_TRINAMIC, case E1: return stepperE1.getMilliamps()) + OPTCODE(E2_IS_TRINAMIC, case E2: return stepperE2.getMilliamps()) + OPTCODE(E3_IS_TRINAMIC, case E3: return stepperE3.getMilliamps()) + OPTCODE(E4_IS_TRINAMIC, case E4: return stepperE4.getMilliamps()) + OPTCODE(E5_IS_TRINAMIC, case E5: return stepperE5.getMilliamps()) + OPTCODE(E6_IS_TRINAMIC, case E6: return stepperE6.getMilliamps()) + OPTCODE(E7_IS_TRINAMIC, case E7: return stepperE7.getMilliamps()) default: return NAN; }; } void setAxisCurrent_mA(const_float_t mA, const axis_t axis) { switch (axis) { - #if AXIS_IS_TMC(X) - case X: stepperX.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Y) - case Y: stepperY.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z) - case Z: stepperZ.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(I) - case I: stepperI.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(J) - case J: stepperJ.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(K) - case K: stepperK.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(U) - case U: stepperU.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(V) - case V: stepperV.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(W) - case W: stepperW.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(X2) - case X2: stepperX2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Y2) - case Y2: stepperY2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z2) - case Z2: stepperZ2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z3) - case Z3: stepperZ3.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z4) - case Z4: stepperZ4.rms_current(constrain(mA, 400, 1500)); break; - #endif + case X: TERN_(X_IS_TRINAMIC, stepperX.rms_current(constrain(mA, 400, 1500))); break; + case Y: TERN_(Y_IS_TRINAMIC, stepperY.rms_current(constrain(mA, 400, 1500))); break; + case Z: TERN_(Z_IS_TRINAMIC, stepperZ.rms_current(constrain(mA, 400, 1500))); break; + case I: TERN_(I_IS_TRINAMIC, stepperI.rms_current(constrain(mA, 400, 1500))); break; + case J: TERN_(J_IS_TRINAMIC, stepperJ.rms_current(constrain(mA, 400, 1500))); break; + case K: TERN_(K_IS_TRINAMIC, stepperK.rms_current(constrain(mA, 400, 1500))); break; + case U: TERN_(U_IS_TRINAMIC, stepperU.rms_current(constrain(mA, 400, 1500))); break; + case V: TERN_(V_IS_TRINAMIC, stepperV.rms_current(constrain(mA, 400, 1500))); break; + case W: TERN_(W_IS_TRINAMIC, stepperW.rms_current(constrain(mA, 400, 1500))); break; + case X2: TERN_(X2_IS_TRINAMIC, stepperX2.rms_current(constrain(mA, 400, 1500))); break; + case Y2: TERN_(Y2_IS_TRINAMIC, stepperY2.rms_current(constrain(mA, 400, 1500))); break; + case Z2: TERN_(Z2_IS_TRINAMIC, stepperZ2.rms_current(constrain(mA, 400, 1500))); break; + case Z3: TERN_(Z3_IS_TRINAMIC, stepperZ3.rms_current(constrain(mA, 400, 1500))); break; + case Z4: TERN_(Z4_IS_TRINAMIC, stepperZ4.rms_current(constrain(mA, 400, 1500))); break; default: break; }; } void setAxisCurrent_mA(const_float_t mA, const extruder_t extruder) { switch (extruder) { - #if AXIS_IS_TMC(E0) - case E0: stepperE0.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E1) - case E1: stepperE1.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E2) - case E2: stepperE2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E3) - case E3: stepperE3.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E4) - case E4: stepperE4.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E5) - case E5: stepperE5.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E6) - case E6: stepperE6.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E7) - case E7: stepperE7.rms_current(constrain(mA, 400, 1500)); break; - #endif + case E0: TERN_(E0_IS_TRINAMIC, stepperE0.rms_current(constrain(mA, 400, 1500))); break; + case E1: TERN_(E1_IS_TRINAMIC, stepperE1.rms_current(constrain(mA, 400, 1500))); break; + case E2: TERN_(E2_IS_TRINAMIC, stepperE2.rms_current(constrain(mA, 400, 1500))); break; + case E3: TERN_(E3_IS_TRINAMIC, stepperE3.rms_current(constrain(mA, 400, 1500))); break; + case E4: TERN_(E4_IS_TRINAMIC, stepperE4.rms_current(constrain(mA, 400, 1500))); break; + case E5: TERN_(E5_IS_TRINAMIC, stepperE5.rms_current(constrain(mA, 400, 1500))); break; + case E6: TERN_(E6_IS_TRINAMIC, stepperE6.rms_current(constrain(mA, 400, 1500))); break; + case E7: TERN_(E7_IS_TRINAMIC, stepperE7.rms_current(constrain(mA, 400, 1500))); break; default: break; }; } @@ -614,48 +526,20 @@ namespace ExtUI { void setTMCBumpSensitivity(const_float_t value, const axis_t axis) { switch (axis) { - #if X_SENSORLESS - case X: stepperX.homing_threshold(value); break; - #endif - #if Y_SENSORLESS - case Y: stepperY.homing_threshold(value); break; - #endif - #if Z_SENSORLESS - case Z: stepperZ.homing_threshold(value); break; - #endif - #if I_SENSORLESS - case I: stepperI.homing_threshold(value); break; - #endif - #if J_SENSORLESS - case J: stepperJ.homing_threshold(value); break; - #endif - #if K_SENSORLESS - case K: stepperK.homing_threshold(value); break; - #endif - #if U_SENSORLESS - case U: stepperU.homing_threshold(value); break; - #endif - #if V_SENSORLESS - case V: stepperV.homing_threshold(value); break; - #endif - #if W_SENSORLESS - case W: stepperW.homing_threshold(value); break; - #endif - #if X2_SENSORLESS - case X2: stepperX2.homing_threshold(value); break; - #endif - #if Y2_SENSORLESS - case Y2: stepperY2.homing_threshold(value); break; - #endif - #if Z2_SENSORLESS - case Z2: stepperZ2.homing_threshold(value); break; - #endif - #if Z3_SENSORLESS - case Z3: stepperZ3.homing_threshold(value); break; - #endif - #if Z4_SENSORLESS - case Z4: stepperZ4.homing_threshold(value); break; - #endif + case X: TERN_(X_SENSORLESS, stepperX.homing_threshold(value)); break; + case Y: TERN_(Y_SENSORLESS, stepperY.homing_threshold(value)); break; + case Z: TERN_(Z_SENSORLESS, stepperZ.homing_threshold(value)); break; + case I: TERN_(I_SENSORLESS, stepperI.homing_threshold(value)); break; + case J: TERN_(J_SENSORLESS, stepperJ.homing_threshold(value)); break; + case K: TERN_(K_SENSORLESS, stepperK.homing_threshold(value)); break; + case U: TERN_(U_SENSORLESS, stepperU.homing_threshold(value)); break; + case V: TERN_(V_SENSORLESS, stepperV.homing_threshold(value)); break; + case W: TERN_(W_SENSORLESS, stepperW.homing_threshold(value)); break; + case X2: TERN_(X2_SENSORLESS, stepperX2.homing_threshold(value)); break; + case Y2: TERN_(Y2_SENSORLESS, stepperY2.homing_threshold(value)); break; + case Z2: TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(value)); break; + case Z3: TERN_(Z3_SENSORLESS, stepperZ3.homing_threshold(value)); break; + case Z4: TERN_(Z4_SENSORLESS, stepperZ4.homing_threshold(value)); break; default: break; } UNUSED(value); @@ -811,6 +695,9 @@ namespace ExtUI { #if HAS_HEATED_BED uint16_t getMaterial_preset_B(const uint16_t index) { return ui.material_preset[index].bed_temp; } #endif + #if HAS_HEATED_CHAMBER + uint16_t getMaterial_preset_C(const uint16_t index) { return ui.material_preset[index].chamber_temp; } + #endif #endif feedRate_t getFeedrate_mm_s() { return feedrate_mm_s; } diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 2676d72aea..5e781706bc 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -214,6 +214,9 @@ namespace ExtUI { #if HAS_HEATED_BED uint16_t getMaterial_preset_B(const uint16_t); #endif + #if HAS_HEATED_CHAMBER + uint16_t getMaterial_preset_C(const uint16_t); + #endif #endif // IDEX Machine Mode @@ -427,7 +430,7 @@ namespace ExtUI { float getPID_Kp(const extruder_t); float getPID_Ki(const extruder_t); float getPID_Kd(const extruder_t); - void setPID(const_float_t, const_float_t , const_float_t , extruder_t); + void setPID(const_float_t, const_float_t, const_float_t, extruder_t); void startPIDTune(const celsius_t, extruder_t); #endif @@ -436,7 +439,7 @@ namespace ExtUI { float getBedPID_Kp(); float getBedPID_Ki(); float getBedPID_Kd(); - void setBedPID(const_float_t, const_float_t , const_float_t); + void setBedPID(const_float_t, const_float_t, const_float_t); void startBedPIDTune(const celsius_t); #endif diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 814c9ffde8..9a01466227 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -534,7 +534,8 @@ namespace LanguageNarrow_cz { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybridní práh"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Domů bez senzorů"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Režim kroků"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop povolen"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" za:"); LSTR MSG_BACKLASH = _UxGT("Vůle"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index edc3d4361d..23730d321a 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -719,7 +719,8 @@ namespace LanguageNarrow_de { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid threshold"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorloses Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Schrittmodus"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop einsch."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" im:"); LSTR MSG_BACKLASH = _UxGT("Spiel"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index b033dc3c74..d184c0358f 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -155,6 +155,7 @@ namespace LanguageNarrow_en { LSTR MSG_PREHEAT_M_END_E = _UxGT("Preheat $ End ~"); LSTR MSG_PREHEAT_M_ALL = _UxGT("Preheat $ All"); LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preheat $ Bed"); + LSTR MSG_PREHEAT_M_CHAMBER = _UxGT("Preheat $ Chmb"); LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preheat $ Conf"); LSTR MSG_PREHEAT_HOTEND = _UxGT("Preheat Hotend"); @@ -197,6 +198,7 @@ namespace LanguageNarrow_en { LSTR MSG_MESH_VIEWER = _UxGT("Mesh Viewer"); LSTR MSG_EDIT_MESH = _UxGT("Edit Mesh"); LSTR MSG_MESH_VIEW = _UxGT("View Mesh"); + LSTR MSG_MESH_VIEW_GRID = _UxGT("View Mesh (grid)"); LSTR MSG_EDITING_STOPPED = _UxGT("Mesh Editing Stopped"); LSTR MSG_NO_VALID_MESH = _UxGT("No valid mesh"); LSTR MSG_ACTIVATE_MESH = _UxGT("Activate Leveling"); @@ -220,7 +222,9 @@ namespace LanguageNarrow_en { LSTR MSG_M48_TEST = _UxGT("M48 Probe Test"); LSTR MSG_M48_POINT = _UxGT("M48 Point"); LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Probe out of bounds"); + LSTR MSG_M48_DEV = _UxGT("Dev"); LSTR MSG_M48_DEVIATION = _UxGT("Deviation"); + LSTR MSG_M48_MAX_DELTA = _UxGT("Max delta"); LSTR MSG_IDEX_MENU = _UxGT("IDEX Mode"); LSTR MSG_OFFSETS_MENU = _UxGT("Tool Offsets"); LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); @@ -448,6 +452,7 @@ namespace LanguageNarrow_en { LSTR MSG_AMAX_EN = _UxGT("Max * Accel"); LSTR MSG_A_RETRACT = _UxGT("Retract Accel"); LSTR MSG_A_TRAVEL = _UxGT("Travel Accel"); + LSTR MSG_A_SPINDLE = _UxGT("Spindle Accel"); LSTR MSG_INPUT_SHAPING = _UxGT("Input Shaping"); LSTR MSG_SHAPING_ENABLE_N = _UxGT("Enable @ shaping"); LSTR MSG_SHAPING_DISABLE_N = _UxGT("Disable @ shaping"); @@ -870,6 +875,7 @@ namespace LanguageNarrow_en { LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purging...")); LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Click to finish")); LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Resuming...")); + LSTR MSG_TMC_DRIVERS = _UxGT("TMC Drivers"); LSTR MSG_TMC_CURRENT = _UxGT("Driver Current"); LSTR MSG_TMC_ACURRENT = STR_A _UxGT("Driver Current"); @@ -879,7 +885,9 @@ namespace LanguageNarrow_en { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_TMC_HOMING_CURRENT = _UxGT("Homing Current"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" in:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); @@ -887,7 +895,7 @@ namespace LanguageNarrow_en { LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing"); LSTR MSG_FIXED_TIME_MOTION = _UxGT("Fixed-Time Motion"); - LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Comp. Mode:"); + LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Comp. Mode: $"); LSTR MSG_FTM_ZV = _UxGT("ZV"); LSTR MSG_FTM_ZVD = _UxGT("ZVD"); LSTR MSG_FTM_ZVDD = _UxGT("ZVDD"); @@ -898,7 +906,7 @@ namespace LanguageNarrow_en { LSTR MSG_FTM_MZV = _UxGT("MZV"); //LSTR MSG_FTM_ULENDO_FBS = _UxGT("Ulendo FBS"); //LSTR MSG_FTM_DISCTF = _UxGT("DISCTF"); - LSTR MSG_FTM_DYN_MODE = _UxGT("DF Mode:"); + LSTR MSG_FTM_DYN_MODE = _UxGT("DF Mode: $"); LSTR MSG_FTM_Z_BASED = _UxGT("Z-based"); LSTR MSG_FTM_MASS_BASED = _UxGT("Mass-based"); LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Base Freq."); @@ -1109,6 +1117,8 @@ namespace LanguageWide_en { LSTR MSG_HOMING_FEEDRATE_Y = _UxGT("Y Homing Feedrate"); LSTR MSG_HOMING_FEEDRATE_Z = _UxGT("Z Homing Feedrate"); LSTR MSG_EEPROM_INITIALIZED = _UxGT("Default Settings Restored"); + LSTR MSG_PREHEAT_M_CHAMBER = _UxGT("Preheat $ Chamber"); + LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preheat $ Config"); #endif } diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 1c7d5199d3..058b550f67 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -543,7 +543,8 @@ namespace LanguageNarrow_es { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Límite Hibrido"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Origen sin sensores"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reiniciar"); LSTR MSG_SERVICE_IN = _UxGT(" dentro:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index b499b32f7b..13bee9fbb8 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -573,7 +573,8 @@ namespace LanguageNarrow_fr { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Seuil hybride"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Home sans capteur"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Mode pas à pas"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop activé"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Réinit."); LSTR MSG_SERVICE_IN = _UxGT(" dans:"); LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correction"); diff --git a/Marlin/src/lcd/language/language_fr_na.h b/Marlin/src/lcd/language/language_fr_na.h index 995a5ecd27..a3da3082de 100644 --- a/Marlin/src/lcd/language/language_fr_na.h +++ b/Marlin/src/lcd/language/language_fr_na.h @@ -576,7 +576,8 @@ namespace LanguageNarrow_fr_na { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Seuil hybride"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Home sans capteur"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Mode pas a pas"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop active"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reinit."); LSTR MSG_SERVICE_IN = _UxGT(" dans:"); LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correction"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 37c1aa292a..3287ae2676 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -558,7 +558,8 @@ namespace LanguageNarrow_gl { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Limiar Hibrido"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Orixe sen Sensores"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reiniciar"); LSTR MSG_SERVICE_IN = _UxGT(" dentro:"); LSTR MSG_BACKLASH = _UxGT("Reacción"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index d987416269..a626aa2209 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -630,7 +630,8 @@ namespace LanguageNarrow_hu { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hibrid küszöbérték"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Motoros kezdöpont"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Léptetö mód"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop mód"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Újraindítás"); LSTR MSG_SERVICE_IN = _UxGT(" be:"); LSTR MSG_BACKLASH = _UxGT("Holtjáték"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 0a7302b0f8..c1b5366332 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -852,7 +852,8 @@ namespace LanguageNarrow_it { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Soglia modo ibrido"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo Stepping"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop abil."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Resetta"); LSTR MSG_SERVICE_IN = _UxGT(" tra:"); LSTR MSG_BACKLASH = _UxGT("Gioco"); @@ -860,8 +861,8 @@ namespace LanguageNarrow_it { LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Appianamento"); LSTR MSG_FIXED_TIME_MOTION = _UxGT("Movimento a Tempo-Fisso"); - LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Modo Comp:"); - LSTR MSG_FTM_DYN_MODE = _UxGT("Modo DF:"); + LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Modo Comp: $"); + LSTR MSG_FTM_DYN_MODE = _UxGT("Modo DF: $"); LSTR MSG_FTM_Z_BASED = _UxGT("Base-Z"); LSTR MSG_FTM_MASS_BASED = _UxGT("Base-Massa"); LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Freq. base"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index ff82bb39ba..0b263a4ea6 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -570,7 +570,8 @@ namespace LanguageNarrow_ro { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" in:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 6b3fbebd08..991fd638ef 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -636,7 +636,7 @@ namespace LanguageNarrow_ru { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Гибридный режим"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Чувствительность"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Режим драйвера"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим вкл"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("Тихий режим вкл"); LSTR MSG_SERVICE_RESET = _UxGT("Сброс"); LSTR MSG_SERVICE_IN = _UxGT(" в:"); @@ -811,7 +811,7 @@ namespace LanguageNarrow_ru { // did not translate as there is no local terms/slang yet LSTR MSG_FIXED_TIME_MOTION = _UxGT("FT Motion"); - LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Режим комп.:"); + LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Режим комп.: $"); LSTR MSG_FTM_ZV = _UxGT("ZV"); LSTR MSG_FTM_ZVD = _UxGT("ZVD"); LSTR MSG_FTM_EI = _UxGT("EI"); @@ -820,7 +820,7 @@ namespace LanguageNarrow_ru { LSTR MSG_FTM_MZV = _UxGT("MZV"); //LSTR MSG_FTM_ULENDO_FBS = _UxGT("Ulendo ФBС"); //LSTR MSG_FTM_DISCTF = _UxGT("DISCTF"); - LSTR MSG_FTM_DYN_MODE = _UxGT("DF Mode:"); + LSTR MSG_FTM_DYN_MODE = _UxGT("DF Mode: $"); LSTR MSG_FTM_Z_BASED = _UxGT("Z-based"); LSTR MSG_FTM_MASS_BASED = _UxGT("Mass-based"); LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Base Freq."); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 32683cf2ed..782f42f118 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -761,7 +761,8 @@ namespace LanguageNarrow_sk { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybridný prah"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Bezsenzor. domov"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Režim krokovania"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop zapnutý"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Vynulovať"); LSTR MSG_SERVICE_IN = _UxGT("za:"); LSTR MSG_BACKLASH = _UxGT("Kompenz. vôle"); diff --git a/Marlin/src/lcd/language/language_sv.h b/Marlin/src/lcd/language/language_sv.h index 8827252132..356a253b6e 100644 --- a/Marlin/src/lcd/language/language_sv.h +++ b/Marlin/src/lcd/language/language_sv.h @@ -614,7 +614,8 @@ namespace LanguageNarrow_sv { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Tröskelvärde"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorlös Hemning"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stegningsläge"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Smyghack Aktiverad"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("Smyghack"); + LSTR MSG_SERVICE_RESET = _UxGT("Återställ"); LSTR MSG_SERVICE_IN = _UxGT(" in:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index baebbe9d1e..947f094fa6 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -787,7 +787,8 @@ namespace LanguageNarrow_tr { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hibrit Eşiği"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensörsüz Sıfırlama"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Adım Modu"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Aktif"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Resetle"); LSTR MSG_SERVICE_IN = _UxGT(" içinde:"); LSTR MSG_BACKLASH = _UxGT("Ters Tepki"); @@ -795,7 +796,7 @@ namespace LanguageNarrow_tr { LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Yumuşatma"); LSTR MSG_FIXED_TIME_MOTION = _UxGT("Sabit Zamanlı Hareket"); - LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Telafi Modu:"); + LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Telafi Modu: $"); LSTR MSG_FTM_ZV = _UxGT("ZV"); LSTR MSG_FTM_ZVD = _UxGT("ZVD"); LSTR MSG_FTM_ZVDD = _UxGT("ZVDD"); @@ -806,7 +807,7 @@ namespace LanguageNarrow_tr { LSTR MSG_FTM_MZV = _UxGT("MZV"); //LSTR MSG_FTM_ULENDO_FBS = _UxGT("Ulendo FBS"); //LSTR MSG_FTM_DISCTF = _UxGT("DISCTF"); - LSTR MSG_FTM_DYN_MODE = _UxGT("DF Modu:"); + LSTR MSG_FTM_DYN_MODE = _UxGT("DF Modu: $"); LSTR MSG_FTM_Z_BASED = _UxGT("Z-based"); LSTR MSG_FTM_MASS_BASED = _UxGT("Mass-based"); LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Base Freq."); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 104d7f1ecf..c061b9ad02 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -663,7 +663,8 @@ namespace LanguageNarrow_uk { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Гібридний поріг"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Дім без кінцевиків"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Режим мікрокроку"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим увімк."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("Тихий режим увімк."); + LSTR MSG_SERVICE_RESET = _UxGT("Зкидання"); LSTR MSG_SERVICE_IN = _UxGT(" в:"); LSTR MSG_BACKLASH = _UxGT("Люфт"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index d1e98637b9..fb158e306b 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -436,7 +436,7 @@ namespace LanguageNarrow_vi { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Ngưỡng Hỗn Hợp"); // Hybrid threshold LSTR MSG_TMC_HOMING_THRS = _UxGT("Vô cảm biến"); // Sensorless homing LSTR MSG_TMC_STEPPING_MODE = _UxGT("Chế độ từng bước"); // Stepping mode - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("CắtTàngHình được kích hoạt"); // StealthChop enabled + LSTR MSG_TMC_STEALTHCHOP = _UxGT("CắtTàngHình"); // StealthChop LSTR MSG_SHORT_DAY = _UxGT("n"); // d - ngày - One character only LSTR MSG_SHORT_HOUR = _UxGT("g"); // h - giờ - One character only diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index eb6a973205..680ff8c9b0 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -580,7 +580,8 @@ namespace LanguageNarrow_zh_CN { LSTR MSG_TMC_HYBRID_THRS = _UxGT("混合阈值"); LSTR MSG_TMC_HOMING_THRS = _UxGT("无感回零"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("步进模式"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop已使能"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop已使能"); + LSTR MSG_SERVICE_RESET = _UxGT("复位"); LSTR MSG_SERVICE_IN = _UxGT(" 在:"); LSTR MSG_BACKLASH = _UxGT("回差"); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index e8946edb28..384bf65211 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -150,10 +150,20 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; void MarlinUI::apply_preheat(const uint8_t m, const uint8_t pmask, const uint8_t e/*=active_extruder*/) { const preheat_t &pre = material_preset[m]; - TERN_(HAS_HOTEND, if (TEST(pmask, PT_HOTEND)) thermalManager.setTargetHotend(pre.hotend_temp, e)); - TERN_(HAS_HEATED_BED, if (TEST(pmask, PT_BED)) thermalManager.setTargetBed(pre.bed_temp)); - //TERN_(HAS_HEATED_CHAMBER, if (TEST(pmask, PT_CHAMBER)) thermalManager.setTargetChamber(pre.chamber_temp)); - TERN_(HAS_FAN, if (TEST(pmask, PT_FAN)) thermalManager.set_fan_speed(0, pre.fan_speed)); + TERN_(HAS_HOTEND, if (TEST(pmask, PT_HOTEND)) thermalManager.setTargetHotend(pre.hotend_temp, e)); + TERN_(HAS_HEATED_BED, if (TEST(pmask, PT_BED)) thermalManager.setTargetBed(pre.bed_temp)); + TERN_(HAS_HEATED_CHAMBER, if (TEST(pmask, PT_CHAMBER)) thermalManager.setTargetChamber(pre.chamber_temp)); + TERN_(HAS_FAN, if (TEST(pmask, PT_FAN)) thermalManager.set_fan_speed(e, pre.fan_speed)); + #if HAS_FAN + if (TEST(pmask, PT_FAN)) { + const uint8_t fan_index = e < (FAN_COUNT) ? e : 0; + if (true + #if REDUNDANT_PART_COOLING_FAN + && fan_index != REDUNDANT_PART_COOLING_FAN + #endif + ) thermalManager.set_fan_speed(fan_index, pre.fan_speed); + } + #endif } #endif @@ -517,29 +527,27 @@ void MarlinUI::init() { #define ADC_MIN_KEY_DELAY 100 if (keypad_buttons) { - #if HAS_ENCODER_ACTION - refresh(LCDVIEW_REDRAW_NOW); - #if HAS_MARLINUI_MENU - if (encoderDirection == -(ENCODERBASE)) { // HAS_ADC_BUTTONS forces REVERSE_MENU_DIRECTION, so this indicates menu navigation - if (RRK(EN_KEYPAD_UP)) encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; - else if (RRK(EN_KEYPAD_DOWN)) encoderPosition -= ENCODER_STEPS_PER_MENU_ITEM; - else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } - else if (RRK(EN_KEYPAD_RIGHT)) { return_to_status(); quick_feedback(); } - } - else - #endif - { - #if HAS_MARLINUI_MENU - if (RRK(EN_KEYPAD_UP)) encoderPosition -= epps; - else if (RRK(EN_KEYPAD_DOWN)) encoderPosition += epps; - else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } - else if (RRK(EN_KEYPAD_RIGHT)) encoderPosition = 0; - #else - if (RRK(EN_KEYPAD_UP) || RRK(EN_KEYPAD_LEFT)) encoderPosition -= epps; - else if (RRK(EN_KEYPAD_DOWN) || RRK(EN_KEYPAD_RIGHT)) encoderPosition += epps; - #endif + refresh(LCDVIEW_REDRAW_NOW); + #if HAS_MARLINUI_MENU + if (encoderDirection == -(ENCODERBASE)) { // HAS_ADC_BUTTONS forces REVERSE_MENU_DIRECTION, so this indicates menu navigation + if (RRK(EN_KEYPAD_UP)) encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; + else if (RRK(EN_KEYPAD_DOWN)) encoderPosition -= ENCODER_STEPS_PER_MENU_ITEM; + else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } + else if (RRK(EN_KEYPAD_RIGHT)) { return_to_status(); quick_feedback(); } } + else #endif + { + #if HAS_MARLINUI_MENU + if (RRK(EN_KEYPAD_UP)) encoderPosition -= epps; + else if (RRK(EN_KEYPAD_DOWN)) encoderPosition += epps; + else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } + else if (RRK(EN_KEYPAD_RIGHT)) encoderPosition = 0; + #else + if (RRK(EN_KEYPAD_UP) || RRK(EN_KEYPAD_LEFT)) encoderPosition -= epps; + else if (RRK(EN_KEYPAD_DOWN) || RRK(EN_KEYPAD_RIGHT)) encoderPosition += epps; + #endif + } next_button_update_ms = millis() + ADC_MIN_KEY_DELAY; return true; } @@ -622,7 +630,7 @@ void MarlinUI::init() { // If the message will blink rather than expire... #if DISABLED(PROGRESS_MSG_ONCE) - if (ELAPSED(ms, progress_bar_ms + PROGRESS_BAR_MSG_TIME + PROGRESS_BAR_BAR_TIME)) + if (ELAPSED(ms, progress_bar_ms, PROGRESS_BAR_MSG_TIME + PROGRESS_BAR_BAR_TIME)) progress_bar_ms = ms; #endif @@ -1327,11 +1335,11 @@ void MarlinUI::init() { const int8_t pulses = epps * encoderDirection; if (BUTTON_PRESSED(UP)) { - encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * pulses; + encoderDiff = pulses * (ENCODER_STEPS_PER_MENU_ITEM); next_button_update_ms = now + 300; } else if (BUTTON_PRESSED(DOWN)) { - encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * pulses; + encoderDiff = pulses * -(ENCODER_STEPS_PER_MENU_ITEM); next_button_update_ms = now + 300; } else if (BUTTON_PRESSED(LEFT)) { @@ -1935,7 +1943,7 @@ uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind, settings.reset(); completion_feedback(); #if ENABLED(TOUCH_SCREEN_CALIBRATION) - if (touch_calibration.need_calibration()) ui.goto_screen(touch_screen_calibration); + if (touch_calibration.need_calibration()) goto_screen(touch_screen_calibration); #endif } diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index a47096a3bf..9f2ac5a69a 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -118,6 +118,9 @@ typedef bool (*statusResetFunc_t)(); #if HAS_HEATED_BED celsius_t bed_temp; #endif + #if HAS_HEATED_CHAMBER + celsius_t chamber_temp; + #endif #if HAS_FAN uint16_t fan_speed; #endif @@ -649,7 +652,8 @@ public: static void preheat_hotend(const uint8_t m, const uint8_t e=active_extruder) { TERN_(HAS_HOTEND, apply_preheat(m, _BV(PT_HOTEND))); } static void preheat_hotend_and_fan(const uint8_t m, const uint8_t e=active_extruder) { preheat_hotend(m, e); preheat_set_fan(m); } static void preheat_bed(const uint8_t m) { TERN_(HAS_HEATED_BED, apply_preheat(m, _BV(PT_BED))); } - static void preheat_all(const uint8_t m) { apply_preheat(m, PT_ALL); } + static void preheat_chamber(const uint8_t m) { TERN_(HAS_HEATED_CHAMBER, apply_preheat(m, _BV(PT_CHAMBER))); } + static void preheat_all(const uint8_t m, const uint8_t e=active_extruder) { apply_preheat(m, PT_ALL, e); } #endif static void reset_status_timeout(const millis_t ms) { diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index b886902d91..137439c6df 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -37,6 +37,10 @@ #include "../../gcode/parser.h" #endif +#if HAS_SPINDLE_ACCELERATION + #include "../../feature/spindle_laser.h" +#endif + #if HAS_BED_PROBE #include "../../module/probe.h" #endif @@ -88,7 +92,7 @@ void menu_backlash(); #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y) EDIT_CURRENT_PWM(STR_A STR_B, 0); #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z EDIT_CURRENT_PWM(STR_C, 1); #endif #if HAS_MOTOR_CURRENT_PWM_E @@ -100,6 +104,10 @@ void menu_backlash(); #endif #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) + #define HAS_ADV_FILAMENT_MENU 1 +#endif + +#if HAS_ADV_FILAMENT_MENU // // Advanced Settings > Filament // @@ -134,7 +142,7 @@ void menu_backlash(); EDIT_ITEM_FAST_N(float43, e, MSG_FILAMENT_DIAM_E, &planner.filament_size[e], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); #endif } - #endif + #endif // !NO_VOLUMETRICS #if ENABLED(CONFIGURE_FILAMENT_CHANGE) constexpr float extrude_maxlength = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 999); @@ -165,7 +173,7 @@ void menu_backlash(); END_MENU(); } -#endif // !NO_VOLUMETRICS || ADVANCED_PAUSE_FEATURE +#endif // HAS_ADV_FILAMENT_MENU // // Advanced Settings > Temperature helpers @@ -511,6 +519,9 @@ void menu_backlash(); #else const xyze_ulong_t &max_accel_edit_scaled = max_accel_edit; #endif + #if HAS_SPINDLE_ACCELERATION + constexpr uint32_t max_spindle_accel_edit = 99000; + #endif START_MENU(); BACK_ITEM(MSG_ADVANCED_SETTINGS); @@ -544,6 +555,10 @@ void menu_backlash(); EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS], 100, max_accel_edit_scaled.e, []{ planner.refresh_acceleration_rates(); }); #endif + #if HAS_SPINDLE_ACCELERATION + EDIT_ITEM_FAST(long5_25, MSG_A_SPINDLE, &cutter.acceleration_spindle_deg_per_s2, 100, max_spindle_accel_edit); + #endif + #ifdef XY_FREQUENCY_LIMIT EDIT_ITEM(int8, MSG_XY_FREQUENCY_LIMIT, &planner.xy_freq_limit_hz, 0, 100, planner.refresh_frequency_limit, true); editable.uint8 = uint8_t(LROUND(planner.xy_freq_min_speed_factor * 255)); // percent to u8 @@ -718,14 +733,14 @@ void menu_advanced_settings() { SUBMENU(MSG_TEMPERATURE, menu_advanced_temperature); #endif - #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) + #if HAS_ADV_FILAMENT_MENU SUBMENU(MSG_FILAMENT, menu_advanced_filament); #elif ENABLED(LIN_ADVANCE) #if DISTINCT_E < 2 EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 10); #else EXTRUDER_LOOP() - EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[e], 0, 10); + EDIT_ITEM_N(float42_52, e, MSG_ADVANCE_K_E, &planner.extruder_advance_K[e], 0, 10); #endif #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 65a2f222ce..259a81fb0e 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -112,7 +112,7 @@ void menu_advanced_settings(); #else #define S1_SPACE(I) #endif - #define STOP_ITEM(A,I,M,L) TERN(HAS_##A##I##_##M##_STATE, _STOP_ITEM, _IF_1_ELSE)(STRINGIFY(A) STRINGIFY(I) S1_SPACE(I) " " L, A##I##_##M) + #define STOP_ITEM(A,I,M,L) TERN(HAS_##A##I##_##M##_STATE, _STOP_ITEM, OMIT)(STRINGIFY(A) STRINGIFY(I) S1_SPACE(I) " " L, A##I##_##M) #define STOP_MINMAX(A,I) STOP_ITEM(A,I,MIN,"Min") STOP_ITEM(A,I,MAX,"Max") #define FIL_ITEM(N) PSTRING_ITEM_N_P(N-1, MSG_FILAMENT_EN, FILAMENT_IS_OUT(N) ? PSTR("out") : PSTR("PRESENT"), SS_FULL); @@ -451,6 +451,9 @@ void menu_advanced_settings(); #if HAS_HEATED_BED EDIT_ITEM(int3, MSG_BED, &ui.material_preset[m].bed_temp, BED_MINTEMP, BED_MAX_TARGET); #endif + #if HAS_HEATED_CHAMBER + EDIT_ITEM(int3, MSG_CHAMBER, &ui.material_preset[m].chamber_temp, CHAMBER_MINTEMP, CHAMBER_MAX_TARGET); + #endif #if ENABLED(EEPROM_SETTINGS) ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); #endif diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 46ebf85ba4..8d6e1b8adb 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -235,18 +235,15 @@ static FSTR_P pause_header() { // Portions from STATIC_ITEM... #define HOTEND_STATUS_ITEM() do { \ - if (_menuLineNr == _thisItemNr) { \ + if ( MY_LINE()) { \ if (ui.should_draw()) { \ IF_DISABLED(HAS_GRAPHICAL_TFT, MenuItem_static::draw(_lcdLineNr, GET_TEXT_F(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT)); \ ui.draw_hotend_status(_lcdLineNr, hotend_status_extruder); \ } \ - if (_skipStatic && encoderLine <= _thisItemNr) { \ - ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ - ++encoderLine; \ - } \ + STATIC_SKIP(); \ ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); \ } \ - ++_thisItemNr; \ + NEXT_ITEM(); \ }while(0) void menu_pause_option() { @@ -307,11 +304,9 @@ void lcd_pause_waiting_message() { _lcd_pause_message(GET_TEXT_F(MSG_ADVANCED_P void lcd_pause_resume_message() { _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); } void lcd_pause_purge_message() { - #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) - _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_CONT_PURGE)); - #else - _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_PURGE)); - #endif + _lcd_pause_message(GET_TEXT_F( + TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE) + )); } FORCE_INLINE screenFunc_t ap_message_screen(const PauseMessage message) { diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index d81b1a8843..af4558cefc 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -276,6 +276,14 @@ class MenuItem_bool : public MenuEditItemBase { * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, SPEED_EDIT_MIN, SPEED_EDIT_MAX) * MenuItem_int3::action(flabel, &feedrate_percentage, SPEED_EDIT_MIN, SPEED_EDIT_MAX) * MenuItem_int3::draw(sel, row, flabel, &feedrate_percentage, SPEED_EDIT_MIN, SPEED_EDIT_MAX) + * + * Variants use standard suffixes. N:Number Index, S:C-string for substitution, F:F-string label, f:F-string for substitution + * _MENU_ITEM_F(TYPE, V...) Item with optional data + * _MENU_ITEM_N_S_F(TYPE, N, S, V...) Item with index value, C-string, and optional data + * _MENU_ITEM_N_f_F(TYPE, N, f, V...) Item with index value and F-string + * _MENU_ITEM_N_F(TYPE, N, V...) Item with index value + * _MENU_ITEM_S_F(TYPE, S, V...) Item with a unique string + * _MENU_ITEM_f_F(TYPE, f, V...) Item with a unique F-string */ #if ENABLED(ENCODER_RATE_MULTIPLIER) @@ -401,7 +409,7 @@ class MenuItem_bool : public MenuEditItemBase { #define PSTRING_ITEM_F_P(FLABEL, PVAL, STYL) do{ \ constexpr int m = 20; \ char msg[m + 1]; \ - if (_menuLineNr == _thisItemNr) { \ + if (MY_LINE()) { \ msg[0] = ':'; msg[1] = ' '; \ strlcpy_P(msg + 2, PVAL, m - 1); \ if (msg[m - 1] & 0x80) msg[m - 1] = '\0'; \ @@ -410,8 +418,7 @@ class MenuItem_bool : public MenuEditItemBase { }while(0) #define PSTRING_ITEM_N_F_P(N, V...) do{ \ - if (_menuLineNr == _thisItemNr) \ - MenuItemBase::init(N); \ + if (MY_LINE()) MenuItemBase::init(N); \ PSTRING_ITEM_F_P(V); \ }while(0) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 6142e0e153..9509c72cc5 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -234,16 +234,6 @@ void menu_configuration(); #endif // CUSTOM_MENU_MAIN -#if ENABLED(ADVANCED_PAUSE_FEATURE) - // This menu item is last with an encoder. Otherwise, somewhere in the middle. - #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES) - #define FILAMENT_CHANGE_ITEM() YESNO_ITEM(MSG_FILAMENTCHANGE, menu_change_filament, nullptr, \ - GET_TEXT_F(MSG_FILAMENTCHANGE), (const char *)nullptr, F("?")) - #else - #define FILAMENT_CHANGE_ITEM() SUBMENU(MSG_FILAMENTCHANGE, menu_change_filament) - #endif -#endif - void menu_main() { const bool busy = printingIsActive(); #if HAS_MEDIA @@ -258,34 +248,8 @@ void menu_main() { #define MEDIA_MENU_AT_TOP #endif - if (busy) { - #if MACHINE_CAN_PAUSE - ACTION_ITEM(MSG_PAUSE_PRINT, ui.pause_print); - #endif - #if MACHINE_CAN_STOP - SUBMENU(MSG_STOP_PRINT, []{ - MenuItem_confirm::select_screen( - GET_TEXT_F(MSG_BUTTON_STOP), GET_TEXT_F(MSG_BACK), - ui.abort_print, nullptr, - GET_TEXT_F(MSG_STOP_PRINT), (const char *)nullptr, F("?") - ); - }); - #endif - - #if ENABLED(GCODE_REPEAT_MARKERS) - if (repeat.is_active()) - ACTION_ITEM(MSG_END_LOOPS, repeat.cancel); - #endif - - SUBMENU(MSG_TUNE, menu_tune); - - #if ENABLED(CANCEL_OBJECTS) && DISABLED(SLIM_LCD_MENUS) - SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); }); - #endif - } - else { - #if ALL(HAS_MEDIA, MEDIA_MENU_AT_TOP) - // BEGIN MEDIA MENU + auto media_menus = [&]{ + #if HAS_MEDIA if (card_detected) { if (!card_open) { #if ENABLED(MENU_ADDAUTOSTART) @@ -322,8 +286,38 @@ void menu_main() { #endif #endif } - // END MEDIA MENU #endif + }; + + if (busy) { + #if MACHINE_CAN_PAUSE + ACTION_ITEM(MSG_PAUSE_PRINT, ui.pause_print); + #endif + #if MACHINE_CAN_STOP + SUBMENU(MSG_STOP_PRINT, []{ + MenuItem_confirm::select_screen( + GET_TEXT_F(MSG_BUTTON_STOP), GET_TEXT_F(MSG_BACK), + ui.abort_print, nullptr, + GET_TEXT_F(MSG_STOP_PRINT), (const char *)nullptr, F("?") + ); + }); + #endif + + #if ENABLED(GCODE_REPEAT_MARKERS) + if (repeat.is_active()) + ACTION_ITEM(MSG_END_LOOPS, repeat.cancel); + #endif + + SUBMENU(MSG_TUNE, menu_tune); + + #if ENABLED(CANCEL_OBJECTS) && DISABLED(SLIM_LCD_MENUS) + SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); }); + #endif + } + else { + + // SD Card / Flash Drive + TERN_(MEDIA_MENU_AT_TOP, media_menus()); if (TERN0(MACHINE_CAN_PAUSE, printingIsPaused())) ACTION_ITEM(MSG_RESUME_PRINT, ui.resume_print); @@ -348,7 +342,11 @@ void menu_main() { #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) - FILAMENT_CHANGE_ITEM(); + #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES) + YESNO_ITEM(MSG_FILAMENTCHANGE, menu_change_filament, nullptr, GET_TEXT_F(MSG_FILAMENTCHANGE), (const char *)nullptr, F("?")); + #else + SUBMENU(MSG_FILAMENTCHANGE, menu_change_filament); + #endif #endif #if HAS_TEMPERATURE @@ -381,10 +379,6 @@ void menu_main() { } #endif - #if ENABLED(LCD_INFO_MENU) - SUBMENU(MSG_INFO_MENU, menu_info); - #endif - #if ENABLED(LED_CONTROL_MENU) SUBMENU(MSG_LIGHTS, menu_led); #elif ALL(CASE_LIGHT_MENU, CASELIGHT_USES_BRIGHTNESS) @@ -411,45 +405,9 @@ void menu_main() { GCODES_ITEM(MSG_SWITCH_PS_ON, F("M80")); #endif - #if HAS_MEDIA && DISABLED(MEDIA_MENU_AT_TOP) - // BEGIN MEDIA MENU - if (card_detected) { - if (!card_open) { - #if ENABLED(MENU_ADDAUTOSTART) - ACTION_ITEM(MSG_RUN_AUTO_FILES, card.autofile_begin); // Run Auto Files - #endif - - #if HAS_SD_DETECT - GCODES_ITEM(MSG_CHANGE_MEDIA, F("M21" TERN_(HAS_MULTI_VOLUME, "S"))); // M21 Change Media - #if HAS_MULTI_VOLUME - GCODES_ITEM(MSG_ATTACH_USB_MEDIA, F("M21U")); // M21 Attach USB Media - #endif - #else // - or - - ACTION_ITEM(MSG_RELEASE_MEDIA, []{ // M22 Release Media - queue.inject(F("M22")); - #if ENABLED(TFT_COLOR_UI) - // Menu display issue on item removal with multi language selection menu - if (encoderTopLine > 0) encoderTopLine--; - ui.refresh(); - #endif - }); - #endif - SUBMENU(MSG_MEDIA_MENU, MEDIA_MENU_GATEWAY); // Media Menu (or Password First) - } - } - else { - #if HAS_SD_DETECT - ACTION_ITEM(MSG_NO_MEDIA, nullptr); // "No Media" - #else - #if HAS_MULTI_VOLUME - GCODES_ITEM(MSG_ATTACH_SD_MEDIA, F("M21S")); // M21S Attach SD Card - GCODES_ITEM(MSG_ATTACH_USB_MEDIA, F("M21U")); // M21U Attach USB Media - #else - GCODES_ITEM(MSG_ATTACH_MEDIA, F("M21")); // M21 Attach Media - #endif - #endif - } - // END MEDIA MENU + // SD Card / Flash Drive + #if DISABLED(MEDIA_MENU_AT_TOP) + if (!busy) media_menus(); #endif #if HAS_SERVICE_INTERVALS @@ -482,7 +440,26 @@ void menu_main() { #endif #endif - #if HAS_GAMES && DISABLED(LCD_INFO_MENU) + #if HAS_MULTI_LANGUAGE + SUBMENU(LANGUAGE, menu_language); + #endif + + #if ENABLED(HOST_SHUTDOWN_MENU_ITEM) && defined(SHUTDOWN_ACTION) + SUBMENU(MSG_HOST_SHUTDOWN, []{ + MenuItem_confirm::select_screen( + GET_TEXT_F(MSG_BUTTON_PROCEED), GET_TEXT_F(MSG_BUTTON_CANCEL), + []{ ui.return_to_status(); hostui.shutdown(); }, nullptr, + GET_TEXT_F(MSG_HOST_SHUTDOWN), (const char *)nullptr, F("?") + ); + }); + #endif + + #if ENABLED(LCD_INFO_MENU) + + SUBMENU(MSG_INFO_MENU, menu_info); + + #elif HAS_GAMES + #if ENABLED(GAMES_EASTER_EGG) SKIP_ITEM(); SKIP_ITEM(); @@ -504,20 +481,7 @@ void menu_main() { #endif ); } - #endif - #if HAS_MULTI_LANGUAGE - SUBMENU(LANGUAGE, menu_language); - #endif - - #if ENABLED(HOST_SHUTDOWN_MENU_ITEM) && defined(SHUTDOWN_ACTION) - SUBMENU(MSG_HOST_SHUTDOWN, []{ - MenuItem_confirm::select_screen( - GET_TEXT_F(MSG_BUTTON_PROCEED), GET_TEXT_F(MSG_BUTTON_CANCEL), - []{ ui.return_to_status(); hostui.shutdown(); }, nullptr, - GET_TEXT_F(MSG_HOST_SHUTDOWN), (const char *)nullptr, F("?") - ); - }); #endif END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 4717f4b221..e2adbfded2 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -426,8 +426,7 @@ void menu_move() { // Show only when FT Motion is active (or optionally always show) if (c.active || ENABLED(FT_MOTION_NO_MENU_TOGGLE)) { #if HAS_X_AXIS - SUBMENU_N(X_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); - MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[X_AXIS]); MENU_ITEM_ADDON_END(); + SUBMENU_N_S(X_AXIS, shaper_name[X_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); if (AXIS_HAS_SHAPER(X)) { EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq.x, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params); @@ -437,8 +436,7 @@ void menu_move() { } #endif #if HAS_Y_AXIS - SUBMENU_N(Y_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); - MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[Y_AXIS]); MENU_ITEM_ADDON_END(); + SUBMENU_N_S(Y_AXIS, shaper_name[Y_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); if (AXIS_HAS_SHAPER(Y)) { EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq.y, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params); @@ -449,8 +447,7 @@ void menu_move() { #endif #if HAS_DYNAMIC_FREQ - SUBMENU(MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); - MENU_ITEM_ADDON_START_RJ(11); lcd_put_u8str(dmode); MENU_ITEM_ADDON_END(); + SUBMENU_S(dmode, MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); if (c.dynFreqMode != dynFreqMode_DISABLED) { #if HAS_X_AXIS EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_DFREQ_K_N, &c.dynFreqK.x, 0.0f, 20.0f); @@ -489,21 +486,18 @@ void menu_move() { BACK_ITEM(MSG_TUNE); #if HAS_X_AXIS - SUBMENU_N(X_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); - MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[X_AXIS]); MENU_ITEM_ADDON_END(); + SUBMENU_N_S(X_AXIS, shaper_name[X_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); #endif #if HAS_Y_AXIS - SUBMENU_N(Y_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); - MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[Y_AXIS]); MENU_ITEM_ADDON_END(); + SUBMENU_N_S(Y_AXIS, shaper_name[Y_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); #endif #if HAS_DYNAMIC_FREQ - SUBMENU(MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); - MENU_ITEM_ADDON_START_RJ(dmode.length()); lcd_put_u8str(dmode); MENU_ITEM_ADDON_END(); + SUBMENU_S(dmode, MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); #endif #if HAS_EXTRUDERS EDIT_ITEM(bool, MSG_LINEAR_ADVANCE, &c.linearAdvEna); if (c.linearAdvEna || ENABLED(FT_MOTION_NO_MENU_TOGGLE)) - EDIT_ITEM(float42_52, MSG_ADVANCE_K, &c.linearAdvK, 0, 10); + EDIT_ITEM(float62, MSG_ADVANCE_K, &c.linearAdvK, 0.0f, 1000.0f); #endif END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index e8a7b25dcb..b43f906cc7 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -45,46 +45,27 @@ #if HAS_PREHEAT - void Temperature::lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb) { - UNUSED(e); UNUSED(indh); UNUSED(indb); - #if HAS_HOTEND - if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) - setTargetHotend(_MIN(thermalManager.hotend_max_target(e), ui.material_preset[indh].hotend_temp), e); - #endif - #if HAS_HEATED_BED - if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp); - #endif - #if HAS_FAN - if (indh >= 0) { - const uint8_t fan_index = active_extruder < (FAN_COUNT) ? active_extruder : 0; - if (true - #if REDUNDANT_PART_COOLING_FAN - && fan_index != REDUNDANT_PART_COOLING_FAN - #endif - ) set_fan_speed(fan_index, ui.material_preset[indh].fan_speed); - } - #endif - ui.return_to_status(); - } - #if HAS_TEMP_HOTEND - inline void _preheat_end(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } + inline void _preheat_end(const uint8_t m, const uint8_t e) { ui.preheat_hotend(m, e); ui.return_to_status(); } void do_preheat_end_m() { _preheat_end(editable.int8, 0); } #endif #if HAS_HEATED_BED - inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(0, -1, m); } + inline void _preheat_bed(const uint8_t m) { ui.preheat_bed(m); ui.return_to_status(); } + #endif + #if HAS_HEATED_CHAMBER + inline void _preheat_chamber(const uint8_t m) { ui.preheat_chamber(m); ui.return_to_status(); } #endif #if HAS_COOLER - inline void _precool_laser(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } + inline void _precool_laser(const uint8_t m, const uint8_t e) { ui.preheat_hotend(m, e); ui.return_to_status(); } void do_precool_laser_m() { _precool_laser(editable.int8, thermalManager.temp_cooler.target); } #endif - #if HAS_TEMP_HOTEND && HAS_HEATED_BED - inline void _preheat_both(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, m); } + #if HAS_TEMP_HOTEND && (HAS_HEATED_BED || HAS_HEATED_CHAMBER) + inline void _preheat_all(const uint8_t m, const uint8_t e) { ui.preheat_all(m, e); ui.return_to_status(); } // Indexed "Preheat ABC" and "Heat Bed" items #define PREHEAT_ITEMS(M,E) do{ \ - ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_both(M, MenuItemBase::itemIndex); }); \ + ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_all(M, MenuItemBase::itemIndex); }); \ ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(M, MenuItemBase::itemIndex); }); \ }while(0) @@ -107,8 +88,8 @@ #if HOTENDS == 1 - #if HAS_HEATED_BED - ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_both(editable.int8, 0); }); + #if HAS_HEATED_BED || HAS_HEATED_CHAMBER + ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_all(editable.int8, 0); }); ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_END, do_preheat_end_m); #else ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); @@ -129,6 +110,10 @@ ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_BEDONLY, []{ _preheat_bed(editable.int8); }); #endif + #if HAS_HEATED_CHAMBER + ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_CHAMBER, []{ _preheat_chamber(editable.int8); }); + #endif + END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index c708bb5fa2..2ddb38f3a4 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -32,74 +32,42 @@ #include "../../module/stepper/indirection.h" #include "../../feature/tmc_util.h" -#define TMC_EDIT_STORED_I_RMS(ST,STR) EDIT_ITEM_F(uint16_4, F(STR), &stepper##ST.val_mA, 100, 3000, []{ stepper##ST.refresh_stepper_current(); }) +#define TMC_EDIT_STORED_I_RMS(ST,STR) EDIT_ITEM_FAST_F(uint16_4, F(STR), &stepper##ST.val_mA, 100, 3000, []{ stepper##ST.refresh_stepper_current(); }) void menu_tmc_current() { START_MENU(); BACK_ITEM(MSG_TMC_DRIVERS); - #if AXIS_IS_TMC(X) - TMC_EDIT_STORED_I_RMS(X, STR_A); - #endif - #if AXIS_IS_TMC(Y) - TMC_EDIT_STORED_I_RMS(Y, STR_B); - #endif - #if AXIS_IS_TMC(Z) - TMC_EDIT_STORED_I_RMS(Z, STR_C); - #endif - #if AXIS_IS_TMC(X2) - TMC_EDIT_STORED_I_RMS(X2, STR_X2); - #endif - #if AXIS_IS_TMC(Y2) - TMC_EDIT_STORED_I_RMS(Y2, STR_Y2); - #endif - #if AXIS_IS_TMC(Z2) - TMC_EDIT_STORED_I_RMS(Z2, STR_Z2); - #endif - #if AXIS_IS_TMC(Z3) - TMC_EDIT_STORED_I_RMS(Z3, STR_Z3); - #endif - #if AXIS_IS_TMC(Z4) - TMC_EDIT_STORED_I_RMS(Z4, STR_Z4); - #endif - #if AXIS_IS_TMC(E0) - TMC_EDIT_STORED_I_RMS(E0, STR_E0); - #endif - #if AXIS_IS_TMC(E1) - TMC_EDIT_STORED_I_RMS(E1, STR_E1); - #endif - #if AXIS_IS_TMC(E2) - TMC_EDIT_STORED_I_RMS(E2, STR_E2); - #endif - #if AXIS_IS_TMC(E3) - TMC_EDIT_STORED_I_RMS(E3, STR_E3); - #endif - #if AXIS_IS_TMC(E4) - TMC_EDIT_STORED_I_RMS(E4, STR_E4); - #endif - #if AXIS_IS_TMC(E5) - TMC_EDIT_STORED_I_RMS(E5, STR_E5); - #endif - #if AXIS_IS_TMC(E6) - TMC_EDIT_STORED_I_RMS(E6, STR_E6); - #endif - #if AXIS_IS_TMC(E7) - TMC_EDIT_STORED_I_RMS(E7, STR_E7); - #endif + TERN_(X_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(X, STR_A)); + TERN_(X2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(X2, STR_X2)); + TERN_(Y_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Y, STR_B)); + TERN_(Y2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Y2, STR_Y2)); + TERN_(Z_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z, STR_C)); + TERN_(Z2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z2, STR_Z2)); + TERN_(Z3_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z3, STR_Z3)); + TERN_(Z4_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z4, STR_Z4)); + TERN_(E0_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E0, STR_E0)); + TERN_(E1_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E1, STR_E1)); + TERN_(E2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E2, STR_E2)); + TERN_(E3_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E3, STR_E3)); + TERN_(E4_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E4, STR_E4)); + TERN_(E5_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E5, STR_E5)); + TERN_(E6_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E6, STR_E6)); + TERN_(E7_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E7, STR_E7)); END_MENU(); } #if ENABLED(HYBRID_THRESHOLD) - #define TMC_EDIT_STORED_HYBRID_THRS(ST, STR) EDIT_ITEM_F(uint16_3, F(STR), &stepper##ST.stored.hybrid_thrs, 0, STEPPER_MAX_THRS(ST), []{ stepper##ST.refresh_hybrid_thrs(); }); + #define TMC_EDIT_STORED_HYBRID_THRS(ST, STR) EDIT_ITEM_FAST_F(uint16_3, F(STR), &stepper##ST.stored.hybrid_thrs, 0, STEPPER_MAX_THRS(ST), []{ stepper##ST.refresh_hybrid_thrs(); }); void menu_tmc_hybrid_thrs() { START_MENU(); BACK_ITEM(MSG_TMC_DRIVERS); - TERN_(X_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(X, STR_X)); - TERN_(Y_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Y, STR_Y)); - TERN_(Z_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z, STR_Z)); + TERN_( X_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(X, STR_X)); TERN_(X2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(X2, STR_X2)); + TERN_( Y_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Y, STR_Y)); TERN_(Y2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Y2, STR_Y2)); + TERN_( Z_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z, STR_Z)); TERN_(Z2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z2, STR_Z2)); TERN_(Z3_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z3, STR_Z3)); TERN_(Z4_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z4, STR_Z4)); @@ -114,7 +82,7 @@ void menu_tmc_current() { END_MENU(); } -#endif +#endif // HYBRID_THRESHOLD #if ENABLED(SENSORLESS_HOMING) @@ -140,7 +108,34 @@ void menu_tmc_current() { END_MENU(); } -#endif +#endif // SENSORLESS_HOMING + +#if ENABLED(EDITABLE_HOMING_CURRENT) + + #define TMC_EDIT_HOMING_CURRENT(ST, STR) EDIT_ITEM_FAST_F(uint16_4, F(STR), &homing_current_mA.ST, ST##_CURRENT / 3, ST##_CURRENT) + + void menu_tmc_homing_current() { + START_MENU(); + STATIC_ITEM(MSG_TMC_HOMING_CURRENT); + BACK_ITEM(MSG_TMC_DRIVERS); + TERN_( X_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(X, STR_X)); + TERN_(X2_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(X2, STR_X2)); + TERN_( Y_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Y, STR_Y)); + TERN_(Y2_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Y2, STR_Y2)); + TERN_( Z_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z, STR_Z)); + TERN_(Z2_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z2, STR_Z2)); + TERN_(Z3_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z3, STR_Z3)); + TERN_(Z4_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z4, STR_Z4)); + TERN_( I_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(I, STR_I)); + TERN_( J_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(J, STR_J)); + TERN_( K_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(K, STR_K)); + TERN_( U_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(U, STR_U)); + TERN_( V_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(V, STR_V)); + TERN_( W_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(W, STR_W)); + END_MENU(); + } + +#endif // EDITABLE_HOMING_CURRENT #if HAS_STEALTHCHOP @@ -148,7 +143,7 @@ void menu_tmc_current() { void menu_tmc_step_mode() { START_MENU(); - STATIC_ITEM(MSG_TMC_STEALTH_ENABLED); + STATIC_ITEM(MSG_TMC_STEALTHCHOP); BACK_ITEM(MSG_TMC_DRIVERS); TERN_( X_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(X, STR_X)); TERN_(X2_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(X2, STR_X2)); @@ -169,15 +164,16 @@ void menu_tmc_current() { END_MENU(); } -#endif +#endif // HAS_STEALTHCHOP void menu_tmc() { START_MENU(); BACK_ITEM(MSG_ADVANCED_SETTINGS); SUBMENU(MSG_TMC_CURRENT, menu_tmc_current); - TERN_(HYBRID_THRESHOLD, SUBMENU(MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs)); - TERN_(SENSORLESS_HOMING, SUBMENU(MSG_TMC_HOMING_THRS, menu_tmc_homing_thrs)); - TERN_(HAS_STEALTHCHOP, SUBMENU(MSG_TMC_STEPPING_MODE, menu_tmc_step_mode)); + TERN_(HYBRID_THRESHOLD, SUBMENU(MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs)); + TERN_(SENSORLESS_HOMING, SUBMENU(MSG_TMC_HOMING_THRS, menu_tmc_homing_thrs)); + TERN_(EDITABLE_HOMING_CURRENT, SUBMENU(MSG_TMC_HOMING_CURRENT, menu_tmc_homing_current)); + TERN_(HAS_STEALTHCHOP, SUBMENU(MSG_TMC_STEALTHCHOP, menu_tmc_step_mode)); END_MENU(); } diff --git a/Marlin/src/lcd/sovol_rts/sovol_rts.cpp b/Marlin/src/lcd/sovol_rts/sovol_rts.cpp index 1f3322ded7..dcd5d9b384 100644 --- a/Marlin/src/lcd/sovol_rts/sovol_rts.cpp +++ b/Marlin/src/lcd/sovol_rts/sovol_rts.cpp @@ -122,7 +122,6 @@ bool card_insert_st; bool sd_printing; int16_t fan_speed; -char cmd[MAX_CMD_SIZE + 16]; inline void RTS_line_to_current(const AxisEnum axis) { if (!planner.is_full()) @@ -1313,9 +1312,9 @@ void RTS::handleData() { #endif #if ENABLED(PIDTEMPBED) - case Hot_Bed_P: thermalManager.temp_bed.pid.Kp = float(recdat.data[0]) / 100.0f; break; - case Hot_Bed_I: thermalManager.temp_bed.pid.Ki = float(recdat.data[0]) * 8.0f / 10000.0f; break; - case Hot_Bed_D: thermalManager.temp_bed.pid.Kd = float(recdat.data[0]) / 0.8f; break; + case Hot_Bed_P: thermalManager.temp_bed.pid.set_Kp(float(recdat.data[0]) / 100.0f); break; + case Hot_Bed_I: thermalManager.temp_bed.pid.set_Ki(float(recdat.data[0]) * 8.0f / 10000.0f); break; + case Hot_Bed_D: thermalManager.temp_bed.pid.set_Kd(float(recdat.data[0]) / 0.8f); break; #endif #if HAS_X_AXIS @@ -1398,18 +1397,10 @@ void RTS::handleData() { case TMCDriver: switch (recdat.data[0]) { case 1: // Current - #if AXIS_IS_TMC(X) - sendData(stepperX.getMilliamps(), Current_X_VP); - #endif - #if AXIS_IS_TMC(Y) - sendData(stepperY.getMilliamps(), Current_Y_VP); - #endif - #if AXIS_IS_TMC(Z) - sendData(stepperZ.getMilliamps(), Current_Z_VP); - #endif - #if AXIS_IS_TMC(E0) - sendData(stepperE0.getMilliamps(), Current_E_VP); - #endif + TERN_(X_IS_TRINAMIC, sendData(stepperX.getMilliamps(), Current_X_VP)); + TERN_(Y_IS_TRINAMIC, sendData(stepperY.getMilliamps(), Current_Y_VP)); + TERN_(Z_IS_TRINAMIC, sendData(stepperZ.getMilliamps(), Current_Z_VP)); + TERN_(E0_IS_TRINAMIC, sendData(stepperE0.getMilliamps(), Current_E_VP)); gotoPage(ID_DriverA_L, ID_DriverA_D); break; @@ -1434,39 +1425,19 @@ void RTS::handleData() { } break; - #if AXIS_IS_TMC(X) - case Current_X: sprintf_P(cmd, PSTR("M906 X%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if X_HAS_STEALTHCHOP - case Threshold_X: sprintf_P(cmd, PSTR("M913 X%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if X_SENSORLESS - case Sensorless_X: sprintf_P(cmd, PSTR("M914 X%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_X: TERN_(X_IS_TRINAMIC, queue.inject(TS(F("M906X"), int(recdat.data[0])))); break; + case Threshold_X: TERN_(X_HAS_STEALTHCHOP, queue.inject(TS(F("M913X"), int(recdat.data[0])))); break; + case Sensorless_X: TERN_(X_SENSORLESS, queue.inject(TS(F("M914X"), int(recdat.data[0])))); break; - #if AXIS_IS_TMC(Y) - case Current_Y: sprintf_P(cmd, PSTR("M906 Y%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if Y_HAS_STEALTHCHOP - case Threshold_Y: sprintf_P(cmd, PSTR("M913 Y%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if Y_SENSORLESS - case Sensorless_Y: sprintf_P(cmd, PSTR("M914 Y%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_Y: TERN_(X_IS_TRINAMIC, queue.inject(TS(F("M906Y"), int(recdat.data[0])))); break; + case Threshold_Y: TERN_(Y_HAS_STEALTHCHOP, queue.inject(TS(F("M913Y"), int(recdat.data[0])))); break; + case Sensorless_Y: TERN_(Y_SENSORLESS, queue.inject(TS(F("M914Y"), int(recdat.data[0])))); break; - #if AXIS_IS_TMC(Z) - case Current_Z: sprintf_P(cmd, PSTR("M906 Z%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if Z_HAS_STEALTHCHOP - case Threshold_Z: sprintf_P(cmd, PSTR("M913 Z%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_Z: TERN_(Z_IS_TRINAMIC, queue.inject(TS(F("M906Z"), int(recdat.data[0])))); break; + case Threshold_Z: TERN_(Z_HAS_STEALTHCHOP, queue.inject(TS(F("M913Z"), int(recdat.data[0])))); break; - #if AXIS_IS_TMC(E0) - case Current_E: sprintf_P(cmd, PSTR("M906 E%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if E0_HAS_STEALTHCHOP - case Threshold_E: sprintf_P(cmd, PSTR("M913 E%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_E: TERN_(AXIS_IS_TMC_E, queue.inject(TS(F("M906E"), int(recdat.data[0])))); break; + case Threshold_E: TERN_(E_HAS_STEALTHCHOP, queue.inject(TS(F("M913E"), int(recdat.data[0])))); break; #endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 932418331b..bb226e50c6 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -102,7 +102,7 @@ void Touch::idle() { if (touch_time) { #if ENABLED(TOUCH_SCREEN_CALIBRATION) - if (touch_control_type == NONE && ELAPSED(now, touch_time + TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS) && ui.on_status_screen()) + if (touch_control_type == NONE && ELAPSED(now, touch_time, TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS) && ui.on_status_screen()) ui.goto_screen(touch_screen_calibration); #endif return; diff --git a/Marlin/src/lcd/tft/ui_color_ui.cpp b/Marlin/src/lcd/tft/ui_color_ui.cpp index 64eed045e1..8186650070 100644 --- a/Marlin/src/lcd/tft/ui_color_ui.cpp +++ b/Marlin/src/lcd/tft/ui_color_ui.cpp @@ -248,21 +248,21 @@ void MarlinUI::draw_status_screen() { tft.add_rectangle(0, 0, COORDINATES_W, COORDINATES_H, COLOR_AXIS_HOMED); #if HAS_X_AXIS && defined(X_MARK_X) && defined(X_MARK_Y) && defined(X_VALUE_X) && defined(X_VALUE_Y) - tft.add_text(X_MARK_X, X_MARK_Y, COLOR_AXIS_HOMED , "X"); + tft.add_text(X_MARK_X, X_MARK_Y, COLOR_AXIS_HOMED, "X"); const bool nhx = axis_should_home(X_AXIS); tft_string.set(blink && nhx ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); tft.add_text(X_VALUE_X, X_VALUE_Y, nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); #endif #if HAS_Y_AXIS && defined(Y_MARK_X) && defined(Y_MARK_Y) && defined(Y_VALUE_X) && defined(Y_VALUE_Y) - tft.add_text(Y_MARK_X, Y_MARK_Y, COLOR_AXIS_HOMED , "Y"); + tft.add_text(Y_MARK_X, Y_MARK_Y, COLOR_AXIS_HOMED, "Y"); const bool nhy = axis_should_home(Y_AXIS); tft_string.set(blink && nhy ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); tft.add_text(Y_VALUE_X, Y_VALUE_Y, nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); #endif #if HAS_Z_AXIS && defined(Z_MARK_X) && defined(Z_MARK_Y) && defined(Z_VALUE_X) && defined(Z_VALUE_Y) && defined(Z_VALUE_OFFSET) - tft.add_text(Z_MARK_X, Z_MARK_Y, COLOR_AXIS_HOMED , "Z"); + tft.add_text(Z_MARK_X, Z_MARK_Y, COLOR_AXIS_HOMED, "Z"); uint16_t offset = Z_VALUE_OFFSET; const bool nhz = axis_should_home(Z_AXIS); if (blink && nhz) diff --git a/Marlin/src/libs/BL24CXX.cpp b/Marlin/src/libs/BL24CXX.cpp index 767561143c..43c68887b1 100644 --- a/Marlin/src/libs/BL24CXX.cpp +++ b/Marlin/src/libs/BL24CXX.cpp @@ -48,7 +48,7 @@ #ifdef __STM32F1__ #define SDA_IN() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 8 << 12; }while(0) #define SDA_OUT() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 3 << 12; }while(0) -#elif defined(STM32F1) || defined(STM32F4) || defined(ARDUINO_ARCH_HC32) +#elif ANY(STM32F1, STM32F4, ARDUINO_ARCH_HC32, ARDUINO_ARCH_MFL) #define SDA_IN() SET_INPUT(IIC_EEPROM_SDA) #define SDA_OUT() SET_OUTPUT(IIC_EEPROM_SDA) #endif diff --git a/Marlin/src/libs/MAX31865.cpp b/Marlin/src/libs/MAX31865.cpp index 3fe0694644..83b03e24fd 100644 --- a/Marlin/src/libs/MAX31865.cpp +++ b/Marlin/src/libs/MAX31865.cpp @@ -346,7 +346,7 @@ inline uint16_t MAX31865::readRawImmediate() { } else { TERN_(MAX31865_USE_READ_ERROR_DETECTION, const millis_t ms = millis()); - if (TERN0(MAX31865_USE_READ_ERROR_DETECTION, ABS((int)(lastRead - rtd)) > 500 && PENDING(ms, lastReadStamp + 1000))) { + if (TERN0(MAX31865_USE_READ_ERROR_DETECTION, ABS(int(lastRead - rtd)) > 500 && PENDING(ms, lastReadStamp, 1000UL))) { // If 2 readings within 1s differ too much (~20°C) it's a read error. lastFault = 0x01; lastRead |= 1; diff --git a/Marlin/src/libs/hex_print.cpp b/Marlin/src/libs/hex_print.cpp index 9ff3fc6eb2..f0095b18ce 100644 --- a/Marlin/src/libs/hex_print.cpp +++ b/Marlin/src/libs/hex_print.cpp @@ -59,7 +59,7 @@ char* hex_address(const void * const a) { void print_hex_nybble(const uint8_t n) { SERIAL_CHAR(hex_nybble(n)); } void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } void print_hex_word(const uint16_t w) { SERIAL_ECHO(_hex_word(w)); } -void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } +void print_hex_address(const void * const a) { SERIAL_ECHO(hex_address(a)); } void print_hex_long(const uint32_t w, const char delimiter/*='\0'*/, const bool prefix/*=false*/) { if (prefix) SERIAL_ECHOPGM("0x"); diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index b9503cb242..830e9b356b 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -25,7 +25,9 @@ #include "../inc/MarlinConfigPre.h" #include "../core/utility.h" -#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#if !ARDUINO_ARCH_ESP32 + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#endif constexpr char DIGIT(const uint8_t n) { return '0' + n; } @@ -404,8 +406,8 @@ inline const char* ftostrX2rj(const_float_t f, const int index=1) { case 1: conv[1] = RJDIGIT(i, 100000); case 2: conv[2] = RJDIGIT(i, 10000); case 3: conv[3] = RJDIGIT(i, 1000); - case 4: conv[4] = RJDIGIT(i, 100); } + conv[4] = DIGIMOD(i, 100); conv[5] = '.'; conv[6] = DIGIMOD(i, 10); conv[7] = DIGIMOD(i, 1); diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index 10ae915beb..1ef217b64a 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -32,7 +32,7 @@ #define ES_ENUM(A,M) _ES_ENUM(A,M) #define _ES_ITEM(N) , N -#define ES_ITEM(K,N) TERN(K,_ES_ITEM,_IF_1_ELSE)(N) +#define ES_ITEM(K,N) TERN(K,_ES_ITEM,OMIT)(N) #define _ESN_ITEM(K,A,M) ES_ITEM(K,ES_ENUM(A,M)) #define ES_MINMAX(A) ES_ITEM(HAS_##A##_MIN_STATE, ES_ENUM(A,MIN)) ES_ITEM(HAS_##A##_MAX_STATE, ES_ENUM(A,MAX)) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 6a039c8ab9..fcaaf613e4 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -271,48 +271,7 @@ void report_current_position_projected() { #define debug_current(...) #endif - #if HAS_CURRENT_HOME(X) - int16_t saved_current_X; - #endif - #if HAS_CURRENT_HOME(Y) - int16_t saved_current_Y; - #endif - #if HAS_CURRENT_HOME(Z) - int16_t saved_current_Z; - #endif - #if HAS_CURRENT_HOME(X2) - int16_t saved_current_X2; - #endif - #if HAS_CURRENT_HOME(Y2) - int16_t saved_current_Y2; - #endif - #if HAS_CURRENT_HOME(Z2) - int16_t saved_current_Z2; - #endif - #if HAS_CURRENT_HOME(Z3) - int16_t saved_current_Z3; - #endif - #if HAS_CURRENT_HOME(Z4) - int16_t saved_current_Z4; - #endif - #if HAS_CURRENT_HOME(I) - int16_t saved_current_I; - #endif - #if HAS_CURRENT_HOME(J) - int16_t saved_current_J; - #endif - #if HAS_CURRENT_HOME(K) - int16_t saved_current_K; - #endif - #if HAS_CURRENT_HOME(U) - int16_t saved_current_U; - #endif - #if HAS_CURRENT_HOME(V) - int16_t saved_current_V; - #endif - #if HAS_CURRENT_HOME(W) - int16_t saved_current_W; - #endif + homing_current_t saved_current_mA; /** * Set motors to their homing / probing currents. @@ -320,11 +279,15 @@ void report_current_position_projected() { */ void set_homing_current(const AxisEnum axis) { + #define HOMING_CURRENT(A) TERN(EDITABLE_HOMING_CURRENT, homing_current_mA.A, A##_CURRENT_HOME) + // Saves the running current of the motor at the moment the function is called and sets current to CURRENT_HOME #define _SAVE_SET_CURRENT(A) \ - saved_current_##A = stepper##A.getMilliamps(); \ - stepper##A.rms_current(A##_CURRENT_HOME); \ - debug_current(F(STR_##A), saved_current_##A, A##_CURRENT_HOME) + saved_current_mA.A = stepper##A.getMilliamps(); \ + stepper##A.rms_current(HOMING_CURRENT(A)); \ + debug_current(F(STR_##A), saved_current_mA.A, HOMING_CURRENT(A)) + + #define _MAP_SAVE_SET(A) OPTCODE(A##_HAS_HOME_CURRENT, _SAVE_SET_CURRENT(A)) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Setting homing driver current"); @@ -333,34 +296,8 @@ void report_current_position_projected() { // CORE and Markforged kinematics switch (axis) { default: break; - case X_AXIS: case Y_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _SAVE_SET_CURRENT(X2); - #endif - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _SAVE_SET_CURRENT(Y2); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _SAVE_SET_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _SAVE_SET_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _SAVE_SET_CURRENT(Z4); - #endif - break; + case X_AXIS: case Y_AXIS: MAP(_MAP_SAVE_SET, X, X2, Y, Y2); break; + case Z_AXIS: MAP(_MAP_SAVE_SET, Z, Z2, Z3, Z4); break; } #elif CORE_IS_XZ @@ -368,22 +305,8 @@ void report_current_position_projected() { // CORE XZ / ZX switch (axis) { default: break; - case X_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _SAVE_SET_CURRENT(Y2); - #endif - break; + case X_AXIS: case Z_AXIS: MAP(_MAP_SAVE_SET, X, Z); break; + case Y_AXIS: MAP(_MAP_SAVE_SET, Y, Y2); break; } #elif CORE_IS_YZ @@ -391,22 +314,8 @@ void report_current_position_projected() { // CORE YZ / ZY switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _SAVE_SET_CURRENT(X2); - #endif - break; - case Y_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - break; + case X_AXIS: MAP(_MAP_SAVE_SET, X, X2); break; + case Y_AXIS: case Z_AXIS: MAP(_MAP_SAVE_SET, Y, Z); break; } #elif IS_SCARA @@ -414,13 +323,13 @@ void report_current_position_projected() { // SCARA kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _SAVE_SET_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _SAVE_SET_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _SAVE_SET_CURRENT(Z); break; #endif } @@ -429,13 +338,13 @@ void report_current_position_projected() { // TPARA or DELTA kinematics. // Z_AXIS is a special mode to apply homing current to all axes. - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT if (axis == A_AXIS || axis == Z_AXIS) _SAVE_SET_CURRENT(X); #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT if (axis == B_AXIS || axis == Z_AXIS) _SAVE_SET_CURRENT(Y); #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT if (axis == C_AXIS) _SAVE_SET_CURRENT(Z); #endif @@ -444,13 +353,13 @@ void report_current_position_projected() { // POLAR kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _SAVE_SET_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _SAVE_SET_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _SAVE_SET_CURRENT(Z); break; #endif } @@ -461,13 +370,13 @@ void report_current_position_projected() { // Useful? switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _SAVE_SET_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _SAVE_SET_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _SAVE_SET_CURRENT(Z); break; #endif } @@ -477,27 +386,9 @@ void report_current_position_projected() { // Foam cutter switch (axis) { default: break; - case X_AXIS: case I_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(I) - _SAVE_SET_CURRENT(I); - #endif - break; - case Y_AXIS: case J_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(J) - _SAVE_SET_CURRENT(J); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - break; + case X_AXIS: case I_AXIS: MAP(_MAP_SAVE_SET, X, I); break; + case Y_AXIS: case J_AXIS: MAP(_MAP_SAVE_SET, Y, J); break; + case Z_AXIS: MAP(_MAP_SAVE_SET, Z); break; } #else @@ -505,58 +396,31 @@ void report_current_position_projected() { // Cartesian kinematics switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _SAVE_SET_CURRENT(X2); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _SAVE_SET_CURRENT(Y2); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _SAVE_SET_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _SAVE_SET_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _SAVE_SET_CURRENT(Z4); - #endif - break; + case X_AXIS: MAP(_MAP_SAVE_SET, X, X2); break; + case Y_AXIS: MAP(_MAP_SAVE_SET, Y, Y2); break; + case Z_AXIS: MAP(_MAP_SAVE_SET, Z, Z2, Z3, Z4); break; } #endif // kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(I) && DISABLED(FOAMCUTTER_XYUV) + #if I_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case I_AXIS: _SAVE_SET_CURRENT(I); break; #endif - #if HAS_CURRENT_HOME(J) && DISABLED(FOAMCUTTER_XYUV) + #if J_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case J_AXIS: _SAVE_SET_CURRENT(J); break; #endif - #if HAS_CURRENT_HOME(K) + #if K_HAS_HOME_CURRENT case K_AXIS: _SAVE_SET_CURRENT(K); break; #endif - #if HAS_CURRENT_HOME(U) + #if U_HAS_HOME_CURRENT case U_AXIS: _SAVE_SET_CURRENT(U); break; #endif - #if HAS_CURRENT_HOME(V) + #if V_HAS_HOME_CURRENT case V_AXIS: _SAVE_SET_CURRENT(V); break; #endif - #if HAS_CURRENT_HOME(W) + #if W_HAS_HOME_CURRENT case W_AXIS: _SAVE_SET_CURRENT(W); break; #endif } @@ -575,8 +439,10 @@ void report_current_position_projected() { // Restore the saved current #define _RESTORE_CURRENT(A) \ - stepper##A.rms_current(saved_current_##A); \ - debug_current(F(STR_##A), A##_CURRENT_HOME, saved_current_##A) + stepper##A.rms_current(saved_current_mA.A); \ + debug_current(F(STR_##A), HOMING_CURRENT(A), saved_current_mA.A) + + #define _MAP_RESTORE(A) OPTCODE(A##_HAS_HOME_CURRENT, _RESTORE_CURRENT(A)) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Restore driver current"); @@ -585,28 +451,8 @@ void report_current_position_projected() { // CORE and Markforged kinematics switch (axis) { default: break; - case X_AXIS: case Y_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _RESTORE_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _RESTORE_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _RESTORE_CURRENT(Z4); - #endif - break; + case X_AXIS: case Y_AXIS: MAP(_MAP_RESTORE, X, Y); break; + case Z_AXIS: MAP(_MAP_RESTORE, Z, Z2, Z3, Z4); break; } #elif CORE_IS_XZ @@ -614,22 +460,8 @@ void report_current_position_projected() { // CORE XZ / ZX switch (axis) { default: break; - case X_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _RESTORE_CURRENT(Y2); - #endif - break; + case X_AXIS: case Z_AXIS: MAP(_MAP_RESTORE, X, Z); break; + case Y_AXIS: MAP(_MAP_RESTORE, Y, Y2); break; } #elif CORE_IS_YZ @@ -637,22 +469,8 @@ void report_current_position_projected() { // CORE YZ / ZY switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _RESTORE_CURRENT(X2); - #endif - break; - case Y_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - break; + case X_AXIS: MAP(_MAP_RESTORE, X, X2); break; + case Y_AXIS: case Z_AXIS: MAP(_MAP_RESTORE, Y, Z); break; } #elif IS_SCARA // Unsupported for now? @@ -660,13 +478,13 @@ void report_current_position_projected() { // SCARA kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _RESTORE_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _RESTORE_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _RESTORE_CURRENT(Z); break; #endif } @@ -675,13 +493,13 @@ void report_current_position_projected() { // TPARA or DELTA kinematics // Z_AXIS is a special mode to set homing current to all axes - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT if (axis == A_AXIS || axis == Z_AXIS) _RESTORE_CURRENT(X); #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT if (axis == B_AXIS || axis == Z_AXIS) _RESTORE_CURRENT(Y); #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT if (axis == C_AXIS) _RESTORE_CURRENT(Z); #endif @@ -690,13 +508,13 @@ void report_current_position_projected() { // POLAR kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _RESTORE_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _RESTORE_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _RESTORE_CURRENT(Z); break; #endif } @@ -707,13 +525,13 @@ void report_current_position_projected() { // Useful? switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _RESTORE_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _RESTORE_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _RESTORE_CURRENT(Z); break; #endif } @@ -723,27 +541,9 @@ void report_current_position_projected() { // Foam cutter switch (axis) { default: break; - case X_AXIS: case I_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(I) - _RESTORE_CURRENT(I); - #endif - break; - case Y_AXIS: case J_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(J) - _RESTORE_CURRENT(J); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - break; + case X_AXIS: case I_AXIS: MAP(_MAP_RESTORE, X, I); break; + case Y_AXIS: case J_AXIS: MAP(_MAP_RESTORE, Y, J); break; + case Z_AXIS: MAP(_MAP_RESTORE, Z); break; } #else @@ -751,58 +551,31 @@ void report_current_position_projected() { // Cartesian kinematics switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _RESTORE_CURRENT(X2); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _RESTORE_CURRENT(Y2); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _RESTORE_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _RESTORE_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _RESTORE_CURRENT(Z4); - #endif - break; + case X_AXIS: MAP(_MAP_RESTORE, X, X2); break; + case Y_AXIS: MAP(_MAP_RESTORE, Y, Y2); break; + case Z_AXIS: MAP(_MAP_RESTORE, Z, Z2, Z3, Z4); break; } #endif // kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(I) && DISABLED(FOAMCUTTER_XYUV) + #if I_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case I_AXIS: _RESTORE_CURRENT(I); break; #endif - #if HAS_CURRENT_HOME(J) && DISABLED(FOAMCUTTER_XYUV) + #if J_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case J_AXIS: _RESTORE_CURRENT(J); break; #endif - #if HAS_CURRENT_HOME(K) + #if K_HAS_HOME_CURRENT case K_AXIS: _RESTORE_CURRENT(K); break; #endif - #if HAS_CURRENT_HOME(U) + #if U_HAS_HOME_CURRENT case U_AXIS: _RESTORE_CURRENT(U); break; #endif - #if HAS_CURRENT_HOME(V) + #if V_HAS_HOME_CURRENT case V_AXIS: _RESTORE_CURRENT(V); break; #endif - #if HAS_CURRENT_HOME(W) + #if W_HAS_HOME_CURRENT case W_AXIS: _RESTORE_CURRENT(W); break; #endif } diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 6d3bfaed0d..18376cf773 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -636,6 +636,9 @@ void home_if_needed(const bool keeplev=false); void set_home_offset(const AxisEnum axis, const_float_t v); #endif +// +// Trinamic Stepper Drivers +// #if USE_SENSORLESS struct sensorless_t; sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis); diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 630557180b..b3df490cf0 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -780,7 +780,7 @@ block_t* Planner::get_current_block() { * by the provided factors. If entry_factor is 0 don't change the initial_rate. * Assumes that the implied initial_rate and final_rate are no less than * sqrt(block->acceleration_steps_per_s2 / 2). This is ensured through - * minimum_planner_speed_sqr / min_entry_speed_sqr though note there's one + * minimum_planner_speed_sqr / min_entry_speed_sqr - but there's one * exception in recalculate_trapezoids(). * * ############ VERY IMPORTANT ############ @@ -854,6 +854,8 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t block->accelerate_before = accelerate_steps; block->decelerate_start = block->step_event_count - decelerate_steps; block->initial_rate = initial_rate; + block->final_rate = final_rate; + #if ENABLED(S_CURVE_ACCELERATION) block->acceleration_time = acceleration_time; block->deceleration_time = deceleration_time; @@ -861,7 +863,6 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t block->deceleration_time_inverse = deceleration_time_inverse; block->cruise_rate = cruise_rate; #endif - block->final_rate = final_rate; #if ENABLED(LIN_ADVANCE) if (block->la_advance_rate) { @@ -892,30 +893,29 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t * Laser Trap Power works for all Jerk and Curve modes; however Arc-based moves will have issues since * the segments are usually too small. */ - if (cutter.cutter_mode == CUTTER_MODE_CONTINUOUS) { - if (planner.laser_inline.status.isPowered && planner.laser_inline.status.isEnabled) { - if (block->laser.power > 0) { - NOLESS(block->laser.power, laser_power_floor); - block->laser.trap_ramp_active_pwr = (block->laser.power - laser_power_floor) * (initial_rate / float(block->nominal_rate)) + laser_power_floor; - block->laser.trap_ramp_entry_incr = (block->laser.power - block->laser.trap_ramp_active_pwr) / accelerate_steps; - float laser_pwr = block->laser.power * (final_rate / float(block->nominal_rate)); - NOLESS(laser_pwr, laser_power_floor); - block->laser.trap_ramp_exit_decr = (block->laser.power - laser_pwr) / decelerate_steps; - #if ENABLED(DEBUG_LASER_TRAP) - SERIAL_ECHO_MSG("lp:",block->laser.power); - SERIAL_ECHO_MSG("as:",accelerate_steps); - SERIAL_ECHO_MSG("ds:",decelerate_steps); - SERIAL_ECHO_MSG("p.trap:",block->laser.trap_ramp_active_pwr); - SERIAL_ECHO_MSG("p.incr:",block->laser.trap_ramp_entry_incr); - SERIAL_ECHO_MSG("p.decr:",block->laser.trap_ramp_exit_decr); - #endif - } - else { - block->laser.trap_ramp_active_pwr = 0; - block->laser.trap_ramp_entry_incr = 0; - block->laser.trap_ramp_exit_decr = 0; - } - + if (cutter.cutter_mode == CUTTER_MODE_CONTINUOUS + && planner.laser_inline.status.isPowered && planner.laser_inline.status.isEnabled + ) { + if (block->laser.power > 0) { + NOLESS(block->laser.power, laser_power_floor); + block->laser.trap_ramp_active_pwr = (block->laser.power - laser_power_floor) * (initial_rate / float(block->nominal_rate)) + laser_power_floor; + block->laser.trap_ramp_entry_incr = (block->laser.power - block->laser.trap_ramp_active_pwr) / accelerate_steps; + float laser_pwr = block->laser.power * (final_rate / float(block->nominal_rate)); + NOLESS(laser_pwr, laser_power_floor); + block->laser.trap_ramp_exit_decr = (block->laser.power - laser_pwr) / decelerate_steps; + #if ENABLED(DEBUG_LASER_TRAP) + SERIAL_ECHO_MSG("lp:", block->laser.power); + SERIAL_ECHO_MSG("as:", accelerate_steps); + SERIAL_ECHO_MSG("ds:", decelerate_steps); + SERIAL_ECHO_MSG("p.trap:", block->laser.trap_ramp_active_pwr); + SERIAL_ECHO_MSG("p.incr:", block->laser.trap_ramp_entry_incr); + SERIAL_ECHO_MSG("p.decr:", block->laser.trap_ramp_exit_decr); + #endif + } + else { + block->laser.trap_ramp_active_pwr = 0; + block->laser.trap_ramp_entry_incr = 0; + block->laser.trap_ramp_exit_decr = 0; } } #endif // LASER_POWER_TRAP @@ -1582,7 +1582,9 @@ void Planner::quick_stop() { const bool was_enabled = stepper.suspend(); // Drop all queue entries - block_buffer_nonbusy = block_buffer_head = block_buffer_tail; + const uint8_t tail_value = block_buffer_tail; // Read tail value once + block_buffer_head = tail_value; + block_buffer_nonbusy = tail_value; // Restart the block delay for the first movement - As the queue was // forced to empty, there's no risk the ISR will touch this. @@ -2438,7 +2440,7 @@ bool Planner::_populate_block( block->acceleration_steps_per_s2 = accel; block->acceleration = accel / steps_per_mm; #if DISABLED(S_CURVE_ACCELERATION) - block->acceleration_rate = (uint32_t)(accel * (float(1UL << 24) / (STEPPER_TIMER_RATE))); + block->acceleration_rate = uint32_t(accel * (float(1UL << 24) / (STEPPER_TIMER_RATE))); #endif #if ENABLED(LIN_ADVANCE) @@ -2446,10 +2448,10 @@ bool Planner::_populate_block( block->la_scaling = 0; if (use_advance_lead) { - // the Bresenham algorithm will convert this step rate into extruder steps + // The Bresenham algorithm will convert this step rate into extruder steps block->la_advance_rate = extruder_advance_K[E_INDEX_N(extruder)] * block->acceleration_steps_per_s2; - // reduce LA ISR frequency by calling it only often enough to ensure that there will + // Reduce LA ISR frequency by calling it only often enough to ensure that there will // never be more than four extruder steps per call for (uint32_t dividend = block->steps.e << 1; dividend <= (block->step_event_count >> 2); dividend <<= 1) block->la_scaling++; @@ -2459,7 +2461,7 @@ bool Planner::_populate_block( SERIAL_ECHOLNPGM("eISR running at > 10kHz: ", block->la_advance_rate); #endif } - #endif + #endif // LIN_ADVANCE // Formula for the average speed over a 1 step worth of distance if starting from zero and // accelerating at the current limit. Since we can only change the speed every step this is a diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index b2df5824de..318be33131 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -816,7 +816,11 @@ class Planner { FORCE_INLINE static uint8_t nonbusy_movesplanned() { return block_dec_mod(block_buffer_head, block_buffer_nonbusy); } // Remove all blocks from the buffer - FORCE_INLINE static void clear_block_buffer() { block_buffer_nonbusy = block_buffer_head = block_buffer_tail = 0; } + FORCE_INLINE static void clear_block_buffer() { + block_buffer_tail = 0; + block_buffer_head = 0; + block_buffer_nonbusy = 0; + } // Check if movement queue is full FORCE_INLINE static bool is_full() { return block_buffer_tail == next_block_index(block_buffer_head); } diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index a66c11a782..4f7d7c7690 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -82,7 +82,7 @@ #include "../feature/host_actions.h" // for PROMPT_USER_CONTINUE #endif -#if HAS_Z_SERVO_PROBE +#if HAS_Z_SERVO_PROBE || HAS_MAG_MOUNTED_SERVO_PROBE #include "servo.h" #endif @@ -272,6 +272,13 @@ xyz_pos_t Probe::offset; // Initialized by settings.load typedef struct { float fr_mm_min; xyz_pos_t where; } mag_probe_move_t; inline void run_deploy_moves() { + #ifdef MAG_MOUNTED_PRE_DEPLOY + constexpr mag_probe_move_t pre_deploy = MAG_MOUNTED_PRE_DEPLOY; + do_blocking_move_to(pre_deploy.where, MMM_TO_MMS(pre_deploy.fr_mm_min)); + #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][0]); + #endif #ifdef MAG_MOUNTED_DEPLOY_1 constexpr mag_probe_move_t deploy_1 = MAG_MOUNTED_DEPLOY_1; do_blocking_move_to(deploy_1.where, MMM_TO_MMS(deploy_1.fr_mm_min)); @@ -292,9 +299,19 @@ xyz_pos_t Probe::offset; // Initialized by settings.load constexpr mag_probe_move_t deploy_5 = MAG_MOUNTED_DEPLOY_5; do_blocking_move_to(deploy_5.where, MMM_TO_MMS(deploy_5.fr_mm_min)); #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][1]); + #endif } inline void run_stow_moves() { + #ifdef MAG_MOUNTED_PRE_STOW + constexpr mag_probe_move_t pre_stow = MAG_MOUNTED_PRE_STOW; + do_blocking_move_to(pre_stow.where, MMM_TO_MMS(pre_stow.fr_mm_min)); + #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][0]); + #endif #ifdef MAG_MOUNTED_STOW_1 constexpr mag_probe_move_t stow_1 = MAG_MOUNTED_STOW_1; do_blocking_move_to(stow_1.where, MMM_TO_MMS(stow_1.fr_mm_min)); @@ -315,6 +332,9 @@ xyz_pos_t Probe::offset; // Initialized by settings.load constexpr mag_probe_move_t stow_5 = MAG_MOUNTED_STOW_5; do_blocking_move_to(stow_5.where, MMM_TO_MMS(stow_5.fr_mm_min)); #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][1]); + #endif } #endif // MAG_MOUNTED_PROBE @@ -541,7 +561,7 @@ bool Probe::set_deployed(const bool deploy, const bool no_return/*=false*/) { #if ENABLED(PROBE_TRIGGERED_WHEN_STOWED_TEST) // Only deploy/stow if needed - if (PROBE_TRIGGERED() == deploy) { + if (PROBE_TRIGGERED() == deploy || !deploy) { if (!deploy) endstops.enable_z_probe(false); // Switch off triggered when stowed probes early // otherwise an Allen-Key probe can't be stowed. probe_specific_action(deploy); diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index d6656d36d8..50aaf56196 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -223,7 +223,7 @@ float segments_per_second = DEFAULT_SEGMENTS_PER_SECOND; //const int x_axis_home_dir = TOOL_X_HOME_DIR(active_extruder); - //const xy_pos_t pos { max_length(X_AXIS) , max_length(Y_AXIS) }; + //const xy_pos_t pos { max_length(X_AXIS), max_length(Y_AXIS) }; //const float mlz = max_length(X_AXIS), // Move all carriages together linearly until an endstop is hit. @@ -293,7 +293,7 @@ float segments_per_second = DEFAULT_SEGMENTS_PER_SECOND; delta.set(DEGREES(THETA), DEGREES(PHI), DEGREES(PSI)); - //SERIAL_ECHOLNPGM(" SCARA (x,y,z) ", spos.x , ",", spos.y, ",", spos.z, " Rho=", RHO, " Rho2=", RHO2, " Theta=", THETA, " Phi=", PHI, " Psi=", PSI, " Gamma=", GAMMA); + //SERIAL_ECHOLNPGM(" SCARA (x,y,z) ", spos.x, ",", spos.y, ",", spos.z, " Rho=", RHO, " Rho2=", RHO2, " Theta=", THETA, " Phi=", PHI, " Psi=", PSI, " Gamma=", GAMMA); } #endif diff --git a/Marlin/src/module/servo.h b/Marlin/src/module/servo.h index 3b6c33a8f7..f35a8c3930 100644 --- a/Marlin/src/module/servo.h +++ b/Marlin/src/module/servo.h @@ -63,6 +63,9 @@ #endif constexpr uint16_t sazp[] = Z_SERVO_ANGLES; static_assert(COUNT(sazp) == 2, "Z_SERVO_ANGLES needs 2 angles."); + #elif defined(MAG_MOUNTED_PROBE_SERVO_ANGLES) + constexpr uint16_t sazp[] = MAG_MOUNTED_PROBE_SERVO_ANGLES; + static_assert(COUNT(sazp) == 2, "MAG_MOUNTED_PROBE_SERVO_ANGLES needs 2 angles."); #else constexpr uint16_t sazp[2] = { 0 }; #endif @@ -82,6 +85,9 @@ #ifndef Z_PROBE_SERVO_NR #define Z_PROBE_SERVO_NR -1 #endif + #ifndef MAG_MOUNTED_PROBE_SERVO_NR + #define MAG_MOUNTED_PROBE_SERVO_NR -1 + #endif #define SASN(J,I) TERN(SWITCHING_NOZZLE_TWO_SERVOS, sasn[J][I], sasn[I]) @@ -91,6 +97,7 @@ : N == SWITCHING_NOZZLE_SERVO_NR ? SASN(0,I) \ : N == SWITCHING_NOZZLE_E1_SERVO_NR ? SASN(1,I) \ : N == Z_PROBE_SERVO_NR ? sazp[I] \ + : N == MAG_MOUNTED_PROBE_SERVO_NR ? sazp[I] \ : 0 ) #if ENABLED(EDITABLE_SERVO_ANGLES) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 485d01066a..a6714b3e6a 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -60,6 +60,10 @@ #include "../HAL/shared/eeprom_api.h" #endif +#if HAS_SPINDLE_ACCELERATION + #include "../feature/spindle_laser.h" +#endif + #if HAS_BED_PROBE #include "probe.h" #endif @@ -186,11 +190,6 @@ #pragma pack(push, 1) // No padding between variables -#if HAS_ETHERNET - void ETH0_report(); - void MAC_report(); -#endif - #define _EN_ITEM(N) , E##N #define _EN1_ITEM(N) , E##N:1 @@ -252,6 +251,13 @@ typedef struct SettingsDataStruct { xyz_pos_t hotend_offset[HOTENDS - 1]; // M218 XYZ #endif + // + // Spindle Acceleration + // + #if HAS_SPINDLE_ACCELERATION + uint32_t acceleration_spindle; // cutter.acceleration_spindle_deg_per_s2 + #endif + // // FILAMENT_RUNOUT_SENSOR // @@ -469,6 +475,13 @@ typedef struct SettingsDataStruct { xyz_feedrate_t homing_feedrate_mm_m; // M210 X Y Z I J K U V W #endif + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + homing_current_t homing_current_mA; // M920 X Y Z... + #endif + // // !NO_VOLUMETRIC // @@ -934,7 +947,7 @@ void MarlinSettings::postprocess() { #endif // NUM_AXES // - // Hotend Offsets, if any + // Hotend Offsets // { #if HAS_HOTEND_OFFSET @@ -944,6 +957,16 @@ void MarlinSettings::postprocess() { #endif } + // + // Spindle Acceleration + // + { + #if HAS_SPINDLE_ACCELERATION + _FIELD_TEST(acceleration_spindle); + EEPROM_WRITE(cutter.acceleration_spindle_deg_per_s2); + #endif + } + // // Filament Runout Sensor // @@ -1355,6 +1378,14 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(homing_feedrate_mm_m); #endif + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + _FIELD_TEST(homing_current_mA); + EEPROM_WRITE(homing_current_mA); + #endif + // // Volumetric & Filament Size // @@ -1393,72 +1424,28 @@ void MarlinSettings::postprocess() { per_stepper_uint16_t tmc_stepper_current{0}; #if HAS_TRINAMIC_CONFIG - #if AXIS_IS_TMC(X) - tmc_stepper_current.X = stepperX.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y) - tmc_stepper_current.Y = stepperY.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z) - tmc_stepper_current.Z = stepperZ.getMilliamps(); - #endif - #if AXIS_IS_TMC(I) - tmc_stepper_current.I = stepperI.getMilliamps(); - #endif - #if AXIS_IS_TMC(J) - tmc_stepper_current.J = stepperJ.getMilliamps(); - #endif - #if AXIS_IS_TMC(K) - tmc_stepper_current.K = stepperK.getMilliamps(); - #endif - #if AXIS_IS_TMC(U) - tmc_stepper_current.U = stepperU.getMilliamps(); - #endif - #if AXIS_IS_TMC(V) - tmc_stepper_current.V = stepperV.getMilliamps(); - #endif - #if AXIS_IS_TMC(W) - tmc_stepper_current.W = stepperW.getMilliamps(); - #endif - #if AXIS_IS_TMC(X2) - tmc_stepper_current.X2 = stepperX2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y2) - tmc_stepper_current.Y2 = stepperY2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z2) - tmc_stepper_current.Z2 = stepperZ2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z3) - tmc_stepper_current.Z3 = stepperZ3.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z4) - tmc_stepper_current.Z4 = stepperZ4.getMilliamps(); - #endif - #if AXIS_IS_TMC(E0) - tmc_stepper_current.E0 = stepperE0.getMilliamps(); - #endif - #if AXIS_IS_TMC(E1) - tmc_stepper_current.E1 = stepperE1.getMilliamps(); - #endif - #if AXIS_IS_TMC(E2) - tmc_stepper_current.E2 = stepperE2.getMilliamps(); - #endif - #if AXIS_IS_TMC(E3) - tmc_stepper_current.E3 = stepperE3.getMilliamps(); - #endif - #if AXIS_IS_TMC(E4) - tmc_stepper_current.E4 = stepperE4.getMilliamps(); - #endif - #if AXIS_IS_TMC(E5) - tmc_stepper_current.E5 = stepperE5.getMilliamps(); - #endif - #if AXIS_IS_TMC(E6) - tmc_stepper_current.E6 = stepperE6.getMilliamps(); - #endif - #if AXIS_IS_TMC(E7) - tmc_stepper_current.E7 = stepperE7.getMilliamps(); - #endif + TERN_(X_IS_TRINAMIC, tmc_stepper_current.X = stepperX.getMilliamps()); + TERN_(Y_IS_TRINAMIC, tmc_stepper_current.Y = stepperY.getMilliamps()); + TERN_(Z_IS_TRINAMIC, tmc_stepper_current.Z = stepperZ.getMilliamps()); + TERN_(I_IS_TRINAMIC, tmc_stepper_current.I = stepperI.getMilliamps()); + TERN_(J_IS_TRINAMIC, tmc_stepper_current.J = stepperJ.getMilliamps()); + TERN_(K_IS_TRINAMIC, tmc_stepper_current.K = stepperK.getMilliamps()); + TERN_(U_IS_TRINAMIC, tmc_stepper_current.U = stepperU.getMilliamps()); + TERN_(V_IS_TRINAMIC, tmc_stepper_current.V = stepperV.getMilliamps()); + TERN_(W_IS_TRINAMIC, tmc_stepper_current.W = stepperW.getMilliamps()); + TERN_(X2_IS_TRINAMIC, tmc_stepper_current.X2 = stepperX2.getMilliamps()); + TERN_(Y2_IS_TRINAMIC, tmc_stepper_current.Y2 = stepperY2.getMilliamps()); + TERN_(Z2_IS_TRINAMIC, tmc_stepper_current.Z2 = stepperZ2.getMilliamps()); + TERN_(Z3_IS_TRINAMIC, tmc_stepper_current.Z3 = stepperZ3.getMilliamps()); + TERN_(Z4_IS_TRINAMIC, tmc_stepper_current.Z4 = stepperZ4.getMilliamps()); + TERN_(E0_IS_TRINAMIC, tmc_stepper_current.E0 = stepperE0.getMilliamps()); + TERN_(E1_IS_TRINAMIC, tmc_stepper_current.E1 = stepperE1.getMilliamps()); + TERN_(E2_IS_TRINAMIC, tmc_stepper_current.E2 = stepperE2.getMilliamps()); + TERN_(E3_IS_TRINAMIC, tmc_stepper_current.E3 = stepperE3.getMilliamps()); + TERN_(E4_IS_TRINAMIC, tmc_stepper_current.E4 = stepperE4.getMilliamps()); + TERN_(E5_IS_TRINAMIC, tmc_stepper_current.E5 = stepperE5.getMilliamps()); + TERN_(E6_IS_TRINAMIC, tmc_stepper_current.E6 = stepperE6.getMilliamps()); + TERN_(E7_IS_TRINAMIC, tmc_stepper_current.E7 = stepperE7.getMilliamps()); #endif EEPROM_WRITE(tmc_stepper_current); } @@ -2014,7 +2001,7 @@ void MarlinSettings::postprocess() { #endif // NUM_AXES // - // Hotend Offsets, if any + // Hotend Offsets // { #if HAS_HOTEND_OFFSET @@ -2024,6 +2011,16 @@ void MarlinSettings::postprocess() { #endif } + // + // Spindle Acceleration + // + { + #if HAS_SPINDLE_ACCELERATION + _FIELD_TEST(acceleration_spindle); + EEPROM_READ(cutter.acceleration_spindle_deg_per_s2); + #endif + } + // // Filament Runout Sensor // @@ -2032,7 +2029,7 @@ void MarlinSettings::postprocess() { _FIELD_TEST(runout_sensor_enabled); EEPROM_READ(runout_sensor_enabled); #if HAS_FILAMENT_SENSOR - if (!validating) runout.enabled = runout_sensor_enabled < 0 ? FIL_RUNOUT_ENABLED_DEFAULT : runout_sensor_enabled; + if (!validating) runout.enabled = runout_sensor_enabled < 0 ? FIL_RUNOUT_ENABLED_DEFAULT : runout_sensor_enabled; #endif TERN_(HAS_FILAMENT_SENSOR, if (runout.enabled) runout.reset()); @@ -2458,6 +2455,14 @@ void MarlinSettings::postprocess() { EEPROM_READ(homing_feedrate_mm_m); #endif + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + _FIELD_TEST(homing_current_mA); + EEPROM_READ(homing_current_mA); + #endif + // // Volumetric & Filament Size // @@ -2499,72 +2504,28 @@ void MarlinSettings::postprocess() { #define SET_CURR(Q) stepper##Q.rms_current(currents.Q ? currents.Q : Q##_CURRENT) if (!validating) { - #if AXIS_IS_TMC(X) - SET_CURR(X); - #endif - #if AXIS_IS_TMC(Y) - SET_CURR(Y); - #endif - #if AXIS_IS_TMC(Z) - SET_CURR(Z); - #endif - #if AXIS_IS_TMC(X2) - SET_CURR(X2); - #endif - #if AXIS_IS_TMC(Y2) - SET_CURR(Y2); - #endif - #if AXIS_IS_TMC(Z2) - SET_CURR(Z2); - #endif - #if AXIS_IS_TMC(Z3) - SET_CURR(Z3); - #endif - #if AXIS_IS_TMC(Z4) - SET_CURR(Z4); - #endif - #if AXIS_IS_TMC(I) - SET_CURR(I); - #endif - #if AXIS_IS_TMC(J) - SET_CURR(J); - #endif - #if AXIS_IS_TMC(K) - SET_CURR(K); - #endif - #if AXIS_IS_TMC(U) - SET_CURR(U); - #endif - #if AXIS_IS_TMC(V) - SET_CURR(V); - #endif - #if AXIS_IS_TMC(W) - SET_CURR(W); - #endif - #if AXIS_IS_TMC(E0) - SET_CURR(E0); - #endif - #if AXIS_IS_TMC(E1) - SET_CURR(E1); - #endif - #if AXIS_IS_TMC(E2) - SET_CURR(E2); - #endif - #if AXIS_IS_TMC(E3) - SET_CURR(E3); - #endif - #if AXIS_IS_TMC(E4) - SET_CURR(E4); - #endif - #if AXIS_IS_TMC(E5) - SET_CURR(E5); - #endif - #if AXIS_IS_TMC(E6) - SET_CURR(E6); - #endif - #if AXIS_IS_TMC(E7) - SET_CURR(E7); - #endif + TERN_(X_IS_TRINAMIC, SET_CURR(X)); + TERN_(Y_IS_TRINAMIC, SET_CURR(Y)); + TERN_(Z_IS_TRINAMIC, SET_CURR(Z)); + TERN_(I_IS_TRINAMIC, SET_CURR(I)); + TERN_(J_IS_TRINAMIC, SET_CURR(J)); + TERN_(K_IS_TRINAMIC, SET_CURR(K)); + TERN_(U_IS_TRINAMIC, SET_CURR(U)); + TERN_(V_IS_TRINAMIC, SET_CURR(V)); + TERN_(W_IS_TRINAMIC, SET_CURR(W)); + TERN_(X2_IS_TRINAMIC, SET_CURR(X2)); + TERN_(Y2_IS_TRINAMIC, SET_CURR(Y2)); + TERN_(Z2_IS_TRINAMIC, SET_CURR(Z2)); + TERN_(Z3_IS_TRINAMIC, SET_CURR(Z3)); + TERN_(Z4_IS_TRINAMIC, SET_CURR(Z4)); + TERN_(E0_IS_TRINAMIC, SET_CURR(E0)); + TERN_(E1_IS_TRINAMIC, SET_CURR(E1)); + TERN_(E2_IS_TRINAMIC, SET_CURR(E2)); + TERN_(E3_IS_TRINAMIC, SET_CURR(E3)); + TERN_(E4_IS_TRINAMIC, SET_CURR(E4)); + TERN_(E5_IS_TRINAMIC, SET_CURR(E5)); + TERN_(E6_IS_TRINAMIC, SET_CURR(E6)); + TERN_(E7_IS_TRINAMIC, SET_CURR(E7)); } #endif } @@ -3351,14 +3312,27 @@ void MarlinSettings::reset() { TERN_(HAS_JUNCTION_DEVIATION, planner.junction_deviation_mm = float(JUNCTION_DEVIATION_MM)); + // + // Home Offset + // #if HAS_SCARA_OFFSET scara_home_offset.reset(); #elif HAS_HOME_OFFSET home_offset.reset(); #endif + // + // Hotend Offsets + // TERN_(HAS_HOTEND_OFFSET, reset_hotend_offsets()); + // + // Spindle Acceleration + // + #if HAS_SPINDLE_ACCELERATION + cutter.acceleration_spindle_deg_per_s2 = DEFAULT_ACCELERATION_SPINDLE; + #endif + // // Filament Runout Sensor // @@ -3564,13 +3538,17 @@ void MarlinSettings::reset() { #if HAS_HEATED_BED constexpr uint16_t bpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_BED) }; #endif + #if HAS_HEATED_CHAMBER + constexpr uint16_t cpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_CHAMBER) }; + #endif #if HAS_FAN constexpr uint8_t fpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, FAN_SPEED) }; #endif for (uint8_t i = 0; i < PREHEAT_COUNT; ++i) { - TERN_(HAS_HOTEND, ui.material_preset[i].hotend_temp = hpre[i]); - TERN_(HAS_HEATED_BED, ui.material_preset[i].bed_temp = bpre[i]); - TERN_(HAS_FAN, ui.material_preset[i].fan_speed = fpre[i]); + TERN_(HAS_HOTEND, ui.material_preset[i].hotend_temp = hpre[i]); + TERN_(HAS_HEATED_BED, ui.material_preset[i].bed_temp = bpre[i]); + TERN_(HAS_HEATED_CHAMBER, ui.material_preset[i].chamber_temp = cpre[i]); + TERN_(HAS_FAN, ui.material_preset[i].fan_speed = fpre[i]); } #endif @@ -3710,6 +3688,29 @@ void MarlinSettings::reset() { // TERN_(EDITABLE_HOMING_FEEDRATE, homing_feedrate_mm_m = xyz_feedrate_t(HOMING_FEEDRATE_MM_M)); + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + homing_current_t base_homing_current_mA = { + OPTITEM(X_HAS_HOME_CURRENT, X_CURRENT_HOME) + OPTITEM(Y_HAS_HOME_CURRENT, Y_CURRENT_HOME) + OPTITEM(Z_HAS_HOME_CURRENT, Z_CURRENT_HOME) + OPTITEM(X2_HAS_HOME_CURRENT, X2_CURRENT_HOME) + OPTITEM(Y2_HAS_HOME_CURRENT, Y2_CURRENT_HOME) + OPTITEM(Z2_HAS_HOME_CURRENT, Z2_CURRENT_HOME) + OPTITEM(Z3_HAS_HOME_CURRENT, Z3_CURRENT_HOME) + OPTITEM(Z4_HAS_HOME_CURRENT, Z4_CURRENT_HOME) + OPTITEM(I_HAS_HOME_CURRENT, I_CURRENT_HOME) + OPTITEM(J_HAS_HOME_CURRENT, J_CURRENT_HOME) + OPTITEM(K_HAS_HOME_CURRENT, K_CURRENT_HOME) + OPTITEM(U_HAS_HOME_CURRENT, U_CURRENT_HOME) + OPTITEM(V_HAS_HOME_CURRENT, V_CURRENT_HOME) + OPTITEM(W_HAS_HOME_CURRENT, W_CURRENT_HOME) + }; + homing_current_mA = base_homing_current_mA; + #endif + // // Volumetric & Filament Size // @@ -3750,7 +3751,7 @@ void MarlinSettings::reset() { #if HAS_MOTOR_CURRENT_PWM constexpr uint32_t tmp_motor_current_setting[MOTOR_CURRENT_COUNT] = PWM_MOTOR_CURRENT; for (uint8_t q = 0; q < MOTOR_CURRENT_COUNT; ++q) - stepper.set_digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q])); + stepper.set_digipot_current(q, tmp_motor_current_setting[q]); #endif // @@ -3758,10 +3759,8 @@ void MarlinSettings::reset() { // #if HAS_MOTOR_CURRENT_SPI static constexpr uint32_t tmp_motor_current_setting[] = DIGIPOT_MOTOR_CURRENT; - DEBUG_ECHOLNPGM("Writing Digipot"); for (uint8_t q = 0; q < COUNT(tmp_motor_current_setting); ++q) stepper.set_digipot_current(q, tmp_motor_current_setting[q]); - DEBUG_ECHOLNPGM("Digipot Written"); #endif // @@ -4142,6 +4141,11 @@ void MarlinSettings::reset() { TERN_(USE_SENSORLESS, gcode.M914_report(forReplay)); #endif + // + // TMC Homing Current + // + TERN_(EDITABLE_HOMING_CURRENT, gcode.M920_report(forReplay)); + // // TMC stepping mode // @@ -4201,11 +4205,11 @@ void MarlinSettings::reset() { #if HAS_ETHERNET CONFIG_ECHO_HEADING("Ethernet"); - if (!forReplay) ETH0_report(); - CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); MAC_report(); - CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); gcode.M552_report(); - CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); gcode.M553_report(); - CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); gcode.M554_report(); + if (!forReplay) ethernet.ETH0_report(false); + ethernet.MAC_report(forReplay); + gcode.M552_report(forReplay); + gcode.M553_report(forReplay); + gcode.M554_report(forReplay); #endif TERN_(HAS_MULTI_LANGUAGE, gcode.M414_report(forReplay)); diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 69c6f66fbc..85c7521960 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2949,180 +2949,53 @@ void Stepper::init() { TERN_(HAS_MICROSTEPS, microstep_init()); // Init Dir Pins - TERN_(HAS_X_DIR, X_DIR_INIT()); + TERN_(HAS_X_DIR, X_DIR_INIT()); TERN_(HAS_X2_DIR, X2_DIR_INIT()); - #if HAS_Y_DIR - Y_DIR_INIT(); - #if ALL(HAS_Y2_STEPPER, HAS_Y2_DIR) - Y2_DIR_INIT(); - #endif - #endif - #if HAS_Z_DIR - Z_DIR_INIT(); - #if NUM_Z_STEPPERS >= 2 && HAS_Z2_DIR - Z2_DIR_INIT(); - #endif - #if NUM_Z_STEPPERS >= 3 && HAS_Z3_DIR - Z3_DIR_INIT(); - #endif - #if NUM_Z_STEPPERS >= 4 && HAS_Z4_DIR - Z4_DIR_INIT(); - #endif - #endif - SECONDARY_AXIS_CODE( - I_DIR_INIT(), J_DIR_INIT(), K_DIR_INIT(), - U_DIR_INIT(), V_DIR_INIT(), W_DIR_INIT() - ); - #if HAS_E0_DIR - E0_DIR_INIT(); - #endif - #if HAS_E1_DIR - E1_DIR_INIT(); - #endif - #if HAS_E2_DIR - E2_DIR_INIT(); - #endif - #if HAS_E3_DIR - E3_DIR_INIT(); - #endif - #if HAS_E4_DIR - E4_DIR_INIT(); - #endif - #if HAS_E5_DIR - E5_DIR_INIT(); - #endif - #if HAS_E6_DIR - E6_DIR_INIT(); - #endif - #if HAS_E7_DIR - E7_DIR_INIT(); - #endif + TERN_(HAS_Y_DIR, Y_DIR_INIT()); + TERN_(HAS_Y2_DIR, Y2_DIR_INIT()); + TERN_(HAS_Z_DIR, Z_DIR_INIT()); + TERN_(HAS_Z2_DIR, Z2_DIR_INIT()); + TERN_(HAS_Z3_DIR, Z3_DIR_INIT()); + TERN_(HAS_Z4_DIR, Z4_DIR_INIT()); + TERN_(HAS_I_DIR, I_DIR_INIT()); + TERN_(HAS_J_DIR, J_DIR_INIT()); + TERN_(HAS_K_DIR, K_DIR_INIT()); + TERN_(HAS_U_DIR, U_DIR_INIT()); + TERN_(HAS_V_DIR, V_DIR_INIT()); + TERN_(HAS_W_DIR, W_DIR_INIT()); + TERN_(HAS_E0_DIR, E0_DIR_INIT()); + TERN_(HAS_E1_DIR, E1_DIR_INIT()); + TERN_(HAS_E2_DIR, E2_DIR_INIT()); + TERN_(HAS_E3_DIR, E3_DIR_INIT()); + TERN_(HAS_E4_DIR, E4_DIR_INIT()); + TERN_(HAS_E5_DIR, E5_DIR_INIT()); + TERN_(HAS_E6_DIR, E6_DIR_INIT()); + TERN_(HAS_E7_DIR, E7_DIR_INIT()); - // Init Enable Pins - steppers default to disabled. - #if HAS_X_ENABLE - #ifndef X_ENABLE_INIT_STATE - #define X_ENABLE_INIT_STATE !X_ENABLE_ON - #endif - X_ENABLE_INIT(); - if (X_ENABLE_INIT_STATE) X_ENABLE_WRITE(X_ENABLE_INIT_STATE); - #if ALL(HAS_X2_STEPPER, HAS_X2_ENABLE) - X2_ENABLE_INIT(); - if (X_ENABLE_INIT_STATE) X2_ENABLE_WRITE(X_ENABLE_INIT_STATE); - #endif - #endif - #if HAS_Y_ENABLE - #ifndef Y_ENABLE_INIT_STATE - #define Y_ENABLE_INIT_STATE !Y_ENABLE_ON - #endif - Y_ENABLE_INIT(); - if (Y_ENABLE_INIT_STATE) Y_ENABLE_WRITE(Y_ENABLE_INIT_STATE); - #if ALL(HAS_Y2_STEPPER, HAS_Y2_ENABLE) - Y2_ENABLE_INIT(); - if (Y_ENABLE_INIT_STATE) Y2_ENABLE_WRITE(Y_ENABLE_INIT_STATE); - #endif - #endif - #if HAS_Z_ENABLE - #ifndef Z_ENABLE_INIT_STATE - #define Z_ENABLE_INIT_STATE !Z_ENABLE_ON - #endif - Z_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #if NUM_Z_STEPPERS >= 2 && HAS_Z2_ENABLE - Z2_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z2_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #endif - #if NUM_Z_STEPPERS >= 3 && HAS_Z3_ENABLE - Z3_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z3_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #endif - #if NUM_Z_STEPPERS >= 4 && HAS_Z4_ENABLE - Z4_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z4_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #endif - #endif - #if HAS_I_ENABLE - I_ENABLE_INIT(); - if (!I_ENABLE_ON) I_ENABLE_WRITE(HIGH); - #endif - #if HAS_J_ENABLE - J_ENABLE_INIT(); - if (!J_ENABLE_ON) J_ENABLE_WRITE(HIGH); - #endif - #if HAS_K_ENABLE - K_ENABLE_INIT(); - if (!K_ENABLE_ON) K_ENABLE_WRITE(HIGH); - #endif - #if HAS_U_ENABLE - U_ENABLE_INIT(); - if (!U_ENABLE_ON) U_ENABLE_WRITE(HIGH); - #endif - #if HAS_V_ENABLE - V_ENABLE_INIT(); - if (!V_ENABLE_ON) V_ENABLE_WRITE(HIGH); - #endif - #if HAS_W_ENABLE - W_ENABLE_INIT(); - if (!W_ENABLE_ON) W_ENABLE_WRITE(HIGH); - #endif - #if HAS_E0_ENABLE - #ifndef E_ENABLE_INIT_STATE - #define E_ENABLE_INIT_STATE !E_ENABLE_ON - #endif - #ifndef E0_ENABLE_INIT_STATE - #define E0_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E0_ENABLE_INIT(); - if (E0_ENABLE_INIT_STATE) E0_ENABLE_WRITE(E0_ENABLE_INIT_STATE); - #endif - #if HAS_E1_ENABLE - #ifndef E1_ENABLE_INIT_STATE - #define E1_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E1_ENABLE_INIT(); - if (E1_ENABLE_INIT_STATE) E1_ENABLE_WRITE(E1_ENABLE_INIT_STATE); - #endif - #if HAS_E2_ENABLE - #ifndef E2_ENABLE_INIT_STATE - #define E2_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E2_ENABLE_INIT(); - if (E2_ENABLE_INIT_STATE) E2_ENABLE_WRITE(E2_ENABLE_INIT_STATE); - #endif - #if HAS_E3_ENABLE - #ifndef E3_ENABLE_INIT_STATE - #define E3_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E3_ENABLE_INIT(); - if (E3_ENABLE_INIT_STATE) E3_ENABLE_WRITE(E3_ENABLE_INIT_STATE); - #endif - #if HAS_E4_ENABLE - #ifndef E4_ENABLE_INIT_STATE - #define E4_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E4_ENABLE_INIT(); - if (E4_ENABLE_INIT_STATE) E4_ENABLE_WRITE(E4_ENABLE_INIT_STATE); - #endif - #if HAS_E5_ENABLE - #ifndef E5_ENABLE_INIT_STATE - #define E5_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E5_ENABLE_INIT(); - if (E5_ENABLE_INIT_STATE) E5_ENABLE_WRITE(E5_ENABLE_INIT_STATE); - #endif - #if HAS_E6_ENABLE - #ifndef E6_ENABLE_INIT_STATE - #define E6_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E6_ENABLE_INIT(); - if (E6_ENABLE_INIT_STATE) E6_ENABLE_WRITE(E6_ENABLE_INIT_STATE); - #endif - #if HAS_E7_ENABLE - #ifndef E7_ENABLE_INIT_STATE - #define E7_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E7_ENABLE_INIT(); - if (E7_ENABLE_INIT_STATE) E7_ENABLE_WRITE(E7_ENABLE_INIT_STATE); - #endif + // Init Enable Pins - Steppers default to disabled. + #define _INIT_CONFIG_ENABLE(A) do{ A##_ENABLE_INIT(); if (A##_ENABLE_INIT_STATE) A##_ENABLE_WRITE(HIGH); }while(0) + TERN_(HAS_X_ENABLE, _INIT_CONFIG_ENABLE(X)); + TERN_(HAS_X2_ENABLE, _INIT_CONFIG_ENABLE(X2)); + TERN_(HAS_Y_ENABLE, _INIT_CONFIG_ENABLE(Y)); + TERN_(HAS_Y2_ENABLE, _INIT_CONFIG_ENABLE(Y2)); + TERN_(HAS_Z_ENABLE, _INIT_CONFIG_ENABLE(Z)); + TERN_(HAS_Z2_ENABLE, _INIT_CONFIG_ENABLE(Z2)); + TERN_(HAS_Z3_ENABLE, _INIT_CONFIG_ENABLE(Z3)); + TERN_(HAS_Z4_ENABLE, _INIT_CONFIG_ENABLE(Z4)); + TERN_(HAS_I_ENABLE, _INIT_CONFIG_ENABLE(I)); + TERN_(HAS_J_ENABLE, _INIT_CONFIG_ENABLE(J)); + TERN_(HAS_K_ENABLE, _INIT_CONFIG_ENABLE(K)); + TERN_(HAS_U_ENABLE, _INIT_CONFIG_ENABLE(U)); + TERN_(HAS_V_ENABLE, _INIT_CONFIG_ENABLE(V)); + TERN_(HAS_W_ENABLE, _INIT_CONFIG_ENABLE(W)); + TERN_(HAS_E0_ENABLE, _INIT_CONFIG_ENABLE(E0)); + TERN_(HAS_E1_ENABLE, _INIT_CONFIG_ENABLE(E1)); + TERN_(HAS_E2_ENABLE, _INIT_CONFIG_ENABLE(E2)); + TERN_(HAS_E3_ENABLE, _INIT_CONFIG_ENABLE(E3)); + TERN_(HAS_E4_ENABLE, _INIT_CONFIG_ENABLE(E4)); + TERN_(HAS_E5_ENABLE, _INIT_CONFIG_ENABLE(E5)); + TERN_(HAS_E6_ENABLE, _INIT_CONFIG_ENABLE(E6)); + TERN_(HAS_E7_ENABLE, _INIT_CONFIG_ENABLE(E7)); #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT() #define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW) @@ -3133,7 +3006,7 @@ void Stepper::init() { _WRITE_STEP(AXIS, !_STEP_STATE(PIN)); \ _DISABLE_AXIS(AXIS) - #define E_AXIS_INIT(NUM) AXIS_INIT(E## NUM, E) + #define E_AXIS_INIT(NUM) DEFER(AXIS_INIT)(E##NUM, E) // Init Step Pins #if HAS_X_STEP @@ -3167,49 +3040,21 @@ void Stepper::init() { #endif AXIS_INIT(Z, Z); #endif - #if HAS_I_STEP - AXIS_INIT(I, I); - #endif - #if HAS_J_STEP - AXIS_INIT(J, J); - #endif - #if HAS_K_STEP - AXIS_INIT(K, K); - #endif - #if HAS_U_STEP - AXIS_INIT(U, U); - #endif - #if HAS_V_STEP - AXIS_INIT(V, V); - #endif - #if HAS_W_STEP - AXIS_INIT(W, W); - #endif + TERN_(HAS_I_STEP, AXIS_INIT(I, I)); + TERN_(HAS_J_STEP, AXIS_INIT(J, J)); + TERN_(HAS_K_STEP, AXIS_INIT(K, K)); + TERN_(HAS_U_STEP, AXIS_INIT(U, U)); + TERN_(HAS_V_STEP, AXIS_INIT(V, V)); + TERN_(HAS_W_STEP, AXIS_INIT(W, W)); - #if E_STEPPERS && HAS_E0_STEP - E_AXIS_INIT(0); - #endif - #if (E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS)) && HAS_E1_STEP - E_AXIS_INIT(1); - #endif - #if E_STEPPERS > 2 && HAS_E2_STEP - E_AXIS_INIT(2); - #endif - #if E_STEPPERS > 3 && HAS_E3_STEP - E_AXIS_INIT(3); - #endif - #if E_STEPPERS > 4 && HAS_E4_STEP - E_AXIS_INIT(4); - #endif - #if E_STEPPERS > 5 && HAS_E5_STEP - E_AXIS_INIT(5); - #endif - #if E_STEPPERS > 6 && HAS_E6_STEP - E_AXIS_INIT(6); - #endif - #if E_STEPPERS > 7 && HAS_E7_STEP - E_AXIS_INIT(7); - #endif + TERN_(HAS_E0_STEP, E_AXIS_INIT(0)); + TERN_(HAS_E1_STEP, E_AXIS_INIT(1)); + TERN_(HAS_E2_STEP, E_AXIS_INIT(2)); + TERN_(HAS_E3_STEP, E_AXIS_INIT(3)); + TERN_(HAS_E4_STEP, E_AXIS_INIT(4)); + TERN_(HAS_E5_STEP, E_AXIS_INIT(5)); + TERN_(HAS_E6_STEP, E_AXIS_INIT(6)); + TERN_(HAS_E7_STEP, E_AXIS_INIT(7)); #if DISABLED(I2S_STEPPER_STREAM) HAL_timer_start(MF_TIMER_STEP, 122); // Init Stepper ISR to 122 Hz for quick starting @@ -3809,7 +3654,7 @@ void Stepper::report_positions() { #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W) case 0: #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z case 1: #endif #if HAS_MOTOR_CURRENT_PWM_E @@ -3828,7 +3673,7 @@ void Stepper::report_positions() { #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) { - if (WITHIN(driver, 0, MOTOR_CURRENT_COUNT - 1)) + if (WITHIN(driver, 0, COUNT(motor_current_setting) - 1)) motor_current_setting[driver] = current; // update motor_current_setting if (!initialized) return; @@ -3874,7 +3719,7 @@ void Stepper::report_positions() { #endif break; case 1: - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z _WRITE_CURRENT_PWM(Z); #endif break; @@ -3939,7 +3784,7 @@ void Stepper::report_positions() { #if PIN_EXISTS(MOTOR_CURRENT_PWM_W) INIT_CURRENT_PWM(W); #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z INIT_CURRENT_PWM(Z); #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 4c83cbd6a6..19594df66c 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -80,6 +80,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // X Stepper #if HAS_X_AXIS + #ifndef X_ENABLE_INIT_STATE + #define X_ENABLE_INIT_STATE !X_ENABLE_ON + #endif #ifndef X_ENABLE_INIT #define X_ENABLE_INIT() SET_OUTPUT(X_ENABLE_PIN) #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE) @@ -99,6 +102,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Y Stepper #if HAS_Y_AXIS + #ifndef Y_ENABLE_INIT_STATE + #define Y_ENABLE_INIT_STATE !Y_ENABLE_ON + #endif #ifndef Y_ENABLE_INIT #define Y_ENABLE_INIT() SET_OUTPUT(Y_ENABLE_PIN) #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE) @@ -118,6 +124,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z Stepper #if HAS_Z_AXIS + #ifndef Z_ENABLE_INIT_STATE + #define Z_ENABLE_INIT_STATE !Z_ENABLE_ON + #endif #ifndef Z_ENABLE_INIT #define Z_ENABLE_INIT() SET_OUTPUT(Z_ENABLE_PIN) #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE) @@ -137,6 +146,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // X2 Stepper #if HAS_X2_ENABLE + #ifndef X2_ENABLE_INIT_STATE + #define X2_ENABLE_INIT_STATE X_ENABLE_INIT_STATE + #endif #ifndef X2_ENABLE_INIT #define X2_ENABLE_INIT() SET_OUTPUT(X2_ENABLE_PIN) #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE) @@ -156,6 +168,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Y2 Stepper #if HAS_Y2_ENABLE + #ifndef Y2_ENABLE_INIT_STATE + #define Y2_ENABLE_INIT_STATE Y_ENABLE_INIT_STATE + #endif #ifndef Y2_ENABLE_INIT #define Y2_ENABLE_INIT() SET_OUTPUT(Y2_ENABLE_PIN) #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE) @@ -177,6 +192,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z2 Stepper #if HAS_Z2_ENABLE + #ifndef Z2_ENABLE_INIT_STATE + #define Z2_ENABLE_INIT_STATE Z_ENABLE_INIT_STATE + #endif #ifndef Z2_ENABLE_INIT #define Z2_ENABLE_INIT() SET_OUTPUT(Z2_ENABLE_PIN) #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE) @@ -198,6 +216,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z3 Stepper #if HAS_Z3_ENABLE + #ifndef Z3_ENABLE_INIT_STATE + #define Z3_ENABLE_INIT_STATE Z_ENABLE_INIT_STATE + #endif #ifndef Z3_ENABLE_INIT #define Z3_ENABLE_INIT() SET_OUTPUT(Z3_ENABLE_PIN) #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE) @@ -219,6 +240,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z4 Stepper #if HAS_Z4_ENABLE + #ifndef Z4_ENABLE_INIT_STATE + #define Z4_ENABLE_INIT_STATE Z_ENABLE_INIT_STATE + #endif #ifndef Z4_ENABLE_INIT #define Z4_ENABLE_INIT() SET_OUTPUT(Z4_ENABLE_PIN) #define Z4_ENABLE_WRITE(STATE) WRITE(Z4_ENABLE_PIN,STATE) @@ -240,6 +264,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // I Stepper #if HAS_I_AXIS + #ifndef I_ENABLE_INIT_STATE + #define I_ENABLE_INIT_STATE !I_ENABLE_ON + #endif #ifndef I_ENABLE_INIT #define I_ENABLE_INIT() SET_OUTPUT(I_ENABLE_PIN) #define I_ENABLE_WRITE(STATE) WRITE(I_ENABLE_PIN,STATE) @@ -259,6 +286,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // J Stepper #if HAS_J_AXIS + #ifndef J_ENABLE_INIT_STATE + #define J_ENABLE_INIT_STATE !J_ENABLE_ON + #endif #ifndef J_ENABLE_INIT #define J_ENABLE_INIT() SET_OUTPUT(J_ENABLE_PIN) #define J_ENABLE_WRITE(STATE) WRITE(J_ENABLE_PIN,STATE) @@ -278,6 +308,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // K Stepper #if HAS_K_AXIS + #ifndef K_ENABLE_INIT_STATE + #define K_ENABLE_INIT_STATE !K_ENABLE_ON + #endif #ifndef K_ENABLE_INIT #define K_ENABLE_INIT() SET_OUTPUT(K_ENABLE_PIN) #define K_ENABLE_WRITE(STATE) WRITE(K_ENABLE_PIN,STATE) @@ -297,6 +330,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // U Stepper #if HAS_U_AXIS + #ifndef U_ENABLE_INIT_STATE + #define U_ENABLE_INIT_STATE !U_ENABLE_ON + #endif #ifndef U_ENABLE_INIT #define U_ENABLE_INIT() SET_OUTPUT(U_ENABLE_PIN) #define U_ENABLE_WRITE(STATE) WRITE(U_ENABLE_PIN,STATE) @@ -316,6 +352,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // V Stepper #if HAS_V_AXIS + #ifndef V_ENABLE_INIT_STATE + #define V_ENABLE_INIT_STATE !V_ENABLE_ON + #endif #ifndef V_ENABLE_INIT #define V_ENABLE_INIT() SET_OUTPUT(V_ENABLE_PIN) #define V_ENABLE_WRITE(STATE) WRITE(V_ENABLE_PIN,STATE) @@ -335,6 +374,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // W Stepper #if HAS_W_AXIS + #ifndef W_ENABLE_INIT_STATE + #define W_ENABLE_INIT_STATE !W_ENABLE_ON + #endif #ifndef W_ENABLE_INIT #define W_ENABLE_INIT() SET_OUTPUT(W_ENABLE_PIN) #define W_ENABLE_WRITE(STATE) WRITE(W_ENABLE_PIN,STATE) @@ -353,140 +395,183 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif // E0 Stepper -#ifndef E0_ENABLE_INIT - #define E0_ENABLE_INIT() SET_OUTPUT(E0_ENABLE_PIN) - #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) - #define E0_ENABLE_READ() bool(READ(E0_ENABLE_PIN)) +#if HAS_EXTRUDERS + #ifndef E_ENABLE_INIT_STATE + #define E_ENABLE_INIT_STATE !E_ENABLE_ON + #endif + #ifndef E0_ENABLE_INIT_STATE + #define E0_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif + #ifndef E0_ENABLE_INIT + #define E0_ENABLE_INIT() SET_OUTPUT(E0_ENABLE_PIN) + #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) + #define E0_ENABLE_READ() bool(READ(E0_ENABLE_PIN)) + #endif + #ifndef E0_DIR_INIT + #define E0_DIR_INIT() SET_OUTPUT(E0_DIR_PIN) + #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,INVERT_DIR(E0, STATE)) + #define E0_DIR_READ() INVERT_DIR(E0, bool(READ(E0_DIR_PIN))) + #endif + #define E0_STEP_INIT() SET_OUTPUT(E0_STEP_PIN) + #ifndef E0_STEP_WRITE + #define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE) + #endif + #define E0_STEP_READ() bool(READ(E0_STEP_PIN)) #endif -#ifndef E0_DIR_INIT - #define E0_DIR_INIT() SET_OUTPUT(E0_DIR_PIN) - #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,INVERT_DIR(E0, STATE)) - #define E0_DIR_READ() INVERT_DIR(E0, bool(READ(E0_DIR_PIN))) -#endif -#define E0_STEP_INIT() SET_OUTPUT(E0_STEP_PIN) -#ifndef E0_STEP_WRITE - #define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE) -#endif -#define E0_STEP_READ() bool(READ(E0_STEP_PIN)) // E1 Stepper -#ifndef E1_ENABLE_INIT - #define E1_ENABLE_INIT() SET_OUTPUT(E1_ENABLE_PIN) - #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) - #define E1_ENABLE_READ() bool(READ(E1_ENABLE_PIN)) +#if E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS) + #ifndef E1_ENABLE_INIT_STATE + #define E1_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif + #ifndef E1_ENABLE_INIT + #define E1_ENABLE_INIT() SET_OUTPUT(E1_ENABLE_PIN) + #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) + #define E1_ENABLE_READ() bool(READ(E1_ENABLE_PIN)) + #endif + #ifndef E1_DIR_INIT + #define E1_DIR_INIT() SET_OUTPUT(E1_DIR_PIN) + #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,INVERT_DIR(E1, STATE)) + #define E1_DIR_READ() INVERT_DIR(E1, bool(READ(E1_DIR_PIN))) + #endif + #define E1_STEP_INIT() SET_OUTPUT(E1_STEP_PIN) + #ifndef E1_STEP_WRITE + #define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE) + #endif + #define E1_STEP_READ() bool(READ(E1_STEP_PIN)) #endif -#ifndef E1_DIR_INIT - #define E1_DIR_INIT() SET_OUTPUT(E1_DIR_PIN) - #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,INVERT_DIR(E1, STATE)) - #define E1_DIR_READ() INVERT_DIR(E1, bool(READ(E1_DIR_PIN))) -#endif -#define E1_STEP_INIT() SET_OUTPUT(E1_STEP_PIN) -#ifndef E1_STEP_WRITE - #define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE) -#endif -#define E1_STEP_READ() bool(READ(E1_STEP_PIN)) // E2 Stepper -#ifndef E2_ENABLE_INIT - #define E2_ENABLE_INIT() SET_OUTPUT(E2_ENABLE_PIN) - #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) - #define E2_ENABLE_READ() bool(READ(E2_ENABLE_PIN)) +#if E_STEPPERS > 2 + #ifndef E2_ENABLE_INIT_STATE + #define E2_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif + #ifndef E2_ENABLE_INIT + #define E2_ENABLE_INIT() SET_OUTPUT(E2_ENABLE_PIN) + #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) + #define E2_ENABLE_READ() bool(READ(E2_ENABLE_PIN)) + #endif + #ifndef E2_DIR_INIT + #define E2_DIR_INIT() SET_OUTPUT(E2_DIR_PIN) + #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,INVERT_DIR(E2, STATE)) + #define E2_DIR_READ() INVERT_DIR(E2, bool(READ(E2_DIR_PIN))) + #endif + #define E2_STEP_INIT() SET_OUTPUT(E2_STEP_PIN) + #ifndef E2_STEP_WRITE + #define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE) + #endif + #define E2_STEP_READ() bool(READ(E2_STEP_PIN)) #endif -#ifndef E2_DIR_INIT - #define E2_DIR_INIT() SET_OUTPUT(E2_DIR_PIN) - #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,INVERT_DIR(E2, STATE)) - #define E2_DIR_READ() INVERT_DIR(E2, bool(READ(E2_DIR_PIN))) -#endif -#define E2_STEP_INIT() SET_OUTPUT(E2_STEP_PIN) -#ifndef E2_STEP_WRITE - #define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE) -#endif -#define E2_STEP_READ() bool(READ(E2_STEP_PIN)) // E3 Stepper -#ifndef E3_ENABLE_INIT - #define E3_ENABLE_INIT() SET_OUTPUT(E3_ENABLE_PIN) - #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) - #define E3_ENABLE_READ() bool(READ(E3_ENABLE_PIN)) +#if E_STEPPERS > 3 + #ifndef E3_ENABLE_INIT_STATE + #define E3_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif + #ifndef E3_ENABLE_INIT + #define E3_ENABLE_INIT() SET_OUTPUT(E3_ENABLE_PIN) + #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) + #define E3_ENABLE_READ() bool(READ(E3_ENABLE_PIN)) + #endif + #ifndef E3_DIR_INIT + #define E3_DIR_INIT() SET_OUTPUT(E3_DIR_PIN) + #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,INVERT_DIR(E3, STATE)) + #define E3_DIR_READ() INVERT_DIR(E3, bool(READ(E3_DIR_PIN))) + #endif + #define E3_STEP_INIT() SET_OUTPUT(E3_STEP_PIN) + #ifndef E3_STEP_WRITE + #define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE) + #endif + #define E3_STEP_READ() bool(READ(E3_STEP_PIN)) #endif -#ifndef E3_DIR_INIT - #define E3_DIR_INIT() SET_OUTPUT(E3_DIR_PIN) - #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,INVERT_DIR(E3, STATE)) - #define E3_DIR_READ() INVERT_DIR(E3, bool(READ(E3_DIR_PIN))) -#endif -#define E3_STEP_INIT() SET_OUTPUT(E3_STEP_PIN) -#ifndef E3_STEP_WRITE - #define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE) -#endif -#define E3_STEP_READ() bool(READ(E3_STEP_PIN)) // E4 Stepper -#ifndef E4_ENABLE_INIT - #define E4_ENABLE_INIT() SET_OUTPUT(E4_ENABLE_PIN) - #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) - #define E4_ENABLE_READ() bool(READ(E4_ENABLE_PIN)) +#if E_STEPPERS > 4 + #ifndef E4_ENABLE_INIT_STATE + #define E4_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif + #ifndef E4_ENABLE_INIT + #define E4_ENABLE_INIT() SET_OUTPUT(E4_ENABLE_PIN) + #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) + #define E4_ENABLE_READ() bool(READ(E4_ENABLE_PIN)) + #endif + #ifndef E4_DIR_INIT + #define E4_DIR_INIT() SET_OUTPUT(E4_DIR_PIN) + #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,INVERT_DIR(E4, STATE)) + #define E4_DIR_READ() INVERT_DIR(E4, bool(READ(E4_DIR_PIN))) + #endif + #define E4_STEP_INIT() SET_OUTPUT(E4_STEP_PIN) + #ifndef E4_STEP_WRITE + #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE) + #endif + #define E4_STEP_READ() bool(READ(E4_STEP_PIN)) #endif -#ifndef E4_DIR_INIT - #define E4_DIR_INIT() SET_OUTPUT(E4_DIR_PIN) - #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,INVERT_DIR(E4, STATE)) - #define E4_DIR_READ() INVERT_DIR(E4, bool(READ(E4_DIR_PIN))) -#endif -#define E4_STEP_INIT() SET_OUTPUT(E4_STEP_PIN) -#ifndef E4_STEP_WRITE - #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE) -#endif -#define E4_STEP_READ() bool(READ(E4_STEP_PIN)) // E5 Stepper -#ifndef E5_ENABLE_INIT - #define E5_ENABLE_INIT() SET_OUTPUT(E5_ENABLE_PIN) - #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE) - #define E5_ENABLE_READ() bool(READ(E5_ENABLE_PIN)) +#if E_STEPPERS > 5 + #ifndef E5_ENABLE_INIT_STATE + #define E5_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif + #ifndef E5_ENABLE_INIT + #define E5_ENABLE_INIT() SET_OUTPUT(E5_ENABLE_PIN) + #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE) + #define E5_ENABLE_READ() bool(READ(E5_ENABLE_PIN)) + #endif + #ifndef E5_DIR_INIT + #define E5_DIR_INIT() SET_OUTPUT(E5_DIR_PIN) + #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,INVERT_DIR(E5, STATE)) + #define E5_DIR_READ() INVERT_DIR(E5, bool(READ(E5_DIR_PIN))) + #endif + #define E5_STEP_INIT() SET_OUTPUT(E5_STEP_PIN) + #ifndef E5_STEP_WRITE + #define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE) + #endif + #define E5_STEP_READ() bool(READ(E5_STEP_PIN)) #endif -#ifndef E5_DIR_INIT - #define E5_DIR_INIT() SET_OUTPUT(E5_DIR_PIN) - #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,INVERT_DIR(E5, STATE)) - #define E5_DIR_READ() INVERT_DIR(E5, bool(READ(E5_DIR_PIN))) -#endif -#define E5_STEP_INIT() SET_OUTPUT(E5_STEP_PIN) -#ifndef E5_STEP_WRITE - #define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE) -#endif -#define E5_STEP_READ() bool(READ(E5_STEP_PIN)) // E6 Stepper -#ifndef E6_ENABLE_INIT - #define E6_ENABLE_INIT() SET_OUTPUT(E6_ENABLE_PIN) - #define E6_ENABLE_WRITE(STATE) WRITE(E6_ENABLE_PIN,STATE) - #define E6_ENABLE_READ() bool(READ(E6_ENABLE_PIN)) +#if E_STEPPERS > 6 + #ifndef E6_ENABLE_INIT_STATE + #define E6_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif + #ifndef E6_ENABLE_INIT + #define E6_ENABLE_INIT() SET_OUTPUT(E6_ENABLE_PIN) + #define E6_ENABLE_WRITE(STATE) WRITE(E6_ENABLE_PIN,STATE) + #define E6_ENABLE_READ() bool(READ(E6_ENABLE_PIN)) + #endif + #ifndef E6_DIR_INIT + #define E6_DIR_INIT() SET_OUTPUT(E6_DIR_PIN) + #define E6_DIR_WRITE(STATE) WRITE(E6_DIR_PIN,INVERT_DIR(E6, STATE)) + #define E6_DIR_READ() INVERT_DIR(E6, bool(READ(E6_DIR_PIN))) + #endif + #define E6_STEP_INIT() SET_OUTPUT(E6_STEP_PIN) + #ifndef E6_STEP_WRITE + #define E6_STEP_WRITE(STATE) WRITE(E6_STEP_PIN,STATE) + #endif + #define E6_STEP_READ() bool(READ(E6_STEP_PIN)) #endif -#ifndef E6_DIR_INIT - #define E6_DIR_INIT() SET_OUTPUT(E6_DIR_PIN) - #define E6_DIR_WRITE(STATE) WRITE(E6_DIR_PIN,INVERT_DIR(E6, STATE)) - #define E6_DIR_READ() INVERT_DIR(E6, bool(READ(E6_DIR_PIN))) -#endif -#define E6_STEP_INIT() SET_OUTPUT(E6_STEP_PIN) -#ifndef E6_STEP_WRITE - #define E6_STEP_WRITE(STATE) WRITE(E6_STEP_PIN,STATE) -#endif -#define E6_STEP_READ() bool(READ(E6_STEP_PIN)) // E7 Stepper -#ifndef E7_ENABLE_INIT - #define E7_ENABLE_INIT() SET_OUTPUT(E7_ENABLE_PIN) - #define E7_ENABLE_WRITE(STATE) WRITE(E7_ENABLE_PIN,STATE) - #define E7_ENABLE_READ() bool(READ(E7_ENABLE_PIN)) +#if E_STEPPERS > 7 + #ifndef E7_ENABLE_INIT_STATE + #define E7_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif + #ifndef E7_ENABLE_INIT + #define E7_ENABLE_INIT() SET_OUTPUT(E7_ENABLE_PIN) + #define E7_ENABLE_WRITE(STATE) WRITE(E7_ENABLE_PIN,STATE) + #define E7_ENABLE_READ() bool(READ(E7_ENABLE_PIN)) + #endif + #ifndef E7_DIR_INIT + #define E7_DIR_INIT() SET_OUTPUT(E7_DIR_PIN) + #define E7_DIR_WRITE(STATE) WRITE(E7_DIR_PIN,INVERT_DIR(E7, STATE)) + #define E7_DIR_READ() INVERT_DIR(E7, bool(READ(E7_DIR_PIN))) + #endif + #define E7_STEP_INIT() SET_OUTPUT(E7_STEP_PIN) + #ifndef E7_STEP_WRITE + #define E7_STEP_WRITE(STATE) WRITE(E7_STEP_PIN,STATE) + #endif + #define E7_STEP_READ() bool(READ(E7_STEP_PIN)) #endif -#ifndef E7_DIR_INIT - #define E7_DIR_INIT() SET_OUTPUT(E7_DIR_PIN) - #define E7_DIR_WRITE(STATE) WRITE(E7_DIR_PIN,INVERT_DIR(E7, STATE)) - #define E7_DIR_READ() INVERT_DIR(E7, bool(READ(E7_DIR_PIN))) -#endif -#define E7_STEP_INIT() SET_OUTPUT(E7_STEP_PIN) -#ifndef E7_STEP_WRITE - #define E7_STEP_WRITE(STATE) WRITE(E7_STEP_PIN,STATE) -#endif -#define E7_STEP_READ() bool(READ(E7_STEP_PIN)) /** * Extruder indirection for the single E axis @@ -810,48 +895,24 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef ENABLE_STEPPER_U - #if HAS_U_ENABLE - #define ENABLE_STEPPER_U() U_ENABLE_WRITE( U_ENABLE_ON) - #else - #define ENABLE_STEPPER_U() NOOP - #endif + #define ENABLE_STEPPER_U() TERN(HAS_U_ENABLE, U_ENABLE_WRITE( U_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_U - #if HAS_U_ENABLE - #define DISABLE_STEPPER_U() U_ENABLE_WRITE(!U_ENABLE_ON) - #else - #define DISABLE_STEPPER_U() NOOP - #endif + #define DISABLE_STEPPER_U() TERN(HAS_U_ENABLE, U_ENABLE_WRITE(!U_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_V - #if HAS_V_ENABLE - #define ENABLE_STEPPER_V() V_ENABLE_WRITE( V_ENABLE_ON) - #else - #define ENABLE_STEPPER_V() NOOP - #endif + #define ENABLE_STEPPER_V() TERN(HAS_V_ENABLE, V_ENABLE_WRITE( V_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_V - #if HAS_V_ENABLE - #define DISABLE_STEPPER_V() V_ENABLE_WRITE(!V_ENABLE_ON) - #else - #define DISABLE_STEPPER_V() NOOP - #endif + #define DISABLE_STEPPER_V() TERN(HAS_V_ENABLE, V_ENABLE_WRITE(!V_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_W - #if HAS_W_ENABLE - #define ENABLE_STEPPER_W() W_ENABLE_WRITE( W_ENABLE_ON) - #else - #define ENABLE_STEPPER_W() NOOP - #endif + #define ENABLE_STEPPER_W() TERN(HAS_W_ENABLE, W_ENABLE_WRITE( W_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_W - #if HAS_W_ENABLE - #define DISABLE_STEPPER_W() W_ENABLE_WRITE(!W_ENABLE_ON) - #else - #define DISABLE_STEPPER_W() NOOP - #endif + #define DISABLE_STEPPER_W() TERN(HAS_W_ENABLE, W_ENABLE_WRITE(!W_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E0 @@ -877,93 +938,45 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef ENABLE_STEPPER_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define ENABLE_STEPPER_E2() E2_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E2() NOOP - #endif + #define ENABLE_STEPPER_E2() TERN(HAS_E2_ENABLE, E2_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define DISABLE_STEPPER_E2() E2_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E2() NOOP - #endif + #define DISABLE_STEPPER_E2() TERN(HAS_E2_ENABLE, E2_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define ENABLE_STEPPER_E3() E3_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E3() NOOP - #endif + #define ENABLE_STEPPER_E3() TERN(HAS_E3_ENABLE, E3_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define DISABLE_STEPPER_E3() E3_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E3() NOOP - #endif + #define DISABLE_STEPPER_E3() TERN(HAS_E3_ENABLE, E3_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define ENABLE_STEPPER_E4() E4_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E4() NOOP - #endif + #define ENABLE_STEPPER_E4() TERN(HAS_E4_ENABLE, E4_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define DISABLE_STEPPER_E4() E4_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E4() NOOP - #endif + #define DISABLE_STEPPER_E4() TERN(HAS_E4_ENABLE, E4_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define ENABLE_STEPPER_E5() E5_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E5() NOOP - #endif + #define ENABLE_STEPPER_E5() TERN(HAS_E5_ENABLE, E5_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define DISABLE_STEPPER_E5() E5_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E5() NOOP - #endif + #define DISABLE_STEPPER_E5() TERN(HAS_E5_ENABLE, E5_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define ENABLE_STEPPER_E6() E6_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E6() NOOP - #endif + #define ENABLE_STEPPER_E6() TERN(HAS_E6_ENABLE, E6_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define DISABLE_STEPPER_E6() E6_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E6() NOOP - #endif + #define DISABLE_STEPPER_E6() TERN(HAS_E6_ENABLE, E6_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define ENABLE_STEPPER_E7() E7_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E7() NOOP - #endif + #define ENABLE_STEPPER_E7() TERN(HAS_E7_ENABLE, E7_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define DISABLE_STEPPER_E7() E7_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E7() NOOP - #endif + #define DISABLE_STEPPER_E7() TERN(HAS_E7_ENABLE, E7_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif // @@ -1077,121 +1090,57 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef ENABLE_AXIS_E0 - #if E_STEPPERS && HAS_E0_ENABLE - #define ENABLE_AXIS_E0() ENABLE_STEPPER_E0() - #else - #define ENABLE_AXIS_E0() NOOP - #endif + #define ENABLE_AXIS_E0() TERN(HAS_E0_ENABLE, ENABLE_STEPPER_E0(), NOOP) #endif #ifndef DISABLE_AXIS_E0 - #if E_STEPPERS && HAS_E0_ENABLE - #define DISABLE_AXIS_E0() DISABLE_STEPPER_E0() - #else - #define DISABLE_AXIS_E0() NOOP - #endif + #define DISABLE_AXIS_E0() TERN(HAS_E0_ENABLE, DISABLE_STEPPER_E0(), NOOP) #endif #ifndef ENABLE_AXIS_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define ENABLE_AXIS_E1() ENABLE_STEPPER_E1() - #else - #define ENABLE_AXIS_E1() NOOP - #endif + #define ENABLE_AXIS_E1() TERN(HAS_E1_ENABLE, ENABLE_STEPPER_E1(), NOOP) #endif #ifndef DISABLE_AXIS_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define DISABLE_AXIS_E1() DISABLE_STEPPER_E1() - #else - #define DISABLE_AXIS_E1() NOOP - #endif + #define DISABLE_AXIS_E1() TERN(HAS_E1_ENABLE, DISABLE_STEPPER_E1(), NOOP) #endif #ifndef ENABLE_AXIS_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define ENABLE_AXIS_E2() ENABLE_STEPPER_E2() - #else - #define ENABLE_AXIS_E2() NOOP - #endif + #define ENABLE_AXIS_E2() TERN(HAS_E2_ENABLE, ENABLE_STEPPER_E2(), NOOP) #endif #ifndef DISABLE_AXIS_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define DISABLE_AXIS_E2() DISABLE_STEPPER_E2() - #else - #define DISABLE_AXIS_E2() NOOP - #endif + #define DISABLE_AXIS_E2() TERN(HAS_E2_ENABLE, DISABLE_STEPPER_E2(), NOOP) #endif #ifndef ENABLE_AXIS_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define ENABLE_AXIS_E3() ENABLE_STEPPER_E3() - #else - #define ENABLE_AXIS_E3() NOOP - #endif + #define ENABLE_AXIS_E3() TERN(HAS_E3_ENABLE, ENABLE_STEPPER_E3(), NOOP) #endif #ifndef DISABLE_AXIS_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define DISABLE_AXIS_E3() DISABLE_STEPPER_E3() - #else - #define DISABLE_AXIS_E3() NOOP - #endif + #define DISABLE_AXIS_E3() TERN(HAS_E3_ENABLE, DISABLE_STEPPER_E3(), NOOP) #endif #ifndef ENABLE_AXIS_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define ENABLE_AXIS_E4() ENABLE_STEPPER_E4() - #else - #define ENABLE_AXIS_E4() NOOP - #endif + #define ENABLE_AXIS_E4() TERN(HAS_E4_ENABLE, ENABLE_STEPPER_E4(), NOOP) #endif #ifndef DISABLE_AXIS_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define DISABLE_AXIS_E4() DISABLE_STEPPER_E4() - #else - #define DISABLE_AXIS_E4() NOOP - #endif + #define DISABLE_AXIS_E4() TERN(HAS_E4_ENABLE, DISABLE_STEPPER_E4(), NOOP) #endif #ifndef ENABLE_AXIS_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define ENABLE_AXIS_E5() ENABLE_STEPPER_E5() - #else - #define ENABLE_AXIS_E5() NOOP - #endif + #define ENABLE_AXIS_E5() TERN(HAS_E5_ENABLE, ENABLE_STEPPER_E5(), NOOP) #endif #ifndef DISABLE_AXIS_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define DISABLE_AXIS_E5() DISABLE_STEPPER_E5() - #else - #define DISABLE_AXIS_E5() NOOP - #endif + #define DISABLE_AXIS_E5() TERN(HAS_E5_ENABLE, DISABLE_STEPPER_E5(), NOOP) #endif #ifndef ENABLE_AXIS_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define ENABLE_AXIS_E6() ENABLE_STEPPER_E6() - #else - #define ENABLE_AXIS_E6() NOOP - #endif + #define ENABLE_AXIS_E6() TERN(HAS_E6_ENABLE, ENABLE_STEPPER_E6(), NOOP) #endif #ifndef DISABLE_AXIS_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define DISABLE_AXIS_E6() DISABLE_STEPPER_E6() - #else - #define DISABLE_AXIS_E6() NOOP - #endif + #define DISABLE_AXIS_E6() TERN(HAS_E6_ENABLE, DISABLE_STEPPER_E6(), NOOP) #endif #ifndef ENABLE_AXIS_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define ENABLE_AXIS_E7() ENABLE_STEPPER_E7() - #else - #define ENABLE_AXIS_E7() NOOP - #endif + #define ENABLE_AXIS_E7() TERN(HAS_E7_ENABLE, ENABLE_STEPPER_E7(), NOOP) #endif #ifndef DISABLE_AXIS_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define DISABLE_AXIS_E7() DISABLE_STEPPER_E7() - #else - #define DISABLE_AXIS_E7() NOOP - #endif + #define DISABLE_AXIS_E7() TERN(HAS_E7_ENABLE, DISABLE_STEPPER_E7(), NOOP) #endif diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index c0fb083d61..3ec8ff4325 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -847,72 +847,28 @@ enum StealthIndex : uint8_t { #endif // TMC5160 void restore_trinamic_drivers() { - #if AXIS_IS_TMC(X) - stepperX.push(); - #endif - #if AXIS_IS_TMC(X2) - stepperX2.push(); - #endif - #if AXIS_IS_TMC(Y) - stepperY.push(); - #endif - #if AXIS_IS_TMC(Y2) - stepperY2.push(); - #endif - #if AXIS_IS_TMC(Z) - stepperZ.push(); - #endif - #if AXIS_IS_TMC(Z2) - stepperZ2.push(); - #endif - #if AXIS_IS_TMC(Z3) - stepperZ3.push(); - #endif - #if AXIS_IS_TMC(Z4) - stepperZ4.push(); - #endif - #if AXIS_IS_TMC(I) - stepperI.push(); - #endif - #if AXIS_IS_TMC(J) - stepperJ.push(); - #endif - #if AXIS_IS_TMC(K) - stepperK.push(); - #endif - #if AXIS_IS_TMC(U) - stepperU.push(); - #endif - #if AXIS_IS_TMC(V) - stepperV.push(); - #endif - #if AXIS_IS_TMC(W) - stepperW.push(); - #endif - #if AXIS_IS_TMC(E0) - stepperE0.push(); - #endif - #if AXIS_IS_TMC(E1) - stepperE1.push(); - #endif - #if AXIS_IS_TMC(E2) - stepperE2.push(); - #endif - #if AXIS_IS_TMC(E3) - stepperE3.push(); - #endif - #if AXIS_IS_TMC(E4) - stepperE4.push(); - #endif - #if AXIS_IS_TMC(E5) - stepperE5.push(); - #endif - #if AXIS_IS_TMC(E6) - stepperE6.push(); - #endif - #if AXIS_IS_TMC(E7) - stepperE7.push(); - #endif + TERN_(X_IS_TRINAMIC, stepperX.push()); + TERN_(X2_IS_TRINAMIC, stepperX2.push()); + TERN_(Y_IS_TRINAMIC, stepperY.push()); + TERN_(Y2_IS_TRINAMIC, stepperY2.push()); + TERN_(Z_IS_TRINAMIC, stepperZ.push()); + TERN_(Z2_IS_TRINAMIC, stepperZ2.push()); + TERN_(Z3_IS_TRINAMIC, stepperZ3.push()); + TERN_(Z4_IS_TRINAMIC, stepperZ4.push()); + TERN_(I_IS_TRINAMIC, stepperI.push()); + TERN_(J_IS_TRINAMIC, stepperJ.push()); + TERN_(K_IS_TRINAMIC, stepperK.push()); + TERN_(U_IS_TRINAMIC, stepperU.push()); + TERN_(V_IS_TRINAMIC, stepperV.push()); + TERN_(W_IS_TRINAMIC, stepperW.push()); + TERN_(E0_IS_TRINAMIC, stepperE0.push()); + TERN_(E1_IS_TRINAMIC, stepperE1.push()); + TERN_(E2_IS_TRINAMIC, stepperE2.push()); + TERN_(E3_IS_TRINAMIC, stepperE3.push()); + TERN_(E4_IS_TRINAMIC, stepperE4.push()); + TERN_(E5_IS_TRINAMIC, stepperE5.push()); + TERN_(E6_IS_TRINAMIC, stepperE6.push()); + TERN_(E7_IS_TRINAMIC, stepperE7.push()); } void reset_trinamic_drivers() { @@ -923,88 +879,44 @@ void reset_trinamic_drivers() { ENABLED(STEALTHCHOP_U), ENABLED(STEALTHCHOP_V), ENABLED(STEALTHCHOP_W) ); - #if AXIS_IS_TMC(X) - TMC_INIT(X, STEALTH_AXIS_X); - #endif - #if AXIS_IS_TMC(X2) - TMC_INIT(X2, STEALTH_AXIS_X); - #endif - #if AXIS_IS_TMC(Y) - TMC_INIT(Y, STEALTH_AXIS_Y); - #endif - #if AXIS_IS_TMC(Y2) - TMC_INIT(Y2, STEALTH_AXIS_Y); - #endif - #if AXIS_IS_TMC(Z) - TMC_INIT(Z, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z2) - TMC_INIT(Z2, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z3) - TMC_INIT(Z3, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z4) - TMC_INIT(Z4, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(I) - TMC_INIT(I, STEALTH_AXIS_I); - #endif - #if AXIS_IS_TMC(J) - TMC_INIT(J, STEALTH_AXIS_J); - #endif - #if AXIS_IS_TMC(K) - TMC_INIT(K, STEALTH_AXIS_K); - #endif - #if AXIS_IS_TMC(U) - TMC_INIT(U, STEALTH_AXIS_U); - #endif - #if AXIS_IS_TMC(V) - TMC_INIT(V, STEALTH_AXIS_V); - #endif - #if AXIS_IS_TMC(W) - TMC_INIT(W, STEALTH_AXIS_W); - #endif - #if AXIS_IS_TMC(E0) - TMC_INIT(E0, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E1) - TMC_INIT(E1, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E2) - TMC_INIT(E2, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E3) - TMC_INIT(E3, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E4) - TMC_INIT(E4, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E5) - TMC_INIT(E5, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E6) - TMC_INIT(E6, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E7) - TMC_INIT(E7, STEALTH_AXIS_E); - #endif + TERN_(X_IS_TRINAMIC, TMC_INIT(X, STEALTH_AXIS_X)); + TERN_(X2_IS_TRINAMIC, TMC_INIT(X2, STEALTH_AXIS_X)); + TERN_(Y_IS_TRINAMIC, TMC_INIT(Y, STEALTH_AXIS_Y)); + TERN_(Y2_IS_TRINAMIC, TMC_INIT(Y2, STEALTH_AXIS_Y)); + TERN_(Z_IS_TRINAMIC, TMC_INIT(Z, STEALTH_AXIS_Z)); + TERN_(Z2_IS_TRINAMIC, TMC_INIT(Z2, STEALTH_AXIS_Z)); + TERN_(Z3_IS_TRINAMIC, TMC_INIT(Z3, STEALTH_AXIS_Z)); + TERN_(Z4_IS_TRINAMIC, TMC_INIT(Z4, STEALTH_AXIS_Z)); + TERN_(I_IS_TRINAMIC, TMC_INIT(I, STEALTH_AXIS_I)); + TERN_(J_IS_TRINAMIC, TMC_INIT(J, STEALTH_AXIS_J)); + TERN_(K_IS_TRINAMIC, TMC_INIT(K, STEALTH_AXIS_K)); + TERN_(U_IS_TRINAMIC, TMC_INIT(U, STEALTH_AXIS_U)); + TERN_(V_IS_TRINAMIC, TMC_INIT(V, STEALTH_AXIS_V)); + TERN_(W_IS_TRINAMIC, TMC_INIT(W, STEALTH_AXIS_W)); + TERN_(E0_IS_TRINAMIC, TMC_INIT(E0, STEALTH_AXIS_E)); + TERN_(E1_IS_TRINAMIC, TMC_INIT(E1, STEALTH_AXIS_E)); + TERN_(E2_IS_TRINAMIC, TMC_INIT(E2, STEALTH_AXIS_E)); + TERN_(E3_IS_TRINAMIC, TMC_INIT(E3, STEALTH_AXIS_E)); + TERN_(E4_IS_TRINAMIC, TMC_INIT(E4, STEALTH_AXIS_E)); + TERN_(E5_IS_TRINAMIC, TMC_INIT(E5, STEALTH_AXIS_E)); + TERN_(E6_IS_TRINAMIC, TMC_INIT(E6, STEALTH_AXIS_E)); + TERN_(E7_IS_TRINAMIC, TMC_INIT(E7, STEALTH_AXIS_E)); #if USE_SENSORLESS - TERN_(X_SENSORLESS, stepperX.homing_threshold(X_STALL_SENSITIVITY)); + TERN_(X_SENSORLESS, stepperX.homing_threshold(X_STALL_SENSITIVITY)); TERN_(X2_SENSORLESS, stepperX2.homing_threshold(X2_STALL_SENSITIVITY)); - TERN_(Y_SENSORLESS, stepperY.homing_threshold(Y_STALL_SENSITIVITY)); + TERN_(Y_SENSORLESS, stepperY.homing_threshold(Y_STALL_SENSITIVITY)); TERN_(Y2_SENSORLESS, stepperY2.homing_threshold(Y2_STALL_SENSITIVITY)); - TERN_(Z_SENSORLESS, stepperZ.homing_threshold(Z_STALL_SENSITIVITY)); + TERN_(Z_SENSORLESS, stepperZ.homing_threshold(Z_STALL_SENSITIVITY)); TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(Z2_STALL_SENSITIVITY)); TERN_(Z3_SENSORLESS, stepperZ3.homing_threshold(Z3_STALL_SENSITIVITY)); TERN_(Z4_SENSORLESS, stepperZ4.homing_threshold(Z4_STALL_SENSITIVITY)); - TERN_(I_SENSORLESS, stepperI.homing_threshold(I_STALL_SENSITIVITY)); - TERN_(J_SENSORLESS, stepperJ.homing_threshold(J_STALL_SENSITIVITY)); - TERN_(K_SENSORLESS, stepperK.homing_threshold(K_STALL_SENSITIVITY)); - TERN_(U_SENSORLESS, stepperU.homing_threshold(U_STALL_SENSITIVITY)); - TERN_(V_SENSORLESS, stepperV.homing_threshold(V_STALL_SENSITIVITY)); - TERN_(W_SENSORLESS, stepperW.homing_threshold(W_STALL_SENSITIVITY)); + TERN_(I_SENSORLESS, stepperI.homing_threshold(I_STALL_SENSITIVITY)); + TERN_(J_SENSORLESS, stepperJ.homing_threshold(J_STALL_SENSITIVITY)); + TERN_(K_SENSORLESS, stepperK.homing_threshold(K_STALL_SENSITIVITY)); + TERN_(U_SENSORLESS, stepperU.homing_threshold(U_STALL_SENSITIVITY)); + TERN_(V_SENSORLESS, stepperV.homing_threshold(V_STALL_SENSITIVITY)); + TERN_(W_SENSORLESS, stepperW.homing_threshold(W_STALL_SENSITIVITY)); #endif #ifdef TMC_ADV diff --git a/Marlin/src/module/stepper/trinamic.h b/Marlin/src/module/stepper/trinamic.h index bf7eaf7f95..0fd48f18cb 100644 --- a/Marlin/src/module/stepper/trinamic.h +++ b/Marlin/src/module/stepper/trinamic.h @@ -116,7 +116,7 @@ void restore_trinamic_drivers(); void reset_trinamic_drivers(); // X Stepper -#if AXIS_IS_TMC(X) +#if X_IS_TRINAMIC extern TMC_CLASS(X, X) stepperX; static constexpr chopper_timing_t chopper_timing_X = CHOPPER_TIMING_X; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -130,7 +130,7 @@ void reset_trinamic_drivers(); #endif // Y Stepper -#if AXIS_IS_TMC(Y) +#if Y_IS_TRINAMIC extern TMC_CLASS(Y, Y) stepperY; static constexpr chopper_timing_t chopper_timing_Y = CHOPPER_TIMING_Y; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -144,7 +144,7 @@ void reset_trinamic_drivers(); #endif // Z Stepper -#if AXIS_IS_TMC(Z) +#if Z_IS_TRINAMIC extern TMC_CLASS(Z, Z) stepperZ; static constexpr chopper_timing_t chopper_timing_Z = CHOPPER_TIMING_Z; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -158,7 +158,7 @@ void reset_trinamic_drivers(); #endif // X2 Stepper -#if HAS_X2_ENABLE && AXIS_IS_TMC(X2) +#if X2_IS_TRINAMIC extern TMC_CLASS(X2, X) stepperX2; #ifndef CHOPPER_TIMING_X2 #define CHOPPER_TIMING_X2 CHOPPER_TIMING_X @@ -175,7 +175,7 @@ void reset_trinamic_drivers(); #endif // Y2 Stepper -#if HAS_Y2_ENABLE && AXIS_IS_TMC(Y2) +#if Y2_IS_TRINAMIC extern TMC_CLASS(Y2, Y) stepperY2; #ifndef CHOPPER_TIMING_Y2 #define CHOPPER_TIMING_Y2 CHOPPER_TIMING_Y @@ -192,7 +192,7 @@ void reset_trinamic_drivers(); #endif // Z2 Stepper -#if HAS_Z2_ENABLE && AXIS_IS_TMC(Z2) +#if Z2_IS_TRINAMIC extern TMC_CLASS(Z2, Z) stepperZ2; #ifndef CHOPPER_TIMING_Z2 #define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z @@ -209,7 +209,7 @@ void reset_trinamic_drivers(); #endif // Z3 Stepper -#if HAS_Z3_ENABLE && AXIS_IS_TMC(Z3) +#if Z3_IS_TRINAMIC extern TMC_CLASS(Z3, Z) stepperZ3; #ifndef CHOPPER_TIMING_Z3 #define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z @@ -226,7 +226,7 @@ void reset_trinamic_drivers(); #endif // Z4 Stepper -#if HAS_Z4_ENABLE && AXIS_IS_TMC(Z4) +#if Z4_IS_TRINAMIC extern TMC_CLASS(Z4, Z) stepperZ4; #ifndef CHOPPER_TIMING_Z4 #define CHOPPER_TIMING_Z4 CHOPPER_TIMING_Z @@ -243,7 +243,7 @@ void reset_trinamic_drivers(); #endif // I Stepper -#if AXIS_IS_TMC(I) +#if I_IS_TRINAMIC extern TMC_CLASS(I, I) stepperI; static constexpr chopper_timing_t chopper_timing_I = CHOPPER_TIMING_I; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -257,7 +257,7 @@ void reset_trinamic_drivers(); #endif // J Stepper -#if AXIS_IS_TMC(J) +#if J_IS_TRINAMIC extern TMC_CLASS(J, J) stepperJ; static constexpr chopper_timing_t chopper_timing_J = CHOPPER_TIMING_J; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -271,7 +271,7 @@ void reset_trinamic_drivers(); #endif // K Stepper -#if AXIS_IS_TMC(K) +#if K_IS_TRINAMIC extern TMC_CLASS(K, K) stepperK; static constexpr chopper_timing_t chopper_timing_K = CHOPPER_TIMING_K; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -285,7 +285,7 @@ void reset_trinamic_drivers(); #endif // U Stepper -#if AXIS_IS_TMC(U) +#if U_IS_TRINAMIC extern TMC_CLASS(U, U) stepperU; static constexpr chopper_timing_t chopper_timing_U = CHOPPER_TIMING_U; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -299,7 +299,7 @@ void reset_trinamic_drivers(); #endif // V Stepper -#if AXIS_IS_TMC(V) +#if V_IS_TRINAMIC extern TMC_CLASS(V, V) stepperV; static constexpr chopper_timing_t chopper_timing_V = CHOPPER_TIMING_V; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -313,7 +313,7 @@ void reset_trinamic_drivers(); #endif // W Stepper -#if AXIS_IS_TMC(W) +#if W_IS_TRINAMIC extern TMC_CLASS(W, W) stepperW; static constexpr chopper_timing_t chopper_timing_W = CHOPPER_TIMING_W; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -327,7 +327,7 @@ void reset_trinamic_drivers(); #endif // E0 Stepper -#if AXIS_IS_TMC(E0) +#if E0_IS_TRINAMIC extern TMC_CLASS_E(0) stepperE0; #ifndef CHOPPER_TIMING_E0 #define CHOPPER_TIMING_E0 CHOPPER_TIMING_E @@ -344,7 +344,7 @@ void reset_trinamic_drivers(); #endif // E1 Stepper -#if AXIS_IS_TMC(E1) +#if E1_IS_TRINAMIC extern TMC_CLASS_E(1) stepperE1; #ifndef CHOPPER_TIMING_E1 #define CHOPPER_TIMING_E1 CHOPPER_TIMING_E @@ -361,7 +361,7 @@ void reset_trinamic_drivers(); #endif // E2 Stepper -#if AXIS_IS_TMC(E2) +#if E2_IS_TRINAMIC extern TMC_CLASS_E(2) stepperE2; #ifndef CHOPPER_TIMING_E2 #define CHOPPER_TIMING_E2 CHOPPER_TIMING_E @@ -378,7 +378,7 @@ void reset_trinamic_drivers(); #endif // E3 Stepper -#if AXIS_IS_TMC(E3) +#if E3_IS_TRINAMIC extern TMC_CLASS_E(3) stepperE3; #ifndef CHOPPER_TIMING_E3 #define CHOPPER_TIMING_E3 CHOPPER_TIMING_E @@ -395,7 +395,7 @@ void reset_trinamic_drivers(); #endif // E4 Stepper -#if AXIS_IS_TMC(E4) +#if E4_IS_TRINAMIC extern TMC_CLASS_E(4) stepperE4; #ifndef CHOPPER_TIMING_E4 #define CHOPPER_TIMING_E4 CHOPPER_TIMING_E @@ -412,7 +412,7 @@ void reset_trinamic_drivers(); #endif // E5 Stepper -#if AXIS_IS_TMC(E5) +#if E5_IS_TRINAMIC extern TMC_CLASS_E(5) stepperE5; #ifndef CHOPPER_TIMING_E5 #define CHOPPER_TIMING_E5 CHOPPER_TIMING_E @@ -429,7 +429,7 @@ void reset_trinamic_drivers(); #endif // E6 Stepper -#if AXIS_IS_TMC(E6) +#if E6_IS_TRINAMIC extern TMC_CLASS_E(6) stepperE6; #ifndef CHOPPER_TIMING_E6 #define CHOPPER_TIMING_E6 CHOPPER_TIMING_E @@ -446,7 +446,7 @@ void reset_trinamic_drivers(); #endif // E7 Stepper -#if AXIS_IS_TMC(E7) +#if E7_IS_TRINAMIC extern TMC_CLASS_E(7) stepperE7; #ifndef CHOPPER_TIMING_E7 #define CHOPPER_TIMING_E7 CHOPPER_TIMING_E diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 217405eae6..5c9f122067 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -823,7 +823,7 @@ volatile bool Temperature::raw_temps_ready = false; ONHEATING(start_temp, current_temp, target); #endif - if (heating && current_temp > target && ELAPSED(ms, t2 + 5000UL)) { + if (heating && current_temp > target && ELAPSED(ms, t2, 5000UL)) { heating = false; SHV((bias - d) >> 1); t1 = ms; @@ -831,7 +831,7 @@ volatile bool Temperature::raw_temps_ready = false; maxT = target; } - if (!heating && current_temp < target && ELAPSED(ms, t1 + 5000UL)) { + if (!heating && current_temp < target && ELAPSED(ms, t1, 5000UL)) { heating = true; t2 = ms; t_low = t2 - t1; @@ -1755,7 +1755,7 @@ void Temperature::mintemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_T float ambient_xfer_coeff = mpc.ambient_xfer_coeff_fan0; #if ENABLED(MPC_INCLUDE_FAN) const uint8_t fan_index = TERN(SINGLEFAN, 0, ee); - const float fan_fraction = TERN_(MPC_FAN_0_ACTIVE_HOTEND, !this_hotend ? 0.0f : ) fan_speed[fan_index] * RECIPROCAL(255); + const float fan_fraction = TERN_(MPC_FAN_0_ACTIVE_HOTEND, !this_hotend ? 0.0f :) fan_speed[fan_index] * RECIPROCAL(255); ambient_xfer_coeff += fan_fraction * mpc.fan255_adjustment; #endif @@ -3589,7 +3589,7 @@ void Temperature::disable_all_heaters() { #define THERMO_SEL(A,B,C) (hindex > 1 ? (C) : hindex == 1 ? (B) : (A)) #define MAXTC_CS_WRITE(V) do{ switch (hindex) { case 1: WRITE(TEMP_1_CS_PIN, V); break; case 2: WRITE(TEMP_2_CS_PIN, V); break; default: WRITE(TEMP_0_CS_PIN, V); } }while(0) #elif MAX_TC_COUNT > 1 - #define THERMO_SEL(A,B,C) ( hindex == 1 ? (B) : (A)) + #define THERMO_SEL(A,B,C) (hindex == 1 ? (B) : (A)) #define MAXTC_CS_WRITE(V) do{ switch (hindex) { case 1: WRITE(TEMP_1_CS_PIN, V); break; default: WRITE(TEMP_0_CS_PIN, V); } }while(0) #endif #else @@ -4283,10 +4283,15 @@ void Temperature::isr() { #endif // SLOW_PWM_HEATERS // - // Update lcd buttons 488 times per second + // Update lcd buttons at ~488Hz or ~976Hz // - static bool do_buttons; - if ((do_buttons ^= true)) ui.update_buttons(); + #if ENABLED(FAST_BUTTON_POLLING) + constexpr bool do_buttons = true; + #else + static bool do_buttons; + do_buttons ^= true; + #endif + if (do_buttons) ui.update_buttons(); /** * One sensor is sampled on every other call of the ISR. @@ -4666,7 +4671,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_RESIDENCY_TIME))) + #define TEMP_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_CONDITIONS (wants_to_cool ? isCoolingHotend(target_extruder) : isHeatingHotend(target_extruder)) @@ -4808,7 +4813,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_BED_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_BED_RESIDENCY_TIME))) + #define TEMP_BED_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_BED_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_BED_CONDITIONS (wants_to_cool ? isCoolingBed() : isHeatingBed()) @@ -5008,7 +5013,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_CHAMBER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME))) + #define TEMP_CHAMBER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_CHAMBER_CONDITIONS (wants_to_cool ? isCoolingChamber() : isHeatingChamber()) @@ -5108,7 +5113,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_COOLER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME))) + #define TEMP_COOLER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_COOLER_CONDITIONS (wants_to_cool ? isLaserHeating() : isLaserCooling()) diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 27e28f07a8..77c16bba0a 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -173,7 +173,7 @@ typedef struct { float p, i, d, c, f; } raw_pidcf_t; struct PID_t { protected: bool pid_reset = true; - float temp_iState = 0.0f, temp_dState = 0.0f; + float temp_dState = 0; float work_p = 0, work_i = 0, work_d = 0; public: @@ -217,17 +217,14 @@ typedef struct { float p, i, d, c, f; } raw_pidcf_t; } else { if (pid_reset) { + work_i = 0; + work_d = 0; pid_reset = false; - temp_iState = 0.0; - work_d = 0.0; } - const float max_power_over_i_gain = float(MAX_POW) / Ki - float(MIN_POW); - temp_iState = constrain(temp_iState + pid_error, 0, max_power_over_i_gain); - work_p = Kp * pid_error; - work_i = Ki * temp_iState; - work_d = work_d + PID_K2 * (Kd * (temp_dState - current) - work_d); + work_i = constrain(work_i + Ki * pid_error, 0, float(MAX_POW - MIN_POW)); + work_d += (Kd * (temp_dState - current) - work_d) * PID_K2; output_pow = constrain(work_p + work_i + work_d + float(MIN_POW), 0, MAX_POW); } @@ -1334,10 +1331,6 @@ class Temperature { static void set_heating_message(const uint8_t, const bool=false) {} #endif - #if HAS_MARLINUI_MENU && HAS_TEMPERATURE && HAS_PREHEAT - static void lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb); - #endif - private: // Reading raw temperatures and converting to Celsius when ready diff --git a/Marlin/src/module/thermistor/thermistor_666.h b/Marlin/src/module/thermistor/thermistor_666.h index 14a03c23b5..1b3a3a4615 100644 --- a/Marlin/src/module/thermistor/thermistor_666.h +++ b/Marlin/src/module/thermistor/thermistor_666.h @@ -42,7 +42,7 @@ constexpr temp_entry_t temptable_666[] PROGMEM = { { OV( 86), 176 }, { OV(103), 166 }, { OV(120), 157 }, - { OV(137) ,150 }, + { OV(137), 150 }, { OV(154), 144 }, { OV(172), 138 }, { OV(189), 134 }, diff --git a/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h b/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h index 7cbaa96088..cffb7f3cb4 100644 --- a/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h +++ b/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h @@ -130,7 +130,6 @@ // #if ANY(EDUTRONICS_12864OLED_SH1106, EDUTRONICS_12864OLED_SSD1306) - #define LCDSCREEN_NAME "EDUTRONICS 12864 OLED" #define BTN_EN2 1 #define BTN_EN1 3 #define BTN_ENC 0 diff --git a/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h b/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h index 6b5411e09d..11f18f4496 100644 --- a/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h +++ b/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h @@ -115,10 +115,21 @@ //#define CONTROLLER_FAN_PIN 148 // FAN2 //#define E0_AUTO_FAN_PIN 148 // FAN2 -// -// ADC Reference Voltage -// -#define ADC_REFERENCE_VOLTAGE 2.565 // 2.5V reference VDDA +/** + * ADC Reference Voltage + * + * In some boards the voltage reference is a bit off due to low quality + * components. That is enough to throw off the ADC readings and thus the + * temperatures by more than 10°C in some cases. If you experience that + * problem, measure the reference voltage (VDDA) at the 2nd pin of + * TH1/TH2 (with the sensors disconnected) and set ADC_REFERENCE_VOLTAGE + * in your config. + */ + +#ifndef ADC_REFERENCE_VOLTAGE + #define EMIT_ADC_REFERENCE_VOLTAGE_WARNING + #define ADC_REFERENCE_VOLTAGE 2.565 +#endif /** * ------ ------ diff --git a/Marlin/src/pins/gd32f1/pins_AQUILA_101_GD32_MFL.h b/Marlin/src/pins/gd32f1/pins_AQUILA_101_GD32_MFL.h new file mode 100644 index 0000000000..f3bc9378e9 --- /dev/null +++ b/Marlin/src/pins/gd32f1/pins_AQUILA_101_GD32_MFL.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +/** + * Aquila v1.0.1 GD32 MFL (GD32F103RC) board pin assignments + */ + +#define ALLOW_GD32F1 + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Aquila v1.0.1 GD32 MFL" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME "Aquila" +#endif + +#include "../stm32f1/pins_CREALITY_V4.h" diff --git a/Marlin/src/pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h b/Marlin/src/pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h new file mode 100644 index 0000000000..70b171eef9 --- /dev/null +++ b/Marlin/src/pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 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 . + * + */ +#pragma once + +/** + * Creality MFL GD32 V4.2.2 (GD32F303RE) board pin assignments + */ + +#define ALLOW_GD32F3 + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Creality V4.2.2 MFL" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME "Ender-3 MFL" +#endif + +#include "../stm32f1/pins_CREALITY_V4.h" diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h index 38e6617f51..4b454f2968 100644 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -22,7 +22,7 @@ #pragma once /** - * Geeetech HJC2560-C Rev 2.x board pin assignments + * Geeetech HJC2560-C Rev 1.x and 2.x board pin assignments * ATmega2560 */ @@ -78,6 +78,13 @@ #endif #define DEFAULT_PWM_MOTOR_CURRENT { 1300, 1300, 1250 } +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 24 // Filament runout +#endif + // // Temperature Sensors // @@ -138,9 +145,6 @@ //#ifndef LCD_CONTRAST_PIN // #define LCD_CONTRAST_PIN 5 // LCD_Contrast //#endif - #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 24 // Filament runout - #endif #else #define LCD_PINS_D5 21 #define LCD_PINS_D6 5 diff --git a/Marlin/src/pins/native/pins_RAMPS_NATIVE.h b/Marlin/src/pins/native/pins_RAMPS_NATIVE.h index ffc716a502..b27b9c7b49 100644 --- a/Marlin/src/pins/native/pins_RAMPS_NATIVE.h +++ b/Marlin/src/pins/native/pins_RAMPS_NATIVE.h @@ -730,5 +730,5 @@ #endif // HAS_WIRED_LCD #ifndef KILL_PIN - #define KILL_PIN EXP2_08_PIN + #define KILL_PIN 11 #endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 01ff13f8c2..dcb8415de8 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -964,6 +964,20 @@ #elif MB(CREALITY_ENDER2P_V24S4) #include "hc32f4/pins_CREALITY_ENDER2P_V24S4.h" // HC32F460 env:HC32F460C_e2p24s4 +// +// GD32 ARM Cortex-M3 +// + +#elif MB(AQUILA_V101_GD32_MFL) + #include "gd32f1/pins_AQUILA_101_GD32_MFL.h" // GD32F103RC env:GD32F103RC_aquila_mfl + +// +// GD32 ARM Cortex-M4 +// + +#elif MB(CREALITY_V422_GD32_MFL) + #include "gd32f3/pins_CREALITY_V422_GD32_MFL.h" // GD32F303RE env:GD32F303RE_creality_mfl + // // Raspberry Pi RP2040 // @@ -985,7 +999,7 @@ // #elif MB(SIMULATED) - #include "native/pins_RAMPS_NATIVE.h" // Native or Simulation lin:linux_native mac:simulator_macos_debug mac:simulator_macos_release win:simulator_windows lin:simulator_linux_debug lin:simulator_linux_release + #include "native/pins_RAMPS_NATIVE.h" // Native or Simulation lin:linux_native lin:simulator_linux_debug lin:simulator_linux_release lin:linux_native_test mac:simulator_macos_debug mac:simulator_macos_release win:simulator_windows #else diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index e93f232545..ad17fe2436 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -27,6 +27,8 @@ #if TARGET_LPC1768 #define ANALOG_OK(PN) (WITHIN(PN, P0_02, P0_03) || WITHIN(PN, P0_23, P0_26) || WITHIN(PN, P1_30, P1_31)) +#elif ARDUINO_ARCH_MFL + #define ANALOG_OK(PN) (WITHIN(PN, 0, 7) || WITHIN(PN, 16, 17) || WITHIN(PN, 32, 37)) #else #define ANALOG_OK(PN) WITHIN(PN, 0, NUM_ANALOG_INPUTS - 1) #endif @@ -1117,7 +1119,7 @@ #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_XY_PIN) #endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) +#if HAS_MOTOR_CURRENT_PWM_Z REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_Z_PIN) #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_I) diff --git a/Marlin/src/pins/ramps/pins_DAGOMA_D6.h b/Marlin/src/pins/ramps/pins_DAGOMA_D6.h index f44657d2b5..99b04070d8 100644 --- a/Marlin/src/pins/ramps/pins_DAGOMA_D6.h +++ b/Marlin/src/pins/ramps/pins_DAGOMA_D6.h @@ -55,15 +55,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 0 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 250 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 250 - #endif + #define BOARD_ST7920_DELAY_1 0 + #define BOARD_ST7920_DELAY_2 250 + #define BOARD_ST7920_DELAY_3 250 #endif #define KILL_PIN -1 // NC diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index e033cfd060..8237c7e227 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -486,15 +486,15 @@ #endif // -// AUX1 5V GND D2 D1 +// AUX1 5V GND D1 D0 // 2 4 6 8 // 1 3 5 7 // 5V GND A3 A4 // #define AUX1_05 57 // (A3) -#define AUX1_06 2 +#define AUX1_06 1 // TX0 #define AUX1_07 58 // (A4) -#define AUX1_08 1 +#define AUX1_08 0 // RX0 // // AUX2 GND A9 D40 D42 A11 diff --git a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h index 448c79a8d2..4633bfc037 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h @@ -89,6 +89,16 @@ #endif #define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250} +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 54 // ADC0 +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN 55 // ADC1 +#endif + // // Temperature Sensors // diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V53.h b/Marlin/src/pins/ramps/pins_ZRIB_V53.h index 22b806a2b6..2b99921909 100644 --- a/Marlin/src/pins/ramps/pins_ZRIB_V53.h +++ b/Marlin/src/pins/ramps/pins_ZRIB_V53.h @@ -334,7 +334,6 @@ // #if ENABLED(ZONESTAR_12864LCD) - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_SDSS_PIN 16 #define LCD_PINS_RS 16 // ST7920 CS (LCD-4) #define LCD_PINS_EN 23 // ST7920 DAT LCD-R/W (LCD-5) @@ -345,7 +344,6 @@ #define BEEPER_PIN 37 #define KILL_PIN 35 #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCDSCREEN_NAME "Reprap LCD12864" // Use EXP1 & EXP2 connector #define LCD_PINS_RS 16 // ST7920 CS #define LCD_PINS_EN 17 // ST7920 DAT @@ -362,7 +360,6 @@ //================================================================================ #if ANY(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) - #define LCDSCREEN_NAME "ZONESTAR 12864OLED" #define LCD_SDSS_PIN 16 #define LCD_PINS_RS 23 // RESET Pull low for 1s to init #define LCD_PINS_DC 17 @@ -386,7 +383,6 @@ //================================================================================ #if ENABLED(ZONESTAR_LCD) - #define LCDSCREEN_NAME "LCD2004 ADCKEY" #define LCD_PINS_RS EXP1_04_PIN #define LCD_PINS_EN EXP1_03_PIN #define LCD_PINS_D4 EXP1_05_PIN diff --git a/Marlin/src/pins/rp2040/pins_RP2040.h b/Marlin/src/pins/rp2040/pins_RP2040.h index 1b88ce347b..6a4e54f0bd 100644 --- a/Marlin/src/pins/rp2040/pins_RP2040.h +++ b/Marlin/src/pins/rp2040/pins_RP2040.h @@ -293,7 +293,7 @@ #define SPI_FLASH_SCK_PIN SD_SCK_PIN #endif - #define TFT_BUFFER_SIZE 0xFFFF + #define TFT_BUFFER_WORDS 0xFFFF #ifndef TFT_DRIVER #define TFT_DRIVER ST7796 #endif @@ -320,13 +320,13 @@ #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_EN 51 // SID (MOSI) #define LCD_PINS_D4 52 // SCK (CLK) clock #elif ALL(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS 40 - #define LCD_PINS_ENABLE 42 + #define LCD_PINS_EN 42 #define LCD_PINS_D4 65 #define LCD_PINS_D5 66 #define LCD_PINS_D6 44 @@ -337,7 +337,7 @@ #if ENABLED(CR10_STOCKDISPLAY) #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 29 + #define LCD_PINS_EN 29 #define LCD_PINS_D4 25 #if !IS_NEWPANEL @@ -347,7 +347,7 @@ #elif ENABLED(ZONESTAR_LCD) #define LCD_PINS_RS 64 - #define LCD_PINS_ENABLE 44 + #define LCD_PINS_EN 44 #define LCD_PINS_D4 63 #define LCD_PINS_D5 40 #define LCD_PINS_D6 42 @@ -365,7 +365,7 @@ #define DOGLCD_A0 LCD_PINS_DC #else #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 + #define LCD_PINS_EN 17 #define LCD_PINS_D4 23 #define LCD_PINS_D5 25 #define LCD_PINS_D6 27 diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h index 6f6182a684..5e9df26fdd 100644 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -92,7 +92,7 @@ #define MICROSTEP32 HIGH,HIGH,LOW #endif -//#define MOTOR_FAULT_PIN 22 // PB26 , motor X-Y-Z-E0 motor FAULT +//#define MOTOR_FAULT_PIN 22 // PB26, motor X-Y-Z-E0 motor FAULT // // Temperature Sensors diff --git a/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h b/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h index 7e145ccc0e..98ec48de80 100644 --- a/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h +++ b/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h @@ -36,7 +36,7 @@ #endif #ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "BRICOLEMON LITE V1.0" // , Lemoncrest & BricoGeek collaboration. + #define BOARD_INFO_NAME "BRICOLEMON LITE V1.0" // Lemoncrest & BricoGeek collaboration. #endif /** diff --git a/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h b/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h index c00caa73a4..37f0b79f6b 100644 --- a/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h +++ b/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h @@ -30,7 +30,7 @@ #endif #ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "BRICOLEMON V1.0" // , Lemoncrest & BricoGeek collaboration. + #define BOARD_INFO_NAME "BRICOLEMON V1.0" // Lemoncrest & BricoGeek collaboration. #endif /** diff --git a/Marlin/src/pins/samd/pins_MINITRONICS20.h b/Marlin/src/pins/samd/pins_MINITRONICS20.h index 83206e3bc6..0f61aea713 100644 --- a/Marlin/src/pins/samd/pins_MINITRONICS20.h +++ b/Marlin/src/pins/samd/pins_MINITRONICS20.h @@ -128,7 +128,7 @@ #endif // Verify that drivers match the hardware -#if (HAS_X_AXIS && !AXIS_DRIVER_TYPE_X(DRV8825)) || (HAS_Y_AXIS && !AXIS_DRIVER_TYPE_Y(DRV8825)) || (HAS_Z_AXIS && !AXIS_DRIVER_TYPE_Z(DRV8825)) || (HAS_EXTRUDER && !AXIS_DRIVER_TYPE_E0(DRV8825)) +#if (HAS_X_AXIS && !AXIS_DRIVER_TYPE_X(DRV8825)) || (HAS_Y_AXIS && !AXIS_DRIVER_TYPE_Y(DRV8825)) || (HAS_Z_AXIS && !AXIS_DRIVER_TYPE_Z(DRV8825)) || (HAS_EXTRUDERS && !AXIS_DRIVER_TYPE_E0(DRV8825)) #error "Minitronics v2.0 has hard-wired DRV8825 drivers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index b583c17b31..0446f99dd3 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -189,7 +189,6 @@ // // LCD 128x64 // - #define LCDSCREEN_NAME "ZONESTAR_12864LCD" #define FORCE_SOFT_SPI //#define LCD_SDSS_PIN EXP1_03_PIN #define LCD_PINS_RS EXP1_03_PIN // ST7920 CS (LCD-4) @@ -204,7 +203,6 @@ // // OLED 128x64 // - #define LCDSCREEN_NAME "ZONESTAR 12864OLED" #define FORCE_SOFT_SPI #define LCD_PINS_RS EXP1_06_PIN #define LCD_PINS_DC EXP1_04_PIN diff --git a/Marlin/src/pins/stm32f1/env_validate.h b/Marlin/src/pins/stm32f1/env_validate.h index 47399a062d..e219e7cd51 100644 --- a/Marlin/src/pins/stm32f1/env_validate.h +++ b/Marlin/src/pins/stm32f1/env_validate.h @@ -23,13 +23,19 @@ #define ENV_VALIDATE_H #if NOT_TARGET(__STM32F1__, STM32F1) - #if DISABLED(ALLOW_STM32F4) + #if NONE(ALLOW_STM32F4, ALLOW_GD32F3, ALLOW_GD32F1) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" - #elif NOT_TARGET(STM32F4) + #elif ENABLED(ALLOW_STM32F4) && NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" + #elif ENABLED(ALLOW_GD32F3) && NOT_TARGET(ARDUINO_ARCH_MFL) + #error "Oops! Make sure you have a GD32F3 MFL environment selected." + #elif ENABLED(ALLOW_GD32F1) && NOT_TARGET(ARDUINO_ARCH_MFL) + #error "Oops! Make sure you have a GD32F1 MFL environment selected." #endif #endif #undef ALLOW_STM32F4 +#undef ALLOW_GD32F3 +#undef ALLOW_GD32F1 #endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index 54a8ae104b..9c7c8148cb 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -300,8 +300,14 @@ #define LCD_BACKLIGHT_PIN -1 #define FORCE_SOFT_SPI + #elif ENABLED(ULTI_CONTROLLER) + + #define LCD_PINS_D6 EXP1_03_PIN + #define DOGLCD_SCL_PIN EXP1_07_PIN // I2C1 + #define DOGLCD_SDA_PIN EXP1_08_PIN // I2C1 + #else - #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, FYSETC_MINI_12864_2_1 and MKS_LCD12864A/B are currently supported on the SKR E3 DIP." + #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, ULTI_CONTROLLER, MKS_MINI_12864, FYSETC_MINI_12864_2_1 and MKS_LCD12864A/B are currently supported on the SKR E3 DIP." #endif #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index 0364517e24..a2b0f2a99d 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -166,7 +166,7 @@ #define DOGLCD_SCK EXP1_06_PIN #define DOGLCD_MOSI EXP1_08_PIN - #if ANY(FYSETC_MINI_12864, U8GLIB_ST7920) + #if ANY(FYSETC_MINI_12864, IS_U8GLIB_ST7920) #define FORCE_SOFT_SPI #endif //#define LCD_SCREEN_ROTATE 180 // 0, 90, 180, 270 diff --git a/Marlin/src/pins/stm32f1/pins_MD_D301.h b/Marlin/src/pins/stm32f1/pins_MD_D301.h index 3cd7dffed3..629d22c83f 100644 --- a/Marlin/src/pins/stm32f1/pins_MD_D301.h +++ b/Marlin/src/pins/stm32f1/pins_MD_D301.h @@ -49,11 +49,6 @@ // #define SERVO0_PIN PB0 -// -// Z Probe must be this pin -// -#define Z_MIN_PROBE_PIN PB1 - // // Limit Switches // @@ -61,13 +56,20 @@ #define X_MAX_PIN PF11 #define Y_MIN_PIN PF14 #define Y_MAX_PIN PF13 -#ifdef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN - #define Z_MIN_PIN PB1 -#else - #define Z_MIN_PIN PG0 -#endif +#define Z_MIN_PIN PG0 #define Z_MAX_PIN PF15 +// +// Z Probe must be this pin +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PB1 +#endif + +#if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #error "It's physically impossible to connect the Z Probe to the Z Min Endstop pin on this board." +#endif + // // Filament Sensor // diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h index ecea985494..86cbf5c677 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h @@ -192,7 +192,6 @@ // 2 +5V // 1 GND - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_PINS_RS EXP1_03_PIN #define LCD_PINS_EN EXP1_06_PIN #define LCD_PINS_D4 EXP1_04_PIN @@ -220,7 +219,6 @@ // 3 RX3 PB11 KNOB_ENB #define FORCE_SOFT_SPI - #define LCDSCREEN_NAME "ZONESTAR 12864OLED" #define LCD_PINS_RS EXP1_06_PIN // = LCD_RESET_PIN #define LCD_PINS_DC EXP1_04_PIN // DC #define DOGLCD_CS EXP1_03_PIN // CS diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h index 069086a43b..009d1f897c 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h @@ -280,7 +280,6 @@ // #if ENABLED(ZONESTAR_12864LCD) - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_PINS_RS EXP1_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP1_06_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP1_04_PIN // 8 SCK make sure for zonestar zm3e4! @@ -290,7 +289,6 @@ #define BTN_EN2 EXP1_08_PIN #define BTN_ENC EXP1_07_PIN #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCDSCREEN_NAME "REPRAPDISCOUNT LCD12864" #define LCD_PINS_RS EXP1_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP1_04_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP1_06_PIN // 8 SCK make sure for zonestar zm3e4! @@ -301,7 +299,6 @@ #define BTN_ENC EXP1_01_PIN #elif ENABLED(ZONESTAR_DWIN_LCD) // Connect to EXP2 connector - #define LCDSCREEN_NAME "ZONESTAR DWIN LCD" #define BEEPER_PIN EXP2_05_PIN #define KILL_PIN PC0 #define BTN_EN1 EXP2_08_PIN @@ -310,7 +307,6 @@ #endif #if ENABLED(ZONESTAR_LCD2004_KNOB) - #define LCDSCREEN_NAME "LCD2004 KNOB" #define LCD_PINS_RS EXP1_03_PIN #define LCD_PINS_EN EXP1_04_PIN #define LCD_PINS_D4 EXP1_06_PIN @@ -323,7 +319,6 @@ #define BEEPER_PIN EXP1_02_PIN #define KILL_PIN EXP2_07_PIN #elif ENABLED(ZONESTAR_LCD2004_ADCKEY) - #define LCDSCREEN_NAME "LCD2004 5KEY" #define LCD_PINS_RS EXP1_03_PIN #define LCD_PINS_EN EXP1_04_PIN #define LCD_PINS_D4 EXP1_06_PIN diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h index 66e538cb48..833c3427c1 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h @@ -276,7 +276,6 @@ #define WIFI_EN PC14 #if ENABLED(ZONESTAR_12864LCD) - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_PINS_RS EXP1_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP1_06_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP1_04_PIN // 8 SCK make sure for zonestar zm3e4! @@ -286,7 +285,6 @@ #define BTN_EN2 EXP1_08_PIN #define BTN_ENC EXP1_07_PIN #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCDSCREEN_NAME "REPRAPDISCOUNT LCD12864" #define LCD_PINS_RS EXP2_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP2_06_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP2_04_PIN // 8 SCK make sure for zonestar zm3e4! @@ -297,7 +295,6 @@ #define BTN_ENC EXP2_07_PIN #elif ENABLED(ZONESTAR_DWIN_LCD) // Connect to EXP2 connector - #define LCDSCREEN_NAME "ZONESTAR DWIN LCD" #define BEEPER_PIN EXP2_05_PIN // PE11 #define KILL_PIN -1 // EXP1_01_PIN #define BTN_EN2 EXP2_07_PIN // PE8 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h index 692b50be40..51b27efa39 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h @@ -483,7 +483,7 @@ #elif ENABLED(FYSETC_MINI_12864_2_1) #define NEOPIXEL_PIN EXP1_06_PIN #endif - #endif // !FYSETC_MINI_12864 + #endif // FYSETC_MINI_12864 #if IS_ULTIPANEL #define LCD_PINS_D5 EXP1_06_PIN diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h index 54e1acc936..d0427b2c31 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h @@ -280,7 +280,7 @@ #endif // HAS_WIRED_LCD // Alter timing for graphical display -#if ENABLED(U8GLIB_ST7920) +#if IS_U8GLIB_ST7920 #define BOARD_ST7920_DELAY_1 96 #define BOARD_ST7920_DELAY_2 48 #define BOARD_ST7920_DELAY_3 600 diff --git a/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h b/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h index e36bdae3a8..1620c86bed 100644 --- a/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h +++ b/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h @@ -571,15 +571,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 125 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 90 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 600 - #endif + #define BOARD_ST7920_DELAY_1 125 + #define BOARD_ST7920_DELAY_2 90 + #define BOARD_ST7920_DELAY_3 600 #endif #if ENABLED(WIFISUPPORT) diff --git a/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h b/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h index 3fff8515b9..4626176a99 100644 --- a/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h @@ -472,7 +472,7 @@ #define LCD_READ_ID 0xD3 #define LCD_USE_DMA_SPI - #define TFT_BUFFER_SIZE 14400 + #define TFT_BUFFER_WORDS 14400 #endif @@ -480,15 +480,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif //#define POWER_MONITOR_VOLTAGE_PIN PC3 diff --git a/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h b/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h index 7d1d7943cf..4e59f1c5dd 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h @@ -208,41 +208,6 @@ #define MKS_TEST_PS_ON_PIN PB2 // PW_OFF #endif -// -// TFT with FSMC interface -// -#if HAS_FSMC_TFT - /** - * Note: MKS Robin TFT screens use various TFT controllers. - * If the screen stays white, disable 'TFT_RESET_PIN' - * to let the bootloader init the screen. - */ - #define TFT_RESET_PIN PC6 // FSMC_RST - #define TFT_BACKLIGHT_PIN PD13 - - #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h - #define DOGLCD_SCK -1 - - #define TOUCH_CS_PIN PA7 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define TFT_CS_PIN FSMC_CS_PIN - #define TFT_RS_PIN FSMC_RS_PIN - - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 - - #define TFT_BUFFER_SIZE 14400 -#endif - // // Onboard SD card // @@ -305,5 +270,5 @@ #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 - #define TFT_BUFFER_SIZE 14400 -#endif + #define TFT_BUFFER_WORDS 14400 +#endif // HAS_FSMC_TFT diff --git a/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h b/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h index 3ed778c16f..053fb19525 100644 --- a/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h +++ b/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h @@ -275,14 +275,8 @@ #endif // HAS_WIRED_LCD // Alter timing for graphical display -#if ENABLED(U8GLIB_ST7920) - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif +#if IS_U8GLIB_ST7920 + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h index 9c50f4b7d8..ec6784b3b5 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h @@ -282,15 +282,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif // diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h index dce4f87cdf..4ff278acc5 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h @@ -308,15 +308,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif // diff --git a/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h b/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h index 5b3ff90f9e..2a112f34b1 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h @@ -518,15 +518,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif #if HAS_SPI_TFT diff --git a/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h b/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h index d274c99e19..941d6ab068 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h @@ -307,7 +307,6 @@ //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 //#define E0_HARDWARE_SERIAL Serial1 //#define E1_HARDWARE_SERIAL Serial1 //#define E2_HARDWARE_SERIAL Serial1 @@ -317,11 +316,11 @@ #define X_SERIAL_TX_PIN PC13 #define Y_SERIAL_TX_PIN PE3 #define Z_SERIAL_TX_PIN PB9 - #define Z2_SERIAL_TX_PIN PB5 - #define E0_SERIAL_TX_PIN PG14 - #define E1_SERIAL_TX_PIN PG10 - #define E2_SERIAL_TX_PIN PD5 - #define E3_SERIAL_TX_PIN PC6 + #define E0_SERIAL_TX_PIN PB5 + #define E1_SERIAL_TX_PIN PG14 + #define E2_SERIAL_TX_PIN PG10 + #define E3_SERIAL_TX_PIN PD5 + #define E4_SERIAL_TX_PIN PC6 // Reduce baud rate to improve software serial reliability #ifndef TMC_BAUD_RATE diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index bac1fd257e..abd85433db 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -330,24 +330,21 @@ void CardReader::printListing(MediaFile parent, const char * const prepend, cons } } else if (is_visible_entity(p OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin))) { - if (prepend) { SERIAL_ECHO(prepend); SERIAL_CHAR('/'); } - SERIAL_ECHO(createFilename(filename, p)); - SERIAL_CHAR(' '); - SERIAL_ECHO(p.fileSize); + if (prepend) SERIAL_ECHO(prepend, C('/')); + SERIAL_ECHO(createFilename(filename, p), C(' '), p.fileSize); if (includeTime) { - SERIAL_CHAR(' '); uint16_t crmodDate = p.lastWriteDate, crmodTime = p.lastWriteTime; if (crmodDate < p.creationDate || (crmodDate == p.creationDate && crmodTime < p.creationTime)) { crmodDate = p.creationDate; crmodTime = p.creationTime; } - SERIAL_ECHOPGM("0x", hex_word(crmodDate)); + SERIAL_ECHOPGM(" 0x", hex_word(crmodDate)); print_hex_word(crmodTime); } #if ENABLED(LONG_FILENAME_HOST_SUPPORT) if (includeLong) { SERIAL_CHAR(' '); - if (prependLong) { SERIAL_ECHO(prependLong); SERIAL_CHAR('/'); } + if (prependLong) SERIAL_ECHO(prependLong, C('/')); SERIAL_ECHO(longFilename[0] ? longFilename : filename); } #endif @@ -470,10 +467,7 @@ void CardReader::printSelectedFilename() { SERIAL_ECHO(dosFilename); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) selectFileByName(dosFilename); - if (longFilename[0]) { - SERIAL_CHAR(' '); - SERIAL_ECHO(longFilename); - } + if (longFilename[0]) SERIAL_ECHO(C(' '), longFilename); #endif } else @@ -856,11 +850,8 @@ void CardReader::report_status(TERN_(QUIETER_AUTO_REPORT_SD_STATUS, const bool i if (has_job) old_sdpos = sdpos; #endif - if (has_job) { - SERIAL_ECHOPGM(STR_SD_PRINTING_BYTE, sdpos); - SERIAL_CHAR('/'); - SERIAL_ECHOLN(filesize); - } + if (has_job) + SERIAL_ECHOLN(F(STR_SD_PRINTING_BYTE), sdpos, C('/'), filesize); else SERIAL_ECHOLNPGM(STR_SD_NOT_PRINTING); } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h index 652b43fd2e..cb99851fdd 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h @@ -79,7 +79,7 @@ extern "C" #define NVIC_GET_PENDING(n) NVIC_GetPendingIRQ((IRQn_Type)n) #define NVIC_SET_PENDING(n) NVIC_SetPendingIRQ((IRQn_Type)n) #define NVIC_ENABLE_IRQ(n) NVIC_EnableIRQ((IRQn_Type)n) -#define NVIC_SET_PRIORITY(n ,p) NVIC_SetPriority((IRQn_Type)n, (uint32_t) p) +#define NVIC_SET_PRIORITY(n, p) NVIC_SetPriority((IRQn_Type)n, (uint32_t) p) //extern "C" { // extern uint32_t _VectorsRam[VECTORTABLE_SIZE] __attribute__((aligned(VECTORTABLE_ALIGNMENT))); //} diff --git a/Marlin/tests/core/test_types.cpp b/Marlin/tests/core/test_types.cpp index d569386265..317b961626 100644 --- a/Marlin/tests/core/test_types.cpp +++ b/Marlin/tests/core/test_types.cpp @@ -22,6 +22,7 @@ #include "../test/unit_tests.h" #include "src/core/types.h" +#include "src/core/millis_t.h" MARLIN_TEST(types, XYval_const_as_bools) { const XYval xy_const_true = {1, 2}; @@ -656,3 +657,11 @@ MARLIN_TEST(types, SString) { TEST_ASSERT_TRUE(strcmp_P(str, PSTR("Hello World!-123456------ < spaces!33\n^ eol! ... 1234.50*2345.602 = 2895645.67")) == 0); } + +MARLIN_TEST(types, PENDING) { + TEST_ASSERT_TRUE(PENDING(0x0000FFFF, 0x00010000)); // <= ~24.4 days + TEST_ASSERT_TRUE(ELAPSED(0x0090000A, 0x00900000)); // <= ~24.4 days + TEST_ASSERT_FALSE(PENDING(0x00000000, 0x80000000)); // > ~24.4 days + TEST_ASSERT_TRUE(PENDING(0x00000000, 0, 0x80000000)); // <= ~48.8 days + TEST_ASSERT_TRUE(PENDING(0x80000000, 0x7FFFFFF0, 0x0020)); // <= ~48.8 days +} diff --git a/README.md b/README.md index 160c288aad..50b86d3213 100644 --- a/README.md +++ b/README.md @@ -58,12 +58,13 @@ Every new HAL opens up a world of hardware. At this time we need HALs for RP2040 [Teensy++ 2.0](//www.microchip.com/en-us/product/AT90USB1286)|AT90USB1286|Printrboard [Arduino Due](//www.arduino.cc/en/Guide/ArduinoDue)|SAM3X8E|RAMPS-FD, RADDS, RAMPS4DUE [ESP32](//github.com/espressif/arduino-esp32)|ESP32|FYSETC E4, E4d@BOX, MRR + [GD32](//www.gigadevice.com/)|GD32 ARM Cortex-M4|Creality MFL GD32 V4.2.2 [HC32](//www.huazhoucn.com/)|HC32|Ender-2 Pro, Voxelab Aquila [LPC1768](//www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-cortex-m3/512-kb-flash-64-kb-sram-ethernet-usb-lqfp100-package:LPC1768FBD100)|ARM® Cortex-M3|MKS SBASE, Re-ARM, Selena Compact [LPC1769](//www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-cortex-m3/512-kb-flash-64-kb-sram-ethernet-usb-lqfp100-package:LPC1769FBD100)|ARM® Cortex-M3|Smoothieboard, Azteeg X5 mini, TH3D EZBoard + [Pico RP2040](//www.raspberrypi.com/documentation/microcontrollers/pico-series.html)|Dual Cortex M0+|BigTreeTech SKR Pico [STM32F103](//www.st.com/en/microcontrollers-microprocessors/stm32f103.html)|ARM® Cortex-M3|Malyan M200, GTM32 Pro, MKS Robin, BTT SKR Mini [STM32F401](//www.st.com/en/microcontrollers-microprocessors/stm32f401.html)|ARM® Cortex-M4|ARMED, Rumba32, SKR Pro, Lerdge, FYSETC S6, Artillery Ruby - [Pico RP2040](//www.raspberrypi.com/documentation/microcontrollers/pico-series.html)|Dual Cortex M0+|BigTreeTech SKR Pico [STM32F7x6](//www.st.com/en/microcontrollers-microprocessors/stm32f7x6.html)|ARM® Cortex-M7|The Borg, RemRam V1 [STM32G0B1RET6](//www.st.com/en/microcontrollers-microprocessors/stm32g0x1.html)|ARM® Cortex-M0+|BigTreeTech SKR mini E3 V3.0 [STM32H743xIT6](//www.st.com/en/microcontrollers-microprocessors/stm32h743-753.html)|ARM® Cortex-M7|BigTreeTech SKR V3.0, SKR EZ V3.0, SKR SE BX V2.0/V3.0 diff --git a/buildroot/bin/generate_version b/buildroot/bin/generate_version index ff85fe7ecf..edc25e18af 100755 --- a/buildroot/bin/generate_version +++ b/buildroot/bin/generate_version @@ -3,12 +3,19 @@ # generate_version # # Make a Version.h file to accompany CUSTOM_VERSION_FILE +# Invoked automatically by Arduino IDE # # Authors: jbrazio, thinkyhead, InsanityAutomation, rfinnie # set -e +# Only run if ALLOW_GENERATE_VERSION is set +if [[ "$ALLOW_GENERATE_VERSION" != "1" ]]; then + echo "Skipping generate_version because ALLOW_GENERATE_VERSION is not set." + exit 0 +fi + DIR="${1:-Marlin}" READ_FILE="${READ_FILE:-${DIR}/Version.h}" WRITE_FILE="${WRITE_FILE:-${READ_FILE}}" diff --git a/buildroot/share/PlatformIO/scripts/collect-code-tests.py b/buildroot/share/PlatformIO/scripts/collect-code-tests.py index 576e3dd06d..62f95f4b4b 100644 --- a/buildroot/share/PlatformIO/scripts/collect-code-tests.py +++ b/buildroot/share/PlatformIO/scripts/collect-code-tests.py @@ -1,6 +1,6 @@ # # collect-code-tests.py -# Convenience script to collect all code tests. Used by env:linux_native_test in native.ini. +# Convenience script to collect all code tests. Used by test envs in native.ini. # import pioutil @@ -32,7 +32,7 @@ if pioutil.is_pio_build(): "restore_configs", f"cp -f {path} ./Marlin/config.ini", "python ./buildroot/share/PlatformIO/scripts/configuration.py", - f"platformio test -e linux_native_test -f {name}", + f"platformio test -e {env['PIOENV']} -f {name}", "restore_configs", ], title = "Marlin: {}".format(name.lower().title().replace("_", " ")), @@ -46,7 +46,7 @@ if pioutil.is_pio_build(): name = "test-marlin", dependencies = None, actions = [ - f"platformio run -t marlin_{name} -e linux_native_test" + f"platformio run -t marlin_{name} -e {env['PIOENV']}" for name in targets ], title = "Marlin: Test all code test suites", diff --git a/buildroot/share/PlatformIO/scripts/exc.S b/buildroot/share/PlatformIO/scripts/exc.S index 1db462bb23..3a61701aca 100644 --- a/buildroot/share/PlatformIO/scripts/exc.S +++ b/buildroot/share/PlatformIO/scripts/exc.S @@ -81,7 +81,7 @@ __exc_usagefault: .thumb_func __default_exc: ldr r2, NVIC_CCR @ Enable returning to thread mode even if there are - mov r1 ,#1 @ pending exceptions. See flag NONEBASETHRDENA. + mov r1, #1 @ pending exceptions. See flag NONEBASETHRDENA. str r1, [r2] cpsid i @ Disable global interrupts ldr r2, SYSTICK_CSR @ Disable systick handler diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 94b39927e0..ea642809d5 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -95,7 +95,7 @@ if pioutil.is_pio_build(): # Make sure board is compatible with the build environment. Skip for _test, # since the board is manipulated as each unit test is executed. - if not result and build_env != "linux_native_test": + if not result and not build_env.endswith("_native_test"): err = "Error: Build environment '%s' is incompatible with %s. Use one of these environments: %s" % \ ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) raise SystemExit(err) diff --git a/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/libsam_sam3x8e_gcc_rel.a.txt b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/libsam_sam3x8e_gcc_rel.a.txt deleted file mode 100644 index 9b614811bd..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/libsam_sam3x8e_gcc_rel.a.txt +++ /dev/null @@ -1,576 +0,0 @@ - -adc10_sam3u.o: - -adc12_sam3u.o: - -adc_sam3snxa.o: - -pio.o: -00000000 T PIO_Clear -00000000 T PIO_Configure -00000000 T PIO_DisableInterrupt -00000000 T PIO_Get -00000000 T PIO_GetOutputDataStatus -00000000 T PIO_PullUp -00000000 T PIO_Set -00000000 T PIO_SetDebounceFilter -00000000 T PIO_SetInput -00000000 T PIO_SetOutput -00000000 T PIO_SetPeripheral - -pmc.o: -00000000 T pmc_clr_fast_startup_input -00000000 T pmc_disable_all_pck -00000000 T pmc_disable_all_periph_clk -00000000 T pmc_disable_interrupt -00000000 T pmc_disable_pck -00000000 T pmc_disable_periph_clk -00000000 T pmc_disable_pllack -00000000 T pmc_disable_udpck -00000000 T pmc_disable_upll_clock -00000000 T pmc_enable_all_pck -00000000 T pmc_enable_all_periph_clk -00000000 T pmc_enable_backupmode -00000000 T pmc_enable_interrupt -00000000 T pmc_enable_pck -00000000 T pmc_enable_periph_clk -00000000 T pmc_enable_pllack -00000000 T pmc_enable_sleepmode -00000000 T pmc_enable_udpck -00000000 T pmc_enable_upll_clock -00000000 T pmc_enable_waitmode -00000000 T pmc_get_interrupt_mask -00000000 T pmc_get_status -00000000 T pmc_get_writeprotect_status -00000000 T pmc_is_locked_pllack -00000000 T pmc_is_locked_upll -00000000 T pmc_is_pck_enabled -00000000 T pmc_is_periph_clk_enabled -00000000 T pmc_mck_set_prescaler -00000000 T pmc_mck_set_source -00000000 T pmc_osc_disable_fastrc -00000000 T pmc_osc_disable_xtal -00000000 T pmc_osc_enable_fastrc -00000000 T pmc_osc_is_ready_32kxtal -00000000 T pmc_osc_is_ready_mainck -00000000 T pmc_pck_set_prescaler -00000000 T pmc_pck_set_source -00000000 T pmc_set_fast_startup_input -00000000 T pmc_set_writeprotect -00000000 T pmc_switch_mainck_to_fastrc -00000000 T pmc_switch_mainck_to_xtal -00000000 T pmc_switch_mck_to_mainck -00000000 T pmc_switch_mck_to_pllack -00000000 T pmc_switch_mck_to_sclk -00000000 T pmc_switch_mck_to_upllck -00000000 T pmc_switch_pck_to_mainck -00000000 T pmc_switch_pck_to_pllack -00000000 T pmc_switch_pck_to_sclk -00000000 T pmc_switch_pck_to_upllck -00000000 T pmc_switch_sclk_to_32kxtal -00000000 T pmc_switch_udpck_to_pllack -00000000 T pmc_switch_udpck_to_upllck - -pwmc.o: -00000000 t FindClockConfiguration -00000000 T PWMC_ConfigureChannel -00000000 T PWMC_ConfigureChannelExt -00000000 T PWMC_ConfigureClocks -00000000 T PWMC_ConfigureComparisonUnit -00000000 T PWMC_ConfigureEventLineMode -00000000 T PWMC_ConfigureSyncChannel -00000000 T PWMC_DisableChannel -00000000 T PWMC_DisableChannelIt -00000000 T PWMC_DisableIt -00000000 T PWMC_DisableOverrideOutput -00000000 T PWMC_EnableChannel -00000000 T PWMC_EnableChannelIt -00000000 T PWMC_EnableFaultProtection -00000000 T PWMC_EnableIt -00000000 T PWMC_EnableOverrideOutput -00000000 T PWMC_FaultClear -00000000 T PWMC_SetDeadTime -00000000 T PWMC_SetDutyCycle -00000000 T PWMC_SetFaultMode -00000000 T PWMC_SetFaultProtectionValue -00000000 T PWMC_SetOverrideValue -00000000 T PWMC_SetPeriod -00000000 T PWMC_SetSyncChannelUpdatePeriod -00000000 T PWMC_SetSyncChannelUpdateUnlock -00000000 T PWMC_WriteBuffer - U __assert_func -00000000 r __func__.6793 -00000000 r __func__.6804 -00000000 r __func__.6819 -00000000 r __func__.6830 -00000000 r __func__.6841 -00000000 r __func__.6848 -00000000 r __func__.6932 -00000000 r __func__.6938 - -rtc.o: -00000000 T RTC_ClearSCCR -00000000 T RTC_DisableIt -00000000 T RTC_EnableIt -00000000 T RTC_GetDate -00000000 T RTC_GetHourMode -00000000 T RTC_GetSR -00000000 T RTC_GetTime -00000000 T RTC_SetDate -00000000 T RTC_SetDateAlarm -00000000 T RTC_SetHourMode -00000000 T RTC_SetTime -00000000 T RTC_SetTimeAlarm - U __assert_func -00000000 r __func__.6790 -00000000 r __func__.6799 -00000000 r __func__.6804 - -rtt.o: -00000000 T RTT_EnableIT -00000000 T RTT_GetStatus -00000000 T RTT_GetTime -00000000 T RTT_SetAlarm -00000000 T RTT_SetPrescaler - U __assert_func -00000000 r __func__.6797 -00000000 r __func__.6805 - -spi.o: -00000000 T SPI_Configure -00000000 T SPI_ConfigureNPCS -00000000 T SPI_Disable -00000000 T SPI_DisableIt -00000000 T SPI_Enable -00000000 T SPI_EnableIt -00000000 T SPI_GetStatus -00000000 T SPI_IsFinished -00000000 T SPI_Read -00000000 T SPI_Write - U pmc_enable_periph_clk - -tc.o: -00000000 T TC_Configure -00000000 T TC_FindMckDivisor -00000000 T TC_GetStatus -00000000 T TC_ReadCV -00000000 T TC_SetRA -00000000 T TC_SetRB -00000000 T TC_SetRC -00000000 T TC_Start -00000000 T TC_Stop - U __assert_func -00000000 r __func__.6792 -00000000 r __func__.6798 -00000000 r __func__.6804 - -timetick.o: -00000000 T GetTickCount -00000000 T Sleep -00000000 T TimeTick_Configure -00000000 T TimeTick_Increment -00000000 T Wait -00000000 b _dwTickCount - -twi.o: -00000000 T TWI_ByteReceived -00000000 T TWI_ByteSent -00000000 T TWI_ConfigureMaster -00000000 T TWI_ConfigureSlave -00000000 T TWI_Disable -00000000 T TWI_DisableIt -00000000 T TWI_EnableIt -00000000 T TWI_GetMaskedStatus -00000000 T TWI_GetStatus -00000000 T TWI_ReadByte -00000000 T TWI_SendSTOPCondition -00000000 T TWI_SetClock -00000000 T TWI_StartRead -00000000 T TWI_StartWrite -00000000 T TWI_Stop -00000000 T TWI_TransferComplete -00000000 T TWI_WriteByte - U __assert_func -00000000 r __func__.7151 -00000000 r __func__.7157 -00000000 r __func__.7172 -00000000 r __func__.7176 -00000000 r __func__.7184 -00000000 r __func__.7191 -00000000 r __func__.7195 -00000000 r __func__.7200 -00000000 r __func__.7208 -00000000 r __func__.7222 -00000000 r __func__.7227 -00000000 r __func__.7231 -00000000 r __func__.7236 -00000000 r __func__.7240 - -usart.o: -00000000 T USART_Configure -00000000 T USART_DisableIt -00000000 T USART_EnableIt -00000000 T USART_GetChar -00000000 T USART_GetStatus -00000000 T USART_IsDataAvailable -00000000 T USART_IsRxReady -00000000 T USART_PutChar -00000000 T USART_Read -00000000 T USART_ReadBuffer -00000000 T USART_SetIrdaFilter -00000000 T USART_SetReceiverEnabled -00000000 T USART_SetTransmitterEnabled -00000000 T USART_Write -00000000 T USART_WriteBuffer - U __assert_func -00000000 r __func__.7068 - -wdt.o: -00000000 T WDT_Disable -00000000 T WDT_Enable -00000000 T WDT_GetPeriod -00000000 T WDT_GetStatus -00000000 T WDT_Restart - -system_sam3xa.o: -00000000 D SystemCoreClock -00000000 T SystemCoreClockUpdate -00000000 T SystemInit -00000000 T system_init_flash - -startup_sam3xa.o: - U ADC_Handler - U BusFault_Handler - U CAN0_Handler - U CAN1_Handler - U DACC_Handler - U DMAC_Handler - U DebugMon_Handler - U EFC0_Handler - U EFC1_Handler - U EMAC_Handler - U HSMCI_Handler - U HardFault_Handler - U MemManage_Handler - U NMI_Handler - U PIOA_Handler - U PIOB_Handler - U PIOC_Handler - U PIOD_Handler - U PMC_Handler - U PWM_Handler - U PendSV_Handler - U RSTC_Handler - U RTC_Handler - U RTT_Handler -00000000 T Reset_Handler - U SMC_Handler - U SPI0_Handler - U SSC_Handler - U SUPC_Handler - U SVC_Handler - U SysTick_Handler - U TC0_Handler - U TC1_Handler - U TC2_Handler - U TC3_Handler - U TC4_Handler - U TC5_Handler - U TC6_Handler - U TC7_Handler - U TC8_Handler - U TRNG_Handler - U TWI0_Handler - U TWI1_Handler - U UART_Handler - U UOTGHS_Handler - U USART0_Handler - U USART1_Handler - U USART2_Handler - U USART3_Handler - U UsageFault_Handler - U WDT_Handler - U _erelocate - U _estack - U _etext - U _ezero - U _sfixed - U _srelocate - U _szero -00000000 R exception_table - U main - -adc.o: -00000000 T adc_configure_power_save -00000000 T adc_configure_sequence -00000000 T adc_configure_timing -00000000 T adc_configure_trigger -00000000 T adc_disable_all_channel -00000000 T adc_disable_anch -00000000 T adc_disable_channel -00000000 T adc_disable_channel_differential_input -00000000 T adc_disable_channel_input_offset -00000000 T adc_disable_interrupt -00000000 T adc_disable_tag -00000000 T adc_disable_ts -00000000 T adc_enable_all_channel -00000000 T adc_enable_anch -00000000 T adc_enable_channel -00000000 T adc_enable_channel_differential_input -00000000 T adc_enable_channel_input_offset -00000000 T adc_enable_interrupt -00000000 T adc_enable_tag -00000000 T adc_enable_ts -00000000 T adc_get_actual_adc_clock -00000000 T adc_get_channel_status -00000000 T adc_get_channel_value -00000000 T adc_get_comparison_mode -00000000 T adc_get_interrupt_mask -00000000 T adc_get_latest_value -00000000 T adc_get_overrun_status -00000000 T adc_get_pdc_base -00000000 T adc_get_status -00000000 T adc_get_tag -00000000 T adc_get_writeprotect_status -00000000 T adc_init -00000000 T adc_set_bias_current -00000000 T adc_set_channel_input_gain -00000000 T adc_set_comparison_channel -00000000 T adc_set_comparison_mode -00000000 T adc_set_comparison_window -00000000 T adc_set_resolution -00000000 T adc_set_writeprotect -00000000 T adc_start -00000000 T adc_start_sequencer -00000000 T adc_stop -00000000 T adc_stop_sequencer - -udp.o: - -udphs.o: - -uotghs.o: -00000000 T UOTGHS_Handler -00000000 B gpf_isr - -interrupt_sam_nvic.o: -00000000 D g_interrupt_enabled - -uotghs_device.o: -00000000 T UDD_Attach -00000000 T UDD_ClearIN -00000000 T UDD_ClearOUT -00000000 T UDD_ClearSetupInt -00000000 T UDD_Detach -00000000 T UDD_FifoByteCount -00000000 T UDD_GetFrameNumber -00000000 T UDD_Init -00000000 T UDD_InitEP -00000000 T UDD_InitEndpoints -00000000 T UDD_ReadWriteAllowed -00000000 T UDD_ReceivedSetupInt -00000000 T UDD_Recv -00000000 T UDD_Recv8 -00000000 T UDD_ReleaseRX -00000000 T UDD_ReleaseTX -00000000 T UDD_Send -00000000 T UDD_Send8 -00000000 T UDD_SetAddress -00000000 T UDD_SetStack -00000000 T UDD_Stall -00000000 T UDD_WaitForINOrOUT -00000000 T UDD_WaitIN -00000000 T UDD_WaitOUT - U g_interrupt_enabled - U gpf_isr - U pmc_enable_periph_clk - U pmc_enable_udpck - U pmc_enable_upll_clock - U pmc_switch_udpck_to_upllck -00000000 b ul_recv_fifo_ptr -00000000 b ul_send_fifo_ptr - -uotghs_host.o: -00000000 T UHD_BusReset -00000000 T UHD_GetVBUSState -00000000 t UHD_ISR -00000000 T UHD_Init -00000000 T UHD_Pipe0_Alloc -00000000 T UHD_Pipe_Alloc -00000000 T UHD_Pipe_Free -00000000 T UHD_Pipe_Is_Transfer_Complete -00000000 T UHD_Pipe_Read -00000000 T UHD_Pipe_Send -00000000 T UHD_Pipe_Write -00000000 T UHD_SetStack - U g_interrupt_enabled - U gpf_isr - U pmc_enable_periph_clk - U pmc_enable_udpck - U pmc_enable_upll_clock - U pmc_switch_udpck_to_upllck -00000000 b uhd_state - -dacc.o: -00000000 T dacc_disable_channel -00000000 T dacc_disable_interrupt -00000000 T dacc_disable_trigger -00000000 T dacc_enable_channel -00000000 T dacc_enable_flexible_selection -00000000 T dacc_enable_interrupt -00000000 T dacc_get_analog_control -00000000 T dacc_get_channel_status -00000000 T dacc_get_interrupt_mask -00000000 T dacc_get_interrupt_status -00000000 T dacc_get_pdc_base -00000000 T dacc_get_writeprotect_status -00000000 T dacc_reset -00000000 T dacc_set_analog_control -00000000 T dacc_set_channel_selection -00000000 T dacc_set_power_save -00000000 T dacc_set_timing -00000000 T dacc_set_transfer_mode -00000000 T dacc_set_trigger -00000000 T dacc_set_writeprotect -00000000 T dacc_write_conversion_data - -can.o: -00000000 R can_bit_time -00000000 T can_disable -00000000 T can_disable_autobaud_listen_mode -00000000 T can_disable_interrupt -00000000 T can_disable_low_power_mode -00000000 T can_disable_overload_frame -00000000 T can_disable_time_triggered_mode -00000000 T can_disable_timer_freeze -00000000 T can_disable_tx_repeat -00000000 T can_enable -00000000 T can_enable_autobaud_listen_mode -00000000 T can_enable_interrupt -00000000 T can_enable_low_power_mode -00000000 T can_enable_overload_frame -00000000 T can_enable_time_triggered_mode -00000000 T can_enable_timer_freeze -00000000 T can_enable_tx_repeat -00000000 T can_get_internal_timer_value -00000000 T can_get_interrupt_mask -00000000 T can_get_rx_error_cnt -00000000 T can_get_status -00000000 T can_get_timestamp_value -00000000 T can_get_tx_error_cnt -00000000 T can_global_send_abort_cmd -00000000 T can_global_send_transfer_cmd -00000000 T can_init -00000000 T can_mailbox_get_status -00000000 T can_mailbox_init -00000000 T can_mailbox_read -00000000 T can_mailbox_send_abort_cmd -00000000 T can_mailbox_send_transfer_cmd -00000000 T can_mailbox_set_timemark -00000000 T can_mailbox_tx_remote_frame -00000000 T can_mailbox_write -00000000 T can_reset_all_mailbox -00000000 T can_reset_internal_timer -00000000 T can_reset_mailbox_data -00000000 T can_set_rx_sync_stage -00000000 T can_set_timestamp_capture_point - U memset - -efc.o: -00000000 T efc_disable_frdy_interrupt -00000000 T efc_enable_frdy_interrupt -00000000 T efc_get_flash_access_mode -00000000 T efc_get_result -00000000 T efc_get_status -00000000 T efc_get_wait_state -00000000 T efc_init -00000000 T efc_perform_command -0000006c T efc_perform_fcr -00000000 T efc_perform_read_sequence -00000000 T efc_set_flash_access_mode -00000000 T efc_set_wait_state -00000068 T efc_write_fmr -00000000 b iap_perform_command.7049 - -gpbr.o: -00000000 T gpbr_read -00000000 T gpbr_write - -ssc.o: - U memset -00000000 T ssc_disable_interrupt -00000000 T ssc_disable_rx -00000000 T ssc_disable_tx -00000000 T ssc_disable_tx_frame_sync_data -00000000 T ssc_enable_interrupt -00000000 T ssc_enable_rx -00000000 T ssc_enable_tx -00000000 T ssc_enable_tx_frame_sync_data -00000000 T ssc_get_interrupt_mask -00000000 T ssc_get_rx_access -00000000 T ssc_get_rx_compare -00000000 T ssc_get_status -00000000 T ssc_get_tx_access -00000000 T ssc_get_writeprotect_status -00000000 T ssc_i2s_set_receiver -00000000 T ssc_i2s_set_transmitter -00000000 T ssc_is_rx_enabled -00000000 T ssc_is_rx_ready -00000000 T ssc_is_tx_empty -00000000 T ssc_is_tx_enabled -00000000 T ssc_is_tx_ready -00000000 T ssc_read -00000000 T ssc_read_sync_data -00000000 T ssc_reset -00000000 T ssc_set_clock_divider -00000000 T ssc_set_loop_mode -00000000 T ssc_set_normal_mode -00000000 T ssc_set_receiver -00000000 T ssc_set_rx_compare -00000000 T ssc_set_rx_stop_selection -00000000 T ssc_set_td_default_level -00000000 T ssc_set_transmitter -00000000 T ssc_set_writeprotect -00000000 T ssc_write -00000000 T ssc_write_sync_data - -trng.o: -00000000 T trng_disable -00000000 T trng_disable_interrupt -00000000 T trng_enable -00000000 T trng_enable_interrupt -00000000 T trng_get_interrupt_mask -00000000 T trng_get_interrupt_status -00000000 T trng_read_output_data - -rstc.o: -00000000 T rstc_disable_user_reset -00000000 T rstc_disable_user_reset_interrupt -00000000 T rstc_enable_user_reset -00000000 T rstc_enable_user_reset_interrupt -00000000 T rstc_get_reset_cause -00000000 T rstc_get_status -00000000 T rstc_reset_extern -00000000 T rstc_set_external_reset -00000000 T rstc_start_software_reset - -emac.o: -00000000 t circ_inc -00000000 T emac_dev_get_tx_load -00000000 T emac_dev_init -00000000 T emac_dev_read -00000000 T emac_dev_reset -00000000 T emac_dev_set_rx_callback -00000000 T emac_dev_set_tx_wakeup_callback -00000000 T emac_dev_write -00000000 T emac_handler -00000000 T emac_phy_read -00000000 T emac_phy_write -00000000 t emac_reset_rx_mem -00000000 t emac_reset_tx_mem -00000000 b gs_rx_desc -00000000 b gs_tx_callback -00000000 b gs_tx_desc -00000000 b gs_uc_rx_buffer -00000000 b gs_uc_tx_buffer - U memcpy diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld index e86d8aa274..9d9d6e5a59 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld +++ b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld @@ -37,7 +37,7 @@ _Min_Stack_Size = 0x400; /* required amount of stack */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K - FLASH (rx) : ORIGIN = 0x8000000 , LENGTH = 128K + FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K } /* Sections */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld index e86d8aa274..9d9d6e5a59 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld +++ b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld @@ -37,7 +37,7 @@ _Min_Stack_Size = 0x400; /* required amount of stack */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K - FLASH (rx) : ORIGIN = 0x8000000 , LENGTH = 128K + FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K } /* Sections */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h b/buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h index cae4d83024..2d342f57c7 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h @@ -168,274 +168,274 @@ const uint16_t PROGMEM port_to_input_PGM[] = { const uint8_t PROGMEM digital_pin_to_port_PGM[] = { // PORTLIST // ------------------------------------------- - PE , // PE 0 ** 0 ** USART0_RX - PE , // PE 1 ** 1 ** USART0_TX - PE , // PE 4 ** 2 ** PWM2 - PE , // PE 5 ** 3 ** PWM3 - PG , // PG 5 ** 4 ** PWM4 - PE , // PE 3 ** 5 ** PWM5 - PH , // PH 3 ** 6 ** PWM6 - PH , // PH 4 ** 7 ** PWM7 - PH , // PH 5 ** 8 ** PWM8 - PH , // PH 6 ** 9 ** PWM9 - PB , // PB 4 ** 10 ** PWM10 - PB , // PB 5 ** 11 ** PWM11 - PB , // PB 6 ** 12 ** PWM12 - PB , // PB 7 ** 13 ** PWM13 - PJ , // PJ 1 ** 14 ** USART3_TX - PJ , // PJ 0 ** 15 ** USART3_RX - PH , // PH 1 ** 16 ** USART2_TX - PH , // PH 0 ** 17 ** USART2_RX - PD , // PD 3 ** 18 ** USART1_TX - PD , // PD 2 ** 19 ** USART1_RX - PD , // PD 1 ** 20 ** I2C_SDA - PD , // PD 0 ** 21 ** I2C_SCL - PA , // PA 0 ** 22 ** D22 - PA , // PA 1 ** 23 ** D23 - PA , // PA 2 ** 24 ** D24 - PA , // PA 3 ** 25 ** D25 - PA , // PA 4 ** 26 ** D26 - PA , // PA 5 ** 27 ** D27 - PA , // PA 6 ** 28 ** D28 - PA , // PA 7 ** 29 ** D29 - PC , // PC 7 ** 30 ** D30 - PC , // PC 6 ** 31 ** D31 - PC , // PC 5 ** 32 ** D32 - PC , // PC 4 ** 33 ** D33 - PC , // PC 3 ** 34 ** D34 - PC , // PC 2 ** 35 ** D35 - PC , // PC 1 ** 36 ** D36 - PC , // PC 0 ** 37 ** D37 - PD , // PD 7 ** 38 ** D38 - PG , // PG 2 ** 39 ** D39 - PG , // PG 1 ** 40 ** D40 - PG , // PG 0 ** 41 ** D41 - PL , // PL 7 ** 42 ** D42 - PL , // PL 6 ** 43 ** D43 - PL , // PL 5 ** 44 ** D44 - PL , // PL 4 ** 45 ** D45 - PL , // PL 3 ** 46 ** D46 - PL , // PL 2 ** 47 ** D47 - PL , // PL 1 ** 48 ** D48 - PL , // PL 0 ** 49 ** D49 - PB , // PB 3 ** 50 ** SPI_MISO - PB , // PB 2 ** 51 ** SPI_MOSI - PB , // PB 1 ** 52 ** SPI_SCK - PB , // PB 0 ** 53 ** SPI_SS - PF , // PF 0 ** 54 ** A0 - PF , // PF 1 ** 55 ** A1 - PF , // PF 2 ** 56 ** A2 - PF , // PF 3 ** 57 ** A3 - PF , // PF 4 ** 58 ** A4 - PF , // PF 5 ** 59 ** A5 - PF , // PF 6 ** 60 ** A6 - PF , // PF 7 ** 61 ** A7 - PK , // PK 0 ** 62 ** A8 - PK , // PK 1 ** 63 ** A9 - PK , // PK 2 ** 64 ** A10 - PK , // PK 3 ** 65 ** A11 - PK , // PK 4 ** 66 ** A12 - PK , // PK 5 ** 67 ** A13 - PK , // PK 6 ** 68 ** A14 - PK , // PK 7 ** 69 ** A15 - PG , // PG 4 ** 70 ** D70 - PG , // PG 3 ** 71 ** D71 - PJ , // PJ 2 ** 72 ** D72 - PJ , // PJ 3 ** 73 ** D73 - PJ , // PJ 7 ** 74 ** D74 - PJ , // PJ 4 ** 75 ** D75 - PJ , // PJ 5 ** 76 ** D76 - PJ , // PJ 6 ** 77 ** D77 - PE , // PE 2 ** 78 ** D78 - PE , // PE 6 ** 79 ** D79 - PE , // PE 7 ** 80 ** D80 - PD , // PD 4 ** 81 ** D81 - PD , // PD 5 ** 82 ** D82 - PD , // PD 6 ** 83 ** D83 - PH , // PH 2 ** 84 ** D84 - PH , // PH 7 ** 85 ** D85 + PE, // PE 0 ** 0 ** USART0_RX + PE, // PE 1 ** 1 ** USART0_TX + PE, // PE 4 ** 2 ** PWM2 + PE, // PE 5 ** 3 ** PWM3 + PG, // PG 5 ** 4 ** PWM4 + PE, // PE 3 ** 5 ** PWM5 + PH, // PH 3 ** 6 ** PWM6 + PH, // PH 4 ** 7 ** PWM7 + PH, // PH 5 ** 8 ** PWM8 + PH, // PH 6 ** 9 ** PWM9 + PB, // PB 4 ** 10 ** PWM10 + PB, // PB 5 ** 11 ** PWM11 + PB, // PB 6 ** 12 ** PWM12 + PB, // PB 7 ** 13 ** PWM13 + PJ, // PJ 1 ** 14 ** USART3_TX + PJ, // PJ 0 ** 15 ** USART3_RX + PH, // PH 1 ** 16 ** USART2_TX + PH, // PH 0 ** 17 ** USART2_RX + PD, // PD 3 ** 18 ** USART1_TX + PD, // PD 2 ** 19 ** USART1_RX + PD, // PD 1 ** 20 ** I2C_SDA + PD, // PD 0 ** 21 ** I2C_SCL + PA, // PA 0 ** 22 ** D22 + PA, // PA 1 ** 23 ** D23 + PA, // PA 2 ** 24 ** D24 + PA, // PA 3 ** 25 ** D25 + PA, // PA 4 ** 26 ** D26 + PA, // PA 5 ** 27 ** D27 + PA, // PA 6 ** 28 ** D28 + PA, // PA 7 ** 29 ** D29 + PC, // PC 7 ** 30 ** D30 + PC, // PC 6 ** 31 ** D31 + PC, // PC 5 ** 32 ** D32 + PC, // PC 4 ** 33 ** D33 + PC, // PC 3 ** 34 ** D34 + PC, // PC 2 ** 35 ** D35 + PC, // PC 1 ** 36 ** D36 + PC, // PC 0 ** 37 ** D37 + PD, // PD 7 ** 38 ** D38 + PG, // PG 2 ** 39 ** D39 + PG, // PG 1 ** 40 ** D40 + PG, // PG 0 ** 41 ** D41 + PL, // PL 7 ** 42 ** D42 + PL, // PL 6 ** 43 ** D43 + PL, // PL 5 ** 44 ** D44 + PL, // PL 4 ** 45 ** D45 + PL, // PL 3 ** 46 ** D46 + PL, // PL 2 ** 47 ** D47 + PL, // PL 1 ** 48 ** D48 + PL, // PL 0 ** 49 ** D49 + PB, // PB 3 ** 50 ** SPI_MISO + PB, // PB 2 ** 51 ** SPI_MOSI + PB, // PB 1 ** 52 ** SPI_SCK + PB, // PB 0 ** 53 ** SPI_SS + PF, // PF 0 ** 54 ** A0 + PF, // PF 1 ** 55 ** A1 + PF, // PF 2 ** 56 ** A2 + PF, // PF 3 ** 57 ** A3 + PF, // PF 4 ** 58 ** A4 + PF, // PF 5 ** 59 ** A5 + PF, // PF 6 ** 60 ** A6 + PF, // PF 7 ** 61 ** A7 + PK, // PK 0 ** 62 ** A8 + PK, // PK 1 ** 63 ** A9 + PK, // PK 2 ** 64 ** A10 + PK, // PK 3 ** 65 ** A11 + PK, // PK 4 ** 66 ** A12 + PK, // PK 5 ** 67 ** A13 + PK, // PK 6 ** 68 ** A14 + PK, // PK 7 ** 69 ** A15 + PG, // PG 4 ** 70 ** D70 + PG, // PG 3 ** 71 ** D71 + PJ, // PJ 2 ** 72 ** D72 + PJ, // PJ 3 ** 73 ** D73 + PJ, // PJ 7 ** 74 ** D74 + PJ, // PJ 4 ** 75 ** D75 + PJ, // PJ 5 ** 76 ** D76 + PJ, // PJ 6 ** 77 ** D77 + PE, // PE 2 ** 78 ** D78 + PE, // PE 6 ** 79 ** D79 + PE, // PE 7 ** 80 ** D80 + PD, // PD 4 ** 81 ** D81 + PD, // PD 5 ** 82 ** D82 + PD, // PD 6 ** 83 ** D83 + PH, // PH 2 ** 84 ** D84 + PH, // PH 7 ** 85 ** D85 }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { // PIN IN PORT // ------------------------------------------- - _BV( 0 ) , // PE 0 ** 0 ** USART0_RX - _BV( 1 ) , // PE 1 ** 1 ** USART0_TX - _BV( 4 ) , // PE 4 ** 2 ** PWM2 - _BV( 5 ) , // PE 5 ** 3 ** PWM3 - _BV( 5 ) , // PG 5 ** 4 ** PWM4 - _BV( 3 ) , // PE 3 ** 5 ** PWM5 - _BV( 3 ) , // PH 3 ** 6 ** PWM6 - _BV( 4 ) , // PH 4 ** 7 ** PWM7 - _BV( 5 ) , // PH 5 ** 8 ** PWM8 - _BV( 6 ) , // PH 6 ** 9 ** PWM9 - _BV( 4 ) , // PB 4 ** 10 ** PWM10 - _BV( 5 ) , // PB 5 ** 11 ** PWM11 - _BV( 6 ) , // PB 6 ** 12 ** PWM12 - _BV( 7 ) , // PB 7 ** 13 ** PWM13 - _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX - _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX - _BV( 1 ) , // PH 1 ** 16 ** USART2_TX - _BV( 0 ) , // PH 0 ** 17 ** USART2_RX - _BV( 3 ) , // PD 3 ** 18 ** USART1_TX - _BV( 2 ) , // PD 2 ** 19 ** USART1_RX - _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA - _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL - _BV( 0 ) , // PA 0 ** 22 ** D22 - _BV( 1 ) , // PA 1 ** 23 ** D23 - _BV( 2 ) , // PA 2 ** 24 ** D24 - _BV( 3 ) , // PA 3 ** 25 ** D25 - _BV( 4 ) , // PA 4 ** 26 ** D26 - _BV( 5 ) , // PA 5 ** 27 ** D27 - _BV( 6 ) , // PA 6 ** 28 ** D28 - _BV( 7 ) , // PA 7 ** 29 ** D29 - _BV( 7 ) , // PC 7 ** 30 ** D30 - _BV( 6 ) , // PC 6 ** 31 ** D31 - _BV( 5 ) , // PC 5 ** 32 ** D32 - _BV( 4 ) , // PC 4 ** 33 ** D33 - _BV( 3 ) , // PC 3 ** 34 ** D34 - _BV( 2 ) , // PC 2 ** 35 ** D35 - _BV( 1 ) , // PC 1 ** 36 ** D36 - _BV( 0 ) , // PC 0 ** 37 ** D37 - _BV( 7 ) , // PD 7 ** 38 ** D38 - _BV( 2 ) , // PG 2 ** 39 ** D39 - _BV( 1 ) , // PG 1 ** 40 ** D40 - _BV( 0 ) , // PG 0 ** 41 ** D41 - _BV( 7 ) , // PL 7 ** 42 ** D42 - _BV( 6 ) , // PL 6 ** 43 ** D43 - _BV( 5 ) , // PL 5 ** 44 ** D44 - _BV( 4 ) , // PL 4 ** 45 ** D45 - _BV( 3 ) , // PL 3 ** 46 ** D46 - _BV( 2 ) , // PL 2 ** 47 ** D47 - _BV( 1 ) , // PL 1 ** 48 ** D48 - _BV( 0 ) , // PL 0 ** 49 ** D49 - _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO - _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI - _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK - _BV( 0 ) , // PB 0 ** 53 ** SPI_SS - _BV( 0 ) , // PF 0 ** 54 ** A0 - _BV( 1 ) , // PF 1 ** 55 ** A1 - _BV( 2 ) , // PF 2 ** 56 ** A2 - _BV( 3 ) , // PF 3 ** 57 ** A3 - _BV( 4 ) , // PF 4 ** 58 ** A4 - _BV( 5 ) , // PF 5 ** 59 ** A5 - _BV( 6 ) , // PF 6 ** 60 ** A6 - _BV( 7 ) , // PF 7 ** 61 ** A7 - _BV( 0 ) , // PK 0 ** 62 ** A8 - _BV( 1 ) , // PK 1 ** 63 ** A9 - _BV( 2 ) , // PK 2 ** 64 ** A10 - _BV( 3 ) , // PK 3 ** 65 ** A11 - _BV( 4 ) , // PK 4 ** 66 ** A12 - _BV( 5 ) , // PK 5 ** 67 ** A13 - _BV( 6 ) , // PK 6 ** 68 ** A14 - _BV( 7 ) , // PK 7 ** 69 ** A15 - _BV( 4 ) , // PG 4 ** 70 ** D70 - _BV( 3 ) , // PG 3 ** 71 ** D71 - _BV( 2 ) , // PJ 2 ** 72 ** D72 - _BV( 3 ) , // PJ 3 ** 73 ** D73 - _BV( 7 ) , // PJ 7 ** 74 ** D74 - _BV( 4 ) , // PJ 4 ** 75 ** D75 - _BV( 5 ) , // PJ 5 ** 76 ** D76 - _BV( 6 ) , // PJ 6 ** 77 ** D77 - _BV( 2 ) , // PE 2 ** 78 ** D78 - _BV( 6 ) , // PE 6 ** 79 ** D79 - _BV( 7 ) , // PE 7 ** 80 ** D80 - _BV( 4 ) , // PD 4 ** 81 ** D81 - _BV( 5 ) , // PD 5 ** 82 ** D82 - _BV( 6 ) , // PD 6 ** 83 ** D83 - _BV( 2 ) , // PH 2 ** 84 ** D84 - _BV( 7 ) , // PH 7 ** 85 ** D85 + _BV( 0 ), // PE 0 ** 0 ** USART0_RX + _BV( 1 ), // PE 1 ** 1 ** USART0_TX + _BV( 4 ), // PE 4 ** 2 ** PWM2 + _BV( 5 ), // PE 5 ** 3 ** PWM3 + _BV( 5 ), // PG 5 ** 4 ** PWM4 + _BV( 3 ), // PE 3 ** 5 ** PWM5 + _BV( 3 ), // PH 3 ** 6 ** PWM6 + _BV( 4 ), // PH 4 ** 7 ** PWM7 + _BV( 5 ), // PH 5 ** 8 ** PWM8 + _BV( 6 ), // PH 6 ** 9 ** PWM9 + _BV( 4 ), // PB 4 ** 10 ** PWM10 + _BV( 5 ), // PB 5 ** 11 ** PWM11 + _BV( 6 ), // PB 6 ** 12 ** PWM12 + _BV( 7 ), // PB 7 ** 13 ** PWM13 + _BV( 1 ), // PJ 1 ** 14 ** USART3_TX + _BV( 0 ), // PJ 0 ** 15 ** USART3_RX + _BV( 1 ), // PH 1 ** 16 ** USART2_TX + _BV( 0 ), // PH 0 ** 17 ** USART2_RX + _BV( 3 ), // PD 3 ** 18 ** USART1_TX + _BV( 2 ), // PD 2 ** 19 ** USART1_RX + _BV( 1 ), // PD 1 ** 20 ** I2C_SDA + _BV( 0 ), // PD 0 ** 21 ** I2C_SCL + _BV( 0 ), // PA 0 ** 22 ** D22 + _BV( 1 ), // PA 1 ** 23 ** D23 + _BV( 2 ), // PA 2 ** 24 ** D24 + _BV( 3 ), // PA 3 ** 25 ** D25 + _BV( 4 ), // PA 4 ** 26 ** D26 + _BV( 5 ), // PA 5 ** 27 ** D27 + _BV( 6 ), // PA 6 ** 28 ** D28 + _BV( 7 ), // PA 7 ** 29 ** D29 + _BV( 7 ), // PC 7 ** 30 ** D30 + _BV( 6 ), // PC 6 ** 31 ** D31 + _BV( 5 ), // PC 5 ** 32 ** D32 + _BV( 4 ), // PC 4 ** 33 ** D33 + _BV( 3 ), // PC 3 ** 34 ** D34 + _BV( 2 ), // PC 2 ** 35 ** D35 + _BV( 1 ), // PC 1 ** 36 ** D36 + _BV( 0 ), // PC 0 ** 37 ** D37 + _BV( 7 ), // PD 7 ** 38 ** D38 + _BV( 2 ), // PG 2 ** 39 ** D39 + _BV( 1 ), // PG 1 ** 40 ** D40 + _BV( 0 ), // PG 0 ** 41 ** D41 + _BV( 7 ), // PL 7 ** 42 ** D42 + _BV( 6 ), // PL 6 ** 43 ** D43 + _BV( 5 ), // PL 5 ** 44 ** D44 + _BV( 4 ), // PL 4 ** 45 ** D45 + _BV( 3 ), // PL 3 ** 46 ** D46 + _BV( 2 ), // PL 2 ** 47 ** D47 + _BV( 1 ), // PL 1 ** 48 ** D48 + _BV( 0 ), // PL 0 ** 49 ** D49 + _BV( 3 ), // PB 3 ** 50 ** SPI_MISO + _BV( 2 ), // PB 2 ** 51 ** SPI_MOSI + _BV( 1 ), // PB 1 ** 52 ** SPI_SCK + _BV( 0 ), // PB 0 ** 53 ** SPI_SS + _BV( 0 ), // PF 0 ** 54 ** A0 + _BV( 1 ), // PF 1 ** 55 ** A1 + _BV( 2 ), // PF 2 ** 56 ** A2 + _BV( 3 ), // PF 3 ** 57 ** A3 + _BV( 4 ), // PF 4 ** 58 ** A4 + _BV( 5 ), // PF 5 ** 59 ** A5 + _BV( 6 ), // PF 6 ** 60 ** A6 + _BV( 7 ), // PF 7 ** 61 ** A7 + _BV( 0 ), // PK 0 ** 62 ** A8 + _BV( 1 ), // PK 1 ** 63 ** A9 + _BV( 2 ), // PK 2 ** 64 ** A10 + _BV( 3 ), // PK 3 ** 65 ** A11 + _BV( 4 ), // PK 4 ** 66 ** A12 + _BV( 5 ), // PK 5 ** 67 ** A13 + _BV( 6 ), // PK 6 ** 68 ** A14 + _BV( 7 ), // PK 7 ** 69 ** A15 + _BV( 4 ), // PG 4 ** 70 ** D70 + _BV( 3 ), // PG 3 ** 71 ** D71 + _BV( 2 ), // PJ 2 ** 72 ** D72 + _BV( 3 ), // PJ 3 ** 73 ** D73 + _BV( 7 ), // PJ 7 ** 74 ** D74 + _BV( 4 ), // PJ 4 ** 75 ** D75 + _BV( 5 ), // PJ 5 ** 76 ** D76 + _BV( 6 ), // PJ 6 ** 77 ** D77 + _BV( 2 ), // PE 2 ** 78 ** D78 + _BV( 6 ), // PE 6 ** 79 ** D79 + _BV( 7 ), // PE 7 ** 80 ** D80 + _BV( 4 ), // PD 4 ** 81 ** D81 + _BV( 5 ), // PD 5 ** 82 ** D82 + _BV( 6 ), // PD 6 ** 83 ** D83 + _BV( 2 ), // PH 2 ** 84 ** D84 + _BV( 7 ), // PH 7 ** 85 ** D85 }; const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { // TIMERS // ------------------------------------------- - NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX - NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX - TIMER3B , // PE 4 ** 2 ** PWM2 - TIMER3C , // PE 5 ** 3 ** PWM3 - TIMER0B , // PG 5 ** 4 ** PWM4 - TIMER3A , // PE 3 ** 5 ** PWM5 - TIMER4A , // PH 3 ** 6 ** PWM6 - TIMER4B , // PH 4 ** 7 ** PWM7 - TIMER4C , // PH 5 ** 8 ** PWM8 - TIMER2B , // PH 6 ** 9 ** PWM9 - TIMER2A , // PB 4 ** 10 ** PWM10 - TIMER1A , // PB 5 ** 11 ** PWM11 - TIMER1B , // PB 6 ** 12 ** PWM12 - TIMER0A , // PB 7 ** 13 ** PWM13 - NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX - NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX - NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX - NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX - NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX - NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX - NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA - NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL - NOT_ON_TIMER , // PA 0 ** 22 ** D22 - NOT_ON_TIMER , // PA 1 ** 23 ** D23 - NOT_ON_TIMER , // PA 2 ** 24 ** D24 - NOT_ON_TIMER , // PA 3 ** 25 ** D25 - NOT_ON_TIMER , // PA 4 ** 26 ** D26 - NOT_ON_TIMER , // PA 5 ** 27 ** D27 - NOT_ON_TIMER , // PA 6 ** 28 ** D28 - NOT_ON_TIMER , // PA 7 ** 29 ** D29 - NOT_ON_TIMER , // PC 7 ** 30 ** D30 - NOT_ON_TIMER , // PC 6 ** 31 ** D31 - NOT_ON_TIMER , // PC 5 ** 32 ** D32 - NOT_ON_TIMER , // PC 4 ** 33 ** D33 - NOT_ON_TIMER , // PC 3 ** 34 ** D34 - NOT_ON_TIMER , // PC 2 ** 35 ** D35 - NOT_ON_TIMER , // PC 1 ** 36 ** D36 - NOT_ON_TIMER , // PC 0 ** 37 ** D37 - NOT_ON_TIMER , // PD 7 ** 38 ** D38 - NOT_ON_TIMER , // PG 2 ** 39 ** D39 - NOT_ON_TIMER , // PG 1 ** 40 ** D40 - NOT_ON_TIMER , // PG 0 ** 41 ** D41 - NOT_ON_TIMER , // PL 7 ** 42 ** D42 - NOT_ON_TIMER , // PL 6 ** 43 ** D43 - TIMER5C , // PL 5 ** 44 ** D44 - TIMER5B , // PL 4 ** 45 ** D45 - TIMER5A , // PL 3 ** 46 ** D46 - NOT_ON_TIMER , // PL 2 ** 47 ** D47 - NOT_ON_TIMER , // PL 1 ** 48 ** D48 - NOT_ON_TIMER , // PL 0 ** 49 ** D49 - NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO - NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI - NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK - NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS - NOT_ON_TIMER , // PF 0 ** 54 ** A0 - NOT_ON_TIMER , // PF 1 ** 55 ** A1 - NOT_ON_TIMER , // PF 2 ** 56 ** A2 - NOT_ON_TIMER , // PF 3 ** 57 ** A3 - NOT_ON_TIMER , // PF 4 ** 58 ** A4 - NOT_ON_TIMER , // PF 5 ** 59 ** A5 - NOT_ON_TIMER , // PF 6 ** 60 ** A6 - NOT_ON_TIMER , // PF 7 ** 61 ** A7 - NOT_ON_TIMER , // PK 0 ** 62 ** A8 - NOT_ON_TIMER , // PK 1 ** 63 ** A9 - NOT_ON_TIMER , // PK 2 ** 64 ** A10 - NOT_ON_TIMER , // PK 3 ** 65 ** A11 - NOT_ON_TIMER , // PK 4 ** 66 ** A12 - NOT_ON_TIMER , // PK 5 ** 67 ** A13 - NOT_ON_TIMER , // PK 6 ** 68 ** A14 - NOT_ON_TIMER , // PK 7 ** 69 ** A15 - NOT_ON_TIMER , // PG 4 ** 70 ** D70 - NOT_ON_TIMER , // PG 3 ** 71 ** D71 - NOT_ON_TIMER , // PJ 2 ** 72 ** D72 - NOT_ON_TIMER , // PJ 3 ** 73 ** D73 - NOT_ON_TIMER , // PJ 7 ** 74 ** D74 - NOT_ON_TIMER , // PJ 4 ** 75 ** D75 - NOT_ON_TIMER , // PJ 5 ** 76 ** D76 - NOT_ON_TIMER , // PJ 6 ** 77 ** D77 - NOT_ON_TIMER , // PE 2 ** 78 ** D78 - NOT_ON_TIMER , // PE 6 ** 79 ** D79 - NOT_ON_TIMER , // PE 7 ** 80 ** D80 - NOT_ON_TIMER , // PD 4 ** 81 ** D81 - NOT_ON_TIMER , // PD 5 ** 82 ** D82 - NOT_ON_TIMER , // PD 6 ** 83 ** D83 - NOT_ON_TIMER , // PH 2 ** 84 ** D84 - NOT_ON_TIMER , // PH 7 ** 85 ** D85 + NOT_ON_TIMER, // PE 0 ** 0 ** USART0_RX + NOT_ON_TIMER, // PE 1 ** 1 ** USART0_TX + TIMER3B, // PE 4 ** 2 ** PWM2 + TIMER3C, // PE 5 ** 3 ** PWM3 + TIMER0B, // PG 5 ** 4 ** PWM4 + TIMER3A, // PE 3 ** 5 ** PWM5 + TIMER4A, // PH 3 ** 6 ** PWM6 + TIMER4B, // PH 4 ** 7 ** PWM7 + TIMER4C, // PH 5 ** 8 ** PWM8 + TIMER2B, // PH 6 ** 9 ** PWM9 + TIMER2A, // PB 4 ** 10 ** PWM10 + TIMER1A, // PB 5 ** 11 ** PWM11 + TIMER1B, // PB 6 ** 12 ** PWM12 + TIMER0A, // PB 7 ** 13 ** PWM13 + NOT_ON_TIMER, // PJ 1 ** 14 ** USART3_TX + NOT_ON_TIMER, // PJ 0 ** 15 ** USART3_RX + NOT_ON_TIMER, // PH 1 ** 16 ** USART2_TX + NOT_ON_TIMER, // PH 0 ** 17 ** USART2_RX + NOT_ON_TIMER, // PD 3 ** 18 ** USART1_TX + NOT_ON_TIMER, // PD 2 ** 19 ** USART1_RX + NOT_ON_TIMER, // PD 1 ** 20 ** I2C_SDA + NOT_ON_TIMER, // PD 0 ** 21 ** I2C_SCL + NOT_ON_TIMER, // PA 0 ** 22 ** D22 + NOT_ON_TIMER, // PA 1 ** 23 ** D23 + NOT_ON_TIMER, // PA 2 ** 24 ** D24 + NOT_ON_TIMER, // PA 3 ** 25 ** D25 + NOT_ON_TIMER, // PA 4 ** 26 ** D26 + NOT_ON_TIMER, // PA 5 ** 27 ** D27 + NOT_ON_TIMER, // PA 6 ** 28 ** D28 + NOT_ON_TIMER, // PA 7 ** 29 ** D29 + NOT_ON_TIMER, // PC 7 ** 30 ** D30 + NOT_ON_TIMER, // PC 6 ** 31 ** D31 + NOT_ON_TIMER, // PC 5 ** 32 ** D32 + NOT_ON_TIMER, // PC 4 ** 33 ** D33 + NOT_ON_TIMER, // PC 3 ** 34 ** D34 + NOT_ON_TIMER, // PC 2 ** 35 ** D35 + NOT_ON_TIMER, // PC 1 ** 36 ** D36 + NOT_ON_TIMER, // PC 0 ** 37 ** D37 + NOT_ON_TIMER, // PD 7 ** 38 ** D38 + NOT_ON_TIMER, // PG 2 ** 39 ** D39 + NOT_ON_TIMER, // PG 1 ** 40 ** D40 + NOT_ON_TIMER, // PG 0 ** 41 ** D41 + NOT_ON_TIMER, // PL 7 ** 42 ** D42 + NOT_ON_TIMER, // PL 6 ** 43 ** D43 + TIMER5C, // PL 5 ** 44 ** D44 + TIMER5B, // PL 4 ** 45 ** D45 + TIMER5A, // PL 3 ** 46 ** D46 + NOT_ON_TIMER, // PL 2 ** 47 ** D47 + NOT_ON_TIMER, // PL 1 ** 48 ** D48 + NOT_ON_TIMER, // PL 0 ** 49 ** D49 + NOT_ON_TIMER, // PB 3 ** 50 ** SPI_MISO + NOT_ON_TIMER, // PB 2 ** 51 ** SPI_MOSI + NOT_ON_TIMER, // PB 1 ** 52 ** SPI_SCK + NOT_ON_TIMER, // PB 0 ** 53 ** SPI_SS + NOT_ON_TIMER, // PF 0 ** 54 ** A0 + NOT_ON_TIMER, // PF 1 ** 55 ** A1 + NOT_ON_TIMER, // PF 2 ** 56 ** A2 + NOT_ON_TIMER, // PF 3 ** 57 ** A3 + NOT_ON_TIMER, // PF 4 ** 58 ** A4 + NOT_ON_TIMER, // PF 5 ** 59 ** A5 + NOT_ON_TIMER, // PF 6 ** 60 ** A6 + NOT_ON_TIMER, // PF 7 ** 61 ** A7 + NOT_ON_TIMER, // PK 0 ** 62 ** A8 + NOT_ON_TIMER, // PK 1 ** 63 ** A9 + NOT_ON_TIMER, // PK 2 ** 64 ** A10 + NOT_ON_TIMER, // PK 3 ** 65 ** A11 + NOT_ON_TIMER, // PK 4 ** 66 ** A12 + NOT_ON_TIMER, // PK 5 ** 67 ** A13 + NOT_ON_TIMER, // PK 6 ** 68 ** A14 + NOT_ON_TIMER, // PK 7 ** 69 ** A15 + NOT_ON_TIMER, // PG 4 ** 70 ** D70 + NOT_ON_TIMER, // PG 3 ** 71 ** D71 + NOT_ON_TIMER, // PJ 2 ** 72 ** D72 + NOT_ON_TIMER, // PJ 3 ** 73 ** D73 + NOT_ON_TIMER, // PJ 7 ** 74 ** D74 + NOT_ON_TIMER, // PJ 4 ** 75 ** D75 + NOT_ON_TIMER, // PJ 5 ** 76 ** D76 + NOT_ON_TIMER, // PJ 6 ** 77 ** D77 + NOT_ON_TIMER, // PE 2 ** 78 ** D78 + NOT_ON_TIMER, // PE 6 ** 79 ** D79 + NOT_ON_TIMER, // PE 7 ** 80 ** D80 + NOT_ON_TIMER, // PD 4 ** 81 ** D81 + NOT_ON_TIMER, // PD 5 ** 82 ** D82 + NOT_ON_TIMER, // PD 6 ** 83 ** D83 + NOT_ON_TIMER, // PH 2 ** 84 ** D84 + NOT_ON_TIMER, // PH 7 ** 85 ** D85 }; #endif diff --git a/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board.cpp b/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board.cpp index 8a4320a664..afaece9760 100644 --- a/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board.cpp +++ b/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board.cpp @@ -131,74 +131,74 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ - {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ + {&gpiod, NULL, NULL, 0, 0, ADCx}, /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx}, /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx}, /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ - {&gpiod, NULL, NULL, 3, 0, ADCx} , /* PD3 FSMC_CLK */ - {&gpiod, NULL, NULL, 4, 0, ADCx} , /* PD4 FSMC_NOE */ - {&gpiod, NULL, NULL, 5, 0, ADCx} , /* PD5 FSMC_NWE */ - {&gpiod, NULL, NULL, 6, 0, ADCx} , /* PD6 FSMC_NWAIT */ - {&gpiod, NULL, NULL, 7, 0, ADCx} , /* PD7 FSMC_NE1/FSMC_NCE2 */ - {&gpiod, NULL, NULL, 8, 0, ADCx} , /* PD8 FSMC_D13 */ - {&gpiod, NULL, NULL, 9, 0, ADCx} , /* PD9 FSMC_D14 */ - {&gpiod, NULL, NULL, 10, 0, ADCx} , /* PD10 FSMC_D15 */ - {&gpiod, NULL, NULL, 11, 0, ADCx} , /* PD11 FSMC_A16 */ - {&gpiod, NULL, NULL, 12, 0, ADCx} , /* PD12 FSMC_A17 */ - {&gpiod, NULL, NULL, 13, 0, ADCx} , /* PD13 FSMC_A18 */ - {&gpiod, NULL, NULL, 14, 0, ADCx} , /* PD14 FSMC_D0 */ - {&gpiod, NULL, NULL, 15, 0, ADCx} , /* PD15 FSMC_D1 */ + {&gpiod, NULL, NULL, 3, 0, ADCx}, /* PD3 FSMC_CLK */ + {&gpiod, NULL, NULL, 4, 0, ADCx}, /* PD4 FSMC_NOE */ + {&gpiod, NULL, NULL, 5, 0, ADCx}, /* PD5 FSMC_NWE */ + {&gpiod, NULL, NULL, 6, 0, ADCx}, /* PD6 FSMC_NWAIT */ + {&gpiod, NULL, NULL, 7, 0, ADCx}, /* PD7 FSMC_NE1/FSMC_NCE2 */ + {&gpiod, NULL, NULL, 8, 0, ADCx}, /* PD8 FSMC_D13 */ + {&gpiod, NULL, NULL, 9, 0, ADCx}, /* PD9 FSMC_D14 */ + {&gpiod, NULL, NULL, 10, 0, ADCx}, /* PD10 FSMC_D15 */ + {&gpiod, NULL, NULL, 11, 0, ADCx}, /* PD11 FSMC_A16 */ + {&gpiod, NULL, NULL, 12, 0, ADCx}, /* PD12 FSMC_A17 */ + {&gpiod, NULL, NULL, 13, 0, ADCx}, /* PD13 FSMC_A18 */ + {&gpiod, NULL, NULL, 14, 0, ADCx}, /* PD14 FSMC_D0 */ + {&gpiod, NULL, NULL, 15, 0, ADCx}, /* PD15 FSMC_D1 */ - {&gpioe, NULL, NULL, 0, 0, ADCx} , /* PE0 */ - {&gpioe, NULL, NULL, 1, 0, ADCx} , /* PE1 */ - {&gpioe, NULL, NULL, 2, 0, ADCx} , /* PE2 */ - {&gpioe, NULL, NULL, 3, 0, ADCx} , /* PE3 */ - {&gpioe, NULL, NULL, 4, 0, ADCx} , /* PE4 */ - {&gpioe, NULL, NULL, 5, 0, ADCx} , /* PE5 */ - {&gpioe, NULL, NULL, 6, 0, ADCx} , /* PE6 */ - {&gpioe, NULL, NULL, 7, 0, ADCx} , /* PE7 */ - {&gpioe, NULL, NULL, 8, 0, ADCx} , /* PE8 */ - {&gpioe, NULL, NULL, 9, 0, ADCx} , /* PE9 */ - {&gpioe, NULL, NULL, 10, 0, ADCx} , /* PE10 */ - {&gpioe, NULL, NULL, 11, 0, ADCx} , /* PE11 */ - {&gpioe, NULL, NULL, 12, 0, ADCx} , /* PE12 */ - {&gpioe, NULL, NULL, 13, 0, ADCx} , /* PE13 */ - {&gpioe, NULL, NULL, 14, 0, ADCx} , /* PE14 */ - {&gpioe, NULL, NULL, 15, 0, ADCx} , /* PE15 */ + {&gpioe, NULL, NULL, 0, 0, ADCx}, /* PE0 */ + {&gpioe, NULL, NULL, 1, 0, ADCx}, /* PE1 */ + {&gpioe, NULL, NULL, 2, 0, ADCx}, /* PE2 */ + {&gpioe, NULL, NULL, 3, 0, ADCx}, /* PE3 */ + {&gpioe, NULL, NULL, 4, 0, ADCx}, /* PE4 */ + {&gpioe, NULL, NULL, 5, 0, ADCx}, /* PE5 */ + {&gpioe, NULL, NULL, 6, 0, ADCx}, /* PE6 */ + {&gpioe, NULL, NULL, 7, 0, ADCx}, /* PE7 */ + {&gpioe, NULL, NULL, 8, 0, ADCx}, /* PE8 */ + {&gpioe, NULL, NULL, 9, 0, ADCx}, /* PE9 */ + {&gpioe, NULL, NULL, 10, 0, ADCx}, /* PE10 */ + {&gpioe, NULL, NULL, 11, 0, ADCx}, /* PE11 */ + {&gpioe, NULL, NULL, 12, 0, ADCx}, /* PE12 */ + {&gpioe, NULL, NULL, 13, 0, ADCx}, /* PE13 */ + {&gpioe, NULL, NULL, 14, 0, ADCx}, /* PE14 */ + {&gpioe, NULL, NULL, 15, 0, ADCx}, /* PE15 */ - {&gpiof, NULL, NULL, 0, 0, ADCx} , /* PF0 */ - {&gpiof, NULL, NULL, 1, 0, ADCx} , /* PF1 */ - {&gpiof, NULL, NULL, 2, 0, ADCx} , /* PF2 */ - {&gpiof, NULL, NULL, 3, 0, ADCx} , /* PF3 */ - {&gpiof, NULL, NULL, 4, 0, ADCx} , /* PF4 */ - {&gpiof, NULL, NULL, 5, 0, ADCx} , /* PF5 */ - {&gpiof, NULL, NULL, 6, 0, ADCx} , /* PF6 */ - {&gpiof, NULL, NULL, 7, 0, ADCx} , /* PF7 */ - {&gpiof, NULL, NULL, 8, 0, ADCx} , /* PF8 */ - {&gpiof, NULL, NULL, 9, 0, ADCx} , /* PF9 */ - {&gpiof, NULL, NULL, 10, 0, ADCx} , /* PF10 */ - {&gpiof, NULL, NULL, 11, 0, ADCx} , /* PF11 */ - {&gpiof, NULL, NULL, 12, 0, ADCx} , /* PF12 */ - {&gpiof, NULL, NULL, 13, 0, ADCx} , /* PF13 */ - {&gpiof, NULL, NULL, 14, 0, ADCx} , /* PF14 */ - {&gpiof, NULL, NULL, 15, 0, ADCx} , /* PF15 */ + {&gpiof, NULL, NULL, 0, 0, ADCx}, /* PF0 */ + {&gpiof, NULL, NULL, 1, 0, ADCx}, /* PF1 */ + {&gpiof, NULL, NULL, 2, 0, ADCx}, /* PF2 */ + {&gpiof, NULL, NULL, 3, 0, ADCx}, /* PF3 */ + {&gpiof, NULL, NULL, 4, 0, ADCx}, /* PF4 */ + {&gpiof, NULL, NULL, 5, 0, ADCx}, /* PF5 */ + {&gpiof, NULL, NULL, 6, 0, ADCx}, /* PF6 */ + {&gpiof, NULL, NULL, 7, 0, ADCx}, /* PF7 */ + {&gpiof, NULL, NULL, 8, 0, ADCx}, /* PF8 */ + {&gpiof, NULL, NULL, 9, 0, ADCx}, /* PF9 */ + {&gpiof, NULL, NULL, 10, 0, ADCx}, /* PF10 */ + {&gpiof, NULL, NULL, 11, 0, ADCx}, /* PF11 */ + {&gpiof, NULL, NULL, 12, 0, ADCx}, /* PF12 */ + {&gpiof, NULL, NULL, 13, 0, ADCx}, /* PF13 */ + {&gpiof, NULL, NULL, 14, 0, ADCx}, /* PF14 */ + {&gpiof, NULL, NULL, 15, 0, ADCx}, /* PF15 */ - {&gpiog, NULL, NULL, 0, 0, ADCx} , /* PG0 */ - {&gpiog, NULL, NULL, 1, 0, ADCx} , /* PG1 */ - {&gpiog, NULL, NULL, 2, 0, ADCx} , /* PG2 */ - {&gpiog, NULL, NULL, 3, 0, ADCx} , /* PG3 */ - {&gpiog, NULL, NULL, 4, 0, ADCx} , /* PG4 */ - {&gpiog, NULL, NULL, 5, 0, ADCx} , /* PG5 */ - {&gpiog, NULL, NULL, 6, 0, ADCx} , /* PG6 */ - {&gpiog, NULL, NULL, 7, 0, ADCx} , /* PG7 */ - {&gpiog, NULL, NULL, 8, 0, ADCx} , /* PG8 */ - {&gpiog, NULL, NULL, 9, 0, ADCx} , /* PG9 */ - {&gpiog, NULL, NULL, 10, 0, ADCx} , /* PG10 */ - {&gpiog, NULL, NULL, 11, 0, ADCx} , /* PG11 */ - {&gpiog, NULL, NULL, 12, 0, ADCx} , /* PG12 */ - {&gpiog, NULL, NULL, 13, 0, ADCx} , /* PG13 */ - {&gpiog, NULL, NULL, 14, 0, ADCx} , /* PG14 */ - {&gpiog, NULL, NULL, 15, 0, ADCx} /* PG15 */ + {&gpiog, NULL, NULL, 0, 0, ADCx}, /* PG0 */ + {&gpiog, NULL, NULL, 1, 0, ADCx}, /* PG1 */ + {&gpiog, NULL, NULL, 2, 0, ADCx}, /* PG2 */ + {&gpiog, NULL, NULL, 3, 0, ADCx}, /* PG3 */ + {&gpiog, NULL, NULL, 4, 0, ADCx}, /* PG4 */ + {&gpiog, NULL, NULL, 5, 0, ADCx}, /* PG5 */ + {&gpiog, NULL, NULL, 6, 0, ADCx}, /* PG6 */ + {&gpiog, NULL, NULL, 7, 0, ADCx}, /* PG7 */ + {&gpiog, NULL, NULL, 8, 0, ADCx}, /* PG8 */ + {&gpiog, NULL, NULL, 9, 0, ADCx}, /* PG9 */ + {&gpiog, NULL, NULL, 10, 0, ADCx}, /* PG10 */ + {&gpiog, NULL, NULL, 11, 0, ADCx}, /* PG11 */ + {&gpiog, NULL, NULL, 12, 0, ADCx}, /* PG12 */ + {&gpiog, NULL, NULL, 13, 0, ADCx}, /* PG13 */ + {&gpiog, NULL, NULL, 14, 0, ADCx}, /* PG14 */ + {&gpiog, NULL, NULL, 15, 0, ADCx} /* PG15 */ }; /* Basically everything that is defined as having a timer us PWM */ diff --git a/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board.cpp b/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board.cpp index 5ddeb1f1d9..332c9f005e 100644 --- a/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board.cpp +++ b/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board.cpp @@ -132,9 +132,9 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ - {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ + {&gpiod, NULL, NULL, 0, 0, ADCx}, /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx}, /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx}, /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ }; /* Basically everything that is defined as having a timer us PWM */ diff --git a/buildroot/share/scripts/createTemperatureLookupMarlin.py b/buildroot/share/scripts/createTemperatureLookupMarlin.py index eb8c094957..5515681bfc 100755 --- a/buildroot/share/scripts/createTemperatureLookupMarlin.py +++ b/buildroot/share/scripts/createTemperatureLookupMarlin.py @@ -141,7 +141,7 @@ def main(argv): for temp in temps: adc = t.adc(temp) - print(" { OV(%7.2f), %4s }%s // v=%.3f\tr=%.3f\tres=%.3f degC/count" % (adc , temp, \ + print(" { OV(%7.2f), %4s }%s // v=%.3f\tr=%.3f\tres=%.3f degC/count" % (adc, temp, \ ',' if temp != temps[-1] else ' ', \ t.voltage(adc), \ t.resist( adc), \ diff --git a/buildroot/share/scripts/findMissingTranslations.sh b/buildroot/share/scripts/findMissingTranslations.sh index 366075d5b9..115c2b67df 100755 --- a/buildroot/share/scripts/findMissingTranslations.sh +++ b/buildroot/share/scripts/findMissingTranslations.sh @@ -71,11 +71,11 @@ for WORD in $(awk '/LSTR/{print $2}' language_en.h); do # Find all selected languages that lack the string LANG_MISSING=" " for LANG in $TEST_LANGS; do - if [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${LANG}.h) -eq 0 ]]; then + if [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${LANG}.h 2>/dev/null) -eq 0 ]]; then INHERIT=$(awk '/using namespace/{print $3}' language_${LANG}.h | sed -E 's/Language_([a-zA-Z_]+)\s*;/\1/') if [[ -z $INHERIT || $INHERIT == "en" ]]; then LANG_MISSING+="$LANG " - elif [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${INHERIT}.h) -eq 0 ]]; then + elif [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${INHERIT}.h 2>/dev/null) -eq 0 ]]; then LANG_MISSING+="$LANG " fi fi diff --git a/buildroot/tests/BTT_GTR_V1_0 b/buildroot/tests/BTT_GTR_V1_0 index c6cb7d5feb..e40f3ffa53 100755 --- a/buildroot/tests/BTT_GTR_V1_0 +++ b/buildroot/tests/BTT_GTR_V1_0 @@ -36,7 +36,7 @@ opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 SERIAL_PORT -1 \ EXTRUDERS 3 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 \ SERVO1_PIN PE9 SERVO2_PIN PE11 \ SERVO_DELAY '{ 300, 300, 300 }' \ - SWITCHING_TOOLHEAD_X_POS '{ 215, 0 ,0 }' \ + SWITCHING_TOOLHEAD_X_POS '{ 215, 0, 0 }' \ MPC_HEATER_POWER '{ 40.0f, 40.0f, 40.0f }' \ MPC_BLOCK_HEAT_CAPACITY '{ 16.7f, 16.7f, 16.7f }' \ MPC_SENSOR_RESPONSIVENESS '{ 0.22f, 0.22f, 0.22f }' \ diff --git a/buildroot/tests/FYSETC_F6 b/buildroot/tests/FYSETC_F6 index 6dd7bb60fa..4c647d57d4 100755 --- a/buildroot/tests/FYSETC_F6 +++ b/buildroot/tests/FYSETC_F6 @@ -13,6 +13,13 @@ restore_configs opt_set MOTHERBOARD BOARD_FYSETC_F6_13 LCD_SERIAL_PORT 1 DGUS_LCD_UI FYSETC exec_test $1 $2 "DGUS (FYSETC)" "$3" +# +# Test DGUS_LCD_UI MKS +# +restore_configs +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 LCD_SERIAL_PORT 1 DGUS_LCD_UI MKS +exec_test $1 $2 "DGUS (MKS)" "$3" + # # Test DGUS_LCD_UI RELOADED # diff --git a/buildroot/tests/GD32F103RC_aquila_mfl b/buildroot/tests/GD32F103RC_aquila_mfl new file mode 100755 index 0000000000..ca7cd05936 --- /dev/null +++ b/buildroot/tests/GD32F103RC_aquila_mfl @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for GD32F103RC_aquila_mfl +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_AQUILA_V101_GD32_MFL SERIAL_PORT 0 +opt_enable EEPROM_SETTINGS SDSUPPORT EMERGENCY_PARSER FAN_SOFT_PWM PINS_DEBUGGING +opt_add NO_CREALITY_422_DRIVER_WARNING +opt_add NO_AUTO_ASSIGN_WARNING +exec_test $1 $2 "Aquila v1.0.1 MFL GD32 Default Configuration" "$3" + +# cleanup +restore_configs diff --git a/buildroot/tests/GD32F303RE_creality_mfl b/buildroot/tests/GD32F303RE_creality_mfl new file mode 100755 index 0000000000..6e0b9ff866 --- /dev/null +++ b/buildroot/tests/GD32F303RE_creality_mfl @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for GD32F303RE_creality_mfl +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_CREALITY_V422_GD32_MFL SERIAL_PORT 0 +opt_enable EEPROM_SETTINGS SDSUPPORT EMERGENCY_PARSER FAN_SOFT_PWM PINS_DEBUGGING +opt_add NO_CREALITY_422_DRIVER_WARNING +opt_add NO_AUTO_ASSIGN_WARNING +exec_test $1 $2 "Creality V4.2.2 MFL GD32 Default Configuration" "$3" + +# cleanup +restore_configs diff --git a/buildroot/tests/LPC1769 b/buildroot/tests/LPC1769 index ad14e3353d..f29bbb5656 100755 --- a/buildroot/tests/LPC1769 +++ b/buildroot/tests/LPC1769 @@ -15,7 +15,7 @@ exec_test $1 $2 "Azteeg X5GT Example Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD \ EXTRUDERS 2 TEMP_SENSOR_0 -5 TEMP_SENSOR_1 -4 TEMP_SENSOR_BED 5 TEMP_0_CS_PIN P1_29 \ - GRID_MAX_POINTS_X 16 \ + MAG_MOUNTED_PROBE_SERVO_NR 0 GRID_MAX_POINTS_X 16 \ NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING REPORT_ADAPTIVE_FAN_SLOWING TEMP_TUNING_MAINTAIN_FAN \ @@ -46,7 +46,7 @@ opt_set MOTHERBOARD BOARD_COHESION3D_REMIX \ TEMP_SENSOR_0 1 \ X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2130 Z_DRIVER_TYPE TMC2130 I_DRIVER_TYPE TB6560 \ DEFAULT_AXIS_STEPS_PER_UNIT '{ 80, 80, 400, 500, 80 }' \ - DEFAULT_MAX_FEEDRATE '{ 300, 300, 5, 25, 300 }' \ + DEFAULT_MAX_FEEDRATE '{ 187, 187, 5, 25, 187 }' \ DEFAULT_MAX_ACCELERATION '{ 3000, 3000, 100, 10000, 3000 }' \ MANUAL_FEEDRATE '{ 50*60, 50*60, 4*60, 2*60, 50*60 }' \ AXIS_RELATIVE_MODES '{ false, false, false, false, false }' \ diff --git a/buildroot/tests/STM32F103RC_btt b/buildroot/tests/STM32F103RC_btt index 178170455f..2b05d42922 100755 --- a/buildroot/tests/STM32F103RC_btt +++ b/buildroot/tests/STM32F103RC_btt @@ -11,8 +11,9 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 SERIAL_PORT 1 SERIAL_PORT_2 -1 \ - X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 -opt_enable CR10_STOCKDISPLAY PINS_DEBUGGING Z_IDLE_HEIGHT \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 \ + X_CURRENT_HOME X_CURRENT/2 Y_CURRENT_HOME Y_CURRENT/2 Z_CURRENT_HOME Y_CURRENT/2 +opt_enable CR10_STOCKDISPLAY PINS_DEBUGGING Z_IDLE_HEIGHT EDITABLE_HOMING_CURRENT \ FT_MOTION FT_MOTION_MENU BIQU_MICROPROBE_V1 PROBE_ENABLE_DISABLE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR \ ADAPTIVE_STEP_SMOOTHING NONLINEAR_EXTRUSION exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - TMC2209 HW Serial, FT_MOTION" "$3" diff --git a/buildroot/tests/STM32H743VI_btt b/buildroot/tests/STM32H743VI_btt index e73a786ff4..7ca63aa53a 100755 --- a/buildroot/tests/STM32H743VI_btt +++ b/buildroot/tests/STM32H743VI_btt @@ -12,6 +12,7 @@ set -e # restore_configs use_example_configs "Creality/Ender-5 Plus/BigTreeTech SKR 3" +opt_set DEFAULT_MAX_FEEDRATE '{ 6250, 6250, 15, 5375 }' exec_test $1 $2 "Creality Ender-5 Plus with BigTreeTech SKR 3" "$3" diff --git a/buildroot/tests/mega1280 b/buildroot/tests/mega1280 index 1b1a8f86b7..6d703ac8f6 100755 --- a/buildroot/tests/mega1280 +++ b/buildroot/tests/mega1280 @@ -19,7 +19,8 @@ restore_configs opt_set LCD_LANGUAGE an \ POWER_MONITOR_CURRENT_PIN 14 POWER_MONITOR_VOLTAGE_PIN 15 \ CLOSED_LOOP_ENABLE_PIN 44 CLOSED_LOOP_MOVE_COMPLETE_PIN 45 -opt_enable SPINDLE_FEATURE ULTIMAKERCONTROLLER LCD_BED_LEVELING EDITABLE_HOMING_FEEDRATE \ +opt_enable SPINDLE_FEATURE DEFAULT_ACCELERATION_SPINDLE \ + ULTIMAKERCONTROLLER LCD_BED_LEVELING EDITABLE_HOMING_FEEDRATE \ EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ SENSORLESS_BACKOFF_MM HOMING_BACKOFF_POST_MM HOME_Y_BEFORE_X CODEPENDENT_XY_HOMING \ MESH_BED_LEVELING ENABLE_LEVELING_FADE_HEIGHT MESH_G28_REST_ORIGIN \ diff --git a/buildroot/tests/sanguino1284p b/buildroot/tests/sanguino1284p index 345383cc70..0e861892d8 100755 --- a/buildroot/tests/sanguino1284p +++ b/buildroot/tests/sanguino1284p @@ -14,7 +14,7 @@ opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 \ LCD_LANGUAGE de \ CONTROLLER_FAN_PIN 27 opt_enable MINIPANEL USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE -exec_test $1 $2 "Default Configuration | MINIPANAL | CONTROLLER_FAN" "$3" +exec_test $1 $2 "Default Configuration | MINIPANEL | CONTROLLER_FAN" "$3" # # Start with default configurations... diff --git a/docs/Cutter.md b/docs/Cutter.md index 8f4b7e67aa..207036c6e8 100644 --- a/docs/Cutter.md +++ b/docs/Cutter.md @@ -4,7 +4,7 @@ With Marlin version 2.0.9.x or higher, Laser improvements were introduced that e ### Architecture -Laser selectable feature capability is defined through 4 global mode flags within G-code ,laser/spindle, planner and stepper routines. The default mode maintains the standard laser function. G-Codes are received, processed and parsed to determine what mode to set through M3, M4 and M5 commands. When the inline mode parameter set is detected, laser power processing will be driven through the planner and stepper routines. Handling of the initial power values and settings are performed by G-Code parsing and the laser/spindle routines. +Laser selectable feature capability is defined through 4 global mode flags within G-code, laser/spindle, planner and stepper routines. The default mode maintains the standard laser function. G-Codes are received, processed and parsed to determine what mode to set through M3, M4 and M5 commands. When the inline mode parameter set is detected, laser power processing will be driven through the planner and stepper routines. Handling of the initial power values and settings are performed by G-Code parsing and the laser/spindle routines. Inline power feeds from the block->inline_power variable into the planner's laser.power when in continuous power mode. Further power adjustment will be applied if the laser power trap feature is active otherwise laser.power is used as set in the stepper for the entire block. When laser power trap is active the power levels are step incremented during acceleration and step decremented during deceleration. diff --git a/ini/esp32.ini b/ini/esp32.ini index 4afaeaa030..f40b37ef14 100644 --- a/ini/esp32.ini +++ b/ini/esp32.ini @@ -45,7 +45,7 @@ extends = env:esp32 board = marlin_MKS_TinyBee platform = espressif32@~3.5.0 board_build.partitions = default_8MB.csv -build_src_flags = -O3 -Wno-volatile +build_src_flags = -O3 monitor_filters = esp32_exception_decoder [env:godi_esp32] diff --git a/ini/features.ini b/ini/features.ini index 1e7f2ecb68..8de061d1b1 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -23,6 +23,7 @@ MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/marlin-2.1.3.x.zip build_src_filter=+ + + + + HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+ +EDITABLE_HOMING_CURRENT = build_src_filter=+ SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/6f53c19a8a.zip HAS_MOTOR_CURRENT_(I2C|DAC|SPI|PWM) = build_src_filter=+ HAS_MOTOR_CURRENT_I2C = SlowSoftI2CMaster @@ -375,7 +376,7 @@ IS_SCARA = build_src_filter=+ + MORGAN_SCARA = build_src_filter=+ HAS_MICROSTEPS = build_src_filter=+ -(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer +(ESP3D_)?WIFISUPPORT = esp32async/AsyncTCP@3.3.3, mathieucarbou/ESP Async WebServer@3.0.6 ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/dc0f3d96c6.zip arduinoWebSockets=links2004/WebSockets@2.3.4 luc-github/ESP32SSDP@1.1.1 diff --git a/ini/gd32.ini b/ini/gd32.ini new file mode 100644 index 0000000000..e983f496ec --- /dev/null +++ b/ini/gd32.ini @@ -0,0 +1,65 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +#################################### +# +# HAL/MFL GD32 Environments +# +#################################### + +[gd32_base] +platform = https://github.com/bmourit/platform-mfl/archive/refs/tags/V1.0.2.zip +board_build.core = gd32 +build_src_filter = ${common.default_src_filter} + + +build_unflags = -std=gnu++11 -std=gnu++14 -std=gnu++17 +build_flags = -std=gnu++23 + -DARDUINO_ARCH_MFL + -DPLATFORM_M997_SUPPORT + -DTIMER_IRQ_PRIORITY=12 + -DADC_RESOLUTION=12 + -DCORE_DEBUG + -Wno-deprecated-declarations +extra_scripts = ${common.extra_scripts} + +# +# Creality (GD32F303RE) +# +[env:GD32F303RE_creality_mfl] +extends = gd32_base +board = mfl_creality_422 +board_build.offset = 0x7000 +board_upload.offset_address = 0x08007000 +board_build.rename = firmware-{time}.bin +build_flags = ${gd32_base.build_flags} + -DMCU_GD32F303RE + -DGD32F303RE + -DTIMER_TONE=2 + -DSS_TIMER=3 + -DTIMER_SERVO=4 + -DTRANSFER_CLOCK_DIV=8 + -fsingle-precision-constant +extra_scripts = ${gd32_base.extra_scripts} + buildroot/share/PlatformIO/scripts/offset_and_rename.py +monitor_speed = 115200 + +# +# Aquila v1.0.1 (GD32F103RC) +# +[env:GD32F103RC_aquila_mfl] +extends = gd32_base +board = mfl_aquila +board_build.offset = 0x7000 +board_upload.offset_address = 0x08007000 +board_build.rename = firmware-{time}.bin +build_flags = ${gd32_base.build_flags} + -DMCU_GD32F103RC + -DGD32F103RC + -DTIMER_TONE=2 + -DSS_TIMER=3 + -DTIMER_SERVO=4 + -DTRANSFER_CLOCK_DIV=8 +extra_scripts = ${gd32_base.extra_scripts} + buildroot/share/PlatformIO/scripts/offset_and_rename.py +monitor_speed = 115200 diff --git a/ini/hc32.ini b/ini/hc32.ini index a99614beec..8a55e3b495 100644 --- a/ini/hc32.ini +++ b/ini/hc32.ini @@ -33,12 +33,12 @@ platform_packages = framework-hc32f46x-ddl@https://github.com/shadow578/framewor board = generic_hc32f460 build_src_filter = ${common.default_src_filter} + + build_type = release -build_flags = -D ARDUINO_ARCH_HC32 - -D PLATFORM_M997_SUPPORT # Enable M997 command - # NOTE: DDL and Arduino debug mode are - # automatically enabled with MARLIN_DEV_MODE - #-D __DEBUG # force DDL debug mode - #-D __CORE_DEBUG # force Arduino core debug mode +build_flags = -DARDUINO_ARCH_HC32 + -DPLATFORM_M997_SUPPORT # Enable M997 command + # NOTE: DDL and Arduino debug mode are + # automatically enabled with MARLIN_DEV_MODE + #-D__DEBUG # force DDL debug mode + #-D__CORE_DEBUG # force Arduino core debug mode # HC32 app configuration file board_build.app_config = Marlin/src/HAL/HC32/app_config.h diff --git a/platformio.ini b/platformio.ini index ed1670dc6d..d69fdc6cea 100644 --- a/platformio.ini +++ b/platformio.ini @@ -22,6 +22,7 @@ extra_configs = ini/esp32.ini ini/features.ini ini/hc32.ini + ini/gd32.ini ini/lpc176x.ini ini/native.ini ini/samd21.ini