diff --git a/.circleci/config.yml b/.circleci/config.yml
index cb8c31b22b..d474f034ba 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -51,8 +51,8 @@ jobs:
export PATH=`pwd`/buildroot/bin/:${PATH}
# Generate custom version include
- generate_version ./Marlin/src/inc
- cat ./Marlin/src/inc/_Version.h
+ generate_version ./Marlin/
+ cat ./Marlin/Version.h
#
# Back up pins_RAMPS.h
#
@@ -240,10 +240,10 @@ jobs:
build_marlin_pio ./ ${TEST_PLATFORM}
restore_configs
echo testing STM32F1 targets...
- export TEST_PLATFORM="-e STM32F103R"
+ export TEST_PLATFORM="-e STM32F103RE"
restore_configs
- echo use_example_configs STM32/STM32F103R
- use_example_configs STM32/STM32F103R
+ echo use_example_configs STM32/STM32F103RE
+ use_example_configs STM32/STM32F103RE
build_marlin_pio ./ ${TEST_PLATFORM}
restore_configs
echo use_example_configs STM32/stm32f103ret6
diff --git a/.travis.yml b/.travis.yml
index cfd6a67556..d3acf40cbf 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,10 +13,8 @@ env:
- TEST_PLATFORM="DUE"
- TEST_PLATFORM="esp32"
- TEST_PLATFORM="linux_native"
- - TEST_PLATFORM="LPC1768"
- - TEST_PLATFORM="LPC1769"
- TEST_PLATFORM="megaatmega2560"
- - TEST_PLATFORM="STM32F103R"
+ - TEST_PLATFORM="STM32F103RE"
- TEST_PLATFORM="teensy31"
- TEST_PLATFORM="teensy35"
@@ -31,22 +29,27 @@ env:
- TEST_PLATFORM="ARMED"
- TEST_PLATFORM="BIGTREE_BTT002"
- TEST_PLATFORM="BIGTREE_SKR_PRO"
- - TEST_PLATFORM="STM32F103R_bigtree"
+ - TEST_PLATFORM="STM32F103RC_bigtree"
- TEST_PLATFORM="jgaurora_a5s_a1"
- - TEST_PLATFORM="STM32F103V_longer"
+ - TEST_PLATFORM="STM32F103VE_longer"
- TEST_PLATFORM="STM32F407VE_black"
+ - TEST_PLATFORM="mks_robin"
+
+ # Put lengthy tests last
+ - TEST_PLATFORM="LPC1768"
+ - TEST_PLATFORM="LPC1769"
# Non-working environment tests
#- TEST_PLATFORM="at90usb1286_cdc"
#- TEST_PLATFORM="at90usb1286_dfu"
- #- TEST_PLATFORM="malyanm200"
- #- TEST_PLATFORM="mks_robin"
+ #- TEST_PLATFORM="STM32F103CB_malyan"
#- TEST_PLATFORM="mks_robin_lite"
#- TEST_PLATFORM="mks_robin_mini"
#- TEST_PLATFORM="mks_robin_nano"
#- TEST_PLATFORM="SAMD51_grandcentral_m4"
- #- TEST_PLATFORM="STM32F103R_bigtree"
- #- TEST_PLATFORM="STM32F103R_fysetc"
+ #- TEST_PLATFORM="STM32F103RC_bigtree"
+ #- TEST_PLATFORM="STM32F103RC_bigtree_USB"
+ #- TEST_PLATFORM="STM32F103RC_fysetc"
#- TEST_PLATFORM="STM32F4"
#- TEST_PLATFORM="STM32F7"
@@ -72,8 +75,8 @@ before_script:
- cd ${TRAVIS_BUILD_DIR}
#
# Generate custom version include
- - generate_version ${TRAVIS_BUILD_DIR}/Marlin/src/inc
- - cat ${TRAVIS_BUILD_DIR}/Marlin/src/inc/_Version.h
+ - generate_version ${TRAVIS_BUILD_DIR}/Marlin/
+ - cat ${TRAVIS_BUILD_DIR}/Marlin/Version.h
#
script:
- run_tests ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM}
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 0ea7198b3b..1d86709d9f 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -1,6 +1,6 @@
//#define PetsfangMicroswiss
//#define BondtechBMG
-//#define CR10SPro_GearedExtruder
+#define CR10SPro_GearedExtruder
//#define E3DV6
//#define FilamentSensorStd
@@ -95,6 +95,7 @@
// Author info of this build printed to the host during boot and M115
#define STRING_CONFIG_H_AUTHOR "Tinymachines3D" // Who made the changes.
+#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes)
/**
* *** VENDORS PLEASE READ ***
@@ -412,6 +413,7 @@
* 67 : 450C thermistor from SliceEngineering
* 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor
+ * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines)
*
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID)
@@ -429,8 +431,6 @@
* Use these for Testing or Development purposes. NEVER for production machine.
* 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below.
* 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below.
- *
- * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" }
*/
#if ENABLED(E3DV6)
#define TEMP_SENSOR_0 5
@@ -558,7 +558,7 @@
#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current
#if ENABLED(PIDTEMPBED)
-
+ //#define MIN_BED_POWER 0
//#define PID_BED_DEBUG // Sends debug data to the serial port.
//120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
@@ -817,7 +817,12 @@
* Override with M203
* X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]]
*/
-#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 }
+#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 70 }
+
+#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2
+#if ENABLED(LIMITED_MAX_FR_EDITING)
+ #define MAX_FEEDRATE_EDIT_VALUES { 1000, 1000, 10, 150 } // ...or, set your own edit limits
+#endif
/**
* Default Max Acceleration (change/s) change = mm/s
@@ -827,6 +832,11 @@
*/
#define DEFAULT_MAX_ACCELERATION { 4000, 2000, 100, 2000 }
+#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2
+#if ENABLED(LIMITED_MAX_ACCEL_EDITING)
+ #define MAX_ACCEL_EDIT_VALUES { 7000, 4000, 200, 5000 } // ...or, set your own edit limits
+#endif
+
/**
* Default Acceleration (change/s) change = mm/s
* Override with M204
@@ -840,35 +850,38 @@
#define DEFAULT_TRAVEL_ACCELERATION 2000 // X, Y, Z acceleration for travel (non printing) moves
/**
- * Junction Deviation
- *
- * Use Junction Deviation instead of traditional Jerk Limiting
- *
- * See:
- * https://reprap.org/forum/read.php?1,739819
- * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html
- */
-#define JUNCTION_DEVIATION
-#if ENABLED(JUNCTION_DEVIATION)
- #define JUNCTION_DEVIATION_MM 0.06 // (mm) Distance from real junction edge
-#endif
-
-/**
- * Default Jerk (mm/s)
+ * Default Jerk limits (mm/s)
* Override with M205 X Y Z E
*
* "Jerk" specifies the minimum speed change that requires acceleration.
* When changing speed and direction, if the difference is less than the
* value set here, it may happen instantaneously.
*/
-#if DISABLED(JUNCTION_DEVIATION)
+//#define CLASSIC_JERK
+#if ENABLED(CLASSIC_JERK)
#define DEFAULT_XJERK 10.0
#define DEFAULT_YJERK 10.0
#define DEFAULT_ZJERK 0.3
+
+ //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2
+ #if ENABLED(LIMITED_JERK_EDITING)
+ #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits
+ #endif
#endif
#define DEFAULT_EJERK 5.0 // May be used by Linear Advance
+/**
+ * Junction Deviation Factor
+ *
+ * See:
+ * https://reprap.org/forum/read.php?1,739819
+ * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html
+ */
+#if DISABLED(CLASSIC_JERK)
+ #define JUNCTION_DEVIATION_MM 0.06 // (mm) Distance from real junction edge
+#endif
+
/**
* S-Curve Acceleration
*
@@ -1691,10 +1704,10 @@
*
* Select the language to display on the LCD. These languages are available:
*
- * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana,
- * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test
+ * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana,
+ * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test
*
- * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' }
+ * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' }
*/
#define LCD_LANGUAGE en
@@ -1744,8 +1757,8 @@
* Enable one of the following items for a slower SPI transfer speed.
* This may be required to resolve "volume init" errors.
*/
-#define SPI_SPEED SPI_HALF_SPEED
-//#define SPI_SPEED SPI_QUARTER_SPEED
+//#define SPI_SPEED SPI_HALF_SPEED
+#define SPI_SPEED SPI_QUARTER_SPEED
//#define SPI_SPEED SPI_EIGHTH_SPEED
/**
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index b347d15614..543f204200 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -379,6 +379,7 @@
#define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW
#define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on
#define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin)
+ //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm
//#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu
//#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting.
//#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED.
@@ -607,12 +608,26 @@
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
// Define probe X and Y positions for Z1, Z2 [, Z3]
#if ENABLED(SX2)
- #define Z_STEPPER_ALIGN_X { 50, 225 }
- #define Z_STEPPER_ALIGN_Y { 100, 100 }
+ #define Z_STEPPER_ALIGN_XY { { 50, 100 }, { 225, 100 } }
#else
- #define Z_STEPPER_ALIGN_X { 50, 350 }
- #define Z_STEPPER_ALIGN_Y { 200, 200 }
+ #define Z_STEPPER_ALIGN_XY { { 50, 200 }, { 350, 200 } }
#endif
+
+ // Provide Z stepper positions for more rapid convergence in bed alignment.
+ // Currently requires triple stepper drivers.
+ //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS
+ #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
+ // Define Stepper XY positions for Z1, Z2, Z3 corresponding to
+ // the Z screw positions in the bed carriage.
+ // Define one position per Z stepper in stepper driver order.
+ #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } }
+ #else
+ // Amplification factor. Used to scale the correction step up or down.
+ // In case the stepper (spindle) position is further out than the test point.
+ // Use a value > 1. NOTE: This may cause instability
+ #define Z_STEPPER_ALIGN_AMP 1.0
+ #endif
+
// Set number of iterations to align
#define Z_STEPPER_ALIGN_ITERATIONS 6
// Enable to restore leveling setup after operation
@@ -621,10 +636,6 @@
// On a 300mm bed a 5% grade would give a misalignment of ~1.5cm
#define G34_MAX_GRADE 15 // (%) Maximum incline G34 will handle
- // Use the amplification factor to de-/increase correction step.
- // In case the stepper (spindle) position is further out than the test point
- // Use a value > 1. NOTE: This may cause instability
- #define Z_STEPPER_ALIGN_AMP 1.0
// Stop criterion. If the accuracy is better than this stop iterating early
#define Z_STEPPER_ALIGN_ACC 0.02
#endif
@@ -899,6 +910,11 @@
// Add an 'M73' G-code to set the current percentage
//#define LCD_SET_PROGRESS_MANUALLY
+#if HAS_PRINT_PROGRESS
+ //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only)
+ //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only)
+#endif
+
#if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS
//#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing
#if ENABLED(LCD_PROGRESS_BAR)
@@ -1816,91 +1832,91 @@
#define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current.
#define X_MICROSTEPS 16 // 0..256
#define X_RSENSE 0.11
- #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ...
+ #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ...
#endif
#if AXIS_IS_TMC(X2)
#define X2_CURRENT 800
#define X2_MICROSTEPS 16
#define X2_RSENSE 0.11
- #define X2_CHAIN_POS 0
+ #define X2_CHAIN_POS -1
#endif
#if AXIS_IS_TMC(Y)
#define Y_CURRENT 800
#define Y_MICROSTEPS 16
#define Y_RSENSE 0.11
- #define Y_CHAIN_POS 0
+ #define Y_CHAIN_POS -1
#endif
#if AXIS_IS_TMC(Y2)
#define Y2_CURRENT 800
#define Y2_MICROSTEPS 16
#define Y2_RSENSE 0.11
- #define Y2_CHAIN_POS 0
+ #define Y2_CHAIN_POS -1
#endif
#if AXIS_IS_TMC(Z)
#define Z_CURRENT 800
#define Z_MICROSTEPS 16
#define Z_RSENSE 0.11
- #define Z_CHAIN_POS 0
+ #define Z_CHAIN_POS -1
#endif
#if AXIS_IS_TMC(Z2)
#define Z2_CURRENT 800
#define Z2_MICROSTEPS 16
#define Z2_RSENSE 0.11
- #define Z2_CHAIN_POS 0
+ #define Z2_CHAIN_POS -1
#endif
#if AXIS_IS_TMC(Z3)
#define Z3_CURRENT 800
#define Z3_MICROSTEPS 16
#define Z3_RSENSE 0.11
- #define Z3_CHAIN_POS 0
+ #define Z3_CHAIN_POS -1
#endif
#if AXIS_IS_TMC(E0)
#define E0_CURRENT 800
#define E0_MICROSTEPS 16
#define E0_RSENSE 0.11
- #define E0_CHAIN_POS 0
+ #define E0_CHAIN_POS -1
#endif
#if AXIS_IS_TMC(E1)
#define E1_CURRENT 800
#define E1_MICROSTEPS 16
#define E1_RSENSE 0.11
- #define E1_CHAIN_POS 0
+ #define E1_CHAIN_POS -1
#endif
#if AXIS_IS_TMC(E2)
#define E2_CURRENT 800
#define E2_MICROSTEPS 16
#define E2_RSENSE 0.11
- #define E2_CHAIN_POS 0
+ #define E2_CHAIN_POS -1
#endif
#if AXIS_IS_TMC(E3)
#define E3_CURRENT 800
#define E3_MICROSTEPS 16
#define E3_RSENSE 0.11
- #define E3_CHAIN_POS 0
+ #define E3_CHAIN_POS -1
#endif
#if AXIS_IS_TMC(E4)
#define E4_CURRENT 800
#define E4_MICROSTEPS 16
#define E4_RSENSE 0.11
- #define E4_CHAIN_POS 0
+ #define E4_CHAIN_POS -1
#endif
#if AXIS_IS_TMC(E5)
#define E5_CURRENT 800
#define E5_MICROSTEPS 16
#define E5_RSENSE 0.11
- #define E5_CHAIN_POS 0
+ #define E5_CHAIN_POS -1
#endif
/**
@@ -2126,7 +2142,7 @@
#define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down)
#define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down)
#define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper
- #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI
+ #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI)
#endif
#if AXIS_DRIVER_TYPE_X2(L6470)
@@ -2134,7 +2150,7 @@
#define X2_OVERCURRENT 2000
#define X2_STALLCURRENT 1500
#define X2_MAX_VOLTAGE 127
- #define X2_CHAIN_POS 0
+ #define X2_CHAIN_POS -1
#endif
#if AXIS_DRIVER_TYPE_Y(L6470)
@@ -2142,7 +2158,7 @@
#define Y_OVERCURRENT 2000
#define Y_STALLCURRENT 1500
#define Y_MAX_VOLTAGE 127
- #define Y_CHAIN_POS 0
+ #define Y_CHAIN_POS -1
#endif
#if AXIS_DRIVER_TYPE_Y2(L6470)
@@ -2150,7 +2166,7 @@
#define Y2_OVERCURRENT 2000
#define Y2_STALLCURRENT 1500
#define Y2_MAX_VOLTAGE 127
- #define Y2_CHAIN_POS 0
+ #define Y2_CHAIN_POS -1
#endif
#if AXIS_DRIVER_TYPE_Z(L6470)
@@ -2158,7 +2174,7 @@
#define Z_OVERCURRENT 2000
#define Z_STALLCURRENT 1500
#define Z_MAX_VOLTAGE 127
- #define Z_CHAIN_POS 0
+ #define Z_CHAIN_POS -1
#endif
#if AXIS_DRIVER_TYPE_Z2(L6470)
@@ -2166,7 +2182,7 @@
#define Z2_OVERCURRENT 2000
#define Z2_STALLCURRENT 1500
#define Z2_MAX_VOLTAGE 127
- #define Z2_CHAIN_POS 0
+ #define Z2_CHAIN_POS -1
#endif
#if AXIS_DRIVER_TYPE_Z3(L6470)
@@ -2174,7 +2190,7 @@
#define Z3_OVERCURRENT 2000
#define Z3_STALLCURRENT 1500
#define Z3_MAX_VOLTAGE 127
- #define Z3_CHAIN_POS 0
+ #define Z3_CHAIN_POS -1
#endif
#if AXIS_DRIVER_TYPE_E0(L6470)
@@ -2182,7 +2198,7 @@
#define E0_OVERCURRENT 2000
#define E0_STALLCURRENT 1500
#define E0_MAX_VOLTAGE 127
- #define E0_CHAIN_POS 0
+ #define E0_CHAIN_POS -1
#endif
#if AXIS_DRIVER_TYPE_E1(L6470)
@@ -2190,7 +2206,7 @@
#define E1_OVERCURRENT 2000
#define E1_STALLCURRENT 1500
#define E1_MAX_VOLTAGE 127
- #define E1_CHAIN_POS 0
+ #define E1_CHAIN_POS -1
#endif
#if AXIS_DRIVER_TYPE_E2(L6470)
@@ -2198,7 +2214,7 @@
#define E2_OVERCURRENT 2000
#define E2_STALLCURRENT 1500
#define E2_MAX_VOLTAGE 127
- #define E2_CHAIN_POS 0
+ #define E2_CHAIN_POS -1
#endif
#if AXIS_DRIVER_TYPE_E3(L6470)
@@ -2206,7 +2222,7 @@
#define E3_OVERCURRENT 2000
#define E3_STALLCURRENT 1500
#define E3_MAX_VOLTAGE 127
- #define E3_CHAIN_POS 0
+ #define E3_CHAIN_POS -1
#endif
#if AXIS_DRIVER_TYPE_E4(L6470)
@@ -2214,7 +2230,7 @@
#define E4_OVERCURRENT 2000
#define E4_STALLCURRENT 1500
#define E4_MAX_VOLTAGE 127
- #define E4_CHAIN_POS 0
+ #define E4_CHAIN_POS -1
#endif
#if AXIS_DRIVER_TYPE_E5(L6470)
@@ -2222,7 +2238,7 @@
#define E5_OVERCURRENT 2000
#define E5_STALLCURRENT 1500
#define E5_MAX_VOLTAGE 127
- #define E5_CHAIN_POS 0
+ #define E5_CHAIN_POS -1
#endif
/**
diff --git a/Marlin/Version.h b/Marlin/Version.h
new file mode 100644
index 0000000000..3cff3b6629
--- /dev/null
+++ b/Marlin/Version.h
@@ -0,0 +1,76 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2019 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
+
+////////////////////////////
+// VENDOR VERSION EXAMPLE //
+////////////////////////////
+
+/**
+ * Marlin release version identifier
+ */
+#define SHORT_BUILD_VERSION "2.0.x_SX4H"
+
+/**
+ * Verbose version identifier which should contain a reference to the location
+ * from where the binary was downloaded or the source code was compiled.
+ */
+#define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION " TM3D"
+
+/**
+ * The STRING_DISTRIBUTION_DATE represents when the binary file was built,
+ * here we define this default string as the date where the latest release
+ * version was tagged.
+ */
+#define STRING_DISTRIBUTION_DATE "2019-10-19"
+
+/**
+ * Defines a generic printer name to be output to the LCD after booting Marlin.
+ */
+#define MACHINE_NAME "TM3D SX4"
+
+/**
+ * The SOURCE_CODE_URL is the location where users will find the Marlin Source
+ * Code which is installed on the device. In most cases —unless the manufacturer
+ * has a distinct Github fork— the Source Code URL should just be the main
+ * Marlin repository.
+ */
+#define SOURCE_CODE_URL "https://github.com/InsanityAutomation/Marlin/tree/TM_SX4_2.0"
+
+/**
+ * Default generic printer UUID.
+ */
+//#define DEFAULT_MACHINE_UUID "cede2a2f-41a2-4748-9b12-c55c62f367ff"
+
+/**
+ * The WEBSITE_URL is the location where users can get more information such as
+ * documentation about a specific Marlin release.
+ */
+#define WEBSITE_URL "tinymachines3d.com"
+
+/**
+ * Set the vendor info the serial USB interface, if changable
+ * Currently only supported by DUE platform
+ */
+//#define USB_DEVICE_VENDOR_ID 0x0000
+//#define USB_DEVICE_PRODUCT_ID 0x0000
+//#define USB_DEVICE_MANUFACTURE_NAME WEBSITE_URL
diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h
index f3946902c8..cecdd8b67b 100644
--- a/Marlin/src/HAL/HAL.h
+++ b/Marlin/src/HAL/HAL.h
@@ -24,3 +24,9 @@
#include "platforms.h"
#include HAL_PATH(.,HAL.h)
+
+inline void watchdog_refresh() {
+ #if ENABLED(USE_WATCHDOG)
+ HAL_watchdog_refresh();
+ #endif
+}
diff --git a/Marlin/src/HAL/HAL_AVR/HAL.h b/Marlin/src/HAL/HAL_AVR/HAL.h
index 9c34dc1f54..246353677f 100644
--- a/Marlin/src/HAL/HAL_AVR/HAL.h
+++ b/Marlin/src/HAL/HAL_AVR/HAL.h
@@ -146,8 +146,7 @@ extern "C" {
#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B)
#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B)
-FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
- UNUSED(frequency);
+FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
switch (timer_num) {
case STEP_TIMER_NUM:
// waveform generation = 0100 = CTC
diff --git a/Marlin/src/HAL/HAL_AVR/HAL_SPI.cpp b/Marlin/src/HAL/HAL_AVR/HAL_SPI.cpp
index 68e21aae53..7a0f7246ee 100644
--- a/Marlin/src/HAL/HAL_AVR/HAL_SPI.cpp
+++ b/Marlin/src/HAL/HAL_AVR/HAL_SPI.cpp
@@ -184,15 +184,10 @@ void spiBegin() {
// nop to tune soft SPI timing
#define nop asm volatile ("\tnop\n")
- // Set SPI rate
- void spiInit(uint8_t spiRate) {
- UNUSED(spiRate); // nothing to do
- }
+ void spiInit(uint8_t) { /* do nothing */ }
// Begin SPI transaction, set clock, bit order, data mode
- void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
- UNUSED(spiBeginTransaction); // nothing to do
- }
+ void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { /* do nothing */ }
// Soft SPI receive byte
uint8_t spiRec() {
diff --git a/Marlin/src/HAL/HAL_AVR/fast_pwm.cpp b/Marlin/src/HAL/HAL_AVR/fast_pwm.cpp
index 282b70de71..4884ede63f 100644
--- a/Marlin/src/HAL/HAL_AVR/fast_pwm.cpp
+++ b/Marlin/src/HAL/HAL_AVR/fast_pwm.cpp
@@ -23,7 +23,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if ENABLED(FAST_PWM_FAN)
+#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_PWM
#include "HAL.h"
@@ -278,5 +278,5 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255
}
}
-#endif // FAST_PWM_FAN
+#endif // FAST_PWM_FAN || SPINDLE_LASER_PWM
#endif // __AVR__
diff --git a/Marlin/src/HAL/HAL_AVR/pinsDebug.h b/Marlin/src/HAL/HAL_AVR/pinsDebug.h
index fa70180947..e4738e0332 100644
--- a/Marlin/src/HAL/HAL_AVR/pinsDebug.h
+++ b/Marlin/src/HAL/HAL_AVR/pinsDebug.h
@@ -227,18 +227,9 @@ static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin");
void com_print(uint8_t N, uint8_t Z) {
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
SERIAL_ECHOPGM(" COM");
- SERIAL_CHAR(N + '0');
- switch (Z) {
- case 'A':
- SERIAL_ECHOPAIR("A: ", ((*TCCRA & (_BV(7) | _BV(6))) >> 6));
- break;
- case 'B':
- SERIAL_ECHOPAIR("B: ", ((*TCCRA & (_BV(5) | _BV(4))) >> 4));
- break;
- case 'C':
- SERIAL_ECHOPAIR("C: ", ((*TCCRA & (_BV(3) | _BV(2))) >> 2));
- break;
- }
+ SERIAL_CHAR('0' + N);
+ SERIAL_CHAR('A' + Z);
+ SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03));
}
void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - WGM bit layout
diff --git a/Marlin/src/HAL/HAL_AVR/watchdog.h b/Marlin/src/HAL/HAL_AVR/watchdog.h
index 5190d2c55a..efd725d7d7 100644
--- a/Marlin/src/HAL/HAL_AVR/watchdog.h
+++ b/Marlin/src/HAL/HAL_AVR/watchdog.h
@@ -28,4 +28,4 @@ void watchdog_init();
// Reset watchdog. MUST be called at least every 4 seconds after the
// first watchdog_init or AVR will go into emergency procedures.
-inline void watchdog_reset() { wdt_reset(); }
+inline void HAL_watchdog_refresh() { wdt_reset(); }
diff --git a/Marlin/src/HAL/HAL_DUE/HAL.cpp b/Marlin/src/HAL/HAL_DUE/HAL.cpp
index 735ccc6317..130779896d 100644
--- a/Marlin/src/HAL/HAL_DUE/HAL.cpp
+++ b/Marlin/src/HAL/HAL_DUE/HAL.cpp
@@ -87,7 +87,7 @@ extern "C" {
// Return free memory between end of heap (or end bss) and whatever is current
int freeMemory() {
int free_memory, heap_end = (int)_sbrk(0);
- return (int)&free_memory - (heap_end ? heap_end : (int)&_ebss);
+ return (int)&free_memory - (heap_end ?: (int)&_ebss);
}
// ------------------------
diff --git a/Marlin/src/HAL/HAL_DUE/HAL.h b/Marlin/src/HAL/HAL_DUE/HAL.h
index 2be95b683a..54ade88e75 100644
--- a/Marlin/src/HAL/HAL_DUE/HAL.h
+++ b/Marlin/src/HAL/HAL_DUE/HAL.h
@@ -38,22 +38,39 @@
#include
-// Serial ports
-#if !WITHIN(SERIAL_PORT, -1, 3)
- #error "SERIAL_PORT must be from -1 to 3"
+// Define MYSERIAL0/1 before MarlinSerial includes!
+#if SERIAL_PORT == -1
+ #define MYSERIAL0 Serial1
+#elif SERIAL_PORT == 0
+ #define MYSERIAL0 Serial
+#elif SERIAL_PORT == 1
+ #define MYSERIAL0 Serial1
+#elif SERIAL_PORT == 2
+ #define MYSERIAL0 Serial2
+#elif SERIAL_PORT == 3
+ #define MYSERIAL0 Serial3
+#else
+ #error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration."
#endif
-// MYSERIAL0 required before MarlinSerial includes!
-#define MYSERIAL0 customizedSerial1
-
#ifdef SERIAL_PORT_2
- #if !WITHIN(SERIAL_PORT_2, -1, 3)
- #error "SERIAL_PORT_2 must be from -1 to 3"
- #elif SERIAL_PORT_2 == SERIAL_PORT
- #error "SERIAL_PORT_2 must be different than SERIAL_PORT"
+ #if SERIAL_PORT_2 == SERIAL_PORT
+ #error "SERIAL_PORT_2 must be different from SERIAL_PORT. Please update your configuration."
+ #endif
+ #if SERIAL_PORT_2 == -1
+ #define MYSERIAL1 Serial1
+ #elif SERIAL_PORT_2 == 0
+ #define MYSERIAL1 Serial
+ #elif SERIAL_PORT_2 == 1
+ #define MYSERIAL1 Serial1
+ #elif SERIAL_PORT_2 == 2
+ #define MYSERIAL1 Serial2
+ #elif SERIAL_PORT_2 == 3
+ #define MYSERIAL1 Serial3
+ #else
+ #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
#endif
#define NUM_SERIAL 2
- #define MYSERIAL1 customizedSerial2
#else
#define NUM_SERIAL 1
#endif
diff --git a/Marlin/src/HAL/HAL_DUE/HAL_SPI.cpp b/Marlin/src/HAL/HAL_DUE/HAL_SPI.cpp
index f942ff8082..35763a5ec7 100644
--- a/Marlin/src/HAL/HAL_DUE/HAL_SPI.cpp
+++ b/Marlin/src/HAL/HAL_DUE/HAL_SPI.cpp
@@ -151,13 +151,12 @@
(((uint32_t)(addr) & 0xF0000000) + 0x02000000 + ((uint32_t)(addr)&0xFFFFF)*32 + (bit)*4)
// run at ~8 .. ~10Mhz - Rx version (Tx line not altered)
- static uint8_t spiTransferRx0(uint8_t bout) { // using Mode 0
+ static uint8_t spiTransferRx0(uint8_t) { // using Mode 0
uint32_t bin = 0;
uint32_t work = 0;
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
- UNUSED(bout);
/* The software SPI routine */
__asm__ __volatile__(
diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB.cpp b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB.cpp
index 1bce07e53f..f7f48d5f42 100644
--- a/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB.cpp
+++ b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB.cpp
@@ -55,12 +55,9 @@ static int pending_char = -1;
#endif
// Public Methods
-void MarlinSerialUSB::begin(const long baud_setting) {
- UNUSED(baud_setting);
-}
+void MarlinSerialUSB::begin(const long) {}
-void MarlinSerialUSB::end() {
-}
+void MarlinSerialUSB::end() {}
int MarlinSerialUSB::peek() {
if (pending_char >= 0)
diff --git a/Marlin/src/HAL/HAL_DUE/timers.cpp b/Marlin/src/HAL/HAL_DUE/timers.cpp
index 57dd9f924f..6925f93498 100644
--- a/Marlin/src/HAL/HAL_DUE/timers.cpp
+++ b/Marlin/src/HAL/HAL_DUE/timers.cpp
@@ -50,7 +50,7 @@ const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = {
{ TC0, 0, TC0_IRQn, 3}, // 0 - [servo timer5]
{ TC0, 1, TC1_IRQn, 0}, // 1
{ TC0, 2, TC2_IRQn, 2}, // 2 - stepper
- { TC1, 0, TC3_IRQn, 0}, // 3
+ { TC1, 0, TC3_IRQn, 0}, // 3 - stepper for BOARD_ARCHIM1
{ TC1, 1, TC4_IRQn, 15}, // 4 - temperature
{ TC1, 2, TC5_IRQn, 3}, // 5 - [servo timer3]
{ TC2, 0, TC6_IRQn, 14}, // 6 - tone
diff --git a/Marlin/src/HAL/HAL_DUE/timers.h b/Marlin/src/HAL/HAL_DUE/timers.h
index ba1eccb2f9..b7b2cf7341 100644
--- a/Marlin/src/HAL/HAL_DUE/timers.h
+++ b/Marlin/src/HAL/HAL_DUE/timers.h
@@ -39,7 +39,9 @@ typedef uint32_t hal_timer_t;
#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals
+#ifndef STEP_TIMER_NUM
#define STEP_TIMER_NUM 2 // index of timer to use for stepper
+#endif
#define TEMP_TIMER_NUM 4 // index of timer to use for temperature
#define PULSE_TIMER_NUM STEP_TIMER_NUM
#define TONE_TIMER_NUM 6 // index of timer to use for beeper tones
@@ -61,7 +63,9 @@ typedef uint32_t hal_timer_t;
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
-#define HAL_STEP_TIMER_ISR() void TC2_Handler()
+#ifndef HAL_STEP_TIMER_ISR
+ #define HAL_STEP_TIMER_ISR() void TC2_Handler()
+#endif
#define HAL_TEMP_TIMER_ISR() void TC4_Handler()
#define HAL_TONE_TIMER_ISR() void TC6_Handler()
diff --git a/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h b/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h
index 6934494e57..8d5924d375 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h
+++ b/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h
@@ -48,9 +48,7 @@
#define _CONF_USB_H_
#undef UNUSED /* To avoid a macro clash as macros.h already defines it */
-#include "../../../core/macros.h" /* For ENABLED()/DISABLED() */
-#include "../../../core/boards.h" /* For MB() */
-#include "../../../../Configuration.h" /* For CUSTOM_MACHINE_NAME definition - We just need the name, no C++ allowed! */
+#include "../../../inc/MarlinConfigPre.h"
#include "compiler.h"
/**
@@ -59,8 +57,6 @@
*/
//! Device definition (mandatory)
-#define USB_DEVICE_VENDOR_ID 0x03EB /* ATMEL VID */
-#define USB_DEVICE_PRODUCT_ID 0x2424 /* MSC / CDC */
#define USB_DEVICE_MAJOR_VERSION 1
#define USB_DEVICE_MINOR_VERSION 0
#define USB_DEVICE_POWER 100 // Consumption on Vbus line (mA)
@@ -70,15 +66,6 @@
// (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_SELF_POWERED)
// (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_BUS_POWERED)
-//! USB Device string definitions (Optional)
-#define USB_DEVICE_MANUFACTURE_NAME "marlinfw.org"
-#ifdef CUSTOM_MACHINE_NAME
- #define USB_DEVICE_PRODUCT_NAME CUSTOM_MACHINE_NAME
-#else
- #define USB_DEVICE_PRODUCT_NAME "3D Printer"
-#endif
-#define USB_DEVICE_SERIAL_NAME "123985739853"
-
/**
* Device speeds support
* Low speed not supported by CDC and MSC
diff --git a/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp
index 7699f2724f..b85a2b09a1 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp
+++ b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp
@@ -33,19 +33,12 @@ Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
return CTRL_GOOD;
}
-bool sd_mmc_spi_unload(bool unload) {
- UNUSED(unload);
- return true;
-}
+bool sd_mmc_spi_unload(bool) { return true; }
-bool sd_mmc_spi_wr_protect() {
- return false;
-}
+bool sd_mmc_spi_wr_protect() { return false; }
bool sd_mmc_spi_removal() {
- if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
- return true;
- return false;
+ return (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted());
}
#if ACCESS_USB == true
diff --git a/Marlin/src/HAL/HAL_DUE/watchdog.h b/Marlin/src/HAL/HAL_DUE/watchdog.h
index 14832a9c3c..6e70adef81 100644
--- a/Marlin/src/HAL/HAL_DUE/watchdog.h
+++ b/Marlin/src/HAL/HAL_DUE/watchdog.h
@@ -30,4 +30,4 @@ void watchdog_init();
// Reset watchdog. MUST be called at least every 4 seconds after the
// first watchdog_init or AVR will go into emergency procedures.
-inline void watchdog_reset() { watchdogReset(); }
+inline void HAL_watchdog_refresh() { watchdogReset(); }
diff --git a/Marlin/src/HAL/HAL_ESP32/HAL.cpp b/Marlin/src/HAL/HAL_ESP32/HAL.cpp
index 9bf41c2e84..81567eeede 100644
--- a/Marlin/src/HAL/HAL_ESP32/HAL.cpp
+++ b/Marlin/src/HAL/HAL_ESP32/HAL.cpp
@@ -187,19 +187,21 @@ void HAL_adc_start_conversion(uint8_t adc_pin) {
const adc1_channel_t chan = get_channel(adc_pin);
uint32_t mv;
esp_adc_cal_get_voltage((adc_channel_t)chan, &characteristics[attenuations[chan]], &mv);
+ HAL_adc_result = mv * 1023.0 / 3300.0;
// Change the attenuation level based on the new reading
adc_atten_t atten;
if (mv < thresholds[ADC_ATTEN_DB_0] - 100)
- adc1_set_attenuation(chan, ADC_ATTEN_DB_0);
+ atten = ADC_ATTEN_DB_0;
else if (mv > thresholds[ADC_ATTEN_DB_0] - 50 && mv < thresholds[ADC_ATTEN_DB_2_5] - 100)
- adc1_set_attenuation(chan, ADC_ATTEN_DB_2_5);
+ atten = ADC_ATTEN_DB_2_5;
else if (mv > thresholds[ADC_ATTEN_DB_2_5] - 50 && mv < thresholds[ADC_ATTEN_DB_6] - 100)
- adc1_set_attenuation(chan, ADC_ATTEN_DB_6);
+ atten = ADC_ATTEN_DB_6;
else if (mv > thresholds[ADC_ATTEN_DB_6] - 50)
- adc1_set_attenuation(chan, ADC_ATTEN_DB_11);
+ atten = ADC_ATTEN_DB_11;
+ else return;
- HAL_adc_result = mv * 1023.0 / 3300.0;
+ adc1_set_attenuation(chan, atten);
}
void analogWrite(pin_t pin, int value) {
diff --git a/Marlin/src/HAL/HAL_ESP32/watchdog.h b/Marlin/src/HAL/HAL_ESP32/watchdog.h
index e5dd3b46d3..6647ecefe6 100644
--- a/Marlin/src/HAL/HAL_ESP32/watchdog.h
+++ b/Marlin/src/HAL/HAL_ESP32/watchdog.h
@@ -25,4 +25,4 @@
void watchdog_init();
// Reset watchdog.
-inline void watchdog_reset() { }
+inline void HAL_watchdog_refresh() {}
diff --git a/Marlin/src/HAL/HAL_LINUX/HAL.h b/Marlin/src/HAL/HAL_LINUX/HAL.h
index 39d68a7a10..5bd283e5c1 100644
--- a/Marlin/src/HAL/HAL_LINUX/HAL.h
+++ b/Marlin/src/HAL/HAL_LINUX/HAL.h
@@ -78,7 +78,7 @@ extern HalSerial usb_serial;
#define ENABLE_ISRS()
#define DISABLE_ISRS()
-inline void HAL_init() { }
+inline void HAL_init() {}
// Utility functions
#pragma GCC diagnostic push
@@ -97,6 +97,10 @@ void HAL_adc_enable_channel(int pin);
void HAL_adc_start_conversion(const uint8_t adc_pin);
uint16_t HAL_adc_get_result();
+// Reset source
+inline void HAL_clear_reset_source(void) {}
+inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; }
+
/* ---------------- Delay in cycles */
FORCE_INLINE static void DELAY_CYCLES(uint64_t x) {
Clock::delayCycles(x);
diff --git a/Marlin/src/HAL/HAL_LINUX/arduino.cpp b/Marlin/src/HAL/HAL_LINUX/arduino.cpp
index 7915d685ea..88128dd91a 100644
--- a/Marlin/src/HAL/HAL_LINUX/arduino.cpp
+++ b/Marlin/src/HAL/HAL_LINUX/arduino.cpp
@@ -29,7 +29,7 @@
// Interrupts
void cli() { } // Disable
-void sei() { } // Enable
+void sei() { } // Enable
// Time functions
void _delay_ms(const int delay_ms) {
diff --git a/Marlin/src/HAL/HAL_LINUX/include/serial.h b/Marlin/src/HAL/HAL_LINUX/include/serial.h
index 268bdeeeca..c6da82ad5a 100644
--- a/Marlin/src/HAL/HAL_LINUX/include/serial.h
+++ b/Marlin/src/HAL/HAL_LINUX/include/serial.h
@@ -83,9 +83,9 @@ public:
HalSerial() { host_connected = true; }
- void begin(int32_t baud) { }
+ void begin(int32_t) {}
- void end() { }
+ void end() {}
int peek() {
uint8_t value;
diff --git a/Marlin/src/HAL/HAL_LINUX/watchdog.cpp b/Marlin/src/HAL/HAL_LINUX/watchdog.cpp
index a1ecac1cb5..6338ea3b1d 100644
--- a/Marlin/src/HAL/HAL_LINUX/watchdog.cpp
+++ b/Marlin/src/HAL/HAL_LINUX/watchdog.cpp
@@ -29,18 +29,8 @@
#include "watchdog.h"
void watchdog_init() {}
+void HAL_watchdog_refresh() {}
-void HAL_clear_reset_source() {}
-
-uint8_t HAL_get_reset_source() {
- return RST_POWER_ON;
-}
-
-void watchdog_reset() {}
-
-#else
- void HAL_clear_reset_source() {}
- uint8_t HAL_get_reset_source() { return RST_POWER_ON; }
-#endif // USE_WATCHDOG
+#endif
#endif // __PLAT_LINUX__
diff --git a/Marlin/src/HAL/HAL_LINUX/watchdog.h b/Marlin/src/HAL/HAL_LINUX/watchdog.h
index 5bc06f04f1..51d30c8437 100644
--- a/Marlin/src/HAL/HAL_LINUX/watchdog.h
+++ b/Marlin/src/HAL/HAL_LINUX/watchdog.h
@@ -24,6 +24,4 @@
#define WDT_TIMEOUT 4000000 // 4 second timeout
void watchdog_init();
-void watchdog_reset();
-void HAL_clear_reset_source();
-uint8_t HAL_get_reset_source();
+void HAL_watchdog_refresh();
diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL.cpp b/Marlin/src/HAL/HAL_LPC1768/HAL.cpp
index b684145e99..2607ecfb46 100644
--- a/Marlin/src/HAL/HAL_LPC1768/HAL.cpp
+++ b/Marlin/src/HAL/HAL_LPC1768/HAL.cpp
@@ -26,6 +26,10 @@
#include "../shared/Delay.h"
#include "../../../gcode/parser.h"
+#if ENABLED(USE_WATCHDOG)
+ #include "watchdog.h"
+#endif
+
// U8glib required functions
extern "C" void u8g_xMicroDelay(uint16_t val) {
DELAY_US(val);
@@ -65,4 +69,17 @@ void flashFirmware(int16_t value) {
NVIC_SystemReset();
}
+void HAL_clear_reset_source(void) {
+ #if ENABLED(USE_WATCHDOG)
+ watchdog_clear_timeout_flag();
+ #endif
+}
+
+uint8_t HAL_get_reset_source(void) {
+ #if ENABLED(USE_WATCHDOG)
+ if (watchdog_timed_out()) return RST_WATCHDOG;
+ #endif
+ return RST_POWER_ON;
+}
+
#endif // TARGET_LPC1768
diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL.h b/Marlin/src/HAL/HAL_LPC1768/HAL.h
index cf2576de25..7ea6d288be 100644
--- a/Marlin/src/HAL/HAL_LPC1768/HAL.h
+++ b/Marlin/src/HAL/HAL_LPC1768/HAL.h
@@ -164,3 +164,7 @@ void set_pwm_frequency(const pin_t pin, int f_desired);
* Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255]
*/
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false);
+
+// Reset source
+void HAL_clear_reset_source(void);
+uint8_t HAL_get_reset_source(void);
diff --git a/Marlin/src/HAL/HAL_LPC1768/MarlinSerial.h b/Marlin/src/HAL/HAL_LPC1768/MarlinSerial.h
index 1f282f64a3..8050685538 100644
--- a/Marlin/src/HAL/HAL_LPC1768/MarlinSerial.h
+++ b/Marlin/src/HAL/HAL_LPC1768/MarlinSerial.h
@@ -49,7 +49,7 @@ public:
{
}
- void end() { }
+ void end() {}
#if ENABLED(EMERGENCY_PARSER)
bool recv_callback(const char c) override {
diff --git a/Marlin/src/HAL/HAL_LPC1768/fast_pwm.cpp b/Marlin/src/HAL/HAL_LPC1768/fast_pwm.cpp
index 7af3a07eea..1cc2032778 100644
--- a/Marlin/src/HAL/HAL_LPC1768/fast_pwm.cpp
+++ b/Marlin/src/HAL/HAL_LPC1768/fast_pwm.cpp
@@ -24,7 +24,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if ENABLED(FAST_PWM_FAN)
+#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_PWM
#include
@@ -36,5 +36,5 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255
pwm_write_ratio(pin, invert ? 1.0f - (float)v / v_size : (float)v / v_size);
}
-#endif // FAST_PWM_FAN
+#endif // FAST_PWM_FAN || SPINDLE_LASER_PWM
#endif // TARGET_LPC1768
diff --git a/Marlin/src/HAL/HAL_LPC1768/main.cpp b/Marlin/src/HAL/HAL_LPC1768/main.cpp
index ab5b184b47..b20841bdeb 100644
--- a/Marlin/src/HAL/HAL_LPC1768/main.cpp
+++ b/Marlin/src/HAL/HAL_LPC1768/main.cpp
@@ -155,7 +155,7 @@ void HAL_idletask() {
// a PC via USB.
// Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but
// this will not reliably detect delete operations. To be safe we will lock
- // the disk if Marlin has it mounted. Unfortuately there is currently no way
+ // the disk if Marlin has it mounted. Unfortunately there is currently no way
// to unmount the disk from the LCD menu.
// if (IS_SD_PRINTING() || IS_SD_FILE_OPEN())
if (card.isMounted())
diff --git a/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py
index 44e0f09ad0..7f2a023630 100644
--- a/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py
+++ b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py
@@ -31,7 +31,7 @@ try:
#
import subprocess
# typical result (string): 'Drives: C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\'
- driveStr = subprocess.check_output("fsutil fsinfo drives")
+ driveStr = subprocess.check_output("fsutil fsinfo drives").decode('utf8')
# typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\'
driveStr = driveStr.strip().lstrip('Drives: ')
# typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\',
@@ -44,7 +44,7 @@ try:
for drive in drives:
final_drive_name = drive.strip().rstrip('\\') # typical result (string): 'C:'
try:
- volume_info = subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT)
+ volume_info = subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT).decode('utf8')
except Exception as e:
continue
else:
diff --git a/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp b/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp
index 55e3628603..f122bf9984 100644
--- a/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp
+++ b/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp
@@ -56,28 +56,16 @@ void watchdog_init() {
WDT_Start(WDT_TIMEOUT);
}
-void HAL_clear_reset_source() {
- WDT_ClrTimeOutFlag();
-}
-
-uint8_t HAL_get_reset_source() {
- if (TEST(WDT_ReadTimeOutFlag(), 0)) return RST_WATCHDOG;
- return RST_POWER_ON;
-}
-
-void watchdog_reset() {
+void HAL_watchdog_refresh() {
WDT_Feed();
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
TOGGLE(LED_PIN); // heartbeat indicator
#endif
}
-#else
-
-void watchdog_init() {}
-void watchdog_reset() {}
-void HAL_clear_reset_source() {}
-uint8_t HAL_get_reset_source() { return RST_POWER_ON; }
+// Timeout state
+bool watchdog_timed_out() { return TEST(WDT_ReadTimeOutFlag(), 0); }
+void watchdog_clear_timeout_flag() { WDT_ClrTimeOutFlag(); }
#endif // USE_WATCHDOG
diff --git a/Marlin/src/HAL/HAL_LPC1768/watchdog.h b/Marlin/src/HAL/HAL_LPC1768/watchdog.h
index 5bc06f04f1..dd6617ea31 100644
--- a/Marlin/src/HAL/HAL_LPC1768/watchdog.h
+++ b/Marlin/src/HAL/HAL_LPC1768/watchdog.h
@@ -24,6 +24,7 @@
#define WDT_TIMEOUT 4000000 // 4 second timeout
void watchdog_init();
-void watchdog_reset();
-void HAL_clear_reset_source();
-uint8_t HAL_get_reset_source();
+void HAL_watchdog_refresh();
+
+bool watchdog_timed_out();
+void watchdog_clear_timeout_flag();
diff --git a/Marlin/src/HAL/HAL_SAMD51/HAL.cpp b/Marlin/src/HAL/HAL_SAMD51/HAL.cpp
index d80dd17aab..1d7521270f 100644
--- a/Marlin/src/HAL/HAL_SAMD51/HAL.cpp
+++ b/Marlin/src/HAL/HAL_SAMD51/HAL.cpp
@@ -414,7 +414,7 @@ extern "C" {
// Return free memory between end of heap (or end bss) and whatever is current
int freeMemory() {
int free_memory, heap_end = (int)_sbrk(0);
- return (int)&free_memory - (heap_end ? heap_end : (int)&__bss_end__);
+ return (int)&free_memory - (heap_end ?: (int)&__bss_end__);
}
// ------------------------
diff --git a/Marlin/src/HAL/HAL_SAMD51/watchdog.cpp b/Marlin/src/HAL/HAL_SAMD51/watchdog.cpp
index a60bcedd8a..69a6de4ef7 100644
--- a/Marlin/src/HAL/HAL_SAMD51/watchdog.cpp
+++ b/Marlin/src/HAL/HAL_SAMD51/watchdog.cpp
@@ -42,7 +42,7 @@
WDT->INTENCLR.reg = WDT_INTENCLR_EW; // Disable early warning interrupt
WDT->CONFIG.reg = WDT_CONFIG_PER_CYC4096; // Set at least 4s period for chip reset
- watchdog_reset();
+ HAL_watchdog_refresh();
WDT->CTRLA.reg = WDT_CTRLA_ENABLE; // Start watchdog now in normal mode
SYNC(WDT->SYNCBUSY.bit.ENABLE);
diff --git a/Marlin/src/HAL/HAL_SAMD51/watchdog.h b/Marlin/src/HAL/HAL_SAMD51/watchdog.h
index 1c4e7542f2..b626b0b06a 100644
--- a/Marlin/src/HAL/HAL_SAMD51/watchdog.h
+++ b/Marlin/src/HAL/HAL_SAMD51/watchdog.h
@@ -25,7 +25,7 @@ void watchdog_init();
// Reset watchdog. MUST be called at least every 4 seconds after the
// first watchdog_init or SAMD will go into emergency procedures.
-inline void watchdog_reset() {
+inline void HAL_watchdog_refresh() {
SYNC(WDT->SYNCBUSY.bit.CLEAR); // Test first if previous is 'ongoing' to save time waiting for command execution
WDT->CLEAR.reg = WDT_CLEAR_CLEAR_KEY;
}
diff --git a/Marlin/src/HAL/HAL_STM32/HAL.cpp b/Marlin/src/HAL/HAL_STM32/HAL.cpp
index 6ecde3ef35..edc161a5d3 100644
--- a/Marlin/src/HAL/HAL_STM32/HAL.cpp
+++ b/Marlin/src/HAL/HAL_STM32/HAL.cpp
@@ -104,17 +104,11 @@ extern "C" {
// ADC
// ------------------------
-void HAL_adc_start_conversion(const uint8_t adc_pin) {
- HAL_adc_result = analogRead(adc_pin);
-}
+// TODO: Make sure this doesn't cause any delay
+void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); }
-uint16_t HAL_adc_get_result() {
- return HAL_adc_result;
-}
+uint16_t HAL_adc_get_result() { return HAL_adc_result; }
-void flashFirmware(int16_t value) {
- UNUSED(value);
- NVIC_SystemReset();
-}
+void flashFirmware(int16_t) { NVIC_SystemReset(); }
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/HAL_STM32/watchdog.cpp b/Marlin/src/HAL/HAL_STM32/watchdog.cpp
index 8963d55cfc..4defadaa77 100644
--- a/Marlin/src/HAL/HAL_STM32/watchdog.cpp
+++ b/Marlin/src/HAL/HAL_STM32/watchdog.cpp
@@ -33,7 +33,7 @@
void watchdog_init() { IWatchdog.begin(4000000); } // 4 sec timeout
- void watchdog_reset() {
+ void HAL_watchdog_refresh() {
IWatchdog.reload();
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
TOGGLE(LED_PIN); // heartbeat indicator
diff --git a/Marlin/src/HAL/HAL_STM32/watchdog.h b/Marlin/src/HAL/HAL_STM32/watchdog.h
index f062d8a2e6..6855016737 100644
--- a/Marlin/src/HAL/HAL_STM32/watchdog.h
+++ b/Marlin/src/HAL/HAL_STM32/watchdog.h
@@ -22,4 +22,4 @@
#pragma once
void watchdog_init();
-void watchdog_reset();
+void HAL_watchdog_refresh();
diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL.cpp b/Marlin/src/HAL/HAL_STM32F1/HAL.cpp
index e1f2e21ffd..cba41dd3c2 100644
--- a/Marlin/src/HAL/HAL_STM32F1/HAL.cpp
+++ b/Marlin/src/HAL/HAL_STM32F1/HAL.cpp
@@ -27,8 +27,8 @@
#ifdef __STM32F1__
-#include "HAL.h"
#include "../../inc/MarlinConfig.h"
+#include "HAL.h"
#include
@@ -233,7 +233,7 @@ void HAL_idletask() {
// a PC via USB.
// Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but
// this will not reliably detect delete operations. To be safe we will lock
- // the disk if Marlin has it mounted. Unfortuately there is currently no way
+ // the disk if Marlin has it mounted. Unfortunately there is currently no way
// to unmount the disk from the LCD menu.
// if (IS_SD_PRINTING() || IS_SD_FILE_OPEN())
/* copy from lpc1768 framework, should be fixed later for process SHARED_SD_CARD*/
diff --git a/Marlin/src/HAL/HAL_STM32F1/timers.cpp b/Marlin/src/HAL/HAL_STM32F1/timers.cpp
index a21dc12c12..a1f5f1e453 100644
--- a/Marlin/src/HAL/HAL_STM32F1/timers.cpp
+++ b/Marlin/src/HAL/HAL_STM32F1/timers.cpp
@@ -26,8 +26,8 @@
#ifdef __STM32F1__
+#include "../../inc/MarlinConfig.h"
#include "HAL.h"
-
#include "timers.h"
// ------------------------
diff --git a/Marlin/src/HAL/HAL_STM32F1/timers.h b/Marlin/src/HAL/HAL_STM32F1/timers.h
index 69793f4302..aba619fd10 100644
--- a/Marlin/src/HAL/HAL_STM32F1/timers.h
+++ b/Marlin/src/HAL/HAL_STM32F1/timers.h
@@ -27,6 +27,7 @@
#include
#include
+#include "../../core/boards.h"
// ------------------------
// Defines
@@ -54,7 +55,13 @@ typedef uint16_t hal_timer_t;
#define TEMP_TIMER_NUM 2 // index of timer to use for temperature
//#define TEMP_TIMER_NUM 4 // 2->4, Timer 2 for Stepper Current PWM
#define PULSE_TIMER_NUM STEP_TIMER_NUM
-#define SERVO0_TIMER_NUM 1 // SERVO0 or BLTOUCH
+
+#if MB(BIGTREE_SKR_MINI_E3, BIGTREE_SKR_E3_DIP, BTT_SKR_MINI_E3_V1_2, MKS_ROBIN_LITE)
+ // SKR Mini E3 boards use PA8 as FAN_PIN, so TIMER 1 is used for Fan PWM.
+ #define SERVO0_TIMER_NUM 8
+#else
+ #define SERVO0_TIMER_NUM 1 // SERVO0 or BLTOUCH
+#endif
#define STEP_TIMER_IRQ_PRIO 1
#define TEMP_TIMER_IRQ_PRIO 2
diff --git a/Marlin/src/HAL/HAL_STM32F1/watchdog.cpp b/Marlin/src/HAL/HAL_STM32F1/watchdog.cpp
index 5696939f30..17f5aa9725 100644
--- a/Marlin/src/HAL/HAL_STM32F1/watchdog.cpp
+++ b/Marlin/src/HAL/HAL_STM32F1/watchdog.cpp
@@ -33,7 +33,7 @@
#include
#include "watchdog.h"
-void watchdog_reset() {
+void HAL_watchdog_refresh() {
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
TOGGLE(LED_PIN); // heartbeat indicator
#endif
diff --git a/Marlin/src/HAL/HAL_STM32F1/watchdog.h b/Marlin/src/HAL/HAL_STM32F1/watchdog.h
index 4f3a8deb0d..21f97dd7a1 100644
--- a/Marlin/src/HAL/HAL_STM32F1/watchdog.h
+++ b/Marlin/src/HAL/HAL_STM32F1/watchdog.h
@@ -41,4 +41,4 @@ void watchdog_init();
// Reset watchdog. MUST be called at least every 4 seconds after the
// first watchdog_init or STM32F1 will reset.
-void watchdog_reset();
+void HAL_watchdog_refresh();
diff --git a/Marlin/src/HAL/HAL_STM32_F4_F7/HAL.h b/Marlin/src/HAL/HAL_STM32_F4_F7/HAL.h
index 1effe2d752..d4ca01e022 100644
--- a/Marlin/src/HAL/HAL_STM32_F4_F7/HAL.h
+++ b/Marlin/src/HAL/HAL_STM32_F4_F7/HAL.h
@@ -150,7 +150,7 @@ extern uint16_t HAL_adc_result;
// Memory related
#define __bss_end __bss_end__
-inline void HAL_init() { }
+inline void HAL_init() {}
// Clear reset reason
void HAL_clear_reset_source();
diff --git a/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.cpp b/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.cpp
index e078d7a104..e51af618c9 100644
--- a/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.cpp
+++ b/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.cpp
@@ -44,7 +44,7 @@
}
}
- void watchdog_reset() {
+ void HAL_watchdog_refresh() {
/* Refresh IWDG: reload counter */
if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) {
/* Refresh Error */
diff --git a/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.h b/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.h
index cc02fda24f..9e2a2dc21c 100644
--- a/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.h
+++ b/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.h
@@ -24,4 +24,4 @@
extern IWDG_HandleTypeDef hiwdg;
void watchdog_init();
-void watchdog_reset();
+void HAL_watchdog_refresh();
diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/HAL.h b/Marlin/src/HAL/HAL_TEENSY31_32/HAL.h
index 4813d60d69..e2df8df86b 100644
--- a/Marlin/src/HAL/HAL_TEENSY31_32/HAL.h
+++ b/Marlin/src/HAL/HAL_TEENSY31_32/HAL.h
@@ -87,7 +87,7 @@ typedef int8_t pin_t;
#undef pgm_read_word
#define pgm_read_word(addr) (*((uint16_t*)(addr)))
-inline void HAL_init() { }
+inline void HAL_init() {}
// Clear the reset reason
void HAL_clear_reset_source();
diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/watchdog.h b/Marlin/src/HAL/HAL_TEENSY31_32/watchdog.h
index ceb041b457..861afcbc91 100644
--- a/Marlin/src/HAL/HAL_TEENSY31_32/watchdog.h
+++ b/Marlin/src/HAL/HAL_TEENSY31_32/watchdog.h
@@ -27,7 +27,7 @@
void watchdog_init();
-inline void watchdog_reset() {
+inline void HAL_watchdog_refresh() {
// Watchdog refresh sequence
WDOG_REFRESH = 0xA602;
WDOG_REFRESH = 0xB480;
diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h
index e218174ad3..9fc4ff6633 100644
--- a/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h
+++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h
@@ -93,7 +93,7 @@ typedef int8_t pin_t;
#undef pgm_read_word
#define pgm_read_word(addr) (*((uint16_t*)(addr)))
-inline void HAL_init() { }
+inline void HAL_init() {}
// Clear reset reason
void HAL_clear_reset_source();
diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/watchdog.h b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog.h
index d2efaab372..7c27260906 100644
--- a/Marlin/src/HAL/HAL_TEENSY35_36/watchdog.h
+++ b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog.h
@@ -23,7 +23,7 @@
void watchdog_init();
-inline void watchdog_reset() {
+inline void HAL_watchdog_refresh() {
// Watchdog refresh sequence
WDOG_REFRESH = 0xA602;
WDOG_REFRESH = 0xB480;
diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h
index 1c2ee47c29..b3f8f246fb 100644
--- a/Marlin/src/HAL/shared/Delay.h
+++ b/Marlin/src/HAL/shared/Delay.h
@@ -53,7 +53,7 @@
FORCE_INLINE static void DELAY_CYCLES(const uint32_t x) {
const uint32_t endCycles = getCycleCount() + x;
- while (PENDING(getCycleCount(), endCycles)) { }
+ while (PENDING(getCycleCount(), endCycles)) {}
}
#else
diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp
index 89501e9bfa..f130221821 100644
--- a/Marlin/src/Marlin.cpp
+++ b/Marlin/src/Marlin.cpp
@@ -173,10 +173,6 @@
#include "feature/prusa_MMU2/mmu2.h"
#endif
-#if ENABLED(EXTENSIBLE_UI)
- #include "lcd/extensible_ui/ui_api.h"
-#endif
-
#if HAS_DRIVER(L6470)
#include "libs/L6470/L6470_Marlin.h"
#endif
@@ -279,6 +275,10 @@ void quickstop_stepper() {
sync_plan_position();
}
+void enable_e_steppers() {
+ enable_E0(); enable_E1(); enable_E2(); enable_E3(); enable_E4(); enable_E5();
+}
+
void enable_all_steppers() {
#if ENABLED(AUTO_POWER_CONTROL)
powerManager.power_on();
@@ -286,30 +286,11 @@ void enable_all_steppers() {
enable_X();
enable_Y();
enable_Z();
- enable_E0();
- enable_E1();
- enable_E2();
- enable_E3();
- enable_E4();
- enable_E5();
-}
-
-void enable_e_steppers() {
- enable_E0();
- enable_E1();
- enable_E2();
- enable_E3();
- enable_E4();
- enable_E5();
+ enable_e_steppers();
}
void disable_e_steppers() {
- disable_E0();
- disable_E1();
- disable_E2();
- disable_E3();
- disable_E4();
- disable_E5();
+ disable_E0(); disable_E1(); disable_E2(); disable_E3(); disable_E4(); disable_E5();
}
void disable_e_stepper(const uint8_t e) {
@@ -330,71 +311,6 @@ void disable_all_steppers() {
disable_e_steppers();
}
-#if HAS_FILAMENT_SENSOR
-
- void event_filament_runout() {
-
- #if ENABLED(ADVANCED_PAUSE_FEATURE)
- if (did_pause_print) return; // Action already in progress. Purge triggered repeated runout.
- #endif
-
- #if ENABLED(EXTENSIBLE_UI)
- ExtUI::onFilamentRunout(ExtUI::getActiveTool());
- #endif
-
- #if EITHER(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS)
- const char tool = '0'
- #if NUM_RUNOUT_SENSORS > 1
- + active_extruder
- #endif
- ;
- #endif
-
- //action:out_of_filament
- #if ENABLED(HOST_PROMPT_SUPPORT)
- host_prompt_reason = PROMPT_FILAMENT_RUNOUT;
- host_action_prompt_end();
- host_action_prompt_begin(PSTR("FilamentRunout T"), false);
- SERIAL_CHAR(tool);
- SERIAL_EOL();
- host_action_prompt_show();
- #endif
-
- const bool run_runout_script = !runout.host_handling;
-
- #if ENABLED(HOST_ACTION_COMMANDS)
- if (run_runout_script
- && ( strstr(FILAMENT_RUNOUT_SCRIPT, "M600")
- || strstr(FILAMENT_RUNOUT_SCRIPT, "M125")
- #if ENABLED(ADVANCED_PAUSE_FEATURE)
- || strstr(FILAMENT_RUNOUT_SCRIPT, "M25")
- #endif
- )
- ) {
- host_action_paused(false);
- }
- else {
- // Legacy Repetier command for use until newer version supports standard dialog
- // To be removed later when pause command also triggers dialog
- #ifdef ACTION_ON_FILAMENT_RUNOUT
- host_action(PSTR(ACTION_ON_FILAMENT_RUNOUT " T"), false);
- SERIAL_CHAR(tool);
- SERIAL_EOL();
- #endif
-
- host_action_pause(false);
- }
- SERIAL_ECHOPGM(" " ACTION_REASON_ON_FILAMENT_RUNOUT " ");
- SERIAL_CHAR(tool);
- SERIAL_EOL();
- #endif // HOST_ACTION_COMMANDS
-
- if (run_runout_script)
- queue.inject_P(PSTR(FILAMENT_RUNOUT_SCRIPT));
- }
-
-#endif // HAS_FILAMENT_SENSOR
-
#if ENABLED(G29_RETRY_AND_RECOVER)
void event_probe_failure() {
@@ -408,7 +324,7 @@ void disable_all_steppers() {
#ifdef ACTION_ON_CANCEL
host_action_cancel();
#endif
- kill(PSTR(MSG_ERR_PROBING_FAILED));
+ kill(GET_TEXT(MSG_LCD_PROBING_FAILED));
#endif
}
@@ -426,6 +342,20 @@ void disable_all_steppers() {
#endif
+/**
+ * Printing is active when the print job timer is running
+ */
+bool printingIsActive() {
+ return print_job_timer.isRunning() || IS_SD_PRINTING();
+}
+
+/**
+ * Printing is paused according to SD or host indicators
+ */
+bool printingIsPaused() {
+ return print_job_timer.isPaused() || IS_SD_PAUSED();
+}
+
/**
* Manage several activities:
* - Check for Filament Runout
@@ -582,10 +512,10 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
}
#endif // !SWITCHING_EXTRUDER
- const float olde = current_position[E_AXIS];
- current_position[E_AXIS] += EXTRUDER_RUNOUT_EXTRUDE;
- planner.buffer_line(current_position, MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED), active_extruder);
- current_position[E_AXIS] = olde;
+ const float olde = current_position.e;
+ current_position.e += EXTRUDER_RUNOUT_EXTRUDE;
+ line_to_current_position(MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED));
+ current_position.e = olde;
planner.set_e_position_mm(olde);
planner.synchronize();
@@ -629,7 +559,7 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
if (delayed_move_time && ELAPSED(ms, delayed_move_time + 1000UL) && IsRunning()) {
// travel moves have been received so enact them
delayed_move_time = 0xFFFFFFFFUL; // force moves to be done
- set_destination_from_current();
+ destination = current_position;
prepare_move_to_destination();
}
#endif
@@ -756,15 +686,16 @@ void idle(
* Kill all activity and lock the machine.
* After this the machine will need to be reset.
*/
-void kill(PGM_P const lcd_msg/*=nullptr*/, const bool steppers_off/*=false*/) {
+void kill(PGM_P const lcd_error/*=nullptr*/, PGM_P const lcd_component/*=nullptr*/, const bool steppers_off/*=false*/) {
thermalManager.disable_all_heaters();
SERIAL_ERROR_MSG(MSG_ERR_KILLED);
#if HAS_DISPLAY
- ui.kill_screen(lcd_msg ? lcd_msg : PSTR(MSG_KILLED));
+ ui.kill_screen(lcd_error ?: GET_TEXT(MSG_KILLED), lcd_component);
#else
- UNUSED(lcd_msg);
+ UNUSED(lcd_error);
+ UNUSED(lcd_component);
#endif
#ifdef ACTION_ON_KILL
@@ -801,29 +732,17 @@ void minkill(const bool steppers_off/*=false*/) {
#if HAS_KILL
// Wait for kill to be released
- while (!READ(KILL_PIN)) {
- #if ENABLED(USE_WATCHDOG)
- watchdog_reset();
- #endif
- }
+ while (!READ(KILL_PIN)) watchdog_refresh();
// Wait for kill to be pressed
- while (READ(KILL_PIN)) {
- #if ENABLED(USE_WATCHDOG)
- watchdog_reset();
- #endif
- }
+ while (READ(KILL_PIN)) watchdog_refresh();
void (*resetFunc)() = 0; // Declare resetFunc() at address 0
resetFunc(); // Jump to address 0
#else // !HAS_KILL
- for (;;) {
- #if ENABLED(USE_WATCHDOG)
- watchdog_reset();
- #endif
- } // Wait for reset
+ for (;;) watchdog_refresh(); // Wait for reset
#endif // !HAS_KILL
}
@@ -1002,7 +921,7 @@ void setup() {
#if HAS_M206_COMMAND
// Initialize current position based on home_offset
- LOOP_XYZ(a) current_position[a] += home_offset[a];
+ current_position += home_offset;
#endif
// Vital to init stepper/planner equivalent for current_position
diff --git a/Marlin/src/Marlin.h b/Marlin/src/Marlin.h
index 1a9acc0075..391c453e01 100644
--- a/Marlin/src/Marlin.h
+++ b/Marlin/src/Marlin.h
@@ -322,7 +322,7 @@ void disable_e_stepper(const uint8_t e);
void disable_e_steppers();
void disable_all_steppers();
-void kill(PGM_P const lcd_msg=nullptr, const bool steppers_off=false);
+void kill(PGM_P const lcd_error=nullptr, PGM_P const lcd_component=nullptr, const bool steppers_off=false);
void minkill(const bool steppers_off=false);
void quickstop_stepper();
@@ -331,6 +331,9 @@ extern bool Running;
inline bool IsRunning() { return Running; }
inline bool IsStopped() { return !Running; }
+bool printingIsActive();
+bool printingIsPaused();
+
extern bool wait_for_heatup;
#if HAS_RESUME_CONTINUE
@@ -368,10 +371,6 @@ void protected_pin_err();
inline void suicide() { OUT_WRITE(SUICIDE_PIN, LOW); }
#endif
-#if HAS_FILAMENT_SENSOR
- void event_filament_runout();
-#endif
-
#if ENABLED(G29_RETRY_AND_RECOVER)
void event_probe_recover();
void event_probe_failure();
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index 89f1f0d20d..939cf5f756 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -21,6 +21,8 @@
*/
#pragma once
+#include "macros.h"
+
#define BOARD_UNKNOWN -1
//
@@ -255,9 +257,9 @@
// STM32 ARM Cortex-M3
//
-#define BOARD_STM32F103R 4000 // STM32F103R Libmaple-based STM32F1 controller
+#define BOARD_STM32F103RE 4000 // STM32F103RE Libmaple-based STM32F1 controller
#define BOARD_MALYAN_M200 4001 // STM32C8T6 Libmaple-based STM32F1 controller
-#define BOARD_STM3R_MINI 4002 // STM32F103R Libmaple-based STM32F1 controller
+#define BOARD_STM3R_MINI 4002 // STM32F103RE Libmaple-based STM32F1 controller
#define BOARD_GTM32_PRO_VB 4003 // STM32F103VET6 controller
#define BOARD_MORPHEUS 4004 // STM32F103C8 / STM32F103CB Libmaple-based STM32F1 controller
#define BOARD_CHITU3D 4005 // Chitu3D (STM32F103RET6)
@@ -268,11 +270,12 @@
#define BOARD_BIGTREE_SKR_MINI_V1_1 4010 // BigTreeTech SKR Mini v1.1 (STM32F103RC)
#define BOARD_BIGTREE_SKR_MINI_E3 4011 // BigTreeTech SKR Mini E3 (STM32F103RC)
#define BOARD_BIGTREE_SKR_E3_DIP 4012 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC)
-#define BOARD_JGAURORA_A5S_A1 4013 // JGAurora A5S A1 (STM32F103ZET6)
-#define BOARD_FYSETC_AIO_II 4014 // FYSETC AIO_II
-#define BOARD_FYSETC_CHEETAH 4015 // FYSETC Cheetah
-#define BOARD_FYSETC_CHEETAH_V12 4016 // FYSETC Cheetah V1.2
-#define BOARD_LONGER3D_LK 4017 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6
+#define BOARD_BTT_SKR_MINI_E3_V1_2 4013 // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC)
+#define BOARD_JGAURORA_A5S_A1 4014 // JGAurora A5S A1 (STM32F103ZET6)
+#define BOARD_FYSETC_AIO_II 4015 // FYSETC AIO_II
+#define BOARD_FYSETC_CHEETAH 4016 // FYSETC Cheetah
+#define BOARD_FYSETC_CHEETAH_V12 4017 // FYSETC Cheetah V1.2
+#define BOARD_LONGER3D_LK 4018 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6
//
// ARM Cortex-M4F
@@ -307,7 +310,7 @@
//
// Espressif ESP32 WiFi
//
-#define BOARD_ESP32 6000
+#define BOARD_ESPRESSIF_ESP32 6000
//
// Simulations
@@ -315,4 +318,7 @@
#define BOARD_LINUX_RAMPS 9999
-#define MB(board) (defined(BOARD_##board) && MOTHERBOARD==BOARD_##board)
+#define _MB_1(B) (defined(BOARD_##B) && MOTHERBOARD==BOARD_##B)
+#define MB(V...) DO(MB,||,V)
+
+#define IS_MELZI MB(MELZI, MELZI_CREALITY, MELZI_MAKR3D, MELZI_MALYAN, MELZI_TRONXY)
diff --git a/Marlin/src/core/enum.h b/Marlin/src/core/enum.h
deleted file mode 100644
index 15118f7b28..0000000000
--- a/Marlin/src/core/enum.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2019 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
-
-/**
- * Axis indices as enumerated constants
- *
- * - X_AXIS, Y_AXIS, and Z_AXIS should be used for axes in Cartesian space
- * - A_AXIS, B_AXIS, and C_AXIS should be used for Steppers, corresponding to XYZ on Cartesians
- * - X_HEAD, Y_HEAD, and Z_HEAD should be used for Steppers on Core kinematics
- */
-enum AxisEnum : unsigned char {
- X_AXIS = 0,
- A_AXIS = 0,
- Y_AXIS = 1,
- B_AXIS = 1,
- Z_AXIS = 2,
- C_AXIS = 2,
- E_AXIS = 3,
- X_HEAD = 4,
- Y_HEAD = 5,
- Z_HEAD = 6,
- E0_AXIS = 3,
- E1_AXIS = 4,
- E2_AXIS = 5,
- E3_AXIS = 6,
- E4_AXIS = 7,
- E5_AXIS = 8,
- ALL_AXES = 0xFE,
- NO_AXIS = 0xFF
-};
-
-#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=(S); VAR<=(N); VAR++)
-#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=(S); VAR<(N); VAR++)
-#define LOOP_LE_N(VAR, N) LOOP_S_LE_N(VAR, 0, N)
-#define LOOP_L_N(VAR, N) LOOP_S_L_N(VAR, 0, N)
-
-#define LOOP_NA(VAR) LOOP_L_N(VAR, NUM_AXIS)
-#define LOOP_XYZ(VAR) LOOP_S_LE_N(VAR, X_AXIS, Z_AXIS)
-#define LOOP_XYZE(VAR) LOOP_S_LE_N(VAR, X_AXIS, E_AXIS)
-#define LOOP_XYZE_N(VAR) LOOP_S_L_N(VAR, X_AXIS, XYZE_N)
-#define LOOP_ABC(VAR) LOOP_S_LE_N(VAR, A_AXIS, C_AXIS)
-#define LOOP_ABCE(VAR) LOOP_S_LE_N(VAR, A_AXIS, E_AXIS)
-#define LOOP_ABCE_N(VAR) LOOP_S_L_N(VAR, A_AXIS, XYZE_N)
diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h
index ee4e23fa76..df3092fd99 100644
--- a/Marlin/src/core/language.h
+++ b/Marlin/src/core/language.h
@@ -49,7 +49,7 @@
// da Danish
// de German
// el Greek
-// el-gr Greek (Greece)
+// el_gr Greek (Greece)
// en English
// es Spanish
// eu Basque-Euskera
@@ -58,12 +58,12 @@
// gl Galician
// hr Croatian
// it Italian
-// jp-kana Japanese
+// jp_kana Japanese
// ko_KR Korean (South Korea)
// nl Dutch
// pl Polish
// pt Portuguese
-// pt-br Portuguese (Brazilian)
+// pt_br Portuguese (Brazilian)
// ru Russian
// sk Slovak
// tr Turkish
@@ -97,7 +97,20 @@
// #define STRING_SPLASH_LINE3 WEBSITE_URL
//#endif
-#if HAS_GRAPHICAL_LCD
+#if HAS_CHARACTER_LCD
+
+ // Custom characters defined in the first 8 characters of the LCD
+ #define LCD_STR_BEDTEMP "\x00" // Print only as a char. This will have 'unexpected' results when used in a string!
+ #define LCD_STR_DEGREE "\x01"
+ #define LCD_STR_THERMOMETER "\x02" // Still used with string concatenation
+ #define LCD_STR_UPLEVEL "\x03"
+ #define LCD_STR_REFRESH "\x04"
+ #define LCD_STR_FOLDER "\x05"
+ #define LCD_STR_FEEDRATE "\x06"
+ #define LCD_STR_CLOCK "\x07"
+ #define LCD_STR_ARROW_RIGHT ">" /* from the default character set */
+
+#else
//
// Custom characters from Marlin_symbols.fon which was merged into ISO10646-0-3.bdf
// \x00 intentionally skipped to avoid problems in strings
@@ -120,19 +133,6 @@
#define LCD_STR_FILAM_DIA "\xF8"
#define LCD_STR_FILAM_MUL "\xA4"
-#elif HAS_CHARACTER_LCD
-
- // Custom characters defined in the first 8 characters of the LCD
- #define LCD_STR_BEDTEMP "\x00" // Print only as a char. This will have 'unexpected' results when used in a string!
- #define LCD_STR_DEGREE "\x01"
- #define LCD_STR_THERMOMETER "\x02" // Still used with string concatenation
- #define LCD_STR_UPLEVEL "\x03"
- #define LCD_STR_REFRESH "\x04"
- #define LCD_STR_FOLDER "\x05"
- #define LCD_STR_FEEDRATE "\x06"
- #define LCD_STR_CLOCK "\x07"
- #define LCD_STR_ARROW_RIGHT ">" /* from the default character set */
-
#endif
// Common LCD messages
@@ -168,7 +168,6 @@
#define MSG_INVALID_E_STEPPER "Invalid E stepper"
#define MSG_E_STEPPER_NOT_SPECIFIED "E stepper not specified"
#define MSG_INVALID_SOLENOID "Invalid solenoid"
-#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature"
#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " SOURCE_CODE_URL:" SOURCE_CODE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID
#define MSG_COUNT_X " Count X:"
#define MSG_COUNT_A " Count A:"
@@ -243,10 +242,9 @@
#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented"
#define MSG_ERR_LONG_EXTRUDE_STOP " too long extrusion prevented"
#define MSG_ERR_HOTEND_TOO_COLD "Hotend too cold"
+#define MSG_ERR_Z_HOMING_SER "Home XY first"
+#define MSG_ERR_EEPROM_WRITE "Error writing to EEPROM!"
-#define MSG_FILAMENT_CHANGE_HEAT "Press button (or M108) to heat nozzle"
-#define MSG_FILAMENT_CHANGE_INSERT "Insert filament and press button (or M108)"
-#define MSG_FILAMENT_CHANGE_WAIT "Press button (or M108) to resume"
#define MSG_FILAMENT_CHANGE_HEAT_LCD "Press button to heat nozzle"
#define MSG_FILAMENT_CHANGE_INSERT_LCD "Insert filament and press button"
#define MSG_FILAMENT_CHANGE_WAIT_LCD "Press button to resume"
@@ -254,8 +252,6 @@
#define MSG_FILAMENT_CHANGE_INSERT_M108 "Insert filament and send M108"
#define MSG_FILAMENT_CHANGE_WAIT_M108 "Send M108 to resume"
-#define MSG_ERR_EEPROM_WRITE "Error writing to EEPROM!"
-
#define MSG_STOP_BLTOUCH "STOP called because of BLTouch error - restart with M999"
#define MSG_STOP_UNHOMED "STOP called because of unhomed error - restart with M999"
#define MSG_KILL_INACTIVE_TIME "KILL caused by too much inactive time - current command: "
@@ -298,6 +294,8 @@
#define MSG_T_THERMAL_RUNAWAY "Thermal Runaway"
#define MSG_T_MAXTEMP "MAXTEMP triggered"
#define MSG_T_MINTEMP "MINTEMP triggered"
+#define MSG_ERR_PROBING_FAILED "Probing Failed"
+#define MSG_ZPROBE_OUT_SER "Z Probe Past Bed"
// Debug
#define MSG_DEBUG_PREFIX "DEBUG:"
@@ -313,11 +311,9 @@
#define LANGUAGE_DATA_INCL_(M) STRINGIFY_(fontdata/langdata_##M.h)
#define LANGUAGE_DATA_INCL(M) LANGUAGE_DATA_INCL_(M)
-#define INCLUDE_LANGUAGE_DATA LANGUAGE_DATA_INCL(LCD_LANGUAGE)
#define LANGUAGE_INCL_(M) STRINGIFY_(../lcd/language/language_##M.h)
#define LANGUAGE_INCL(M) LANGUAGE_INCL_(M)
-#define INCLUDE_LANGUAGE LANGUAGE_INCL(LCD_LANGUAGE)
// Never translate these strings
#define MSG_X "X"
@@ -337,38 +333,52 @@
#define MSG_Y2 "Y2"
#define MSG_Z2 "Z2"
#define MSG_Z3 "Z3"
-#define MSG_H1 "1"
-#define MSG_H2 "2"
-#define MSG_H3 "3"
-#define MSG_H4 "4"
-#define MSG_H5 "5"
-#define MSG_H6 "6"
-#define MSG_LCD_N0 " 1"
-#define MSG_LCD_N1 " 2"
-#define MSG_LCD_N2 " 3"
-#define MSG_LCD_N3 " 4"
-#define MSG_LCD_N4 " 5"
-#define MSG_LCD_N5 " 6"
-#define MSG_E1 "E1"
-#define MSG_E2 "E2"
-#define MSG_E3 "E3"
-#define MSG_E4 "E4"
-#define MSG_E5 "E5"
-#define MSG_E6 "E6"
-#define MSG_MOVE_E1 "1"
-#define MSG_MOVE_E2 "2"
-#define MSG_MOVE_E3 "3"
-#define MSG_MOVE_E4 "4"
-#define MSG_MOVE_E5 "5"
-#define MSG_MOVE_E6 "6"
-#define MSG_DIAM_E1 " 1"
-#define MSG_DIAM_E2 " 2"
-#define MSG_DIAM_E3 " 3"
-#define MSG_DIAM_E4 " 4"
-#define MSG_DIAM_E5 " 5"
-#define MSG_DIAM_E6 " 6"
-#include INCLUDE_LANGUAGE
+#define LCD_STR_A MSG_A
+#define LCD_STR_B MSG_B
+#define LCD_STR_C MSG_C
+#define LCD_STR_E MSG_E
+
+/**
+ * Tool indexes for LCD display only
+ *
+ * By convention the LCD shows "E1" for the first extruder.
+ * However, internal to Marlin E0/T0 is the first tool, and
+ * most board silkscreens say "E0." Zero-based labels will
+ * make these indexes consistent but this defies expectation.
+ *
+ */
+#if ENABLED(NUMBER_TOOLS_FROM_0)
+ #define LCD_STR_N0 "0"
+ #define LCD_STR_N1 "1"
+ #define LCD_STR_N2 "2"
+ #define LCD_STR_N3 "3"
+ #define LCD_STR_N4 "4"
+ #define LCD_STR_N5 "5"
+#else
+ #define LCD_STR_N0 "1"
+ #define LCD_STR_N1 "2"
+ #define LCD_STR_N2 "3"
+ #define LCD_STR_N3 "4"
+ #define LCD_STR_N4 "5"
+ #define LCD_STR_N5 "6"
+#endif
+
+#define LCD_STR_E0 "E" LCD_STR_N0
+#define LCD_STR_E1 "E" LCD_STR_N1
+#define LCD_STR_E2 "E" LCD_STR_N2
+#define LCD_STR_E3 "E" LCD_STR_N3
+#define LCD_STR_E4 "E" LCD_STR_N4
+#define LCD_STR_E5 "E" LCD_STR_N5
+
+#include "multi_language.h" // Allow multiple languages
+
+#include "../lcd/language/language_en.h"
+#include LANGUAGE_INCL(LCD_LANGUAGE)
+#include LANGUAGE_INCL(LCD_LANGUAGE_2)
+#include LANGUAGE_INCL(LCD_LANGUAGE_3)
+#include LANGUAGE_INCL(LCD_LANGUAGE_4)
+#include LANGUAGE_INCL(LCD_LANGUAGE_5)
#if NONE(DISPLAY_CHARSET_ISO10646_1, \
DISPLAY_CHARSET_ISO10646_5, \
@@ -381,10 +391,3 @@
DISPLAY_CHARSET_ISO10646_SK)
#define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays.
#endif
-
-#include "../lcd/language/language_en.h"
-
-#ifdef CUSTOM_USER_MENU_TITLE
- #undef MSG_USER_MENU
- #define MSG_USER_MENU CUSTOM_USER_MENU_TITLE
-#endif
diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h
index 73a8ec5823..b93bae79f6 100644
--- a/Marlin/src/core/macros.h
+++ b/Marlin/src/core/macros.h
@@ -21,11 +21,11 @@
*/
#pragma once
-#define NUM_AXIS 4
#define ABCE 4
#define XYZE 4
#define ABC 3
#define XYZ 3
+#define XY 2
#define _AXIS(A) (A##_AXIS)
@@ -205,25 +205,29 @@
}while(0)
// Macros for initializing arrays
-#define ARRAY_16(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,...) { A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P }
-#define ARRAY_15(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,...) { A,B,C,D,E,F,G,H,I,J,K,L,M,N,O }
-#define ARRAY_14(A,B,C,D,E,F,G,H,I,J,K,L,M,N,...) { A,B,C,D,E,F,G,H,I,J,K,L,M,N }
-#define ARRAY_13(A,B,C,D,E,F,G,H,I,J,K,L,M,...) { A,B,C,D,E,F,G,H,I,J,K,L,M }
-#define ARRAY_12(A,B,C,D,E,F,G,H,I,J,K,L,...) { A,B,C,D,E,F,G,H,I,J,K,L }
-#define ARRAY_11(A,B,C,D,E,F,G,H,I,J,K,...) { A,B,C,D,E,F,G,H,I,J,K }
-#define ARRAY_10(A,B,C,D,E,F,G,H,I,J,...) { A,B,C,D,E,F,G,H,I,J }
-#define ARRAY_9( A,B,C,D,E,F,G,H,I,...) { A,B,C,D,E,F,G,H,I }
-#define ARRAY_8( A,B,C,D,E,F,G,H,...) { A,B,C,D,E,F,G,H }
-#define ARRAY_7( A,B,C,D,E,F,G,...) { A,B,C,D,E,F,G }
-#define ARRAY_6( A,B,C,D,E,F,...) { A,B,C,D,E,F }
-#define ARRAY_5( A,B,C,D,E,...) { A,B,C,D,E }
-#define ARRAY_4( A,B,C,D,...) { A,B,C,D }
-#define ARRAY_3( A,B,C,...) { A,B,C }
-#define ARRAY_2( A,B,...) { A,B }
-#define ARRAY_1( A,...) { A }
+#define LIST_16(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P
+#define LIST_15(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O
+#define LIST_14(A,B,C,D,E,F,G,H,I,J,K,L,M,N,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N
+#define LIST_13(A,B,C,D,E,F,G,H,I,J,K,L,M,...) A,B,C,D,E,F,G,H,I,J,K,L,M
+#define LIST_12(A,B,C,D,E,F,G,H,I,J,K,L,...) A,B,C,D,E,F,G,H,I,J,K,L
+#define LIST_11(A,B,C,D,E,F,G,H,I,J,K,...) A,B,C,D,E,F,G,H,I,J,K
+#define LIST_10(A,B,C,D,E,F,G,H,I,J,...) A,B,C,D,E,F,G,H,I,J
+#define LIST_9( A,B,C,D,E,F,G,H,I,...) A,B,C,D,E,F,G,H,I
+#define LIST_8( A,B,C,D,E,F,G,H,...) A,B,C,D,E,F,G,H
+#define LIST_7( A,B,C,D,E,F,G,...) A,B,C,D,E,F,G
+#define LIST_6( A,B,C,D,E,F,...) A,B,C,D,E,F
+#define LIST_5( A,B,C,D,E,...) A,B,C,D,E
+#define LIST_4( A,B,C,D,...) A,B,C,D
+#define LIST_3( A,B,C,...) A,B,C
+#define LIST_2( A,B,...) A,B
+#define LIST_1( A,...) A
-#define _ARRAY_N(N,V...) ARRAY_##N(V)
-#define ARRAY_N(N,V...) _ARRAY_N(N,V)
+#define _LIST_N(N,V...) LIST_##N(V)
+#define LIST_N(N,V...) _LIST_N(N,V)
+#define ARRAY_N(N,V...) { _LIST_N(N,V) }
+
+#define _JOIN_1(O) (O)
+#define JOIN_N(N,C,V...) (DO(JOIN,C,LIST_N(N,V)))
// Macros for adding
#define INC_0 1
@@ -251,12 +255,6 @@
#define DECREMENT_(n) DEC_##n
#define DECREMENT(n) DECREMENT_(n)
-// Feedrate
-typedef float feedRate_t;
-#define MMM_TO_MMS(MM_M) ((MM_M)/60.0f)
-#define MMS_TO_MMM(MM_S) ((MM_S)*60.0f)
-#define MMS_SCALED(V) ((V) * 0.01f * feedrate_percentage)
-
#define NOOP (void(0))
#define CEILING(x,y) (((x) + (y) - 1) / (y))
diff --git a/Marlin/src/core/multi_language.cpp b/Marlin/src/core/multi_language.cpp
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/Marlin/src/core/multi_language.h b/Marlin/src/core/multi_language.h
new file mode 100644
index 0000000000..98020b1e8d
--- /dev/null
+++ b/Marlin/src/core/multi_language.h
@@ -0,0 +1,79 @@
+/********************
+ * multi_language.h *
+ ********************/
+
+/****************************************************************************
+ * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
+ * *
+ * 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. *
+ * *
+ * To view a copy of the GNU General Public License, go to the following *
+ * location: . *
+ ****************************************************************************/
+#pragma once
+
+typedef const char Language_Str[];
+
+#if defined(LCD_LANGUAGE_5)
+ #define NUM_LANGUAGES 5
+#elif defined(LCD_LANGUAGE_4)
+ #define NUM_LANGUAGES 4
+#elif defined(LCD_LANGUAGE_3)
+ #define NUM_LANGUAGES 3
+#elif defined(LCD_LANGUAGE_2)
+ #define NUM_LANGUAGES 2
+#else
+ #define NUM_LANGUAGES 1
+#endif
+
+// Setting the unused languages equal to each other allows
+// the compiler to optimize away the conditionals
+
+#ifndef LCD_LANGUAGE_2
+ #define LCD_LANGUAGE_2 LCD_LANGUAGE
+#endif
+
+#ifndef LCD_LANGUAGE_3
+ #define LCD_LANGUAGE_3 LCD_LANGUAGE_2
+#endif
+
+#ifndef LCD_LANGUAGE_4
+ #define LCD_LANGUAGE_4 LCD_LANGUAGE_3
+#endif
+
+#ifndef LCD_LANGUAGE_5
+ #define LCD_LANGUAGE_5 LCD_LANGUAGE_4
+#endif
+
+#define _GET_LANG(LANG) Language_##LANG
+#define GET_LANG(LANG) _GET_LANG(LANG)
+
+#if NUM_LANGUAGES > 1
+ extern uint8_t lang;
+ #define GET_TEXT(MSG) ( \
+ lang == 0 ? GET_LANG(LCD_LANGUAGE)::MSG : \
+ lang == 1 ? GET_LANG(LCD_LANGUAGE_2)::MSG : \
+ lang == 2 ? GET_LANG(LCD_LANGUAGE_3)::MSG : \
+ lang == 3 ? GET_LANG(LCD_LANGUAGE_4)::MSG : \
+ GET_LANG(LCD_LANGUAGE_5)::MSG \
+ )
+ #define MAX_LANG_CHARSIZE _MAX(GET_LANG(LCD_LANGUAGE)::CHARSIZE, \
+ GET_LANG(LCD_LANGUAGE_2)::CHARSIZE, \
+ GET_LANG(LCD_LANGUAGE_3)::CHARSIZE, \
+ GET_LANG(LCD_LANGUAGE_4)::CHARSIZE, \
+ GET_LANG(LCD_LANGUAGE_5)::CHARSIZE)
+#else
+ #define GET_TEXT(MSG) GET_LANG(LCD_LANGUAGE)::MSG
+ #define MAX_LANG_CHARSIZE GET_LANG(LCD_LANGUAGE)::CHARSIZE
+#endif
+#define GET_TEXT_F(MSG) (const __FlashStringHelper*)GET_TEXT(MSG)
+
+#define MSG_CONCAT(A,B) pgm_p_pair_t(GET_TEXT(A),GET_TEXT(B))
diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp
index a468802ecc..2369c3acbf 100644
--- a/Marlin/src/core/serial.cpp
+++ b/Marlin/src/core/serial.cpp
@@ -22,7 +22,6 @@
#include "serial.h"
#include "language.h"
-#include "enum.h"
uint8_t marlin_debug_flags = MARLIN_DEBUG_NONE;
@@ -68,12 +67,8 @@ void print_bin(const uint16_t val) {
}
}
-void print_xyz(PGM_P const prefix, PGM_P const suffix, const float &x, const float &y, const float &z) {
+void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix/*=nullptr*/, PGM_P const suffix/*=nullptr*/) {
serialprintPGM(prefix);
SERIAL_ECHOPAIR(" " MSG_X, x, " " MSG_Y, y, " " MSG_Z, z);
if (suffix) serialprintPGM(suffix); else SERIAL_EOL();
}
-
-void print_xyz(PGM_P const prefix, PGM_P const suffix, const float xyz[]) {
- print_xyz(prefix, suffix, xyz[X_AXIS], xyz[Y_AXIS], xyz[Z_AXIS]);
-}
diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h
index 23f6240e1e..f4c2570ca7 100644
--- a/Marlin/src/core/serial.h
+++ b/Marlin/src/core/serial.h
@@ -139,14 +139,41 @@ extern uint8_t marlin_debug_flags;
#define _SELP_21(a,b,V...) do{ _SEP_2(a,b); _SELP_19(V); }while(0)
#define _SELP_22(a,b,V...) do{ _SEP_2(a,b); _SELP_20(V); }while(0)
#define _SELP_23(a,b,V...) do{ _SEP_2(a,b); _SELP_21(V); }while(0)
-#define _SELP_24(a,b,V...) do{ _SEP_2(a,b); _SELP_22(V); }while(0)
+#define _SELP_24(a,b,V...) do{ _SEP_2(a,b); _SELP_22(V); }while(0) // Use up two, pass the rest up
#define SERIAL_ECHOLNPAIR(V...) _SELP_N(NUM_ARGS(V),V)
+// Print up to 20 comma-separated pairs of values
+#define __SLST_N(N,V...) _SLST_##N(V)
+#define _SLST_N(N,V...) __SLST_N(N,V)
+#define _SLST_1(a) SERIAL_ECHO(a)
+#define _SLST_2(a,b) do{ SERIAL_ECHO(a); SERIAL_ECHOPAIR(", ",b); }while(0)
+#define _SLST_3(a,b,c) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_1(c); }while(0)
+#define _SLST_4(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_2(V); }while(0)
+#define _SLST_5(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_3(V); }while(0)
+#define _SLST_6(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_4(V); }while(0)
+#define _SLST_7(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_5(V); }while(0)
+#define _SLST_8(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_6(V); }while(0)
+#define _SLST_9(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_7(V); }while(0)
+#define _SLST_10(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_8(V); }while(0)
+#define _SLST_11(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_9(V); }while(0)
+#define _SLST_12(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_10(V); }while(0)
+#define _SLST_13(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_11(V); }while(0)
+#define _SLST_14(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_12(V); }while(0)
+#define _SLST_15(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_13(V); }while(0)
+#define _SLST_16(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_14(V); }while(0)
+#define _SLST_17(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_15(V); }while(0)
+#define _SLST_18(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_16(V); }while(0)
+#define _SLST_19(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_17(V); }while(0)
+#define _SLST_20(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_18(V); }while(0) // Use up two, pass the rest up
+
+#define SERIAL_ECHOLIST(pre,V...) do{ SERIAL_ECHOPGM(pre); _SLST_N(NUM_ARGS(V),V); }while(0)
+#define SERIAL_ECHOLIST_N(N,V...) _SLST_N(N,LIST_N(N,V))
+
#define SERIAL_ECHOPGM(S) (serialprintPGM(PSTR(S)))
#define SERIAL_ECHOLNPGM(S) (serialprintPGM(PSTR(S "\n")))
-#define SERIAL_ECHOPAIR_F(S, V...) do{ SERIAL_ECHOPGM(S); SERIAL_ECHO_F(V); }while(0)
+#define SERIAL_ECHOPAIR_F(S,V...) do{ SERIAL_ECHOPGM(S); SERIAL_ECHO_F(V); }while(0)
#define SERIAL_ECHOLNPAIR_F(V...) do{ SERIAL_ECHOPAIR_F(V); SERIAL_EOL(); }while(0)
#define SERIAL_ECHO_START() serial_echo_start()
@@ -186,7 +213,11 @@ void serial_spaces(uint8_t count);
void print_bin(const uint16_t val);
-void print_xyz(PGM_P const prefix, PGM_P const suffix, const float xyz[]);
-void print_xyz(PGM_P const prefix, PGM_P const suffix, const float &x, const float &y, const float &z);
-#define SERIAL_POS(SUFFIX,VAR) do { print_xyz(PSTR(" " STRINGIFY(VAR) "="), PSTR(" : " SUFFIX "\n"), VAR); }while(0)
-#define SERIAL_XYZ(PREFIX,V...) do { print_xyz(PSTR(PREFIX), nullptr, V); }while(0)
+void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr);
+
+inline void print_xyz(const xyz_pos_t &xyz, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr) {
+ print_xyz(xyz.x, xyz.y, xyz.z, prefix, suffix);
+}
+
+#define SERIAL_POS(SUFFIX,VAR) do { print_xyz(VAR, PSTR(" " STRINGIFY(VAR) "="), PSTR(" : " SUFFIX "\n")); }while(0)
+#define SERIAL_XYZ(PREFIX,V...) do { print_xyz(V, PSTR(PREFIX), nullptr); }while(0)
diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h
new file mode 100644
index 0000000000..567b35c8b9
--- /dev/null
+++ b/Marlin/src/core/types.h
@@ -0,0 +1,486 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2019 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
+
+#include "millis_t.h"
+
+//
+// Enumerated axis indices
+//
+// - X_AXIS, Y_AXIS, and Z_AXIS should be used for axes in Cartesian space
+// - A_AXIS, B_AXIS, and C_AXIS should be used for Steppers, corresponding to XYZ on Cartesians
+// - X_HEAD, Y_HEAD, and Z_HEAD should be used for Steppers on Core kinematics
+//
+enum AxisEnum : uint8_t {
+ X_AXIS = 0, A_AXIS = 0,
+ Y_AXIS = 1, B_AXIS = 1,
+ Z_AXIS = 2, C_AXIS = 2,
+ E_AXIS = 3,
+ X_HEAD = 4, Y_HEAD = 5, Z_HEAD = 6,
+ E0_AXIS = 3,
+ E1_AXIS = 4,
+ E2_AXIS = 5,
+ E3_AXIS = 6,
+ E4_AXIS = 7,
+ E5_AXIS = 8,
+ ALL_AXES = 0xFE, NO_AXIS = 0xFF
+};
+
+//
+// Loop over XYZE axes
+//
+
+#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=(S); VAR<=(N); VAR++)
+#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=(S); VAR<(N); VAR++)
+#define LOOP_LE_N(VAR, N) LOOP_S_LE_N(VAR, 0, N)
+#define LOOP_L_N(VAR, N) LOOP_S_L_N(VAR, 0, N)
+
+#define LOOP_XYZ(VAR) LOOP_S_LE_N(VAR, X_AXIS, Z_AXIS)
+#define LOOP_XYZE(VAR) LOOP_S_LE_N(VAR, X_AXIS, E_AXIS)
+#define LOOP_XYZE_N(VAR) LOOP_S_L_N(VAR, X_AXIS, XYZE_N)
+#define LOOP_ABC(VAR) LOOP_S_LE_N(VAR, A_AXIS, C_AXIS)
+#define LOOP_ABCE(VAR) LOOP_S_LE_N(VAR, A_AXIS, E_AXIS)
+#define LOOP_ABCE_N(VAR) LOOP_S_L_N(VAR, A_AXIS, XYZE_N)
+
+//
+// Conditional type assignment magic. For example...
+//
+// typename IF<(MYOPT==12), int, float>::type myvar;
+//
+template
+struct IF { typedef R type; };
+template
+struct IF { typedef L type; };
+
+//
+// feedRate_t is just a humble float
+//
+typedef float feedRate_t;
+
+// Conversion macros
+#define MMM_TO_MMS(MM_M) feedRate_t(float(MM_M) / 60.0f)
+#define MMS_TO_MMM(MM_S) (float(MM_S) * 60.0f)
+#define MMS_SCALED(V) ((V) * 0.01f * feedrate_percentage)
+
+//
+// Coordinates structures for XY, XYZ, XYZE...
+//
+
+// Helpers
+#define _RECIP(N) ((N) ? 1.0f / float(N) : 0.0f)
+#define _ABS(N) ((N) < 0 ? -(N) : (N))
+#define _LS(N) (N = (T)(uint32_t(N) << v))
+#define _RS(N) (N = (T)(uint32_t(N) >> v))
+#define FI FORCE_INLINE
+
+// Forward declarations
+template struct XYval;
+template struct XYZval;
+template struct XYZEval;
+
+typedef struct XYval xy_bool_t;
+typedef struct XYZval xyz_bool_t;
+typedef struct XYZEval xyze_bool_t;
+
+typedef struct XYval xy_char_t;
+typedef struct XYZval xyz_char_t;
+typedef struct XYZEval xyze_char_t;
+
+typedef struct XYval xy_uchar_t;
+typedef struct XYZval xyz_uchar_t;
+typedef struct XYZEval xyze_uchar_t;
+
+typedef struct XYval xy_int8_t;
+typedef struct XYZval xyz_int8_t;
+typedef struct XYZEval xyze_int8_t;
+
+typedef struct XYval xy_uint8_t;
+typedef struct XYZval xyz_uint8_t;
+typedef struct XYZEval xyze_uint8_t;
+
+typedef struct XYval xy_int_t;
+typedef struct XYZval xyz_int_t;
+typedef struct XYZEval xyze_int_t;
+
+typedef struct XYval xy_uint_t;
+typedef struct XYZval xyz_uint_t;
+typedef struct XYZEval xyze_uint_t;
+
+typedef struct XYval xy_long_t;
+typedef struct XYZval xyz_long_t;
+typedef struct XYZEval xyze_long_t;
+
+typedef struct XYval xy_ulong_t;
+typedef struct XYZval xyz_ulong_t;
+typedef struct XYZEval xyze_ulong_t;
+
+typedef struct XYZval xyz_vlong_t;
+typedef struct XYZEval xyze_vlong_t;
+
+typedef struct XYval xy_float_t;
+typedef struct XYZval xyz_float_t;
+typedef struct XYZEval xyze_float_t;
+
+typedef struct XYval xy_feedrate_t;
+typedef struct XYZval xyz_feedrate_t;
+typedef struct XYZEval xyze_feedrate_t;
+
+typedef xy_uint8_t xy_byte_t;
+typedef xyz_uint8_t xyz_byte_t;
+typedef xyze_uint8_t xyze_byte_t;
+
+typedef xyz_long_t abc_long_t;
+typedef xyze_long_t abce_long_t;
+typedef xyz_ulong_t abc_ulong_t;
+typedef xyze_ulong_t abce_ulong_t;
+
+typedef xy_float_t xy_pos_t;
+typedef xyz_float_t xyz_pos_t;
+typedef xyze_float_t xyze_pos_t;
+
+typedef xy_float_t ab_float_t;
+typedef xyz_float_t abc_float_t;
+typedef xyze_float_t abce_float_t;
+
+typedef ab_float_t ab_pos_t;
+typedef abc_float_t abc_pos_t;
+typedef abce_float_t abce_pos_t;
+
+// External conversion methods
+void toLogical(xy_pos_t &raw);
+void toLogical(xyz_pos_t &raw);
+void toLogical(xyze_pos_t &raw);
+void toNative(xy_pos_t &raw);
+void toNative(xyz_pos_t &raw);
+void toNative(xyze_pos_t &raw);
+
+//
+// XY coordinates, counters, etc.
+//
+template
+struct XYval {
+ union {
+ struct { T x, y; };
+ struct { T a, b; };
+ T pos[2];
+ };
+ FI void set(const T px) { x = px; }
+ FI void set(const T px, const T py) { x = px; y = py; }
+ FI void reset() { x = y = 0; }
+ FI T magnitude() const { return (T)sqrtf(x*x + y*y); }
+ FI operator T* () { return pos; }
+ FI operator bool() { return x || y; }
+ FI XYval copy() const { return *this; }
+ FI XYval ABS() const { return { T(_ABS(x)), T(_ABS(y)) }; }
+ FI XYval asInt() { return { int16_t(x), int16_t(y) }; }
+ FI XYval asInt() const { return { int16_t(x), int16_t(y) }; }
+ FI XYval asLong() { return { int32_t(x), int32_t(y) }; }
+ FI XYval asLong() const { return { int32_t(x), int32_t(y) }; }
+ FI XYval asFloat() { return { float(x), float(y) }; }
+ FI XYval asFloat() const { return { float(x), float(y) }; }
+ FI XYval reciprocal() const { return { _RECIP(x), _RECIP(y) }; }
+ FI XYval asLogical() const { XYval o = asFloat(); toLogical(o); return o; }
+ FI XYval asNative() const { XYval o = asFloat(); toNative(o); return o; }
+ FI operator XYZval() { return { x, y }; }
+ FI operator XYZval() const { return { x, y }; }
+ FI operator XYZEval() { return { x, y }; }
+ FI operator XYZEval() const { return { x, y }; }
+ FI T& operator[](const int i) { return pos[i]; }
+ FI const T& operator[](const int i) const { return pos[i]; }
+ FI XYval& operator= (const T v) { set(v, v ); return *this; }
+ FI XYval& operator= (const XYZval &rs) { set(rs.x, rs.y); return *this; }
+ FI XYval& operator= (const XYZEval &rs) { set(rs.x, rs.y); return *this; }
+ FI XYval operator+ (const XYval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; }
+ FI XYval operator+ (const XYval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; }
+ FI XYval operator- (const XYval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; }
+ FI XYval operator- (const XYval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; }
+ FI XYval operator* (const XYval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; }
+ FI XYval operator* (const XYval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; }
+ FI XYval operator/ (const XYval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; }
+ FI XYval operator/ (const XYval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; }
+ FI XYval operator+ (const XYZval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; }
+ FI XYval operator+ (const XYZval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; }
+ FI XYval operator- (const XYZval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; }
+ FI XYval operator- (const XYZval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; }
+ FI XYval operator* (const XYZval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; }
+ FI XYval operator* (const XYZval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; }
+ FI XYval operator/ (const XYZval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; }
+ FI XYval operator/ (const XYZval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; }
+ FI XYval operator+ (const XYZEval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; }
+ FI XYval operator+ (const XYZEval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; }
+ FI XYval operator- (const XYZEval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; }
+ FI XYval operator- (const XYZEval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; }
+ FI XYval operator* (const XYZEval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; }
+ FI XYval operator* (const XYZEval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; }
+ FI XYval operator/ (const XYZEval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; }
+ FI XYval operator/ (const XYZEval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; }
+ FI XYval operator* (const float &v) const { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; }
+ FI XYval operator* (const float &v) { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; }
+ FI XYval operator* (const int &v) const { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; }
+ FI XYval operator* (const int &v) { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; }
+ FI XYval operator/ (const float &v) const { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; }
+ FI XYval operator/ (const float &v) { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; }
+ FI XYval operator/ (const int &v) const { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; }
+ FI XYval operator/ (const int &v) { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; }
+ FI XYval operator>>(const int &v) const { XYval ls = *this; _RS(ls.x); _RS(ls.y); return ls; }
+ FI XYval operator>>(const int &v) { XYval ls = *this; _RS(ls.x); _RS(ls.y); return ls; }
+ FI XYval operator<<(const int &v) const { XYval ls = *this; _LS(ls.x); _LS(ls.y); return ls; }
+ FI XYval operator<<(const int &v) { XYval ls = *this; _LS(ls.x); _LS(ls.y); return ls; }
+ FI XYval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; }
+ FI XYval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; }
+ FI XYval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; }
+ FI XYval& operator+=(const XYZval &rs) { x += rs.x; y += rs.y; return *this; }
+ FI XYval& operator-=(const XYZval &rs) { x -= rs.x; y -= rs.y; return *this; }
+ FI XYval& operator*=(const XYZval &rs) { x *= rs.x; y *= rs.y; return *this; }
+ FI XYval& operator+=(const XYZEval &rs) { x += rs.x; y += rs.y; return *this; }
+ FI XYval& operator-=(const XYZEval &rs) { x -= rs.x; y -= rs.y; return *this; }
+ FI XYval& operator*=(const XYZEval &rs) { x *= rs.x; y *= rs.y; return *this; }
+ FI XYval& operator*=(const float &v) { x *= v; y *= v; return *this; }
+ FI XYval& operator*=(const int &v) { x *= v; y *= v; return *this; }
+ FI XYval& operator>>=(const int &v) { _RS(x); _RS(y); return *this; }
+ FI XYval& operator<<=(const int &v) { _LS(x); _LS(y); return *this; }
+ FI bool operator==(const XYval &rs) { return x == rs.x && y == rs.y; }
+ FI bool operator==(const XYZval &rs) { return x == rs.x && y == rs.y; }
+ FI bool operator==(const XYZEval &rs) { return x == rs.x && y == rs.y; }
+ FI bool operator==(const XYval &rs) const { return x == rs.x && y == rs.y; }
+ FI bool operator==(const XYZval &rs) const { return x == rs.x && y == rs.y; }
+ FI bool operator==(const XYZEval &rs) const { return x == rs.x && y == rs.y; }
+ FI bool operator!=(const XYval &rs) { return !operator==(rs); }
+ FI bool operator!=(const XYZval &rs) { return !operator==(rs); }
+ FI bool operator!=(const XYZEval &rs) { return !operator==(rs); }
+ FI bool operator!=(const XYval &rs) const { return !operator==(rs); }
+ FI bool operator!=(const XYZval &rs) const { return !operator==(rs); }
+ FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); }
+ FI XYval operator-() { XYval o = *this; o.x = -x; o.y = -y; return o; }
+ FI const XYval operator-() const { XYval o = *this; o.x = -x; o.y = -y; return o; }
+};
+
+//
+// XYZ coordinates, counters, etc.
+//
+template
+struct XYZval {
+ union {
+ struct { T x, y, z; };
+ struct { T a, b, c; };
+ T pos[3];
+ };
+ FI void set(const T px) { x = px; }
+ FI void set(const T px, const T py) { x = px; y = py; }
+ FI void set(const T px, const T py, const T pz) { x = px; y = py; z = pz; }
+ FI void set(const XYval pxy, const T pz) { x = pxy.x; y = pxy.y; z = pz; }
+ FI void reset() { x = y = z = 0; }
+ FI T magnitude() const { return (T)sqrtf(x*x + y*y + z*z); }
+ FI operator T* () { return pos; }
+ FI operator bool() { return z || x || y; }
+ FI XYZval copy() const { XYZval o = *this; return o; }
+ FI XYZval ABS() const { return { T(_ABS(x)), T(_ABS(y)), T(_ABS(z)) }; }
+ FI XYZval asInt() { return { int16_t(x), int16_t(y), int16_t(z) }; }
+ FI XYZval asInt() const { return { int16_t(x), int16_t(y), int16_t(z) }; }
+ FI XYZval asLong() { return { int32_t(x), int32_t(y), int32_t(z) }; }
+ FI XYZval asLong() const { return { int32_t(x), int32_t(y), int32_t(z) }; }
+ FI XYZval asFloat() { return { float(x), float(y), float(z) }; }
+ FI XYZval asFloat() const { return { float(x), float(y), float(z) }; }
+ FI XYZval reciprocal() const { return { _RECIP(x), _RECIP(y), _RECIP(z) }; }
+ FI XYZval asLogical() const { XYZval o = asFloat(); toLogical(o); return o; }
+ FI XYZval asNative() const { XYZval o = asFloat(); toNative(o); return o; }
+ FI operator XYval&() { return *(XYval*)this; }
+ FI operator const XYval&() const { return *(const XYval*)this; }
+ FI operator XYZEval() const { return { x, y, z }; }
+ FI T& operator[](const int i) { return pos[i]; }
+ FI const T& operator[](const int i) const { return pos[i]; }
+ FI XYZval& operator= (const T v) { set(v, v, v ); return *this; }
+ FI XYZval& operator= (const XYval &rs) { set(rs.x, rs.y ); return *this; }
+ FI XYZval& operator= (const XYZEval &rs) { set(rs.x, rs.y, rs.z); return *this; }
+ FI XYZval operator+ (const XYval &rs) const { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; }
+ FI XYZval operator+ (const XYval &rs) { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; }
+ FI XYZval operator- (const XYval &rs) const { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; }
+ FI XYZval operator- (const XYval &rs) { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; }
+ FI XYZval operator* (const XYval &rs) const { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; }
+ FI XYZval operator* (const XYval &rs) { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; }
+ FI XYZval operator/ (const XYval &rs) const { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; }
+ FI XYZval operator/ (const XYval